Skip to content

Commit 996f9d1

Browse files
authored
Merge pull request modelcontextprotocol#2791 from modelcontextprotocol/draft-spec-language-updates
docs(spec): incorporate SEP-2596 and SEP-1865 into the draft spec; clarify Streamable HTTP
2 parents 4137e6a + 4cc69cc commit 996f9d1

40 files changed

Lines changed: 651 additions & 150 deletions
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
---
2+
title: Feature Lifecycle and Deprecation Policy
3+
description: How individual MCP specification features move through Active, Deprecated, and Removed states, and the timeline implementers can plan against.
4+
---
5+
6+
This policy defines a lifecycle for individual features within the Model
7+
Context Protocol specification. It defines three feature states (Active,
8+
Deprecated, Removed), the criteria and procedure for moving between them, a
9+
minimum window between deprecation and removal, and the documentation required
10+
at each transition.
11+
12+
This policy was adopted via
13+
[SEP-2596](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2596).
14+
15+
## Scope
16+
17+
This policy governs **features** of the MCP core specification: protocol
18+
messages, capabilities, transports, schema types, and normative behavioral
19+
requirements. Tthe revision lifecycle of the specification document itself
20+
(Draft, Current, Final), is defined in the [versioning guide](/docs/learn/versioning).
21+
22+
## Feature States
23+
24+
A specification feature is in exactly one of three states:
25+
26+
| State | Meaning | Implementer expectation |
27+
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
28+
| **Active** | The feature is part of the Current specification revision. | Implement per the feature's normative requirements. |
29+
| **Deprecated** | The feature remains in the specification but is scheduled for removal. A migration path is documented (see below). | New implementations should not adopt the feature. Existing implementations should migrate before the earliest removal date. |
30+
| **Removed** | The feature has been deleted from `draft` and will be absent from the next Current revision. It remains documented in the Final revision it last appeared in. | Implementations targeting that next Current revision must not depend on the feature. |
31+
32+
A Deprecated feature MAY be restored to Active by a SEP that supersedes the
33+
deprecation SEP and documents the changed circumstances. Restoration follows
34+
the same approval path as deprecation. If the feature is later deprecated
35+
again, the minimum deprecation window in
36+
[Deprecating a feature](#deprecating-a-feature) is measured afresh from the
37+
revision in which the new deprecation takes effect.
38+
39+
### SDKs
40+
41+
Removal from the specification does not oblige an SDK to drop the feature from
42+
releases. That timeline is governed by the SDK's own revision-support policy.
43+
44+
## Deprecating a Feature
45+
46+
A feature may be proposed for deprecation due to
47+
48+
- it has been superseded by another feature that covers the same use cases,
49+
- it presents a security, privacy, or interoperability risk that cannot be
50+
mitigated in place,
51+
- ecosystem telemetry or SDK maintainer consensus indicates negligible adoption
52+
relative to its maintenance cost,
53+
- or any other reasons the Core Maintainers seem to deem appropriate.
54+
55+
Deprecation is a specification change and therefore requires a SEP per the
56+
[SEP guidelines](/community/sep-guidelines). The deprecation SEP must:
57+
58+
1. Identify the feature by name and link to its definition in `schema.ts`
59+
(where applicable) and the specification prose.
60+
2. State the rationale against the criteria above.
61+
3. Document the migration path, or state explicitly that none is required. If
62+
the migration path names a replacement feature, that feature must be Active
63+
in the revision in which the deprecation takes effect; the replacement and
64+
the deprecation may land in the same revision.
65+
4. Specify the **minimum deprecation window**: the number of months, at least
66+
twelve, that the feature must remain Deprecated before it is eligible for
67+
removal. The window is measured from the release of the specification
68+
revision in which the feature is first marked Deprecated, not from the date
69+
the SEP reaches Final. The feature becomes eligible for removal in the first
70+
specification revision released as Current on or after the window elapses;
71+
that point is the feature's **earliest removal**.
72+
73+
When the deprecation SEP is accepted and reaches Final, the deprecation is scheduled.
74+
75+
- The feature's entry in `schema.ts` gains a `@deprecated` JSDoc tag
76+
referencing the deprecation SEP and the revision in which the deprecation
77+
takes effect.
78+
- The specification prose for the feature gains a deprecation notice with the
79+
same information.
80+
- The `changelog.mdx` for that revision gains an entry under a "Deprecated"
81+
heading. "Deprecated" and "Removed" are standing changelog headings alongside
82+
the existing Major/Minor/Other groupings.
83+
- The feature is added to the
84+
[deprecated registry](#the-deprecated-registry) with its deprecation SEP, the
85+
revision in which it became Deprecated, its migration path, and its earliest
86+
removal.
87+
88+
The feature becomes Deprecated when the revision carrying these changes is released
89+
and becomes the new Current revision (see [versioning guide](/docs/learn/versioning)).
90+
The minimum deprecation window is counted from that release.
91+
92+
## The Deprecated Registry
93+
94+
[`docs/specification/draft/deprecated.mdx`](/specification/draft/deprecated) is
95+
a single page listing every feature Deprecated or Removed state. It is
96+
the canonical answer to "what is on its way out, and by when," so that an
97+
implementer does not have to reconstruct that picture from deprecation entries
98+
spread across revision changelogs.
99+
100+
## Tier 1 SDK Obligations
101+
102+
Once the revision in which a feature becomes Deprecated is
103+
released as Current, Tier 1 SDKs:
104+
105+
- Must mark the corresponding API surface deprecated using the language's
106+
native mechanism (for example `@Deprecated` in Java, `[Obsolete]` in .NET,
107+
`@deprecated` JSDoc in TypeScript, the `Deprecated:` doc convention in Go) in
108+
their next release, referencing the deprecation SEP and the earliest removal
109+
date where the mechanism permits.
110+
- Should emit a runtime warning when a deprecated feature is exercised, using
111+
the language's idiomatic mechanism (for example Python's
112+
`DeprecationWarning`, Node.js's `process.emitWarning`, or a configurable
113+
logger).
114+
115+
## Removing a Feature
116+
117+
1. Once a feature is set for removal, the removal is executed at the discretion
118+
of the Core Maintainers after the minimum deprecation window has elapsed.
119+
2. The removal needs to be documented in the `changelog.mdx` and [registry](#the-deprecated-regsitry)
120+
3. A SEP is required for any change to the original deprecation or removal SEP, for
121+
example extending or shortening the timeline
122+
([Expedited removal](#expedited-removal)) or restoring the feature to Active
123+
([Feature states](#feature-states)).
124+
125+
## Expedited Removal
126+
127+
The twelve-month floor may be shortened when the feature presents an active
128+
security risk, meaning a vulnerability with a published security advisory or
129+
documented in-the-wild exploitation for which no in-place mitigation exists.
130+
Shortening the window requires Core Maintainer approval under the
131+
[governance decision process](/community/governance#decision-process), recorded
132+
in the deprecation SEP or, where the risk surfaces after that SEP is already
133+
Final, in a short expedited-removal SEP that references it. The shortened
134+
window must still provide at least ninety days between the feature becoming
135+
Deprecated and its earliest removal.

docs/docs.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@
316316
"pages": [
317317
"specification/draft/index",
318318
"specification/draft/changelog",
319+
"specification/draft/deprecated",
319320
"specification/draft/architecture/index",
320321
{
321322
"group": "Base Protocol",
@@ -484,6 +485,7 @@
484485
"pages": [
485486
"community/governance",
486487
"community/contributor-ladder",
488+
"community/feature-lifecycle",
487489
"community/sdk-tiers",
488490
"community/antitrust"
489491
]

docs/docs/learn/versioning.mdx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,22 @@ Revisions may be marked as:
2626

2727
The **current** protocol version is [**2025-11-25**](/specification/2025-11-25/).
2828

29+
## Feature States
30+
31+
Individual features of the specification may additionally be marked as
32+
**Deprecated** under the
33+
[feature lifecycle and deprecation policy](/community/feature-lifecycle):
34+
the feature remains part of the specification, but is scheduled for removal.
35+
Deprecated features document a migration path (or state that none is required)
36+
and remain in the specification for at least twelve months, or at least
37+
ninety days under the policy's
38+
[expedited-removal exception](/community/feature-lifecycle#expedited-removal)
39+
, before they become eligible for removal, after which they may be **Removed**
40+
in a future revision.
41+
42+
Features that are currently Deprecated are listed in the
43+
[deprecated features registry](/specification/draft/deprecated).
44+
2945
## Negotiation
3046

3147
Version negotiation happens during

docs/specification/draft/basic/index.mdx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,12 +232,12 @@ in `_meta`. Servers use these to identify the client and the protocol version in
232232
without relying on any prior connection state. See
233233
[Lifecycle][lifecycle] for version negotiation rules.
234234

235-
| Key | Type | Required | Description |
236-
| -------------------------------------------- | -------------------- | -------- | ----------------------------------------------------------- |
237-
| `io.modelcontextprotocol/protocolVersion` | `string` | Yes | Protocol version for this request (e.g., `"DRAFT-2026-v1"`) |
238-
| `io.modelcontextprotocol/clientInfo` | `Implementation` | Yes | Client name and version |
239-
| `io.modelcontextprotocol/clientCapabilities` | `ClientCapabilities` | Yes | Client capabilities relevant to this request |
240-
| `io.modelcontextprotocol/logLevel` | `LoggingLevel` | No | Minimum log level the server should emit for this request |
235+
| Key | Type | Required | Description |
236+
| -------------------------------------------- | -------------------- | -------- | --------------------------------------------------------- |
237+
| `io.modelcontextprotocol/protocolVersion` | `string` | Yes | Protocol version for this request (e.g., `"2026-07-28"`) |
238+
| `io.modelcontextprotocol/clientInfo` | `Implementation` | Yes | Client name and version |
239+
| `io.modelcontextprotocol/clientCapabilities` | `ClientCapabilities` | Yes | Client capabilities relevant to this request |
240+
| `io.modelcontextprotocol/logLevel` | `LoggingLevel` | No | Minimum log level the server should emit for this request |
241241

242242
A server **MUST NOT** rely on capabilities the client has not declared. If
243243
processing a request requires a capability the client did not include in

docs/specification/draft/basic/lifecycle.mdx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ listing the versions it does support:
7171
"code": -32004,
7272
"message": "Unsupported protocol version",
7373
"data": {
74-
"supported": ["DRAFT-2026-v1", "2025-11-25"],
74+
"supported": ["2026-07-28", "2025-11-25"],
7575
"requested": "1900-01-01"
7676
}
7777
}
@@ -130,29 +130,30 @@ Clients and servers can negotiate support for optional
130130
are advertised in the `extensions` field of capabilities, which is a map of
131131
extension identifiers to per-extension settings objects.
132132

133-
Example client capabilities with extensions:
133+
The following is an example of a client that advertises the
134+
[MCP Apps extension](/extensions/apps/overview) identified as `io.modelcontextprotocol/ui`:
134135

135136
```json
136137
{
137138
"capabilities": {
138139
"roots": {},
139140
"extensions": {
140-
"io.modelcontextprotocol/apps": {
141+
"io.modelcontextprotocol/ui": {
141142
"mimeTypes": ["text/html;profile=mcp-app"]
142143
}
143144
}
144145
}
145146
}
146147
```
147148

148-
Example server capabilities with extensions:
149+
An example of [Tasks extension](/extensions/tasks/overview) identified as `io.modelcontextprotocol/tasks`:
149150

150151
```json
151152
{
152153
"capabilities": {
153154
"tools": {},
154155
"extensions": {
155-
"io.modelcontextprotocol/apps": {}
156+
"io.modelcontextprotocol/tasks": {}
156157
}
157158
}
158159
}

0 commit comments

Comments
 (0)