改命令内容:PreToolUse 返回 allow 加 updatedInput
Bash 和 apply_patch 必须带 command 字符串。MCP 则替换整个参数对象。PermissionRequest 里写 updatedInput 会 fail closed。
PermissionRequest 不能改写输入。要在工具真正执行前换掉 payload,用 PreToolUse:
{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"updatedInput": {
"command": "echo rewritten"
}
}
}
规则:
Bash和apply_patch:updatedInput必须有字符串command- MCP 和其它本地 function 工具:
updatedInput是替换后的参数对象 - 只允许搭配
permissionDecision: "allow";其它形状会报错 - 多个匹配钩子都看到原始
tool_input,写完之后才选出一份updatedInput去执行
拦调用用 permissionDecision: "deny",或退出码 2 并把原因写到 stderr。只想给模型加说明、不改命令,返回 additionalContext。
现在还不支持、但会解析的字段:permissionDecision: "ask"、旧 decision: "approve"、continue: false。钩子记失败,工具调用照样继续。
护栏不是铁壁:简单 shell 才会进钩子;unified_exec 的拦截还不完整;WebSearch 等非 shell、非 MCP 调用根本不进 PreToolUse。审计/遥测可能记下改写前的那条命令,和实际执行的 payload 不一致。