Hooks 让你在工具调用前后拦截并控制 Claude 的行为,从而对开发环境拥有更细粒度的掌控。
构建一个 Hook 的步骤
- 选择 PreToolUse 或 PostToolUse:前者可阻止工具执行,后者只能在执行后处理
- 确定要监控的工具类型:明确哪些工具触发 Hook
- 编写接收工具调用的命令:通过标准输入获取 JSON 数据
- 必要时向 Claude 反馈:用退出码控制允许/阻止
可用工具
可用工具会随着 MCP 服务器变化,因此可直接让 Claude 列出当前工具列表以确认。
工具调用的数据结构
{
"session_id": "2d6a1e4d-6...",
"transcript_path": "/Users/sg/...",
"hook_event_name": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "/code/queries/.env"
}
}
Hook 命令读取该 JSON,并决定是否允许当前工具调用。
退出码与控制逻辑
- 退出码 0:允许工具正常执行
- 退出码 2:阻止工具执行(仅 PreToolUse 有效)
如果你在 PreToolUse 中返回 2,写到标准错误的内容会被 Claude 当作反馈信息。
常见示例
最常见的用途是阻止 Claude 读取敏感文件,例如 .env。因为 Read 和 Grep 都可能访问文件内容,
你需要同时监控这两个工具,并检测是否指向敏感路径。
这样既能保护文件系统,又能清晰告诉 Claude 为什么被拦截。