---
title: "MCP Python SDK 1.29.0 — MCP compatibility"
description: "More permissive than the TypeScript 1.x line on two cells: it sends `resource` unconditionally and takes a metadata document URL directly. It still performs no issuer validation."
canonicalUrl: "https://zuplo.com/learn/mcp/compatibility/clients/python-sdk-1x"
pageType: "mcp-client"
kind: "Reference SDK, 1.x line"
verified: "2026-07-31"
---

# MCP Python SDK 1.29.0

> More permissive than the TypeScript 1.x line on two cells: it sends `resource` unconditionally and takes a metadata document URL directly. It still performs no issuer validation.

_Reference SDK, 1.x line. Protocol revision: `2025-11-25`._

## Support

- **stdio** — Yes
- **Streamable HTTP** — Yes
- **Legacy HTTP+SSE** — Yes
- **Protocol revision** — `2025-11-25`
- **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)** — No
- **Custom headers** — Yes

**Protocol revision.** `2025-11-25`. Like the TypeScript 1.x row, this is the line most libraries pin.

## 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 absence. The 1.29.0 client auth module is 627 lines and carries none of the issuer handling that the 2.x file added, which is the cleanest illustration of why an SDK-version row matters more than a client's own marketing.

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

[Primary source](https://github.com/modelcontextprotocol/python-sdk)

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

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