Skip to content

Commit 45f2a88

Browse files
authored
Point pre-release install pins at 2.0.0rc1 (#3186)
1 parent 333aca7 commit 45f2a88

5 files changed

Lines changed: 23 additions & 23 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
</div>
1515

1616
> [!CAUTION]
17-
> **This README documents v2 of the MCP Python SDK a pre-release (alpha/beta) line under active development. Do not use v2 in production.** Pre-releases are published to PyPI as `2.0.0aN` / `2.0.0bN`, and **each pre-release may contain breaking changes from the previous one**. Pin an exact version and expect to update your code when you bump the pin.
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.
1818
>
1919
> **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.**
2020
>
@@ -41,10 +41,10 @@ Python 3.10+.
4141
## Installation
4242

4343
```bash
44-
uv add "mcp[cli]==2.0.0b1" # or: pip install "mcp[cli]==2.0.0b1"
44+
uv add "mcp[cli]==2.0.0rc1" # or: pip install "mcp[cli]==2.0.0rc1"
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.0b1"` for one-off commands.
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.
4848

4949
## A server in 15 lines
5050

docs/get-started/installation.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
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**, which is in beta, so the version pin is not optional yet:
5+
These docs describe **v2**, currently a release candidate, so the version pin is not optional yet:
66

77
=== "uv"
88

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

1313
=== "pip"
1414

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

1919
!!! warning "Why the pin"
2020
Installers never select a pre-release unless you name one, so an unpinned `uv add "mcp[cli]"`
2121
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 beta before you copy
22+
[release history](https://pypi.org/project/mcp/#history) for the newest pre-release before you copy
2323
the line above.
2424

25-
The same applies to one-off commands: `uv run --with "mcp==2.0.0b1" ...`, not `uv run --with mcp ...`.
25+
The same applies to one-off commands: `uv run --with "mcp==2.0.0rc1" ...`, not `uv run --with mcp ...`.
2626

2727
If your *package* depends on `mcp`, add a `<2` upper bound (for example `mcp>=1.27,<2`) before
2828
the stable v2 lands so the major version bump doesn't surprise you.

docs/get-started/real-host.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ 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.0b1" mcp run /absolute/path/to/server.py
26+
uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
2727
```
2828

2929
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.
3030

3131
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.
3232

3333
!!! warning "The version pin is not optional"
34-
v2 of this SDK is in beta, and installers never select a pre-release unless you name one. An
34+
v2 of this SDK is a release candidate, and installers never select a pre-release unless you name one. An
3535
unpinned `--with "mcp[cli]"` gives you the latest **v1.x**, which these docs do not describe.
3636
Use the exact pin from **[Installation](installation.md)**.
3737

@@ -74,7 +74,7 @@ There is nothing to be mystified by. This is the entry it writes:
7474
"run",
7575
"--frozen",
7676
"--with",
77-
"mcp[cli]==2.0.0b1",
77+
"mcp[cli]==2.0.0rc1",
7878
"mcp",
7979
"run",
8080
"/absolute/path/to/server.py"
@@ -107,7 +107,7 @@ Fully quit Claude Desktop (not just its window) and reopen it.
107107
There is no file to edit. Register the server with the `claude` CLI; everything after `--` is the launch command.
108108

109109
```bash
110-
claude mcp add bookshop -- uv run --with "mcp[cli]==2.0.0b1" mcp run /absolute/path/to/server.py
110+
claude mcp add bookshop -- uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
111111
```
112112

113113
Run `/mcp` inside a Claude Code session to confirm `bookshop` is connected and its tools are listed.
@@ -121,7 +121,7 @@ Create `.cursor/mcp.json` in your project root.
121121
"mcpServers": {
122122
"bookshop": {
123123
"command": "uv",
124-
"args": ["run", "--with", "mcp[cli]==2.0.0b1", "mcp", "run", "/absolute/path/to/server.py"]
124+
"args": ["run", "--with", "mcp[cli]==2.0.0rc1", "mcp", "run", "/absolute/path/to/server.py"]
125125
}
126126
}
127127
}
@@ -139,7 +139,7 @@ Create `.vscode/mcp.json` in your project root.
139139
"bookshop": {
140140
"type": "stdio",
141141
"command": "uv",
142-
"args": ["run", "--with", "mcp[cli]==2.0.0b1", "mcp", "run", "/absolute/path/to/server.py"]
142+
"args": ["run", "--with", "mcp[cli]==2.0.0rc1", "mcp", "run", "/absolute/path/to/server.py"]
143143
}
144144
}
145145
}
@@ -156,7 +156,7 @@ Two differences from Cursor's file, and they are the only two: the wrapper key i
156156
Before you touch any host config, run the launch command yourself:
157157

158158
```bash
159-
uv run --with "mcp[cli]==2.0.0b1" mcp run /absolute/path/to/server.py
159+
uv run --with "mcp[cli]==2.0.0rc1" mcp run /absolute/path/to/server.py
160160
```
161161

162162
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,7 +174,7 @@ For anything past those three, **[Troubleshooting](../troubleshooting.md)** is t
174174
## Recap
175175

176176
* 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.0b1" mcp run /absolute/path/to/server.py`: version-pinned, no venv to activate, works from any directory. The pin is mandatory while v2 is in beta.
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.
178178
* **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.
179179
* **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`.
180180
* Absolute paths everywhere, restart the host after editing its config, and never let anything but the SDK write to stdout.

docs/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,21 @@ Python 3.10+.
2222
=== "uv"
2323

2424
```bash
25-
uv add "mcp[cli]==2.0.0b1"
25+
uv add "mcp[cli]==2.0.0rc1"
2626
```
2727

2828
=== "pip"
2929

3030
```bash
31-
pip install "mcp[cli]==2.0.0b1"
31+
pip install "mcp[cli]==2.0.0rc1"
3232
```
3333

3434
The `[cli]` extra gives you the `mcp` command; you'll want it for development.
3535

36-
!!! warning "Pin the version while v2 is in beta"
36+
!!! warning "Pin the version while v2 is pre-release"
3737
Installers never select a pre-release unless you name one, so an unpinned `uv add "mcp[cli]"`
3838
gives you the latest **v1.x** release, which this documentation does not describe. Check
39-
[PyPI](https://pypi.org/project/mcp/#history) for the newest beta before you copy the line
39+
[PyPI](https://pypi.org/project/mcp/#history) for the newest pre-release before you copy the line
4040
above. See [Installation](get-started/installation.md) for the details.
4141

4242
## Example

docs/whats-new.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ Two things happened at once in v2. The **SDK was rebuilt**: a new engine under b
44

55
This page is the tour of both halves, one section per headline, each ending in the page that owns the topic. It is not the porting manual. That is the **[Migration Guide](migration.md)**: every breaking change, with before and after code.
66

7-
!!! note "v2 is a beta"
7+
!!! note "v2 is a release candidate"
88
`pip install mcp` still installs v1.x: you opt into v2 with an exact version pin, and the
99
API can still move before the stable release, which lands alongside the spec release.
1010
**[Installation](get-started/installation.md)** has the copy-paste install line and the
1111
pinning rules. And if anything in v2 breaks, surprises, or slows you down,
1212
[tell us](https://github.com/modelcontextprotocol/python-sdk/issues/new?template=v2-feedback.yaml):
13-
while v2 is in beta, that is the most useful thing you can send us.
13+
before the stable release, that is the most useful thing you can send us.
1414

1515
## The SDK: v1 to v2
1616

@@ -197,7 +197,7 @@ At 2026-07-28 the standalone HTTP GET stream and `resources/subscribe` are repla
197197

198198
### The rest, quickly
199199

200-
* **Identity is optional, per-message metadata.** The request-side `clientInfo` `_meta` key is optional (the required pair is `protocolVersion` + `clientCapabilities`), and `serverInfo` moved out of the `server/discover` result body: servers stamp it into every 2026-era result's `_meta` instead (since `2.0.0b3`; [spec #3002](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/3002)). The SDK always stamps; `client.server_info` is `None` when a server does not identify itself (for example, a middleware stripped the key). **[The low-level Server](advanced/low-level-server.md)** shows the stamp on the wire.
200+
* **Identity is optional, per-message metadata.** The request-side `clientInfo` `_meta` key is optional (the required pair is `protocolVersion` + `clientCapabilities`), and `serverInfo` moved out of the `server/discover` result body: servers stamp it into every 2026-era result's `_meta` instead (since `2.0.0rc1`; [spec #3002](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/3002)). The SDK always stamps; `client.server_info` is `None` when a server does not identify itself (for example, a middleware stripped the key). **[The low-level Server](advanced/low-level-server.md)** shows the stamp on the wire.
201201
* **Requests are routable without parsing bodies.** Modern HTTP requests carry `Mcp-Method` (and, for the three tool-ish calls, `Mcp-Name`); a tool input-schema property annotated with `x-mcp-header` is mirrored into an `Mcp-Param-*` header and cross-checked by the server ([SEP-2243](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2243)). Gateways and rate limiters can route on headers alone; the **[Migration Guide](migration.md#servers-validate-mcp-param-headers-against-the-request-body-sep-2243)** has the rules.
202202
* **Results carry cache hints.** List and read results declare `ttlMs` and `cacheScope` ([SEP-2549](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2549)); you set them per method with `cache_hints=`, and `Client` honors them with a built-in response cache. A server that sends no hints (every pre-2026 server) sees identical, uncached traffic. **[Caching hints](client/caching.md)**.
203203
* **Extensions are first class.** Servers and clients declare optional capability bundles under reverse-DNS identifiers ([SEP-2133](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2133)); the built-in `Apps` extension (MCP Apps) is the reference. **[Extensions](advanced/extensions.md)** and **[MCP Apps](advanced/apps.md)**.

0 commit comments

Comments
 (0)