見出し画像

MCP の仕様 (3) - 基本プロトコル - 概要

以下の記事が面白かったので、簡単にまとめました。

Base Protocol - Model Context Protocol


前回

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])でなければなりません。
・間にハイフン(-)、アンダースコア(_)、ドット(.)、および英数字を含めることができます。

次回



いいなと思ったら応援しよう!