改命令内容:PreToolUse 返回 allow 加 updatedInput

Bash 和 apply_patch 必须带 command 字符串。MCP 则替换整个参数对象。PermissionRequest 里写 updatedInput 会 fail closed。

PermissionRequest 不能改写输入。要在工具真正执行前换掉 payload,用 PreToolUse

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "allow",
    "updatedInput": {
      "command": "echo rewritten"
    }
  }
}

规则:

  • Bashapply_patchupdatedInput 必须有字符串 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 不一致。

来源