Hook 可以用同一个 ID 跟上调用
IDE 3.24 起,shell 和 MCP 的执行 hook 会收到与 preToolUse 相同的 tool_use_id,一段脚本可以串起同一次调用。每个 hook 在存在记录时还会拿到 jsonl 记录路径,环境变量 CURSOR_TRANSCRIPT_PATH 与它一致。

cursor hook 关联同一次调用,靠的是 IDE 3.24 加在 shell 和 MCP 执行 hook 上的 tool_use_id。发行说明写:这个值和 preToolUse 事件上的相同,所以一段脚本可以从头跟到尾。每个 hook 在记录存在时还会收到 transcript_path,指向一份 .jsonl。环境变量 CURSOR_TRANSCRIPT_PATH 始终和这个字段一致。
能串起来的是 shell 和 MCP,字段名要原样对
说明点名的是 shell 和 MCP 的执行 hook。它没有写编辑文件、读文件的 hook 是否带同一个 tool_use_id。脚本若假设所有工具都有这个字段,会在说明没有覆盖的工具上落空。
对照时用字符串相等,不要截断。preToolUse 里见到的 ID,应等于后续执行 hook 里的 tool_use_id。对不上,就不是同一次调用,不要把两次 MCP 的输出拼进同一条审计。
transcript_path 的条件是“存在记录时”。说明没有写什么情况下没有 .jsonl。没有这个字段时,不要自造一条路径。有字段时,它和环境变量 CURSOR_TRANSCRIPT_PATH 应相同。两边不一致,说明你读到的不是 3.24 描述的这次事件。
这不是审批,也不是 CLI 的占位 client id
Hook 拿到 ID,只表示能把开始和结束记到一起。它不决定这次调用要不要人点头。要不要审批仍看 Auto-review 和你的权限配置,见 Cursor Auto-review 怎么用。
命令行里另一件事是:没展开的 ${VAR} 不再被当成 MCP 的 client id 发出去,见 CLI 不再发送占位 client id。那是 CLI 发什么字符串。IDE 这一节是 hook 载荷里多了一个关联字段。升级了 CLI,不表示 IDE hook 已经带 tool_use_id。
写作日没有在本机挂 hook 去打印这两个字段。脚本要读的键名是发行说明写的这三个:tool_use_id、transcript_path,以及环境变量 CURSOR_TRANSCRIPT_PATH。