Carta CRM に保存されたレポートを実行し、そのデータを表(列はレポート保存時の設定に従う)として表示します。 次のような場合に使用: ユーザーが「レポートを実行して」「〇〇レポートを実行して」「〇〇レポートを見せて」「〇〇レポートを開いて」「どんなレポートがあるか」「レポート一覧を表示して」といった内容や、「/search-reports」コマンドを実行したとき
Runs a saved report in the Carta CRM and renders its rows as a table, using the columns the report saved. Use this skill when the user says things like "run my report", "run the [name] report", "show me the [name] report", "open the [name] report", "what reports do we have", "list reports", or "/search-reports".
_instrumentation_v2 はカルタのスキル利用状況を匿名で記録する機能です。カルタの MCP ツール呼び出し引数には必ず含めてください。プラグインのフック処理が実行時に上書きするため、常に送信しても問題ありません。形式は以下の通りです:
_instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"}
skills はセッション中に累積するリストです。これまで読み込まれたカルタスキルをすべてリストアップします。このツール呼び出しを実行しているスキルだけではなく、すべてです。各エントリを "plugin:skill" の形式で名前空間を付け、古い順に並べ、最も最近使ったスキルを最後に配置してください。カルタスキル(carta-cap-table:*、carta-crm:*、carta-investors:*)のみをリストアップし、カルタ以外のプラグインのスキルは含めません。
surface は実行中のクロード操作環境です。"chat"(claude.ai または Claude アプリ内の通常のチャット、Cowork モードではない)、"cowork"(Cowork モード)、"code-terminal"、"code-desktop"、"excel" のいずれかを指定します。該当する環境がない場合や判別できない場合は、この項目を完全に省略してください。推測や独自の値を作成しないでください。
保存済みレポートは、特定の対象(案件、連絡先、企業、投資家、資金調達、手数料など)に対して保存されたフィルター条件と表示列の組み合わせです。レポートを実行すると、保存された列を使って行がテーブル形式で表示されます。
レポートはキーワード検索の対象ではありません。リストから選択して実行します。そのため第 1 ステップが常に第 2 ステップの前に実行されます。
案件の流れをセクターや情報源、担当者で細かく分析したい場合は、行ごとの詳細ではなく、deal-flow-analytics(案件流動分析)スキルを使用してください。
crm_view_tool ではなく crm_call_tool でリストを読み込んでください。 list_reports には独立した表示画面がなく、このステップはあなた(ユーザーではなく)のためのものです。レポートの実行に必要な id と entityType を取得する必要があります。
crm_call_tool({ "name": "crm:list_reports", "arguments": {} })
ユーザーが対象を指定した場合は entityType を渡してリストを絞り込んでください。指定可能な値は "deal"(案件)、"contact"(連絡先)、"company"(企業)、"investor"(投資家)、"fundraising"(資金調達)、"fees"(手数料)です:
crm_call_tool({ "name": "crm:list_reports", "arguments": { entityType: "deal" } })
その後、結果に応じて以下のように対応してください:
ステップ 1 でマッチしたエントリから id と entityType を使用します。両方ともそのエントリに含まれています。推測してはいけません。
crm_view_tool({
"name": "crm:get_report_data",
"arguments": {
reportId: "<list_reports から取得した id>",
entityType: "<同じエントリから取得した entityType>",
limit: 50
}
})
レポートに保存された列がテーブルのレイアウトを決定します。列のリストを渡してはいけません。また、ユーザーにどの列を表示したいか尋ねてはいけません。レポートがすでにそれを決めています。
ページネーション(複数ページ表示)には offset を使用し、ユーザーがより多くの行を見たいと言った場合は limit を増やしてください。
CRM ビューは組織ごとに有効または無効が設定されます。上記の crm_view_tool 呼び出しが以下のメッセージを返すことがあります:
CRM tool 'get_report_data' has no view — call it with crm_call_tool instead.
これは失敗ではなく、正常な応答です。その組織ではビューが有効になっていません。その呼び出しをそのまま crm_call_tool で再実行し、ステップ 3 のようにテキストで行を表示してください。crm_view_tool を再試行してはいけません。また、ユーザーにこのメッセージを報告してはいけません。
テーブルが表示された場合、ユーザーはすべての行をすでに見ています。行を再度リストアップしたり、テキストで再フォーマットまたは要約したりしてはいけません。テーブルの横で答えが重複してしまいます。ユーザーの質問に応じた内容を述べるか、1 行で簡潔に確認してください。例:「ステージ A の案件を実行: 18 件該当」
count はレポートが検出した総件数で、現在のページの行数より大きい場合があります。その場合、このカウント情報を確認メッセージに含め、ページが全体ではないことを示してください。
crm_call_tool にフォールバックした場合、行を読みやすいテキストテーブルで表示し、レポートの列の順序を保持してください。
レポートが何も検出しなかった場合:
そのレポートに該当するレコードはありません。フィルター条件が予想より厳しい可能性があります。
<!-- 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>
A saved report is a stored filter plus a stored column set over one entity: deals, contacts, companies, investors, fundraisings or fees. Running one renders its rows as a table, using the columns the report saved.
Reports are not searched by keyword. They are listed, chosen, then run — so Step 1 always precedes Step 2.
For an aggregated breakdown of deal flow by sector, source or owner rather than the rows
themselves, use the deal-flow-analytics skill instead.
Read the list through crm_call_tool, never crm_view_tool. list_reports has no view of
its own, and this step is for you rather than the user: you need each report's id and
entityType to run it.
crm_call_tool({ "name": "crm:list_reports", "arguments": {} })
Pass entityType to narrow the list when the user named one — "deal", "contact",
"company", "investor", "fundraising" or "fees":
crm_call_tool({ "name": "crm:list_reports", "arguments": { entityType: "deal" } })
Then branch on what came back:
Use the id and the entityType from the entry you matched in Step 1. Both are on that entry;
never guess either.
crm_view_tool({
"name": "crm:get_report_data",
"arguments": {
reportId: "<id from list_reports>",
entityType: "<entityType from the same entry>",
limit: 50
}
})
The report's own saved columns drive the table. Do not pass a column list, and do not ask the user which columns they want — the report already answers that.
Use offset to paginate, and raise limit when the user asks to see more rows.
CRM views are enabled per organisation. So the crm_view_tool call above may answer with:
CRM tool 'get_report_data' has no view — call it with crm_call_tool instead.
That is a normal response, not a failure — this organisation does not have the view enabled.
Retry that one call verbatim through crm_call_tool and present the rows as text per Step 3.
Do not retry crm_view_tool, and do not report the message to the user.
When the table rendered, the user already sees every row. Do NOT re-list, re-format, or summarise the rows as text — that duplicates the answer beside the table. Say what they asked, or acknowledge in one line, e.g. "Ran Stage A deals: 18 rows match."
count is the total the report matches, which can be larger than the rows on this page. When it
is, say so in that one line rather than implying the page is the whole report.
When you fell back to crm_call_tool, present the rows as a readable text table and keep the
report's column order.
If the report matched nothing:
"That report matched no records. Its filters may be narrower than you expect."
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。