Back

Blog

Insights

Don't Throw MCP Under the Bus: The OX Disclosure Is a Provider Problem, Not a Protocol Problem

Frank Lyonnet

Three supply-chain compromises in fifteen days. A coordinated wave across Trivy, LiteLLM, and axios. And then, on top of all that, a fresh disclosure that says the AI tool protocol underneath most coding agents was architecturally unsafe on its stdio path. You could be forgiven for concluding that the Model Context Protocol (MCP) is simply broken. That is too simple. What the OX Security disclosure on 15 April 2026 actually shows is a much older truth: protocols don't ship secure products. Providers do.

This post is the honest version of that argument. It takes the OX disclosure seriously, explains what it found, credits Anthropic for kickstarting the ecosystem and for shipping useful host-side controls, and then asks the question every MCP-using vendor should ask themselves: does the product you ship reproduce the unsafe pattern, or does it design around it? I'll answer it for EDAMAME — directly.

The disclosure, on the actual record

Getting the timeline right matters. OX published its main MCP write-ups on 15 April 2026. Anthropic introduced MCP on 25 November 2024 and donated it to the Linux Foundation in December 2025. So the protocol is barely eighteen months old, it now belongs to an open-source foundation, and the real news is what happens when a fast-growing primitive reaches thousands of product decisions.

What OX actually documented is a specific trust-boundary failure around MCP's stdio transport. The official protocol defines both stdio and Streamable HTTP. Public SDK examples show stdio clients configured with a command and args; the Rust SDK documentation explicitly describes client-side stdio support as a child-process transport. OX's argument is that once untrusted input can reach that launch tuple, the host no longer "configures a server" — it executes whatever it has been told to execute.

OX framed the issue as architectural, with a blast radius of more than 150 million downloads and up to 200,000 vulnerable instances, and grouped the resulting exploits into four families:

  • Unauthenticated UI injection into MCP-enabled interfaces

  • Hardening bypasses that slip past post-hoc protections

  • Zero-click prompt injection in AI IDEs

  • Malicious marketplace distribution of MCP servers

OX also reports that Anthropic declined a protocol-level change and characterised the behaviour as "by design," with sanitisation left to downstream developers. Whether or not you agree with every rhetorical flourish in the report, the underlying lesson is hard to dismiss: when a primitive that can launch local processes becomes normalised across an ecosystem, every downstream product inherits the consequences of how it exposes that primitive.

This is a provider-responsibility story

The more interesting conversation is not "MCP good" versus "MCP bad." It is about who carries the security responsibility when a protocol is this powerful and this young.

Anthropic undeniably kickstarted the modern MCP ecosystem. It shipped the standard, the SDKs, local server support in Claude Desktop, and a reference server repository. At the same time, Anthropic's own trust and safety writing makes a broader point that is directly relevant here: agent behaviour is shaped by the model, the harness, the tools, and the environment. A strong model can still be undermined by a poorly configured tool or an overly permissive environment. The protocol's original sponsor is effectively acknowledging that security outcomes are produced by implementation choices, not by specifications alone.

Their own current documentation makes this even clearer:

  • MCP supports both stdio and Streamable HTTP.

  • Claude Code now supports a system-wide managed-mcp.json, policy-based allowlists and denylists, exact command matching for stdio servers, and URL-pattern restrictions for remote servers.

  • Crucially, the docs also state that if allowedMcpServers is undefined, there are no restrictions at all.

That is the entire argument in miniature. The protocol can support a tightly governed deployment or a permissive one. Your exposure depends on what your product team decides to ship as the default.

Anthropic says this outright in another form as well. Its Claude Code security page states that Anthropic does not manage or audit MCP servers. The MCP integration docs warn that third-party servers should be used only if they are trusted and that servers capable of fetching untrusted content increase prompt-injection risk. Operationally fair. But responsibility does not evaporate because a system is "open." It moves — to the product team that chooses the transport, the permission model, the config surface, the marketplace path, and the defaults.

Where EDAMAME is different

Here's how EDAMAME's MCP server is built:

  • The server is an rmcp-based Streamable HTTP server. It does not expose stdio to remote callers.

  • It binds to 127.0.0.1 by default.

  • It authenticates every call: either per-client bearer credentials minted through the EDAMAME Security app, or a shared pre-shared key (PSK) for headless deployments.

  • A desktop pairing flow at /mcp/pair issues credentials only after local user approval in the host app.

  • Anthropic's own Messages API connector now only supports remote MCP over HTTP transports — so the whole stdio-spawn chain is architecturally moot for EDAMAME.

Just as important, EDAMAME exposes a bounded MCP tool catalogue, not a generic execution surface. It contains 32 tools spanning observation, remediation, workflow status, behavioural-model injection, and vulnerability findings. Several lifecycle controls — the ones you would least like an attacker to be able to drive via prompt injection — are intentionally kept outside MCP, in the RPC or CLI control plane. That is not a magic shield, but it is a materially safer shape than a chat-facing surface that can be steered into arbitrary local command launch. By design, the specific OX stdio-spawn chain does not apply to EDAMAME's MCP server.

In EDAMAME Posture CLI the server binds to localhost by default, treats --all-interfaces as an explicit opt-in for remote access, requires PSK authentication, and logs tool calls for audit. Those are not marketing adjectives. They are concrete provider choices about transport exposure, trust boundaries, and operational visibility. And that is exactly the level at which MCP security is won or lost.

The residual risk we don't pretend doesn't exist

No responsible analysis should stop at "not directly applicable."

  • A server intentionally switched from localhost to all-interfaces becomes available to the network.

  • A stolen PSK or paired bearer credential changes the attack from "can I reach the service?" to "what can I do with the permissions the service already grants?"

  • A compromised official publisher would contaminate a trusted install path.

None of those scenarios recreate the exact OX flaw, but all of them sit squarely inside the broader warning that AI infrastructure inherits the trust assumptions of its surrounding software supply chain. That is why we run the same behavioural monitoring we recommend to our own customers: credential-access scoring, anomalous egress detection, and process-lineage attribution through flodbadd — the same checks that detected LiteLLM and axios in our E2E suite. Behavioural detection does not care whether the payload arrived via pip, npm, or a compromised MCP bridge. It cares what the payload does on the host.

The public guidance from both sides of the MCP debate points in the same direction. Anthropic warns users to trust the MCP servers they install and to be especially careful with servers that can ingest untrusted content. OX recommends treating external MCP configuration input as untrusted, using verified directories, sandboxing MCP-enabled services, and monitoring tool invocations for suspicious background activity or exfiltration attempts. Those are not competing philosophies. Together they describe a world in which protocol design matters greatly and product discipline matters more.

What secure MCP design looks like now

Read the OX disclosure properly and its most valuable contribution is architectural, not theatrical. The pattern that emerges from the public sources is clear:

  • For remote services, prefer Streamable HTTP. Do not expose stdio launch paths across trust boundaries.

  • For local stdio bridges, require strict provider control over the command and the arguments. No user-controlled binary paths.

  • Authenticate every call. Don't rely on local-network trust.

  • Bind locally by default. Make remote exposure an explicit, documented opt-in — and log it.

  • Keep the tool surface narrow and domain-specific.

  • Keep high-risk lifecycle toggles out of the conversational interface unless there is a compelling reason to expose them.

  • Treat plugin manifests and user MCP config files as privileged configuration, not harmless convenience files.

None of this is speculative. Anthropic's own docs now show enterprise-grade host-side controls through managed-mcp.json, exact command allowlisting, and URL restrictions. We aim for comparable restraint on the server and bridge side through HTTP transport, localhost defaults, authentication, and fixed bridge manifests. The industry does not need a new security buzzword to improve MCP deployments. It needs vendors to stop pretending that a protocol choice is the whole design, and to start treating transports, defaults, and install paths as first-class security decisions.

The final judgement

Anthropic started the ecosystem, and open protocols really can let us design security properties into shared infrastructure. Even so, users never run protocols in the abstract. They run products. Someone's server, someone's bridge, someone's installer, someone's defaults, someone's marketplace build. That is why responsibility still comes down to the software provider. MCP can empower a very sloppy server or a very disciplined one. The difference is not the acronym. It is the quality of the design choices.

And for anyone asking how this fits into the recent Trivy → LiteLLMaxios wave: the same lesson applies. Package ecosystems, protocols, and AI toolchains all pass responsibility downstream. Whoever ships the product — your package publisher, your SDK vendor, your coding agent, your MCP bridge — owns the security outcome for their users. The job of everyone underneath is to verify, at runtime, that what the product actually does matches what it was supposed to do.

Get started

Sources: OX Security MCP STDIO Command Injection advisory, The Register (16 April 2026), SecurityWeek, Infosecurity Magazine, Anthropic MCP documentation and Claude Code security pages, EDAMAME public repositories on GitHub.

Frank Lyonnet

Share this post