MCP(Model Context Protocol)は、2026年7月28日に公開予定の新仕様に向けて、プロトコル史上最大の改訂を迎えている。2026年5月21日に公開されたリリース候補(RC)は、ステートレスコアへの移行、拡張機能フレームワークの導入、認証の大幅強化、そして複数の非推奨機能を含む破壊的変更の集大成だ。
現在の仕様(2025-11-25)を使用しているMCPサーバー・クライアントは、この60日間の移行ウィンドウの中で対応が求められる。本記事では、全ての変更点を5つの柱に整理し、具体的な移行手順をコード例付きで解説する。
MCP 2026-07-28 の全体像
2026-07-28 RCの変更点は、以下の5つの柱に集約される。
- ステートレスコア(Stateless Core) — プロトコル基盤の抜本的再設計
- 運用性レイヤー(Operability Layer) — HTTPヘッダーによるルーティング・トレーシング
- 拡張機能フレームワーク(Extensions Framework) — MCP Apps・Tasks の正式化
- 認証強化(Authorization Hardening) — OAuth 2.1 への準拠
- 非推奨ポリシー(Deprecation Policy) — Roots/Sampling/Logging の代替戦略
MCPは2026年3月時点で月間9,700万ダウンロード、登録サーバー数5,800を超え、Anthropic・OpenAI・Google・Microsoft・AWSが主要アダプターとして参加するまでに成長している。この規模でのプロトコル改訂は、エコシステム全体に影響を与える。
1. ステートレスコア — 最も重要な破壊的変更
なぜステートレスなのか
MCPの当初の設計は、初期化ハンドシェイク(initialize/initialized)とセッションID(Mcp-Session-Id)に依存していた。これは「クライアントとサーバーが永続的な接続を張る」前提に基づいており、負荷分散、水平スケーリング、サーバーレス環境との相性が悪かった。
日本語コミュニティでも、この疑問は共有されていた。
MCPって単発のツール呼び出しのインターフェースを提供するだけなのに、なんでコネクション貼りっぱなしなんだ
before/after の移行パターン
2025-11-25(現在の実装):
import httpx
# 初期化ハンドシェイク
session_id = None
async with httpx.AsyncClient() as client:
# Step 1: initialize
resp = await client.post("https://mcp-server.example.com/mcp", json={
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {}
}
})
data = resp.json()
session_id = data["result"]["sessionId"]
# Step 2: initialized notification
await client.post("https://mcp-server.example.com/mcp", json={
"jsonrpc": "2.0",
"method": "notifications/initialized"
})
# Step 3: 以降は session_id をヘッダーに含めてリクエスト
resp = await client.post(
"https://mcp-server.example.com/mcp",
headers={"Mcp-Session-Id": session_id},
json={
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
)
2026-07-28(移行先):
import httpx
# ハンドシェイク不要。毎リクエスト自己完結
async with httpx.AsyncClient() as client:
resp = await client.post(
"https://mcp-server.example.com/mcp",
headers={
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tools/list",
},
json={
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {
"_meta": {
"protocolVersion": "2026-07-28",
"capabilities": {}
}
}
}
)
主な変更点の詳細
initialize/initialized廃止: プロトコルバージョンとクライアント情報は、毎リクエストの_metaフィールドに含めるMcp-Session-Id廃止: ステートレス化により、セッション固定(sticky session)が不要に。ラウンドロビンLBで負荷分散可能Mcp-Method/Mcp-Nameヘッダー: JSONボディをパースせずにルーティング可能に(CDN/LB/API Gatewayで活用)server/discover: オプショナルな新メソッド。initializeの役割の一部を代替- W3C Trace Context:
traceparent/tracestateが_metaでサポートされ、OpenTelemetryとの統合が標準化
Python SDK での移行例
SDK開発元(Anthropic, OpenMCP)は、2026-07-28 プロトコルバージョンを指定するだけでSDK側が自動対応するようアップデート中だ。
# FastMCP (OpenMCP) での移行例
from mcp import FastMCP
# サーバー側: プロトコルバージョン指定
mcp = FastMCP(
"My MCP Server",
protocol_version="2026-07-28" # 指定しない場合も自動検出
)
@mcp.tool()
def get_weather(city: str) -> str:
"""都市の天気を取得"""
return f"{city}の天気は晴れです"
2. Tasks 拡張への移行 — experimental → extension
MCP 2025-11-25 で実験的機能として提供されていた Tasks API は、2026-07-28 で正式な拡張機能(extension)として再設計される。
最も注意すべき変更: tasks/list の削除
セッションレス環境では「全タスクの一覧」を返す tasks/list が安全に実装できないため、削除される。タスク管理はサーバー主導で行われる。
Tasks の新しいライフサイクル:
- クライアントが
tools/callを実行 → サーバーがTaskHandleを返す - クライアントが
tasks/getで進捗確認 - クライアントが
tasks/cancelでキャンセル - サーバーが完了を通知(InputRequiredResult 経由で)
# 2026-07-28: Tasks 拡張を使った長時間処理の例
import httpx
async with httpx.AsyncClient() as client:
# ツール呼び出し → タスク生成
resp = await client.post(
"https://mcp-server.example.com/mcp",
headers={
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tools/call",
},
json={
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "long_running_analysis",
"arguments": {"dataset": "sales_2026"},
"_meta": {"protocolVersion": "2026-07-28"}
}
}
)
data = resp.json()
task_handle = data["result"]["taskHandle"]
# タスク進捗確認
status = await client.post(
"https://mcp-server.example.com/mcp",
headers={
"MCP-Protocol-Version": "2026-07-28",
"Mcp-Method": "tasks/get",
},
json={
"jsonrpc": "2.0",
"id": 2,
"method": "tasks/get",
"params": {"handle": task_handle}
}
)
3. トランスポート移行: SSE → Streamable HTTP
MCP のデフォルトトランスポートは、2026-07-28 より Streamable HTTP に移行する。SSE(Server-Sent Events)は非推奨にはならないものの、新規実装では Streamable HTTP が推奨される。
推奨パターン: デュアルスタック移行
既存のSSEサーバーを停止せず、両方のトランスポートを同時に提供するデュアルスタック移行が推奨されている。
# デュアルスタック MCP サーバーの例
from mcp import FastMCP
from mcp.transport import SSE, StreamableHTTP
mcp = FastMCP("My Server", protocol_version="2026-07-28")
# 両方のトランスポートを同時に提供
mcp.mount_transport(SSE(port=8000)) # 後方互換性用
mcp.mount_transport(StreamableHTTP(port=8001)) # 新プロトコル
@mcp.tool()
def search_docs(query: str) -> str:
return f"Searching for: {query}"
# クライアント側の接続確認
curl -s -X POST https://mcp-server.example.com:8001/mcp \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/list" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{"_meta":{"protocolVersion":"2026-07-28"}}}'
4. 認証・認可の強化: OAuth 2.1 準拠
2026-07-28 RC では、6つの SEP(Spec Enhancement Proposal)によってOAuth 2.1 / OpenID Connect への準拠が大幅に強化された。
主な変更:
| SEP | 内容 | 影響 |
|---|---|---|
| SEP-2468 | iss 検証(RFC 9207) |
mix-up攻撃防止。将来のバージョンでは iss 必須化 |
| SEP-837 | application_type 宣言 |
デスクトップ/CLIクライアントが誤って web 扱いされる問題を解消 |
| SEP-2352 | クレデンシャルのissuerバインディング | リソースが認証サーバー間を移行した際の再登録ルール |
| SEP-2207 | リフレッシュトークンのドキュメント | OIDCサーバーからの取得手順の明確化 |
| SEP-2350 | スコープ累積(step-up) | 段階的認可のスコープ設計ルール |
| SEP-2351 | .well-known ディスカバリー |
認証サーバーの動的発見 |
# OAuth 2.1 認証フローの例(Client ID Metadata Documents)
curl -s https://mcp-auth.example.com/.well-known/oauth-authorization-server \
-H "Accept: application/json"
# 応答例:
# {
# "issuer": "https://mcp-auth.example.com",
# "authorization_endpoint": "https://mcp-auth.example.com/authorize",
# "token_endpoint": "https://mcp-auth.example.com/token",
# "client_id_metadata_docs_supported": true
# }
5. 非推奨機能への対応: Roots / Sampling / Logging
SEP-2577 により、3つの機能が「注記上の非推奨(annotation-only deprecation)」となった。最低12ヶ月の移行期間が保証されているため、すぐに動作しなくなるわけではないが、新規開発では代替手段を使用すべきだ。
| 非推奨機能 | 代替手段 |
|---|---|
| Roots(クライアントのルート一覧) | ツールパラメータ、Resource URI、またはサーバー設定で明示的に指定 |
| Sampling(サーバー経由のLLM呼び出し) | LLMプロバイダAPI(Anthropic API / OpenAI API など)を直接呼び出し |
| Logging(プロトコル経由のログ) | stderr(stdio transport時)または OpenTelemetry |
6. その他の変更点
JSON Schema 2020-12
ツールの入力・出力スキーマが JSON Schema 2020-12 にアップグレードされた。従来のシンプルなスキーマ定義に加えて、allOf/anyOf/oneOf による複合型、$ref による参照、if/then/else による条件付きスキーマが利用可能になる。
# JSON Schema 2020-12 の新しい表現力
@mcp.tool()
def analyze_data(
dataset: str,
filters: dict | None = None,
aggregation: str = "sum"
) -> str:
"""
データ分析ツール
JSON Schema 2020-12 により、複合型の条件付きバリデーションが可能に
"""
pass
キャッシング(ttlMs / cacheScope)
Resource のリストや読み取り応答に、キャッシュの有効期間(ttlMs)とスコープ(cacheScope)を宣言できるようになった。HTTP Cache-Control に類似した概念で、CDNやAPI Gatewayでのキャッシュ戦略と連携可能。
MCP Apps(サーバーレンダリングUI)
SEP-1865 で定義された MCP Apps は、MCPサーバーが sandboxed iframe 内でインタラクティブなHTML UIを提供する仕組み。チャート、フォーム、管理画面などのUIを、AIエージェントのワークフローに直接埋め込める。
7. 移行チェックリスト
対応優先度の高い順にまとめる。
今すぐ対応すべき項目
-
initialize/initializedハンドシェイクを削除し、_metaフィールドに移行 -
Mcp-Session-Idヘッダーを削除し、毎リクエスト自己完結に変更 -
MCP-Protocol-Versionヘッダーを全リクエストに追加 - SDK のプロトコルバージョンを
2026-07-28に更新(SDK側の対応状況を確認)
計画的に対応すべき項目
- Tasks API を使用している場合、新しい Tasks 拡張に移行。
tasks/listの削除に注意 - Streamable HTTP トランスポートの追加(デュアルスタック推奨)
- OAuth 実装に
iss検証(RFC 9207)を追加 - Roots/Sampling/Logging の代替手段への移行計画を策定
余裕があれば対応
-
Mcp-Method/Mcp-Nameヘッダーの追加(SDKが自動対応する場合も多い) - JSON Schema 2020-12 へのスキーマアップグレード
- W3C Trace Context(OpenTelemetry統合)の導入
-
ttlMs/cacheScopeによるキャッシング戦略の設計
まとめ
MCP 2026-07-28 は、プロトコルが実験段階から本番運用段階へ移行するための必要な進化だ。ステートレス化により、スケーラビリティと運用性が大幅に向上する一方で、既存の実装には広範な修正が必要となる。
60日間の移行ウィンドウは一見長く思えるが、initialize ハンドシェイクの削除はアーキテクチャの根幹に影響する変更だ。デュアルスタック戦略で段階的に移行し、SDKのアップデートを活用しながら、計画的な対応をおすすめする。
MCP は Agentic AI Foundation(AAIF, Linux Foundation傘下)に移管され、Anthropic・Block・OpenAI が共同設立したオープンガバナンス体制で運用されている。今後の進化は mcp.directory の公式ブログおよび GitHub で追跡できる。
この記事はAIによって生成され、人間の編集を経て公開されています。 Appwright AI は AI によるコンテンツ制作の可能性を探求する実験的プロジェクトです。