Skip to content

Commit 6f69a37

Browse files
authored
Present v2 as the stable release across the README, docs, and policies (#3178)
1 parent 78e6fbb commit 6f69a37

10 files changed

Lines changed: 74 additions & 88 deletions

File tree

.github/ISSUE_TEMPLATE/v2-feedback.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
name: v2 feedback
22
description: Bugs, API friction, or docs gaps in v2 of the SDK
33
title: "[v2] "
4-
labels: ["v2-alpha"]
4+
labels: ["v2"]
55

66
body:
77
- type: markdown
88
attributes:
99
value: |
10-
Thanks for trying v2. Anything that broke, surprised you, or slowed you down is useful API feedback is explicitly welcome while v2 is in pre-release.
10+
Anything in v2 that broke, surprised you, or slowed you down is useful, including API friction and docs gaps.
1111
12-
Docs: https://py.sdk.modelcontextprotocol.io/v2/ · Migration from v1: https://py.sdk.modelcontextprotocol.io/v2/migration/
12+
Docs: https://py.sdk.modelcontextprotocol.io/ · Migration from v1: https://py.sdk.modelcontextprotocol.io/migration/
1313
1414
- type: textarea
1515
id: what

AGENTS.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
## Branching Model
44

5-
<!-- TODO: drop this section once v2 ships and main becomes the stable line -->
6-
7-
- `main` is currently the V2 rework.
8-
- Breaking changes are expected here — removing or replacing an API must be
9-
intentional. Adding a replacement API or `@deprecated` shim must likewise be
10-
a deliberate design choice, not bolted on for free.
11-
- Breaking changes (including those softened by a backwards-compatibility
12-
shim) must be documented in `docs/migration.md`.
13-
- `v1.x` is the release branch for the current stable line. Backport PRs target
14-
this branch and use a `[v1.x]` title prefix.
5+
- `main` is the current stable line (v2); releases are cut from it (see
6+
`RELEASE.md`).
7+
- Removing or replacing an API must be intentional, and what shipped in 2.x
8+
is public surface. Adding a replacement API or `@deprecated` shim is
9+
likewise a deliberate design choice, not bolted on for free.
10+
- Changes that break code written against v1 (including those softened by a
11+
backwards-compatibility shim) must be documented in `docs/migration.md`.
12+
- `v1.x` is the maintenance branch for the previous major. Backport PRs
13+
target it and use a `[v1.x]` title prefix; only critical bug fixes and
14+
security fixes land there.
1515
- `README.md` documents v2. The v1 README lives on the `v1.x` branch.
1616

1717
## Package Management

CONTRIBUTING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ uv tool install pre-commit --with pre-commit-uv --force-reinstall
7676

7777
| Change Type | Target Branch | Example |
7878
|-------------|---------------|---------|
79-
| New features, breaking changes | `main` | New APIs, refactors |
79+
| New features and fixes for v2 | `main` | New APIs, refactors |
8080
| Security fixes for v1 | `v1.x` | Critical patches |
81-
| Bug fixes for v1 | `v1.x` | Non-breaking fixes |
81+
| Critical bug fixes for v1 | `v1.x` | Backports of severe bugs |
8282

83-
> **Note:** `main` is the v2 development branch. Breaking changes are welcome on `main`. The `v1.x` branch receives only security and critical bug fixes.
83+
> **Note:** `main` is the current stable line (v2). The `v1.x` branch is the previous major's maintenance line and receives only security and critical bug fixes.
8484
8585
2. Create a new branch from your chosen base branch
8686

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313

1414
</div>
1515

16-
> [!CAUTION]
17-
> **This README documents v2 of the MCP Python SDK, currently a release candidate (`2.0.0rc1`); the stable v2 release is planned for 2026-07-28.** Do not use v2 in production yet. Pre-releases are published to PyPI as `2.0.0aN` / `2.0.0bN` / `2.0.0rcN`, and **a pre-release may still contain breaking changes from the previous one**. Pin an exact version and expect to update your code when you bump the pin.
16+
> [!NOTE]
17+
> **This is v2 of the MCP Python SDK, the current stable release line.** It is a major rework of the SDK, both to support the [2026-07-28 MCP specification](https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/) (and every earlier revision) and to fix long-standing architectural issues. Coming from v1? See [What's new in v2](https://py.sdk.modelcontextprotocol.io/whats-new/) for the tour of what changed and the [migration guide](https://py.sdk.modelcontextprotocol.io/migration/) for every breaking change.
1818
>
19-
> **v1.x is the only stable release line and remains recommended for production.** It lives on the [`v1.x` branch](https://github.com/modelcontextprotocol/python-sdk/tree/v1.x) and continues to receive critical bug fixes and security patches; see [the v1.x README](https://github.com/modelcontextprotocol/python-sdk/blob/v1.x/README.md) for its documentation. `pip` and `uv` don't select a pre-release unless you explicitly request one, so existing installs are unaffected. **If your package depends on `mcp`, add a `<2` upper bound to your version constraint (for example `mcp>=1.27,<2`) before the stable release lands.**
19+
> **Not ready to migrate?** v1.x lives on the [`v1.x` branch](https://github.com/modelcontextprotocol/python-sdk/tree/v1.x), continues to receive critical bug fixes and security patches, and is documented at <https://py.sdk.modelcontextprotocol.io/v1/>. Since `pip install mcp` now installs 2.x, keep a `<2` upper bound on your requirement (for example `mcp>=1.28,<2`) until you've migrated.
2020
>
21-
> v2 is a major rework of the SDK, both to support the [2026-07-28 MCP specification release](https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/) and to fix long-standing architectural issues. See [What's new in v2](https://py.sdk.modelcontextprotocol.io/v2/whats-new/) for the tour of what changed, and the [migration guide](https://py.sdk.modelcontextprotocol.io/v2/migration/) for every breaking change. Stable v2 is targeted for 2026-07-28, alongside the spec release. Try the pre-releases and [tell us what breaks](https://github.com/modelcontextprotocol/python-sdk/issues/new?template=v2-feedback.yaml), or discuss in [#python-sdk-dev on the MCP Contributors Discord](https://discord.gg/6CSzBmMkjX).
21+
> Something rough, confusing, or broken? [Open an issue](https://github.com/modelcontextprotocol/python-sdk/issues/new?template=v2-feedback.yaml) or find us in [#python-sdk-dev on the MCP Contributors Discord](https://discord.gg/6CSzBmMkjX).
2222
2323
## Documentation
2424

25-
**The documentation lives at <https://py.sdk.modelcontextprotocol.io/v2/>.**
25+
**The documentation lives at <https://py.sdk.modelcontextprotocol.io/>.**
2626

27-
It has a [Get started guide](https://py.sdk.modelcontextprotocol.io/v2/get-started/), [What's new in v2](https://py.sdk.modelcontextprotocol.io/v2/whats-new/), the [API reference](https://py.sdk.modelcontextprotocol.io/v2/api/mcp/), and the [migration guide](https://py.sdk.modelcontextprotocol.io/v2/migration/).
27+
It has a [Get started guide](https://py.sdk.modelcontextprotocol.io/get-started/), [What's new in v2](https://py.sdk.modelcontextprotocol.io/whats-new/), the [API reference](https://py.sdk.modelcontextprotocol.io/api/mcp/), and the [migration guide](https://py.sdk.modelcontextprotocol.io/migration/).
2828

2929
## What is MCP?
3030

@@ -41,10 +41,10 @@ Python 3.10+.
4141
## Installation
4242

4343
```bash
44-
uv add "mcp[cli]==2.0.0rc1" # or: pip install "mcp[cli]==2.0.0rc1"
44+
uv add "mcp[cli]" # or: pip install "mcp[cli]"
4545
```
4646

47-
The pin matters while v2 is in pre-release: an unpinned install resolves to the latest stable v1.x, which this README does not describe. Check [PyPI](https://pypi.org/project/mcp/#history) for the newest pre-release, and use `uv run --with "mcp==2.0.0rc1"` for one-off commands.
47+
The `cli` extra adds the `mcp` command-line tool (`mcp dev`, `mcp run`, `mcp install`) on top of the SDK; install plain `mcp` if you don't need it. For one-off commands, `uv run --with "mcp[cli]" mcp ...` works without a project.
4848

4949
## A server in 15 lines
5050

@@ -82,7 +82,7 @@ Call `add` with `a=1`, `b=2` and you get `3` back.
8282

8383
Notice what you did **not** write: no JSON Schema (`a: int, b: int` _is_ the schema), no request parsing, no validation code, no protocol handling. Two type-hinted Python functions and a docstring.
8484

85-
[Get started](https://py.sdk.modelcontextprotocol.io/v2/get-started/) takes it from here.
85+
[Get started](https://py.sdk.modelcontextprotocol.io/get-started/) takes it from here.
8686

8787
## A client in 10 lines
8888

@@ -122,7 +122,7 @@ This project is licensed under the MIT License. See the [LICENSE](https://github
122122
[python-badge]: https://img.shields.io/pypi/pyversions/mcp.svg
123123
[python-url]: https://www.python.org/downloads/
124124
[docs-badge]: https://img.shields.io/badge/docs-python--sdk-blue.svg
125-
[docs-url]: https://py.sdk.modelcontextprotocol.io/v2/
125+
[docs-url]: https://py.sdk.modelcontextprotocol.io/
126126
[protocol-badge]: https://img.shields.io/badge/protocol-modelcontextprotocol.io-blue.svg
127127
[protocol-url]: https://modelcontextprotocol.io
128128
[spec-badge]: https://img.shields.io/badge/spec-spec.modelcontextprotocol.io-blue.svg

SECURITY.md

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@ Thank you for helping keep the Model Context Protocol and its ecosystem secure.
44

55
## Supported Versions
66

7-
Security fixes are released for the most recent stable (v1.x) release line.
8-
9-
v2 pre-releases (`2.0.0aN`, …) are development snapshots: fixes land only in
10-
the newest pre-release, and already-published pre-releases are not patched. If
11-
you are testing the v2 line, track the latest pre-release; for production use,
12-
stay on the latest stable release.
7+
| Version | Line | Support |
8+
| ------------------------------------ | ----------------------- | ---------------------------------------- |
9+
| 2.x (newest release) | current stable (`main`) | bug fixes, security fixes, new features |
10+
| 1.28.x (`v1.x` branch) | maintenance | critical bug fixes and security fixes |
11+
| < 1.28, and all pre-release versions | unsupported | upgrade to the newest 1.28.x or to 2.x |
12+
13+
Only the newest release of a supported line receives fixes, so reproduce against
14+
it before reporting. If your project depends on `mcp` and is not yet ready for
15+
2.x, constrain to `mcp>=1.28,<2` and follow the
16+
[migration guide](https://py.sdk.modelcontextprotocol.io/migration/) when you
17+
migrate.
1318

1419
## Reporting Security Issues
1520

docs/get-started/installation.md

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,24 @@
22

33
The Python SDK is on PyPI as [`mcp`](https://pypi.org/project/mcp/). It requires **Python 3.10+**.
44

5-
These docs describe **v2**, currently a release candidate, so the version pin is not optional yet:
5+
These docs describe **v2**, the current stable release line:
66

77
=== "uv"
88

99
```bash
10-
uv add "mcp[cli]==2.0.0rc1"
10+
uv add "mcp[cli]"
1111
```
1212

1313
=== "pip"
1414

1515
```bash
16-
pip install "mcp[cli]==2.0.0rc1"
16+
pip install "mcp[cli]"
1717
```
1818

19-
!!! warning "Why the pin"
20-
Installers never select a pre-release unless you name one, so an unpinned `uv add "mcp[cli]"`
21-
gives you the latest **v1.x** release, which these docs do not describe. Check the
22-
[release history](https://pypi.org/project/mcp/#history) for the newest pre-release before you copy
23-
the line above.
24-
25-
The same applies to one-off commands: `uv run --with "mcp==2.0.0rc1" ...`, not `uv run --with mcp ...`.
26-
27-
If your *package* depends on `mcp`, add a `<2` upper bound (for example `mcp>=1.27,<2`) before
28-
the stable v2 lands so the major version bump doesn't surprise you.
19+
!!! note "Coming from v1?"
20+
v2 is a major version with breaking changes; the **[Migration Guide](../migration.md)**
21+
covers every one. If your *package* depends on `mcp` and isn't ready to migrate, keep a
22+
`<2` upper bound (for example `mcp>=1.28,<2`) so an unpinned resolve stays on the 1.x line.
2923

3024
## What gets installed
3125

docs/get-started/real-host.md

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,12 @@ That is the last line of Python on this page. From here down it is all host conf
2323
Every host below gets the same command:
2424

2525
```bash
26-
uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
26+
uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
2727
```
2828

29-
One command for all of them because `uv run --with` resolves the pinned SDK into a fresh environment on the spot: it works from any directory, needs no project and no virtual environment to activate, and always gets the exact `mcp` version these docs describe. That matters here more than anywhere else, because a host launches your server from *its* working directory with a near-empty environment, not from your shell.
29+
One command for all of them because `uv run --with` resolves the SDK into a fresh environment on the spot: it works from any directory and needs no project and no virtual environment to activate. That matters here more than anywhere else, because a host launches your server from *its* working directory with a near-empty environment, not from your shell.
3030

31-
It is also the command `mcp install` writes into Claude Desktop's config for you (below), so what you type by hand and what the tool generates agree.
32-
33-
!!! warning "The version pin is not optional"
34-
v2 of this SDK is a release candidate, and installers never select a pre-release unless you name one. An
35-
unpinned `--with "mcp[cli]"` gives you the latest **v1.x**, which these docs do not describe.
36-
Use the exact pin from **[Installation](installation.md)**.
31+
It is also the command `mcp install` writes into Claude Desktop's config for you (below), so what you type by hand and what the tool generates agree, apart from the exact version pin the tool adds.
3732

3833
!!! tip "If a host can't find `uv`"
3934
A host spawns your server with a minimal `PATH`, and `uv` may not be on it. Replace the bare
@@ -74,7 +69,7 @@ There is nothing to be mystified by. This is the entry it writes:
7469
"run",
7570
"--frozen",
7671
"--with",
77-
"mcp[cli]==2.0.0rc1",
72+
"mcp[cli]==2.0.0",
7873
"mcp",
7974
"run",
8075
"/absolute/path/to/server.py"
@@ -84,12 +79,12 @@ There is nothing to be mystified by. This is the entry it writes:
8479
}
8580
```
8681

87-
That's the launch command from the section above with two additions: the absolute path to `uv`, and `--frozen` so `uv` never rewrites a lockfile it happens to be near. It lands in `claude_desktop_config.json`, which lives at:
82+
That's the launch command from the section above with three additions: the absolute path to `uv`, `--frozen` so `uv` never rewrites a lockfile it happens to be near, and an exact pin to the `mcp` version you have installed. It lands in `claude_desktop_config.json`, which lives at:
8883

8984
* **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
9085
* **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
9186

92-
You can write that file by hand. `mcp install` exists so you don't make the two classic mistakes (a relative path, a missing version pin) while doing it.
87+
You can write that file by hand. `mcp install` exists so you don't make the classic mistake (a relative path) while doing it.
9388

9489
Fully quit Claude Desktop (not just its window) and reopen it.
9590

@@ -107,7 +102,7 @@ Fully quit Claude Desktop (not just its window) and reopen it.
107102
There is no file to edit. Register the server with the `claude` CLI; everything after `--` is the launch command.
108103

109104
```bash
110-
claude mcp add bookshop -- uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
105+
claude mcp add bookshop -- uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
111106
```
112107

113108
Run `/mcp` inside a Claude Code session to confirm `bookshop` is connected and its tools are listed.
@@ -121,7 +116,7 @@ Create `.cursor/mcp.json` in your project root.
121116
"mcpServers": {
122117
"bookshop": {
123118
"command": "uv",
124-
"args": ["run", "--with", "mcp[cli]==2.0.0rc1", "mcp", "run", "/absolute/path/to/server.py"]
119+
"args": ["run", "--with", "mcp[cli]", "mcp", "run", "/absolute/path/to/server.py"]
125120
}
126121
}
127122
}
@@ -139,7 +134,7 @@ Create `.vscode/mcp.json` in your project root.
139134
"bookshop": {
140135
"type": "stdio",
141136
"command": "uv",
142-
"args": ["run", "--with", "mcp[cli]==2.0.0rc1", "mcp", "run", "/absolute/path/to/server.py"]
137+
"args": ["run", "--with", "mcp[cli]", "mcp", "run", "/absolute/path/to/server.py"]
143138
}
144139
}
145140
}
@@ -156,7 +151,7 @@ Two differences from Cursor's file, and they are the only two: the wrapper key i
156151
Before you touch any host config, run the launch command yourself:
157152

158153
```bash
159-
uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
154+
uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py
160155
```
161156

162157
Nothing prints, and it doesn't return. That silence is correct: a stdio server is waiting for a host to speak first on stdin (`Ctrl-C` to stop it). A traceback or an immediate exit is the real bug, and now you can read it instead of guessing at it through a host.
@@ -174,8 +169,8 @@ For anything past those three, **[Troubleshooting](../troubleshooting.md)** is t
174169
## Recap
175170

176171
* A **host** (Claude Desktop, an IDE) runs an MCP client that launches your server as a child process over stdio. Connecting means giving it one launch command.
177-
* That command is `uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py`: version-pinned, no venv to activate, works from any directory. The pin is mandatory while v2 is pre-release.
178-
* **Claude Desktop** is the one host `mcp install` configures for you. It writes that same command (plus the absolute path to `uv`) into `claude_desktop_config.json`, so you never have to.
172+
* That command is `uv run --with "mcp[cli]" mcp run /absolute/path/to/server.py`: no venv to activate, works from any directory.
173+
* **Claude Desktop** is the one host `mcp install` configures for you. It writes that same command (plus the absolute path to `uv`, `--frozen`, and an exact pin to the version you have installed) into `claude_desktop_config.json`, so you never have to.
179174
* **Claude Code** is `claude mcp add bookshop -- <launch command>`. **Cursor** is `.cursor/mcp.json` under `mcpServers`. **VS Code** is `.vscode/mcp.json` under `servers`, each entry with a `type`.
180175
* Absolute paths everywhere, restart the host after editing its config, and never let anything but the SDK write to stdout.
181176

0 commit comments

Comments
 (0)