メインコンテンツまでスキップ

MCP 2026-07-28: ステートレス仕様

上級

2026年7月28日、Model Context Protocol はローンチ以降で最大の改訂を確定した。見出しは一つ、MCPはステートレスになったinitializeハンドシェイクとMcp-Session-Idヘッダは消滅し、あらゆるリクエストが_metaの中で自身の識別情報を持ち運ぶ。ロードバランサ配下のどのサーバーインスタンスでも任意の呼び出しに応答できる。サーバーレスMCPはもはや回避策ではなく、プロトコルそのものの姿となった。

What you'll learn
  • 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の背後に同居できる可能性を解き放つ。

削除されたもの

Watch out
  • Mcp-Session-Id ヘッダ — そして「プロトコルレベルのセッション」という概念そのもの
  • initialize / initialized ハンドシェイク — あらゆるリクエストに載る _meta と、必要時に呼ぶ server/discover に置換
  • Roots、Sampling、Logging — 非推奨。Roots: パスはツールパラメータとして渡す。Sampling: LLMは自分で呼ぶ。Logging: stderr か OpenTelemetry を使う。
  • tasks/list — 新しいTasks拡張の中でさえ削除された。セッションなしでのタスク一覧はテナント間漏洩になるためだ

Roots/Sampling/Logging の非推奨化は、既存サーバーが実際に触れている部分だ。この三つはすべて、永続的な双方向のサーバー↔クライアントチャネルを前提としていた。ステートレスな世界では、LLM もパスもログシンクもクライアントの持ち物になる — サーバーはツール呼び出しに答えるだけだ。

追加されたもの

Guided walkthrough1 of 7
  1. サーバーが何を提供しているかをクライアントが必要時に呼び出せる、ステートレスなRPC。旧ハンドシェイクが返していたケイパビリティを置き換える。レスポンスの新しい ttlMs / cacheScope フィールドでレスポンス自体をキャッシュせよ — 仕様は HTTP Cache-Control のセマンティクスを継承する。

全員がハマる 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つの公式拡張

What you'll learn
  • 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ヶ月間、バグ修正とセキュリティ更新を受ける。

移行プレイブック

Guided walkthrough1 of 7
  1. 2027年7月28日までは動く。それらを土台にした新規サーバーは作らないこと。パスはツール引数として受け取る。LLM呼び出しは自分のクライアントで行う。ログは stderr に書き、ハーネスに集約させる。

RC で実際に人々がハマっているワナ

Watch out
  • スティッキーなロードバランサは今も「動く」— そうでなくなるまでは。ステートレスなサーバーの前にスティッキーな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
  1. 2026-07-28 仕様では、クライアントの識別情報とケイパビリティ一覧はどこを旅するか?
  2. 実行途中のツールが、書き込み先のカレンダーをユーザーに尋ねる必要がある。ステートレス仕様では、セッションなしにどうやってそれを行うか?
  3. スキップすると 7月28日に静かに壊れるクライアント側の変更はどれか?
  4. 2026-07-28 仕様で非推奨になっていない機能はどれか?

今週GitHubで目にする語彙

MCP 2026-07-28 用語
Enter キーまたはスペースキーでカードを裏返します。左右の矢印キーでカードを移動できます。用語を表示しました。
1 / 11

出典と参考文献