Technology

MCP v2 Stateless vs MCP v1 Stateful (2026): Spec Final, Core SDK Still on 1.30.0

MCP v2 stateless vs MCP v1 stateful, four days after the July 28 deadline: the specification tag is final and PyPI mcp is on 2.0.0, but @modelcontextprotocol/sdk is still 1.30.0. Compare scaling, SDK stability, authorization and migration risk.

5
MCP v2 Stateless
vs
1
MCP v1 Stateful
Quick Verdict

Four days after the deadline the picture has changed twice over. The specification is final: the 2026-07-28 tag went non-prerelease at 16:47 UTC on July 28, so the governance objection to cutting over is gone. PyPI followed the same day — pip install mcp now resolves to 2.0.0 (uploaded 13:45 UTC on July 28), not the 1.28.1 that was still current on deadline morning. What has not moved is the core TypeScript SDK: @modelcontextprotocol/sdk is still 1.30.0, published 2026-07-27T17:56 UTC, and counting. So the split is no longer TypeScript versus Python; it is server packages and Python versus the one core TypeScript package that almost every custom client imports. Choose v2 Stateless now if you build MCP servers in TypeScript (the scoped @modelcontextprotocol/server, /node and /hono packages are 2.0.0 stable) or in Python, and if you need horizontal scaling without sticky sessions, restart-safe routing and clean serverless execution. Stay on v1 Stateful where you depend on @modelcontextprotocol/sdk itself — client code and anything built on the core SDK has no 2.x to install — or where your clients and adapters are untested against a stateless server. Pin either way: four scoped npm packages and PyPI's mcp all now resolve latest to 2.0.0, so an unpinned install crosses a major version by itself. And nothing broke on July 28: the Roots, Sampling and Logging deprecations are annotation-only for at least a year, so migrate deliberately, package by package.

Detailed Comparison

A side-by-side analysis of key factors to help you make the right choice.

Factor
MCP v2 StatelessRecommended
MCP v1 StatefulWinner
Horizontal scaling
Any request can be routed to any compatible server instance once the app keeps state outside the protocol server
Long-lived sessions and connection affinity are easier to reason about, but they complicate autoscaling and failover
SDK stability
Shipped in stages: the scoped server packages went 2.0.0 stable on July 27 and PyPI mcp followed on July 28, but @modelcontextprotocol/sdk is still 1.30.0 — v2 is installable everywhere except the core TypeScript package
Still what you get from @modelcontextprotocol/sdk, and still the maintained line for bug and security fixes on that package
Serverless and ephemeral hosting
Designed for short-lived request/response execution, so Vercel, Cloud Run, Lambda-style and container autoscaling patterns become cleaner
Works best when a process can keep session context alive; possible in serverless, but operationally awkward
State management model
Forces state into explicit client context, shared stores or application databases, which is cleaner but requires refactoring
Lets server code keep conversational/session assumptions in memory, which is convenient for simple internal tools
Ecosystem compatibility today
The specification is final and both the TypeScript server surface and Python are installable at 2.0.0, so a mixed-language stack can now move almost as one unit
Most existing examples, packages and internal servers still assume v1 behaviour, and anything importing the core TypeScript SDK has no alternative
Authorization and governance
The final 2026-07-28 specification requires OAuth 2.0 Protected Resource Metadata (RFC 9728) to advertise the authorization server location, and bundles a formal deprecation policy into the protocol roadmap
Authorization can be governed at the gateway, but the protocol line is older and less explicit about the new model
Migration risk
Now spread across both registries: an unpinned install can jump to 2.0.0 on four scoped npm packages and on pip install mcp without you asking, so version bounds and parallel testing are mandatory
Low if you pin — but the risk is live on npm and PyPI now, not just on npm
Future-proofing
Aligned with a specification that is now final rather than a release candidate; the server packages and Python are already there and the core SDK is the only piece still to follow
A compatibility baseline with a named escape hatch (server-legacy), but one that shipped already deprecated
Total Score5/ 81/ 82 ties
Horizontal scaling
MCP v2 Stateless
Any request can be routed to any compatible server instance once the app keeps state outside the protocol server
MCP v1 Stateful
Long-lived sessions and connection affinity are easier to reason about, but they complicate autoscaling and failover
SDK stability
MCP v2 Stateless
Shipped in stages: the scoped server packages went 2.0.0 stable on July 27 and PyPI mcp followed on July 28, but @modelcontextprotocol/sdk is still 1.30.0 — v2 is installable everywhere except the core TypeScript package
MCP v1 Stateful
Still what you get from @modelcontextprotocol/sdk, and still the maintained line for bug and security fixes on that package
Serverless and ephemeral hosting
MCP v2 Stateless
Designed for short-lived request/response execution, so Vercel, Cloud Run, Lambda-style and container autoscaling patterns become cleaner
MCP v1 Stateful
Works best when a process can keep session context alive; possible in serverless, but operationally awkward
State management model
MCP v2 Stateless
Forces state into explicit client context, shared stores or application databases, which is cleaner but requires refactoring
MCP v1 Stateful
Lets server code keep conversational/session assumptions in memory, which is convenient for simple internal tools
Ecosystem compatibility today
MCP v2 Stateless
The specification is final and both the TypeScript server surface and Python are installable at 2.0.0, so a mixed-language stack can now move almost as one unit
MCP v1 Stateful
Most existing examples, packages and internal servers still assume v1 behaviour, and anything importing the core TypeScript SDK has no alternative
Authorization and governance
MCP v2 Stateless
The final 2026-07-28 specification requires OAuth 2.0 Protected Resource Metadata (RFC 9728) to advertise the authorization server location, and bundles a formal deprecation policy into the protocol roadmap
MCP v1 Stateful
Authorization can be governed at the gateway, but the protocol line is older and less explicit about the new model
Migration risk
MCP v2 Stateless
Now spread across both registries: an unpinned install can jump to 2.0.0 on four scoped npm packages and on pip install mcp without you asking, so version bounds and parallel testing are mandatory
MCP v1 Stateful
Low if you pin — but the risk is live on npm and PyPI now, not just on npm
Future-proofing
MCP v2 Stateless
Aligned with a specification that is now final rather than a release candidate; the server packages and Python are already there and the core SDK is the only piece still to follow
MCP v1 Stateful
A compatibility baseline with a named escape hatch (server-legacy), but one that shipped already deprecated

Key Statistics

Real data from verified industry sources to support your decision.

The scoped MCP server packages — @modelcontextprotocol/server, /node, /hono and /server-legacy — all published their first non-prerelease 2.0.0 at 23:55 UTC on 2026-07-27, five minutes before deadline day, after four alphas and five betas.

npm registry (@modelcontextprotocol/server)

The specification tag 2026-07-28 is final: GitHub reports prerelease=false, published 2026-07-28T16:47:49Z — the first final MCP specification since 2025-11-25.

modelcontextprotocol/modelcontextprotocol GitHub releases

The core TypeScript SDK still has no 2.x: @modelcontextprotocol/sdk latest is 1.30.0, published 2026-07-27T17:56 UTC — it did not move when the scoped server packages, PyPI and the specification all went final.

npm registry (@modelcontextprotocol/sdk)

PyPI's mcp moved to 2.0.0 on 2026-07-28T13:45:28Z, superseding the 1.28.1 published on 2026-06-26 — a plain pip install mcp now installs v2.

PyPI (mcp)

The v1 escape hatch shipped pre-deprecated: server-legacy is published as “Frozen v1 SSE transport and OAuth Authorization Server helpers… Deprecated; use StreamableHTTP and a dedicated OAuth server in production.”

npm registry (@modelcontextprotocol/server-legacy)

The maintainers say 84% of more than 10,000 PyPI packages that depend on mcp declare no upper bound, so an unpinned install can pull a breaking v2 pre-release.

modelcontextprotocol/python-sdk GitHub

The July 28 deprecations of Roots, Sampling and Logging are annotation-only: those methods, types and capability flags keep working in this release and in every spec version published within a year of it, so existing v1 servers do not break on July 28.

Model Context Protocol Blog

MCP servers MUST implement OAuth 2.0 Protected Resource Metadata (RFC 9728) to advertise their authorization server location; the 2026-07-28 RC additionally restricts server-initiated requests to only be issued while the server is actively processing a client request (SEP-2260).

Model Context Protocol Authorization Spec

All statistics come from verified third-party sources. Source, year, and direct link are shown on each metric.

When to Choose Each Option

Clear guidance based on your specific situation and needs.

Choose MCP v2 Stateless when...

  • You ship MCP servers in TypeScript (@modelcontextprotocol/server 2.0.0) or in Python, where pip install mcp now resolves to 2.0.0
  • You need horizontal scaling without sticky sessions, or serverless and ephemeral hosting for remote tools
  • You can move session state into clients, databases or shared stores before cutover
  • Your governance required a final specification tag before cutover — the 2026-07-28 tag is now final, not a release candidate

Choose MCP v1 Stateful when...

  • Your code imports @modelcontextprotocol/sdk directly: it is still 1.30.0 and has no 2.x release to install
  • Your server logic still relies on long-lived sessions, or your clients and adapters are untested against a stateless server
  • You run pinned v1 infrastructure where an in-place major upgrade is riskier than the scaling headroom you would gain
  • Your rollout process requires client tooling and servers to sit on the same major version

Our Recommendation

Four days after the deadline the picture has changed twice over. The specification is final: the 2026-07-28 tag went non-prerelease at 16:47 UTC on July 28, so the governance objection to cutting over is gone. PyPI followed the same day — pip install mcp now resolves to 2.0.0 (uploaded 13:45 UTC on July 28), not the 1.28.1 that was still current on deadline morning. What has not moved is the core TypeScript SDK: @modelcontextprotocol/sdk is still 1.30.0, published 2026-07-27T17:56 UTC, and counting. So the split is no longer TypeScript versus Python; it is server packages and Python versus the one core TypeScript package that almost every custom client imports. Choose v2 Stateless now if you build MCP servers in TypeScript (the scoped @modelcontextprotocol/server, /node and /hono packages are 2.0.0 stable) or in Python, and if you need horizontal scaling without sticky sessions, restart-safe routing and clean serverless execution. Stay on v1 Stateful where you depend on @modelcontextprotocol/sdk itself — client code and anything built on the core SDK has no 2.x to install — or where your clients and adapters are untested against a stateless server. Pin either way: four scoped npm packages and PyPI's mcp all now resolve latest to 2.0.0, so an unpinned install crosses a major version by itself. And nothing broke on July 28: the Roots, Sampling and Logging deprecations are annotation-only for at least a year, so migrate deliberately, package by package.

Frequently Asked Questions

Common questions about this comparison answered.

Yes, in stages, and most of it landed on the day itself. The scoped TypeScript server packages went 2.0.0 stable at 23:55 UTC on July 27; PyPI's mcp moved to 2.0.0 at 13:45 UTC on July 28; and the specification tag 2026-07-28 went non-prerelease at 16:47 UTC on July 28. The one piece still outstanding is the core TypeScript SDK, @modelcontextprotocol/sdk, which remains 1.30.0.
For servers, largely yes: the specification is final, the TypeScript server packages are 2.0.0 stable and Python installs 2.0.0 by default. The remaining gap is client-side and library-side — anything importing @modelcontextprotocol/sdk is still on 1.30.0. Pilot the server layer first and keep code that depends on the core SDK pinned.
More urgently than on deadline day. The latest tag now resolves to 2.0.0 on four scoped npm packages and on PyPI's mcp, so an unpinned install crosses a major version by itself. The maintainers report that 84% of the 10,000+ PyPI packages depending on mcp declare no upper bound — that population is now exposed in practice, not in theory.
It is the named v1 escape hatch, and it shipped already deprecated: frozen v1 SSE transport plus OAuth Authorization Server helpers, published with the instruction to use StreamableHTTP and a dedicated OAuth server in production. Use it to keep a v1 server running while you migrate — not as a destination.
No. Stateless means the protocol server should not depend on a long-lived session to answer a request. Your application can still keep state, but it should live in the client, a database, a cache or another explicit persistence layer.
Teams running remote MCP server infrastructure at scale, in either TypeScript or Python: they gain ordinary load balancing, stateless routing and clearer authorization, and both languages now have a stable 2.0.0. Teams whose code imports the core TypeScript SDK should wait for its 2.x, because there is nothing yet to install.

Need help deciding?

Book a free 30-minute consultation and we'll help you determine the best approach for your specific project.

Free consultation
No obligation
Response within 24h