Transport History: From SSE to Streamable HTTP

▶ Watch (1:51)

MCP launched in 2024 with two transports. Standard IO worked for local servers like VS Code. HTTP plus SSE kept an open stream for every client connection. A server with thousands of clients needed thousands of open network connections. Streamable HTTP replaced it in early 2025. It assigned session IDs and closed streams between requests. But horizontal scaling broke: a load balancer could route initialization to one server and a tool call to another. Session IDs were optional in the spec, so SDKs created an unofficial stateless mode that dropped the handshake entirely.

Why Stateless Mode Broke Elicitation

▶ Watch (3:52)

Without session IDs, a server could not correlate tool calls with earlier initialization. The stateless mode worked for simple requests but failed for server-to-client communications like elicitation and sampling. In the delete folder example, the server needed to ask the client for user confirmation. The tool call arrived on one server, and the confirmation response could land on another. The old SDKs had no built-in way to handle this without sticky routing or a message broker. The upcoming June 2026 spec introduces MRTR (multi-round trip requests) to fix this.

MRTR: Stateless Requests That Support Elicitation

▶ Watch (9:33)

With MRTR, a server never holds a stream open. When a tool call needs elicitation, the server ends the request and tells the client to resend the same request with the confirmation included. The client asks the user, then retries. Each HTTP request is independent. A load balancer can route each attempt to any server without state loss. The trade-off: tool functions now rerun on each retry. The example of a delete folder tool re-listed files every time the function restarted. A compatibility layer in the SDK hides this for single-server deployments but not for horizontally scaled ones.

What Else Changes in V2 SDKs

▶ Watch (14:16)

The Python SDK was already breaking for transport changes. Renaming FastMCP to MCPServer avoids confusion with the external FastMCP package. The low-level server replaces magic decorators with explicit handler definitions, improving type safety. Pluggable transports become possible through a dispatcher pattern that separates the MCP types, JSON-RPC wire format, and transport layer. Currently only streamable HTTP and standard IO exist. The design allows WebSocket, gRPC, or Telnet transports. Draft PR 2320 on the Python SDK repo shows the approach. Auth is also being reworked to support proxies and gateways.

Testing the Migration Guide with Claude Agents

▶ Watch (18:30)

Isbey built an evaluation framework to test the migration guide before release. Eight V1 code scenarios were given to Claude agents along with the guide. Three runs per scenario. The agents logged when the guide missed a change. One example: the guide did not specify that camelCase had changed to snake_case. Seven of eight scenarios caught that. In scenario six, all upgrades failed because the verification script itself had a bug. Each agent reported the bug. Out of 21 runs, the feedback led to multiple documentation fixes. The same evaluation is being applied to the TypeScript SDK.

Q&A

What happens when the user says no during elicitation? The function checks the confirmation flag and exits early. The first retry can detect a denial before running side effects. ▶ Watch (23:32)

When will session state be removed from MCP? Core maintainers are discussing making sessions an extension rather than a core concept. Notifications like tool change may be removed or moved. ▶ Watch (24:28)

How to handle an agent that calls another agent with MRTR? The function must not keep state between calls. Store data in the incomplete result object or a database, similar to patterns for horizontally scaled web services. ▶ Watch (26:11)

Notable Quotes

“the problem is how do you actually know this documentation is any good?” Max Isbey · ▶ Watch (18:56)

“we might as well break a few other things” Max Isbey · ▶ Watch (14:29)

“one of the foot guns that comes with this new format” Max Isbey · ▶ Watch (12:25)

“if you had a server with thousands of clients, you then had to have thousands of network connections open at all times.” Max Isbey · ▶ Watch (3:28)

“the specification says that session IDs, which streamable HTTP brought in, are optional and don’t need to be set.” Max Isbey · ▶ Watch (8:35)

Key Takeaways

  • MCP V2 introduces MRTR to replace stateful SSE, enabling stateless horizontal scaling.
  • The Python SDK renames FastMCP to MCPServer and replaces decorators with explicit handlers.
  • An evaluation framework using Claude agents tests migration guide completeness across eight V1 scenarios.

About the Speaker

Max Isbey is a software engineer from New Zealand, previously at Rocket Lab designing and maintaining telemetry and command systems for rockets and satellites. He now works at Anthropic maintaining the MCP Python SDK.