Skip to content

SEP-1761: Add MCP extensions framework#1761

Closed
pja-ant wants to merge 16 commits intomainfrom
sep-1724-add-extensions-framework
Closed

SEP-1761: Add MCP extensions framework#1761
pja-ant wants to merge 16 commits intomainfrom
sep-1724-add-extensions-framework

Conversation

@pja-ant
Copy link
Contributor

@pja-ant pja-ant commented Nov 3, 2025

Specification of #1724 (pending acceptance).

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
  • Link ext-auth repository and its OAuth 2.0 and Enterprise-Managed Authorization extensions in registry

Motivation and Context

Implementing SEP.

How Has This Been Tested?

Local docs generation / manual read.

Breaking Changes

N/A

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

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>
@pja-ant pja-ant mentioned this pull request Nov 3, 2025
Copy link
Member

@jonathanhefner jonathanhefner left a comment

Choose a reason for hiding this comment

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

Nice! 😄

Comment on lines 223 to 238
/**
* 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 };
Copy link
Member

Choose a reason for hiding this comment

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

I really like including all this documentation in the TypeDoc, but it would be nice to deduplicate between ClientCapabilities and ServerCapabilities.

Comment on lines 226 to 236
* 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.
Copy link
Member

Choose a reason for hiding this comment

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

Seems like the grouping should be:

Suggested change
* 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.

Comment on lines 269 to 279
* 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.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
* 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.
Copy link
Member

Choose a reason for hiding this comment

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

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.


## 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:
Copy link
Member

Choose a reason for hiding this comment

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

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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
Copy link
Member

Choose a reason for hiding this comment

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

II feel this is more important than experimentation. I think the protocol has enough facilities for experimentation already.

Comment on lines +63 to +65
- `modelcontextprotocol.io/official-extension` (official)
- `example.com/custom-extension` (recommended or unofficial)
- `mycompany.io/proprietary-feature` (unofficial)
Copy link
Member

Choose a reason for hiding this comment

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

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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.
Copy link
Member

Choose a reason for hiding this comment

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

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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.

}
```

### Extension Configuration
Copy link
Member

Choose a reason for hiding this comment

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

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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

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
Copy link
Member

Choose a reason for hiding this comment

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

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 |
Copy link
Member

Choose a reason for hiding this comment

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

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.

@localden localden linked an issue Nov 6, 2025 that may be closed by this pull request
pja-ant and others added 2 commits November 6, 2025 18:18
Co-authored-by: Jonathan Hefner <jonathan@hefner.pro>
Co-authored-by: Jonathan Hefner <jonathan@hefner.pro>
@dsp-ant dsp-ant added SEP proposal SEP proposal without a sponsor. labels Jan 14, 2026
@localden localden changed the title Add MCP extensions framework (SEP-1724) SEP-1761: Add MCP extensions framework Jan 21, 2026
@pja-ant
Copy link
Contributor Author

pja-ant commented Jan 22, 2026

Replacing with #2133

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

Labels

proposal SEP proposal without a sponsor. SEP

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SEP-1724: Extensions

3 participants