AGENTIC CRM · MCP-FIRST · OPEN API

建立預約和 CRM apps。
不用重建營運 backend。

把 FavCRM(agentic CRM)做服務型商戶 app 的 operational backend:預約、客戶記錄、收款、WhatsApp、campaigns、審批 queues 和 audit logs,全部透過 MCP、REST 和 JavaScript SDK 使用。

建立 workspace key
免費方案 · OTP 註冊約 60 秒 · 免信用卡 60 秒取得 API Key
60 秒 QUICKSTART

# 60 秒 quickstart

tool register_organisation_request   # 發 OTP 到你電郵

tool register_organisation_verify   # 驗證 → 取得 fav_mcp_* key

Authorization: Bearer fav_mcp_...

https://api.favcrm.io/mcp  # 190+ 個 tools

JAVASCRIPT / TYPESCRIPT SDK

15 個 namespaces · OTP auth · 支援 Node.js、Edge、browser

npm install @favcrm/sdk npm
SETUP

由零到第一個 API call,只需 4 步.

人同 AI agents 用同一條路徑。60 秒有 Free workspace key,免信用卡。

Step 01 — 取得 API key

Agentic registration:MCP tool → email OTP → API key。無 portal form。

register_organisation_request({
  email: "[email protected]",
  organisationName: "Your Studio",
  industry: "fitness",
  country: "HK"
})

register_organisation_verify({ requestId, code: "123456" })
→ { apiKey: "fav_mcp_…", companyId, loginUrl }

REST fallback: POST /v6/dev/signupPOST /v6/dev/verify。現有商戶:Settings → MCP Keys

Step 02 — 連接

揀其中一種。三種都用同一個 Bearer token。

  • MCP — Cursor, Claude, Smithery
    https://api.favcrm.io/mcp
  • SDK — Node.js, Edge, browser
    npm i @favcrm/sdk
  • REST — 其他場景
    https://api.favcrm.io/v6/...

Step 03 — 認證

每個 interface 都用同一個 header 格式。

Authorization: Bearer fav_mcp_xxx

SDK: sdk.setToken('fav_mcp_xxx') — 支援 API keys 同 JWT session tokens。

Step 04 — Smoke test

正式做事前先驗證 auth。新 sandbox 回傳 [] 即代表成功。

curl https://api.favcrm.io/v6/merchant/bookings/services \
  -H "Authorization: Bearer fav_mcp_xxx"

# MCP equivalent
> 使用 list_services 列出可預約服務。
USE CASES

三個 切入點. 一個平台。

由客戶已經感受到的痛點開始:漏接預約、客戶記錄分散、未收款 invoice,或者 WhatsApp 跟進。每個 wedge 都落在同一套 AI 店長 CRM。

Wedge 01

預約 Storefront

貼入 Cursor 或 Claude:

"使用 @favcrm/sdk 建立 booking page。用 sdk.bookings.listServices() 列出服務,按所選日期顯示可預約時段,並用 sdk.bookings.createBooking() 讓客人完成預約。"
import FavCRM from '@favcrm/sdk';

const sdk = new FavCRM({
  baseUrl: 'https://api.favcrm.io',
  companyId: process.env.FAVCRM_COMPANY_ID,
});

const services = await sdk.bookings.listServices();
const slots = await sdk.bookings.getTimeSlots(serviceId, {
  date: '2026-06-01',
});
const booking = await sdk.bookings.createBooking({
  serviceId,
  slotTime: slots[0].startTime,
  participants: 2,
});

Agent workflow

A · 商戶設定

一次性商戶設定。完全 MCP-native,跟 customer flow 使用同一套 tool surface。

  1. 01 create_service_category({ name }) — 可選分組(「療程」、「課堂」)。
  2. 02 create_service({ name, durationMinutes, price, capacity, categoryId? }) — 定義可預約服務。按需要加入 cancellationPolicy / requiresStaff / requiresResource。
  3. 03 set_staff_availability({ memberId, dayOfWeek, startTime, endTime }) — 每位 staff 的每週工作時間。一次性改動可用 date 代替 dayOfWeek。
  4. 04 create_resource({ name, type }) + set_resource_availability(...) — (可選)用於需要房間或設備的預約。

B · 客戶流程

面向客人的 storefront。支援 MCP tools、SDK 或 raw REST。

  1. 01 list_services — 顯示 service cards,包括名稱、價格、時長、容量。
  2. 02 get_service_detail(serviceId) — (可選)在詳情頁顯示 prep notes 同 cancellation policy。
  3. 03 get_available_slots(serviceId, { startDate, endDate }) — 顯示 date picker 同可預約時間。已滿時回傳 []。
  4. 04 create_booking({ serviceId, slotTime, participants, customer }) — 確認預約。回傳 booking ID 同 status。
  5. 05 cancel_booking({ bookingId, reason? }) — 取消流程。Server 檢查政策並計算 refund eligibility。

Agents 必須處理的 edge cases

  • get_available_slots → []:顯示「沒有可預約時段」,不要當成錯誤。
  • create_booking → 409 Conflict:fetch 同 book 之間時段被其他客人搶走,需要重新 fetch slots。
  • cancel_booking → cooldown error 會包含 cancellationPolicy field,原文顯示給用戶。
  • Capacity > 1 的服務:讓用戶選 participants count,最多到 service.capacity。

Wedge 02

Headless CMS / Blog

貼入 Cursor 或 Claude:

"用 @favcrm/sdk 從 FavCRM fetch blog posts,並 render 到我的 Next.js site。Index 用 sdk.blog.listPosts(),單篇文章用 sdk.blog.getPostBySlug()。Render post.blocks 裡每個 block。"
// Blog index
const posts = await sdk.blog.listPosts({
  status: 'published',
  limit: 10,
});

// Single post with blocks
const post = await sdk.blog.getPostBySlug('my-article');

// Render blocks
post.blocks.forEach(block => {
  if (block.type === 'heading') renderHeading(block.props);
  if (block.type === 'paragraph') renderText(block.props);
  if (block.type === 'image') renderImage(block.props);
});

Agent workflow

A · 商戶設定

可選 content model 設定。如果 default post type 已夠用,可以跳過。

  1. 01 create_category({ name, slug? }) — 整理 posts(「News」、「Tutorials」)。如果只需要 flat blog,可以跳過。
  2. 02 create_post_type({ key, label }) — 定義 default `post` 以外的 custom content type(例如 `case_study`)。
  3. 03 create_post_type_field({ postTypeId, key, label, fieldType }) — 為 post type 加 typed custom fields(text、number、image 等)。

B · 客戶流程

作者 + render 流程。完全 MCP-native,無需 REST fallback。

  1. 01 create_post({ type, title, slug?, blocks }) — 建立一篇帶 starting blocks 的 post。省略 slug 時會由 title 自動產生。
  2. 02 append_post_block({ postId, type, props }) — Append heading / paragraph / image / button / divider / video / gallery / form blocks。
  3. 03 update_post({ postId, status: "published" }) — 準備好時由 draft 切換到 published。
  4. 04 list_posts({ status: "published", categoryId?, limit, offset }) — Storefront index page。
  5. 05 get_post({ slug }) — Storefront single-page view。回傳 post 同 ordered blocks array。

Agents 必須處理的 edge cases

  • Block shape: id, version, type, data — id 是 unique block UUID,version 是 integer,data 是 block-specific payload。
  • Block types: paragraph, heading, image, list, quote, code, divider, embed, file, faq, callout, gallery, cta, accordion, product。
  • Slug collision → 409 Conflict。可以 client-side 自動加 suffix,或省略 slug 讓 server 產生。
  • append_post_block reorder:完整重排用 `reorder_post_blocks`,原位修改用 `replace_post_block(index)`。
  • Draft posts(status: "draft")不會由 list_posts 回傳,除非以 author 身份 authenticated。

Wedge 03

Run bookings, campaigns, and commerce together

貼入 Cursor 或 Claude:

"用 FavCRM MCP 營運我整盤生意:list_bookings 查看今日預約,list_orders 查看 pending fulfilment,create_campaign + create_promotion 向 VIP members 推出 flash sale。我的 MCP key 是 fav_mcp_..."
// One platform — bookings + shop + campaigns + promos
const [bookings, products, campaigns] = await Promise.all([
  sdk.bookings.list({ status: 'confirmed' }),
  sdk.shop.listProducts({ inStock: true }),
  sdk.campaigns.list({ status: 'active' }),
]);

// Launch a flash sale to a VIP segment
const promo = await sdk.promotions.create({
  name: 'VIP Flash 20%', code: 'VIP20',
  type: 'percentage', value: '20',
  endsAt: '2026-06-30T23:59:00Z', onlineEnabled: true,
});

const campaign = await sdk.campaigns.create({
  name: 'VIP Flash Sale',
  channel: 'email',
  recipientSource: 'segment',
  segmentId: 'vip-segment-id',
  channelConfig: { subject: '20% off this weekend', html: '...' },
});

Agent workflow

A · 商戶設定

一次 provision catalog + audience。完全 MCP-native。

  1. 01 create_product_category({ name }) + create_product({ name, price, ... }) — 建立 shop catalog。如果要掛到現有分類,先用 list_product_categories。
  2. 02 list_customer_segments + create_customer_segment(...) — 定義 campaign targeting 用的 audience segments(VIP、recent buyers、lapsed)。
  3. 03 create_promotion({ name, code, type, value, ...channelFlags }) — 建立 promo / coupon codes。用 bookingEnabled / onlineEnabled / posEnabled 控制適用範圍。
  4. 04 create_service + set_staff_availability — 預約側設定見 Wedge 01。

B · 客戶流程

日常營運 + marketing automation。目前全部 MCP-native(campaign send 仍是 REST,見 edge cases)。

  1. 01 list_bookings({ status: "confirmed", date }) + list_orders({ status: "pending" }) — 每日 dashboard / fulfilment queue。
  2. 02 create_shop_order({ accountId, items, promotionCode? }) — 用程式建立 orders(例如由 chat agent 或 quote-to-order flow 觸發)。
  3. 03 validate_promotion({ promotionCode, channel, amount }) — Checkout 前預先檢查 coupon,回傳 isValid + discountAmount。
  4. 04 create_campaign({ name, channel, recipientSource: "segment", segmentId, channelConfig }) — 建立 DRAFT 狀態的 email/SMS/WhatsApp campaign。
  5. 05 POST /v6/merchant/campaigns/{id}/send — 觸發 send(REST only — MCP send tool 需要 queue binding,coming next)。

Agents 必須處理的 edge cases

  • send_campaign 需要 NOTIFICATIONS queue access,目前只支援 REST(POST /v6/merchant/campaigns/:id/send)。MCP tool 追蹤於 claudedocs/mcp-tools-gap.md。
  • create_promotion:code 會在 server-side 轉大階。撞 code 會回 unique-constraint error,顯示為「code already used」。
  • validate_promotion:amount 用 major units(dollars,不是 cents)。會回 errorCode: PROMOTION_NOT_FOUND / EXPIRED / USAGE_LIMIT_REACHED / etc.
  • create_campaign:status 預設為 DRAFT。SCHEDULED 需要未來的 scheduledAt。status=SENT 後不能刪除。
  • list_orders + create_shop_order 會跟隨公司的 active currency;v1 不支援 mixed-currency orders。

準備好開始 開發?

透過 MCP 60 秒完成註冊。無 portal form。Email OTP 後即取得 Free workspace 的 fav_mcp_* key。客戶準備上 production 時可升級 Starter,US$49/月。