Skip to content

docs: clarify extension negotiation for initialization-based versions - #3364

Open
sambhav wants to merge 4 commits into
modelcontextprotocol:mainfrom
sambhav:docs/legacy-extension-negotiation
Open

sambhav wants to merge 4 commits into
modelcontextprotocol:mainfrom
sambhav:docs/legacy-extension-negotiation

Conversation

@sambhav

@sambhav sambhav commented Sep 15, 2026 •

Copy link
Copy Markdown
Member

The Extensions Overview now shows only the per-request capability flow for 2026-07-28 and later. Readers using 2025-11-25 cannot readily find the initialize negotiation flow or understand why extensions is absent from that version's capability schemas.

This adds:

  • A version signpost and 2025-11-25 initialize request/response examples to the overview, following SEP-2133.
  • A short Extension Negotiation section in the 2025-11-25 lifecycle page linking to those examples.
  • Clarification that extensions is optional, defined by SEP-2133, and absent from the older published schemas; SDK and extension compatibility still need to be checked.

Addresses the gap raised by Yousef and Cliff in the Skills over MCP WG discussion. This is a documentation clarification; no schema or protocol behavior changes.

SDK compatibility

Audit of official SDK default branches on 2026-09-15, pinned below. This checks carrying capabilities.extensions through the legacy handshake, not support for every extension or every published SDK release. Findings are from source inspection; the Python serialization loss was reproduced locally.

SDK Legacy initialize Evidence
TypeScript Yes Legacy runtime schemas preserve extensions on both sides.
Go Yes Explicit Extensions maps carried by initialization.
C# Yes Explicit properties; initialization preserves them.
Rust Yes Both capability structs serialize extension maps.
Kotlin Yes Explicit maps, with initialization builder tests.
Ruby Yes Client capability hashes and server support_extensions.
PHP Yes Capability models preserve extensions through initialization.
Python Partial Client advertisements survive; server response serialization drops the map.
Java No native support Capability records lack the field and ignore unknown properties.
Swift No native support Client/server capability structs lack the field or catch-all storage.

Python's serialize_server_result("initialize", version, ...) removes capabilities.extensions for all four supported legacy versions, including 2025-11-25, despite the public model exposing it.

Existing use before 2026-07-28

  • Apps: Shipped on 2026-01-26. Its stable specification explicitly advertises io.modelcontextprotocol/ui through initialize, even showing protocol version 2024-11-05. This is direct precedent for the documentation clarification.
  • Auth: Client Credentials and Enterprise-Managed Authorization were introduced with the November 2025 release. Their auth flows also use OAuth metadata before MCP initialization, so their existence alone does not establish support for the extensions capability field in every SDK.
  • Tasks: Introduced experimentally in 2025-11-25, using capabilities.tasks. SEP-2663 subsequently moved and redesigned it as an extension. Earlier Tasks use is not evidence that today's io.modelcontextprotocol/tasks wire format works on legacy connections.

Suggested next steps

  1. Merge the documentation clarification, retaining the SDK/extension compatibility caveat.
  2. Decide whether to add an explicit optional extensions field to the legacy schemas as an additive erratum; until then, identify SEP-2133 as its definition.
  3. Follow up with the Python SDK on the serialization loss and Java/Swift on native field support. Add client/server initialization round-trip tests, then verify released SDK versions before publishing a release-level support matrix.
  4. Have extension maintainers state supported core protocol versions and migration behavior explicitly, especially for Tasks.

Validation: npm run prep completed successfully using a local shell adapter to run tsx scripts via node --import tsx because the environment blocks the CLI's IPC socket. Repository scripts are unchanged. Mintlify found no broken links. Both edited pages parse as MDX, both added JSON examples validate against the 2025-11-25 schema, added links/fragments resolve locally, and git diff --check passes. The initial CLI installation emitted dependency deprecation warnings.

AI assistance: Codex prepared and validated this change at Sambhav's request.

@sambhav
sambhav requested review from a team as code owners September 15, 2026 17:02
tools)
- `subscribe`: Support for subscribing to individual items' changes (resources only)

#### Extension Negotiation

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm a bit uncertain on whether or not SEP-2133 actually meaningfully applies to the 2025-11-25 spec; it was merged after the spec finalized, but was also clearly intended to work with as early as the 6/18 spec. Tagging @pja-ant on this one

@YousefHaggy YousefHaggy Sep 29, 2026 •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pja-ant @LucaButBoring I would hope it applies to the 2025-11-25 spec. At a point in the time, the extensions doc page already showed extension support via the old negotiation pattern

Majority of SDKs already support extensions negotiation in 2025-11-25, and it's a single field addition for those that do not

Comment on lines +214 to +216
Clients and servers can also advertise optional [extensions](/extensions/overview) in `capabilities.extensions` in the `initialize` request and response. This field is defined by [SEP-2133](/seps/2133-extensions#negotiation), although it is absent from this version's published `ClientCapabilities` and `ServerCapabilities` schemas. Extension support is not required for core protocol conformance.

See [extension negotiation for initialization-based versions](/extensions/overview#initialization-based-versions) for examples and SDK compatibility considerations.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

imo we shouldn't link to the reference-level docs from the spec

@pja-ant

pja-ant commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

This is a documentation clarification; no schema or protocol behavior changes.

Isn't it? Doesn't this add extensions to the 2025-11-25 schema?

I'm ok with this in practice, though not sure how I feel about retroactively changing released spec versions. Would be more comfortable with no spec changes and maybe just say something like "while extensions weren't officially part of the protocol until 2026-07-28, many SDKs and clients/servers offer extensions on 2025-11-25 using initialize". It's kind of similar to how most SDKs had an unofficial stateless mode prior to 2026-07-28.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants