Start from what the protocol does and does not promise
The MCP tools specification says there should always be a human in the loop with the ability to deny tool invocations, and that clients must consider tool annotations untrusted unless they come from trusted servers. The schema defines annotations such as readOnlyHint, destructiveHint, idempotentHint and openWorldHint, and describes them explicitly as hints that are not guaranteed to describe the tool's behavior faithfully.
That is a useful reminder. An annotation saying a tool is read-only is not a control. The control is the credential the tool runs with and the checks in the server that executes the action.