MCP 2026-07-28: ステートレス仕様
2026年7月28日、Model Context Protocol はローンチ以降で最大の改訂を確定した。見出しは一つ、MCPはステートレスになった。initializeハンドシェイクとMcp-Session-Idヘッダは消滅し、あらゆるリクエストが_metaの中で自身の識別情報を持ち運ぶ。ロードバランサ配下のどのサーバーインスタンスでも任意の呼び出しに応答できる。サーバーレスMCPはもはや回避策ではなく、プロトコルそのものの姿となった。
- 2026-07-28仕様で実際に何が変わったのか — 重要な4つの削除と4つの追加
- Multi Round-Trip Requests(MRTR): ステートレスなサーバーがセッションなしでユーザーに追加質問を投げる方法
- Extensions フレームワークと2つの公式拡張:MCP Apps と Tasks
- 認可の強化:OAuth 2.1、RFC 9207 の iss 検証、Dynamic Client Registration が今後求めるもの
- 既存の2025-11-25クライアントを壊さない具体的な移行パス — 今日インストールできるSDKベータ版付き
一段落サマリー
以前は、initializeハンドシェイク → Mcp-Session-Idクッキー → セッションの寿命の間だけスティッキーなクライアント/サーバーペア。以後は、ハンドシェイクなし、セッションIDなし、スティッキネスなし。クライアントの識別と機能はあらゆるリクエストの_metaオブジェクトに乗る。新しいserver/discoverメソッドが初期の機能交換を置き換える。ショッピングカートや実行中のタスクといったアプリケーション状態は、ツールが返し、次の呼び出しで再び渡されるハンドルに宿る — RESTのリソースIDと同じだ。この一つの変更が、サーバーレスやエッジ配備、真の水平スケーリング、そして競合する二つの実装が同じURLの背後に同居できる可能性を解き放つ。
削除されたもの
- Mcp-Session-Id ヘッダ — そして「プロトコルレベルのセッション」という概念そのもの
- initialize / initialized ハンドシェイク — あらゆるリクエストに載る _meta と、必要時に呼ぶ server/discover に置換
- Roots、Sampling、Logging — 非推奨。Roots: パスはツールパラメータとして渡す。Sampling: LLMは自分で呼ぶ。Logging: stderr か OpenTelemetry を使う。
- tasks/list — 新しいTasks拡張の中でさえ削除された。セッションなしでのタスク一覧はテナント間漏洩になるためだ
Roots/Sampling/Logging の非推奨化は、既存サーバーが実際に触れている部分だ。この三つはすべて、永続的な双方向のサーバー↔クライアントチャネルを前提としていた。ステートレスな世界では、LLM もパスもログシンクもクライアントの持ち物になる — サーバーはツール呼び出しに答えるだけだ。
追加されたもの
- サーバーが何を提供しているかをクライアントが必要時に呼び出せる、ステートレスなRPC。旧ハンドシェイクが返していたケイパビリティを置き換える。レスポンスの新しい ttlMs / cacheScope フィールドでレスポンス自体をキャッシュせよ — 仕様は HTTP Cache-Control のセマンティクスを継承する。
- Mcp-Method と Mcp-Name(例: tools/call, search)により、ロードバランサはJSON-RPCを解析せずにルーティング可能。MCP-Protocol-Version がセッションに代わってバージョンネゴシエータとなる。
- エリシテーションへのステートレスな回答。ツールが実行途中で入力を必要とする場合、サーバーは質問と不透明な requestState ブロブを含む InputRequiredResult を返す。クライアントは inputResponses と、エコーされた requestState を付けて呼び出しを再送する — そしてどのサーバーインスタンスでも続きを引き取れる。
- 逆DNSで名前空間化され、独立してバージョニングされ、extensions ケイパビリティマップ経由でネゴシエートされる。公式拡張が最初に配布される:MCP Apps(サンドボックス化されたHTML UI、SEP-1865)と Tasks(tasks/get, tasks/update, tasks/cancel を持つ長時間実行操作、SEP-2663)。以前はコア仕様変更を要求していた他のすべてが、今後は拡張として配布される。
- ツールの inputSchema と outputSchema が oneOf / anyOf / allOf、conditionals、$ref を受け付ける。MCPの旧サブセットに合わせてスキーマを平坦化していたなら、もうやめてよい。
- traceparent、tracestate、baggage が _meta に載って流れる。クライアント → コネクタ → サーバーの連鎖にまたがる分散トレーシングが、ようやく箱から出してすぐ機能する。
- Active → Deprecated → Removed の間に最低12ヶ月。2026-07-28に非推奨となったものは少なくとも2027-07-28まで動き続け、削除には固有のSEPが必要となる。
全員がハマる JSON の変更
リソース欠落のエラーコードが -32002 から -32602 (Invalid Params) に移った。クライアントのどこかにif (err.code === -32002)分岐があると、7月28日以降は静かに発火しなくなる。RC中で最も多い統合バグだ。
Before / After
// BEFORE (2025-11-25): stateful handshake
POST /mcp { "method": "initialize", "params": { "capabilities": {...} } }
→ sets Mcp-Session-Id: abc123
POST /mcp Mcp-Session-Id: abc123
{ "method": "tools/call", "params": { "name": "search", ... } }
// server assumes it "knows" you because of the session cookie
// AFTER (2026-07-28): self-describing request
POST /mcp Mcp-Method: tools/call
Mcp-Name: search
MCP-Protocol-Version: 2026-07-28
{
"method": "tools/call",
"params": { "name": "search", "arguments": {...} },
"_meta": {
"clientInfo": { "name": "claude-code", "version": "..." },
"capabilities": { "extensions": { "com.anthropic.apps": "1" } },
"traceparent": "00-..."
}
}
// any instance can serve it; no session, no stickiness
Multi Round-Trip Requests の具体像
仕様の中で最もエレガントな部分だ。「どのカレンダーですか?」を実行途中で尋ねる必要のあるサーバーは、ソケットを開いたまま保持する必要がない。こう返せばよい:
{
"resultType": "input_required",
"inputRequests": {
"calendarId": { "type": "string", "prompt": "Which calendar?" }
},
"requestState": "base64(<opaque server-signed blob>)"
}
クライアントはプロンプトを表示し、inputResponsesを集め、両方のフィールドを付けて元のリクエストを再送する。サーバーはrequestStateを権威的なものとして扱い — 多くの場合それに署名する — 直前の試行を覚えておく必要すらない。ステートレスなエリシテーションの本質はこれに尽きる:状態はサーバーではなく、線上を旅する。
2つの公式拡張
- MCP Apps (SEP-1865): サーバーがHTML UIを提供し、クライアントがサンドボックス化されたiframeでレンダリングする。UI内の各アクションは通常のツール呼び出しと同じJSON-RPC監査パスを通過する — 裏口の書き込みはない。任意のWebページではなく、対話的レポート+実行前確認のようなものと考えよ。
- Tasks (SEP-2663): 長時間実行操作のパターンを、セッションのない世界向けに再設計。tools/call はタスクハンドルを返し、クライアントはポーリング/ストリーミング用に tasks/get と tasks/update を、中断用に tasks/cancel を駆動する。tasks/list は意図的に削除された — セッションなしでタスクを列挙することはテナント間の漏洩である。
- 破壊的変更:2025-11-25 の実験的 Tasks API は新しい拡張と互換性がない。それに対して出荷したなら、移行はアップグレードではなく書き換えとして扱え。
認可:OAuth の清掃
旧仕様は「OAuthっぽい」ものだった。新仕様は OAuth 2.1 / OIDC 形状である:
- クライアントは RFC 9207 に従い、認可応答の
issパラメータを必ず検証しなければならない — 今年前半にMCPサーバーを直撃したmix-up攻撃への対策だ。 - Dynamic Client Registration は今後、クライアントにOpenID Connectの
application_type宣言を求める。これによりIDプロバイダはネイティブ/Web/マシンクライアントで異なるルールを適用できる。 - リフレッシュトークンは標準のOIDCリフレッシュフローに従う — つまりエンタープライズSSO(Entra、Okta、PingID)がカスタムミドルウェアなしで初めて動作する。
実務的に読めば、MCPをOktaに合わせるためにカスタムOAuth糊を作っていたなら、そのほとんどを削除できる。
今日ベータをインストール
Python — mcp v2.0.0b1(単一エンドポイントが両方の改訂に応答)
uv add "mcp[cli]==2.0.0b1" # or pip install "mcp[cli]==2.0.0b1"
TypeScript — パッケージ分割、ステートレスは明示的オプトイン
npm install @modelcontextprotocol/server@beta npm install @modelcontextprotocol/client@beta
Go — v1.7.0-pre.1
go get github.com/modelcontextprotocol/go-sdk@v1.7.0-pre.1
C# — v2.0.0-preview.1
dotnet add package ModelContextProtocol --prerelease
SDKチームからの互換性の約束:「今日壊れるものはなく、7月28日にも何も壊れない。」 新しいクライアントは2025-11-25サーバーに当たったとき自動的に旧ハンドシェイクにネゴシエートダウンし、Python v2 サーバーは既定で同じエンドポイントから両方の改訂に応答し、TypeScript と Go はステートレス版を公開するために明示的なオプトインを要求する。TypeScript v1.x は少なくとも6ヶ月間、バグ修正とセキュリティ更新を受ける。
移行プレイブック
- 2027年7月28日までは動く。それらを土台にした新規サーバーは作らないこと。パスはツール引数として受け取る。LLM呼び出しは自分のクライアントで行う。ログは stderr に書き、ハーネスに集約させる。
- サーバーが今日「ユーザーはチェックアウトの途中」と覚えているなら、ツール呼び出しから basket_id を返し、次回はそれを要求せよ。状態はメモリではなく線上に置く。
- 当面は旧ハンドシェイクを残すとしても、server/discover を公開することで 2026-07-28 クライアントは initialize を完全にスキップできる。サーバーレスを解錠するのはこの一つの変更だ。
- 所有するすべてのコードベースを 32002 で grep せよ。移行の静かな失敗の罠だ。
- あらゆるリクエストで clientInfo と capabilities を _meta に載せる。ついでに traceparent も伝播せよ — 本番で何かが壊れた初回に、そのトレースが欲しくなる。
- MCP Apps はUIがチャットのターンを上回るとき(データグリッド確認、チャート駆動の承認)に価値がある。Tasks は操作がクライアントのHTTPアイドルタイムアウトを超える可能性があるとき常に価値がある。どちらも無料ではない — どちらもクライアントの表面積を増やす。
- アップグレードはされない。拡張に対して書き直し、ロールアウト中は古いエンドポイントを生かしておき、自分のスケジュールで削除せよ。
RC で実際に人々がハマっているワナ
- スティッキーなロードバランサは今も「動く」— そうでなくなるまでは。ステートレスなサーバーの前にスティッキーなLBを置くと、devでは問題なく本番でキャッシュヒット率がズタボロになる。スティッキネスは明示的にオフにせよ。
- requestState はクライアントには不透明だが、それは無料のストレージではない。500KB のコンテキストを詰め込むサーバーはクライアントのメモリを吹き飛ばす。小さなハンドルに署名し、残りはハンドルをキーにサーバー側で保存せよ。
- MCP Apps の iframe はサンドボックス化はされているが、サニタイズはされていない。悪意あるサーバーは今もユーザーがUIに入力した内容を持ち去れる。MCP App は第三者コードとして扱い、UIをレンダリングしてよいサーバーを許可リストで制限せよ。
- server/discover はベース仕様に認証要件がない。そこに露出させたものは、URLに到達できる任意のクライアントに発見される。内部ツールのメタデータを置いてはならない。
- JSON Schema 2020-12 へのアップグレードは、旧サブセットに対して手書きのバリデータを書いたクライアントが静かに検証不足になり得ることを意味する。手作りではなく実物のJSON Schemaライブラリを使え。
AILmanac マップ上のどこに位置するか
- MCP とツールへの接続 — API側のコネクタ。今も現行の内容。コネクタがトランスポートを抽象化するため、線上の変化はそのリクエスト形状には見えない。移行するのはコネクタが会話するサーバー側のみだ。
- Claude Code の中の MCP — Claude Code がローカル+リモートサーバーとMCPを喋る方法。ステートレスモデルこそが、Claude Code をサーバーレス MCP エンドポイントに指すときに変なタイムアウトなしで動く理由だ。
- MCP のトークン税 — 遅延読み込みはトークン側のレバーであり、拡張フレームワークは同じ問題に対するプロトコル側のレバーだ。
- MCPサーバーのセキュア化 — NSA の 2026年5月MCPセキュリティガイダンスとRCの認可強化は互いを補強する。両方を読め。
クイックチェック
Check yourself
0/4今週GitHubで目にする語彙
出典と参考文献
- The 2026-07-28 MCP Specification Release Candidate — 一次発表。削除、追加、SEP リスト付き。
- Beta SDKs for the 2026-07-28 MCP Spec RC — Python、TypeScript、Go、C# のベータバージョンと後方互換の約束。
- Bringing MCP 2026-07-28 to Claude — Anthropic による Claude と Claude Code へのロールアウトノート。
- MCP 2026-07-28: From Local Tool to Distributed Protocol — 第三者による最も鋭い移行ウォークスルー。
- MCP Just Went Stateless — What the 2026 Spec Changes About Scaling — App Service 上のステートレス MCP に関する Microsoft の視点。
- MCP Is Going Stateless. Here's What That Means — Arcade.dev の実務者の見解。運用面の影響に有用。
- NSA CSI: MCP Security Design Considerations (PDF) — NSA による 2026年5月のハードニングガイダンス。本仕様の認可変更と組み合わせて読め。