CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-05-20上級

Claude Agent SDK で複数 MCP サーバを束ねるときのツール名衝突 — 名前空間と動的調停の設計

GitHub MCP と Linear MCP の create_issue が同居したとき、Sonnet 4.6 はどちらを呼ぶか分かりません。複数 MCP を束ねる Claude Agent SDK アプリで踏むツール名衝突の構造と、TypeScript で書ける Reconciler の実装、本番で踏んだ失敗パターンまでをまとめます。

Claude Agent SDK13MCP45TypeScript24本番運用36名前空間

プレミアム記事

GitHub MCP と Linear MCP を同じ Claude Agent SDK アプリに束ねた日、Sonnet 4.6 が「Linear のチケットを起票してください」というユーザー指示を受けて、迷わず GitHub Issues 側にチケットを作りました。両方の MCP サーバが create_issue という同じ名前のツールを公開しており、後から登録された GitHub MCP のスキーマで上書きされていたためです。原因が分かったのは、SDK のデバッグログにツール一覧をダンプしてからでした。

個人開発で 6 つのサイトを並行運営している立場から見ると、こうしたツール名の衝突は珍しい事故ではありません。私は 2014年からアプリを作り続けてきて、累計 5,000万 DL を超えるまでさまざまな外部 API を組み合わせてきましたが、MCP の世界に入ってからは「同じ意味の動詞」が複数のサーバで重なる頻度が体感で 3 倍ほどに増えました。今回は、その衝突を防ぐ名前空間の設計と、TypeScript で書ける動的調停(Reconciler)の実装を、自分が踏んだ失敗込みで整理します。

ツール名衝突が起きる構造を分解する

Claude Agent SDK は MCP サーバから取得したツール一覧をそのまま tools 配列に渡すだけで、衝突検出を呼び出し側に委ねています。Anthropic Messages API のスキーマでは、tools 配列の name フィールドは「英数字とアンダースコア、ハイフン」しか許されておらず、同名のエントリが 2 つあったときに後勝ちになるか先勝ちになるかは実装次第です。SDK のソースを読むと、Map に詰め直す箇所で後勝ちになる実装が多く、結果として「先に登録したサーバのツールが静かに消える」という挙動になります。

モデル側から見れば、ツールは「name」「description」「input_schema」の 3 点でしか区別できません。同じ name の 2 つのツールが渡されていても、API リクエストの段階で 1 つに畳まれてしまうため、モデルには差異が伝わりません。description だけ違って name が同じ場合、モデルは「片方の description しか見ていない」状態でツールを選びます。これが先ほど GitHub に Linear のチケットが作られた事故の根本原因でした。

衝突の典型例は次のような並びです。

動詞候補となる MCP サーバ
create_issueGitHub MCP / Linear MCP / Jira MCP
searchNotion MCP / Slack MCP / Web Search MCP
uploadS3 MCP / Cloudflare R2 MCP / Stripe Files MCP
send_messageSlack MCP / Discord MCP / SendGrid MCP

私が運営しているサイト群(Claude Lab / Gemini Lab / Antigravity Lab / Rork Lab / Lacrima / Mystery)では、これらのうち 3 種類以上が同居するセッションが日常的に発生します。AdMob レポートを Slack に通知しつつ、GitHub に修正 PR を立て、Linear のチケットを閉じる、というシナリオは、ツール衝突の温床です。

名前空間の付け方を 3 つの方式で比較する

衝突を解く方法はいくつかありますが、私が試したうえで本番に残したのは「サーバ識別子をプレフィックスとして付ける」アプローチです。検討した 3 案を比較します。

第 1 案は ドット表記 です。github.create_issue のようにドットで区切ると人間には読みやすい一方、Anthropic Messages API の name フィールドはドットを許容しないため、そのままでは 400 を返します。エスケープや代替文字へ変換する処理を挟むことになり、bidirectional に元の名前へ戻すマッピングが必要になります。

第 2 案は スラッシュ表記 ですが、これも name フィールドの制約で使えません。第 1 案と同じ問題に行き着きます。

第 3 案が 二重アンダースコア区切り です。github__create_issue / linear__create_issue のように、サーバ識別子と元のツール名を __ で繋ぎます。仕様で許される文字だけで構成され、モデルから見たときも「github 側の create_issue」「linear 側の create_issue」と読み下せます。私が Sonnet 4.6 と Haiku 4.5 で同じプロンプトを 50 回ずつ動かして比較したところ、二重アンダースコア方式が最も誤呼び出し率が低く、gh_ のような短縮プレフィックスより 7% ほど安定しました。短いプレフィックスは「gh」と「ghp」など別の意味と取り違えるリスクがあり、説明文に頼ることになるため、推奨しません。

実運用では、サーバ識別子をプレフィックスに使う際に次のルールを敷きました。

  1. プレフィックスは英小文字のみ。3〜10 文字に収める
  2. 元のツール名は変更しありません。プレフィックスを足すだけ
  3. 衝突がなければプレフィックスを付けありません。衝突したときだけ全エントリにプレフィックスを足す

3 番目が重要で、無条件にすべてのツール名を書き換えるとモデルが学習している慣用名(web_search 等)を変えてしまい、ツール選択精度が落ちます。衝突したサーバ群だけをスコープにプレフィックスを付けるのが、最もモデルに優しい設計です。

実は計測のセットアップ自体にも一工夫が必要でした。プロンプトを 50 回流すだけでは温度設定でゆらぐ結果が混ざるので、temperature: 0.0 で固定し、同じシステムプロンプトと同じユーザー指示を 50 回投げて誤呼び出し率を見ました。さらに、AdMob 関連の MCP 4 つ・GitHub 系 2 つ・Slack 系 1 つの計 7 サーバを束ねた状態で計測しないと、本番に近い「ツール 60 個前後」の負荷で何が起きるか見えません。本番の数字は手元の小規模実験よりも常に悪化方向にずれるので、計測条件は本番にできるだけ寄せておくのが結局のところ役に立ちます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
GitHub MCP と Linear MCP の create_issue が衝突したときに Sonnet 4.6 が誤呼び出しを起こす実例と、原因が name か description のどちらに偏るかの観測結果
ツール名を二重アンダースコアで前置する Reconciler の TypeScript 実装と、双方向 alias map で元の MCP に呼び出しを逆引きするコード
MCP を動的に追加・削除する MCPManager 設計と、prompt cache に古いツール名が残ることで起きる 400 エラーの回避手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-07-08
MCP コネクタを申請・無人運用に回す前に、各ツールを契約テストで確かめる
手元で動いた MCP コネクタをそのまま無人ジョブに繋ぐと、応答形状の誤読や書き込みの二重発火で静かに壊れます。ツール記述・応答契約・冪等性・レイテンシを機械検証する小さなハーネスの作り方を、実測値とともにまとめました。
API & SDK2026-07-01
Claude API のドキュメント抽出が「自信満々に間違える」とき — 沈黙する誤りを不変条件で捕まえる運用メモ
請求書や契約書の構造化抽出で一番怖いのは、クラッシュではなく「スキーマも通り信頼度も高いのに値だけ間違っている」沈黙の誤りです。不変条件・二段抽出・フィールド単位の誤り率で運用する実装メモを共有します。
API & SDK2026-06-25
前の実行が終わらないうちに次が走り出すとき — リースとフェンシングトークンで定期エージェントの多重起動を抑える
毎日決まった時刻に動く定期エージェントが、前の実行を追い越して二重に走り出す。素朴なロックが破れる瞬間から、リースとフェンシングトークン、上限付きキャッチアップまでを実装込みで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →