Home Anthropic解説: Code Execution with MCP — プログラマティックツール呼び出しでトークン消費98.7%削減
投稿
キャンセル

✍️ Anthropic解説: Code Execution with MCP — プログラマティックツール呼び出しでトークン消費98.7%削減

本記事は Anthropic Engineering Blog: Code execution with MCP: building more efficient AI agents の解説記事です。

ブログ概要(Summary)

Anthropic のエンジニアリングチームは、MCP サーバと連携する LLM エージェントの効率化のために、コード実行によるプログラマティックツール呼び出しパターンを提案している。従来の「1 ツール呼び出し = 1 API ラウンドトリップ」モデルでは、20 以上のツール呼び出しが必要なタスクでは各呼び出しにモデル推論(数百ミリ秒〜数秒)が発生する。コード実行モードでは、LLM が 1 回のレスポンスで TypeScript コードを生成し、そのコード内で複数のツールをプログラマティックに呼び出すことで、推論パスの回数を大幅に削減する。ブログでは Google Drive から Salesforce へのトランスクリプト転送の例で、トークン消費を 150,000 から 2,000 に削減(98.7% 削減)した事例が紹介されている。

この記事は Zenn記事: LangGraph×MCPツール呼び出しレイテンシ最適化:社内検索エージェントの応答を5倍速くする の深掘りです。

情報源

技術的背景(Technical Background)

従来のツール呼び出しモデルの制約

従来の LLM ツール呼び出しは、以下のループで動作する。

1
2
3
4
1. LLM が tool_call を生成
2. ランタイムがツールを実行
3. ツール結果を LLM に返却
4. LLM が次の tool_call を生成(または最終回答を出力)

このモデルでは、$n$ 回のツール呼び出しに $n$ 回の LLM 推論パスが必要となる。各推論パスには最低でも数百ミリ秒のレイテンシが発生するため、ツール呼び出しが多いタスクではレイテンシが線形に増加する。

\[L_{\text{total}} = \sum_{i=1}^{n} (L_{\text{LLM},i} + L_{\text{tool},i})\]

$n = 20$ で $L_{\text{LLM}} = 800\text{ms}$、$L_{\text{tool}} = 200\text{ms}$ の場合、$L_{\text{total}} = 20{,}000\text{ms} = 20$ 秒となる。

コード実行モードの提案

Anthropic が提案するコード実行モードでは、LLM は 1 回の推論で TypeScript コードを生成し、そのコード内で複数のツールを呼び出す。

\[L_{\text{code}} = L_{\text{LLM,generate}} + L_{\text{code\_exec}} + \max_{j=1}^{k} L_{\text{tool},j}\]

ここで $L_{\text{code_exec}}$ はコード実行のオーバーヘッド(通常 10-50ms)であり、ツール呼び出しはコード内でプログラマティックに並列化できる。$n = 20$ のツール呼び出しを 1 回のコード生成で処理すると、推論パスが $n$ 回から 1 回に削減される。

MCPとの統合

Anthropic のブログでは、MCP サーバをコード実行環境から直接呼び出すパターンを提示している。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 従来: 各ツール呼び出しが個別のLLM推論パスを必要とする
// tool_call 1: gdrive.getDocument(...)  → LLM推論
// tool_call 2: salesforce.createNote(...) → LLM推論
// tool_call 3: slack.postMessage(...)     → LLM推論

// コード実行モード: 1回のLLM推論で全ツールを呼び出し
const transcript = (await gdrive.getDocument({documentId})).content;
const note = await salesforce.createNote({
    subject: "Meeting Summary",
    body: summarize(transcript),
});
await slack.postMessage({
    channel: "#team",
    text: `Notes created: ${note.url}`,
});

この例では 3 回の LLM 推論パスが 1 回に削減される。

実装アーキテクチャ(Architecture)

Tool Search による動的ツール発見

Anthropic は Claude API に Tool Search 機能を導入している。これは MCP-Zero (arXiv:2503.23278) と類似のアプローチで、全ツール定義を LLM のコンテキストに含めるのではなく、タスクに応じて必要なツールのみを動的に取得する。

Tool Search の動作フロー:

  1. エージェント起動時に search_tools ツールのみをバインド
  2. タスク実行中、LLM が search_tools を呼び出してツールを発見
  3. 発見されたツールの定義が動的にコンテキストに追加される
  4. LLM がツールを呼び出す

詳細レベル選択:

レベル返却情報トークンコスト
names_onlyツール名一覧低い
basicツール名 + 説明中程度
full_schema完全な JSON Schema高い

エージェントはまず names_only で関連ツールを特定し、必要なツールについてのみ full_schema を取得することで、段階的にコンテキストコストを最小化できる。

ファイルシステムベースのスキル永続化

Anthropic のブログでは、コード実行環境にファイルシステムアクセスを付与し、再利用可能な関数(スキル)を ./skills/ ディレクトリに保存するパターンが紹介されている。

1
2
3
4
./skills/
├── search_confluence.ts    # Confluence検索ラッパー
├── summarize_thread.ts     # Slackスレッド要約
└── format_report.ts        # レポート整形

一度生成されたスキルは後続のタスクで再利用され、LLM の推論負荷を削減する。これは Zenn 記事の「動的ツールローディング」を発展させた概念であり、ツール定義の取得だけでなく使用パターンのキャッシングまで含む。

セキュリティ考慮事項

コード実行環境に MCP サーバへのアクセスを付与する場合、以下のセキュリティ対策がブログで言及されている。

  • PII 自動トークン化: 個人情報を含むデータがコード実行環境内で自動的にトークン化され、LLM のコンテキストに平文で露出しない
  • サンドボックス実行: コードはサンドボックス内で実行され、ファイルシステムアクセスは ./skills/ ディレクトリに制限される
  • 中間結果の保持: ツール実行結果はコード実行環境内に保持され、LLM のコンテキストには要約のみが返却される

パフォーマンス最適化(Performance)

トークン消費の劇的削減

Anthropic のブログで紹介された Google Drive → Salesforce トランスクリプト転送の事例:

方式トークン消費推論パス数
従来のツール呼び出し150,000 tokens20+ 回
コード実行モード2,000 tokens1 回
削減率98.7%95%

Anthropic のブログによると、この削減の主因は以下の 2 点である。

  1. 推論パス削減: 20 回の LLM 推論が 1 回に削減され、各推論のコンテキスト反復コストが排除される
  2. 中間結果のコード内処理: 大きなツール出力(例: ドキュメント全文)がコード変数に保持され、LLM のコンテキストに注入されない

LLMコスト試算

月間 10 万リクエスト、リクエストあたり平均 10 ツール呼び出しの場合:

方式リクエストあたりトークン月間トークン月額コスト (Claude Sonnet)
従来~50,0005B~$15,000
コード実行~5,000500M~$1,500

月額約 $13,500 のコスト削減が見込まれる。ただし、この試算はツール出力のサイズとタスクの複雑さに大きく依存する。

レイテンシ削減効果

推論パス数の削減はレイテンシにも直結する。

\[L_{\text{conventional}} = n \times (L_{\text{prefill}} + L_{\text{decode}} + L_{\text{tool}}) \approx n \times 1{,}200\text{ms}\] \[L_{\text{code\_exec}} = 1 \times (L_{\text{prefill}} + L_{\text{code\_gen}} + L_{\text{exec}}) \approx 2{,}500\text{ms}\]

$n = 10$ の場合、$12{,}000\text{ms} \rightarrow 2{,}500\text{ms}$ で 79% のレイテンシ削減となる。

運用での学び(Production Lessons)

制約事項

Anthropic のブログでは以下の制約が指摘されている。

コード生成の正確性: LLM が生成するコードにバグが含まれる可能性がある。特に複雑な制御フロー(ネストしたループ、例外処理)では生成品質が低下しうる。

デバッグの困難さ: コード実行モードでは中間ステップが不透明になり、従来の「1 ツール = 1 ステップ」のトレーサビリティが失われる。OpenTelemetry による計装が推奨される。

ツールのAPI互換性: コード実行環境からMCPサーバを呼び出す場合、TypeScript/JavaScript のランタイムとMCPクライアントSDKの互換性を確認する必要がある。

適用判断のガイドライン

条件推奨方式
ツール呼び出し 1-3 回従来の tool_call
ツール呼び出し 4+ 回、独立コード実行(並列)
ツール呼び出し間に依存コード実行(直列)
大量のデータ変換コード実行(変数内処理)

学術研究との関連(Academic Connection)

MCP-Zero との関係

Anthropic の Tool Search 機能は、MCP-Zero (arXiv:2503.23278) の Active Tool Discovery と概念的に同一のアプローチである。いずれも全ツール定義のコンテキスト注入を避け、必要なツールのみを動的に取得する。

側面Tool Search (Anthropic)MCP-Zero (論文)
取得方式API ネイティブembedding 検索
対象環境Claude API汎用 LLM
取得粒度段階的(name→schema)固定(top-k)

OctoTools との関係

コード実行モードの並列ツール呼び出しは、OctoTools (arXiv:2502.18145) の DAG 並列実行と同様の効果を達成するが、実現手段が異なる。OctoTools はフレームワーク側で DAG を管理するのに対し、Anthropic のアプローチは LLM 自身がコードで並列性を表現する。

Prefix Sharing との関連

推論パス数の削減は、KV キャッシュの観点でも有利である。Prefix Sharing (arXiv:2408.01812) では、反復される system prompt + tool definitions の KV キャッシュを再利用するが、コード実行モードでは推論パス自体が 1 回なのでキャッシュの必要性が低下する。

まとめと実践への示唆

Anthropic のコード実行 + MCP 統合パターンは、Zenn 記事で紹介した 5 層の最適化戦略に対して6番目のレイヤーとして位置づけられる。特に、ツール呼び出しが 4 回以上のタスクでは、コード実行モードによる推論パス削減がレイテンシとコストの両面で大きな効果をもたらす。

ただし、コード生成の正確性やデバッグの困難さという制約があるため、本番環境への導入にはサンドボックス実行、エラーハンドリング、および OpenTelemetry による計装が不可欠である。

参考文献

この投稿は CC BY 4.0 でライセンスされています。

論文解説: LLMエージェント評価・ベンチマークの包括的サーベイ(KDD 2025)

AWS公式ブログ解説: Amazon MemoryDBによる永続セマンティックキャッシュでLLMワークロードを高速化・コスト削減