Carta CRM(顧客管理システム)から連絡先(人物)のレコードを検索して取得するスキルです。 **次のような場合に使用:** - 「連絡先を探して」 - 「〇〇さんについて詳しく教えて」 - 「〇〇さんの連絡先詳細を表示して」 - 「〇〇という企業の人物を探して」 - 「連絡先を一覧表示して」 - 「IDで連絡先を取得して」 などと言われた場合 ID番号、名前、メールアドレス、職位、所属企業、タグなど、連絡先の詳細情報を返します。 取得した連絡先IDは、「連絡先を更新」スキルで使用することができます。
Searches for and retrieves contact (people) records from the Carta CRM. Use this skill when the user says things like "find a contact", "search contacts", "look up a person", "show me contact details for [name]", "full details on [name]", "tell me about [name]", "get contact by ID", "list contacts", "find people at [company]", "search people", or "/search-contacts". Returns contact details including ID, name, email, title, company, and tags. The contact ID returned can be used with the update-contact skill.
_instrumentation_v2 は、Cartaスキルの利用状況を記録するための匿名テレメトリ(利用データ収集)です。Carta MCPツール呼び出しの引数には必ず含めてください。プラグインのフック処理がこれを上書きするため、常に送信することは安全です。
形式:
_instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"}
skills はセッション全体で蓄積されるもので、今回の呼び出しを起動させたスキルだけでなく、これまで読み込まれたすべてのCartaスキルを列挙してください。各項目を "plugin:skill" の形式で名前空間化し、古いものから順に、最後に最近使用したスキルが来るように並べます。Cartaスキル(carta-cap-table:*、carta-crm:*、carta-investors:*)のみリストアップし、その他のプラグインのスキルは含めないでください。
surface はClaudeを実行しているプラットフォームで、"chat"(claude.aiまたはClaudeアプリ、通常のチャット)、"cowork"(Coworkモード)、"code-terminal"、"code-desktop"、"excel" のいずれかです。該当するものがない場合や判断できない場合は省略してください。推測や造語は避けてください。
Carta CRMで連絡先を検索します。1人の人物が名指しされたリクエストはその人物のカード(詳細情報)を表示し、複数人や集合を求めるリクエストはテーブル(表)を表示します。この区別を最初に判定し、以降のすべての手順を決めます。
詳細表示 — ユーザーが1人の人物を名指しし、その記録を見たい場合。例:「田中花子の詳しい情報」「太郎について教えて」「この連絡先について詳しく知りたい」。→ ステップ2へ進む。
リスト表示 — ユーザーが複数人、フィルタ済みの結果、または複数件の結果を見たい場合。例:「Acme社の人たち」「営業パイプラインの連絡先」「連絡先一覧」。→ ステップ3へ進む。
IDによる検索 — ユーザーが連絡先IDを提供した。→ ステップ2へ進み、名前解決をスキップ。
ユーザーが「検索して」「探して」と言った場合でも、1人の人物が名指しされていれば、それは詳細表示リクエストです。曖昧な場合は、リスト表示として扱い、どう絞り込むかをユーザーに確認してください。
crm_view_tool ではなく crm_call_tool を使って解決してください。 このステップはあなた自身のためのもので、ユーザー向けではありません。ビュー呼び出しは応答内のすべての配列を件数に圧縮してしまい、詳細行(および必要なID)があなたに届かず、ユーザーは頼まれていないリストを見ることになります。
crm_call_tool({
"name": "crm:search_contacts",
"arguments": { query: "<人物の名前>", limit: 10 }
})
その後、返された候補の数で分岐してください:
ちょうど1件一致 → カードを表示して終了:
crm_view_tool({ "name": "crm:fetch_contact_by_id", "arguments": { id: "<id>" } })
複数件一致 → 推測してはいけません。候補をビューで表示し、どれを指しているのかを確認してください:
crm_view_tool({
"name": "crm:search_contacts",
"arguments": { query: "<人物の名前>", limit: 10 }
})
その後、「複数の連絡先が一致します。どちらを指していますか?」と聞いてください。ユーザーが選んだら、fetch_contact_by_id を呼び出します。CRMでは同姓同名は珍しくないため、トップヒットを確認なしに開くと、間違った人物の情報を確信を持って表示することになります。
一致なし → その旨を述べてください。空のビューは表示しません。
ユーザーがIDを直接指定した場合は、解決の必要はなく、呼び出しは1回、表示は1枚です。
1リクエストにつき最大1枚のカードを表示してください。ユーザーが複数の人物を名指しした場合は、複数のビューを重ねるのではなく、どれを開くかを聞いてください。
crm_view_tool({
"name": "crm:search_contacts",
"arguments": {
query: "<検索語>",
limit: 20
}
})
ユーザーが特定のリストやフォルダを名前で言及した場合は、その名前をリストIDに解決してから、検索を絞り込むために list_id を渡してください。このルックアップには独立したビューがないため、crm_call_tool で実行します:
crm_call_tool({ "name": "crm:get_contact_lists", "arguments": {} })
ユーザーがさらに多くの結果を見たいと言った場合は limit を増やしてください。ページネーション(複数ページ閲覧)には offset を使用してください。
CRMのビューは組織ごとに有効/無効が決まり、単一レコードのビューはその上にさらにフラグがあります。したがって、上記の crm_view_tool 呼び出しは以下のメッセージで応答することがあります:
CRM tool 'search_contacts' has no view — call it with crm_call_tool instead.
これは失敗ではなく、通常の応答です。この組織ではそのビューが有効になっていません。その呼び出しを1回だけ crm_call_tool で同じ内容で再試行し、結果をテキストとしてステップ4に従って提示してください。crm_view_tool を再度試さず、ユーザーにメッセージを報告しないでください。
カードビューが利用できない詳細リクエストの場合も、解決方法は同じです。ステップ2の crm_call_tool による解決を続け、選択されたレコードをテキストで提示してください。
カードが表示されたとき、ユーザーはレコード全体を見ています。フィールドを繰り返さないでください。ユーザーの質問に答えるか、1行で確認してください。
テーブルが表示されたとき、ユーザーはすべての行を既に見ています。テキストで再度リスト化、再フォーマット、要約しないでください。表が重複します。代わりに、ユーザーが実際に聞いている質問に答えるか、1行で確認してください。例:「23件の連絡先が見つかりました。IDは最初の列にあり、/update-contact で使用できます」。
crm_call_tool にフォールバックした場合、空でないフィールドをすべて読みやすい要約形式(名前、役職、会社、メール、電話、タグ)で表示し、IDは目立つように表示してください。ユーザーが /update-contact を実行する際に必要です。
fetch_contact_by_id はまた関連する案件(ディール)と注記も返します。ビューはこれらを表示しますが、ユーザーが特定の人物のコンテキストを尋ねている場合はテキストで呼び出してください。
連絡先が見つからない場合:
「お探しの連絡先は見つかりません。別の名前、メール、またはキーワードをお試しください。」
<!-- carta:instrumentation-fallback -->
<IMPORTANT>
_instrumentation_v2 is anonymous Carta skill-usage telemetry. ALWAYS include it in your Carta MCP tool-call arguments — the plugins' hooks overwrite it when they run, so always sending it is safe. Shape:
_instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"}
skills is cumulative for the session: list every Carta skill loaded so far, not only the one driving this call. Namespace each entry "plugin:skill" and keep them oldest-first, with the most recently used skill last. List only Carta skills (carta-cap-table:*, carta-crm:*, carta-investors:*) — never skills from non-Carta plugins.
surface is the Claude surface you are running in: "chat" (claude.ai or the Claude app, i.e. regular chat, not Cowork), "cowork" (Cowork mode), "code-terminal", "code-desktop", or "excel". Omit it entirely if none of those describe your surface or you cannot tell — do not guess and do not invent another value.
</IMPORTANT>
Look up contacts in the Carta CRM. A request about one named person renders that person's card; a request for a set renders a table. Route on that distinction first — it decides every call below.
A named single person is a detail request even when the user says "search" or "find". If it's genuinely unclear, treat it as a list and ask what they want to narrow to.
Resolve through crm_call_tool, never crm_view_tool. This step is for you, not the
user: a view call collapses every array in the response to a count, so the rows — and the
id you need — never reach you, and the user gets a list they did not ask for.
crm_call_tool({
"name": "crm:search_contacts",
"arguments": { query: "<person's name>", limit: 10 }
})
Then branch on how many candidates came back:
crm_view_tool({ "name": "crm:fetch_contact_by_id", "arguments": { id: "<id>" } })
crm_view_tool({
"name": "crm:search_contacts",
"arguments": { query: "<person's name>", limit: 10 }
})
Then ask: "Several contacts match — which one did you mean?" When they pick, call
fetch_contact_by_id for it. Namesakes are common in a CRM, so opening the top hit
unasked shows the wrong person with full confidence.When the user gives an ID outright, there is nothing to resolve — one call, one card.
Render at most one card per request. If the user named several people, ask which to open rather than stacking views.
crm_view_tool({
"name": "crm:search_contacts",
"arguments": {
query: "<search term>",
limit: 20
}
})
If the user mentions a specific list or folder by name, resolve the name to a list ID
first, then pass list_id to narrow the search. This lookup has no view of its own, so
it goes through crm_call_tool:
crm_call_tool({ "name": "crm:get_contact_lists", "arguments": {} })
Increase limit if the user asks to see more results. Use offset to paginate.
CRM views are enabled per organisation, and single-record views behind a second flag on
top of that. So any crm_view_tool call above may answer with:
CRM tool 'search_contacts' has no view — call it with crm_call_tool instead.
That is a normal response, not a failure — this organisation does not have that view
enabled. Retry that one call verbatim through crm_call_tool and present the result as
text per Step 4. Do not retry crm_view_tool, and do not report the message to the
user.
A detail request whose card has no view still resolves the same way: keep the
crm_call_tool resolve from Step 2 and present the chosen record as text.
When a card rendered, the user sees the whole record. Do not restate its fields. Answer what they asked, or acknowledge in one line.
When a table rendered, the user already sees every row. Do NOT re-list, re-format, or
summarise them as text — that duplicates the table. Answer the question they actually
asked, or acknowledge in one line (e.g. "Found 23 contacts — the ID is in the first
column, for /update-contact.").
When you fell back to crm_call_tool, display all non-empty fields in a readable
summary — name, title, company, email, phone, and tags — and show the ID prominently,
since the user needs it to run /update-contact.
fetch_contact_by_id also returns related deals and notes. The view renders those, but
call them out in text if the user is asking for context on a specific person.
If no contacts are found:
"No contacts found matching your search. Try a different name, email, or keyword."
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。