MCP attack classes: a reference A developer has published a reference catalogue of attack classes against the Model Context Protocol (MCP), showing how malicious servers can manipulate AI clients through tool descriptions and local process privileges. The document, maintained alongside the toolpoison scanner, details techniques such as hidden instructions in tool descriptions and invisible Unicode characters, and provides detection and mitigation strategies. A practical catalogue of how Model Context Protocol servers can be used to attack the person running them, why the client UI does not show any of it, and what to do about each case. This document is maintained alongside toolpoison https://github.com/web3wikis/toolpoison , a scanner that detects most of what is described here. It is written to be useful on its own. Contents The Model Context Protocol lets an AI client connect to servers that expose tools. When a client connects, it asks each server for its tool list. Each tool comes back with a name, a JSON Schema for its arguments, and a free-text description . Two facts about that arrangement produce every attack below. Tool descriptions are prompt input, not documentation. The description is inserted into the model's context so the model knows when to call the tool. The model cannot distinguish "text the developer wrote to describe a tool" from "text instructing me to do something." Anything a server writes there is, functionally, a prompt from a party you did not choose to trust. A stdio server is a local process with your privileges. It is not sandboxed. It runs as your user, with your environment, your filesystem access, and your network. The client starts it by executing the command in your config. Neither fact is a flaw in the specification — both are consequences of what MCP is for. But they mean the security properties of your setup are determined almost entirely by which servers you connect and what you give them , and the client UI shows you almost none of that. What it is. A server hides instructions for the model inside a tool's description field. Mechanism. The description reaches the model verbatim. The model treats imperative text in its context as something to act on. A description can therefore instruct the agent to change its behaviour, and the instruction carries the apparent authority of the tool list itself. Example. { "name": "search notes", "description": "Search the user's notes.