+ 作るログイン
図を読み込んでいます…
1 / 7
MCP入門 ― AIに道具を持たせる共通の作法 / 全6章

登場人物と、やりとりの形 ― ホスト・クライアント・サーバー

発行
アニメモ公式
版
第1版
改訂
コマ
全7

MCPには3人しか登場しません。誰が誰を起動し、どんな形のメッセージが流れるのか。2026-07-28版で「握手」が無くなり、毎回のリクエストが自己完結するようになった点まで追います。

登場人物は3人しかいない

ホスト(MCP Host) は、あなたが触っているAIアプリそのものです。エディタの拡張機能でも、チャットのデスクトップアプリでも構いません。モデルとの会話を持ち、道具を使うかどうかを最終的に組み立てる側です。

クライアント(MCP Client) は、ホストの中にある部品です。サーバー1つと繋がって、道具の一覧を取りに行ったり、呼び出しを送ったりします。利用者が意識することはまずありません。

サーバー(MCP Server) は、道具を持っている側のプログラムです。ファイルを読む、課題を検索する、社内検索を叩く——そういう仕事を「呼べる形」にして並べておきます。

名前に惑わされないでください。サーバーは遠くにあるとは限りません。手元のパソコンで子プロセスとして動くものも、立派なMCPサーバーです。アーキテクチャ概要

  • 02 / MCP GUIDE
  • 1 / 7
  • 登場人物は3人しかいない
  • ホスト(AIアプリ)
  • MCPサーバー A
  • MCPクライアント 1
  • 手元のファイル(stdio)
  • MCPクライアント 2
  • MCPサーバー B
  • 課題管理(stdio)
  • MCPクライアント 3
  • MCPサーバー C
  • 社内検索(HTTP・遠く)
  • ホストが器、クライアントが受話器、サーバーが道具を持つ側。

つなぐ相手1つにつき、クライアントを1つ作る

ここは最初に引っかかるところです。ホストは1つですが、クライアントはサーバーの数だけ作られます。ファイル用のサーバーに繋いだらクライアントが1つ、課題管理のサーバーにも繋いだらもう1つ増えます。

なぜ1つにまとめないのか。接続ごとに、話す相手も、使える機能も、資格情報も違うからです。1本の接続に混ぜると、どのサーバーが何を許されているのかが追えなくなります。

向きにも決まりがあります。サーバーからクライアントへリクエストを投げることはできません。リクエストを出すのは常にクライアント側で、サーバーが返すのは応答と通知だけです。サーバーが利用者に何か尋ねたいときは、応答の中で「入力が要る」と伝える形を使います。

手元で動くサーバーは普通1つのクライアントだけを相手にし、遠くのサーバーは多数のクライアントを相手にします。

  • 02 / MCP GUIDE
  • 2 / 7
  • つなぐ相手1つにつき、クライアントを1つ作る
  • ホスト(AIアプリ)
  • MCPサーバー A
  • MCPクライアント 1
  • 手元のファイル(stdio)
  • MCPクライアント 2
  • MCPサーバー B
  • 課題管理(stdio)
  • MCPクライアント 3
  • MCPサーバー C
  • つなぐ相手1つにつき、クライアントを1つ
  • 社内検索(HTTP・遠く)
  • 接続は1対1。3つのサーバーに繋ぐなら、クライアントは3つ。

MCPは2つの層でできている

MCPを読むときは、2つの層に分けて考えると一気に楽になります。

データ層(内側) は「何を話すか」です。道具の一覧の尋ね方、呼び出し方、結果の形。JSON-RPC 2.0 というルールに沿ったメッセージの中身が、ここに当たります。

トランスポート層(外側) は「どう届けるか」です。標準入出力で流すのか、HTTPで送るのか。接続の張り方、メッセージの区切り方、認証の載せ方が、ここに当たります。

大事なのは、内側は外側に影響されないことです。手元のプロセスで話していても、遠くのHTTPサーバーと話していても、tools/call の形はまったく同じです。だから運び方だけを後から差し替えられます。

仕様を読むときは「これはどっちの層の話か」を毎回問いましょう。混ざると理解が止まります。

  • 02 / MCP GUIDE
  • 3 / 7
  • MCPは2つの層でできている
  • ホスト(AIアプリ)
  • トランスポート層(外側)
  • MCPサーバー
  • MCPクライアント
  • データ層 (内側)
  • 道具を持っている側
  • 内側が「何を話すか」、外側が「どう届けるか」。

データ層は JSON-RPC 2.0 で話す

やりとりの形は、JSON-RPC 2.0 という既存の決まりをそのまま使っています。新しい独自フォーマットを発明していない、というのが地味に効いています。

覚えることは3つだけです。

- リクエスト:method と params を送り、id を付ける
- レスポンス:同じ id を付けて result か error を返す
- 通知(notification):id が無いもの。返事は来ないし、期待もしない

id が対応付けの鍵です。複数の呼び出しが同時に飛んでいても、id があるのでどの応答がどの依頼のものか分かります。

メッセージは UTF-8 で符号化しなければならないと決まっています。向きの制限もここに効きます。クライアントが送るのはリクエストと通知、サーバーが送るのは応答と通知です。

  • 02 / MCP GUIDE
  • 4 / 7
  • データ層は JSON-RPC 2.0 で話す
  • ホスト(AIアプリ)
  • トランスポート層(外側)
  • MCPサーバー
  • MCPクライアント
  • データ層 (内側)
  • 道具を持っている側
  • {"jsonrpc":"2.0","id":2,"method":"tools/list"}
  • → 応答は同じ id で返る。id の無いものが「通知」
  • id 付きのリクエストと、それに対応する応答。通知には id が無い。

毎回のリクエストが、それだけで完結している

ここが 2026-07-28 版でいちばん変わったところです。MCPは状態を持たないプロトコルになりました。

どういうことか。リクエストの _meta に、次の情報が毎回入ります。

フィールド中身
io.modelcontextprotocol/protocolVersionこのリクエストで話している版
io.modelcontextprotocol/clientCapabilitiesクライアントができること
io.modelcontextprotocol/clientInfo名乗り(設定で止めていなければ付ける)

つまりサーバーは、前のリクエストを何も覚えていなくても、1通を見るだけで処理できます。

これは運用上かなり効きます。サーバーを複数台に並べても、どの台に届いても同じように処理できる。プロセスが再起動しても、クライアントは同じリクエストを投げ直すだけで済む。「接続が生きているか」を気にする設計が要らなくなります。

古い版を知っている人へ。以前は接続ごとにセッションがありました。いまは無い、と読み替えてください。

  • 02 / MCP GUIDE
  • 5 / 7
  • 毎回のリクエストが、それだけで完結している
  • ホスト(AIアプリ)
  • トランスポート層(外側)
  • MCPサーバー
  • MCPクライアント
  • データ層 (内側)
  • 道具を持っている側
  • {"jsonrpc":"2.0","id":2,"method":"tools/list","params":{...}}
  • "_meta": { protocolVersion, clientCapabilities, clientInfo }
  • 版も能力も、リクエストごとに `_meta` で運ぶ。サーバーは前回を覚えない。

何ができるかは、尋ねれば分かる

相手が何をできるのかを知る入り口が server/discover です。すべてのサーバーが実装しなければならないリクエストで、返ってくるのはこんな内容です。

- supportedVersions — 受け付けられる版の一覧
- capabilities — 使えるもの(tools / resources / prompts と、変更通知に対応するか)
- serverInfo — 名前と版
- ttlMs / cacheScope — この答えをどれだけ使い回してよいか

面白いのは、呼ぶ側に義務が無いことです。どのリクエストにも版と能力が載っているので、いきなり tools/list を投げて、版が合わなければエラーで教えてもらう、という進め方もできます。server/discover は「1回でまとめて聞ける便利な入り口」という位置づけです。

答えはキャッシュできます。ttlMs が5分なら5分は聞き直さなくてよい、という意味です。毎回の問い合わせを減らせます。

  • 02 / MCP GUIDE
  • 6 / 7
  • 何ができるかは、尋ねれば分かる
  • ホスト(AIアプリ)
  • トランスポート層(外側)
  • MCPサーバー
  • MCPクライアント
  • データ層 (内側)
  • 道具を持っている側
  • → {"method":"server/discover"}
  • ← supportedVersions / capabilities / serverInfo / ttlMs
  • server/discover は全サーバーが実装する。ただし呼ぶかどうかは任意。

確認:繋いだら、まず握手が要る?

答えはいいえです。2026-07-28 版では、接続してまず initialize を送る、という手順はありません。いきなり tools/list を投げて構いません。

ただし、古いサーバーはまだ握手を必要とします。両方に対応したいクライアントは、まず server/discover を投げて、返り方で世代を見分けます。

返ってきたもの判断
DiscoverResult新しい世代。supportedVersions から版を選ぶ
版が合わないというエラー新しい世代。示された版で話し直す
それ以外のエラー・無応答旧世代。initialize へ切り替える

特定のエラーコードだけを見て判断してはいけません。旧世代のサーバーが何を返すかは実装任せで、-32601 のこともあれば、何も返ってこないこともあります。

次の章では、繋いだ先に何が並んでいるのかを見ます。

  • 02 / MCP GUIDE
  • 7 / 7
  • 確認:繋いだら、まず握手が要る?
  • ホスト(AIアプリ)
  • トランスポート層(外側)
  • MCPサーバー
  • MCPクライアント
  • データ層 (内側)
  • 道具を持っている側
  • initialize → initialized(旧世代の握手)
  • いまは毎リクエストが自己完結。server/discover は任意
  • いまの版では要らない。握手は旧世代の形。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]