Skip to content

SEP-3392: Extension Lifecycle - #3392

Open
pja-ant wants to merge 3 commits into
modelcontextprotocol:mainfrom
pja-ant:pja/sep-extension-lifecycle
Open

pja-ant wants to merge 3 commits into
modelcontextprotocol:mainfrom
pja-ant:pja/sep-extension-lifecycle

Conversation

@pja-ant

@pja-ant pja-ant commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Proposes a maturity lifecycle for MCP extensions: Experimental, then Beta, then either Stable (as an extension) or promotion to the core specification.
The stage is shown in the repository name (experimental-ext-<name>, beta-ext-<name>, ext-<name>) and decides which protocol changes are allowed, who approves them, and what stability implementers can expect.

  • Experimental and Beta extensions iterate with Extension Maintainer approval only, and may make breaking changes.
  • Entering Beta and entering Stable each need an Extensions Track SEP. A Stable extension changes only with a new core protocol revision.
  • Promotion to core is a Standards Track SEP, with a defined migration from the extension identifier (clients keep advertising it while they support earlier revisions; requests declaring the core revision or later need no negotiation).

This updates the extension lifecycle in SEP-2133, replaces its "every breaking change needs a new identifier" rule, and answers the "feature maturity tiers" open question in SEP-2596.
It also extends the SEP-2484 conformance requirement to the SEPs that move an extension to Stable.

For reviewers: the Transition section classifies the existing extension repositories (ext-apps and ext-auth Stable; ext-skills and ext-tasks Beta; ext-server-card Beta once SEP-2127 is accepted).
That classification is a proposal for the Core Maintainers.

AI assistance: drafted with Claude Code (research of existing SEPs and extension repositories, and writing the text). Design decisions and review are by @pja-ant.

🤖 Generated with Claude Code

@pja-ant pja-ant added SEP draft SEP proposal with a sponsor. extension labels Sep 25, 2026
@pja-ant pja-ant self-assigned this Sep 25, 2026
@pja-ant pja-ant changed the title SEP-0000: Extension Lifecycle SEP-3392: Extension Lifecycle Sep 25, 2026
@pja-ant
pja-ant marked this pull request as ready for review September 25, 2026 17:12

### Repositories

- An Experimental or Beta repository MUST contain exactly one extension. A Stable repository MAY group related extensions in one area, as SEP-2133 allows, but an extension joins a grouped repository only when it becomes Stable.

@LucaButBoring LucaButBoring Sep 25, 2026 •

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.

Possible minor challenge for Tasks (once again) with this: modelcontextprotocol/agents-wg#29

I'm proposing basically splitting Tasks into a stabilized portion (to be merged into the core spec) and experimental portion, which will probably coexist in the same repo for a while - it's unclear if that's allowed under this. Should we temporarily have both an ext-tasks and an experimental-ext-tasks(-v2?) repo simultaneously for a period of time if we went with this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yeah, I thought this might come up. We could instead have ext-tasks contain multiple extensions, and we e.g. have ext-tasks/tasksv2/experimental/spec.md alongside ext-tasks/tasks/beta/spec.md

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is a good point. @pcarleton mentioned ext-auth might have similar things.

What about just subfolders within the repo and the repo is just ext-tasks?

ext-tasks/spec/stable/tasks.md
ext-tasks/spec/experimental/partial-results.md
ext-tasks/spec/beta/steering.md

(names made up...)

| Stage | Repository | Protocol changes | Changes approved by | Entry | What implementers can expect |
| ---------------- | ------------------------------------------------------- | ----------------------------------------------------- | -------------------- | ------------------------------------- | ------------------------------------------------------- |
| **Experimental** | `experimental-ext-<name>` | Any change, at any time, without notice | Extension Maintainer | Any Maintainer creates the repository | Nothing. The design may change or disappear. |
| **Beta** | `beta-ext-<name>` | Any change, with breaking changes expected to be rare | Extension Maintainer | Extensions Track SEP | Real usage is welcome. Breaking changes are documented. |

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@nbarbettini mentioned in a meeting that the 'Release Candidate' framing is useful for setting expectations around a protocol release. If we're still planning to use that approach for the core protocol releases, should we also use that term here for extensions?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Hmm, open to it, but I feel that RC sets an expectation that it is very close and just in a staging area for final release with only minor bugfixes, whereas beta evokes more of a "we're trying this out, might change significantly as we get production experience".

RC to me would be, e.g. the extension is accepted into the core protocol or stable release and we're just weeks before setting it in stone and it's unlikely to change (but still possible).

An **Extension Maintainer** is a maintainer of the extension's repository who is listed in that repository's `MAINTAINERS.md`, as `ext-tasks` already does. As SEP-2133 provides for repository maintainers, the Core Maintainers appoint Extension Maintainers, who are normally the
leads of the associated Working Group or Interest Group. Every extension MUST have at least one Extension Maintainer.

"Extension Maintainer approval" means a pull request approved by at least one Extension Maintainer who is not its author. Extension Maintainers SHOULD coordinate changes through the associated Working Group or Interest Group.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We already have guidelines around decision making in the groups, can we link to this for 'how to coordinate changes?' https://modelcontextprotocol.io/community/working-interest-groups#decision-making-process


**Iteration.** After entry, Extension Maintainers approve changes without further Core Maintainer review.

- Extensions SHOULD prefer additive changes, such as new optional fields or capability flags, over breaking changes.

@felixweinberger felixweinberger Oct 1, 2026 •

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.

Wonder if we want to cross reference #3371 here if it gets shipped, something like "prefer the extension points provided by #3371" as that would likely simplify longer term compatibility.

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

draft SEP proposal with a sponsor. extension SEP

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

4 participants