﻿---
title: "改命令内容：PreToolUse 返回 allow 加 updatedInput"
summary: "Bash 和 apply_patch 必须带 command 字符串。MCP 则替换整个参数对象。PermissionRequest 里写 updatedInput 会 fail closed。"
category: hooks
level: advanced
surfaces: [cli]
tags: ["hooks", "PreToolUse", "updatedInput"]
canonical: /tips/pretooluse-updated-input/
---

# 改命令内容：PreToolUse 返回 allow 加 updatedInput

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

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

```json
{
  "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 不一致。

## 来源

- [OpenAI · Hooks](https://developers.openai.com/codex/hooks)
