MCP 2026-07-28: Die zustandslose Spezifikation
Am 28. Juli 2026 hat das Model Context Protocol seine größte Revision seit dem Start festgeschrieben. Die Schlagzeile: MCP ist zustandslos. Der initialize-Handshake und der Mcp-Session-Id-Header sind weg; jede Anfrage trägt ihre eigene Identität in _meta; jede Serverinstanz hinter einem Load Balancer kann jeden Aufruf beantworten. Serverless MCP ist kein Workaround mehr — es ist die Form des Protokolls selbst.
- Was sich in der 2026-07-28-Spezifikation wirklich geändert hat — die vier Entfernungen und die vier Neuerungen, die zählen
- Multi Round-Trip Requests (MRTR): wie ein zustandsloser Server eine Rückfrage stellt, ohne eine Session zu halten
- Das Extensions-Framework und die beiden offiziellen Extensions: MCP Apps und Tasks
- Härtung der Autorisierung: OAuth 2.1, RFC-9207-iss-Validierung und was Dynamic Client Registration jetzt verlangt
- Ein konkreter Migrationspfad, der deine 2025-11-25-Clients nicht bricht — mit den SDK-Beta-Versionen, die du heute installieren kannst
Die Ein-Absatz-Version
Vorher: initialize-Handshake → Mcp-Session-Id-Cookie → klebriges Client/Server-Paar für die Session-Lebensdauer. Nachher: kein Handshake, keine Session-ID, keine Klebrigkeit. Client-Identität und -Capabilities reisen bei jeder Anfrage in einem _meta-Objekt. Eine neue server/discover-Methode ersetzt den initialen Capability-Austausch. Anwendungszustand — ein Warenkorb, ein laufender Task — lebt in Handles, die das Tool zurückgibt und die der Client beim nächsten Aufruf mitschickt, genau wie eine REST-Resource-ID. Diese eine Änderung ist es, die Serverless- und Edge-Deployment, echtes horizontales Skalieren und die Möglichkeit freischaltet, dass zwei konkurrierende Implementierungen hinter derselben URL sitzen können.
Was entfernt wurde
- Mcp-Session-Id-Header — und der gesamte Begriff einer Session auf Protokollebene
- initialize / initialized-Handshake — ersetzt durch _meta auf jeder Anfrage + server/discover on demand
- Roots, Sampling und Logging — deprecated. Roots: Pfade als Tool-Parameter übergeben. Sampling: LLM selbst aufrufen. Logging: stderr oder OpenTelemetry nutzen.
- tasks/list — sogar innerhalb der neuen Tasks-Extension entfernt, weil das Auflisten von Tasks ohne Session mandantenübergreifend leckt
Die Roots/Sampling/Logging-Deprecations treffen die meisten bestehenden Server tatsächlich. Alle drei setzten einen persistenten, bidirektionalen Server↔Client-Kanal voraus. In einer zustandslosen Welt besitzt der Client das LLM, die Pfade und die Log-Senke — der Server beantwortet nur den Tool-Aufruf.
Was hinzugekommen ist
- Ein zustandsloser RPC, den Clients aufrufen, wann immer sie wissen müssen, was ein Server anbietet. Ersetzt die Capabilities, die der alte Handshake früher zurückgab. Cache die Antwort mit den neuen ttlMs- / cacheScope-Feldern auf der Antwort selbst — die Spezifikation erbt HTTP-Cache-Control-Semantik.
- Mcp-Method und Mcp-Name (z. B. tools/call, search) erlauben einem Load Balancer, ohne JSON-RPC-Parsing zu routen. MCP-Protocol-Version ersetzt die Session als Versions-Verhandler.
- Die zustandslose Antwort auf Elicitation. Braucht ein Tool Input mitten in der Ausführung, gibt der Server ein InputRequiredResult zurück, das die Frage und einen opaken requestState-Blob trägt. Der Client feuert den Call erneut mit inputResponses plus dem zurückgespiegelten requestState — und jede Serverinstanz kann übernehmen.
- Reverse-DNS-namespaced, unabhängig versioniert, verhandelt über eine extensions-Capability-Map. Offizielle Extensions liefern zuerst: MCP Apps (sandboxed HTML-UIs, SEP-1865) und Tasks (langlaufende Operationen mit tasks/get, tasks/update, tasks/cancel; SEP-2663). Alles andere, was früher eine Änderung der Core-Spec verlangte, kommt jetzt als Extension.
- Tool-inputSchema und -outputSchema akzeptieren jetzt oneOf / anyOf / allOf, Konditionale und $ref. Wenn du dein Schema früher flach klopfen musstest, um in MCPs alte Teilmenge zu passen: hör auf damit.
- traceparent, tracestate und baggage reisen in _meta. Distributed Tracing über eine Client → Connector → Server-Kette funktioniert endlich Out-of-the-Box.
- Mindestens 12 Monate zwischen Active → Deprecated → Removed. Alles, was am 28. Juli 2026 deprecated wurde, funktioniert mindestens bis 28. Juli 2027, und die Entfernung braucht ihre eigene SEP.
Die eine JSON-Änderung, die jeden erwischt
Der Fehlercode für „Ressource fehlt“ ist von -32002 auf -32602 (Invalid Params) gewandert. Wenn dein Client irgendwo einen if (err.code === -32002)-Zweig hat, feuert er ab dem 28. Juli stillschweigend nicht mehr. Das ist der häufigste Integrationsbug im RC.
Vorher / Nachher
// VORHER (2025-11-25): zustandsbehafteter Handshake
POST /mcp { "method": "initialize", "params": { "capabilities": {...} } }
→ setzt Mcp-Session-Id: abc123
POST /mcp Mcp-Session-Id: abc123
{ "method": "tools/call", "params": { "name": "search", ... } }
// Der Server nimmt an, er „kennt“ dich wegen des Session-Cookies
// NACHHER (2026-07-28): selbstbeschreibende Anfrage
POST /mcp Mcp-Method: tools/call
Mcp-Name: search
MCP-Protocol-Version: 2026-07-28
{
"method": "tools/call",
"params": { "name": "search", "arguments": {...} },
"_meta": {
"clientInfo": { "name": "claude-code", "version": "..." },
"capabilities": { "extensions": { "com.anthropic.apps": "1" } },
"traceparent": "00-..."
}
}
// jede Instanz kann sie bedienen; keine Session, keine Klebrigkeit
Multi Round-Trip Requests, konkret
Der elegante Teil der Spec. Ein Server, der mitten in der Ausführung „welchen Kalender?“ fragen muss, muss keinen Socket offen halten. Er antwortet:
{
"resultType": "input_required",
"inputRequests": {
"calendarId": { "type": "string", "prompt": "Welchen Kalender?" }
},
"requestState": "base64(<opaker vom Server signierter Blob>)"
}
Der Client zeigt den Prompt an, sammelt inputResponses und feuert die ursprüngliche Anfrage mit beiden Feldern neu ab. Der Server behandelt requestState als autoritativ — oft signiert — und muss sich an den früheren Versuch gar nicht mehr erinnern. Das ist der ganze Trick hinter zustandsloser Elicitation: der Zustand reist auf der Leitung, nicht auf dem Server.
Die beiden offiziellen Extensions
- MCP Apps (SEP-1865): Ein Server kann ein HTML-UI liefern, das der Client in einem sandboxed iframe rendert. Jede Aktion im UI läuft weiter durch denselben JSON-RPC-Audit-Pfad wie ein normaler Tool-Call — keine Hintertür-Writes. Denk an interaktives Report + Confirm-before-Execute, nicht an beliebige Webseiten.
- Tasks (SEP-2663): Das Muster für langlaufende Operationen, neu gedacht für eine session-freie Welt. tools/call gibt ein Task-Handle zurück; der Client treibt tasks/get und tasks/update zum Pollen oder Streamen und tasks/cancel zum Abbrechen. tasks/list ist absichtlich weg — Tasks ohne Session aufzulisten ist ein mandantenübergreifendes Leck.
- Breaking Change: Das experimentelle Tasks-API von 2025-11-25 ist nicht kompatibel mit der neuen Extension. Wenn du dagegen geliefert hast, behandle die Migration als Neuschrift, nicht als Upgrade.
Autorisierung: das OAuth-Aufräumen
Die alte Spec war OAuth-ähnlich. Die neue ist OAuth 2.1 / OIDC-geformt:
- Clients müssen den
iss-Parameter auf Authorization-Responses nach RFC 9207 validieren — der Fix für die Mix-up-Angriffe, die früher dieses Jahr MCP-Server getroffen haben. - Dynamic Client Registration verlangt jetzt, dass Clients einen OpenID-Connect
application_typedeklarieren, damit ein Identity Provider unterschiedliche Regeln für native, Web- und Machine-Clients durchsetzen kann. - Refresh Tokens folgen dem standardmäßigen OIDC-Refresh-Flow — was bedeutet, dass Enterprise-SSO (Entra, Okta, PingID) zum ersten Mal ohne Custom Middleware funktioniert.
Praktisch gelesen: Wenn du Custom-OAuth-Klebstoff gebaut hast, um MCP an Okta anzupassen, kannst du das meiste davon löschen.
Beta heute installieren
Python — mcp v2.0.0b1 (ein Endpoint bedient beide Revisionen)
uv add "mcp[cli]==2.0.0b1" # oder pip install "mcp[cli]==2.0.0b1"
TypeScript — getrennte Pakete, explizites Opt-in für stateless
npm install @modelcontextprotocol/server@beta npm install @modelcontextprotocol/client@beta
Go — v1.7.0-pre.1
go get github.com/modelcontextprotocol/go-sdk@v1.7.0-pre.1
C# — v2.0.0-preview.1
dotnet add package ModelContextProtocol --prerelease
Kompatibilitätszusage des SDK-Teams: „Heute bricht nichts, und am 28. Juli bricht auch nichts.“ Neue Clients verhandeln automatisch zurück zum alten Handshake, wenn sie einen 2025-11-25-Server treffen; der Python-v2-Server beantwortet beide Revisionen aus demselben Endpoint standardmäßig; TypeScript und Go verlangen ein explizites Opt-in, um die zustandslose Variante freizulegen. TypeScript v1.x bekommt Bugfixes und Security-Updates für mindestens sechs Monate.
Migrations-Playbook
- Sie funktionieren noch bis 28. Juli 2027. Baue keine neuen Server dagegen. Für Pfade: nimm sie als Tool-Argumente an. Für LLM-Calls: nutze deinen eigenen Client. Für Logs: schreibe auf stderr und lass den Harness aggregieren.
- Wenn dein Server heute „der User steckt mitten im Checkout“ merkt, gib eine basket_id vom Tool-Call zurück und verlange sie beim nächsten. Zustand auf der Leitung, nicht im Speicher.
- Auch wenn du den alten Handshake vorerst behältst, ermöglicht das Ausliefern von server/discover 2026-07-28-Clients, initialize komplett zu überspringen. Das ist die eine Änderung, die Serverless freischaltet.
- Grep jede Codebase, die du besitzt, nach 32002. Das ist die stille Fehlerfalle der Migration.
- Sende clientInfo und capabilities in _meta bei jeder Anfrage. Propagiere traceparent gleich mit — du wirst die Traces beim ersten Prod-Problem wollen.
- MCP Apps lohnt sich, wenn ein UI eine Chat-Runde schlägt (Data-Grid-Bestätigungen, chart-getriebene Freigaben). Tasks lohnt sich, wenn eine Operation den HTTP-Idle-Timeout des Clients überschreiten könnte. Beides ist nicht kostenlos — beide vergrößern die Client-Oberfläche.
- Es wird nicht geupgradet. Schreibe gegen die Extension neu, halte den alten Endpoint während des Rollouts am Leben und entferne ihn nach deinem Zeitplan.
Gotchas, die Leute im RC tatsächlich treffen
- Sticky Load Balancers ‚funktionieren' noch — bis sie es nicht mehr tun. Ein zustandsloser Server hinter einem sticky LB sieht in Dev in Ordnung aus und zerschreddert die Cache-Trefferquote in Prod. Schalte Stickyness explizit ab.
- requestState ist opak für den Client — aber kein freier Speicher. Server, die ein halbes MB Kontext hineinpacken, sprengen den Client-Speicher. Signiere ein kleines Handle, den Rest server-seitig am Handle gehalten.
- MCP-Apps-iframes sind sandboxed, nicht sanitisiert. Ein bösartiger Server kann weiterhin alles exfiltrieren, was der User in sein UI tippt. Behandle eine MCP-App wie Third-Party-Code — allowliste, welche Server überhaupt UIs rendern dürfen.
- server/discover hat in der Basis-Spec keine Auth-Anforderung. Alles, was du dort auslegst, ist von jedem Client entdeckbar, der deine URL erreicht. Leg keine internen Tool-Metadaten dorthin.
- Das JSON-Schema-2020-12-Upgrade bedeutet: Clients, die einen Handroll-Validator gegen die alte Teilmenge geschrieben haben, können jetzt still zu wenig validieren. Nutze eine echte JSON-Schema-Bibliothek, keinen Handroll.
Wo das auf der AILmanac-Karte landet
- MCP & Verbinden mit Tools — der API-seitige Connector. Weiterhin aktuell; der Connector abstrahiert den Transport, sodass die Leitungsänderung für diese Request-Form unsichtbar ist. Nur die Server, mit denen der Connector spricht, migrieren.
- MCP in Claude Code — wie Claude Code MCP zu lokalen + Remote-Servern spricht. Das zustandslose Modell ist der Grund, warum du Claude Code endlich auf einen serverlosen MCP-Endpoint ohne merkwürdige Timeouts richten kannst.
- Die MCP-Token-Steuer — Deferred Loading ist der Token-seitige Hebel; das Extensions-Framework ist der Protokoll-seitige Hebel für dasselbe Problem.
- MCP-Server absichern — die NSA-MCP-Security-Guidance vom Mai 2026 und die Autorisierungs-Härtung des RC verstärken sich gegenseitig. Lies beides.
Schnellcheck
Check yourself
0/4Vokabular, das du diese Woche auf GitHub sehen wirst
Quellen & weiterführende Lektüre
- Der 2026-07-28-MCP-Specification-Release-Candidate — die primäre Ankündigung, mit Entfernungen, Ergänzungen und SEP-Liste.
- Beta-SDKs für den 2026-07-28-MCP-Spec-RC — Python, TypeScript, Go, C#-Beta-Versionen und die Rückwärtskompatibilitätszusage.
- MCP 2026-07-28 zu Claude bringen — Anthropics Rollout-Notiz für Claude und Claude Code.
- MCP 2026-07-28: Vom lokalen Tool zum verteilten Protokoll — der schärfste Third-Party-Migrations-Walkthrough.
- MCP ist zustandslos geworden — was die 2026-Spec am Skalieren ändert — Microsofts Perspektive auf zustandsloses MCP auf App Service.
- MCP wird zustandslos. Was das bedeutet — Arcade.devs Praktikersicht, nützlich für die Ops-Implikationen.
- NSA CSI: MCP-Sicherheits-Designüberlegungen (PDF) — NSAs Härtungs-Guidance vom Mai 2026. Paare mit den Autorisierungsänderungen dieser Spec.