Keep unknown server and client capability keys - #3642
epistemedeus wants to merge 1 commit into
Conversation
ServerCapabilities and ClientCapabilities are not closed sets, but the wire sieve dropped keys such as a draft events object during server/discover. Allow extras on those models and still remove names that belong only to another schema era. Fixes modelcontextprotocol#3640
|
This PR has been closed automatically. It's still a draft, but we close those early so you don't put in more time only to have it closed the moment you mark it ready. This repo only keeps pull requests open when they come from a maintainer, or from a contributor a maintainer has assigned to the linked issue, and you aren't currently assigned to #3640. If a maintainer assigns you to #3640, this PR reopens on its own and there's nothing more you need to do here. Assignment is a maintainer call based on capacity; comments that only ask to be assigned don't factor in. What does help is engaging on the issue itself by confirming the repro, explaining why it matters for your use case, or describing the approach you'd take. You're welcome to keep pushing commits here (just avoid force-pushing, since GitHub can't reopen a rewritten branch), but that on its own won't get the PR reviewed or the issue assigned, and realistically most auto-closed PRs stay closed. There's no need to open a new PR either way. CONTRIBUTING.md has the full reasoning, but in short:
Maintainers: reopen, remove |
Fixes #3640
ServerCapabilitiesandClientCapabilitiesare documented as not a closed set, but the public models and the generated wire models useextra="ignore". An unknown key such as a drafteventsobject disappears inmodel_dumpand again inserialize_server_result, which is whatServerRunner._serializeruns forserver/discoverandinitialize.Unknown keys are now kept on those two capability models only. Nested known capability objects stay closed, so a bad
listChanged, a non-objectcapabilitiesvalue, or a malformedextensionsvalue still fails validation. After the surface dump,serialize_server_resultremoves only names that belong to the other schema era (taskson 2026-07-28,extensionsbefore it). This does not add aneventsfield and does not registerevents/*methods.Covered by
tests/issues/test_3640_open_capabilities.py: public model dumps, the discover and initialize sieve (including wire bytes), a streamable-HTTPserver/discoverresponse, and the in-process SDK client inautoandlegacymodes.AI assistance: this draft was prepared with Grok 4.7. It is not a request to merge. Under CONTRIBUTING.md an outside PR stays open only after a maintainer assigns the linked issue.