Summary
semantic-kernel currently pins the MCP Python SDK to the 1.x line and cannot be installed alongside mcp 2.0.0 (released 2026-07-28). This issue tracks the breaking changes in mcp 2.0 that affect the Python MCP connector.
Current pins
mcp>=1.26.0,<2.0 — python/pyproject.toml:59
mcp>=1.8,<2.0 — python/pyproject.toml:99 (the mcp extra)
Breaking changes in mcp 2.0 that affect semantic-kernel
All in python/semantic_kernel/connectors/mcp.py, verified against the installed mcp==2.0.0 SDK:
-
streamablehttp_client renamed → streamable_http_client, and dropped kwargs.
mcp.py:20 — from mcp.client.streamable_http import streamablehttp_client
mcp.py:897 — return streamablehttp_client(**args) where args includes headers, timeout, sse_read_timeout (mcp.py:887-895). In 2.0 these kwargs are removed; headers/timeouts must move onto an httpx2.AsyncClient passed as http_client=.
-
ClientSession(read_timeout_seconds=timedelta(...)) now takes a float.
mcp.py:337 — read_timeout_seconds=timedelta(seconds=self.request_timeout) → pass a float of seconds.
-
McpError renamed → MCPError.
mcp.py:24 — from mcp.shared.exceptions import McpError; used at mcp.py:619, 637, 1125, 1158. In 2.0 the name is MCPError (constructor MCPError(code, message, data=None)).
-
camelCase attribute reads on mcp.types → snake_case.
mcp.py:113, 115, 120 — mcp_type.mimeType → mime_type
mcp.py:133 — mcp_type.toolUseId → tool_use_id
mcp.py:207, 208 — tool.inputSchema.get(...) → input_schema
-
Lowlevel @server.list_tools() / @server.call_tool() decorators removed.
mcp.py:1091 — @server.list_tools(); mcp.py:1118 — @server.call_tool() (in the MCPServer class, from mcp.server.lowlevel import Server at mcp.py:22). In 2.0 handlers are registered via the Server(...) constructor (on_list_tools= / on_call_tool=).
Notes
- Dependency-floor updates.
mcp 2.0 requires pydantic>=2.12, anyio>=4.9, typing-extensions>=4.13, and adds required deps opentelemetry-api and mcp-types (exact-pinned to the SDK version); the SDK's HTTP layer moved from httpx/httpx-sse to httpx2>=2.5.0.
Happy to help with a PR if the maintainers are open to it.
Summary
semantic-kernelcurrently pins the MCP Python SDK to the 1.x line and cannot be installed alongsidemcp2.0.0 (released 2026-07-28). This issue tracks the breaking changes inmcp2.0 that affect the Python MCP connector.Current pins
mcp>=1.26.0,<2.0—python/pyproject.toml:59mcp>=1.8,<2.0—python/pyproject.toml:99(themcpextra)Breaking changes in
mcp2.0 that affect semantic-kernelAll in
python/semantic_kernel/connectors/mcp.py, verified against the installedmcp==2.0.0SDK:streamablehttp_clientrenamed →streamable_http_client, and dropped kwargs.mcp.py:20—from mcp.client.streamable_http import streamablehttp_clientmcp.py:897—return streamablehttp_client(**args)whereargsincludesheaders,timeout,sse_read_timeout(mcp.py:887-895). In 2.0 these kwargs are removed; headers/timeouts must move onto anhttpx2.AsyncClientpassed ashttp_client=.ClientSession(read_timeout_seconds=timedelta(...))now takes a float.mcp.py:337—read_timeout_seconds=timedelta(seconds=self.request_timeout)→ pass a float of seconds.McpErrorrenamed →MCPError.mcp.py:24—from mcp.shared.exceptions import McpError; used atmcp.py:619, 637, 1125, 1158. In 2.0 the name isMCPError(constructorMCPError(code, message, data=None)).camelCase attribute reads on
mcp.types→ snake_case.mcp.py:113, 115, 120—mcp_type.mimeType→mime_typemcp.py:133—mcp_type.toolUseId→tool_use_idmcp.py:207, 208—tool.inputSchema.get(...)→input_schemaLowlevel
@server.list_tools()/@server.call_tool()decorators removed.mcp.py:1091—@server.list_tools();mcp.py:1118—@server.call_tool()(in theMCPServerclass,from mcp.server.lowlevel import Serveratmcp.py:22). In 2.0 handlers are registered via theServer(...)constructor (on_list_tools=/on_call_tool=).Notes
mcp2.0 requirespydantic>=2.12,anyio>=4.9,typing-extensions>=4.13, and adds required depsopentelemetry-apiandmcp-types(exact-pinned to the SDK version); the SDK's HTTP layer moved fromhttpx/httpx-ssetohttpx2>=2.5.0.Happy to help with a PR if the maintainers are open to it.