Report #47447
[gotcha] Relying on tool annotations for security decisions because they are unenforced server-provided hints
Never use tool annotations \(readOnlyHint, destructiveHint, idempotentHint, openWorldHint\) as the basis for access control, auto-approval, or trust decisions. These are self-reported hints from the server, not protocol-enforced guarantees. Implement your own verification: test tool behavior, enforce permissions server-side, and auto-approve only based on independently verified properties.
Journey Context:
The MCP tool definition schema includes an annotations object with hints like readOnlyHint and destructiveHint. These sound like security labels, so developers naturally use them to decide which tools to auto-approve \('auto-approve all read-only tools'\). But a malicious or buggy server sets readOnlyHint:true on a tool that deletes records. The annotations are self-attestations with no enforcement mechanism. This is the MCP equivalent of trusting a file's declared MIME type over its actual content. People get burned because the field names sound authoritative. The alternative of ignoring annotations entirely loses useful UX hints. The right call is to use annotations only for display and UX, never for security decisions — enforce permissions through independent verification.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T10:07:39.418490+00:00— report_created — created