2026年3月22日7 分鐘閱讀ai-agent-workflows

從終端自動更新 CRM:AI Agent + MCP 實戰

用 Claude Code 搭配 MCP server,直接從終端推送結構化 CRM 更新到 Salesforce 或 HubSpot。不用瀏覽器,不用手動填表。

DH
Danny Huang

你會做出什麼

會議剛結束。你說了再見、關掉 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 處理這段內容:

  1. 解析會議筆記成結構化欄位
  2. 查詢 CRM 裡的 Acme Corp,找到對應的帳戶和聯絡人
  3. 顯示結構化擷取結果讓你確認
  4. 建立一筆活動記錄在該帳戶上
  5. 更新交易階段從「Demo」到「Technical Review」
  6. 建立兩個任務:寄出 migration playbook(週五截止)、架構審查(下週二)
  7. 確認輸出摘要

輸出結果:

**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 設定。

Try Termdock Multi Terminal Layout works out of the box. Free download →

延伸應用

CRM 記錄 workflow 是一個更廣泛模式的實例:非結構化文字進去,結構化 API 呼叫出來。這個架構是一條 pipeline -- 解析、擷取、驗證、推送 -- 任何符合這個形狀的東西都適用。

  • 客服工單建立 -- 貼上客戶來信,agent 擷取問題細節,在 Jira 或 Linear 建立工單並加上正確的標籤和優先級
  • 報帳 -- 貼上收據路徑或描述,agent 擷取廠商、金額、類別,push 到報帳系統
  • 合約摘要 -- 貼上通話中的關鍵條款,agent 更新 deal room 或共享文件的結構化欄位

每種變體只需要 CLAUDE.md 裡一段新的 workflow 區塊,可能再加一個新的 MCP server 連線。核心模式 -- 解析、擷取、確認、push -- 完全不變。做完第一條 pipeline,第二條十分鐘就好了。

更多關於建立 AI CLI agent workflowMCP 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 的唯一理由。

DH
Free Download

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.

Download Termdock →
#ai-agent#mcp#crm#salesforce#hubspot#workflow-automation#claude-code#ai-cli

相關文章