2025 年は Agent 元年と呼ばれ、その直前の年の瀬から各メジャープロバイダーから Agent 開発に関する標準化やライブラリの発表が相次いだ。その中でも以下の 3 つは注目を集めた。
- 2024.11.25: MCP by Anthropic
- 2025.03.11: OpenAI Agent SDK by OpenAI
- 2025.04.09: A2A Protocol by Google
まだギリ間に合うタイミングかと思うので、欲張り幕の内弁当としてこららを食してみる 🍱
上記の文章をイメージして、幕の内弁当の画像を作成して
各々を見る前に全体におけるそれぞれの役割や立ち位置を整理する。
レイヤ | 役割 | 例 |
---|---|---|
ツール連携プロトコル | LLM が外部 API や DB、クラウドサービスを「安全に」呼び出すための統一フォーマット | MCP |
エージェント実行基盤 | “どの LLM を使い、どのツールを呼び、結果をどうパースして次のステップへ渡すか” を管理 | OpenAI Agents SDK |
エージェント間通信プロトコル | ベンダー/実装を超えて複数エージェントが協調するための「共通語」 | A2A Protocol |
ライブラリ/FW | 上記プロトコルを実装してワークフローを組みやすくする OSS 群 | LangChain / Autogen / LangGraph / など |
概要
MCP (Model Component Protocol) とは LLM と外部への接続を標準化したプロトコルである。標準化されたプロトコルを利用することで、従来の tool-calling と比較して以下のようなメリットがある。
- 互換性のある pre-built のプラグインのエコシステムの成熟が期待できる。
- LLM プロバイダーやツール間が疎結合となり、柔軟性が増す。
- プロトコルに認証が含まれているため、セキュリティを担保しやすい。
アーキテクチャとしては以下のような構成となっている。
MCP アーキテクチャ
- MCP Hosts: プログラム本体
- MCP Clients: サーバーを 1:1 で接続を行うプロトコルクライアント
- MCP Servers: 特定の能力領域を MCP に則って提供する軽量なプログラム
- Local Data Source: MCP Server がアクセスできるホストマシンのファイルシステム
- Remote Services: MCP Server がアクセスできる外部システム(外部 API など)
Server を作ってみる
上記の tutorial を少し内容を変えながらなぞっていく。最終コードは以下に詳細を参照。
処理内容の詳細説明は公式ドキュメントに譲るが、書いている中でいくつか疑問に思って調べたことを記述する。
Q. 一つの MCP Server に複数のツールを紐付けできる?
@mcp.tool()
async def get_alerts(state: str) -> str:
"""Get weather alerts for a US state.
Args:
state: Two-letter US state code (e.g. CA, NY)
"""
...
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
"""Get weather forecast for a location.
Args:
latitude: Latitude of the location
longitude: Longitude of the location
"""
...
A. できる。MCP Server の定義としては “specific capabilities” とあり、特定の領域範囲を実現するために利用するツールの個数は制限していない。(個別具体のツール実装と特定領域というインターフェイスの分離を行なっている。)
Q. transport="stdio"
とは何か?
if __name__ == "__main__":
mcp.run(transport="stdio")
A. MCP Server を構成する主要コンポーネントである transport layer の種別を表している。
MCP Server を構成する主要コンポーネント
Protocol Layer
- Protocol
- Client
- Server
Transport Layer: クライアント-サーバー間の実際のやり取りを行う。JSON-RPC 2.0 に従う。 - Stdio transport: 標準入出力を利用する。ローカル処理に適する。
- HTTP with SSE transport: サーバーが HTTP POST で送るイベントを利用する。
Message types - Requests: Response を期待する。
- Results: Requests に対する成功の応答。
- Errors: エラー。
- Notifications: 一方通行のメッセージで Response を期待しない。
Client を作ってみる
上記の tutorial で Anthropic を OpenAI (4o-mini) で動かしてみる。実際のコードは以下参照。
Client から MCP Server を利用する手順の概要は以下の通り。
-
MCP Server への接続
-
MCP Server から利用できるツールをリストアップ: MCP でツール定義フォーマットが決まっているため、直接 json を記述したり、
@mcp.tool
デコレーターから自動生成したりする。 -
2.で取得したツールを利用した tool-calling 問い合わせ: 実行に関しても MCP のインターフェイスを利用するため、ツールによって呼び出し方が変わらない。
-
3.での結果を利用してツールを実行する
-
4.の結果をコンテキストとして LLM 問い合わせ
実際のレスポンス
Query: weather in ca
[05/14/25 02:07:54] INFO Processing request of type ListToolsRequest server.py:545
[05/14/25 02:07:59] INFO Processing request of type CallToolRequest server.py:545
[05/14/25 02:08:02] INFO HTTP Request: GET https://api.weather.gov/alerts/active/area/CA "HTTP/1.1 200 _client.py:1740
OK"
Here are the current weather alerts for California:
1. **Wind Advisory**
- **Area**: Indian Wells Valley, Mojave Desert, Mojave Desert Slopes
- **Details**: West winds 25 to 35 mph with gusts up to 50 mph. Impacts include blowing unsecured objects and possibly causing power outages. Highways impacted include SR 14, 58, and 178, as well as U.S. 395. Valid until 2 AM PDT Wednesday.
2. **Air Quality Alert**
- **Area**: Imperial County Southwest, Imperial County West, Imperial Valley
- **Details**: Issued due to harmful levels of particle pollution from windblown dust. Health risks include serious respiratory issues, especially for sensitive groups. Valid until 11 AM PDT Wednesday.
3. **Wind Advisory**
- **Area**: San Luis Obispo County Beaches, Santa Barbara County Central Coast Beaches, Ventura County Beaches
- **Details**: West to northwest winds 15 to 30 mph with gusts up to 45 mph. Impacts include blowing unsecured objects. Valid from noon to 9 PM PDT today.
4. **Wind Advisory**
- **Area**: Western Antelope Valley Foothills, Antelope Valley
- **Details**: West winds 20 to 30 mph with gusts up to 50 mph. Valid until 9 PM PDT today.
5. **Wind Advisory**
- **Area**: Santa Barbara County Southwestern Coast, Santa Ynez Mountains
- **Details**: Northwest winds 25 to 35 mph with gusts up to 50 mph. Valid until 3 AM PDT Wednesday.
6. **Wind Advisory**
- **Area**: San Bernardino County Mountains, Riverside County Mountains, San Diego County Mountains
- **Details**: Southwest to west winds 25 to 35 mph with gusts to 55 mph, isolated gusts to 65 mph. Valid until 5 AM PDT Wednesday.
7. **Wind Advisory**
- **Area**: Salton Sea, Imperial County West
- **Details**: West winds 20 to 30 mph with gusts up to 45 mph. Valid until 2 AM PDT Wednesday.
8. **Air Quality Alert**
- **Area**: Coachella Valley, San Gorgonio Pass Near Banning
- **Details**: Issued due to harmful levels of particle pollution from windblown dust. Started Sunday and valid until 5 AM Wednesday.
Please take necessary precautions if you are in or near the affected areas. For more details, check local weather services.
概要
軽量な LLM Agent 作成フレームワークで以下の 3 コンポーネント(抽象化)から成る。
- Agents: ツール、instruction を与えられた LLM
- Handoffs: 特定のタスクに関して、他のエージェントへの delegate を許可すること
- Guardrails: エージェントへの入力が validation されること
これらに加え、tracing 機能も標準で付いている。tracing 機能の重要性に関しては以下で確認済み。
MCP を使ってみる
先ほど作成した weather.py
MCP Server を用いて、天気予報を行う Agent を作成する。
実際のレスポンス
❯ uv run agent.py 五大湖周辺の天気は?
[05/15/25 00:09:41] INFO Processing request of type ListToolsRequest server.py:545
[05/15/25 00:09:49] INFO Processing request of type CallToolRequest server.py:545
[05/15/25 00:09:50] INFO HTTP Request: GET https://api.weather.gov/points/45.0,-85.0 "HTTP/1.1 301 Moved Permanently" _client.py:1740
[05/15/25 00:09:55] INFO Processing request of type CallToolRequest server.py:545
INFO HTTP Request: GET https://api.weather.gov/points/46.79,-92.1 "HTTP/1.1 200 OK" _client.py:1740
INFO HTTP Request: GET https://api.weather.gov/gridpoints/DLH/91,69/forecast "HTTP/1.1 200 OK" _client.py:1740
[05/15/25 00:09:58] INFO Processing request of type CallToolRequest server.py:545
INFO HTTP Request: GET https://api.weather.gov/points/41.8781,-87.6298 "HTTP/1.1 200 OK" _client.py:1740
INFO HTTP Request: GET https://api.weather.gov/gridpoints/LOT/76,73/forecast "HTTP/1.1 200 OK" _client.py:1740
[05/15/25 00:10:00] INFO Processing request of type CallToolRequest server.py:545
INFO HTTP Request: GET https://api.weather.gov/points/42.8864,-78.8784 "HTTP/1.1 200 OK" _client.py:1740
[05/15/25 00:10:01] INFO HTTP Request: GET https://api.weather.gov/gridpoints/BUF/36,47/forecast "HTTP/1.1 200 OK" _client.py:1740
以下は五大湖周辺の代表的な3地点(北端のスペリオル湖域、ミシガン湖域、エリー/オンタリオ湖域)の今日以降の天気予報です。
1)ダルース(ミネソタ州/スペリオル湖近郊)
- 今日(昼間):最高気温66°F(約19℃)、東風5~10mph、11~16時は雨シャワーまたは雷雨の可能性30%、概ね晴れのち曇り
- 今夜:最低49°F(約9℃)、北東風10mph、雷雨の可能性30%、曇り
- 木曜:最高62°F(約17℃)、東風10~20mph、雨シャワーや雷雨80%、曇り
- 木曜夜:最低48°F(約9℃)、南東風10~15mph、雷雨80%、曇り
- 金曜:最高56°F(約13℃)、南風15mph、雨シャワー80%、曇り
2)シカゴ(イリノイ州/ミシガン湖南西岸)
- 今日:最高63°F(約17℃)、東北東風5~10mph、部分的に晴れ、霧の可能性
- 今夜:最低54°F(約12℃)、東風5~10mph、ほぼ曇り、霧
- 木曜:最高87°F(約31℃)、南東風5~20mph、午前は霧、のち40%でシャワーや雷雨、部分的に晴れ
- 木曜夜:最低63°F(約17℃)、南西風10~20mph、雷雨40%、部分的に晴れ
- 金曜:最高86°F(約30℃)、南西風15~25mph、午後から雨の可能性20%、晴れ
3)バッファロー(ニューヨーク州/エリー湖東岸・オンタリオ湖域)
- 今日:最高71°F(約22℃)、南東風10mph、午前に雨シャワー20%、曇りのち概ね曇り
- 今夜:最低58°F(約14℃)、南東風5~9mph、曇り
- 木曜:最高74°F(約24℃)、南風6mph、11~14時に雨シャワー40%、部分的に晴れ
- 木曜夜:最低62°F(約17℃)、南東風2~6mph、雨シャワー50%、部分的に晴れ
- 金曜:最高70°F(約21℃)、南西風6~10mph、午前に雷雨50%、部分的に晴れ
※上記は五大湖周辺の一部代表地点での予報です。ほかの湖岸や特定の都市・州別の詳細が必要であれば、お知らせください。
tracing 機能を ON にしておけば https://platform.openai.com/traces で途中結果や結果詳細を確認することができる。
Trace 結果
処理全体
tool calling の結果
tool の実行結果
最終結果生成
概要
Agent2Agent (A2A) は HTTP, SSE, JSON-RPC といった標準技術を利用した、異なるベンダー・システム間でも行える通信プロトコル。単一 Agent がツールとの接続を行う MCP に対して、A2A は動的・マルチモーダルなコミュニケーションを Agent 同士で実現することで、MCP を補完する。
A2A と MCP は補完関係にある
複数 Agent をオーケストレーションしてみる
長くなったのでまた更新します。
Views: 0