安裝
內容詳情
安裝
{
"mcpServers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}🚀 @custify/mcp-server
💡 通過 模型上下文協議(Model Context Protocol) 將你的 AI 工具連接到 Custify 客戶成功數據。
查詢賬戶、健康分、使用數據等 —— 或創建筆記、任務、觸發劇本 —— 全部可以在 Claude、Cursor、VS Code 或任何兼容 MCP 的 AI 工具中完成。
🚀 快速開始
不到 2 分鐘即可完成上手。
1️⃣ 獲取 API 密鑰
前往 Custify Settings > Developer > API Access,創建或複製你的 API 密鑰。
2️⃣ 安裝
npx @custify/mcp-server
3️⃣ 配置你的 AI 工具
請參考下方的 配置 章節,找到你所用工具的說明。
4️⃣ 試用
向你的 AI 助手提問:
我有多少流失賬戶?
⚙️ 配置
Claude Desktop(STDIO)
將以下內容添加到你的 claude_desktop_config.json 中:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}
保存後重啟 Claude Desktop。
Cursor(STDIO)
- 打開 Settings > MCP
- 點擊 Add new MCP server
- 使用以下配置:
- Name:
custify - Command:
npx -y @custify/mcp-server - Environment Variables:
CUSTIFY_API_KEY=your-api-key-here
VS Code(STDIO)
在你的工作區根目錄的 .vscode/mcp.json 中添加:
{
"servers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}
Claude Code(CLI)
claude mcp add custify -- npx -y @custify/mcp-server \
--env CUSTIFY_API_KEY=your-api-key-here
ChatGPT(Streamable HTTP)
ChatGPT 需要基於 HTTP 的 MCP 服務器。使用 Docker 部署:
docker run -d \
-p 3000:3000 \
-e CUSTIFY_API_KEY=your-api-key-here \
ghcr.io/custifyofficial/custify-mcp:latest
然後將 ChatGPT 配置為連接到你的服務器 URL:
https://your-server.example.com/mcp
其他 MCP 客戶端
Custify MCP 服務器支持兩種傳輸方式:
- STDIO(默認):設置
CUSTIFY_API_KEY環境變量後運行npx @custify/mcp-server。 - Streamable HTTP:設置
MCP_TRANSPORT=streamable-http,服務器將監聽 3000 端口(可通過PORT配置)。MCP 端點為/mcp。
有關如何使用任一傳輸方式配置 MCP 服務器,請參考你所使用 MCP 客戶端的文檔。
🧰 可用工具
🏢 賬戶工具
| 工具 | 類型 | 描述 |
|---|---|---|
list_accounts |
讀取 | 使用 tag ID 或 Custify 高級過濾器系統列出並篩選賬戶 |
get_account |
讀取 | 按 ID 獲取指定賬戶的完整詳情 |
search_accounts |
讀取 | 按名稱或域名搜索賬戶 |
list_attributes |
讀取 | 發現所有可用於篩選的字段及其類型 |
list_accounts 支持使用 tag_ids 進行簡單的 tag 篩選,也支持 Custify 完整的過濾器系統用於高級字段。使用 list_tags 並傳入 category: "company" 可將賬戶 tag 名稱解析為 ID。使用 list_attributes 並傳入 entity_type: "account" 可發現可用字段。
當通過 filters 手動傳入時,tag 過濾器使用以下後端格式:
{
"fieldName": "tags",
"fieldType": "Tag",
"filterType": "is_any_of",
"filterValue": ["<company_tag_id>"]
}
支持的 tag filterType 值為 is_any_of、is_all_of、is_none_of、is_unknown 和 any_value。對於基於 ID 的 tag 過濾器,filterValue 必須是非空的 tag ID 數組。
過濾器示例:
| 你的需求 | 過濾對象 |
|---|---|
| 流失賬戶 | {"fieldName": "churned", "fieldType": "Boolean", "filterType": "true"} |
| 名稱包含 "acme" | {"fieldName": "name", "fieldType": "String", "filterType": "contains", "filterValue": "acme"} |
| 擁有任意所列賬戶 tag | {"tag_ids": ["<company_tag_id>"], "tag_match": "any"} |
| 擁有所有所列賬戶 tag | {"tag_ids": ["<company_tag_id_1>", "<company_tag_id_2>"], "tag_match": "all"} |
| 不包含任何所列賬戶 tag | {"tag_ids": ["<company_tag_id>"], "tag_match": "none_of"} |
| 健康分 > 50 | {"fieldName": "metrics.health_scores.<score_id>", "fieldType": "Number", "filterType": "greater", "filterValue": "50"} |
| 在某日期之後註冊 | {"fieldName": "signed_up_at", "fieldType": "Date", "filterType": "after", "filterValue": "2024-01-01"} |
| 屬於特定分群 | {"fieldName": "buckets", "fieldType": "Segment", "filterType": "is_any_of", "filterValue": ["<segment_id>"]} |
| 已分配任意 CSM | {"fieldName": "owners_csm", "fieldType": "User", "filterType": "any_value"} |
按字段類型可用的過濾類型:
| 字段類型 | 過濾類型 |
|---|---|
| Boolean | true, false |
| Number | greater, lower, between, is_unknown, any_value |
| String | contains, starts_with, ends_with, does_not_contain, is_unknown, any_value |
| Date | more_than, less_than, exactly, after, before, between, on, last_week, this_week, last_month, this_month, last_quarter, this_quarter, last_year, this_year, is_unknown, any_value |
| Dropdown | is_any_of, is_all_of, is_none_of, is_unknown, any_value |
| Segment | is_any_of, is_all_of, is_none_of |
| Tag | is_any_of, is_all_of, is_none_of, is_unknown, any_value |
| User | is_in, is_not_in, is_unknown, any_value |
| Currency | greater, lower, between, is_unknown, any_value |
👥 聯繫人工具
| 工具 | 類型 | 描述 |
|---|---|---|
list_contacts |
讀取 | 使用 tag ID 或 Custify 過濾器跨所有賬戶列出並篩選聯繫人 |
get_contacts |
讀取 | 列出與某個賬戶關聯的聯繫人/人員 |
get_contact |
讀取 | 按 ID 獲取完整的聯繫人詳情 |
list_contacts 是 list_accounts 在聯繫人層面的對應工具。使用 tag_ids 配合 people tag 進行簡單 tag 篩選,或傳入 Custify 高級過濾器。使用 list_tags 並傳入 category: "people" 可將聯繫人 tag 名稱解析為 ID。使用 list_attributes 並傳入 entity_type: "contact" 可發現可用的聯繫人字段。
聯繫人過濾器示例:
| 你的需求 | 參數 |
|---|---|
| 標記為 "champion" 的聯繫人 | {"tag_ids": ["<people_tag_id>"], "tag_match": "any"} |
| 不包含任何所列 tag 的聯繫人 | {"tag_ids": ["<people_tag_id>"], "tag_match": "none_of"} |
| 郵箱包含某個域名 | {"filters": [{"fieldName": "email", "fieldType": "String", "filterType": "contains", "filterValue": "@example.com"}]} |
| 關聯到某個賬戶的聯繫人 | {"filters": [{"fieldName": "companies", "fieldType": "Company", "filterType": "is_in", "filterValue": "<account_id>"}]} |
📊 健康與使用工具
| 工具 | 類型 | 描述 |
|---|---|---|
get_health_scores |
讀取 | 獲取賬戶的所有健康分,包含分數名稱與數值 |
get_usage_data |
讀取 | 獲取賬戶的產品使用情況與事件數據 |
get_usage_trends |
讀取 | 獲取健康分隨時間變化的數值,用於趨勢分析 |
🔔 告警與分群
| 工具 | 類型 | 描述 |
|---|---|---|
get_alerts |
讀取 | 獲取賬戶的告警/信號 |
get_segment_membership |
讀取 | 獲取賬戶所屬的分群 |
✅ 任務工具
| 工具 | 類型 | 描述 |
|---|---|---|
list_tasks |
讀取 | 使用過濾器與分頁跨所有賬戶查詢任務 |
get_task |
讀取 | 按 ID 獲取指定任務的完整詳情 |
update_task_status |
寫入 | 將任務標記為 open、done 或 not_relevant |
list_task_filter_values |
讀取 | 發現任務中當前使用的負責人、賬戶和創建者 ID(含名稱) |
list_tags |
讀取 | 將可讀的 tag 名稱解析為 tag ID。使用 category: "task" 限定到任務標籤。 |
list_tasks 使用扁平、易用的參數。過濾器之間以 AND 組合。要將 "onboarding follow up" 這類 tag 名稱解析為 ID,請調用 list_tags 並傳入 category: "task"。要解析負責人名稱,請調用 list_task_filter_values(返回帶名稱的用戶 ID)。
過濾器示例:
| 你的需求 | 參數 |
|---|---|
| 我今天到期的開放任務 | {"assignee_id": "<user_id>", "status": "open", "due": "today"} |
| 某賬戶的逾期任務 | {"account_id": "<account_id>", "status": "overdue"} |
| 所有標記為 "onboarding follow up" 的任務 | {"tag_ids": ["<tag_id>"], "status": "open"} |
| 本週到期的高優先級任務 | {"priority": "high", "due": "this_week"} |
| 自定義日期範圍內到期的任務 | {"due_after": "2026-04-01", "due_before": "2026-04-30"} |
| 分配給某位 CSM、按到期日排序的任務 | {"assignee_id": "<user_id>", "sort_by": "dueDate", "sort_direction": "asc"} |
可用的狀態過濾值:
| 狀態 | 含義 |
|---|---|
open |
狀態為開放且未被延後(snoozed) |
done |
任務已完成 |
not_relevant |
已標記為不相關 |
overdue |
開放且 dueDate <= 昨天 |
on_time |
開放且(無 dueDate,或 dueDate > 昨天) |
outstanding |
開放且 dueDate <= 今天 |
update_task_status 只會寫入持久化的任務狀態:open、done 和 not_relevant。請先使用 list_tasks 找到內部 task_id,然後攜帶新狀態調用 update_task_status。
可用的 due 快捷值: past_due、today、this_week、this_month、later。如需自定義範圍,請同時提供 due_after 和 due_before(ISO 日期)。due 快捷方式與日期範圍組合互斥 —— 只傳入其中一個邊界將被忽略。
🎯 目標工具
| 工具 | 類型 | 描述 |
|---|---|---|
get_account_objectives |
讀取 | 獲取指定賬戶的客戶目標,可使用 Custify 賬戶 ID 或你的外部 company_id |
get_account_objectives 接受 account_id(Custify 內部公司 ID)或 external_account_id(你的 company_id)。它支持分頁、排序,以及針對 objectiveStatus、importance、risk、dueAt 等字段的 Custify 過濾器對象。
⚡ 操作工具
| 工具 | 類型 | 描述 |
|---|---|---|
create_note |
寫入 | 在賬戶時間線中添加一條筆記 |
create_task |
寫入 | 創建分配給某位 CSM 的任務 |
run_playbook |
寫入 | 在賬戶上觸發一個手動啟動的劇本 |
update_custom_fields |
寫入 | 更新賬戶或聯繫人上的自定義屬性值 |
add_tag_to_entities |
寫入 | 為單個或多個賬戶/聯繫人添加已有 tag |
remove_tag_from_entities |
寫入 | 從單個或多個賬戶/聯繫人移除已有 tag |
Tag 操作接受 entity_type: "account" 或 entity_type: "contact"、一個 Custify 內部 entity_ids 數組和一個 tag_id。請先使用 list_tags 或 custify://tags 資源將 tag 名稱解析為 ID。
📚 可用資源
資源為 AI 代理提供只讀上下文,用於理解你的 Custify 工作區:
| 資源 | URI | 描述 |
|---|---|---|
| Segments | custify://segments |
所有分群定義,包含名稱與 ID |
| Playbooks | custify://playbooks |
所有劇本定義,包含名稱、類型與 ID |
| Health Score Definitions | custify://health-score-definitions |
所有健康分配置,包含名稱、閾值與 ID |
| Calculated Metrics | custify://calculated-metrics |
所有針對公司和人員計算指標定義 |
| Lifecycles | custify://lifecycles |
所有生命週期定義,包含目標與任務模板 |
| Tags | custify://tags |
按分類分組的所有 tag |
💡 示例
以下是連接後你可以向 AI 助手提出的真實場景示例:
查詢賬戶
"我有多少流失賬戶?" 使用
list_accounts配合 churned 過濾器,統計churned = true的賬戶數量。
"顯示所有健康分低於 30 的賬戶" 使用
list_attributes找到健康分字段名,然後使用list_accounts配合 Number 過濾器。
"找出所有由 jane@company.com 管理的賬戶" 使用
list_accounts在 CSM 字段上配合 User 過濾器。
"哪些賬戶是在本季度註冊的?" 使用
list_accounts配合 Date 過濾器:在signed_up_at上設置filterType: "this_quarter"。
"顯示標記為 renewal risk 的賬戶" 使用
list_tags並傳入category: "company"解析 tag ID,然後使用list_accounts配合tag_ids。
查詢聯繫人
"顯示標記為 champion 的聯繫人" 使用
list_tags並傳入category: "people"解析 tag ID,然後使用list_contacts配合tag_ids。
"找出使用 example.com 郵箱的聯繫人" 使用
list_contacts在
賬戶深度分析
"給我一份 Acme Corp 的完整摘要" 使用
search_accounts找到 Acme,然後通過get_account、get_health_scores、get_contacts、get_usage_data和get_segment_membership構建一份全面的簡報。
"Acme Corp 屬於哪些分群?" 使用
search_accounts找到賬戶 ID,然後使用get_segment_membership。
"顯示 Acme Corp 上個月的健康分趨勢" 使用
get_health_scores找到分數 ID,然後使用get_usage_trends獲取歷史數值。
查詢任務
"我今天有什麼任務?" 使用
list_tasks配合assignee_id(你的用戶 ID)和due: "today",拉取每日任務清單。
"顯示所有分配給 Jane、標記為 'onboarding follow up' 的逾期任務" 使用
list_tags並傳入category: "task"將 tag 名稱解析為 ID,用list_task_filter_values解析 Jane 的用戶 ID,然後使用list_tasks配合tag_ids、assignee_id和status: "overdue"。
"Acme Corp 有哪些未完成的任務?" 使用
search_accounts找到賬戶 ID,然後使用list_tasks配合account_id和status: "open"。
"把 onboarding review 任務標記為已完成" 使用
list_tasks找到匹配的任務 ID,然後使用update_task_status並傳入status: "done"。使用status: "open"可重新打開任務,使用status: "not_relevant"可將其標記為不相關。
查詢目標
"Acme Corp 有哪些未完成的目標?" 使用
search_accounts找到賬戶 ID,然後使用get_account_objectives。
執行操作
"為 Acme Corp 創建一條跟進任務:Review onboarding progress,下週五到期" 使用
search_accounts找到 Acme,然後使用create_task並傳入標題、到期日和賬戶 ID。
"給 Acme Corp 添加一條筆記:Spoke with VP of Engineering about API latency concerns" 使用
search_accounts,然後使用create_note並傳入筆記正文。
"為 Acme Corp 運行 renewal prep 劇本" 使用
playbooks資源找到劇本 ID,用search_accounts找到賬戶,然後使用run_playbook。
"把 Acme Corp 標記為 renewal risk" 使用
search_accounts找到賬戶 ID,用list_tags或custify://tags找到 tag ID,然後使用add_tag_to_entities。
探索你的數據模型
"我可以按哪些字段篩選賬戶?" 使用
list_attributes返回所有可用字段及其名稱和類型。
"我們有哪些分群?" 讀取
custify://segments資源。
"有哪些可用的劇本?" 讀取
custify://playbooks資源。
"我們有哪些計算指標和生命週期階段?" 讀取
custify://calculated-metrics和custify://lifecycles資源。
"我可以在賬戶和聯繫人上使用哪些 tag?" 讀取
custify://tags資源。
🔐 環境變量
| 變量 | 是否必需 | 默認值 | 描述 |
|---|---|---|---|
CUSTIFY_API_KEY |
是 | - | 你的 Custify API 密鑰 |
CUSTIFY_API_URL |
否 | https://api.custify.com |
自定義 API 基礎 URL(用於不同集群) |
MCP_TRANSPORT |
否 | stdio |
傳輸模式:stdio 或 streamable-http |
PORT |
否 | 3000 |
HTTP 服務器端口(僅在使用 streamable-http 傳輸時有效) |
🐳 Docker
以 Docker 容器方式運行服務器,用於基於 HTTP 的 MCP 客戶端:
docker run -d \
--name custify-mcp \
-p 3000:3000 \
-e CUSTIFY_API_KEY=your-api-key-here \
ghcr.io/custifyofficial/custify-mcp:latest
MCP 端點將位於 http://localhost:3000/mcp,健康檢查端點位於 http://localhost:3000/health。
🛡️ 安全
- 數據流: 你的 AI 工具與 Custify MCP 服務器通信,後者再向 Custify REST API 發起經過認證的調用。MCP 服務器本身不存儲任何數據。
- API 密鑰處理: 你的
CUSTIFY_API_KEY從環境變量中讀取,絕不會被記錄、緩存或通過 MCP 響應暴露。使用 STDIO 傳輸時,密鑰保留在你的本地進程中。使用 HTTP 傳輸時,請確保你的部署位於 TLS 之後。 - 權限: MCP 服務器繼承你的 API 密鑰所擁有的權限。請使用一個僅具備工作流所需最低訪問級別的密鑰。只讀密鑰可用於所有讀取工具;寫入工具需要具備寫入權限的密鑰。
- 無遙測: 服務器不收集分析數據,也不向任何第三方發送數據。
🧯 故障排查
"Error: CUSTIFY_API_KEY environment variable is required"
請確保在你的 MCP 客戶端配置中設置了 CUSTIFY_API_KEY 環境變量。仔細檢查是否有拼寫錯誤,並確保沒有多餘的空格。
Claude Desktop 中服務器無法連接
- 確認配置文件路徑與你的操作系統匹配。
- 確保在編輯配置後已重啟 Claude Desktop。
- 檢查
npx是否在系統 PATH 中可用。
認證錯誤(401) 你的 API 密鑰可能無效或已過期。請前往 Custify Settings > Developer > API Access 生成一個新的密鑰。
權限錯誤(403) 該端點可能不允許通過 API 密鑰訪問。請檢查你的 Custify 賬戶是否具備所需權限。
超時或連接錯誤
如果使用 HTTP 傳輸,請確認服務器正在運行且可訪問。檢查 PORT 環境變量是否與你的部署配置匹配。對於 STDIO 傳輸,請確保沒有防火牆或代理阻止本地進程通信。
使用不同的 Custify 集群?
如果你的 Custify 實例位於不同集群(例如 EU),請將 CUSTIFY_API_URL 設置為你的集群 API URL。
Docker 容器立即退出
使用 docker logs custify-mcp 檢查容器日誌。最常見的原因是缺少 CUSTIFY_API_KEY 環境變量。
🤝 貢獻
歡迎貢獻!要開始參與:
git clone https://github.com/CustifyOfficial/custify-mcp.git
cd custify-mcp-server
npm install
npm run dev
- Fork 本倉庫
- 創建功能分支:
git checkout -b feature/my-feature - 進行修改並添加測試
- 運行測試套件:
npm test - 提交 pull request
如果你計劃進行重大修改,請先開一個 issue。
📄 許可證
MIT —— 詳情請見 LICENSE。
替代品








VIP會員