【生成AI/LLM】MCPとは

大規模言語モデル(LLM)を用いたAIエージェントやアプリケーションの特徴の1つに、Pythonなどで作られたツールを使えるというのがあります。

しかしAIエージェントやアプリ開発者からすると、利用するプログラミング言語やフレームワークが変わるとツールの実装方法が異なり、都度開発する必要がありました

またツールの開発者目線においても、作ったツールを公開しても、他のAIエージェントからそのまま活用してもらいづらいという課題もありました。

これらの課題を解決するために登場したのがMCPです。

目次

MCPとは

  • MCP(Model Context Protocol)
  • 大規模言語モデル(LLM)などを使ったAIアプリケーションと、外部のツールやデータとの連携を標準化するプロトコル
  • 2024年にAnthropicが発表
  • AIアプリケーション用のUSB-Cポートに良く例えられる
引用元: https://modelcontextprotocol.io/docs/getting-started/intro

MCPのアーキテクチャ

構成要素

MCPホスト

1つまたは複数のMCPクライアントを管理するAIアプリケーション
(例えばClaudeやChatGPT、VS Codeとか。自作アプリケーションなど)

MCPクライアント

MCPサーバへの接続を維持し、MCPホストが使用するためにMCPサーバからコンテキストを取得するコンポーネント

MCPサーバ

クライアントにコンテキストを提供するプログラム

例えばMCPホストがGmailなどのMCPサーバへの接続を確立すると、MCPサーバへの接続を維持するためのMCPクライアントオブジェクトをインスタンス化する。

その後、MCPホストがローカルのファイルシステムサーバなど別のMCPサーバに接続すると、追加でMCPクライアントオブジェクトをインスタンス化する。

これにより、MCPクライアントとMCPサーバの1:1の関係が維持される。

MCPサーバはローカルでもリモートでも実行できる。
例えば、Claude Desktopがファイルシステムサーバを起動すると、サーバはSTDIOトランスポートを使用し、同じマシン上でローカルに実行される。

このようにMCPサーバがクライアントと同じローカルコンピューターで稼働するのは「ローカルMCP方式」と呼ぶよ

一方、GmailのMCPサーバはGoogleプラットフォーム上で実行され、Streamable HTTPトランスポートを使用する。

MCPサーバがクライアントと離れたマシンで稼働するため「リモートMCP方式」と呼ぶのね

トランスポート

MCPでは、クライアントとサーバ間の通信仕様が「トランスポート」として定められており、両者間は「JSON-RPC 2.0」というプロトコルで送受信される。

stdio(標準入出力)

ローカルMCPで利用する通信方式。
普段、開発で用いるターミナルで標準入力からコマンドを打ち、結果が標準出力として表示されるのと同じ。

Streamable HTTP

リモートMCPで利用する通信方式。
両者の通信にHTTPを利用し、必要な場合のみサーバからSSE(Server-Sent Events)を用いてクライアントへストリーミングを行う。

Stremable HTTPは、例えばMCPホストからHTTP POSTメソッドでMCPサーバにリクエストすると、単発であればJSONオブジェクトが返ってくるし、必要ならSSEのストリームが開始されるってことだね

MCPのプリミティブ

MCPでは複数の機能が「プリミティブ」として用意されており、サーバで提供するものとクライアントで提供するものに分かれる。

サーバが提供するプリミティブ

プロンプト

ユーザのプロンプトを入力を便利にする、LLMへの指示をまとめたテンプレート文言。

アプリケーションの利用者が内容を制御し、MCPクライアントはprompts/listprompts/getリクエストをサーバに送信する。

ユーザが制御する。

リソース

テキストファイルやデータベースのレコード、画像、APIレスポンスなど読み取り専用データをLLMにコンテキストとして渡すことが可能。

扱えるのは主にテキストとバイナリ(画像や動画などをBase64エンコードしたもの)。例えばdocs://127.0.0.1/sample.mdのようなURIで参照する。

MCPクライアントはresources/listresources/readリクエストをサーバに送信する。

アプリケーションが制御する。

ツール

MCPホストの外部から情報を取得したり、他のシステムを操作するアクションを実行できる。

MCPクライアントはtools/listtools/callリクエストをサーバに送信する。

MCPサーバ内部では、Function calling(Tool use)が使われる。

LLMが制御する。

MCPプリミティブ「ツール」の流れ

クライアントが提供するプリミティブ

これらの機能を利用するには、MCPホストとなるアプリケーション側で対応が必要。

ルート

MCPサーバがアクセスしてよいリソースの範囲を宣言。

例えばMCPホストが稼働するPCにおいて、特定のディレクトリのみMCPサーバに利用させることを許可する。

サーバは、roots/listリクエストをクライアントに送ることでルートの情報を取得する。

サンプリング

MCPサーバが望めばMCPホストのLLMを使って推論できる機能。

通常はMCPサーバを使って必要なコンテキストを取得し、MCPホストがその結果を用いてLLMで推論することが一般的。

例えば旅行を予約するためのMCPサーバーは、クライアントのLLM にフライトのリストを送信し、ユーザーにとって最適なフライトを選択するように LLMに要求できる。

クライアントはユーザー権限とセキュリティ対策を完全に制御できる。

サーバは、sampling/createMessageリクエストをクライアントに送る。

エリシテーション

MCPサーバが追加情報を必要とした際、ユーザーへ質問するプリミティブ。

MCPクライアントはelicitation/createリクエストをサーバに送信する。ユーザーは承認・拒否・キャンセルの3つからアクションを選択する。

まとめ

LLMを用いたAIエージェントやアプリが各種ツールを使う際の標準プロトコル「MCP」について、特徴やアーキテクチャ、機能についてご紹介しました。

では実際にMCPをどのように実装するのか、今後試してみたいと思います。

目次