MCP の仕様 (3) - 基本プロトコル - 概要
以下の記事が面白かったので、簡単にまとめました。
前回
1. 基本プロトコルの概要
「MCP」は、連携して動作する複数の主要コンポーネントで構成されています。
・基本プロトコル
コアとなるJSON-RPCメッセージタイプ
・ライフサイクル管理
接続の初期化、機能ネゴシエーション、セッション制御
・承認
HTTPベースのトランスポートのための認証および承認フレームワーク
・サーバ機能
サーバーが公開するリソース、プロンプト、ツール
・クライアント機能
クライアントが提供するサンプリングとルートディレクトリリスト
・ユーティリティ
ログ記録や引数補完などの横断的な関心事
すべての実装は、基本プロトコルとライフサイクル管理コンポーネントをサポートする必要があります。その他のコンポーネントは、アプリケーションの特定のニーズに基づいて実装できます。
これらのプロトコル層は、クライアントとサーバ間の高度なインタラクションを可能にしながら、明確な関心事の分離を確立します。モジュール設計により、実装は必要な機能だけをサポートできます。
2. メッセージ
MCPクライアントとサーバ間のすべてのメッセージは、JSON-RPC 2.0 に準拠する必要があります。このプロトコルでは、以下の種類のメッセージが定義されています。
2-1. Requests
Requests は、操作を開始するためにクライアントからサーバに、またはその逆に送信されます。
{
jsonrpc: "2.0";
id: string | number;
method: string;
params?: {
[key: string]: unknown;
};
}・Requestsには文字列または整数のIDを含める必要があります。
・ベースのJSON-RPCとは異なり、IDはnullであってはなりません。
・リクエストIDは、リクエスト元が同じセッション内で以前に使用してはなりません。
2-2. Responses
Responses はリクエストへの応答として送信され、操作の結果またはエラーが含まれます。
{
jsonrpc: "2.0";
id: string | number;
result?: {
[key: string]: unknown;
}
error?: {
code: number;
message: string;
data?: unknown;
}
}・Responsesには、対応するRequestsと同じIDを含める必要があります。
・Responsesはさらに、成功結果とエラーに分類されます。結果またはエラーのいずれか一方を設定する必要があります。Responsesに両方を設定することはできません。
・結果は任意のJSONオブジェクト構造に従うことができますが、エラーには少なくともエラーコードとメッセージを含める必要があります。
・エラーコードは整数でなければなりません。
2-3. Notifications
Notifications は、クライアントからサーバへ、またはサーバからクライアントへ、一方向のメッセージとして送信されます。受信者は応答を送信してはなりません。
{
jsonrpc: "2.0";
method: string;
params?: {
[key: string]: unknown;
};
}・Notifications には ID を含めることはできません。
4. 認証
「MCP」は、HTTP で使用するための認可フレームワークを提供します。HTTPベースのトランスポートを使用する実装は、この仕様に準拠する必要があります(SHOULD)。一方、STDIO トランスポートを使用する実装は、この仕様に従わず、代わりに環境から資格情報を取得する必要があります(SHOULD)。
さらに、クライアントとサーバは、独自のカスタム認証および認可戦略をネゴシエートできます(MAY)。
5. スキーマ
プロトコルの完全な仕様はTypeScriptスキーマとして定義されています。これは、すべてのプロトコルメッセージと構造の信頼できる情報源です。
また、TypeScriptの信頼できる情報源から自動生成されるJSONスキーマもあり、さまざまな自動化ツールで使用できます。
5-1. 一般フィールド
・_meta
_meta プロパティ/パラメータは、クライアントとサーバーが相互作用に追加のメタデータを添付できるようにするために、「MCP」によって予約されています。
特定のキー名は、以下に指定されているように、プロトコルレベルのメタデータ用に「MCP」によって予約されています。実装では、これらのキーの値について想定してはなりません(MUST NOT)。
さらに、スキーマ内の定義では、定義内で宣言されているように、目的固有のメタデータ用に特定の名前を予約できます。
キー名の形式は、有効な _meta キー名は、オプションのプレフィックスと名前の2つのセグメントで構成されます。
・Prefix
・指定する場合は、ドット (.) で区切られた一連のラベルと、それに続くスラッシュ (/) でなければなりません。
・ラベルは文字で始まり、文字または数字で終わる必要があります。ラベル間の文字には、文字、数字、またはハイフン (-) を使用できます。
・0個以上の有効なラベルで始まり、その後に modelcontextprotocol または mcp が続き、その後に任意の有効なラベルが続くプレフィックスは、MCP 用に予約されています。
・例: modelcontextprotocol.io/、mcp.dev/、api.modelcontextprotocol.org/、tools.mcp.com/ はすべて予約されています。
・Name
・空でない限り、先頭と末尾は英数字([a-z0-9A-Z])でなければなりません。
・間にハイフン(-)、アンダースコア(_)、ドット(.)、および英数字を含めることができます。
