-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Publish versioning, roadmap, and dependency policies for v2 #3215
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e90d907
e8bee4d
fbefbf6
dfee3cb
8f6eded
07eb1a4
429e98c
bc5bfe8
2be1b57
4102871
9ab5bca
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| # Dependency Policy | ||
|
|
||
| `mcp` is a library that lives inside other people's environments, so its requirements are chosen to constrain your resolver as little as possible while still describing what the SDK needs. | ||
|
|
||
| ## How requirements are declared | ||
|
|
||
| Every runtime dependency is a `>=` floor set to the oldest version that provides what the SDK uses, with no upper bound unless a dependency's next major is known to break the SDK. The one exception is `mcp-types`, the wire-types package released in lockstep with `mcp`: each `mcp` release requires exactly its own version of it, so it is the other half of the SDK rather than an independent constraint. | ||
|
|
||
| ## When a floor moves | ||
|
|
||
| A floor is raised only when the SDK starts relying on functionality or a fix that first appeared in that version — not because the dependency published a security advisory. The `>=` bound already lets, and expects, you to run the newest release your other constraints allow, so a higher floor would only shrink the environments the SDK installs into; nor does the SDK add code to work around a dependency's vulnerability, since the fix belongs upstream and in your lockfile ([background](https://github.com/Kludex/uvicorn/discussions/2643), [python-sdk#1552](https://github.com/modelcontextprotocol/python-sdk/issues/1552)). Floor raises may ship in a minor release under the [versioning policy](VERSIONING.md) and are called out in the release notes. Adding a new runtime dependency, or moving one to its next major version, is decided in an issue before the pull request. | ||
|
Check warning on line 11 in DEPENDENCY_POLICY.md
|
||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟡 [quality] nit: The "When a floor moves" section restates AGENTS.md's dependency-floor rule ("Don't raise dependency floors for CVEs alone... Only raise a floor when the SDK needs functionality from the newer version, and don't add SDK code to work around a dependency's vulnerability") as a second free-standing source of truth, down to citing the identical two references (Kludex/uvicorn#2643 and python-sdk#1552), with no cross-reference in either direction. Extended reasoning...Concrete cost: the same policy now lives in two unlinked places (AGENTS.md "Package Management" and DEPENDENCY_POLICY.md "When a floor moves"). The next time the policy is refined — e.g. the new public doc's extra allowance that an upper bound may be added "unless a dependency's next major is known to break the SDK", which AGENTS.md does not mention — only one copy gets edited and the agent-facing rules drift from the published policy. A one-line pointer from AGENTS.md to DEPENDENCY_POLICY.md as the canonical statement (keeping AGENTS.md to the workflow-specific bits) removes the second copy. Grep confirms neither file references the other. Verification: nit — the factual claim checks out on every point. (1) The duplication is real: AGENTS.md lines 32–35 state "Don't raise dependency floors for CVEs alone. The |
||
|
|
||
| ## Automated updates | ||
|
|
||
| [Dependabot](https://github.com/modelcontextprotocol/python-sdk/blob/main/.github/dependabot.yml) opens monthly, grouped pull requests for the `uv` lockfile and for GitHub Actions. These refresh the versions the SDK is developed and tested against; the requirements published to PyPI move only under the rules above. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| # Roadmap | ||
|
maxisbey marked this conversation as resolved.
|
||
|
|
||
| The SDK's work is organized by MCP specification revision, with one GitHub project board per revision; each item is an issue or pull request you can follow. | ||
|
|
||
| ## The 2026-07-28 revision | ||
|
|
||
| v2 implements the [2026-07-28 specification](https://modelcontextprotocol.io/specification/2026-07-28) and negotiates back to every earlier revision. Board: **[python-sdk · 2026-07-28 spec](https://github.com/orgs/modelcontextprotocol/projects/42)**; the cross-SDK view is [2026-07-28 Spec Implementation](https://github.com/orgs/modelcontextprotocol/projects/41). Still open there: making advertised capabilities configurable rather than pre-computed ([#2896](https://github.com/modelcontextprotocol/python-sdk/issues/2896)). | ||
|
|
||
| ## Not yet implemented | ||
|
|
||
| Of the extensions and optional client-auth mechanisms not yet implemented, those the conformance suite already exercises appear in its expected-failures baseline, [`.github/actions/conformance/expected-failures.yml`](.github/actions/conformance/expected-failures.yml), which burns down as each lands. The main ones: | ||
|
|
||
| * **Tasks extension** (`io.modelcontextprotocol/tasks`, [SEP-2663](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/seps/2663-tasks-extension.md)) — deferred at 2.0 because the 2026-07-28 design is wire-incompatible with the earlier in-core Tasks; tracked in [#2806](https://github.com/modelcontextprotocol/python-sdk/issues/2806). | ||
| * **DPoP-bound access tokens** ([SEP-1932](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1932)) in the OAuth client. | ||
| * **The workload-identity `jwt-bearer` grant** in the OAuth client. | ||
|
|
||
| Everything else — bugs and smaller features — lives in the [issue tracker](https://github.com/modelcontextprotocol/python-sdk/issues), prioritized `P0`–`P3`. The SDK aims to release support for each new specification revision alongside that revision. | ||
|
|
||
| ## The previous major | ||
|
|
||
| `v1.x` is a maintenance line: critical bug fixes and security fixes only. Support terms are in [Versioning and support policy](VERSIONING.md#support-and-announcements); the path off it is the **[Migration Guide](https://py.sdk.modelcontextprotocol.io/migration/)**. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| # Versioning and support policy | ||
|
|
||
| What a version number of `mcp` promises: which changes can arrive in a minor release, which wait for a major, how deprecations are announced, and which release lines are supported. | ||
|
|
||
| ## The version number | ||
|
|
||
| [Semantic Versioning](https://semver.org/) semantics in [PEP 440](https://peps.python.org/pep-0440/) syntax, taken from the git tag: in `2.X.Y`, **X** (minor) carries new functionality and every non-breaking change, **Y** (patch) carries bug fixes only, and a breaking change to the public API lands only in a new **major**. Pre-releases are cut from `main` as `aN`/`bN`/`rcN`; installers prefer final releases by default, so an unpinned `pip install mcp` stays on a stable release whenever one satisfies your requirement. `mcp` and its wire-types package `mcp-types` release in lockstep, each `mcp` requiring exactly the matching `mcp-types`. | ||
|
maxisbey marked this conversation as resolved.
|
||
|
|
||
| ## The public API | ||
|
|
||
| The promise covers every name exported by `mcp` and `mcp_types` (their `__all__`), the import paths, signatures, and behavior documented on the [documentation site](https://py.sdk.modelcontextprotocol.io/) and in its [API Reference](https://py.sdk.modelcontextprotocol.io/api/mcp/). It does not cover underscore-prefixed names, undocumented modules, or the wording of log lines, warnings, and exception messages (their types and documented raise conditions are covered). APIs labelled **provisional** (for example the middleware chain) may still change in a minor release; **experimental** APIs are opt-in previews. | ||
|
Check warning on line 11 in VERSIONING.md
|
||
|
maxisbey marked this conversation as resolved.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🟡 nit: The public-API boundary is vacuous as written: it covers "signatures, and behavior documented ... in its API Reference" and carves out "undocumented modules", but the repo's reference generator (scripts/docs/gen_ref_pages.py) auto-writes an API Reference page for every non-underscore module of both packages (PACKAGES loop skips only components starting with '_' and the mcp.types alias in EXCLUDED). There are no undocumented non-underscore modules, so the carve-out matches nothing and the compatibility promise extends to the SDK's entire internal surface — e.g. mcp.shared.dispatcher, mcp.shared.inbound, mcp.shared.peer, mcp.shared.tool_name_validation, mcp.os.posix, mcp.cli all have generated reference pages, far beyond the Extended reasoning...A maintainer renames a helper in mcp.shared.tool_name_validation (or changes a signature in mcp.shared.dispatcher) in a 2.x minor release, treating it as internal per AGENTS.md. A user who imported it points at VERSIONING.md: the name's signature is "documented ... in its API Reference" (the auto-generated page at /api/mcp/shared/tool_name_validation/) and is not underscore-prefixed nor in an "undocumented module", so under the published policy this is a breaking change that "lands only in a new major" — the SDK is now either in violation of its own versioning commitment or unable to refactor any non-underscore internal module until 3.0. The fix is to scope the promise to all exports plus hand-written docs pages, or to state that auto-generated reference pages do not by themselves confer API stability. Verification: nit — the claim is factually true. VERSIONING.md:11 (added by this diff) covers "the import paths, signatures, and behavior documented ... in its API Reference" and carves out "undocumented modules", but scripts/docs/gen_ref_pages.py generates a reference page for every non-underscore module: the loop at lines 178–198 skips only components starting with "_" (lines 190–191) and EXCLUDED = fro |
||
|
|
||
| ## Breaking and non-breaking changes | ||
|
|
||
| Held for the next major: | ||
|
|
||
| * removing or renaming a public name, | ||
| * changing a signature, return type, raised exception type, or documented behavior so that working code stops working, | ||
| * removing a documented import path, extra, or CLI command. | ||
|
|
||
| Allowed in a minor: | ||
|
|
||
| * additions — functions, defaulted parameters, classes, fields, enum members, | ||
| * changes to provisional or experimental APIs, | ||
| * new deprecation warnings, and retired protocol features ceasing to work on connections that negotiate a revision without them (their Python names stay, deprecated, until a major), | ||
| * raising a dependency floor the SDK needs (see the [dependency policy](DEPENDENCY_POLICY.md)) when the dependency's changes don't reach you through the SDK's API, or dropping a Python version after its upstream end-of-life — both called out in the release notes, | ||
| * bug fixes, including ones that make the SDK match its documented or specified behavior. | ||
|
|
||
| ## Deprecations | ||
|
|
||
| **SDK APIs** are deprecated before removal: they keep working for at least one minor release, marked with [`typing_extensions.deprecated`](https://typing-extensions.readthedocs.io/en/latest/#typing_extensions.deprecated) wherever Python can carry the marker (docstring and migration guide otherwise), and are removed only in a major. **Protocol features** the specification retires keep their implementation through the spec's deprecation window and warn with `MCPDeprecationWarning`, a `UserWarning` subclass that shows by default; what still functions depends on the revision a connection negotiated — see [Deprecated features](https://py.sdk.modelcontextprotocol.io/deprecated/). | ||
|
|
||
| ## Support and announcements | ||
|
|
||
| Two lines are maintained, and only the newest release of each receives fixes: | ||
|
|
||
| * **2.x** (`main`) — bug fixes, security fixes, and features. | ||
| * **1.x** ([`v1.x`](https://github.com/modelcontextprotocol/python-sdk/tree/v1.x)) — critical bug fixes and security fixes. | ||
|
|
||
| Where changes are announced: | ||
|
|
||
| * [SECURITY.md](https://github.com/modelcontextprotocol/python-sdk/blob/main/SECURITY.md) has the vulnerability reporting process. | ||
| * Every release publishes notes on [GitHub Releases](https://github.com/modelcontextprotocol/python-sdk/releases). | ||
| * Every breaking change between majors is documented in the [Migration Guide](https://py.sdk.modelcontextprotocol.io/migration/) before it merges. | ||
| * Pull requests that make a breaking change carry the `breaking change` label. | ||
Uh oh!
There was an error while loading. Please reload this page.