WHY this matters
If you're building MCP servers or clients, the initialize handshake is gone. Every request now self-describes its version and capabilities in _meta. This is a breaking protocol change for anyone targeting modern MCP.
The big ones
- 🔥
initialize handshake removed — every request carries _meta.protocolVersion + clientCapabilities
- 🔥
server/discover is now mandatory — servers MUST advertise capabilities via this RPC
- 🔥
Mcp-Session-Id header gone — stateless HTTP only
- ⚠️
subscriptions/listen replaces resources/subscribe — single long-lived POST stream
- ⚠️ Tasks moved to extension —
io.modelcontextprotocol/tasks, no more blocking tasks/result
- 💀 Removed RPCs:
ping, logging/setLevel, notifications/roots/list_changed
- ✨ Extension system added — vendor-prefixed IDs for optional capabilities
Terminology
- Modern = 2026-07-28+: per-request metadata
- Legacy = 2025-11-25 and earlier: initialize handshake
- Dual-era = supports both
Reference
Docs PR: thevibeworks/claude-code-docs#1017
Spec: content/mcp/specification/
cc @lroolle — this is the real deal for MCP builders
WHY this matters
If you're building MCP servers or clients, the initialize handshake is gone. Every request now self-describes its version and capabilities in
_meta. This is a breaking protocol change for anyone targeting modern MCP.The big ones
initializehandshake removed — every request carries_meta.protocolVersion+clientCapabilitiesserver/discoveris now mandatory — servers MUST advertise capabilities via this RPCMcp-Session-Idheader gone — stateless HTTP onlysubscriptions/listenreplacesresources/subscribe— single long-lived POST streamio.modelcontextprotocol/tasks, no more blockingtasks/resultping,logging/setLevel,notifications/roots/list_changedTerminology
Reference
Docs PR: thevibeworks/claude-code-docs#1017
Spec:
content/mcp/specification/cc @lroolle — this is the real deal for MCP builders