「ちゃんとコードを書いたのに、AIが全然違うツールを呼んでいる…」そんな経験、ありませんか? 実はこれ、コードのバグじゃないんですよね。🤔
最近、海外のエンジニアが作った routeproof というツールが話題になっています。MCPサーバーのツールルーティング問題を可視化する小さなツールなのですが、これが意外と深い問題を浮き彫りにしてくれます。今回はその仕組みと、なぜ「ツールの説明文」がこんなにも重要なのかを一緒に見ていきましょう!
🤖 MCPサーバーって何をしているの?

まず前提として、MCP(Model Context Protocol)サーバーとは、AIホスト(ChatGPTやClaudeなど)が外部の機能を呼び出すための仕組みです。イメージとしては「AIが使える道具箱」みたいなものですね。
ここで重要なポイントがあります。AIがどのツールを呼ぶか判断するとき、モデルが見ているのは次の3つだけです。
- ✅ ツールの名前(name)
- ✅ ツールの説明文(description)
- ✅ ツールの入力スキーマ(input schema)
コードの中身は一切見えません。つまり、説明文が曖昧だったり、2つのツールの説明が似ていたりすると、AIは静かに「間違ったツール」を選んでしまうんです。😱
😈 「ツール泥棒」問題とは?
routeproofの作者が発見したのが、まさにこの「ツール泥棒」現象です。
あるツールの説明文が他のツールのユースケースを包含してしまっていると、1つのツールが他の2つのツールの仕事を横取りしてしまいます。ユニットテストはすべてパスするのに、実際のAIの動きはバグっている、という厄介な状態です。
具体的にどういう状況か、コード例で見てみましょう。
# ❌ 説明が曖昧で「泥棒」になりやすい例
tools = [
{
"name": "get_data",
# 広すぎる説明 → 何でも引き受けてしまう
"description": "データを取得する",
},
{
"name": "get_user_profile",
# 上のツールと競合してしまう
"description": "ユーザーデータを取得する",
},
{
"name": "get_sales_report",
# こちらも同様に競合
"description": "売上データを取得する",
},
]
# ✅ 改善後:説明をユニークかつ具体的に
tools = [
{
"name": "get_user_profile",
# 対象・目的・返却値を明示する
"description": "ユーザーIDを受け取り、名前・メール・登録日を返す。ユーザー情報の参照専用。",
},
{
"name": "get_sales_report",
"description": "期間を受け取り、売上集計レポートをCSV形式で返す。売上分析専用。",
},
]
ポイントをまとめるとこんな感じです👇
- 説明文には「何を受け取り、何を返すか」を必ず書く
- 「専用」「のみ」など使用場面を限定する言葉を入れると競合しにくくなる
- 似た機能のツールは、説明文で明確に差別化する
🔍 routeproofでどう確認するの?
routeproofは、自分で作っていないMCPサーバーに向けてもテストを実行できるのが面白いところです。「このサーバーのツール定義、本当に正しくルーティングされてる?」を数値で確認できます。
コードの品質チェックをCIに組み込むのと同じように、ツールの説明文の品質チェックも自動化できる時代になってきたんですよね。これはAI活用が本格化する中で、見落とされがちだけどすごく重要な視点だと思います。
まとめ
今回のポイントをおさらいします。
- AIがツールを選ぶ根拠は名前・説明文・スキーマだけ
- 説明が曖昧・重複していると「ツール泥棒」が発生する
- ユニットテストをパスしていてもルーティングはバグっている可能性がある
- routeproofのようなツールで説明文の品質を可視化・テストできる
MCPサーバーを作っている方は、ぜひ自分のツール定義を見直してみてください! 「書いたコードは正しいのにAIの動きがおかしい」と感じたとき、原因は説明文にあるかもしれませんよ。一緒に学んでいきましょう 🚀





