# MCP Python SDK v2.0.0 - Product: MCP Python SDK (https://whatsnew.fyi/product/mcp-python-sdk) - Vendor: Anthropic - Date: 2026-07-28 - Version: v2.0.0 - Original notes: https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.0.0 - Permalink: https://whatsnew.fyi/product/mcp-python-sdk/releases/v2.0.0 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'. --- - **added** — Support for the 2026-07-28 revision of the Model Context Protocol with stateless requests, no handshake, server/discover, subscriptions/listen, and multi-round-trip requests - **added** — First-class Client object that negotiates protocol version automatically and connects to URLs, stdio subprocesses, custom transports, or server objects in memory - **added** — Resolve parameter for multi-round-trip requests allowing tools to return questions instead of answers in 2026-07-28 era - **added** — Pluggable extension APIs for composing protocol extensions with MCP Apps built in - **added** — OpenTelemetry tracing shipped by default - **added** — Standalone types package mcp-types (imported as mcp_types) published in lock-step with mcp - **added** — OAuth support for RFC 9207 issuer validation, SEP-990 identity-assertion flow, and client-credentials extension - **changed** — MCPServer now speaks both 2026-07-28 and 2025-era protocol revisions from the same server over Streamable HTTP and stdio with automatic version negotiation - **changed** — FastMCP renamed to MCPServer with decorator API unchanged but low-level Server rebuilt around a shared dispatcher engine - **changed** — Client replaces v1's transport-plus-ClientSession-plus-initialize() layering with a single unified object - **changed** — Per-version wire packages are now private (mcp_types._v*) with mcp.types as permanent alias for mcp_types - **changed** — Client cache parameter changed from Client(cache=False) to cache=None with CacheConfig() as default - **changed** — FileResource is_binary parameter renamed to encoding - **changed** — Streamable HTTP servers now reject bodies over 4 MiB with HTTP 413 - **changed** — stdio servers keep handler subprocesses and stray prints off the wire with stdout diverted to stderr while serving - **fixed** — Cancelled requests are no longer answered - **removed** — Context.client_id, RFC7523OAuthClientProvider, and OAuthClientProvider(timeout=) removed - **removed** — MCP_* environment variables removed with pydantic-settings - **deprecated** — v1.x line moved to maintenance mode and will only receive security fixes #### MCP Python SDK v2 Stable Release This is v2.0.0, the stable v2 release of the MCP Python SDK. It supports the 2026-07-28 revision of the Model Context Protocol and serves every earlier revision from the same server. `pip install mcp` now installs 2.x. ```bash pip install "mcp[cli]" #### or uv add "mcp[cli]" ``` ###### Documentation Rewrite The [documentation](https://py.sdk.modelcontextprotocol.io/) has the full tutorial and API reference. Coming from v1? [What's new in v2](https://py.sdk.modelcontextprotocol.io/whats-new/) is the tour of what changed and why, and the [migration guide](https://py.sdk.modelcontextprotocol.io/migration/) lists every breaking change with before-and-after code. ###### V1 Maintenance mode **v1.x is in maintenance mode and will only receive security fixes from now on** The 1.x line 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/. If your project is not ready to migrate, keep a `<2` upper bound on your requirement (for example `mcp>=1.28,<2`). ##### Highlights ###### One SDK, both protocol eras v2 speaks the 2026-07-28 revision (stateless requests with no handshake, `server/discover`, `subscriptions/listen`, multi-round-trip requests) and still serves every 2025-era client from the same `MCPServer`, over Streamable HTTP and stdio, with nothing to configure. `Client(target)` negotiates the version automatically. ###### `FastMCP` is now `MCPServer`, and there is a first-class `Client` The decorator API is unchanged; the low-level `Server` is rebuilt around a shared dispatcher engine, and one `Client` object replaces v1's transport-plus-`ClientSession`-plus-`initialize()` layering. It connects to a URL, a stdio subprocess, a custom transport, or straight to a server object in memory for tests. ###### Multi-round-trip requests and resolver dependency injection At 2026-07-28 the server can no longer call the client, so tools return the question instead. A `Resolve(fn)` parameter is filled by your function invisibly to the model and can put a question to the user; one tool body serves both eras. ###### Extension APIs, OpenTelemetry, and a standalone types package Servers and clients compose protocol extensions through pluggable extension APIs (MCP Apps built in); OpenTelemetry tracing ships on by default; every protocol type is its own package, `mcp-types` (imported as `mcp_types`), published in lock-step with `mcp`. ###### Hardened stdio and auth stdio servers keep handler subprocesses and stray prints off the wire, and stdout is diverted to stderr while serving. OAuth adds RFC 9207 issuer validation, the SEP-990 identity-assertion flow, and the client-credentials extension. ##### Coming from a v2 pre-release Since the last release candidate: the per-version wire packages are private (`mcp_types._v*`), `mcp.types` is a permanent alias for `mcp_types`, the auth registration request model is split from the registered-client record, cancelled requests are no longer answered, and log notifications are gated on the per-request log-level opt-in at 2026-07-28. Since the betas: `Client(cache=False)` is now `cache=None` with `CacheConfig()` the default; `Context.client_id`, `RFC7523OAuthClientProvider`, and `OAuthClientProvider(timeout=)` are removed; the client-credentials providers take `scope=`; `message_handler` receives notifications and exceptions only; `FileResource(is_binary=)` becomes `encoding`; `MCP_*` env vars are gone with `pydantic-settings`; Streamable HTTP servers reject bodies over 4 MiB with HTTP 413. The migration guide covers all of it. ##### Known gaps The tasks extension (SEP-2663) is not part of this release. On the client, the DPoP proof binding (SEP-1932) and the workload-identity `jwt-bearer` grant are not implemented; both are additive and can land i _[Truncated at 4000 characters — full notes: https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.0.0]_