はじめに

Model Context Protocol(MCP)は、AIアプリケーションを外部のコンテキストソースや実行可能な機能に接続するためのオープンプロトコルです。アプリケーションはMCPを利用して、一貫したインタラクションモデルを通じてファイルにアクセスしたり、サービスにクエリを実行したり、ビジネスロジックを呼び出したり、プロンプトテンプレートを再利用したりできます。重要なのは分離です。アプリケーションが会話をオーケストレーションする一方で、MCPサーバーはデータやアクションへの制御されたインターフェースを公開します。

この分離が重要なのは、AIアプリケーションが多くの統合を必要とすることが多いためです。共通プロトコルがなければ、アプリケーションごとに、サービスごとのコネクター形式、検出メカニズム、認証フロー、ツールスキーマを定義しなければなりません。MCPはホストとサーバーに共通の契約を提供し、統合固有のコードを減らすとともに、機能を確認しやすくします。ただし、MCPだけで言語モデルの正確性が高まるわけではなく、認可システムに取って代わるものでも、外部操作の安全性を保証するものでもありません。

役立つメンタルモデルは、制御されたブリッジです。モデルはある機能が役立つ可能性を提案し、ホストはリクエストが許可されているかを判断し、MCPクライアントはプロトコルリクエストを送信し、サーバーは操作を実行または拒否します。その結果はクライアントを経由してホストに戻り、ホストはその結果をモデルとユーザーにどのように提示するかを判断します。

MCPホスト内にユーザーと言語モデルが配置され、複数のMCPサーバーに接続された個別のMCPクライアントと、ファイル、データベース、外部APIに接続されたサーバーを示すアーキテクチャ図

コアアーキテクチャ

MCPホストは、ユーザーが操作する完全なAIアプリケーションです。デスクトップアシスタント、コーディング環境、カスタムエージェントサービスなどがホストとして機能できます。ホストは会話の流れを管理し、通常は、どのサーバーを設定するか、どの権限を適用するか、ツールの結果をモデルのコンテキストにどのように挿入するか、操作にユーザーの承認が必要かどうかを決定します。

MCPクライアントは、ホストによって管理されるプロトコルコンポーネントです。一般的なアーキテクチャでは、ホストはMCPサーバーごとに1つのクライアント接続を作成します。クライアントは、プロトコル通信、初期化、機能ネゴシエーション、リクエストの相関付け、通知、トランスポート固有の詳細を処理します。クライアントは言語モデルでもサーバー実装でもなく、ホストと1台のサーバーの間に位置する接続レイヤーです。

MCPサーバーは、MCPを通じて機能を公開するプログラムです。デプロイ方法やクライアントのサポート状況に応じて、ローカルでサブプロセスとして実行することも、ネットワークトランスポートの背後でリモート実行することもできます。サーバーは、承認済みのデータソースから読み取ったり、外部サービスを呼び出したり、ドメインロジックを実装したりできます。サーバーは、狭く明確で理解しやすいインターフェースを公開し、ホストやモデルがすべての入力を検証済みであると仮定せず、自身で検証を徹底すべきです。

モデルは通常、サーバーへの生のネットワーク接続を直接開きません。代わりに、ホストが MCP を通じて検出した機能を利用可能にし、関連する結果をモデルとのやり取りに組み込みます。この境界により、ホストは外部アクションが実行される前にリクエストを記録し、確認を必須にし、ポリシーを適用し、障害に対処できるため、制御性と可観測性が向上します。

プロトコルのフロー

MCP セッションは初期化から始まります。クライアントとサーバーはプロトコル情報を確認し、それぞれがサポートする機能を示すケイパビリティを交換します。クライアントは、通常のサーバー機能を使用する前に、このライフサイクルのステップを完了する必要があります。また、すべてのサーバーがすべての機能を実装していると仮定せず、サーバーがオプションのケイパビリティをサポートしていない可能性にも対応すべきです。

初期化の後、クライアントはサーバーの機能を検出できます。ツールは、課題管理システムの検索やカレンダーイベントの作成など、構造化された入力で呼び出せる操作を記述します。リソースは、ドキュメントやデータベースの結果など、コンテキストとして読み取れるデータを表します。プロンプトは、サーバーがホストに提供できる再利用可能なメッセージ構造やワークフローを表します。これらのカテゴリにはそれぞれ異なる目的があり、互換性のあるラベルとして扱うべきではありません。

一般的なツールフローには複数の段階があります。ホストがツール定義をモデルから利用できるようにし、モデルが引数付きの呼び出しを提案し、ホストがポリシーとユーザーの同意を評価します。承認されると、クライアントはサーバーにリクエストを送信します。サーバーは引数を検証し、許可されている場合は操作を実行して、結果またはエラーを返します。その後、ホストは結果をユーザーに表示するか、モデルに返すか、またはその両方を行うかを判断します。

MCP メッセージは JSON-RPC の概念に基づく構造化プロトコルを使用するため、リクエスト、結果、エラー、通知には定義された役割があります。正確なトランスポートは、メッセージの意味とは分離されています。ローカル統合では、標準入力と標準出力などのプロセスベースの接続が一般的に使用されます。一方、リモート統合では、実装がサポートする HTTP ベースのトランスポートを使用する場合があります。トランスポートはメッセージを運びますが、アクションが承認されているかどうかを判断するものではありません。

実践的な統合シナリオ

社内サポートアシスタントが 2 台のサーバーに接続されているケースを考えてみましょう。チケットサーバーは、チケットを検索するツールと、内部メモを追加するツールを公開しています。ドキュメントサーバーは、承認済みのトラブルシューティングページを含むリソースを公開しています。ホストは別々の MCP クライアントを介して両方のサーバーに接続し、起動時にそれぞれのケイパビリティを検出します。

サポートエンジニアが既知のエラーの推定原因を尋ねた場合、ホストはモデルにチケット検索ツールとドキュメントリソースを使用させることができます。検索結果から関連するインシデントを特定できる場合があり、ドキュメントリソースは承認済みの技術的コンテキストを提供します。ホストは、出典情報とともに両方の結果をモデルに提示できるため、モデルは利用可能なデータに基づいた回答案を作成できます。

エンジニアがアシスタントにチケットへのメモの追加を依頼した場合、外部への副作用を伴う操作であるため、ワークフローが変わります。ホストは対象のチケットと追加予定のメモを表示し、ユーザーに権限があることを確認したうえで、適切な場合には確認を求めるべきです。サーバーも、チケット識別子、メモの長さ、認可コンテキストを検証する必要があります。あるレイヤーで承認されたからといって、他のレイヤーの検証責任がなくなるわけではありません。

最も有用なテストは、最終的な回答だけでなく、境界全体を対象とします。初期化が成功すること、サポートされていないケイパビリティが適切に処理されること、不正な形式の引数が制御されたエラーになること、拒否された操作によって外部状態が変更されないこと、またサーバーのタイムアウトによってホストが成功したという架空のメッセージを表示しないことを検証します。これらのテストにより、統合の動作が明確になり、診断しやすくなります。

よくある失敗モード

よくある誤りの一つは、MCPを自律型エージェントフレームワークと混同することです。MCPは通信と機能の公開方法を定義するものであり、特定の計画アルゴリズム、モデルプロバイダー、メモリシステム、ユーザーインターフェースを規定するものではありません。エージェントはMCPを利用できますが、エージェントループの設計はアプリケーション側の判断に委ねられます。もう一つの誤りは、サーバーの機能をすべてツールとして扱うことです。これにより、読み取り専用のリソースの方が適している場面でも、不要なアクションを促す可能性があります。

セキュリティ上の失敗は、過度な信頼から生じることがよくあります。ツールの説明は有用なメタデータですが、完全なセキュリティ境界ではありません。サーバー側で入力を検証し、ファイルおよびネットワークへのアクセスを制限し、認証情報を保護し、操作の境界で認可を適用してください。小規模なドメイン固有の操作でユースケースを満たせる場合は、汎用的なコマンド実行ツールを公開しないでください。

運用上の失敗には、ライフサイクルやトランスポートの処理に関するものがよくあります。クライアントが初期化前にリクエストを試みたり、機能が存在すると決めつけたり、接続が切断された際に状態をクリアしなかったり、タイムアウトを成功した結果として扱ったりすることがあります。サーバーの識別情報、リクエスト種別、相関情報、所要時間、サニタイズ済みのエラー詳細をログに記録してください。デバッグを簡単にするためだけに、トークン、パスワード、機密性の高いユーザーコンテンツをログに記録してはいけません。

もう一つの失敗は、出所や関連性を確認せずに、ツールの結果をモデルのコンテキストに取り込むことです。外部コンテンツには、誤解を招く指示や、そのまま再提示するのが安全でないデータが含まれている可能性があります。ホストは、指示、取得データ、ユーザーが承認したアクションの間に明確な境界を維持し、信頼できないコンテンツをどのように扱うかをアプリケーション側で定義する必要があります。

まとめ

MCPは、AIアプリケーションがモデルを外部のコンテキストや機能に接続するための標準的な方法を提供します。ホストはアプリケーション体験とポリシー上の判断を担い、クライアントはプロトコル接続を管理し、サーバーは検証済みのデータや操作を公開します。これらの責務を明確に分けることで、統合の仕組みを理解しやすくなり、テストもしやすくなります。

中核となるワークフローは、初期化、機能ネゴシエーション、ディスカバリー、制御された呼び出しまたは取得、そして結果処理です。ツールは呼び出し可能な操作に、リソースはコンテキストデータに、プロンプトは再利用可能なインタラクションテンプレートに適しています。プロトコルは異なるトランスポートを介してメッセージを運べますが、トランスポートの選択によって認証、認可、検証、可観測性が不要になるわけではありません。

MCP統合を設計する際は、まず最小限で有用なサーバーインターフェースから始めてください。サーバーが公開するものを定義し、副作用のある操作を特定し、同意が必要な場所を決め、モデルに接続する前に障害時の動作を明確にします。信頼性の高いアプリケーションは、モデルの出力を提案として扱い、ホストとサーバーでポリシーを適用し、成功を報告する前に外部結果を検証します。

レッスンのチェックポイント

1. Model Context Protocolが主に解決する問題は何ですか?

2. MCPホストの主な役割は何ですか。

3. 複数のMCPサーバーは、通常MCPホスト内でどのように表現されますか。

4. 一般的なMCPサーバーの機能の違いを正しく説明しているのは、次のうちどれですか。

5. ホストアプリケーションにおける重要なセキュリティ上の責任とは何ですか?

6. MCPクライアントはどのような役割を果たしますか?

7. MCP統合は、モデルの最終的なテキスト応答以外もテストすべきなのはなぜですか?

MCPの基礎とアーキテクチャ