MCP security incidents now have a sixteen-month public record — and nobody had put it in one table. From Invariant Labs naming “tool poisoning” in April 2025 to a Context7 CVE disclosed six days before this post’s dateline, this ledger collects 27 dated entries: 25 incidents and the two protocol revisions that answered them, each pinned to the dated record it came from.
The stakes are not abstract. The Model Context Protocol has crossed into mainstream infrastructure — we tracked MCP’s mainstream adoption numbers earlier this year — which means every incident below happened, or can happen, inside toolchains that agencies, startups, and enterprises already run. When the next MCP incident lands, the first question any journalist, security lead, or buyer asks is: what’s the track record? This page is that record.
What follows: the counting rules, the full 27-row ledger, a frequency breakdown of what actually dominates the disclosed record, a patch-latency table that separates “patched” from “remediated in the field”, the Context7 regression date-match nobody else appears to have published, and the rows no patch can ever close.
- 0127 dated entries, every one linked to the record it came from.25 incidents plus 2 protocol revisions, April 2025 through August 24, 2026. An incident that cannot be dated from a primary record gets no row — a shorter accurate ledger beats a longer padded one.
- 02Command injection dominates the disclosed record.11 of 25 incident rows are command or code injection through unsanitised exec, stdio, or config input — more than double the prompt-injection count. One coordinated advisory alone covered 16 such CVEs across 14+ platforms.
- 03Sixteen of 27 entries carry a confirmed fix.14 rows name a fixed version or dated production fix and 2 more were hosted remediations with no version to name. Three rows have no fix documented as of the dateline: GitHub Kanban MCP, adb-mcp, and the August Context7 CVE.
- 04Patched is a version-level fact, not a field-level one.Flowise shipped 3.0.6 in September 2025 and was still under active mass exploitation in April 2026. Nginx UI patched mid-March 2026 and had 2,600+ exposed instances a month later. The ledger records both dates.
- 05Four rows can never be patched at all.Tool poisoning, the WhatsApp exfiltration demo, the GitHub MCP toxic agent flow, and the Supabase lethal trifecta are architectural: agents trusting untrusted data. Their honest status is ‘mitigated only by agent-side guardrails’ — not a version number.
01 — MethodWhat counts as a row, and what doesn’t.
A ledger is only as citable as its counting rules, so here they are. A row requires a date from a primary record — a CVE or GHSA publication date, a vendor advisory, or a named researcher’s dated disclosure. An incident that cannot be dated from a primary record gets no row. One row — entry 22, CVE-2026-0755 — is dated to the month rather than the day, and it is shown that way rather than given a precision the record does not support. Where a second identifier for the same product circulated only in secondary coverage, it gets no row either — related identifiers are never merged into one entry on a secondary source’s say-so.
One event equals one entry, even when it spans multiple CVE numbers: Anthropic’s Filesystem MCP Server sandbox escapes (two CVEs, one Cymulate disclosure, one patch release) are one row, and OX Security’s April 2026 advisory — 16 CVEs across 14+ platforms, all the same defect pattern — is one row. Other trackers count every CVE separately and reach 40+; both tallies are defensible, but they measure different things. The 27 here are this ledger’s 27 verified entries, not an industry census.
Two entries are not incidents at all: the November 2025 authorization spec revision and the July 2026 stateless revision. They earn rows because a security ledger that omits the protocol’s own dated responses tells half the story. And the patch column obeys one discipline throughout: status is reported as of August 24, 2026. “No fixed version documented at capture” is a fact about the record; “still unpatched” would be a claim about the present that a dated page cannot honestly make. This is the same pin-every-row-to-a-source discipline that shaped our agent-framework SSRF validation census, applied to a timeline instead of a feature matrix. For the catalog of what’s running in the ecosystem rather than what broke, see the 50-server ecosystem tracker.
02 — The RecordThe ledger: 27 entries, April 2025 → August 2026.
Read the table in four phases. April–June 2025 is the vocabulary phase — researchers naming attack classes before CVE numbers existed for them. June–August 2025 is the CVE wave hitting individual servers and host apps. September–December 2025 brings the first confirmed-malicious package, mass exploitation, and the spec’s first hardening response. And 2026 escalates to platform-level CVEs, a 16-CVE coordinated advisory, and the ledger’s newest open entry.
| # | Date | Component | Class | Disclosure route · record | Patch status as of 2026-08-24 |
|---|---|---|---|---|---|
| Entries 1–5 · Apr–Jun 2025 · the vocabulary forms — researcher disclosures before the CVE wave | |||||
| 1 | 2025-04-01 | MCP tool descriptions (every client)invariantlabs.ai · tool poisoning notification | Tool poisoning / prompt injection — plus the sibling rug-pull and shadowing classes named in the same disclosure | Researcher disclosure — Invariant Labs (Luca Beurer-Kellner, Marc Fischer) | Not independently patchable — a class disclosure, mitigated only by agent-side guardrails |
| 2 | 2025-04-07 | WhatsApp MCP server (poisoned demo)invariantlabs.ai · follow-up demo | Tool poisoning — full chat-history exfiltration demonstrated | Researcher demo — Invariant Labs; the mcp-scan static analyzer followed 2025-04-11 | Not patchable — proof-of-class demo, not a fixable defect in one codebase |
| 3 | 2025-05-26 | GitHub official MCP serverinvariantlabs.ai · toxic agent flow | Confused deputy — malicious public issue hijacks an agent into leaking private-repo data via a public PR | Researcher disclosure — Invariant Labs; covered by Simon Willison | Architectural — explicitly not a bug in the server’s code; no version fix exists |
| 4 | 2025-06-04 | Asana MCP server (hosted)BleepingComputer · vendor notice | Cross-tenant data exposure — incomplete access control; roughly 1,000 customer orgs affected | Vendor advisory — Asana | Hosted remediation — MCP access disabled 2025-06-05 → 2025-06-17, then restored with all connections reset |
| 5 | 2025-06-13 | Smithery MCP hosting registrySC Media · GitGuardian report | Path traversal → supply-chain credential theft; 3,000+ hosted MCP servers exposed via dockerBuildPath: ".." | Researcher report — GitGuardian, reported 2025-06-13; public write-up Oct 2025 | Hosted fix + credential rotation by 2025-06-15; no in-the-wild exploitation confirmed |
| Entries 6–13 · Jun–Aug 2025 · the CVE wave hits servers and host apps | |||||
| 6 | 2025-06-13 | Anthropic MCP InspectorOligo Security · CVE-2025-49596 | Missing auth → unauthenticated RCE — the proxy accepted arbitrary stdio commands from any browser client | CVE-2025-49596, CVSS 9.4 — reported to Anthropic 2025-04-18, published 2025-06-13 | Patched in 0.14.1 — returns HTTP 401 with a session-token requirement; Shodan showed 560 exposed instances at research time |
| 7 | 2025-06-29 | @cyanheads/git-mcp-serverGHSA-3q26-f695-pp76 | Command injection — unsanitised child_process.exec in git_add / git_init / git_logs | CVE-2025-53107, CVSS 7.5 — GHSA | Patched in 2.1.5 |
| 8 | 2025-07-01 | Anthropic Filesystem MCP ServerCymulate · “EscapeRoute” | Sandbox escape — crafted symlink (CVE-2025-53109, CVSS 8.4) and shared-prefix directory name (CVE-2025-53110, CVSS 7.3) | Two CVEs, one disclosure — Cymulate Research Labs | Both patched in npm release 2025.7.1 |
| 9 | 2025-07-06 | Supabase MCP serversimonwillison.net · lethal trifecta | Stored prompt injection → data-exfiltration path via an agent with a live database connection | Researcher blogs — General Analysis and Simon Willison, 2025-07-06 → 09 | Architectural — vendor mitigations (read-only mode, project-scoped mode, tool feature groups) shipped 2025-09-16; no customer data leak was reported |
| 10 | 2025-07-09 | mcp-remote (npm)GHSA-6xpm-ggf7-wc3p | OS command injection — crafted authorization_endpoint response URL executes arbitrary commands | CVE-2025-6514, CVSS 9.6 Critical — GHSA | Patched in 0.1.16 |
| 11 | 2025-07-12 | @sunwood-ai-labs/github-kanban-mcp-serverGHSA-6jx8-rcjx-vmwf | Command injection (CWE-78) — add_comment passes LLM-controlled input to exec running the gh CLI | CVE-2025-53818, CVSS 8.9 High — GHSA | No fixed version documented as of 2026-08-24 — the GHSA record listed no patched release at capture |
| 12 | 2025-07-16 | Cursor — MCP config handlingCheck Point Research · “MCPoison” | Rug pull / trust-on-first-use bypass — approval keyed to file identity, not content, so an approved entry could be silently swapped | CVE-2025-54136 — responsibly disclosed by Check Point Research | Fixed in Cursor 1.3 (late July 2025) — re-approval now required on every config modification |
| 13 | 2025-08-02 | Cursor Agent — workspace file writesGHSA-4cxx-hrm3-49rm · “CurXecute” | Rug pull via unapproved write — agent could create .cursor/mcp.json without approval; chained with prompt injection for code execution | CVE-2025-54135, CVSS 8.5 — GHSA | Patched in Cursor 1.3.9 |
| Entries 14–19 · Sep–Dec 2025 · supply chain, mass exploitation, and the spec’s first answer | |||||
| 14 | 2025-09-15 | Flowise — CustomMCP nodeGHSA-3gcm-f6qx-ff7p | Code injection → RCE — unsanitised config reaches JavaScript’s Function() constructor | CVE-2025-59528 — GHSA | Patched in 3.0.6 (Sept 2025); still under active mass exploitation as of April 2026 — 12,000+ exposed instances reported |
| 15 | 2025-09-17 | postmark-mcp (npm impostor package)Koi · disclosure 2025-09-25 | Supply chain — 15 trust-building releases, then a one-line backdoor in v1.0.16 silently BCC’ing every outbound email | Researcher disclosure — Koi; first confirmed malicious (not merely vulnerable) MCP package | Malicious by design — removal and credential rotation, not a patch; Postmark itself had no involvement |
| 16 | 2025-09-24 | adb-mcpGHSA-54j7-grvr-9xwg | Command injection (CWE-77/78) — inspect_ui’s device parameter reaches Node’s exec() unsanitised | CVE-2025-59834, CVSS 9.8 Critical — GHSA | No fixed version documented as of 2026-08-24 — none listed at GHSA capture |
| 17 | 2025-09-29 | Framelink Figma MCP serverEndor Labs · CVE-2025-53967 | Command injection → unauthenticated RCE — a curl fallback path shelled out on an unsanitised URL; 100k+ downloads per month at the time | CVE-2025-53967 — Endor Labs; public coverage Oct 2025 | Fixed in 0.6.3 (2025-09-29) |
| 18 | 2025-11-25 | MCP authorization specden.dev · spec analysis | Spec hardening (not an incident) — servers become formal OAuth 2.1 resource servers; RFC 9728 metadata + RFC 8707 resource indicators required | Protocol revision | n/a — directly hardens the token-theft and confused-deputy classes above |
| 19 | 2025-12-30 | @serverless/mcpGHSA-rwc2-f344-q6w6 | Command injection (CWE-77) — experimental list-projects tool | CVE-2025-69256, CVSS 7.5 — GHSA | Patched in 4.29.3 |
| Entries 20–27 · Jan–Aug 2026 · platform CVEs, the OX advisory, and a regression | |||||
| 20 | 2026-01-09 | Tencent WeKnora — MCP stdio configurationCVEdetails · CVE-2026-22688 | Command injection — authenticated user injects stdio_config.command/args | CVE-2026-22688 — disclosed 2026-01-09 | Patched in 0.2.5 |
| 21 | 2026-01-10 | LibreChat — MCP stdio transportGHSA-cxhj-j78r-p88f | Command injection via insecure defaults — any authenticated user triggers root-level shell execution in one API call | CVE-2026-22252, CVSS 9.1 Critical — GHSA; affects 0.8.2-rc1 | Patched in 0.8.2-rc2 |
| 22 | 2026-01 (Jan) | gemini-mcp-toolSentinelOne · CVE-2026-0755 | Command injection + @file exfiltration — unauthenticated and network-reachable per ZDI analysis | CVE-2026-0755, CVSS 9.8 — disclosed Jan 2026 | Fixed in 1.1.6 |
| 23 | 2026-02-18 | Upstash Context7 — “Custom Rules”Noma Security · “ContextCrush” | Prompt injection — maintainer-supplied rules served verbatim into every user’s MCP session with zero sanitisation | Researcher disclosure — Eli Ainhorn, Noma Security; reported 2026-02-18, public 2026-03-05 | Production fix shipped 2026-02-23 — five days from report |
| 24 | 2026-03-15 | Nginx UI — /mcp_message endpointThe Hacker News · CVE-2026-33032 | Missing auth — empty IP allowlist treated as allow-all; any network attacker could invoke privileged MCP tools | CVE-2026-33032, CVSS 9.8 — reported by Pluto Security (Yotam Perkal), early March 2026 | Patched in 2.3.6 (2026-03-15); in-the-wild exploitation confirmed mid-April with 2,600+ instances still exposed |
| 25 | 2026-04-15 | 14+ MCP-integrated platforms (one advisory)OX Security · 16-CVE advisory | Systemic command injection — STDIO transport spawning subprocesses from unsanitised config strings; 16 CVEs incl. LiteLLM, Windsurf, DocsGPT, Agent Zero, and a second Flowise flaw | Coordinated vendor advisory — OX Security; CSA synthesis note followed 2026-04-20 | Mixed — per-CVE patch status varies across the 14+ platforms; no single status is honest here |
| 26 | 2026-07-28 | MCP spec — “stateless” revisionGoogle Developers Blog | Spec hardening (not an incident) — handshake and Mcp-Session-Id removed; RFC 9207 issuer verification required on authorization responses | Protocol revision | n/a — closes a session-hijacking-adjacent gap in multi-server deployments |
| 27 | 2026-08-18 | Upstash Context7 MCP serverNVD · CVE-2026-75130 | Prompt injection via custom AI instructions — scored 9.0 on CVSS 3.1 and 6.4 on CVSS 4.0; both numbers are part of the record | CVE-2026-75130 — disclosed 2026-08-18; affected ≤2.1.2 | No public fix documented as of 2026-08-24 — npm latest sat at 4.0.3 (released 2026-08-21) with no GHSA and no release note documenting a fix for this CVE |
03 — FrequencyWhat actually dominates the disclosed record.
Classify the 25 incident rows and the distribution is lopsided. Prompt injection gets the headlines — it is the MCP-native attack, the one that makes agents special. But the disclosed-CVE record is dominated by something far older: command and code injection through unsanitised exec, stdio, and config input, at 11 of 25 rows — more than double the prompt-injection count.
Vulnerability-class frequency · 25 incident rows · Apr 2025 → Aug 2026
Source: this ledger’s 25 incident rows, classified by primary defect — spec revisions excludedThe trend reading matters more than the counts. Command injection dominates the CVE record partly because it is mechanically easy to find — static analysis catches an unsanitised exec() call in a way no scanner catches a poisoned tool description. So the disclosed record likely understates prompt-injection risk relative to its real-world weight: the injection rows are the ones a linter could have prevented, while the poisoning rows are the ones only architecture can address. A team that reads this table as “prompt injection is rare” has read it backwards — it is rare in CVE databases because CVE databases were never built to hold it.
The supply-chain rows deserve their own sentence, because one of them crossed a line no earlier entry had: postmark-mcp was not vulnerable, it was hostile — fifteen legitimate releases building trust before v1.0.16 added a single line that BCC’d every outbound email to an attacker’s domain. Postmark’s own statement was blunt: “Postmark had absolutely nothing to do with this package or the malicious activity. This is not an official Postmark tool.” The impostor-package pattern needs no vulnerability at all — only a plausible name and patience.
04 — Patch LatencyTime-to-fix, and why patched ≠ remediated.
Where the record documents both a report date and a fix date, you can compute latency — original arithmetic no single source in this research published as a distribution. The spread runs from two days to never. And two rows prove that the patch date is only half the story: the field keeps running the vulnerable version long after the fix ships.
| Incident | Reported / disclosed | Fix shipped | Elapsed | Post-patch field evidence |
|---|---|---|---|---|
| Fixed — both dates documented | ||||
| Smithery path traversal | 2025-06-13 | by 2025-06-15 | 2 days | Credentials rotated; no in-the-wild exploitation confirmed |
| ContextCrush (Context7 Custom Rules) | 2026-02-18 | 2026-02-23 | 5 days | Public disclosure followed 2026-03-05 — see entry 27 for the August sequel |
| Asana cross-tenant exposure | 2025-06-04 | 2025-06-17 | 13 days | MCP access disabled throughout; all connections reset on restore |
| MCPoison (Cursor TOFU bypass) | 2025-07-16 | Cursor 1.3, late July 2025 | ≈2 weeks | Re-approval on every MCP config change became the default |
| Nginx UI missing auth | early March 2026 | 2026-03-15 (v2.3.6) | ≈2 weeks | Exploitation confirmed mid-April 2026; 2,600+ instances still exposed a month post-patch |
| Flowise CustomMCP RCE | 2025-09-15 | 3.0.6, available at disclosure | patch at publication | Still under active mass exploitation April 2026 — 12,000+ exposed instances, seven months post-patch |
| Open — no fix documented as of 2026-08-24 | ||||
| GitHub Kanban MCP (CVE-2025-53818) | 2025-07-12 | none documented | 408 days to dateline | — |
| adb-mcp (CVE-2025-59834) | 2025-09-24 | none documented | 334 days to dateline | — |
| Context7 (CVE-2026-75130) | 2026-08-18 | none documented | 6 days to dateline | Affected range (≤2.1.2) sits below the npm latest of 4.0.3 — see section 05 |
Tally the fix column across all 25 incident rows and the honest summary is: 14 rows name a fixed version or a dated production fix, two more (Asana, Smithery) were hosted remediations with no version to name, three have no fix documented at capture, four are architectural and cannot be version-fixed, one was malicious by design, and one — the OX advisory — is a mixed bag across 14+ platforms. That is 16 of 27 entries with a confirmed fix, counting the two hosted remediations. A ledger that printed a flat “Patched: Yes” checkmark column would flatten all six of those categories into false confidence.
Incident rows with a versioned or dated fix
From MCP Inspector 0.14.1 to Nginx UI 2.3.6. Two more rows — Asana and Smithery — were remediated as hosted services with no client-side version to name.
Rows with no fix documented
GitHub Kanban MCP (408 days to dateline), adb-mcp (334 days), and Context7’s CVE-2026-75130 (6 days). Status is as-of-2026-08-24, from the GHSA and NVD records at capture.
Patch-exists-but-exploited rows
Flowise: patched Sept 2025, mass-exploited through April 2026. Nginx UI: patched mid-March 2026, 2,600+ exposed a month later. Patch date and field adoption are different facts.
05 — Forensic DetailThe Context7 date-match nobody else published.
Two ledger entries share one component, and the dates line up in a way worth recording. Entry 23: Noma Security reports ContextCrush in Context7’s Custom Rules on February 18, 2026, and Upstash ships a production fix five days later. Entry 27: CVE-2026-75130, disclosed August 18, 2026, is a prompt injection in the same product’s custom-instruction surface, with an affected range of ≤2.1.2.
Here is the connective fact: npm shows @upstash/context7-mcp@2.1.2 published on February 23, 2026 — the exact date the ContextCrush fix reached production. The version that shipped the February fix sits inside the August CVE’s affected range. Roughly six months separate the fix and the new CVE against the same attack surface — which makes the August entry read as a likely regression or an incompletely closed class, not a novel bug family. We are not aware of anyone else having published this date-match. For the full story of the August CVE itself — mechanism and what to do about it — see our full writeup of CVE-2026-75130; this ledger only records its dates.
Two record-keeping notes on that entry. First, its severity is genuinely double-valued — 9.0 on CVSS 3.1, 6.4 on CVSS 4.0 — and quoting either number alone tells half the story, so this ledger carries both. Second, its patch cell is the strictest in the table: the affected range (≤2.1.2) sits below the npm latest at research time (4.0.3, released August 21), yet no GHSA and no release note through 4.0.3 documents a fix for this specific CVE. “No public fix documented as of the date checked” is the only defensible framing — not “fixed”, and not “still unpatched” either.
"The attack surface isn't what the MCP server can do. It's in what it can make the AI agent do."— Eli Ainhorn, Noma Security threat research, on ContextCrush
06 — UnpatchableThe rows nothing can patch.
Four incident rows have no version number in their status cell and never will: Invariant’s tool-poisoning class disclosure, its WhatsApp exfiltration demo, the GitHub MCP toxic agent flow, and the Supabase lethal trifecta. Invariant was explicit about the GitHub case: this is not a bug in the server’s code. It is a confused-deputy pattern — an agent granted real privileges, reading attacker-controlled content, with a channel to leak through. You cannot patch a server out of an architecture.
The vendors involved responded the only way the class allows: by narrowing blast radius. Supabase’s September 2025 write-up — which noted no customer data leak had been reported — shipped read-only mode, project-scoped mode, and tool feature groups, while cautioning that “guardrails alone aren’t enough.” That phrasing is the right epitaph for the whole category: these four rows stay open on every future edition of this ledger, managed rather than closed. For how to actually defend against the techniques behind them, see the attack-technique and defense playbook — this page deliberately stays a record, not a manual.
For teams running MCP in production, the operational translation is scope, not patching: least-privilege connections, read-only defaults where the workload allows, and treating every external data source an agent reads as attacker-controlled. Auditing an agent stack against exactly this class of exposure is part of what our AI transformation engagements cover — the ledger above is, in practice, the checklist of what has already gone wrong for someone else.
07 — Protocol ResponseHow the spec answered its own ledger.
The two non-incident entries are the protocol reading its own incident record. The November 25, 2025 authorization revision made MCP servers formal OAuth 2.1 resource servers — RFC 9728 Protected Resource Metadata so clients discover the correct auth server, RFC 8707 Resource Indicators so a token cannot be replayed against the wrong MCP server. Those are direct answers to the token-theft and confused-deputy classes that fill the 2025 rows. The July 28, 2026 stateless revision then removed the handshake and session header entirely and required RFC 9207 issuer verification, closing a session-hijacking-adjacent gap in multi-server deployments — we cover the mechanics in the July spec’s stateless migration guide, so this ledger records it purely as a dated hardening event.
Looking forward, the honest projection from sixteen months of record is that the ledger grows at both ends. The command-injection rows should thin as the OX advisory’s lesson — never spawn subprocesses from unsanitised config — hardens into SDK defaults and CI linting; that class is mechanically findable and mechanically preventable. The prompt-injection and confused-deputy rows should thicken, because each spec revision that closes one theft target tends to mint the next one — security commentary around the stateless revision has already flagged opaque state handles as the successor to session-ID theft. And the Context7 date-match suggests a third growth lane nobody budgets for: regressions of fixes already shipped. Expect future editions of this page to add rows faster than they retire them.
08 — ConclusionA record is a security control.
Twenty-seven dated entries, and a column discipline that keeps them honest.
Sixteen months of MCP security history compresses into three findings. Command injection through unsanitised input — not prompt injection — dominates the disclosed record, at 11 of 25 incident rows. Patch status decays the moment it is written: 16 of 27 entries carry a confirmed fix, three carry none at capture, and two of the “patched” rows were still being mass-exploited months after their fix shipped. And the classes that define MCP specifically — poisoned tools, confused deputies — are the ones no version number will ever close.
The dateline discipline is the part worth stealing for your own records. Every status in this table is a claim about August 24, 2026, verifiable against the record linked in its row — never a present-tense assertion that quietly rots. That is what makes a ledger citable a year later, and it is why a shorter accurate table beats a longer padded one: the dates are the citation value.
If the table above made your MCP stack feel less audited than it should be, the companion piece is a 75-point security audit checklist — the ledger tells you what has happened; the checklist tells you what to check before your stack becomes entry 28.