MCP TypeScript SDK CVE-2026-111770
HIGHAttack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach shared MCP HTTP endpoint as second client
-
DeliveryIssue requests with low JSON-RPC ids (from 0)
-
ExploitCollide ids with concurrent victim client
-
ExecutionReceive victim's responses and notifications
-
ImpactDisclose another client's data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Concurrency control, locking
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires ALL of: (1) an MCP server exposed over HTTP (Streamable HTTP transport), (2) more than one client able to reach the same endpoint, and (3) application code that creates the transport or the McpServer/Server instance ONCE at startup and shares it across requests - specifically a stateless transport (sessionIdGenerator: undefined) reused across requests, or a single server object reused across requests/sessions, exactly as the pre-fix README examples for @modelcontextprotocol/hono, express, fastify and node demonstrated. Limiting factors that remove exposure: stdio servers are not affected; createMcpHandler() used with a factory that builds a new server per call is not affected; @modelcontextprotocol/sdk 1.26.0+ is not affected; and per-request or per-session (sessionIdGenerator set) construction is safe. No end-user interaction or authentication is needed, but the vulnerable shared-instance deployment pattern is the hard prerequisite. |
| Impact | This is a genuine information-disclosure flaw in the MCP TypeScript server SDK (@modelcontextprotocol/server 2.0.0-2.2.0), scored CVSS 7.7 with vector AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:H. The CVSS signals are mixed: AV:N and PR:N indicate a remote, unauthenticated reach, but AC:H correctly reflects that triggering requires a timing-dependent JSON-RPC id collision between concurrent clients AND a specific vulnerable deployment pattern (a transport or server instance created once at startup and shared across clients). No EPSS score, CISA KEV listing, or POC is present in the supplied data, so exploitation status is 'no public exploit identified at time of analysis' - this is not evidence of absence, only that none was provided. The real-world risk is moderate and conditional rather than a mass-exploitable critical: the leak can occur accidentally in normal operation (ids collide because SDK clients number requests from 0), which raises the data-exposure likelihood for affected deployments, but exploitation is not attacker-steerable in a reliable targeted sense and depends on the victim's code shape. Because exposure hinges on the operator having followed the (now-corrected) README shared-instance pattern, treat this as a high-priority patch for multi-tenant HTTP MCP servers but lower urgency for stdio or per-request/per-session deployments. |
| Exploit ScenarioDerived | Two or more clients connect over HTTP to an MCP server that shares a single stateless transport or a single McpServer/Server instance created at startup. Because the SDK matches messages to a connection by JSON-RPC id alone and all clients number their requests from 0, the server routes one client's responses and notifications to another client, disclosing that client's data. No public exploit code was identified at time of analysis; the condition can arise unintentionally in ordinary concurrent use. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 20, 2026
Cross-client message leakage in the MCP TypeScript server SDK (@modelcontextprotocol/server 2.0.0 through 2.2.0) lets unauthenticated remote clients that share an HTTP endpoint receive another client's JSON-RPC responses and notifications, because the transport correlates replies to a connection by JSON-RPC id alone while SDK clients routinely number requests from 0 and produce colliding ids. Exposure requires a specific deployment pattern: a stateless Streamable HTTP transport (sessionIdGenerator undefined) reused across requests, or a single McpServer/Server instance shared across requests or sessions - exactly the pattern the pre-fix README examples for the hono, express, fastify and node middleware packages demonstrated. Stdio servers, createMcpHandler() with a per-call server factory, and @modelcontextprotocol/sdk 1.26.0+ are not affected; the issue is rated 7.7 (AV:N/AC:H/PR:N/UI:N) and no public exploit code has been identified at time of analysis.
RemediationAI
Vendor-released patch: upgrade @modelcontextprotocol/server to 2.3.0 or later (fix commit 84804c22e45a662675a198f853b7f00063838a8d, PR https://github.com/modelcontextprotocol/typescript-sdk/pull/2918, advisory https://github.com/modelcontextprotocol/typescript-sdk/security/advisories/GHSA-jm63-cq47-j5jp). The upgrade alone is not sufficient - the SDK now refuses to be shared, so affected applications will begin failing requests until the code is restructured; a second connect() rejects with ALREADY_CONNECTED and a sessionless transport rejects its second request. Adopt one of the three supported patterns: pass a factory to createMcpHandler(buildServer) that constructs a new McpServer on every call; build a new McpServer and a new transport inside each request handler; or set sessionIdGenerator and keep exactly one server/transport pair per session. Note the failure mode during migration - Express 5, Fastify and Hono return HTTP 500, while a bare node:http listener without error handling gets an unhandled rejection that terminates the process, so add error handling before rolling out. If upgrading is not possible immediately, applying the same code restructuring (per-request or per-session instance construction) fully mitigates the underlying leak on the affected 2.0.0-2.2.0 versions; defensive additions such as placing the MCP endpoint behind per-client authentication or segregating clients onto separate endpoints reduce exposure but do not address the shared-correlation-table root cause and complicate client onboarding and scaling.
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in npm
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The flaw is a race/ordering defect (CWE-362) in how the TypeScript MCP SDK's Streamable HTTP server transport demultiplexes messages. Each inbound JSON-RPC request carries a client-chosen id, and the SDK uses that id alone to route the server's response or notification back to the correct connection. Because MCP client SDKs start numbering at 0, ids from independent clients collide almost immediately in ordinary use. When a single stateless transport instance (built once with sessionIdGenerator: undefined) or a single McpServer/Server object serves multiple HTTP requests, the correlation table is effectively global: an overlapping or subsequent request can claim a response that belongs to a different client, disclosing that client's tool results and server-initiated notifications. CPE data identifies the affected npm artifact as pkg:npm/@modelcontextprotocol_server; the middleware wrappers @modelcontextprotocol/hono, express, fastify and node propagated the anti-pattern through their README examples. The fix hardens the object lifecycle rather than patching a single lookup: a Server/McpServer now serves one connection at a time, and a sessionless transport serves one request, rejecting further use with ALREADY_CONNECTED or Stateless transport cannot be reused across requests. Note that our own assessment rates the availability component lower than the CNA vector supplied with the record, while agreeing on network reachability, high attack complexity, no privileges required and no user interaction.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:H
Remote HTTP endpoint (AV:N) with no auth (PR:N), but relies on a JSON-RPC id-collision race plus a vulnerable shared-instance deployment (AC:H); cross-client leak drives C:H, with misrouted messages giving only I:L/A:L.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
DescriptionGitHub Advisory
Summary
In affected versions, an MCP server reached over HTTP could deliver one client's responses and notifications to another client. This happened when clients shared one stateless transport, or one McpServer or Server instance.
Messages were matched to a connection by JSON-RPC id alone. SDK clients number requests from 0, so ids collide in normal use.
Am I affected?
Yes, if more than one client can reach your HTTP endpoint and your code creates the transport or the server once at startup, instead of once per request or per session. Until this release, the README examples of @modelcontextprotocol/hono, express, fastify and node showed that pattern.
Affected versions: @modelcontextprotocol/server 2.0.0 through 2.2.0.
Not affected:
createMcpHandler()with a factory that builds a new server on every call- stdio servers
@modelcontextprotocol/sdk1.26.0 and later
Fix
Upgrade to @modelcontextprotocol/server 2.3.0 or later.
You also need to change your code. The SDK now refuses to be shared, so an affected app fails requests after upgrading: a second connect() rejects with ALREADY_CONNECTED, and a stateless transport rejects its second request.
Change to one of these:
createMcpHandler(): pass a factory that builds a newMcpServeron every call.- Per request: build a new
McpServerand a new transport inside the request handler. - Per session: set
sessionIdGeneratorand keep oneMcpServerand one transport per session.
If you cannot upgrade yet, the same change fixes affected versions.
Blast Radius
ecosystem impact- 1,417 npm packages depend on @modelcontextprotocol/server (1,063 direct, 361 indirect)
Ecosystem-wide dependent count for version 2.0.0.
Technical POC Analysis
CWE-362 (race condition / shared resource without proper synchronization), but the concrete defect is a lifecycle/ownership bug: in @modelcontextprotocol/server 2.0.0 - 2.2.0, both a Server/McpServer…
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Deployments of @modelcontextprotocol/server versions 2.0.0 through 2.2.0 can silently deliver one client's JSON-RPC responses and notifications to a different, unrelated client sharing the same HTTP endpoint, potentially exposing data across teams, customers, or partner integrations that rely on a common MCP service. The flaw is remotely reachable without authentication, but only where teams followed the pre-fix README patterns that reuse a single server instance or run a stateless HTTP transport without a session ID generator - a configuration common enough that many internal builds likely inherited it. Leadership should care because disclosure requires no attacker action beyond ordinary request traffic and is invisible in normal operation, while remediation is a straightforward version upgrade paired with a configuration review.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Race conditions occur when multiple concurrent requests exploit the brief time gap between checking a condition and acting upon it (TOCTOU - Time of Check, Time of Use).
GHSA-jm63-cq47-j5jp
NVD
CVE.org
Exploit-DB