VPoTの岩本 (iwamot) です。*1
昨日の水本さんの記事を読み、AIの登場による変化を前向きにとらえる姿勢が重要だと感じました。登場前に戻ることはもうできないですものね。
今日のぼくの記事では、AIエージェントを「使う」ではなく「作る」視点での「AIエージェント活用」を取り上げます。AIエージェントの実装に興味のある方の参考になれば幸いです。
フォーカスするのは「AIエージェントからMCPツールの情報をどのようにLLMに渡すか」についてです。MCPツールの情報を渡さなければ、LLMはツールが呼び出せる(AIエージェントに呼び出しを依頼できる)ことを知らないまま回答してしまいます。
以下、ご自身がAIエージェント(例:Cline、Claude Code)やAIエージェントSDK(例:Strands Agents、OpenAI Agents SDK)を実装するとしたらどうするか考えながらご覧ください。
MCPツールをLLMに渡す2つの方法
MCPツールの情報をLLMに渡す方法には、主に2つのアプローチがあります。
- システムプロンプトにツール情報を埋め込む方式(以下、システムプロンプト方式)
- LLMのネイティブなTool Use機能を利用する方式(以下、Tool Use方式)
2つ目の「LLMのネイティブなTool Use機能」が分かりづらいかもしれませんが、OpenAIでいうFunction Calling機能のことです。ユーザー側で定義したツールの情報を tools などのパラメーターでLLMに渡せる仕組みですね。
ぼくの開発しているAI Slack bot「Collmbo」では、そちらのTool Use機能をMCPツール情報の連携手段として採用しました。一方、システムプロンプト方式を採用しているAIエージェントもあります。
それぞれのアプローチについて、メリット・デメリットを含めて見ていきましょう。
システムプロンプト方式
1つ目のアプローチは、システムプロンプトにツール情報を埋め込む方式です。この方式を使っているAIエージェントの例に、Clineがあります。
Clineの実装(2025-07-09現在)
- https://github.com/cline/cline/blob/main/src/core/prompts/system.ts
- MCPツールの情報(名前、概要、入力JSONスキーマ)をシステムプロンプトに追加
- ツール呼び出し要求はXML形式で応答に含めるようシステムプロンプトで指示(
<use_mcp_tool>タグを使用)
- https://github.com/cline/cline/blob/main/src/core/assistant-message/parse-assistant-message.ts
- LLMからの応答をパーサーで解析
Clineによる実際の指示の一部
## Example 5: Requesting to use an MCP tool
<use_mcp_tool>
<server_name>weather-server</server_name>
<tool_name>get_forecast</tool_name>
<arguments>
{
"city": "San Francisco",
"days": 5
}
</arguments>
</use_mcp_tool>
(ツール呼び出し要求をXML形式で応答に含めるよう指示している)
システムプロンプト方式のメリット
- Tool Use非対応のLLMでも利用可能
- LLMごとのAPIの違いに影響されない
システムプロンプト方式のデメリット
- 正確な応答を促すためのプロンプトエンジニアリングが必要
- トークンの消費が多い(ツールの利用方法をプロンプトに含めるため)
- XMLをパースする実装が必要
Tool Use方式
2つ目のアプローチは、MCPツールの情報をLLMのネイティブなTool Use機能で渡す方式です。この方式を使っているAIエージェントの例に、Strands Agentsがあります。
Strands Agentsの実装(2025-07-09現在)
- https://github.com/strands-agents/sdk-python/blob/main/src/strands/models/anthropic.py
- AnthropicのLLM向けに、MCPツール情報をTool Use形式に変換(
format_requestメソッド)
- AnthropicのLLM向けに、MCPツール情報をTool Use形式に変換(
- https://github.com/strands-agents/sdk-python/tree/main/src/strands/models
- Anthropic以外のLLMも、個別のモジュールで変換
Strands Agentsのコードの一部
"tools": [ { "name": tool_spec["name"], "description": tool_spec["description"], "input_schema": tool_spec["inputSchema"]["json"], } for tool_spec in tool_specs or [] ],
(MCPツール情報をTool Use形式に変換している)
Tool Use方式のメリット
- システムプロンプト方式にくらべ、トークンの消費が少ない
- パーサーの実装が不要
Tool Use方式のデメリット
- Tool Use対応のLLMのみ利用可能
- LLMごとにAPI仕様に合わせたTool Use形式への変換処理が必要
選択指針
どちらの方式を選ぶべきかは、AIエージェントの要件によって決まります。
システムプロンプト方式を選択すべき場合
- Tool Use非対応のLLMもサポートする
Tool Use方式を選択すべき場合
- Tool Use対応のLLMのみサポートする
- トークン効率を重視する
まとめ
MCPツールの情報をLLMに渡す方法には、システムプロンプト方式とTool Use方式の2つがあります。AIエージェントの要件に応じて適切に選びましょう。
| 項目 | システムプロンプト方式 | Tool Use方式 |
|---|---|---|
| 対応モデル | 汎用的 | 限定的 |
| トークン効率 | 低い | 高い |
ただしTool Use方式の場合でも、MCPを使わない場合にくらべればトークンの消費が増えます。プロンプトキャッシュを活用し、トークン消費を抑えるのがおすすめです。
ENECHANGE AIエージェント活用リレーブログ、次回は岡本さんが「エンジニア採用はどこへ向かう?AIエージェント時代の“選ばれる現場”とは」をお届けする予定です。
*1:この記事はAIエージェント活用リレーブログの一環として、Claude Codeを使って書きました。内容は岩本が責任を持ってレビューしています。