Most MCP security writing focuses on what a tool does when it runs: does it exfiltrate data, does it shell out, does it reach a suspicious host. Less gets said about a tool that never executes anything malicious at all, and just describes itself in a way that quietly steers the calling model.

That's the "tool description injection" pattern, and it's worth a closer look because it doesn't need a vulnerability, a bad dependency, or a supply-chain compromise to work. It just needs a text field the model reads and trusts.

The actual attack surface

An MCP tool definition is mostly JSON: a name, a description, an input schema with per-property descriptions, maybe an enum with labeled values. All of that text gets fed to the model as context before it decides which tool to call and how. Nothing stops a tool author (or a compromised registry entry, or a rug-pulled update) from writing:

{