インストール
コンテンツ詳細
インストール
{
"mcpServers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}🚀 @custify/mcp-server
Model Context Protocol (MCP) を通じて、AI ツールをあなたの Custify カスタマーサクセスデータに接続します。
アカウント、ヘルススコア、利用状況データなどのクエリに加え、ノート・タスクの作成やプレイブックのトリガーまで、Claude、Cursor、VS Code、その他 MCP 対応の AI ツールから直接実行できます。
🚀 クイックスタート
2 分以内でセットアップを完了できます。
1️⃣ API キーを取得する
Custify の設定 > 開発者 > API アクセス に移動し、API キーを作成またはコピーします。
2️⃣ インストール
npx @custify/mcp-server
3️⃣ AI ツールを設定する
ご利用のツールに応じて、後述の設定セクションを参照してください。
4️⃣ 試してみる
AI アシスタントに次のように質問してみましょう:
How many churned accounts do I have?
⚙️ 設定
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)
- 設定 > 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 サーバーは 2 つのトランスポートをサポートしています:
- STDIO(既定):
CUSTIFY_API_KEY環境変数を設定した状態でnpx @custify/mcp-serverを実行します。 - Streamable HTTP:
MCP_TRANSPORT=streamable-httpを設定すると、サーバーはポート 3000 で待ち受けます(PORTで変更可能)。MCP エンドポイントは/mcpです。
いずれかのトランスポートを使用して MCP サーバーを構成する方法については、ご利用の MCP クライアントのドキュメントを参照してください。
🛠️ 利用可能なツール
📊 アカウントツール
| ツール | 種類 | 説明 |
|---|---|---|
list_accounts |
Read | タグ ID または Custify の高度なフィルターシステムを使用してアカウントを一覧表示・フィルタリングします |
get_account |
Read | ID を指定して特定のアカウントの詳細を取得します |
search_accounts |
Read | 名前またはドメインでアカウントを検索します |
list_attributes |
Read | フィルタリングに利用可能なすべてのフィールドとその型を確認します |
list_accounts は、シンプルなタグフィルタリング用の tag_ids と、高度なフィールド用の Custify フルフィルターシステムをサポートしています。アカウントのタグ名を ID に解決するには list_tags を category: "company" と共に使用します。利用可能なフィールドを確認するには list_attributes を entity_type: "account" と共に使用します。
タグフィルターを filters 経由で手動指定する場合、バックエンドでは次の形式を使用します:
{
"fieldName": "tags",
"fieldType": "Tag",
"filterType": "is_any_of",
"filterValue": ["<company_tag_id>"]
}
タグでサポートされる filterType の値は is_any_of、is_all_of、is_none_of、is_unknown、any_value です。ID ベースのタグフィルターでは、filterValue は空でないタグ ID の配列である必要があります。
フィルター例:
| 目的 | フィルターオブジェクト |
|---|---|
| チャーンしたアカウント | {"fieldName": "churned", "fieldType": "Boolean", "filterType": "true"} |
| 名前に "acme" を含む | {"fieldName": "name", "fieldType": "String", "filterType": "contains", "filterValue": "acme"} |
| いずれかのアカウントタグを持つ | {"tag_ids": ["<company_tag_id>"], "tag_match": "any"} |
| すべてのアカウントタグを持つ | {"tag_ids": ["<company_tag_id_1>", "<company_tag_id_2>"], "tag_match": "all"} |
| いずれのアカウントタグも持たない | {"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 |
Read | タグ ID または Custify フィルターを使用して、すべてのアカウントにまたがるコンタクトを一覧表示・フィルタリングします |
get_contacts |
Read | 1 つのアカウントに紐づくコンタクト/担当者を一覧表示します |
get_contact |
Read | ID を指定してコンタクトの詳細を取得します |
list_contacts は list_accounts のコンタクト版です。シンプルなタグフィルタリングには people タグと共に tag_ids を使用し、高度な Custify フィルターを渡すこともできます。コンタクトタグ名を ID に解決するには list_tags を category: "people" と共に使用します。利用可能なコンタクトフィールドを確認するには list_attributes を entity_type: "contact" と共に使用します。
コンタクトフィルター例:
| 目的 | パラメータ |
|---|---|
| "champion" タグが付いたコンタクト | {"tag_ids": ["<people_tag_id>"], "tag_match": "any"} |
| 指定タグを持たないコンタクト | {"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 |
Read | アカウントのすべてのヘルススコアを、スコア名と値と共に取得します |
get_usage_data |
Read | アカウントのプロダクト利用状況とイベントデータを取得します |
get_usage_trends |
Read | トレンド分析のためにヘルススコアの時系列値を取得します |
🔔 アラート・セグメント
| ツール | 種類 | 説明 |
|---|---|---|
get_alerts |
Read | アカウントのアラート/シグナルを取得します |
get_segment_membership |
Read | アカウントが所属するセグメントを取得します |
✅ タスクトレード
| ツール | 種類 | 説明 |
|---|---|---|
list_tasks |
Read | フィルターとページネーションを使用して、すべてのアカウントにまたがるタスクを照会します |
get_task |
Read | ID を指定して特定のタスクの詳細を取得します |
update_task_status |
Write | タスクを open、done、または not_relevant としてマークします |
list_task_filter_values |
Read | タスクで現在使用されている担当者・アカウント・作成者の ID(および名前)を確認します |
list_tags |
Read | 人間が読めるタグ名をタグ ID に解決します。タスクラベルにスコープするには category: "task" を使用します。 |
list_tasks はフラットで扱いやすいパラメータを使用します。フィルターは AND で結合されます。"onboarding follow up" のようなタグ名を 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 |
ステータスが open で、スヌーズされていない |
done |
タスク完了 |
not_relevant |
関連なしとしてマーク済み |
overdue |
open かつ dueDate <= 昨日 |
on_time |
open かつ(dueDate なし、または dueDate > 昨日) |
outstanding |
open かつ 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 ショートカットと日付範囲ペアは排他的であり、範囲の片方のみを渡した場合は無視されます。
🎯 目標(Objective)ツール
| ツール | 種類 | 説明 |
|---|---|---|
get_account_objectives |
Read | Custify のアカウント ID または外部の company_id を使用して、特定のアカウントのカスタマー目標を取得します |
get_account_objectives は account_id(Custify 内部の company ID)または external_account_id(あなたの company_id)を受け付けます。ページネーション、ソート、および objectiveStatus、importance、risk、dueAt などのフィールドに対する Custify フィルターオブジェクトをサポートします。
⚡ アクションツール
| ツール | 種類 | 説明 |
|---|---|---|
create_note |
Write | アカウントのタイムラインにノートを追加します |
create_task |
Write | CSM に割り当てられたタスクを作成します |
run_playbook |
Write | アカウントで手動開始のプレイブックをトリガーします |
update_custom_fields |
Write | アカウントまたはコンタクトのカスタム属性値を更新します |
add_tag_to_entities |
Write | 既存のタグを 1 つ以上のアカウントまたはコンタクトに追加します |
remove_tag_from_entities |
Write | 既存のタグを 1 つ以上のアカウントまたはコンタクトから削除します |
タグアクション は entity_type: "account" または entity_type: "contact"、Custify 内部 entity_ids の配列、および tag_id を受け取ります。タグ名を ID に解決するには、まず list_tags または custify://tags リソースを使用してください。
📚 利用可能なリソース
リソースは、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 |
カテゴリ別にグループ化されたすべてのタグ |
💡 使用例
接続後に AI アシスタントへ問い合わせできる実践的な例を以下に示します。
📊 アカウントの照会
"チャーンしたアカウントはいくつありますか?" churned フィルター付きの
list_accountsを使用して、churned = true のアカウントをカウントします。
"ヘルススコアが 30 未満のアカウントをすべて表示して"
list_attributesでヘルススコアのフィールド名を特定し、Number フィルター付きのlist_accountsを使用します。
"jane@company.com が管理しているアカウントをすべて探して" CSM フィールドに対する User フィルター付きの
list_accountsを使用します。
"今四半期にサインアップしたアカウントは?"
signed_up_atに対してfilterType: "this_quarter"を指定した Date フィルター付きのlist_accountsを使用します。
"renewal risk タグが付いたアカウントを表示して"
category: "company"付きのlist_tagsでタグ ID を解決し、tag_ids付きのlist_accountsを使用します。
👤 コンタクトの照会
"champion タグが付いたコンタクトを表示して"
category: "people"付きのlist_tagsでタグ ID を解決し、tag_ids付きのlist_contactsを使用します。
"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 の過去 1 か月のヘルススコアのトレンドを見せて"
get_health_scoresでスコア ID を取得し、履歴値についてはget_usage_trendsを使用します。
✅ タスクの照会
"今日の自分のタスクは?"
assignee_id(あなたのユーザー ID)とdue: "today"を指定したlist_tasksを使用して、日次のタスクリストを取得します。
"Jane に割り当てられた 'onboarding follow up' タグ付きの期限超過タスクをすべて表示して"
category: "task"付きのlist_tagsでタグ名を ID に、list_task_filter_valuesで Jane のユーザー ID を解決し、tag_ids、assignee_id、status: "overdue"を指定したlist_tasksを使用します。
"Acme Corp で未完了のものは?"
search_accountsでアカウント ID を検索し、account_idとstatus: "open"を指定したlist_tasksを使用します。
"オンボーディングレビューのタスクを完了にして"
list_tasksで該当タスク ID を検索し、status: "done"を指定したupdate_task_statusを使用します。タスクを再開するにはstatus: "open"、関連なしとしてマークするにはstatus: "not_relevant"を使用します。
🎯 目標(Objective)の照会
"Acme Corp で未完了の目標は?"
search_accountsでアカウント ID を検索し、get_account_objectivesを使用します。
⚡ アクションの実行
"Acme Corp のフォローアップタスクを作成して:オンボーディングの進捗を確認、期限は次の金曜"
search_accountsで Acme を検索し、タイトル・期限・アカウント ID を指定したcreate_taskを使用します。
"Acme Corp にノートを追加して:API レイテンシの懸念について VP of Engineering と話した"
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でタグ ID を検索し、add_tag_to_entitiesを使用します。
🔎 データモデルの確認
"アカウントをフィルタリングできるフィールドは?"
list_attributesを使用して、利用可能なすべてのフィールドを名前と型と共に返します。
"どのセグメントがありますか?"
custify://segmentsリソースを読み取ります。
"利用可能なプレイブックは?"
custify://playbooksリソースを読み取ります。
"どの集計メトリクスとライフサイクルステージがありますか?"
custify://calculated-metricsとcustify://lifecyclesリソースを読み取ります。
"アカウントとコンタクトに使用できるタグは?"
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
HTTP ベースの MCP クライアント向けに、サーバーを Docker コンテナとして実行します:
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 サーバーと通信し、サーバーが認証済みの API 呼び出しを 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 でサーバーが接続しない
- 設定ファイルのパスがご利用の OS に対して正しいことを確認します。
- 設定を編集した後に Claude Desktop を再起動したことを確認します。
npxがシステムの PATH で利用可能であることを確認します。
認証エラー(401) API キーが無効または期限切れの可能性があります。Custify の設定 > 開発者 > API アクセスから新しいキーを生成してください。
権限エラー(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
- リポジトリをフォークします
- フィーチャーブランチを作成します:
git checkout -b feature/my-feature - 変更を加え、テストを追加します
- テストスイートを実行します:
npm test - プルリクエストを送信します
大幅な変更を計画している場合は、まず issue を開いてください。
📄 ライセンス
MIT - 詳細は LICENSE を参照してください。
代替品








VIP会員