Skip to main content

MCP TypeScript SDK CVE-2026-111770

HIGH
Race Condition (CWE-362)
2026-10-20 https://github.com/modelcontextprotocol/typescript-sdk GHSA-jm63-cq47-j5jp
7.7
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach shared MCP HTTP endpoint as second client
  2. Delivery
    Issue requests with low JSON-RPC ids (from 0)
  3. Exploit
    Collide ids with concurrent victim client
  4. Execution
    Receive victim's responses and notifications
  5. Impact
    Disclose 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

npm @modelcontextprotocol/server fix: 2.3.0

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

GitHub Advisory PRIMARY 7.7 HIGH
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:H
vuln.today AI 7.0 HIGH

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:L
4.0 AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:L/VA:L/SC:N/SI:N/SA:N

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
Low
Availability
High

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/sdk 1.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 new McpServer on every call.
  • Per request: build a new McpServer and a new transport inside the request handler.
  • Per session: set sessionIdGenerator and keep one McpServer and one transport per session.

If you cannot upgrade yet, the same change fixes affected versions.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
Medium
popular AI MCP SDK but narrow affected 2.0.0-2.2.0 version range
Threat Intel
1
1 source
Data Quality
3 sources
Confidence: Low
NVD CVE.org GHSA GitHub

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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).

Affected Products (CPE)GitHub Advisory

pkg:npm/@modelcontextprotocol_server

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy