MCP(Model Context Protocol)は、LLMアプリが外部の“現実”(ツール・データ・テンプレ)と対話するための標準化です。
重要なのは、「モデルがMCPをネイティブ対応する」ことではなく、
(1)MCPサーバ(提供側) と (2)MCPクライアント(接続層) が揃って初めて成立する、という点です。
MCPの典型構成は次の3層です。
モデルが呼び出して実行結果を得る「関数/API」的なものです。入力・出力は JSON Schema で定義でき、結果は複数コンテンツを返せます。
ファイル/ドキュメント/データなどの参照対象です。URI、mimeType、annotations などのメタデータが中心になります。
再利用可能なプロンプト(テンプレート)をサーバ側が公開し、クライアントが利用できる仕組みです。
ここでは「誰がMCPクライアントを持つか」と「どのtransport/認証に通せるか」で整理します。
| ベンダー | 対応レベル(俯瞰) | どこでMCPを扱えるか(例) | 注意点(例) |
|---|---|---|---|
| OpenAI | 高い | Responses API の tools で type:"mcp" | リモートMCPは Streamable HTTP / HTTP(SSE) 前提。allowed_tools / require_approval が鍵。 |
| Anthropic | 高い | Claude Desktop でローカルMCP(stdio)設定 | 設定変更後の再起動が必要。拡張配布/許可(Team/Enterprise)など運用面の制約。 |
| 高い | Gemini Interactions API で Remote MCP を tool として指定 | URL・認証方式・提供ツールはサーバ実装に依存。 | |
| Microsoft | 高い | VS Code / Foundry / Semantic Kernel などで統合ガイド | 信頼できるサーバのみ追加、allow-list推奨、承認必須などを強調。 |
| Mistral | 中〜高 | Python SDKでMCPクライアント統合例 | 依存ライブラリ整合と非同期前提の設計が必要。 |
| Meta | 限定的(要一次資料確認) | 開発者ツール側に“専用MCPサーバ”を組み込む説明が中心 | モデルAPIがMCPクライアント内蔵かは一次資料で断言しづらい。ブリッジ設計が現実的。 |
MCPは突然現れたというより、JSON-RPCやLSPなど「クライアント/サーバ標準化」の流れを継ぐ“エージェント時代の接続規格”として読むと理解しやすいです。
| 時期 | 出来事 | MCPとの関係 |
|---|---|---|
| 2010年前後 | JSON-RPC 2.0が確立 | MCPメッセージの符号化の土台 |
| 2016年前後 | LSPがJSON-RPCベースで標準化 | “クライアント/サーバ分離”がMCPと類似 |
| 2023-03-23 | ChatGPT plugins発表 | LLMと外部サービス接続が一般化 |
| 2023-06 | OpenAI function calling発表 | 自然言語→構造化引数→関数実行が普及 |
| 2024-11-05 | MCP初版公開 | stdio と HTTP+SSE が主要transport |
| 2025-03-26 | Streamable HTTP導入 | リモートMCP運用を現実的に |
| 2025-11-25 | Tasks(実験的)導入 | 長時間/非同期処理を語彙として取り込み |
| 2025-12-09 | Linux Foundation傘下へ寄贈 | 中立運営(vendor-neutral)を制度面で補強 |
MCPのメッセージは JSON-RPC 2.0 形式でやり取りされます。ざっくり言うと、「JSONでRPC(遠隔呼び出し)をする約束事」です。
ツールの引数や戻り値を JSON Schema で定義し、曖昧な文字列より 確実な構造化結果(structuredContent) を増やす設計が推奨されています。
| 項目 | stdio(ローカル) | Streamable HTTP(リモート) |
|---|---|---|
| 用途 | IDE/デスクトップがサブプロセス起動 | 複数端末・API共有 |
| 通信 | 標準入出力(改行区切り) | HTTP + SSE(text/event-stream)など |
| 壊れやすさ | stdoutログ混入で破綻しやすい | 運用は楽だがセキュリティ要件が重い |
| 重要な要件 | メッセージ自体に改行を含めない等 | Origin検証(DNS rebinding対策)必須級 |
2025-11-25 で導入された Tasks は、長時間処理・並列処理・結果の後追い取得(polling)を扱う方向性を示します。
# demo_server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("demo")
@mcp.tool()
async def add(a: int, b: int) -> str:
"""2つの整数を足して結果を返します。"""
return str(a + b)
def main():
# stdioで起動(クライアントがサブプロセスとして起動する想定)
mcp.run(transport="stdio")
if __name__ == "__main__":
main()
// demo_server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "demo", version: "1.0.0" });
server.registerTool(
"add",
{
description: "Add two integers",
inputSchema: {
a: z.number().int(),
b: z.number().int(),
},
},
async ({ a, b }) => {
return {
content: [{ type: "text", text: String(a + b) }],
};
},
);
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("demo MCP server running (stdio)");
}
main().catch((e) => {
console.error(e);
process.exit(1);
});
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
const resp = await client.responses.create({
model: "gpt-5",
input: "Roll 2d4+1",
tools: [
{
type: "mcp",
server_label: "dmcp",
server_url: "https://dmcp-server.deno.dev/sse",
require_approval: "never",
},
],
});
console.log(resp.output_text);
from google import genai
client = genai.Client()
mcp_server = {
"type": "mcp_server",
"name": "weather_service",
"url": "https://gemini-api-demos.uc.r.appspot.com/mcp",
}
interaction = client.interactions.create(
model="gemini-2.5-flash",
input="What is the weather like in New York today?",
tools=[mcp_server],
)
print(interaction.outputs[-1].text)
設定ファイル編集後、完全終了して再起動が必要なケースがあります。
絶対パスやエスケープに注意してください。