
The MCP 2026-07-28 Spec Is Now Live: Three Things to Remove From Your Server and Two to Add
Chris Harper
2 min read
Jul 31, 2026 · 04:07 UTC
The MCP 2026-07-28 spec shipped July 28 — servers no longer need sessions, handshakes, or persistent connections, and can now deploy behind any load balancer or serverless function.
The July 25 RC preview covered what was coming. Here's what to actually change now that it's live.
Three things to remove
1. The initialize handshake. The initialize → initialized exchange is gone. No more session setup round-trip. Clients include protocol version and capabilities in the _meta block of every request, so your server gets all context it needs without stateful setup.
For FastMCP users — no server-side code changes needed here; the library handles it. The transport swap (below) is the key change.
2. Mcp-Session-Id headers. Remove any logic that reads or writes this header. Your server can now run as a stateless function — any instance in a cluster handles any request with no shared-state store.
3. Sampling callbacks. If your server used the sampling primitive to ask the client to call an LLM on its behalf, remove that path and call the model directly:
# Old: sampling request sent to client (deprecated)
# New: call the model yourself — no indirection needed
import anthropic
client = anthropic.Anthropic()
result = client.messages.create(
model="claude-opus-5-20260724",
messages=[{"role": "user", "content": your_prompt}]
)
Two things to add
1. Multi Round-Trip Requests (MRTR) for mid-execution confirmations. When a tool needs user approval (e.g., "delete 47 files?"), return resultType: "input_required" instead of blocking a persistent connection:
{
"resultType": "input_required",
"inputRequests": [{"id": "confirm-delete", "prompt": "Delete 47 files in /tmp?"}]
}
The client re-calls your tool with "inputResponses": [{"id": "confirm-delete", "value": "yes"}]. No stream kept open.
2. Mcp-Method and Mcp-Name headers on responses. Include these so gateways, WAFs, and CDNs can route and rate-limit without parsing the JSON payload.
Deploy anywhere now
# FastMCP: one-line switch from SSE to stateless streamable-HTTP
# Old: mcp.run(transport="sse")
mcp.run(transport="streamable-http")
No sticky sessions. No session affinity in your load balancer config. Serverless and edge deployments work cleanly with this single change.
What's still supported: Deprecated features (Roots, old Sampling, old Logging) get a 12-month migration window. Claude's support is rolling out — Claude.com connectors already use MCP Apps and enterprise-managed auth aligned with the new spec; CLI and API support follows.
Sources: MCP 2026-07-28 specification changelog — modelcontextprotocol.io · The 2026-07-28 Specification — MCP Blog · MCP 2026-07-28 spec: stateless core, coming to Claude — Anthropic