MCP C# SDK 2.0 Makes HTTP Stateless by Default and Adds Multi Round-Trip Requests
Microsoft announced version 2.0 of the official MCP C# SDK, which implements the 2026-07-28 revision of the Model Context Protocol with stateless HTTP servers by default, standardised routing headers and Multi Round-Trip Requests. Releases 2.1 to 2.3 have since added hybrid session serving, a subsc

MCP ist ein offenes Protokoll, das standardisiert, wie Anwendungen Kontext und Tools an grosse Sprachmodelle liefern. Das C# SDK wird in Zusammenarbeit mit Microsoft gepflegt und baut auf ASP.NET Core auf. Das SDK-Team beschreibt die neue Spezifikationsrevision als die groesste seit dem Start des Protokolls, weil sie ueberdenkt, wie MCP ueber HTTP funktioniert.
Der Initialize-Handshake und der Mcp-Session-Id-Header entfallen. Protokollversion und Faehigkeiten werden nun mit jeder Anfrage uebertragen, sodass jede Serverinstanz jede Anfrage ohne Sticky Routing oder gemeinsame Session Stores verarbeiten kann. HttpServerTransportOptions.Stateless ist jetzt standardmaessig auf true gesetzt; Server, die Sessions benoetigen, stellen es auf false. Clients versuchen zuerst server/discover und greifen bei aelteren Servern auf den bisherigen Handshake zurueck. Nur fuer zustandsbehaftete Betriebe vorgesehene Optionen und die alten SSE-Endpunkte loesen nun die Warnungen MCP9006 und MCP9004 aus.
Eine tools/call-Anfrage enthaelt nun die Header Mcp-Method und Mcp-Name, und das Attribut [McpHeader] hebt einen Tool-Parameter zu einem Mcp-Param-*-Header hervor. Load Balancer und Gateways koennen dann anhand der Header routen, ohne den Body zu lesen. Der Body bleibt massgeblich: Bei einer Diskrepanz zwischen Header und Body gibt der Server einen HeaderMismatch-Fehler zurueck.
Die Zustandslosigkeit entfernt den Kanal, ueber den Server Clients waehrend eines Aufrufs um Eingaben bitten konnten. MRTR ersetzt ihn: Ein Tool wirft eine InputRequiredException mit einer oder mehreren Eingabeanfragen, erstellt mit InputRequest.ForElicitation, ForSampling oder ForRootsList, zuzueglich eines opaken requestState. Der Client sammelt die Antworten und wiederholt den Aufruf mit inputResponses.
McpClient macht dies automatisch, wenn entsprechende Handler registriert sind. Ueber zustandsbehaftete Sessions mit Clients der Version 2025-11-25 oder aelter ueberbrueckt das SDK zu den alten serverseitig initiierten Anfragen; bei zustandslosen aelteren Verbindungen erscheint die Anfrage als McpException. Die APIs fuer Roots, Sampling und Logging sind unter MCP9005 als veraltet markiert, in Anlehnung an SEP-2577.
Laut der Ankuendigung funktionieren die stabilen 1.x-APIs weiterhin. Die Ausnahme bildet Tasks, das in das Opt-in-Paket ModelContextProtocol.Extensions.Tasks verschoben wurde und mit der experimentellen Version in 1.3 und 1.4 inkompatibel ist. Ein experimentelles Paket ModelContextProtocol.Extensions.Apps deckt MCP Apps ab. Die Release Notes fuehren ausserdem ein strengeres OAuth-Verhalten auf: die Issuer-Validierung nach RFC 9207, verpflichtende Unterstuetzung fuer beworbenes PKCE S256 sowie einen abgeleiteten Anwendungstyp bei der dynamischen Client-Registrierung. Die Pakete richten sich an.NET 8, 9 und 10 sowie an.NET Standard 2.0.
Version 2.1 fuegte einen Opt-in-Handler subscriptions/listen fuer eigene serverseitige Benachrichtigungsstreams hinzu sowie einen Rueckgriff auf initialize, wenn server/discover auf HTTP-Ebene fehlschlaegt. Version 2.2 fuehrte HttpServerSessionMode ein, mit dem Clients der Revisionen 2025-11-25 und 2026-07-28 einen gemeinsamen Endpunkt nutzen koennen, und behob eine Ausnahme in McpHeaderEncoder.DecodeValue.
Version 2.3 machte McpClient.ServerInfo nullable, eine Source-Breaking-Change, da Server optionale Identitaetsmetadaten bei server/discover weglassen koennen; die Release Notes warnen davor, die selbst gemeldete Identitaet fuer Sicherheitsentscheidungen zu verwenden. Moderne Streamable-HTTP-Antworten warten nun mit dem Senden der Header, bis die erste Protokollnachricht vorliegt, sodass stumm laufende Langzeit-Handler moeglicherweise Fortschrittsausgaben oder einen laengeren HTTP-Timeout benoetigen. Weitere Aenderungen erhalten die Registrierungsreihenfolge beim Auflisten von Tools, Prompts und Ressourcen, fuehren McpClientOptions.TimeProvider fuer deterministische Timeout-Tests ein, schliessen OAuth von DiscoverProbeTimeout aus und schliessen den Input eines stdio-Servers, bevor auf ein kontrolliertes Beenden gewartet wird.
Eine Leserin oder ein Leser der Ankuendigung fragte, ob das Protokoll requestState gegen Manipulation oder Wiederverwendung ueber Sessions hinweg schuetzt; in den Kommentaren erschien keine Antwort.
Das Team erklaert, sein naechster Fokus liege auf End-to-End-Authentifizierung und Autorisierung. Das SDK ist auf NuGet verfuegbar, mit Dokumentation auf der Projektseite sowie Release Notes fuer 2.0, 2.1, 2.2 und 2.3 auf GitHub.
Praesentiert von: Martin Reynolds, Field CTO bei Harness, und Barani Mohandoss, Director, Cloud Governance, FinOps & E-Tools bei Trimble
Automatisch übersetzt. Das Original auf Englisch ist unten aufklappbar.
Original (Englisch) anzeigen
MCP is an open protocol that standardises how applications supply context and tools to large language models. The C# SDK is maintained in collaboration with Microsoft and builds on ASP.NET Core. The SDK team describes the new specification revision as the largest since the protocol launched, because it rethinks how MCP works over HTTP.
The initialize handshake and the Mcp-Session-Id header are gone. Protocol version and capabilities now travel with every request, so any server instance can handle any request without sticky routing or shared session stores. HttpServerTransportOptions.Stateless now defaults to true; servers that need sessions set it to false. Clients probe server/discover first and fall back to the legacy handshake for older servers. Stateful-only options and the legacy SSE endpoints now raise MCP9006 and MCP9004 warnings.
A tools/call request now carries Mcp-Method and Mcp-Name headers, and the [McpHeader] attribute promotes a tool parameter to an Mcp-Param-* header. Load balancers and gateways can then route on headers without reading the body. The body stays authoritative: a mismatched header makes the server return a HeaderMismatch error.
Statelessness removes the channel servers used to ask clients for input mid-call. MRTR replaces it: a tool throws InputRequiredException with one or more input requests, built with InputRequest.ForElicitation, ForSampling or ForRootsList, plus an opaque requestState. The client collects the answers and re-issues the call with inputResponses. McpClient does this automatically when handlers are registered. Over stateful sessions with 2025-11-25 or earlier clients, the SDK bridges to the old server-initiated requests; on stateless down-level connections the request surfaces as an McpException. Roots, sampling and logging APIs are deprecated under MCP9005, following SEP-2577.
According to the announcement, stable 1.x APIs keep working. The exception is Tasks, which moved to the opt-in ModelContextProtocol.Extensions.Tasks package and is incompatible with the experimental version in 1.3 and 1.4. An experimental ModelContextProtocol.Extensions.Apps package covers MCP Apps. The release notes also list stricter OAuth behaviour: RFC 9207 issuer validation, mandatory advertised PKCE S256 support, and an inferred application type in dynamic client registration. Packages target.NET 8, 9 and 10, plus.NET Standard 2.0.
Version 2.1 added an opt-in subscriptions/listen handler for custom server-side notification streams and a fallback to initialize when server/discover fails at the HTTP layer. Version 2.2 introduced HttpServerSessionMode, which lets clients using the 2025-11-25 and 2026-07-28 revisions share one endpoint, and fixed an exception in McpHeaderEncoder.DecodeValue.
Version 2.3 made McpClient.ServerInfo nullable, a source-breaking change because servers may omit optional identity metadata from server/discover; the notes warn against using self-reported identity for security decisions. Modern Streamable HTTP responses now wait for the first protocol message before sending headers, so silent long-running handlers may need progress output or a longer HTTP timeout. Other changes preserve registration order when listing tools, prompts and resources, expose McpClientOptions.TimeProvider for deterministic timeout tests, exclude OAuth from DiscoverProbeTimeout, and close a stdio server's input before waiting for graceful exit.
One reader of the announcement asked whether the protocol guards requestState against tampering or reuse across sessions; no reply appeared in the comments.
The team says its next focus is end-to-end authentication and authorisation. The SDK is available on NuGet, with documentation on the project site and release notes for 2.0, 2.1, 2.2 and 2.3 on GitHub.
Presented by: Martin Reynolds - Field CTO at Harness, and Barani Mohandoss - Director, Cloud Governance, FinOps & E-Tools at Trimble