見出し画像

MCP の仕様 (2) - アーキテクチャ

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

Architecture - Model Context Protocol


前回

1. アーキテクチャ

「MCP」(Model Context Protocol) は、各ホストが複数のクライアントインスタンスを実行できるクライアント・ホスト・サーバ アーキテクチャを採用しています。このアーキテクチャにより、ユーザーは明確なセキュリティ境界を維持し、懸念事項を分離しながら、アプリケーション間でAI機能を統合できます。JSON-RPCを基盤とする「MCP」は、クライアントとサーバ間のコンテキスト交換とサンプリング調整に重点を置いたステートフルなセッションプロトコルを提供します。

2. コアコンポーネント

2-1. ホスト

「ホスト」はコンテナおよびコーディネーターとして機能します。

・複数のクライアントインスタンスを作成および管理します。
・クライアント接続の権限とライフサイクルを制御します。
・セキュリティポリシーと同意要件を適用します。
・ユーザー認証の決定を処理します。
・AI/LLMの統合とサンプリングを調整します。
・クライアント間のコンテキスト集約を管理します。

2-2. クライアント

各クライアントはホストによって作成され、独立したサーバ接続を維持します。

・サーバごとに1つのステートフルセッションを確立します
・プロトコルネゴシエーションと機能交換を処理します
・プロトコルメッセージを双方向にルーティングします
・サブスクリプションと通知を管理します
・サーバ間のセキュリティ境界を維持します

ホスト アプリケーションは複数のクライアントを作成および管理し、各クライアントは特定のサーバーと 1:1 の関係を持ちます。

2-3. サーバ

サーバは、以下の特殊なコンテキストと機能を提供します。

・MCPプリミティブを介してリソース、ツール、プロンプトを公開します。
・特定の責任を負い、独立して動作します。
・クライアントインターフェースを介してサンプリングを要求します。
・セキュリティ制約を遵守する必要があります。
・ローカルプロセスまたはリモートサービスとして使用できます。

3. 設計原則

「MCP」は、そのアーキテクチャと実装を規定するいくつかの重要な設計原則に基づいて構築されています。

(1) サーバは極めて容易に構築できる必要があります。

・ホストアプリケーションは複雑なオーケストレーションの責任を担います。
・サーバは明確に定義された特定の機能に特化します。
・シンプルなインターフェースは実装オーバーヘッドを最小限に抑えます。
・明確な分離により、保守性の高いコードを実現します。

(2) サーバは高度にコンポーザブルである必要があります。

・各サーバは、特定の機能を独立して提供します。
・複数のサーバをシームレスに組み合わせることができます。
・共有プロトコルにより相互運用性を実現します。
・モジュール設計により拡張性をサポートします。

(3) サーバは会話全体を読み取り、他のサーバを「覗き見る」ことはできません。

・サーバは必要なコンテキスト情報のみを受け取ります。
・完全な会話履歴はホストに保持されます。
・各サーバ接続は独立性を維持します。
・サーバ間のやり取りはホストによって制御されます。
・ホストプロセスによりセキュリティ境界が確保されます。

(4) サーバとクライアントには段階的に機能を追加できます。

・コアプロトコルは必要最小限の機能を提供します。
・追加機能は必要に応じてネゴシエートできます。
・サーバとクライアントは独立して進化します。
・将来の拡張性を考慮して設計されたプロトコルです。
・下位互換性が維持されます。

4. 機能ネゴシエーション

「MCP」は、クライアントとサーバが初期化時にサポートする機能を明示的に宣言する、機能ベースのネゴシエーションシステムを採用しています。機能は、セッション中に利用可能なプロトコル機能とプリミティブを決定します。

・サーバは、リソースサブスクリプション、ツールサポート、プロンプトテンプレートなどの機能を宣言します。
・クライアントは、サンプリングサポートや通知処理などの機能を宣言します。
・双方は、セッション全体を通して宣言された機能を尊重する必要があります。
・プロトコルの拡張を通じて、追加の機能をネゴシエートできます。

各機能は、セッション中に使用できる特定のプロトコル機能のロックを解除します。

・実装されたサーバー機能は、サーバの機能でアドバタイズする必要があります。
・リソースサブスクリプション通知を発行するには、サーバがサブスクリプションのサポートを宣言する必要があります。
・ツールを呼び出すには、サーバがツールの機能を宣言する必要があります。
・サンプリングを行うには、クライアントが機能でサポートを宣言する必要があります。

この機能ネゴシエーションにより、クライアントとサーバはプロトコルの拡張性を維持しながら、サポートされている機能を明確に理解できます。

次回



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