[Schema][Server] Close the 2026-07-28 conformance gaps - #3
Conversation
ddf2518 to
a721561
Compare
Squashed WIP: the modern (SEP-2575) stateless lifecycle end to end - server dispatcher, per-era wire codec, standard header validation, multi round-trip requests, subscriptions, cache policy, the generic extensions framework, and a client that speaks it. Tasks (SEP-2663) is carved out to modelcontextprotocol#428. To be decomposed before review.
a721561 to
87b40ce
Compare
|
Closing: this was a tracking PR for the 2026-07-28 audit, and the work has all landed or moved on. Rebasing the branch onto current
The report's §3 open items are the only thing outliving the branch, and each has an upstream home: MCP Apps ergonomics (modelcontextprotocol#351/modelcontextprotocol#352), the auth findings (five of the seven Branch tips, if any of this needs to come back: pre-rebase |
Stacked on
feature/2026-07-28(#2). Closes the gaps an audit of the branch againstschema/2026-07-28/schema.tsand the 2026-07-28 spec docs turned up.Full findings, evidence and what is left:
spec-report.md.Bugs
ClientGateway's sixsupports*()probes returnedfalsefor every stateless request — the session key they read is only written byInitializeHandlerresources/subscribe/resources/unsubscribestill dispatched and answered200 OKMcp-Namecompared without Base64-sentinel decoding, refusing any non-ASCII resource URI with-32020MCP-Protocol-Versionheader was accepted-32002emitted where the revision forbids it; unknown tool answered-32601"id": ""instead of202read(), truncating chunked transfers into-32700-32021only reachable fromtools/callFeatures
logLevelwork; the stream opens after the handler's first suspension so-32021/-32602keep their required statuses.subscriptions/listendelivery —NotificationBusInterfacewith in-memory and PSR-16 implementations; PHP-FPM needs the latter, since publisher and stream are different workers.tasks/*surface, capability gating.CachePolicy, W3C trace context,x-mcp-headernesting + validation,$refSSRF and composition-DoS bounds, SEP-2577 deprecation tags.docs/stateless-lifecycle.mdand anexamples/server/stateless-lifecycleexample.Verification
make conformance-draft-servermake conformance-serverThe nine
tasks-*conformance scenarios run at 36/44 — every remaining failure is the runner applying thecore schema to an extension result, which has no
resultType: "task".The Inspector cannot drive a 2026-07-28 server (it opens with
initialize), so the new example is covered bytests/Integration/StatelessLifecycleTest.phpover real HTTP instead. MCP Apps did get snapshots — whichsurfaced that its example was broken over HTTP entirely, the only one without a session store.
Worth a look
prompts/getandtools/callfor unknownnames). Marked
[BC Break]; the spec has said-32602since 2025-06-18. Onlyresources/readisversion-gated.
2026-07-28auth items arerules for an OAuth client this SDK does not have yet ([Client] Add OAuth 2.0 credential storage interface (TokenStorageInterface) modelcontextprotocol/php-sdk#315–[Client] Implement Cross-App Access (token exchange, RFC 8693) modelcontextprotocol/php-sdk#325). [Server][Auth] SEP-2207: Audit PRM to ensure offline_access is not advertised as a required scope modelcontextprotocol/php-sdk#364 had nothing to fix and is pinned
by test. See §3.2 of the report.