MCPトランスポート層(エムシーピートランスポートソウ)
MCPトランスポート層とは、Model Context Protocolにおける通信レイヤーで、stdio(標準入出力)・SSE(Server-Sent Events)・Streamable HTTPの3種類のトランスポート方式を提供し、MCPクライアントとサーバー間のJSON-RPCメッセージ交換を実現する。
MCPトランスポート層は、MCPクライアントとサーバー間のJSON-RPC 2.0メッセージを搬送する通信レイヤーである。MCPプロトコルは特定のトランスポートに依存しない設計だが、公式仕様として stdio・SSE・Streamable HTTP の3方式が定義されている。2025年3月のプロトコル改訂でStreamable HTTPが追加され、ローカル開発からクラウドデプロイまでカバーする完全なトランスポートスタックが揃った。
3つのトランスポート方式
stdio(標準入出力)
stdioはMCPサーバーをローカルの子プロセスとして起動し、stdin/stdoutでJSON-RPCメッセージを交換する方式である。MCPの初期から存在する最もシンプルなトランスポートで、ローカル開発環境での利用に適している。
動作原理:
- ホストが
spawnでMCPサーバープロセスを起動 - クライアントがstdinにJSON-RPCリクエストを書き込み
- サーバーがstdoutにJSON-RPCレスポンスを書き込み
- stderrはログ出力用に予約
# Claude Desktop設定でのstdioサーバー起動
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["./server.js"],
"env": { "API_KEY": "xxx" }
}
}
}
- 利点: セットアップが最も簡単。ネットワーク設定不要。OSのプロセス分離でセキュリティ確保
- 欠点: ローカルマシン限定。複数クライアントからの共有接続は不可
- 推奨用途: ローカル開発、IDE統合、個人利用のツールサーバー
SSE(Server-Sent Events)
SSEはHTTPベースの片方向ストリーミングで、サーバーからクライアントへの通知をリアルタイム送信する方式である。MCPではクライアント→サーバーのリクエストにHTTP POSTを使い、サーバー→クライアントの通知にSSEストリームを使う。
動作原理:
- クライアントが
/sseエンドポイントにGETリクエストでSSE接続を確立 - サーバーがセッションIDを含む
endpointイベントを送信 - クライアントがリクエストを
/message?sessionId=xxxにPOSTで送信 - サーバーがSSEストリーム経由でレスポンスと通知を送信
- 利点: HTTPベースでプロキシ・ロードバランサーとの互換性が高い。ファイアウォール通過が容易
- 欠点: 2本のHTTP接続(SSE + POST)が必要。Streamable HTTPに比べてセットアップが複雑
- 推奨用途: レガシー環境、SSEサポート済みのインフラを持つ既存システム
Streamable HTTP(2025年追加)
Streamable HTTPは2025年3月のMCPプロトコル改訂で追加された最新のトランスポート方式である。単一のHTTPエンドポイント(/mcp)でリクエスト/レスポンスとストリーミングの両方を処理する。
動作原理:
- クライアントが
/mcpエンドポイントにJSON-RPCリクエストをPOST - サーバーが
Content-Type: application/jsonで即座にレスポンスを返却(非ストリーミング) - または
Content-Type: text/event-streamでSSEストリームとしてレスポンスを返却(ストリーミング) - サーバーはリクエストなしにGETベースのSSEで通知を送信することも可能
// Streamable HTTPサーバーの実装例
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import express from "express";
const app = express();
const server = new McpServer({ name: "remote-server", version: "1.0.0" });
app.post("/mcp", async (req, res) => {
const transport = new StreamableHTTPServerTransport("/mcp", res);
await server.connect(transport);
await transport.handleRequest(req, res);
});
app.listen(3000);
- 利点: 単一エンドポイントでシンプル。ステートレス運用可能(セッション管理はオプション)。サーバーレス環境(Cloudflare Workers、AWS Lambda)と親和性が高い
- 欠点: 2025年追加のため、古いMCPクライアントでは未対応の場合がある
- 推奨用途: クラウドホスティング、サーバーレス環境、マルチテナントサービス
トランスポート方式比較表
| 特性 | stdio | SSE | Streamable HTTP |
|---|---|---|---|
| 通信方式 | stdin/stdout | HTTP GET (SSE) + POST | 単一 HTTP POST |
| ネットワーク | ローカルのみ | LAN/WAN | LAN/WAN |
| ステートフル | プロセス単位 | セッション必須 | オプション |
| 複数クライアント | 不可 | 可能 | 可能 |
| サーバーレス対応 | 不可 | 困難 | 最適 |
| 認証 | OS分離 | OAuth 2.1 | OAuth 2.1 |
| セットアップ難易度 | 最も簡単 | 中程度 | 簡単 |
| 遅延(実測) | <1ms | 5-50ms | 5-50ms |
| 最大同時接続 | 1 | 数百〜数千 | 数千〜数万 |
| 追加仕様時期 | 初期(2024年11月) | 初期(2024年11月) | 2025年3月 |
トランスポート選択の判断基準
以下のフローチャートでトランスポート方式を選択する。
- サーバーをローカルプロセスとして実行する? → Yes: stdio(最もシンプル)
- クラウドやサーバーレス環境でホスティングする? → Yes: Streamable HTTP(最適)
- 既存のSSEインフラがある? → Yes: SSE(互換性重視)
- 複数クライアントから同時接続する? → Yes: Streamable HTTP(スケーラブル)
- それ以外 → stdio(デフォルト推奨)
サーバーレス環境での運用
Streamable HTTPの追加により、MCPサーバーのサーバーレス運用が実用的になった。
Cloudflare Workers での MCP サーバー:
Cloudflareはworkers-mcpパッケージを提供し、WorkersをMCPサーバーとしてデプロイできる。ステートレスなHTTPリクエスト/レスポンスモデルのため、Workers の実行時間制限(CPU時間30秒/リクエスト)内で動作する。Durable ObjectsでセッションステートをEdgeに保持する構成も可能。
AWS Lambda での MCP サーバー:
API Gateway + Lambda でStreamable HTTPエンドポイントを構築し、DynamoDBでセッション管理を行う。コールドスタート(約200-500ms)はMCPの初期化フェーズで吸収可能。
料金比較(月間100万リクエスト想定):
| プラットフォーム | 月額概算 | コールドスタート | メモリ上限 |
|---|---|---|---|
| Cloudflare Workers | 約$5 | <1ms | 128MB |
| AWS Lambda | 約$20 | 200-500ms | 10GB |
| Google Cloud Run | 約$15 | 300-1000ms | 32GB |
| VPS(1vCPU/1GB) | 約$5-10 | なし | 1GB |
セキュリティ考慮事項
トランスポート方式によってセキュリティモデルが異なる。
- stdio: OSのプロセス分離が唯一のセキュリティ境界。サーバープロセスの権限をユーザーレベルに制限し、不要なファイルシステムアクセスを避ける
- SSE/Streamable HTTP: TLS(HTTPS)による通信暗号化が必須。OAuth 2.1 + PKCEフローでの認証が標準。CORSヘッダーの適切な設定でクロスオリジン攻撃を防止
2025年のプロトコル改訂でDynamic Client Registration(クライアントの動的登録)とAuthorization Server Metadata Discovery(認可サーバーメタデータ発見)が仕様に追加され、リモートMCPサーバーの認証フローが標準化された。
よくある質問(FAQ)
Q1: stdioサーバーをリモートから利用する方法はありますか?
A: 直接的にはできないが、SSHトンネル経由でstdioサーバーにアクセスする構成は可能。ssh user@host commandでリモートのstdioサーバーを起動し、SSHのstdin/stdoutをMCPの通信チャネルとして利用する。ただし本格的なリモート利用にはStreamable HTTPへの移行が推奨される。
Q2: SSEからStreamable HTTPへの移行は難しいですか?
A: SDK利用時は比較的容易。TypeScript SDKの場合、SSEServerTransportをStreamableHTTPServerTransportに差し替え、エンドポイントを/sse + /messageから単一の/mcpに統合するだけで移行できる。SSEは非推奨ではないが、新規開発ではStreamable HTTPが推奨される。
Q3: WebSocketトランスポートは将来追加されますか? A: 2026年6月時点で公式ロードマップには含まれていない。Streamable HTTPがWebSocketの主要ユースケース(双方向通信・低遅延)をカバーしており、追加のトランスポートは当面不要との見解がMCPコミュニティで共有されている。ただし、カスタムトランスポートの実装はSDKレベルで可能なため、特殊要件ではWebSocketを自作することもできる。
まとめ
- MCPトランスポート層はstdio・SSE・Streamable HTTPの3方式を提供
- stdioはローカル開発に最適、Streamable HTTPはクラウド/サーバーレスに最適
- 2025年のStreamable HTTP追加でMCPのリモート運用が本格化
- サーバーレス環境(Cloudflare Workers、AWS Lambda等)でのMCPサーバー運用が実用段階に
- トランスポート方式の選択はデプロイ環境とスケーラビリティ要件で決まる