AI・機械学習
上級

MCPトランスポート層(エムシーピートランスポートソウ)

MCPトランスポート層とは、Model Context Protocolにおける通信レイヤーで、stdio(標準入出力)・SSE(Server-Sent Events)・Streamable HTTPの3種類のトランスポート方式を提供し、MCPクライアントとサーバー間のJSON-RPCメッセージ交換を実現する。

0 回閲覧
0 いいね

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の初期から存在する最もシンプルなトランスポートで、ローカル開発環境での利用に適している。

動作原理:

  1. ホストがspawnでMCPサーバープロセスを起動
  2. クライアントがstdinにJSON-RPCリクエストを書き込み
  3. サーバーがstdoutにJSON-RPCレスポンスを書き込み
  4. 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ストリームを使う。

動作原理:

  1. クライアントが/sseエンドポイントにGETリクエストでSSE接続を確立
  2. サーバーがセッションIDを含むendpointイベントを送信
  3. クライアントがリクエストを/message?sessionId=xxxにPOSTで送信
  4. サーバーがSSEストリーム経由でレスポンスと通知を送信
  • 利点: HTTPベースでプロキシ・ロードバランサーとの互換性が高い。ファイアウォール通過が容易
  • 欠点: 2本のHTTP接続(SSE + POST)が必要。Streamable HTTPに比べてセットアップが複雑
  • 推奨用途: レガシー環境、SSEサポート済みのインフラを持つ既存システム

Streamable HTTP(2025年追加)

Streamable HTTPは2025年3月のMCPプロトコル改訂で追加された最新のトランスポート方式である。単一のHTTPエンドポイント(/mcp)でリクエスト/レスポンスとストリーミングの両方を処理する。

動作原理:

  1. クライアントが/mcpエンドポイントにJSON-RPCリクエストをPOST
  2. サーバーがContent-Type: application/jsonで即座にレスポンスを返却(非ストリーミング)
  3. またはContent-Type: text/event-streamでSSEストリームとしてレスポンスを返却(ストリーミング)
  4. サーバーはリクエストなしに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クライアントでは未対応の場合がある
  • 推奨用途: クラウドホスティング、サーバーレス環境、マルチテナントサービス

トランスポート方式比較表

特性stdioSSEStreamable HTTP
通信方式stdin/stdoutHTTP GET (SSE) + POST単一 HTTP POST
ネットワークローカルのみLAN/WANLAN/WAN
ステートフルプロセス単位セッション必須オプション
複数クライアント不可可能可能
サーバーレス対応不可困難最適
認証OS分離OAuth 2.1OAuth 2.1
セットアップ難易度最も簡単中程度簡単
遅延(実測)<1ms5-50ms5-50ms
最大同時接続1数百〜数千数千〜数万
追加仕様時期初期(2024年11月)初期(2024年11月)2025年3月

トランスポート選択の判断基準

以下のフローチャートでトランスポート方式を選択する。

  1. サーバーをローカルプロセスとして実行する? → Yes: stdio(最もシンプル)
  2. クラウドやサーバーレス環境でホスティングする? → Yes: Streamable HTTP(最適)
  3. 既存のSSEインフラがある? → Yes: SSE(互換性重視)
  4. 複数クライアントから同時接続する? → Yes: Streamable HTTP(スケーラブル)
  5. それ以外 → 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<1ms128MB
AWS Lambda約$20200-500ms10GB
Google Cloud Run約$15300-1000ms32GB
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サーバー運用が実用段階に
  • トランスポート方式の選択はデプロイ環境とスケーラビリティ要件で決まる