Six weeks ago I argued that MCP configs were a fresh attack surface and that the protocol's auth story was an implementation detail every enterprise was rebuilding from scratch. The 2026-07-28 release candidate, locked May 21, addresses the protocol half of that problem.
The most visible change is that MCP is now stateless at the protocol layer. The initialize/initialized handshake is gone (SEP-2575). The Mcp-Session-Id header is gone (SEP-2567). Protocol version and client capabilities now travel in _meta on every request. A stateless MCP server can sit behind a plain round-robin load balancer with no sticky sessions and no shared session store. This is the change ops teams wanted.
The deeper change is the authorization hardening. A series of authorization-focused SEPs align MCP with OAuth 2.0 and OpenID Connect. Clients must validate the iss parameter per RFC 9207 [3] (SEP-2468). Clients now declare their OIDC application_type during Dynamic Client Registration (SEP-837), avoiding the common failure mode where CLI clients are treated as web apps and localhost redirect URIs are rejected. Registered credentials are bound to the issuing authorization server (SEP-2352). This standardizes the enterprise deployment model many teams had already built around MCP, including the registry-layer assumptions from B2.
Tasks moved out of the core to an extension. MCP Apps (SEP-1865) lets servers ship sandboxed HTML UIs that can route actions through the same audit and consent flow as direct tool calls. A formal feature lifecycle (SEP-2577) requires twelve months between deprecation and removal.
What didn't change: the config files on disk. The protocol hardens transport and authorization. It doesn't touch ~/.claude, ~/.cursor, ~/.codex, or the project-scoped .cursor/mcp.json and .vscode/mcp.json files that often hold long-lived tokens for every system an agent touches. The Bitwarden CLI harvester from April still works in the new world. The protocol grew up. The local credential surface still hasn't.
If you build on MCP, the migration window was the ten weeks between this piece and final publication on July 28. (Update, 2026-09-23: that window has closed; what follows is preserved as a dated read of the candidate spec.) The wire format changes are substantial enough that compatibility testing should start now. For production operators, the stateless transport and OAuth alignment are worth the effort. For security teams, the trust boundary thesis still holds: most of securing an agent is everything around the agent, and the configs on disk remain the part nobody has fixed.
The Wire-Level Diff
The 2025-11-25 spec required a handshake before any tool call. Each connection opened with an initialize request, the server responded with capabilities, and an Mcp-Session-Id header tracked the session across subsequent requests. Horizontal deployment required either sticky routing at the load balancer or a shared session store.
The 2026-07-28 release candidate replaces that with a single self-contained request shape:
POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search",
"arguments": {
"q": "otters"
},
"_meta": {
"io.modelcontextprotocol/clientInfo": {
"name": "my-app",
"version": "1.0"
}
}
}
}
Three things follow from this. First, any MCP request can land on any server instance. Second, the new Mcp-Method and Mcp-Name headers enable routing, filtering, and observability decisions without JSON body inspection. Third, list and resource-read results now carry ttlMs and cacheScope, so clients can cache tools/list responses for as long as the server permits.
Three core features are deprecated under the lifecycle policy: Logging (replaced by stderr for stdio transports and OpenTelemetry for structured observability), Roots (replaced by tool parameters, resource URIs, or server configuration), and Sampling (replaced by direct LLM provider integration). All three keep working for at least twelve months.
See also
- Your MCP Configs Are an Attack Surface Now - the April 2026 Bitwarden CLI harvester that explicitly targeted MCP configs
- MCP Servers Have an npm Problem - the registry-layer security gap that the new spec does not address
- Most of Building an Agent Isn't the Agent - the trust-boundary frame this protocol revision sits inside
References
- The 2026-07-28 MCP Specification Release Candidate, David Soria Parra and Den Delimarsky, modelcontextprotocol.io, 2026-05-22.
- Why MCP 2026-07-28 Spec Drops Sessions and Goes Stateless, DEV Community, 2026-05-25.
- RFC 9207: OAuth 2.0 Authorization Server Issuer Identification.