你會做出什麼
會議剛結束。你說了再見、關掉 Zoom 視窗,腦袋後面有個聲音在唸你:該更新 CRM 了。 你應該更新。你不會更新。因為更新 CRM 意味著打開瀏覽器、找到正確的帳戶、在三層巢狀表單裡點來點去、填十幾個欄位、寫一段摘要、按存檔。那是 5 到 8 分鐘的機械式工作,對「你」產生零價值 -- 受益的只有三個禮拜後讀 CRM 的人。
所以你跳過了。每個人都跳過。你的 pipeline 變成上個月現實的博物館展品。
這篇文章建立一個不同的 workflow。通話結束,打一個指令,AI agent 讀取你的會議筆記、擷取聯絡人、交易階段、待辦事項和後續步驟,然後透過 MCP(Model Context Protocol -- 一種讓 AI agent 把外部 API 當工具呼叫的標準)推送 structured output 到 Salesforce 或 HubSpot。不用瀏覽器。不用表單。不用忘記。
想像成 CRM 版的 git commit。會議結束,你寫一段快速筆記(或貼上逐字稿),agent 處理結構化資料輸入。整個互動不到 30 秒。
這篇文章結束後,你會有:
- 一個 MCP server 設定,讓 Claude Code 連接你的 CRM API(Salesforce 或 HubSpot)
- 一段 CLAUDE.md workflow,定義 CRM 欄位對應和公司內部慣例
- Structured output 規則,確保每次記錄的資料格式一致
- 一個 Claude Code hook,可以在特定事件後自動觸發 CRM 更新
- 一個可重複的單指令 workflow,每場會議後都能跑
整個設定大約 30 分鐘。之後,你再也不用手動填 CRM 表單。
為什麼 CRM 記錄是最糟糕的手動工作
業務工程師、開發者倡導者、客戶經理都有同一個病。會議結束了。你應該更新 CRM。你沒有。資料就過時了。三個禮拜後,主管問 pipeline 狀態,CRM 裡顯示的是一個已經不存在的現實。
原因不是懶。是摩擦力。這樣想:想像如果每次 git commit 都要打開一個網頁表單、填十二個欄位、從三個下拉選單裡選值、寫一段話的摘要。沒人會 commit。CRM 資料輸入就是這樣。資訊在你腦袋裡(或你的筆記裡)。障礙是輸入機制,不是輸入本身。
Anthropic 自家文件描述了一個使用情境:Claude 透過 Chrome extension 讀取行事曆和 Salesforce 來協助 CRM 更新。那個方法可以用。但它需要瀏覽器、Chrome extension、還有從終端切出去的上下文切換。如果你已經活在終端裡 -- 跑 Claude Code、用 markdown 記筆記、從命令列管理任務 -- 有更快的路。
終端原生的做法:會議筆記進去,結構化 CRM 更新出來。不需要瀏覽器。
事前準備
你需要這些東西已安裝並正常運作:
- Claude Code v2.1+ 搭配 API 存取
- Node.js 18+(跑 MCP server 用)
- 一個有 API 存取的 CRM 帳號(Salesforce 開啟 REST API,或 HubSpot 有 private app token)
- 一個終端
如果你從來沒建過或設定過 MCP server,20 分鐘建一個 MCP Server 那篇教學涵蓋了基礎。這篇文章假設你已經懂 MCP tool 註冊和 .mcp.json 的運作方式。
第一步:設定 CRM MCP Server
這個 workflow 的核心是一個包裝你 CRM REST API 的 MCP server。不管你用 Salesforce、HubSpot 還是其他 CRM,模式都一樣:把建立、讀取、更新操作公開為 MCP tool,讓 agent 像呼叫函式一樣使用。
HubSpot 設定
HubSpot 的 API 是兩者中比較簡單的。你可以用專用的 HubSpot MCP server:
{
"mcpServers": {
"hubspot": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-hubspot"],
"env": {
"HUBSPOT_ACCESS_TOKEN": "pat-na1-your-token-here"
}
}
}
}
或用全域設定,讓它在每個專案都可用:
claude mcp add hubspot --scope user -- npx -y @anthropic/mcp-server-hubspot
Salesforce 設定
Salesforce 需要 OAuth。使用已啟用 API scope 的 connected app:
{
"mcpServers": {
"salesforce": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-salesforce"],
"env": {
"SF_INSTANCE_URL": "https://your-org.my.salesforce.com",
"SF_ACCESS_TOKEN": "your_session_or_oauth_token"
}
}
}
}
通用 HTTP 模式
如果你的 CRM 沒有專用的 MCP server,通用 HTTP MCP server 可以對接任何 REST API。瑞士刀做法 -- 沒那麼優雅,但萬用。
{
"mcpServers": {
"crm-api": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-fetch"],
"env": {
"CRM_BASE_URL": "https://api.your-crm.com/v3",
"CRM_API_KEY": "your-api-key"
}
}
}
}
用 fetch server 的話,Claude Code 可以發任意 HTTP 請求。你在 CLAUDE.md 裡定義 API endpoint 和 payload 結構,agent 自己組出正確的請求。
加完 server 後重啟 Claude Code,執行 /mcp 確認連線顯示綠色。
重要: 所有 token 都放在環境變數裡。用 .env 檔或 shell profile 來 export。上面的明碼寫法只是為了說明清楚 -- 永遠不要寫死 secret。
第二步:在 CLAUDE.md 定義 CRM 欄位對應
這一步是玩具 demo 和可靠 workflow 的分水嶺。沒有明確的欄位對應,agent 會自己猜要填哪些 CRM 欄位。猜測產生不一致的資料。不一致的資料比沒有資料更糟,因為它製造虛假的信心。
你的 CLAUDE.md 必須精確定義會議資訊如何對應到 CRM 欄位。把它想成 schema 定義 -- 跟你定義 database migration 或 API contract 一模一樣。
把這段加到專案的 CLAUDE.md(或 ~/.claude/CLAUDE.md 做全域設定):
## CRM Update Workflow
When I ask to log a meeting or update the CRM, follow this exact sequence:
### Input Parsing
1. Read the meeting notes or transcript I provide.
2. Extract these fields:
- Company name and contact names
- Deal/opportunity name (if mentioned)
- Meeting type: discovery, demo, technical review, negotiation, check-in
- Key discussion points (3 bullets max)
- Action items with owners and due dates
- Next steps and follow-up date
- Deal stage change (if applicable)
- Sentiment: positive, neutral, at-risk
### CRM Field Mapping (HubSpot)
Map extracted data to these HubSpot fields:
- Contact: hs_lead_status, lifecycle_stage
- Deal: dealstage, amount, closedate, next_step
- Activity/Note: hs_note_body, hs_timestamp
- Task: hs_task_subject, hs_task_body, hs_task_due_date
### CRM Field Mapping (Salesforce)
Map extracted data to these Salesforce fields:
- Contact: LeadStatus, Title, Department
- Opportunity: StageName, Amount, CloseDate, NextStep
- Task: Subject, Description, ActivityDate, Priority
- Event: Subject, Description, StartDateTime, EndDateTime
### Deal Stage Mapping
Use these stage names (customize to your pipeline):
- "Discovery" -> discovery_call / Qualification
- "Demo completed" -> demo_scheduled / Proposal
- "Technical review" -> technical_evaluation / Negotiation
- "Verbal yes" -> negotiation / Closed Won (pending contract)
- "Contract sent" -> contract_sent / Closed Won
### Company Conventions
- Always prefix note subjects with the date: [YYYY-MM-DD]
- Tag all AI-logged activities with "logged-via-cli" in the description
- If no deal exists for this company, create a note on the contact record instead
- Currency is USD unless explicitly stated otherwise
- Quarter boundaries: Q1=Jan-Mar, Q2=Apr-Jun, Q3=Jul-Sep, Q4=Oct-Dec
### Output Format
After pushing to CRM, confirm with this structure:
**CRM Update Logged**
- Account: [company name]
- Contact: [name(s)]
- Activity: [meeting type] on [date]
- Deal stage: [previous] -> [new] (or "unchanged")
- Action items created: [count]
- Next follow-up: [date]
### Rules
- Never overwrite existing deal amounts unless I explicitly state a new number.
- Never move a deal backward in stages unless I explicitly say so.
- If a contact does not exist in the CRM, flag it instead of creating one automatically.
- Ask for confirmation before creating new deals or changing deal stages.
欄位對應區段是關鍵。它消除了造成 CRM 資料不一致的模糊地帶。每個團隊有不同的欄位名稱、pipeline 階段和慣例。把你的明確編碼進去。就像定義良好的 API contract 預防整合 bug,定義良好的欄位對應預防 CRM 資料毀損。
第三步:Structured Output 確保一致性
上面的 CLAUDE.md 規則確保 agent 知道要擷取「什麼」。Structured output 確保擷取的資料在送到 CRM API 之前「格式一致」。
Claude Code 處理你的會議筆記時,會在呼叫 API 之前建立內部表示。你可以在 CLAUDE.md 加一個擷取範本來強化一致性 -- 把它想成 CRM 資料的 TypeScript interface。
### Extraction Schema
Before calling any CRM API, structure the extracted data as:
{
"company": "string",
"contacts": ["string"],
"meeting_date": "YYYY-MM-DD",
"meeting_type": "discovery|demo|technical_review|negotiation|check_in",
"summary": "string (max 500 chars)",
"key_points": ["string (max 3 items)"],
"action_items": [
{
"owner": "string",
"task": "string",
"due_date": "YYYY-MM-DD"
}
],
"deal_stage_change": "string|null",
"next_follow_up": "YYYY-MM-DD",
"sentiment": "positive|neutral|at_risk"
}
Show me this structured extraction before pushing to CRM so I can verify.
這個中間步驟給你一個審查點。Agent 擷取資料,你花 5 秒掃一眼結構化資料,確認後推送。就像 git commit 前先看 git diff -- 看一眼結構化資料,你要嘛點頭,要嘛在錯誤進入 production 之前抓到它。
第四步:實際執行
以下是實際使用方式。會議剛結束。你打開終端,打:
claude -p "Log this meeting to CRM:
Met with Sarah Chen and James Park from Acme Corp today.
Demo of the enterprise tier. They liked the SSO integration
but had concerns about the migration timeline. Asked for a
technical architecture review next week. Deal is progressing,
moving from demo to technical review. Budget confirmed at 85k ARR.
Action items: I send the migration playbook by Friday,
James schedules the architecture review for next Tuesday."
Claude Code 按照 CLAUDE.md 定義的 workflow 處理這段內容:
- 解析會議筆記成結構化欄位
- 查詢 CRM 裡的 Acme Corp,找到對應的帳戶和聯絡人
- 顯示結構化擷取結果讓你確認
- 建立一筆活動記錄在該帳戶上
- 更新交易階段從「Demo」到「Technical Review」
- 建立兩個任務:寄出 migration playbook(週五截止)、架構審查(下週二)
- 確認輸出摘要
輸出結果:
**CRM Update Logged**
- Account: Acme Corp
- Contact: Sarah Chen, James Park
- Activity: demo on 2026-03-22
- Deal stage: demo_scheduled -> technical_evaluation
- Deal amount: $85,000 ARR (updated)
- Action items created: 2
- Next follow-up: 2026-03-25 (Tuesday)
總耗時:大約 20 秒,包含你審查擷取資料的時間。跟花 5-8 分鐘在表單裡點來點去比 -- 或者跟那個永遠不會發生的「我等一下再更新」比。
第五步:用 Claude Code Hooks 自動化
Workflow 穩定之後,再進一步。Claude Code hooks 讓你根據事件自動觸發動作 -- 就像 git hook,但是給 AI agent 生命週期用的。
在 Claude Code hooks 設定裡加入(.claude/hooks.json 或透過設定介面):
{
"hooks": {
"post-tool-use": [
{
"matcher": "read_file:*meeting*,*transcript*,*call-notes*",
"command": "echo 'Meeting notes detected. Run: claude -p \"log this meeting to CRM\" to update your CRM.'"
}
]
}
}
這是一個輕量提醒,不是強制自動化。當 Claude Code 讀取檔名包含 "meeting" 或 "transcript" 的檔案時,hook 會印出一行提醒。你自己決定要不要執行。想像成 post-commit hook 跑 echo "你更新文件了嗎?" -- 有幫助,但不會強迫你。
要完全自動化記錄,可以設定更直接的 alias:
# 在 .zshrc 或 .bashrc 裡:把會議筆記建立和 CRM 記錄串在一起
alias meeting-done='claude -p "Read the most recent file in ~/meetings/ and log it to CRM"'
或整合到你的行事曆 workflow:
# 會議結束後,一次完成筆記和記錄
alias post-meeting='vi ~/meetings/$(date +%Y-%m-%d)-notes.md && claude -p "Read ~/meetings/$(date +%Y-%m-%d)-notes.md and log this meeting to CRM"'
同時支援 Salesforce 和 HubSpot
如果你的組織用一套 CRM,但合作夥伴或客戶用另一套,兩個都設定,讓 CLAUDE.md 的 context 決定用哪一個:
{
"mcpServers": {
"hubspot": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-hubspot"],
"env": {
"HUBSPOT_ACCESS_TOKEN": "pat-na1-your-token"
}
},
"salesforce": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-salesforce"],
"env": {
"SF_INSTANCE_URL": "https://your-org.my.salesforce.com",
"SF_ACCESS_TOKEN": "your-token"
}
}
}
}
在 CLAUDE.md 加一條路由規則:
### CRM Routing
- Default CRM: HubSpot
- If I mention "Salesforce" or the account is tagged as "SF-managed", use Salesforce
- If unsure which CRM, ask before pushing
Agent 讀路由規則的方式和讀其他指令一樣。不需要改程式碼。就是設定檔裡多一行而已。
調校與除錯
Agent 建了錯誤的交易階段。 你 CLAUDE.md 裡的階段名稱和 CRM 實際的值不符。這是最常見的失敗模式。到 CRM 設定裡檢查確切的階段名稱,逐字複製到 deal stage mapping 裡。一個錯字就代表一次無聲的失敗。
找不到聯絡人。 如果 CRM 裡是 "Sarah Chen" 但會議筆記寫 "Sarah",agent 可能配對不上。加一條規則:When a contact name partially matches, show the top 3 matches and ask me to confirm. 這是 CRM 版的模糊搜尋 -- 顯示候選比無聲地選錯好。
API 呼叫太多。 Agent 可能對每個操作各發一次請求。在 CLAUDE.md 加:Batch CRM operations when possible. Use a single API call to update deal fields and log the activity simultaneously if the API supports it.
驗證錯誤。 CRM token 會過期。Salesforce session token 尤其短命。執行 workflow 前先用 OAuth refresh token 重新驗證,或檢查 /mcp 確認 server 有連上。
速率限制。 Salesforce 和 HubSpot 都有 API 速率限制。正常的會議記錄(每次 session 幾個呼叫)不會碰到。如果你要批次處理歷史會議,加延遲或檢查 rate limit header。
多窗格 CRM Workflow
記錄會議時,有效率的終端配置是三個窗格。第一個窗格:在編輯器裡打開你的會議筆記檔 -- 資料來源。第二個窗格:Claude Code 跑 CRM 更新 workflow,顯示結構化擷取和 API 呼叫 -- 處理引擎。第三個窗格:CRM 確認結果,或用 curl 快速驗證記錄有沒有成功建立 -- 驗證。
這個配置消除了「會議裡發生什麼」和「記錄了什麼」之間的上下文切換。你同時看到來源、處理過程、結果。如果擷取有什麼看起來不對,在第一個窗格改筆記、在第二個窗格重跑,不用切視窗。
如果團隊裡多個人要記錄同一批客戶的會議,workspace 切換讓每個人維護自己的 CLAUDE.md 慣例和 CRM 欄位對應,同時共用同一份 MCP server 設定。
延伸應用
CRM 記錄 workflow 是一個更廣泛模式的實例:非結構化文字進去,結構化 API 呼叫出來。這個架構是一條 pipeline -- 解析、擷取、驗證、推送 -- 任何符合這個形狀的東西都適用。
- 客服工單建立 -- 貼上客戶來信,agent 擷取問題細節,在 Jira 或 Linear 建立工單並加上正確的標籤和優先級
- 報帳 -- 貼上收據路徑或描述,agent 擷取廠商、金額、類別,push 到報帳系統
- 合約摘要 -- 貼上通話中的關鍵條款,agent 更新 deal room 或共享文件的結構化欄位
每種變體只需要 CLAUDE.md 裡一段新的 workflow 區塊,可能再加一個新的 MCP server 連線。核心模式 -- 解析、擷取、確認、push -- 完全不變。做完第一條 pipeline,第二條十分鐘就好了。
更多關於建立 AI CLI agent workflow 和 MCP server 模式的內容,那些指南涵蓋了本文所依賴的基礎概念。如果你已經在跑自動化站會報告,把 CRM 記錄加進日常流程是自然的下一步。
總結
CRM 資料輸入是一個已經被解決的問題。資訊早就在你的會議筆記和逐字稿裡了。MCP server 讓 Claude Code 直接存取你的 CRM API。CLAUDE.md 的 workflow 區段定義欄位對應和業務規則。Structured output 確保一致性。結果:20 秒的 CRM 更新,取代過去 5 到 8 分鐘的瀏覽器操作 -- 或者更常見的情況,根本就忘了做。
整個設定:.mcp.json 裡一筆 MCP server 設定、CLAUDE.md 裡一段 workflow 區塊、每場會議後跑一個指令。累積效果很可觀。一天 4 場會議,每次更新省 6 分鐘 -- 一天 24 分鐘,一年大約 100 小時。但真正的贏面不是省時間。是資料品質。你的 CRM 資料是即時的。這才是你有 CRM 的唯一理由。
Ready to streamline your terminal workflow?
Multi-terminal drag-and-drop layout, workspace Git sync, built-in AI integration, AST code analysis — all in one app.