# MCP Python SDK v2.0.0rc1 - Product: MCP Python SDK (https://whatsnew.fyi/product/mcp-python-sdk) - Vendor: Anthropic - Date: 2026-07-27 - Version: v2.0.0rc1 - Original notes: https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.0.0rc1 - Permalink: https://whatsnew.fyi/product/mcp-python-sdk/releases/v2.0.0rc1 - Labels: Pre-release What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **changed** — Client(cache=False) is now Client(cache=None); CacheConfig() is the default and None switches the response cache off - **removed** — Context.client_id is removed; read _meta via ctx.request_context.meta or the authenticated client via get_access_token().client_id - **removed** — RFC7523OAuthClientProvider and JWTParameters are removed; use ClientCredentialsOAuthProvider, PrivateKeyJWTOAuthProvider, or IdentityAssertionOAuthProvider - **changed** — Client-credentials OAuth providers now take scope= instead of scopes= - **removed** — OAuthClientProvider(timeout=...) parameter is removed - **changed** — message_handler receives ServerNotification | Exception only; the RequestResponder arm and mcp.shared.session module are removed - **changed** — FileResource(is_binary=...) is replaced by encoding: str | None - **removed** — MCP_* environment variables no longer configure MCPServer and pydantic-settings is dropped from runtime dependencies - **changed** — Streamable HTTP servers reject request bodies over 4 MiB with HTTP 413; raise max_request_body_size to accept larger messages - **changed** — Request-side clientInfo _meta key is now optional; serverInfo moved out of server/discover result body into every 2026-era result's _meta - **changed** — client.server_info is now Implementation | None - **added** — stdio server decides the protocol era from the client's opening request, enabling subscriptions/listen and other 2026-07-28 features over stdio - **changed** — stdio_server() serves from private duplicates of stdin/stdout and points file descriptors 0 and 1 away from the JSON-RPC stream to prevent corruption from stray output - **changed** — Tool results validated against an output schema are now much faster with compiled and cached JSON Schema validator First v2 release candidate. Pre-releases are opt-in only; `pip install mcp` still resolves to the stable 1.x line. ```bash pip install mcp==2.0.0rc1 #### or uv add "mcp==2.0.0rc1" ``` The [documentation](https://py.sdk.modelcontextprotocol.io/v2/) has the full tutorial and API reference, and the [migration guide](https://py.sdk.modelcontextprotocol.io/v2/migration/) covers coming from v1. Stable v2 is planned for 2026-07-28 alongside the spec release - keep pinning an exact version until then. ##### Highlights ###### API cleanup ahead of stable (breaking for beta users) The last pre-release pass over the public surface; every item has a migration guide entry. - `Client(cache=False)` is now `Client(cache=None)`: `CacheConfig()` is the default and `None` switches the response cache off (#3164). - `Context.client_id` is removed - read `_meta` via `ctx.request_context.meta`, or the authenticated client via `get_access_token().client_id` (#3167). - `RFC7523OAuthClientProvider` and `JWTParameters` are removed - use `ClientCredentialsOAuthProvider`, `PrivateKeyJWTOAuthProvider`, or `IdentityAssertionOAuthProvider` (#3169). - The client-credentials providers take `scope=`, not `scopes=` (#3166). - `OAuthClientProvider(timeout=...)` is removed; it never bounded anything (#3165). - `message_handler` receives `ServerNotification | Exception` only; the dead `RequestResponder` arm and the `mcp.shared.session` module are gone (#3168). - `FileResource(is_binary=...)` is replaced by `encoding: str | None` (#3171). - `MCP_*` environment variables never configured `MCPServer` and are no longer advertised; `pydantic-settings` is dropped from the runtime dependencies (#3170). - Streamable HTTP servers reject request bodies over 4 MiB with HTTP 413; raise `max_request_body_size` if you accept larger messages (#3095). ###### Aligned with the final 2026-07-28 identity shape (#3143) The request-side `clientInfo` `_meta` key is optional (the required pair is `protocolVersion` + `clientCapabilities`), and `serverInfo` moved out of the `server/discover` result body into every 2026-era result's `_meta`; `client.server_info` is now `Implementation | None`. This tracks spec change [#3002](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/3002) and fixes interop with servers that already omit body `serverInfo`. ###### The full 2026-07-28 revision over stdio (#3152) A stdio (or in-memory) server now decides the protocol era from the client's opening request, so `subscriptions/listen` and every other 2026-07-28 feature serve over stdio, not only Streamable HTTP. ###### stdio servers keep handlers off the wire (#3117) `stdio_server()` serves from private duplicates of stdin/stdout and points fd 0 at the null device and fd 1 at stderr while it runs, so a stray `print()` or a chatty child process can no longer corrupt the JSON-RPC stream. This fixes the classic print-corrupts-the-wire class ([#409](https://github.com/modelcontextprotocol/python-sdk/issues/409)) and the Windows tool-call hang ([#671](https://github.com/modelcontextprotocol/python-sdk/issues/671)). ##### Notes - Tool results validated against an output schema are much faster: the JSON Schema validator is compiled once and cached (#3134). - The tasks extension (SEP-2663) is not in this release, and will not be in v2.0.0. - If you install under uv's `exclude-newer` cooldown: `mcp` pins `mcp-types` to the exact same version, so exempt both packages - `exclude-newer-package = { mcp = false, mcp-types = false }`. ##### What's Changed * Add Streamable HTTP request body limits by @Kludex in https://github.com/modelcontextprotocol/python-sdk/pull/3095 * docs: document Windows stdio subprocess stdin handling by @AndreKalberer in https://github.com/modelcontextprotocol/python-sdk/pull/3079 * docs: make API reference rendering independent of page order by @maxisbey in https://github.com/modelcontextprotocol/python-sdk/pull/3107 _[Truncated at 4000 characters — full notes: https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.0.0rc1]_