
客戶要一個預約網站。以前報價係兩個禮拜:一個日曆、一個 database、一個 availability 引擎、收款、一張客戶表。
而家 AI agent 負責砌 frontend,FavCRM 做headless backend,真正要做嘅嘢得返一個下晝。下面係成單嘢,由頭到尾。
個情境
一間細診所。三項服務、一個醫師、網上預約要俾訂金。你係 agency;你個 editor 入面有個 AI agent,仲有個 terminal。
計劃:
- 註冊診所嘅 FavCRM workspace
- 設定服務同可用時間
- 寫一條 server route 同 FavCRM 對話
- 等 agent 對住條 route 砌預約 UI
- 由頭到尾測試一次真實預約
第一步 —— 註冊 workspace(約 5 分鐘)
favcrm CLI 會註冊一個 workspace 並發出 API key。冇 dashboard。
favcrm signup request --email [email protected] \
--organisation-name "Bright Smile Clinic"
favcrm signup verify --request-id <id> --code <6-digit-code>
Verify 嗰步會印出一條 fav_mcp_* key。放喺你個 build 讀得到嘅地方 —— 千祈唔好放入 repo:
export FAVCRM_API_KEY=fav_mcp_...
第二步 —— 設定服務同可用時間(約 30 分鐘)
將個 brief 交畀你個 agent,等佢去 call 啲 tool。先查睇 schema:
favcrm tool describe create_service
然後逐項建立服務:
favcrm tool call create_service '{
"name": "New Patient Exam",
"durationMinutes": 45,
"price": "80.00"
}'
favcrm tool call create_service '{
"name": "Cleaning",
"durationMinutes": 30,
"price": "60.00"
}'
設定醫師幾時返工,令可用時間係真實嘅:
favcrm tool call set_staff_availability '{
"weekday": "mon",
"start": "09:00",
"end": "17:00"
}'
逐日重複。去到呢度,backend 已經做好 —— 服務、工作時間、一個識得處理衝突嘅 availability 引擎。你冇寫過任何 schema。
第三步 —— 一條 server route(約 30 分鐘)
瀏覽器絕對唔可以攞住條 API key。將佢放喺一條 server route 入面,由佢代理兩個操作:讀時段、建立預約。FavCRM 個 MCP endpoint 用 JSON-RPC over HTTP,所以一條 route handler 可以直接 call 佢。
// app/api/booking/route.js (Next.js route handler)
const MCP = 'https://api.favcrm.io/mcp';
async function callTool(name, args) {
const res = await fetch(MCP, {
method: 'POST',
headers: {
'content-type': 'application/json',
authorization: `Bearer ${process.env.FAVCRM_API_KEY}`,
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: { name, arguments: args },
}),
});
if (!res.ok) throw new Error(`FavCRM ${res.status}`);
return res.json();
}
export async function GET(req) {
const { searchParams } = new URL(req.url);
const slots = await callTool('get_available_slots', {
serviceId: searchParams.get('serviceId'),
date: searchParams.get('date'),
});
return Response.json(slots);
}
export async function POST(req) {
const body = await req.json();
const booking = await callTool('create_booking', {
serviceId: body.serviceId,
start: body.start,
customer: { name: body.name, email: body.email },
});
return Response.json(booking);
}
呢條就係你要寫嘅成個 backend —— 一個 proxy。create_booking 會做衝突檢查、寫入該行資料、亦會 upsert 客戶。你條 route 唔做任何業務邏輯。
第四步 —— 預約 UI(約 1–2 小時)
呢度就係 agent 發揮價值嘅地方。咁樣 prompt 佢:
Build a booking page. Fetch services, let the visitor pick one and a date,
GET /api/booking for open slots, POST /api/booking to confirm.
Show a success state with the booking time.
Agent 會整出 React。佢 call 緊你條 route,你條 route call 緊 FavCRM。個 UI 係你嘅,你照診所嘅品牌去設計 —— 而最煩、最容易出錯嗰啲(可用時間、持久化、衝突)唔係你嘅 code。
第五步 —— 測試一次真實預約
喺瀏覽器跑一次成個 flow,然後確認佢落咗地:
favcrm tool call list_bookings '{}'
預約喺度。病人都喺度 —— create_booking 已經 upsert 咗一個 crm_accounts 記錄,連同佢嘅資料同歷史。佢下次再預約,就會接返同一個記錄。
要收訂金,再加多一個被代理嘅 call:
favcrm tool describe create_invoice
出咗咩貨,又慳返咗咩
診所有咗一個有品牌嘅預約網站、真實預約、一張會自己填嘅病人名單,仲有 Stripe 訂金。
你慳返咗:個 database、啲 migration、availability 演算法、嗰個你本來會喺第二個禮拜先 ship 出去再 fix 嘅重複預約 bug、客戶表、Stripe webhook 對帳。
你寫咗:一份服務設定、一條 proxy route、同一個 UI。
呢個就係 headless CRM 嘅用途。免費方案足夠完整跑完呢類 build —— 將你個 agent 指向佢,自己跑一個下晝睇吓。
啱啱接觸呢個類別?由 咩係 agentic CRM 開始。

