MCP Python SDK v2.1.0

v2.1.0
Added 5
  • Client accepts StdioServerParameters directly
  • Prompt messages accept Image and Audio
  • Prompt functions may return bare content blocks
  • Message, UserMessage, and AssistantMessage are exported from mcp.server.mcpserver
  • SseServerTransport and MCPServer.sse_app() take max_request_body_size parameter
Changed 3
  • Handler exceptions from tool, resource or prompt handlers are logged once at ERROR with traceback, and client sees only Error executing message instead of exception text
  • Content-block return annotations no longer advertise outputSchema or return structuredContent for tools returning TextContent, EmbeddedResource, Image, Audio, or lists/unions of them
  • The 4 MiB request body limit now covers the SSE transport and OAuth endpoints
Fixed 8
  • TypedDict tool results with NotRequired keys are omitted instead of serialized as null
  • TypedDict tool registration no longer fails on Python 3.10
  • Recursive tool return types get an object-rooted outputSchema that pre-2026 clients accept
  • POSTed notifications such as notifications/cancelled are acknowledged with 202 instead of 400 on 2026-07-28 HTTP entry
  • Pre-2026 sessions ignore cache-hint fields from later revisions instead of failing list_tools()
  • Pre-2026 sessions accept boolean sub-schemas in tool schema properties
  • mcp install reads and preserves Claude Desktop config containing non-ASCII text on any Windows code page
  • SSE message endpoint answers 405 to non-POST requests

From MCP Python SDK

Highlights
  • Client accepts StdioServerParameters directly: Client(StdioServerParameters(command="uv", args=["run", "server.py"])) (#3321).
  • Prompt messages accept Image and Audio, prompt functions may return bare content blocks, and Message / UserMessage / AssistantMessage are exported from mcp.server.mcpserver (#3320).
  • The 4 MiB request body limit now also covers the SSE transport and the OAuth endpoints; SseServerTransport and MCPServer.sse_app() take max_request_body_size, and the SSE message endpoint answers 405 to non-POST requests (#3336).
Behaviour changes to be aware of
  • Handler exceptions (#3314): an unexpected exception from a tool, resource or prompt handler is logged once at ERROR with its traceback, and the client now sees only Error executing tool <name> (or the resource/prompt equivalent) rather than the exception text. Raise ToolError / ResourceError when the message is meant for the model; those still reach the client and are logged at INFO without a traceback.
  • Content-block return annotations (#3320): a tool annotated to return TextContent, EmbeddedResource, Image, Audio, or lists/unions of them no longer advertises outputSchema or returns structuredContent; its content is unchanged. Pass structured_output=True to keep the previous shape.
Fixes
  • TypedDict tool results: NotRequired keys are omitted instead of serialized as null, and registration no longer fails on Python 3.10 (#3224, #3227); recursive return types get an object-rooted outputSchema that pre-2026 clients accept (#3337).
  • 2026-07-28 over HTTP: a POSTed notification such as notifications/cancelled is acknowledged with 202 instead of rejected with 400 (#3324).
  • Pre-2026 sessions ignore cache-hint fields from later revisions instead of failing list_tools() (#3223), and accept boolean sub-schemas in tool schema properties (#3353).
  • mcp install reads and preserves a Claude Desktop config containing non-ASCII text on any Windows code page (#3296).
What's Changed
New Contributors

Full Changelog: https://github.com/modelcontextprotocol/python-sdk/compare/v2.0.0...v2.1.0

View original

Upgraded? How did it go?

Discussion