🔥

mcpプロトコル(2025-03-26)に関して

に公開

要点まとめ

(MCPサーバー) -> LLMを利用する際に便利な機能を用意したサーバー
(MCPクライアント) ->MCPサーバーとやり取りする機構(コネクション用)
(MCPホスト) -> (MCPクライアント) を搭載。 LLMとのやりとりもこっち
MCP ->上記のやり取りを担うプロトコル。(トランスポートのレイヤでhttpベースとstdioベースの二種類の実装が想定されている)

プロトコルは少しずつ改良されているので注意

記事記載時点では、プロトコルバージョンは 2025-03-26
https://github.com/modelcontextprotocol/specification/blob/main/docs/specification/versioning.md

過去と現在のバージョン

  • 2024-11-05
  • 2025-03-26

ベースのプロトコル

JSON-RPC message typesをベースとしている。

  • 基本的なJSON-RPCとは異なり、IDはnullであってはならないなど、制約もある.

詳細は下記
https://github.com/modelcontextprotocol/specification/blob/main/docs/specification/2025-03-26/basic/_index.md

メッセージのタイプは三つ

  • request
  • response
  • Notification

リクエスト

{
  jsonrpc: "2.0";
  id: string | number;
  method: string;
  params?: {
    [key: string]: unknown;
  };
}

レスポンスの例

{
  jsonrpc: "2.0";
  id: string | number;
  result?: {
    [key: string]: unknown;
  }
  error?: {
    code: number;
    message: string;
    data?: unknown;
  }
}

クライアントとサーバー接続のライフサイクル

Initialization: プロトコルのバージョン確認等
Operation: 通常のプロトコルのやり取り
Shutdown: 接続を終了させる

↓公式ドキュメントはまだ2024-11-05になってるっぽい...(いつか改修されそう)

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "roots": {
        "listChanged": true
      },
      "sampling": {}
    },
    "clientInfo": {
      "name": "ExampleClient",
      "version": "1.0.0"
    }
  }
}

MCPサーバーが提供するもの

三つの機能を主に提供する。

  • Resources:ユーザーまたはAIモデルが利用するためのコンテキストとデータ
  • Prompts: ユーザー向けのテンプレート化されたメッセージとワークフロー
  • Tools: AIモデルが実行するための関数

標準的なトランスポート実装

MCPには2つの標準的なトランスポート実装が含まれている

  • HTTPベースのトランスポート(Streamable HTTP)(*)
  • STDIOのトランスポート

*HTTP+SSE transportからHTTP-based transportsに定義が置き換わった。
ただ必要に応じてストリーミング通信(SSE)にシームレスに切り替えることが可能な模様
https://github.com/modelcontextprotocol/specification/pull/206/files
https://zenn.dev/ks0318/articles/f92589946cd344

HTTPベースのトランスポートにおける認可フロー

認可はMCP実装において任意

  • PKCE を使用したBasic OAuth 2.1の例

引用:(https://github.com/modelcontextprotocol/specification/blob/main/docs/specification/2025-03-26/basic/authorization.md)

アクセストークンに関して

ヘッダーをつける。

Authorization: Bearer <access-token>
GET /v1/contexts HTTP/1.1
Host: mcp.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

Streamable HTTP

MCP endpoint

MCP endpointを用意する必要がある。

example
https://example.com/mcp

GETメソッドとPOSTメソッドをサポートしておく。

詳細は下記
(https://github.com/modelcontextprotocol/specification/blob/main/docs/specification/2025-03-26/basic/transports.md#streamable-http)

  • クライアントは、MCP endpointに対して、JSON-RPCのHTTP POSTを送信する。
  • サーバーが(JSON-RPCレスポンスまたは通知)の入力を受け付けた場合、HTTPステータスコード「202 Accepted」をbodyなしで返す。
  • サーバーが(JSON-RPC リクエスト)の入力を受け付けた場合、
    • Content-Type: text/event-stream を返して SSE(サーバー送信イベント)ストリーム を開始する
    • Content-Type: application/json を返して 1つのJSONオブジェクト を返す

appendix

mcp client一覧

https://github.com/punkpeye/awesome-mcp-clients?tab=readme-ov-file
上記のリポジトリに色々まとまっている。

Discussion