Report #17036
[gotcha] My tool is marked readOnlyHint:true but it still deleted data
Never rely on MCP tool annotations for security enforcement. Implement server-side access control and permission checks regardless of what annotations declare. Treat annotations as UI hints only — enforce boundaries at the permission layer, not the metadata layer.
Journey Context:
The MCP spec defines tool annotations \(readOnlyHint, destructiveHint, idempotentHint, openWorldHint\) as hints to help LLMs and clients make UI decisions like whether to show a confirmation dialog. They are self-reported by the server and carry zero enforcement mechanism. A malicious or buggy server can mark a destructive write tool as read-only, causing the client to skip user confirmation and auto-approve the call. The counter-intuitive part: developers see 'readOnlyHint' and assume it is a security guarantee or access control, but it is the MCP equivalent of a self-declared CORS header — trivially spoofable and purely advisory. The spec explicitly states these are hints, not constraints, but every client developer misses this distinction.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T04:18:22.824960+00:00— report_created — created