Conversation
This commit implements the extensions framework as outlined in SEP-1724, allowing optional, composable extensions to the MCP protocol. Changes: - Add extensions field to ClientCapabilities and ServerCapabilities - Add extension negotiation section to lifecycle documentation - Add extensions overview to architecture documentation - Create /extensions page with Overview and Registry subpages - Document extension types (Official, Recommended, Unofficial) - Document extension identifier format and vendor prefix reservation rules - Add examples showing extension negotiation in initialize request/response - Link ext-auth repository and its OAuth 2.0 and Enterprise-Managed Authorization extensions in registry The extensions field is nested within capabilities and follows the same vendor prefix reservation rules as _meta fields. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
| /** | ||
| * Optional extensions that the client supports. | ||
| * | ||
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | ||
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | ||
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | ||
| * | ||
| * Values are optional configuration objects specific to each extension. | ||
| * | ||
| * Examples: | ||
| * - `modelcontextprotocol.io/official-extension` | ||
| * - `example.com/custom-extension` | ||
| * | ||
| * An empty object `{}` indicates support without additional configuration. | ||
| */ | ||
| extensions?: { [key: string]: object }; |
There was a problem hiding this comment.
I really like including all this documentation in the TypeDoc, but it would be nice to deduplicate between ClientCapabilities and ServerCapabilities.
schema/draft/schema.ts
Outdated
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | ||
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | ||
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | ||
| * | ||
| * Values are optional configuration objects specific to each extension. | ||
| * | ||
| * Examples: | ||
| * - `modelcontextprotocol.io/official-extension` | ||
| * - `example.com/custom-extension` | ||
| * | ||
| * An empty object `{}` indicates support without additional configuration. |
There was a problem hiding this comment.
Seems like the grouping should be:
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | |
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | |
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | |
| * | |
| * Values are optional configuration objects specific to each extension. | |
| * | |
| * Examples: | |
| * - `modelcontextprotocol.io/official-extension` | |
| * - `example.com/custom-extension` | |
| * | |
| * An empty object `{}` indicates support without additional configuration. | |
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | |
| * The vendor-prefix follows the same format and reservation rules as prefixes in `_meta`. | |
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | |
| * | |
| * Examples: | |
| * - `modelcontextprotocol.io/official-extension` | |
| * - `example.com/custom-extension` | |
| * | |
| * Values are optional configuration objects specific to each extension. | |
| * An empty object `{}` indicates support without additional configuration. |
schema/draft/schema.ts
Outdated
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | ||
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | ||
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | ||
| * | ||
| * Values are optional configuration objects specific to each extension. | ||
| * | ||
| * Examples: | ||
| * - `modelcontextprotocol.io/official-extension` | ||
| * - `example.com/custom-extension` | ||
| * | ||
| * An empty object `{}` indicates support without additional configuration. |
There was a problem hiding this comment.
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | |
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | |
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | |
| * | |
| * Values are optional configuration objects specific to each extension. | |
| * | |
| * Examples: | |
| * - `modelcontextprotocol.io/official-extension` | |
| * - `example.com/custom-extension` | |
| * | |
| * An empty object `{}` indicates support without additional configuration. | |
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | |
| * The vendor-prefix follows the same format and reservation rules as prefixes in `_meta`. | |
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. | |
| * | |
| * Examples: | |
| * - `modelcontextprotocol.io/official-extension` | |
| * - `example.com/custom-extension` | |
| * | |
| * Values are optional configuration objects specific to each extension. | |
| * An empty object `{}` indicates support without additional configuration. |
| * | ||
| * Keys are extension identifiers in the format `{vendor-prefix}/{extension-name}`. | ||
| * The vendor-prefix follows the same format and reservation rules as prefixes in _meta. | ||
| * Prefixes containing `modelcontextprotocol` or `mcp` are reserved for MCP use. |
There was a problem hiding this comment.
Does this need to be more specific? Or do we just want to delegate explanation to the _meta documentation?
Or perhaps it would be better to factor out "reserved key" documentation, and point both _meta and extensions at that.
docs/extensions/index.mdx
Outdated
|
|
||
| ## What are Extensions? | ||
|
|
||
| Extensions allow the MCP ecosystem to evolve and experiment with new capabilities while maintaining core protocol stability. An extension is appropriate when: |
There was a problem hiding this comment.
My interpretation is that extensions are not necessarily for experimentation. They can serve a certain domain. For example MCP-UI might be an extension that is only for clients that support HTML rendering. The Financial Services Interest Group would define an extension that is only applicable to MCP clients in the financial sector. These are more than just mere experimentations.
There was a problem hiding this comment.
The intention was for these to be an "or" (i.e. experimental and/or scoped, rather than both) - does that make sense? Or you don't feel extensions should be used for experimental features at all?
| Extensions allow the MCP ecosystem to evolve and experiment with new capabilities while maintaining core protocol stability. An extension is appropriate when: | ||
|
|
||
| - **Experimental** - There is sufficient uncertainty about an approach that would make it premature for the core specification | ||
| - **Scoped** - The functionality is useful to a significant subset of users (e.g., specific industries or use cases) but may not be broadly applicable |
There was a problem hiding this comment.
II feel this is more important than experimentation. I think the protocol has enough facilities for experimentation already.
| - `modelcontextprotocol.io/official-extension` (official) | ||
| - `example.com/custom-extension` (recommended or unofficial) | ||
| - `mycompany.io/proprietary-feature` (unofficial) |
There was a problem hiding this comment.
At this point we should probably define this label mechanism with a reverse-dns name as a prefix in a central way. This is not necessarily part of this SEP, but we should do this, given it shows up everywhere now.
There was a problem hiding this comment.
There's a separate PR for that. Will update if/when that is accepted.
|
|
||
| ## Extension Negotiation | ||
|
|
||
| Extensions are negotiated during the MCP initialization phase through the `extensions` field within capabilities in the initialize request and response. |
There was a problem hiding this comment.
One of the interesting pieces here is seeing if extensions will require versioning as well. This could explode the complexity in negotiation. Curious what you think.
There was a problem hiding this comment.
The SEP does not specify anything about versioning and version negotiation of extensions to keep things simple. Extensions may choose to speicfy that if they like (and they could implement using the per-extention capabilities). I agree that trying to specify this in a general way could be complex, which is why I've avoided it in this intentionally lightweight SEP, but the capabilities struct does provide some mechanisms if individual extensions need it.
docs/extensions/index.mdx
Outdated
| } | ||
| ``` | ||
|
|
||
| ### Extension Configuration |
There was a problem hiding this comment.
We don't allow configuration in MCP in-band via the protocol. This was a deliberate choice and learning from LSP. I do believe this remains true for extensions.
There was a problem hiding this comment.
Mabye "configuration" is the wrong name here, it's more capabilities within the extension that you can use similar to existing core capabilities, but scoped to extensions. I'll rename to capabilities.
|
|
||
| See the [SEP guidelines](/community/sep-guidelines) for detailed information about the SEP process and the extension governance model. | ||
|
|
||
| ## Extension Governance |
There was a problem hiding this comment.
This needs to go into detail on governance requirements for externally maintained extensions.
| | Type | Description | Governance | | ||
| | --------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | ||
| | **Official** | Maintained in MCP GitHub organization under `ext-` prefixed repositories | Core maintainer review and approval required | | ||
| | **Recommended** | Community-developed extensions that are vetted by core maintainers and listed in the [registry](/extensions/registry) | Listed after review | |
There was a problem hiding this comment.
If we have extensions that are maintained outside of the MCP organisation, we need to have a set of criteria or at least a lifecycle, to determine how we add and most importantly, remove recommendations for extensions. We need a set of minimum standard required in terms of licenses, usage, trademarks, etc.
Co-authored-by: Jonathan Hefner <jonathan@hefner.pro>
Co-authored-by: Jonathan Hefner <jonathan@hefner.pro>
|
Replacing with #2133 |
Specification of #1724 (pending acceptance).
Changes:
Motivation and Context
Implementing SEP.
How Has This Been Tested?
Local docs generation / manual read.
Breaking Changes
N/A
Types of changes
Checklist