The MCP 2026-07-28 SDK betas landed June 29. You have 18 days. Four official SDKs updated simultaneously — Python, TypeScript, Go, and C# — and each has at least one change that will silently break production if you wait for the stable release to learn about it. This is not another post about what the stateless spec means conceptually. This is what changes in your actual code and your deployment infra before July 28.
TypeScript: The One That Fools Your CI #
The TypeScript migration is the sneakiest of the four. MCP v2 does not ship as a new version of @modelcontextprotocol/sdk
. It ships under two entirely new package names:
npm install @modelcontextprotocol/server@beta
npm install @modelcontextprotocol/client@beta
The old @modelcontextprotocol/sdk
package remains at v1, unchanged. Any tool watching that package name — Dependabot, Renovate, your internal scanner — will report you as current while you are a full major version behind. The upgrade plan of “bump the version number” does not work here.
Beyond the package split, v2 is ESM-only and requires Node.js 20 or later. The .tool()
method is renamed to registerTool()
, though a codemod handles that automatically:
npx @modelcontextprotocol/codemod@beta v1-to-v2 .
HTTP deployments get a backwards-compatible escape hatch: createMcpHandler
serves the new 2026-07-28 protocol per request with an automatic 2025-11-25 fallback from the same endpoint, so clients on v1 keep connecting during the transition.
Python: One Import Line, One Clarification #
The Python migration is straightforward, but there is a naming confusion worth clearing up before it burns you. The official MCP Python SDK renamed its bundled FastMCP
class to MCPServer
. Install the beta with uv add "mcp[cli]==2.0.0b1"
and update the import:
from mcp.server.fastmcp import FastMCP
from mcp.server import MCPServer
The decorator API — @server.tool()
, @server.resource()
— is unchanged. Your tool definitions do not need rewriting. The standalone FastMCP project maintained by PrefectHQ is not affected; this rename applies only to the class bundled inside modelcontextprotocol/python-sdk
. V2 servers answer both the new server/discover
method and the legacy initialize
handshake, so clients on the old spec keep connecting during the transition.
Infrastructure: Where Most Teams Will Actually Spend Time #
The stateless architecture shift has a larger real-world blast radius than any API rename, and it lives in your infrastructure config more than your application code. Run this test before July 28: point a v1 client at a round-robin load balancer distributing across two MCP server instances. The client mints a session on instance A. Follow-up requests hitting instance B fail — that instance has no session context. That failure mode is exactly what the deadline enables for teams still running session-affinity infrastructure.
Four concrete things need attention:
- Remove sticky-session and session-affinity rules from your load balancer
- Drop server-side per-session state storage
- Fix client reconnection logic that assumes persistent SSE channels
- Update any code matching the literal
-32002
error code — missing resource now returns JSON-RPC standard-32602
Application state does not have to disappear. Servers that need cross-call continuity should mint an explicit handle from a tool and pass it back as a standard argument. That is now the application’s responsibility, not the protocol’s — which is the right separation of concerns.
Go and C#: The Gentler Paths #
Go teams get the easiest migration. Version v1.7.0-pre.1 uses the same module path (go get github.com/modelcontextprotocol/go-sdk@v1.7.0-pre.1
), so the upgrade is a drop-in for most codebases. Stateless mode is opt-in via StreamableHTTPOptions.Stateless = true
— servers that leave it unset continue negotiating the v1 protocol by default. C# is similarly gentle: stable v1 APIs are retained in 2.0.0-preview.1, deprecated capabilities are marked [Obsolete]
but remain functional, and the HTTP transport defaults to stateless mode — confirm that in your test suite.
Deprecated Features: Plan It, Not Now #
Roots, Sampling, and Logging enter deprecation on July 28. They are not removed — the minimum window is 12 months, putting actual removal no earlier than July 2027. The replacements are direct: tool parameters or resource URIs for Roots, direct LLM API calls for Sampling, stderr or OpenTelemetry for Logging. Add it to your Q3 backlog and move on.
Your 18-Day Checklist #
- TypeScript: install
@modelcontextprotocol/server
and@modelcontextprotocol/client
explicitly — do not rely on a version bump to the old SDK - Python: swap
FastMCP
forMCPServer
in import paths; pin tomcp==2.0.0b1
for testing - Run the round-robin load-balancer test against your server before the stable release lands
- Audit client code that matches
-32002
and update to-32602
- Go: set
StreamableHTTPOptions.Stateless = true
to exercise the new protocol path in tests - Report issues to the PythonorTypeScriptSDK repositories before July 28, not after
The stable SDKs land July 27 — one day before the spec finalizes. The full release candidate spec and SDK beta announcement are the authoritative sources. Teams that have not tested by July 27 are chasing a moving target while the rest of the ecosystem moves on.