A
AIエージェントの仕組み
ch7-s2 · MCP Protocol

MCP のプロトコル

約 14 分

この回のゴール

1. MCP の通信方式の全体像

┌─────────┐                    ┌──────────┐
│ Client  │ ◀── JSON-RPC 2.0──▶│  Server  │
└─────────┘    (transport)     └──────────┘
                   │
                   │  transport は選べる:
                   ├── stdio     (標準入出力)
                   ├── HTTP + SSE
                   └── WebSocket (草案中)

JSON-RPC 2.0 とは?

2. JSON-RPC の 3 種類のメッセージ

(a) Request — 関数を呼び出す

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_handbook",
    "arguments": {"query": "有給は何日"}
  }
}

(b) Response — 結果を返す

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [{"type": "text", "text": "勤続 5 年で 25 日..."}]
  }
}

または、エラー:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {"code": -32602, "message": "Invalid params"}
}

(c) Notification — 応答不要の通知

{
  "jsonrpc": "2.0",
  "method": "notifications/progress",
  "params": {"progress": 0.5}
}

id がないのが特徴。進捗通知や状態変化に使う。

3. MCP の主要メソッド

初期化

client → server: initialize
  params: {protocolVersion, capabilities, clientInfo}
server → client: result
  result: {protocolVersion, capabilities, serverInfo}

client → server: notifications/initialized  (完了通知)

Tools

client → server: tools/list             (利用可能なツール一覧を要求)
server → client: result: {tools: [...]}

client → server: tools/call
  params: {name: "...", arguments: {...}}
server → client: result: {content: [...]}

Resources

client → server: resources/list
server → client: result: {resources: [{uri, name, ...}]}

client → server: resources/read
  params: {uri: "..."}
server → client: result: {contents: [{uri, mimeType, text}]}

Prompts

client → server: prompts/list
server → client: result: {prompts: [...]}

client → server: prompts/get
  params: {name: "...", arguments: {...}}
server → client: result: {messages: [...]}

4. Transport: stdio vs HTTP+SSE

stdio (標準入出力)

[Client Process] ──stdin──▶ [Server Process]
                  stdout ◀──

HTTP + SSE (Server-Sent Events)

[Client] ──HTTP POST──▶ [Server]
         ◀──SSE stream─

どう使い分ける?

場面 推奨トランスポート
自作ツール、ローカル開発 stdio
Claude Desktop と連携 stdio
リモート/クラウドサーバー HTTP+SSE
マルチユーザー SaaS HTTP+SSE

5. 完全な 1 往復の例

ユーザー: 「有給何日?」

Step 1: ツール一覧取得(初回のみ)

 {"jsonrpc":"2.0","id":1,"method":"tools/list"}
 {"jsonrpc":"2.0","id":1,"result":{"tools":[
    {"name":"search_handbook","description":"...",
     "inputSchema":{"type":"object","properties":{...}}}
  ]}}

Step 2: LLM がツール選択(ここは Claude API 経由)

Claude API に tools を渡して呼び出し → Claude が search_handbook を選択。

Step 3: ツール実行

 {"jsonrpc":"2.0","id":2,"method":"tools/call",
   "params":{"name":"search_handbook","arguments":{"query":"有給"}}}
 {"jsonrpc":"2.0","id":2,"result":{"content":[
    {"type":"text","text":"勤続 5 年で 25 日..."}
  ]}}

Step 4: 結果を LLM に戻す

tool_result として Claude API に返す → Claude が最終回答を生成。

6. 実は第 6 章と構造は同じ

第 6 章で作った search_handbook ツールと、MCP の search_handbook は:

違うのは「誰が呼ぶか」と「どう通信するか」だけ:

項目 第 6 章 (直接) MCP
誰が定義 あなたの app.py MCP サーバー作者
誰が呼ぶ あなたの app.py Claude Desktop 等のクライアント
通信 Python 関数呼び出し JSON-RPC over stdio/HTTP
再利用 そのアプリ内だけ 全ての MCP クライアント

まとめ

この回の限界(次への動機)

プロトコルはわかった。でも、実際にサーバーを書く にはどうすれば? Python の公式 SDK はどんな API? 👉 次回「最小 MCP サーバー」で、FastMCP デコレータでサーバーを 30 行で書きます。

参考文献

📝 理解度クイズ (3 問) 💡 ログインすると進捗が保存されます

💬 このサブステップの Q&A

まだ質問はありません。最初の質問を投稿してみましょう。

質問の投稿にはログインが必要です。