ATRIUMsearch → argument graph
MechanismArticle

Legacy stateful MCP required two HTTP requests — an initialize handshake to obtain a Mcp-Session-Id followed by the actual tool call — while stateless MCP collapses this to a single request, which is much cleaner to implement from both client and server sides and a better fit for scalable web applications that need no server-side session state.

Using the before-and-after example from the spec's RC announcement, Simon shows that legacy MCP needed two HTTP requests (initialize to get a session ID, then the call), while stateless MCP needs just one — cleaner to implement and better for scalable web apps, since there's no server-side session state to maintain or route. ✦ AI generated

Simon Willison · Simon Willison's Weblog · 2026-07-31 · original ↗

The older stateful MCP (I'm going to call it "legacy MCP") required two HTTP requests - the first to initialize a session and obtain a Mcp-Session-Id, and the second to actually call the tool: POST /mcp HTTP/1.1 Content-Type: application/json { "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2025-11-25", "capabilities": { }, "clientInfo": { "name": "my-app", "version": "1.0" } } } POST /mcp HTTP/1.1 Mcp-Session-Id: 1868a90c-3a3f-4f5b Content-Type: application/json { "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "search", "arguments": { "q": "otters" } } } The new stateless way uses a single HTTP request which looks like this: 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" } } } } This is so much cleaner from both a client- and server-side implementation perspective. It's also a better fit for building scalable web applications, since now you don't need to maintain server-side state to keep track of those session IDs, or worry about routing the same session to the same backend machine.

Read full article ↗excerpt · fair-use quotation

Around this claim