<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ben Bar lev</title>
    <description>The latest articles on DEV Community by Ben Bar lev (@ben_barlev_4a19dda398fd2).</description>
    <link>https://dev.to/ben_barlev_4a19dda398fd2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4095943%2F9bed3f7f-ce2e-484e-bf8c-e9c16f55ce0c.gif</url>
      <title>DEV Community: Ben Bar lev</title>
      <link>https://dev.to/ben_barlev_4a19dda398fd2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ben_barlev_4a19dda398fd2"/>
    <language>en</language>
    <item>
      <title>MCP Describe Injection: Audit Tool Descriptions Like Code</title>
      <dc:creator>Ben Bar lev</dc:creator>
      <pubDate>Wed, 26 Aug 2026 19:22:11 +0000</pubDate>
      <link>https://dev.to/ben_barlev_4a19dda398fd2/mcp-describe-injection-audit-tool-descriptions-like-code-27bc</link>
      <guid>https://dev.to/ben_barlev_4a19dda398fd2/mcp-describe-injection-audit-tool-descriptions-like-code-27bc</guid>
      <description>&lt;h1&gt;
  
  
  MCP Describe Injection: Audit Tool Descriptions Like Code
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;A practical guide to a real, under-covered MCP attack surface — and a dependency-audit mindset you can apply today. No vendor required for the checklist at the end.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;A single &lt;code&gt;install&lt;/code&gt; line stamps every tool in an MCP server onto the prompt your model reasons over, and nobody reviews the description. One install becomes a full tool slate — and you never looked at the contents.&lt;/p&gt;

&lt;p&gt;The Model Context Protocol is the layer letting agents call tools and read resources across files, databases, email, and internal APIs. That's powerful. It also means a server's &lt;em&gt;metadata&lt;/em&gt; — the tool descriptions the model reads at the top of every session — is now part of your attack surface. This post is about one specific, demonstrated attack on that surface: tool poisoning, and how to reduce it with the discipline you already use for dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What tool poisoning is — and why it isn't just indirect prompt injection
&lt;/h2&gt;

&lt;p&gt;Tool poisoning hides malicious instructions in a tool's &lt;em&gt;metadata at registration time&lt;/em&gt;, before anything executes. When the agent picks the tool later, it treats those metadata strings as trusted context. Nothing has run yet, so the attack hasn't "output" anything to scan.&lt;/p&gt;

&lt;p&gt;This is related to indirect prompt injection (IPI), but it sits earlier in the pipeline. An IPI payload typically arrives in a tool's runtime output. A poison payload arrives with the tool itself, in the schema the model reads. There is no runtime event to catch. MCPTox, the benchmark, formalizes this exactly.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The numbers you can cite
&lt;/h2&gt;

&lt;p&gt;The MCPTox benchmark (arXiv:2508.14925) measured agent robustness to tool poisoning on real servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;45 live MCP servers, 353 authentic tools, three attack templates delivered as tool-description payloads.&lt;/li&gt;
&lt;li&gt;20 prominent LLM agents evaluated.&lt;/li&gt;
&lt;li&gt;Highest attack success rate: o1-mini at 72.8% (Phi-4 70.2%, GPT-4o-mini 61.8%). Average ASR across all models was 36.5%.&lt;/li&gt;
&lt;li&gt;The highest refusal rate across all models was Claude-3.7-Sonnet, under 3%. Agents rarely refuse a poisoned call, even the ones most inclined to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reason: a poisoned action is only visible as malicious if you detect it. But it executes through an already-trusted tool for a seemingly-legitimate operation, so content-based safety alignment gets nothing suspicious.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why the model can't just read around it
&lt;/h2&gt;

&lt;p&gt;OWASP LLM01 states the core issue: an LLM makes no architectural distinction between instructions and data — both live on the same token stream. You cannot rely on a model to separate "this is a system instruction" from "this is tool metadata describing what the tool does."&lt;/p&gt;

&lt;p&gt;In MCPTox, adding classic tag-based hijacking markers (like &lt;code&gt;&amp;lt;IMPORTANT&amp;gt;&lt;/code&gt; or "ignore previous instructions") raised attack success by only ~2-3%. Placement, not formatting, decides the outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why safety alignment fails
&lt;/h2&gt;

&lt;p&gt;A security-conscious model refuses when it decides a request is malicious. With tool poisoning, nothing looks malicious. The agent is asked to "send an email to this address" through a tool it already trusts, so no content filter fires and no alignment correction engages.&lt;/p&gt;

&lt;p&gt;This is the key MCPTox finding: refusal rates were near zero (Claude-3.7 under 3%), and the dominant failure mode was the model directly executing the poisoned call.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The protocol already names the boundary
&lt;/h2&gt;

&lt;p&gt;The MCP specification (2025-11-25) addresses this directly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Clients MUST consider tool descriptions to be untrusted unless they come from trusted servers."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also keeps a human in the loop: "there SHOULD always be a human in the loop with the ability to deny tool invocations." Clients own the enforcement. The boundary is defined; how clients enforce it is the interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What to do today (no vendor required)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat every MCP description as code, not prose.&lt;/strong&gt; Read the schema like you'd review a diff before approving a dependency bump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin server versions.&lt;/strong&gt; A mutable registry is the same risk as a mutable dependency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope to least privilege.&lt;/strong&gt; Use an allowlist that starts empty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate state-changing tools.&lt;/strong&gt; Anything that writes, sends, deletes, or spends should be allowed explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a parameter gate or human approval on high-impact calls.&lt;/strong&gt; When a tool has side effects, a human should confirm the specific call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep an evidence trail.&lt;/strong&gt; Record what was called, with what arguments, and what was allowed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last point is where a control + evidence layer fits — an opt-in checkpoint that gates calls and records decisions as recomputable evidence. Not a sandbox, and no claim to intercept everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Close
&lt;/h2&gt;

&lt;p&gt;Models keep getting more capable, and the trust boundary doesn't move. The tool set in your agent's MCP tier is now part of your supply chain. Next time you hit "install server," ask: is the description a dependency you've actually reviewed?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Sources: MCPTox (arXiv:2508.14925); MCP Specification 2025-11-25; OWASP LLM01 (2025). Figures as reported by the cited primary sources.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>security</category>
      <category>ai</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
