Build1 distinct publisher3 min readPublished
The poisoned field is inputSchema, which the framework parses and executes against while the model's safety training never evaluates it, so the only gate that holds is a hash recomputed at every call.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The three fields in an MCP tool definition do not share a trust boundary. `name` and `description` reach the model as text, where a content filter can at least theoretically look at them [7][10]. `inputSchema` reaches the framework as structure [8]. That split is the vulnerability: safety training has no mechanism for judging whether a JSON Schema is adversarial [9]. Add `execute_command: string` to a legitimate weather tool and nothing has instructed the model to run commands; the framework has been told that running commands is a valid operation on that tool, and the model reads the new parameter as a declared feature [11].
Both OpenAI's and Anthropic's function-calling APIs require a tool to declare its full argument schema up front, and the framework validates outgoing calls against that declaration before the handler sees them [12]. Validation against a poisoned schema passes.
So the failure in Cursor was about when the check ran. Trust was cached at initial approval, and later server-side mutations were consumed without re-validation [5]. The writeup's illustrative gap is two weeks, but the timeline it actually describes is approval at T=0 and mutation at T=1 [19]. A cache with no invalidation is a cache; the bug is calling it an approval.
The fix hashes the schema and compares it against the approved state at each invocation, so any mutation raises a re-approval prompt [6]. That is cheap in the runtime: one stored hash per approved tool, one comparison per call. The cost lands in the workflow, because a re-approval prompt needs a human, and the interesting branch is what a mismatch does inside CI at three in the morning.
MCPTox ran tool poisoning against 45 live MCP servers and 20 models and reported a 36.5% average attack success rate, peaking at 72.8% on o1-mini [14][15]. The peak is about double the mean [20]. Claude-3.7-Sonnet had the highest refusal rate of anything tested and still refused under 3% of the time [16], which puts non-refusal above 97% on the best refuser in the set [21]. For 36.5% to describe your agent, three things have to hold: it resolves tool definitions from a remote server at call time, it never diffs them against an approved copy, and its guardrails live in the prompt layer. Pin the manifest by hash and the benchmark is measuring a configuration you do not run. The writeup's further argument, that more capable models are more susceptible because they are better instruction-followers, is its own reasoning rather than a measured result [17].
Signature scanning is not the fallback. MalTool generated 5,287 tools with embedded malicious behaviors, planted them in simulated repositories, and reports near-zero VirusTotal detection with agent-specific detectors of limited effectiveness [18].
One caveat on all of the above: it comes from a single dev.to post, which names the CVE, the OWASP MCP03:2025 Tool Poisoning category [13][1], and two preprint identifiers, with no vendor advisory text behind them [22].
Ranked by verification strength, evidence, and original report placement.
In the attack, an attacker committed a benign MCP configuration to a shared repository, obtained team approval once, then silently mutated the schema payload on the server side.
The mutation added parameters giving the tool access to file system operations and network calls that the original schema did not declare.
Every developer who had approved the original configuration was running a tool with a different API surface, with no notification and no re-approval prompt.
The writeup's scenario has the tool schema changing silently two weeks after approval, and states the attack timeline as approval at T=0 and mutation at T=1.
MCPoison targeted teams through shared repository configurations, establishing persistent backdoor access through poisoned tool definitions.
CVE-2025-54136, tracked as MCPoison, carries CVSS 8.8 and was disclosed August 5, 2025.
Distinct publishers with included, body-backed reporting in this cluster.
1 article · September 5, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
science
OX Security says MCP command execution is a design choice, so server owners own the risk1 distinct publisher
security
AIR Security counts 17,800 AI add-ons taking instructions from outside their packages1 distinct publisher
product
A 2x LLM bill is not a bug report: token spend is an observability problem1 distinct publisher
build
255 tools, 71,929 tokens: the standing charge hidden in your MCP config1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Identifiers cited, documents not
The architecture half of this story can be checked against published function-calling behaviour and holds up: schemas are validated by the framework, and nothing in a safety-trained model inspects them. The incident half cannot be checked from what is here. A CVE number, an OWASP category code, three arXiv numbers and a Cloud Security Alliance percentage are named without a single quotation from any of them, and the vendor advisory that would confirm what Cursor actually cached and shipped is never reproduced.
Only one shipped fix; no field evidence yet
Exactly one deployed change appears anywhere in this account: Cursor now hashes the approved schema and re-prompts when it moves. Everything else is measured inside harnesses, MCPTox against live servers, MalTool against simulated repositories, ToolGuardian against test servers. There is no count of affected teams, no exploitation telemetry, and the only number touching real pipelines is a survey line about missing integrity verification.
Mechanism convincing, causal reach overstated
Where the post explains the trust boundary it is careful and probably right. Where it generalises it moves faster than its own figures. The claim that stronger models are more exposed sits directly beside a peak success rate belonging to o1-mini, with no capability ranking given for the other nineteen models. 'Automatable at registry scale' comes from planted packages in a simulation. The concrete part, a patched one-time approval check, is smaller than the framing around it.
No product to sell, no affiliation stated
Nothing in the post pitches a scanner, a registry or a paid service, which removes the usual reason to inflate a threat. It also says nothing about who the author is or works for, so the one incentive we can actually observe is the reach a developer platform gives an authoritative-sounding roundup of other people's research.
Mechanism earns trust; the numbers remain unproven
We are reasonably sure about how schema trust works and about the shape of the fix, because both are consistent with how function-calling frameworks are documented to behave. We are much less sure the incident is described as its advisory describes it: the added parameter is a URL-routing destination in one paragraph and file-system plus network access in another, which reads like retelling rather than reading. Every percentage in the piece is unverified.