Publish versioning, roadmap, and dependency policies for v2 by maxisbey · Pull Request #3215 · modelcontextprotocol/python-sdk · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion CONTRIBUTING.md
15 changes: 15 additions & 0 deletions DEPENDENCY_POLICY.md
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

View check run for this annotation

Claude / Claude Code Review

[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

[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.

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.

🟡 [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 >= constraint already lets users upgrade. 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. See Kludex/uvicorn#2643 and python-sdk #1552 for rea


## 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.
14 changes: 11 additions & 3 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@

## Bumping Dependencies

[`DEPENDENCY_POLICY.md`](DEPENDENCY_POLICY.md) says *when* a bound should
move; this is the mechanics.
Comment thread
claude[bot] marked this conversation as resolved.

1. Change the dependency version in `pyproject.toml`. The root `mcp` project's
runtime dependencies are dynamic and live under
`[tool.hatch.metadata.hooks.uv-dynamic-versioning].dependencies`.
2. Upgrade lock with `uv lock --resolution lowest-direct`
2. Regenerate the lock with `uv lock` (or `uv lock --upgrade-package <package>`
Comment thread
maxisbey marked this conversation as resolved.
to move just that package's locked version). The committed `uv.lock` is a
normal (default-strategy) resolution; the `lowest-direct` resolution that
proves the floors still work is applied only by its CI matrix leg at test
time and is never committed.

## Release lines

Expand Down Expand Up @@ -104,8 +111,9 @@ hand for the same reason as above. Then ask someone to review the release.
Pre-releases of the next version are cut from `main` with a PEP 440
pre-release tag: `aN` for alphas, later `bN`/`rcN` for betas and release
candidates. The PEP 440 suffix is what keeps `pip install mcp` on the stable
version — installers only select a pre-release when it is requested explicitly (an
exact pin, a specifier that names a pre-release version, or `--pre`).
version — installers do not pick a pre-release for a plain `mcp` requirement while a
final release satisfies it; a pre-release is opted into with an exact pin, a
specifier that names a pre-release version, or `--pre`.

1. During a pre-release phase the README and docs pin the exact pre-release
version, so update those examples first (grep the outgoing version — the
Expand Down
21 changes: 21 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Roadmap
Comment thread
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/)**.
45 changes: 45 additions & 0 deletions VERSIONING.md
Loading