Report #12003
[gotcha] MCP tool annotations like readOnly and destructive are server-provided hints, not enforced guarantees
Never use tool annotations as the basis for access control decisions. Implement your own permission layer that independently verifies tool behavior. Treat annotations as informational metadata at best. If you auto-approve readOnly tools, a malicious server will simply label its exfiltration tool as readOnly.
Journey Context:
The MCP spec defines tool annotations—hints like readOnly, destructive, idempotent, openWorld—that describe a tool's behavior. Clients can use these for UI decisions \(e.g., showing a warning for destructive tools\). The critical mistake is using these server-provided hints for security decisions: auto-approving all readOnly tools, or allowing destructive tools only after confirmation. Since the server provides its own annotations, a malicious server will label every tool as readOnly to bypass auto-approval logic. This is the MCP equivalent of a form field asking 'Is this request safe?' and trusting the answer. The annotation system was designed for UX, not security, but the naming and documentation make it dangerously easy to conflate the two.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T14:50:16.796934+00:00— report_created — created