---
title: "MCP Python SDK 2.0.0 — MCP compatibility"
description: "The two reference SDKs made opposite default choices at version 2.0.0, and this is the half that defaults to the current revision. It's also the only row here with a yes in the issuer-validation column."
canonicalUrl: "https://zuplo.com/learn/mcp/compatibility/clients/python-sdk"
pageType: "mcp-client"
kind: "Reference SDK, 2.x line"
verified: "2026-07-31"
---

# MCP Python SDK 2.0.0

> The two reference SDKs made opposite default choices at version 2.0.0, and this is the half that defaults to the current revision. It's also the only row here with a yes in the issuer-validation column.

_Reference SDK, 2.x line. Protocol revision: `2026-07-28`._

## Support

- **stdio** — Yes
- **Streamable HTTP** — Yes
- **Legacy HTTP+SSE** — Yes
- **Protocol revision** — `2026-07-28`
- **Runs the OAuth flow** — Yes
- **Registration (RFC 7591)** — Yes
- **Metadata document** — Yes
- **Pre-registered client ID** — Yes
- **Sends resource (RFC 8707)** — Yes
- **Validates iss (RFC 9207)** — Yes
- **Custom headers** — Yes

**Protocol revision.** `2026-07-28`. Its `LATEST_PROTOCOL_VERSION` is the current revision, and `Client` defaults to a mode that lands there.

## Caveats and sources

Each one names the column it qualifies and cites the page it comes from, which is often not the page in the row's primary source.

### Validates iss (RFC 9207)

Source-verified present: the current client auth module carries an explicit RFC 9207 issuer check, sends `resource` on the authorization request, the token request, and the refresh, and validates protected resource metadata against the server URL. None of that is in 1.29.0.

[Source](https://github.com/modelcontextprotocol/python-sdk/blob/main/src/mcp/client/auth/oauth2.py)

### Protocol revision

`Client` defaults to `mode='auto'`, which probes `server/discover` on enter and falls back to the `initialize` handshake — so against a version 2 server it lands on `2026-07-28` on every transport, where server-initiated requests are refused. A version 1 test that drove elicitation, sampling, or a roots listing now fails with `NoBackChannelError`. Frameworks that use the low-level session path instead don't reach the current revision.

[Source](https://github.com/modelcontextprotocol/python-sdk/blob/main/docs/migration.md)

### Tasks extension

The `2026-07-28` revision reintroduces tasks as an official extension, and this SDK doesn't implement it.

[Source](https://github.com/modelcontextprotocol/python-sdk/blob/main/docs/migration.md)

[Primary source](https://github.com/modelcontextprotocol/python-sdk/blob/main/src/mcp-types/mcp_types/version.py)

_This row was last verified 2026-07-31 against the 2026-07-28 revision._

- **Clients** — [every client in the matrix](/learn/mcp/compatibility/clients)
