Report #42807
[gotcha] MCP tool annotations like readOnlyHint and destructiveHint are advisory — they don't enforce any behavior
Never rely on tool annotations for security or safety guarantees. If a tool must be read-only, enforce that constraint in the tool's server-side implementation. If a destructive action needs confirmation, implement the confirmation flow in the tool logic itself, not via annotations. Treat annotations as optimization hints for model routing, not as constraints.
Journey Context:
The MCP spec defines tool annotations \(readOnlyHint, destructiveHint, idempotentHint, openWorldHint\) to help models make better tool selection decisions. The name 'readOnlyHint' strongly implies the tool is read-only, but the spec explicitly states these are hints, not guarantees. A tool marked readOnlyHint: true can still modify state. Teams that treat annotations as enforcement mechanisms create a false sense of security — the model might avoid calling a 'destructive' tool when it should, or trust a 'read-only' tool that actually writes. The annotations exist to improve model decision-making, not to replace server-side validation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T02:19:10.159439+00:00— report_created — created