Real MCP attacks so far fall into four groups: poisoned tool descriptions, prompt injection that chains tools to leak data, command injection in clients and SDK wrappers (CVE-2025-6514 scored 9.6), and malicious packages such as postmark-mcp. The controls that stop them are tool pinning, audience-bound OAuth tokens, sandboxed local servers and a policy gateway.
Updated 13 November 2026. The Model Context Protocol is now the default way to connect agents to tools. Most major agent platforms support it, and the spec has had three revisions since June 2025. The security picture has matured with it. There is a published list of attacks in the spec itself, a run of CVEs in clients and SDK wrappers, and at least one malicious server found in the wild. This post covers the incidents we could verify, what the spec now requires, and a checklist you can run against your own MCP clients and servers.
The biggest risk is not the protocol itself. It is that an MCP server's descriptions and outputs flow straight into the model's context, and the model can call other tools with real credentials. Put an untrusted server, an untrusted document and a powerful tool in the same session and you have a data-exfiltration path. The spec's own security best practices add the classic problems: confused deputy, token passthrough, SSRF, state handle hijacking and local server compromise.
A useful way to rank the risk is three questions. Does the session mix untrusted content with private data? Can any tool send data out (email, HTTP, a public repo)? Do tools run with broad, long-lived credentials? If the answer to all three is yes, you have a breach waiting to happen, whatever the spec says.
Here are the ones we could verify on the researchers' or vendors' own pages:
| When | Incident | Type | What it showed |
|---|---|---|---|
| Apr 2025 | Tool poisoning (Invariant Labs) | Hidden instructions in tool descriptions | A harmless-looking tool can tell the model to read SSH keys and config files and leak them through a parameter |
| May 2025 | GitHub MCP "toxic agent flow" | Indirect prompt injection | A malicious public issue led an agent to copy private repo data into a public pull request; no bug in the server code |
| Mid-2025 | CVE-2025-49596, MCP Inspector | RCE, no auth between client and proxy | CVSS 9.4; fixed in 0.14.1 |
| Jul 2025 | CVE-2025-6514, mcp-remote | OS command injection via a crafted authorization_endpoint | CVSS 9.6; versions 0.0.5–0.1.15; fixed in 0.1.16 |
| Sep 2025 | postmark-mcp on npm | Malicious package (supply chain) | 15 clean versions, then 1.0.16 silently BCC'd every email to the attacker |
| Apr 2026 | OX Security STDIO advisory | Command injection via STDIO server parameters | More than a dozen CVEs across AI frameworks and IDEs, e.g. LiteLLM CVE-2026-30623, Flowise CVE-2026-40933, Windsurf CVE-2026-30615 |
Notice the pattern. Only one of these is a flaw in an MCP server's business logic. The rest are in clients, proxies, inspectors, packaging and the way hosts launch servers. In practice, MCP security is mostly host and supply-chain security.

Tool poisoning is hiding instructions in a tool's name, description or schema. The model reads them as context, even though the user never sees them. A tool called "add numbers" can carry text telling the model to read ~/.ssh/id_rsa and pass it in an argument. A variant, the "rug pull", serves a clean description at install time and changes it later.
Controls that work:
tools/list now carries cache fields (ttlMs, cacheScope) and servers should return tools in a fixed order.Token passthrough is when an MCP server accepts a token that was not issued for it and forwards it to a downstream API. The spec forbids it: "MCP servers MUST NOT accept any tokens that were not explicitly issued for the MCP server." Passthrough breaks audience checks, bypasses rate limits and monitoring tied to the server, and destroys the audit trail. Downstream logs show the user's token, not the server that used it.
The fix has been in the spec since the 2025-06-18 revision. MCP servers are OAuth resource servers, and clients must send Resource Indicators (RFC 8707) so the token is bound to one server. The server validates the audience, then uses its own credentials, or a token exchange, to call downstream APIs. If you wrap an existing API as an MCP server, this is the line most teams get wrong. See our MCP server development guide for the server side.
It is an attack on MCP proxy servers that use one static OAuth client ID with a third-party API while letting MCP clients register dynamically. If the third-party server remembers consent in a cookie, an attacker can register a client with their own redirect URI and send the user a link. The consent screen is skipped and the authorization code goes to the attacker.
The spec requires per-client consent on the MCP server before forwarding to the third party. Proxies must store approved client IDs per user, use exact redirect URI matching, use single-use state values set only after consent, and protect consent cookies with __Host-, Secure, HttpOnly and SameSite=Lax. The consent page must also block framing.
The 2026-07-28 revision made MCP stateless and tightened OAuth. The changes that matter for security:
| Change | What it means for you |
|---|---|
Clients MUST validate a present iss against the recorded issuer before redeeming a code (RFC 9207, SEP-2468) | Blocks mix-up attacks where a malicious authorization server collects codes meant for an honest one |
| Credentials are bound to the issuing authorization server (SEP-2352) | Key stored credentials by issuer; never reuse them with another server; re-register when it changes |
| Dynamic Client Registration deprecated in favour of Client ID Metadata Documents | Plan the move to CIMD; authorization servers fetching metadata URLs must guard against SSRF |
Protocol sessions and Mcp-Session-Id removed | State lives in server-minted handles; servers MUST NOT treat a handle as authentication and should bind it to the user from the verified token |
| Roots, Sampling and Logging deprecated | Fewer server-to-client requests; pass paths as tool parameters, call model APIs directly, log via stderr or OpenTelemetry |
The earlier 2025-11-25 revision had already added incremental scope consent via WWW-Authenticate, OpenID Connect discovery, Client ID Metadata Documents, and an HTTP 403 for invalid Origin headers. Together these releases make least-privilege, step-up authorization the expected pattern rather than a nice-to-have.

Only as safe as the command that starts them. A local server runs with the same privileges as the user's client. A malicious config line or package can read files, steal SSH keys or run anything. The spec now says clients offering one-click local server setup MUST show the exact command and require explicit approval. It also recommends sandboxing with minimal file system and network access.
The OX Security advisory shows why. Many AI frameworks passed user-supplied commands and arguments straight into the SDK's STDIO launcher, so anyone who could edit a server config could run code. According to OX, Anthropic treated the root behaviour as expected, which puts the burden on the host application. Do not let end users or the model write server launch commands. Keep an allow-list of binaries and arguments, and run local servers in a container or OS sandbox.
Run this against every MCP client and server you ship or connect to:
WWW-Authenticate; no wildcard scopes in scopes_supported.iss; key credentials by issuer (2026-07-28).https (and loopback http in dev) for authorization URLs; never open URLs through a shell; block private IP ranges during OAuth discovery.Items 4, 10 and 12 overlap with agent-level controls. The AI agent control plane post covers identity and kill switches, and the AI agent security checklist covers the rest of the agent.
The controls are the same, but the cost of a miss is higher, and you need to prove the controls exist. If an MCP server touches PHI, every server and every model in the path must be covered by a BAA. Tool calls that read patient data need audit logs, and outbound tools need human approval. Our FHIR MCP server guide shows the pattern for EHR data, and building a ChatGPT plugin with MCP covers the public-app side.
We build MCP servers and agents for SaaS and regulated companies, and we run read-only MCP servers on our own sites. Our default design: servers are OAuth resource servers that validate audience and never pass tokens through. Tool definitions are pinned and reviewed like code, and local servers run sandboxed with no secrets in their environment. Every tool call goes through a policy layer that logs the decision and can require human approval. For healthcare work the model can run inside your own AWS account under the AWS BAA, and BeevR signs a BAA as a business associate.
BeevR is a senior, founder-led team in Hanoi. Fixed-scope, fixed-price phases from $10K, a working demo every Friday, and you own the code and IP from day one. See how we build secure AI agents and MCP integrations.
Shipping or connecting MCP servers? Book a 30-minute call and we will run the checklist above against your setup.