Skip to main content

MCP's '10,000 Connections at Sub-50ms' Claim Is True — and Doesn't Mean What You Think

9 min readDora NodaDora Noda
Share
On this page

"MCP servers handle over 10,000 concurrent connections with sub-50ms response times." That line shows up, nearly verbatim, across a wave of 2026 architecture write-ups, and it's become the go-to citation for "MCP is production-ready now." It's also, on its own, close to meaningless — because it never says what a connection is, or what sub-50ms is measured from.

Two days before this post, on July 28, 2026, the Model Context Protocol's largest spec revision since launch shipped as a release candidate, making MCP stateless at the protocol layer. That change is the actual reason horizontal scaling got easier — the 10,000/sub-50ms number is a headline, the spec change is the mechanism. A deploy-and-rollback MCP server sitting in front of a fleet of agents — not a single chat session — needs to know the difference, because the gap between them is exactly where a "works in the demo" server stops holding up.

What the Headline Number Actually Counts

Start with the two halves of the claim separately, because they measure different things.

"10,000 concurrent connections" almost certainly counts held-open connections, not active work. MCP's HTTP transport keeps a connection open for a Server-Sent-Events stream or a long-poll, and an event-loop server (Node, Go, or anything non-thread-per-connection) can hold tens of thousands of idle sockets on modest hardware — that's the same c10k-era result that's been true of web servers for two decades, just re-discovered for MCP. Holding a connection open costs a few kilobytes of buffer and a file descriptor. It says nothing about how many of those connections can be doing something at once.

"Sub-50ms" is the harder number to pin down, and a real production trace makes the gap obvious. A Docker-based MCP deployment on an AWS EC2 c6i.4xlarge, measured end to end, reports a p95 latency of 180ms — broken down as:

HopLatency
Client → gateway5ms
Authentication10ms
Connection-manager routing25ms
MCP server processing90ms
External API call50ms
Total (p95)180ms

The "sub-50ms" figure lines up with just the routing segment of that chain — the gateway-and-connection-manager hop before a tool call reaches the server that actually does anything. It's a real number, and it's a legitimate one to optimize for. It is not the number a deploying agent experiences when it calls deploy and waits for a result.

Now put an actual ceiling on the "doing something at once" half. TM Dev Lab's cross-language MCP benchmark measured sustained throughput for real tool-call workloads and found a roughly 5–19x spread by implementation:

Language / stackRequests per second
Rust (Quarkus-adjacent)~4,700–4,850
Go / Java~3,000–3,620
JavaScript / Python~250–880

And two independent production deployments cap concurrent active tool calls — not connections — far below 10,000: Modal's MCP pattern allows 64 concurrent tool calls per container before autoscaling on queue depth kicks in (with cold starts adding ~400ms when a new container spins up), and a Supabase-backed pattern on a c6i.large replica tops out around 150 concurrent agent connections doing real work. Both scale by adding instances behind a load balancer, not by pushing a single instance past its real ceiling.

So the honest version of the headline claim is: a well-built MCP server can hold 10,000 idle-to-light connections open cheaply, route the ones that matter through the gateway layer in under 50ms, and still only push somewhere between 250 and 4,800+ tool calls per second of actual work, depending entirely on the language it's written in — with a full round trip, once a real backend and an external API call are involved, landing closer to 180ms than 50. Both numbers in the marketing line are true. Neither one describes what a deploy tool call costs an agent waiting on it.

One Chat Session vs. an Agent Fleet

That distinction — connections held vs. work in flight — is invisible in a demo and load-bearing in production, because of who's calling the server.

A single chat session opens one connection and issues tool calls one at a time, gated by how fast a human reads the response. It will never come close to testing a server's concurrency ceiling; it barely tests its p50 latency. An agent fleet is a different caller entirely: dozens to hundreds of independent agents, each capable of issuing a tool call the moment its own reasoning step finishes, with no human pacing the request rate. That's the workload that turns "64 concurrent tool calls per container" from a comfortable margin into a queue.

It also breaks a rate-limiting assumption that holds fine for one session and fails for a fleet. Most MCP servers rate-limit independently, per server. That's correct behavior for a human with one chat window open. It's a quota multiplier for a fleet: an agent hitting ten independently-rate-limited MCP servers effectively gets ten times its intended quota, because nothing is tracking the agent's total call volume across servers. A production deployment needs a shared, fleet-wide counter — every server checks a common limiter before it accepts a call — not ten servers each independently deciding the caller looks fine.

This is also exactly what the July 28, 2026 spec RC changes for the better. Removing the handshake and session-header requirement means any instance can now handle any request — plain round-robin load balancing, no sticky routing, no shared session store to keep consistent during a failover. Before this change, scaling an MCP server horizontally meant either pinning an agent's session to one instance (a single point of failure per session) or standing up shared session storage (Redis, typically) just to let instances hand off state. Stateless-at-the-protocol-layer means the fleet-of-agents problem — many concurrent callers, no single instance that can fall over and take a live conversation with it — finally has a load-balancing story that doesn't require extra infrastructure to get right.

What a Deploy/Rollback MCP Server Actually Needs to Hold Up

Put the numbers together and a production deploy-from-chat MCP server's checklist looks concrete, not aspirational:

  • Stateless instances behind a plain round-robin LB. The new spec RC makes this the default shape rather than a workaround — no session affinity to lose, no failover that drops an in-flight deploy.
  • A language/runtime choice that matches the concurrency budget, not the prototyping budget. The 250 RPS a Python or JS implementation tops out at is fine for a chat-session-shaped load; it is a hard ceiling for a fleet issuing deploy, rollback, and log-tail calls concurrently. Rust and Go stacks buy 5–19x the headroom for the same instance count — the difference between adding replicas to keep up with a burst and running out of room during one.
  • A fleet-wide rate limiter, not a per-instance one. Independent per-server limits are the quota-multiplier bug described above; a deploy tool that can mutate production needs a shared counter an agent can't route around by calling a different replica.
  • Per-call auth, dry-run, and an audit trail that survives horizontal scaling. Stateless routing means any instance can serve any request — which also means the audit log has to be centralized, not sitting on whichever instance happened to handle the call. A deploy call an agent fleet issues needs the same "which agent, what scope, did it actually ship or just dry-run" record whether it lands on instance 3 or instance 30.
  • Capacity headroom measured in concurrent tool calls, not connections. Modal's 64-per-container and the Supabase pattern's ~150-per-replica numbers are the metric to size against — not "how many sockets can this server hold open," which was never the bottleneck.

That last point is the whole argument in one line: a demo MCP server is bottlenecked by nothing, because one human typing in a chat window can't generate enough concurrent load to find the ceiling. A production deploy-authority server is bottlenecked by real concurrent tool calls the moment an agent fleet — not a person — is the caller, and that ceiling shows up in the hundreds or low thousands of RPS, not the 10,000-connections headline.

Throughput Isn't the Whole Bar

Handling load is necessary and not sufficient. A parallel July 2026 vulnerability census — a scan of over 7,000 public MCP servers — found SSRF vulnerabilities in 36.7% of them, and separate scans put roughly 40% of remote MCP servers as reachable with no authentication at all. More than 40 CVEs have been disclosed against MCP implementations so far in 2026.

A server that comfortably clears 3,000 RPS and still accepts an unauthenticated deploy call from anyone who finds its URL isn't a production-grade deploy tool — it's a fast, unlocked one. The concurrency numbers in this post describe whether a server can hold up under real agent-fleet load; they say nothing about whether it should be trusted with a deploy call once it does. Both bars have to clear before "production-ready" means what it says.


Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, with a deploy/rollback MCP server built for a fleet of agents calling it, not a single chat session. Star the repo on GitHub or deploy your first app today.

Sources

Related articles

Give your agents a chain backend

Autonomous agents hit RPC endpoints very differently than people do. See what bex router handles on their behalf.

Read the agents guide