{"name":"PreToolUse","slug":"pretooluse","family":"hook","title":"Hook events","noun":"hook event","description":"Before a tool call executes. Can block it","description_source":"docs","described_by":{"doc":"claude-code\/hooks","title":"Hooks reference"},"presence":{"first_seen":null,"removed_in":null,"in_current_build":false,"newest_mined":"2.1.309","builds":0,"mined_builds":150,"first_cited":{"version":"2.1.0","released_at":"2026-01-07 02:43:04","spans":17}},"aliases":[],"entries":[{"version":"2.1.309","anchor":"hook-asked-tools-skip-the-interactive-permission-path","heading":"A hook that asks for permission no longer lets its tool through automatically","line":"When a PreToolUse hook asks for permission, Claude Code no longer auto-allows the tool from the hook's edited input","released_at":"2026-10-22 20:34:13","reason":"found in this entry's text"},{"version":"2.1.307","anchor":"permission-engine-toolcheck-handlers","heading":"Hook decisions on tool use now go through a central permission check","line":"Allow, ask and deny decisions from PreToolUse and PermissionRequest hooks now pass through a central permission check that handlers can answer","released_at":"2026-10-21 20:47:18","reason":"named in this entry, found in this entry's text"},{"version":"2.1.304","anchor":"permissionrequest-hooks-can-deny-before-a-person-is-asked","heading":"Permission request hooks can refuse a tool before you are asked","line":"When a tool would ask for your permission, PermissionRequest hooks can now run first and turn that question into a refusal","released_at":"2026-10-19 19:47:15","reason":"found in this entry's text"},{"version":"2.1.304","anchor":"claude-api-managed-agents-secure-guard-on-ant-commands","heading":"\/claude-api now blocks some ant commands before they run","line":"The \/claude-api skill now blocks `ant` commands with certain IDs and managed-agents-secure commands changed from the guide","released_at":"2026-10-19 19:47:15","reason":"found in this entry's text"},{"version":"2.1.301","anchor":"pretooluse-hook-results-carry-hookpluginid","heading":"PreToolUse hook results now record which plugin they came from","line":"Results from PreToolUse hooks now carry the ID of the plugin that supplied the hook as a separate value","released_at":"2026-10-15 14:34:23","reason":"found in this entry's text, named in this entry"},{"version":"2.1.301","anchor":"hook-decision-reasons-gain-hook-event-source-and-plugin-id","heading":"Permission decisions made by hooks now record which hook made them","line":"When a hook allows or blocks a tool, Claude Code now records the hook's event, where the hook came from and, for plugins, the plugin's ID","released_at":"2026-10-15 14:34:23","reason":"found in this entry's text, named in this entry"},{"version":"2.1.300","anchor":"hook-updatedinput-rewrites-are-now-validated-against-the-too","heading":"Hook-changed tool input is checked and can be refused if it is malformed","line":"When a hook changes a tool call's input, Claude Code checks it against what the tool accepts and can refuse the call if it does not fit","released_at":"2026-10-14 14:27:26","reason":"found in this entry's text, named in this entry"},{"version":"2.1.300","anchor":"pretooluse-hook-that-did-not-finish-no-longer-overrides-an-e","heading":"An unfinished PreToolUse hook no longer replaces an existing deny","line":"If a `PreToolUse` hook does not finish and the tool call is already denied, the original deny now stays in place","released_at":"2026-10-14 14:27:26","reason":"found in this entry's text, named in this entry"},{"version":"2.1.300","anchor":"managed-settings-unread-state-holds-hooksmods-and-makes-too","heading":"Hooks and mods are held back when organization settings can't be read","line":"If your organization's managed settings can't be read, your hooks and mods stay off and tool calls a hook would check ask for permission","released_at":"2026-10-14 14:27:26","reason":"found in this entry's text"},{"version":"2.1.300","anchor":"pretooluse-hook-that-did-not-finish-now-logs-telemetry-and-m","heading":"Tool calls blocked by an unfinished PreToolUse hook are now recorded","line":"When a PreToolUse hook does not finish and Claude Code refuses the tool call, that refusal is now recorded and marked as such","released_at":"2026-10-14 14:27:26","reason":"found in this entry's text"}],"entries_total":80,"docs":[{"source":"claude-code","path":"hooks","title":"Hooks reference","documented":true},{"source":"claude-code","path":"agent-sdk\/hooks","title":"Intercept and control agent behavior with hooks","documented":true},{"source":"api","path":"managed-agents\/migration","title":"migration","documented":false},{"source":"claude-code","path":"agent-sdk\/agent-loop","title":"How the agent loop works","documented":false},{"source":"claude-code","path":"agent-sdk\/claude-code-features","title":"Use Claude Code features in the SDK","documented":false},{"source":"claude-code","path":"agent-sdk\/permissions","title":"Configure permissions","documented":false},{"source":"claude-code","path":"agent-sdk\/python","title":"Agent SDK reference - Python","documented":false},{"source":"claude-code","path":"agent-sdk\/typescript","title":"Agent SDK reference - TypeScript","documented":false},{"source":"claude-code","path":"agent-sdk\/user-input","title":"Handle approvals and user input","documented":false},{"source":"claude-code","path":"agent-view","title":"Manage multiple agents with agent view","documented":false}],"docs_total":14,"gates":[],"related":[],"url":"https:\/\/changelogs.core-directive.com\/reference\/hook\/pretooluse","family_url":"https:\/\/changelogs.core-directive.com\/reference\/hook.json"}