Model Context Protocol(MCP)は、AI アプリケーションが外部のツールやデータソースにどう接続するかを定義するオープンスタンダードです。2024 年 11 月に Anthropic が発表し、以来、AI アシスタント、コーディングツール、エージェントフレームワークに広く採用されています。
MCP が解決する問題
言語モデル単体では、テキストを生成することしかできません。実際の仕事で役立つには、ファイルの読み取り、データベースへの問い合わせ、検索、API の呼び出しが必要です。MCP 以前は、AI アプリケーションごとにそれらをつなぐ独自の方法を定義していたため、あるアシスタント向けに作ったツールを、次のアシスタント向けに作り直さなければなりませんでした。
MCP は、これを 1 つのプロトコルに置き換えます。ツールの提供者は MCP サーバーを一度書けば、MCP に対応するどのアプリケーションからでも使えます。よく使われる例えは万能コネクターです。機器ごとに別のケーブルを使う代わりに、標準のプラグ 1 つで済むということです。
MCP の仕組み
MCP には 3 つの役割があります。
- ホスト: チャットアプリ、IDE、エージェントなど、人が使う AI アプリケーション。
- クライアント: ホスト内にあり、1 つのサーバーとの接続を維持するコンポーネント。
- サーバー: ホストに機能を公開するプログラム。
Host application (assistant, IDE, agent)
| one MCP client per server
v
MCP server ---> files, databases, APIs, or pure computation
メッセージは JSON-RPC 2.0 です。接続が開かれると、クライアントとサーバーは互いの機能を交換し、クライアントはサーバーが何を提供するかを尋ねます。ホストはそれらのツール定義をモデルに渡します。モデルがツールを使うと決めると、クライアントがサーバーに呼び出しを送り、結果を返します。
構成要素
サーバーは 3 種類の機能を提供できます。
| プリミティブ | 内容 | 使うかどうかを決めるのは |
|---|---|---|
| ツール(Tools) | モデルが呼び出せる関数。名前、説明、入力スキーマを持つ | モデル |
| リソース(Resources) | ファイルやレコードなど、URI で識別される読み取り専用のデータ | アプリケーションまたはユーザー |
| プロンプト(Prompts) | サーバーが提供する再利用可能なプロンプトテンプレート | ユーザー |
最も広く使われているのはツールです。ツールの定義は次のようになります。
{
"name": "estimate_tokens",
"description": "Count the tokens in a prompt for a given model.",
"inputSchema": {
"type": "object",
"properties": {
"prompt": { "type": "string" },
"model": { "type": "string" }
},
"required": ["prompt"]
}
}
説明とスキーマはモデルが読むので、それ自体がプロンプトです。エージェントがツールを正しく使えるかどうかを最も左右するのは、明確なツールの説明です。AI エージェント向けのプロンプトを参照してください。
トランスポート
MCP は、メッセージがどう運ばれるかも定義しています。
- stdio: ホストがサーバーをローカルプロセスとして起動し、標準入出力で通信します。シンプルで、ネットワークには何も公開されません。
- Streamable HTTP: サーバーが Web サービスとして動作し、クライアントが HTTP で接続します。リモートや共有のサーバーに向いており、認証が必要になります。
MCP、関数呼び出し、API
これらは競合ではなく、階層です。
- API は、ソフトウェアがサービスと話す手段です。
- 関数呼び出しは、モデルが関数の実行を依頼する手段です。
- MCP は、関数をどの AI アプリケーションにも記述し、発見し、届ける方法を標準化します。
MCP サーバーは、既存の API をラップすることがよくあります。自分が管理する 1 つのアプリケーションにしか提供しないなら、単純な関数呼び出しで十分です。1 つのツールを多くのクライアントで動かしたいときに、MCP の価値が出ます。
サーバーの設定
ホストには、起動するサーバーのリストを設定します。ローカルの stdio サーバーには、コマンドとその引数が必要です。
{
"mcpServers": {
"promptflow": {
"command": "node",
"args": ["/absolute/path/to/packages/mcp-server/dist/bin.js"]
}
}
}
キー名はホストによって多少異なりますが、形は同じです。
セキュリティ上の考慮事項
モデルをツールにつなぐのは強力ですが、攻撃対象領域も広がります。
ツールの結果は信頼できない入力です。 Web ページを取得したりチケットを読んだりするサーバーは、攻撃者が書いたかもしれないテキストを返します。モデルはその中の指示に従ってしまうかもしれません。プロンプトインジェクションを参照してください。
モデルはツールの説明を信頼します。 悪意のあるサーバーは、モデルを誘導するために、ツールを紛らわしく説明できます。信頼できる提供元のサーバーだけをインストールし、宣言内容を確認してください。
機能の組み合わせはリスクを倍増させます。 非公開データの読み取り、信頼できないコンテンツの読み取り、外部へのデータ送信のすべてができるセッションは、持ち出し経路になりえます。1 つのセッションに 3 つすべてを与えないようにしましょう。
最小権限が当てはまります。 1 つのことだけを行うサーバーを選び、可能な限り読み取り専用のアクセスを使い、副作用のある操作には確認を求めます。
ローカルサーバーはあなたの権限で動きます。 stdio サーバーは、あなたのマシン上のプログラムです。インストールは、他のソフトウェアと同じように扱ってください。
優れた MCP サーバーの設計
- 目的の異なる、適切な名前のツールを少数だけ提供する。
- ツールをいつ使うか、何を返すかを書いた説明にする。
- すべての引数を検証し、モデルが対処できるエラーを返す。
- 結果はモデルのコンテキストを消費するので、コンパクトに保つ。
- 読み取りだけを行うツールは読み取り専用と示し、ホストがそのように扱えるようにする。
- 結果やログにシークレットを決して返さない。
例:MCP 経由のプロンプトツール
PromptFlowEngine の MCP サーバーは、これらの原則の小さな実例です。プロンプトエンジンを、プロンプトの分析、再構成、最適化、比較、無害化のためのツールとして公開し、さらにルールとモデルのカタログをリソースとして公開します。stdio トランスポートを使い、ネットワーク呼び出しは行わず、ファイルやシェルへのアクセスもないため、すべてのツールが読み取り専用です。与えられたテキストを処理することしかできません。
これを接続すると、エージェントは自分の作業を確認できます。
Use promptflow to restructure this before you start:
"fix login issue and make google login work and don't break anything"
エージェントは再構成ツールを呼び出し、要件、エッジケース、受け入れ基準を含むセクション分けされた仕様を受け取り、それを実装します。セットアップは MCP クライアントのドキュメントで説明しています。
MCP の位置づけ
MCP は、エージェントシステムの接続層です。ツールをいつ呼ぶかを決める推論ループは ReAct プロンプティングで、それを統制する指示は AI エージェント向けのプロンプトで扱っています。