Dev News Daily ENDE

MCP C# SDK 2.0 makes Streamable HTTP stateless by default

Microsoft shipped the stable 2.0 release of the official Model Context Protocol C# SDK, implementing the 28 July 2026 revision of the spec — the SDK team calls it the largest change since MCP launched. Streamable HTTP servers are now stateless by default. The initialize handshake and the Mcp-Session-Id header are gone; protocol version and capabilities travel with every request, so any server instance can serve any request without sticky routing or a shared session store. HttpServerTransportOptions.Stateless defaults to true, and servers that genuinely need sessions opt back out.

Statelessness removes the channel a server used to ask a client for input mid-call, so Multi Round-Trip Requests replace it: a tool throws InputRequiredException carrying one or more requests built with InputRequest.ForElicitation, ForSampling or ForRootsList plus an opaque requestState, and the client re-issues the call with the answers. Roots, sampling and logging APIs are deprecated. Three point releases, 2.1 to 2.3, followed through October; 2.3 made McpClient.ServerInfo nullable and warns against trusting a server's self-reported identity for security.

MCP C# SDK 2.0 makes Streamable HTTP stateless by default
MCP C# SDK 2.0 makes Streamable HTTP stateless by default — Dev News Daily

What it means

Stateless by default is the right trade for anyone running MCP behind a load balancer, which is most production deployments: no session affinity, no shared store, horizontal scaling that just works. The cost lands on tool authors. A tool that paused to ask the user something now has to model that as a thrown exception and a resumed call, and the old server-initiated path only survives as a compatibility bridge on stateful sessions. Worth noting too: one commenter asked whether requestState is protected against tampering or replay across sessions, and no answer appeared.

Written by Victoria Shinder.