+Fixed MCP tools bypassing the development-mode policy that governs every other tool. MCP built its own approval predicate rather than routing through the central mode system, which failed in two directions: a tool on a server's `alwaysAllow` list collapsed to "never needs approval" in *every* mode, so plan mode executed mutating MCP tools with no prompt despite being the mode you switch into specifically to inspect an untrusted model's intentions without side effects; and every other MCP tool required approval in headless, where no approval handler exists, so daemon-triggered skill runs failed with "Tool execution was denied by the user" when no user was ever asked. MCP tools now take the same posture as built-in tools — headless runs them unattended like `execute_bash` and the file tools, and plan mode gates them on the server's `readOnlyHint` annotation, treating an unannotated tool as a possible mutation and hiding it. A server's `alwaysAllow` list now applies in normal mode only, as its documentation already stated, and can no longer override plan mode. `readOnlyHint` decides plan-mode availability only: because it is supplied by the same server being gated, it never skips a confirmation prompt in normal mode — the user's own `alwaysAllow` list remains the only way to do that.
0 commit comments