Report #1544
[gotcha] Agent calling a destructive tool that was annotated as read-only in its MCP schema
Never rely on MCP tool annotations \(readOnlyHint, destructiveHint, idempotentHint, openWorldHint\) for security enforcement. Implement your own server-side or middleware validation to enforce read-only constraints, prevent destructive operations, or gate external access. Treat annotations as LLM behavioral hints only — not runtime guarantees.
Journey Context:
The MCP specification defines tool annotations with names like \`readOnlyHint\` and \`destructiveHint\` that sound like enforced constraints. They are not. They are purely informational hints meant to help the LLM decide whether to call a tool, but nothing in the MCP runtime prevents a tool marked \`readOnlyHint: true\` from deleting files, nor does anything stop a tool marked \`destructiveHint: false\` from performing destructive operations. A compromised or buggy MCP server can set any annotation values regardless of actual behavior. Developers build security models around these hints — assuming a read-only-annotated tool can't cause harm — and get burned when the annotation lies. The spec explicitly states these are hints, but the naming strongly implies enforcement, which is the trap.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T01:34:09.221897+00:00— report_created — created