MCPの3つの欠点 - よりよく使うために知っておきたいこと
MCPは強力で便利なツールですが、他のツールと同様に、設計上の制限と課題があります。これらを理解することで、MCPをより効果的に活用できるようになります。
この記事では、MCPの3つの欠点と、それぞれへの実践的な対策を紹介します。興味深いことに、MCPを発表したAnthropic自身もこれらの課題を認識し、改善に取り組んでいます。
MCPの3つの欠点
1. AIエージェントは必ずしもMCPが得意でない
LLMはコード作成での訓練は豊富ですが、ツール呼び出しの訓練データは非常に限定的です[1]。実際のツール呼び出し例は合成データのみに基づいており、自然言語に存在しない特殊なトークン体系で構成されています。
そのため、LLMはTypeScriptやCLIツールの方が上手く扱えることが多いです。あなたも経験したのではないでしょうか?GitHub MCPよりもghコマンドの方が上手くいくという経験。これは必ずしも実装の問題ではなく、LLMの学習特性による根本的な限界なのです。
2. MCPツールの事前ロードでコンテキストが圧迫される
AIエージェントを使う際、コンテキストウィンドウの制御は性能を大きく左右します。適切な粒度のタスクに対して、必要なコンテキストだけを与えることが重要です。
MCPを使う場合、ほとんどのクライアントはすべてのツール定義を事前にコンテキストへ直接ロードします[2]。これにより、ツールの説明がコンテキストウィンドウのスペースを占有し、応答時間とコストが増加します[3]。
数が少ないツールでも影響はあります。Obsidian MCPを入れたら、指示してないのに勝手にObsidianに保存し始めた経験はありませんか?これはツール定義がコンテキストを支配し、意図しない動作を引き起こしている良い例です。
さらに規模が大きくなると問題は深刻化します。エージェントが数千のツールに接続されている場合、リクエストを読み込む前に数十万トークンの処理が必要になります[4]。この課題に対して、必要なツールのみをオンデマンドで読み込むアプローチが提案されています。これにより、トークン使用量を150,000トークンから2,000トークンへ削減でき、時間とコストが98.7%節約される可能性があります[5]。
**現時点での対策としては、不要なMCPを無闇に有効化しないことが重要です。**本当に必要なツールだけを選択的に有効化することで、ツール定義によるコンテキスト圧迫を軽減でき、意図しない動作のリスクも減らせます。
3. MCPのやり取り情報もコンテキストを圧迫する
さらに厄介なのは、MCPクライアントとエージェント間のやり取り自体がコンテキストを消費するということです。MCPでは、ツール呼び出しとその結果がすべてモデルのコンテキストを通過します[6]。
具体例を挙げます。Google DriveのトランスクリプトをSalesforceに転送するタスクを考えてください。2時間の会議録音を処理する場合、完全なトランスクリプトがツール呼び出しの前後で複数回通過します[7]。結果として、約50,000トークンの追加処理が発生します。
コンテキストが埋まれば、本来のタスク遂行に直接的な悪影響を及ぼします。また、大規模なドキュメントや複雑なデータ構造の場合、データコピー時のエラーも発生しやすくなります[8]。
この課題への対策として、サブエージェントを活用する方法があります。サブエージェントは独立したコンテキストで動作し、MCPツールを選択的に割り当てられます[9]。例えば、Google Drive操作とSalesforce操作をそれぞれ別のサブエージェントに委譲すれば、中間データがメインエージェントのコンテキストを通過せず、トークン消費を大幅に削減できる可能性があります。
まとめ
MCPは便利で強力なツールです。しかし、これらの欠点を理解した上で使う必要があります。
興味深いことに、MCPを発表したAnthropic自身がこれらの課題を認識し、改善策を提案しています。将来的にはツールの進化により、これらの問題を意識せずに使える日が来るかもしれません。
現時点での対策としては:
- 不要なMCPを無闇に有効化しない:本当に必要なツールだけを選択的に有効化することで、コンテキスト圧迫を軽減できます
-
代替手段を検討する:例えば、GitHubの操作は
ghコマンドでも実現できます。MCPで行う必要があるかを考えることが大切です - サブエージェントを活用する:MCPタスクをサブエージェントに委譲することで、コンテキストを分離し、トークン消費を削減できる場合があります
MCPの欠点を理解しておくことは、それをより効果的に活用するための第一歩です。適切な使い方を知ることで、AIエージェントをより効果的に活用できるはずです。
参考
- Cloudflare: Code Mode - MCPの限界を指摘し、コード実行による代替案を提示
- Anthropic: Code Execution with MCP - MCPのコンテキスト課題と設計について詳しく説明
- Claude Code: サブエージェント - MCPタスクをサブエージェントに委譲してコンテキストを分離する方法
-
Cloudflareの記事より:"LLMs have seen a lot of code. They have not seen a lot of 'tool calls.'"(LLMは多くのコードを見てきました。しかし、多くの『ツール呼び出し』は見ていません)出典: Cloudflare: Code Mode ↩︎
-
Anthropicの記事より:"Most MCP clients load all tool definitions upfront directly into context, exposing them to the model using a direct tool-calling syntax."(ほとんどのMCPクライアントは、すべてのツール定義を事前にコンテキストへ直接ロードし、直接的なツール呼び出し構文を使用してモデルに公開します)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"Tool descriptions occupy more context window space, increasing response time and costs."(ツールの説明がコンテキストウィンドウのスペースを占有し、応答時間とコストが増加します)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"In cases where agents are connected to thousands of tools, they'll need to process hundreds of thousands of tokens before reading a request."(エージェントが数千のツールに接続されている場合、リクエストを読む前に数十万トークンを処理する必要があります)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"This reduces the token usage from 150,000 tokens to 2,000 tokens—a time and cost saving of 98.7%."(これにより、トークン使用量が150,000トークンから2,000トークンに削減され、時間とコストが98.7%節約されます)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"Most MCP clients load all tool definitions upfront directly into context, exposing them to the model using a direct tool-calling syntax."(ほとんどのMCPクライアントは、すべてのツール定義を事前にコンテキストに直接ロードし、直接的なツール呼び出し構文を使用してモデルに公開します)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"Every intermediate result must pass through the model. In this example, the full call transcript flows through twice. For a 2-hour sales meeting, that could mean processing an additional 50,000 tokens."(すべての中間結果はモデルを通過しなければなりません。この例では、会議の完全なトランスクリプトが2回流れます。2時間の営業会議の場合、追加で50,000トークンを処理することを意味する可能性があります)出典: Anthropic: Code Execution with MCP ↩︎
-
Anthropicの記事より:"With large documents or complex data structures, models may be more likely to make mistakes when copying data between tool calls."(大規模なドキュメントや複雑なデータ構造の場合、ツール呼び出し間でデータをコピーする際にモデルがエラーを犯す可能性が高くなります)出典: Anthropic: Code Execution with MCP ↩︎
-
Claude Codeドキュメントより:「各サブエージェントは独立したコンテキストで動作し、メイン会話の汚染を防ぎ、高レベルの目標に焦点を当てた状態を保ちます」また「サブエージェントは設定されたMCPサーバーからのMCPツールにアクセスできます」出典: Claude Code: サブエージェント ↩︎
Discussion