Agent 插件自查:Claude Code、Codex 的钩子和 MCP 怎么查

Postman 桌面版升级时自动给 Claude Code 和 Codex 装插件、加启动钩子、接远程 MCP,这件事 11 月 3 日在开发者圈传开。你不用 Postman,也该查一遍自己的 Agent:插件、钩子和 MCP 服务都会进 Agent 的上下文,钩子还会以你的用户权限执行命令。下面按 Anthropic 与 OpenAI 官方文档(2026-11-04 北京时间查阅),给 Claude Code 和 Codex 各列一套「看清楚、关得掉」的命令。
插件不只是几段提示词
Claude Code 的插件安全文档第一句就是:你装的插件能以你的用户权限在机器上执行任意代码。一个插件可以带 Skill 和命令(进上下文,影响 Agent 怎么用手上的工具),也可以带钩子、后台监视进程、MCP 和 LSP 服务、bin/ 可执行文件。权限规则和沙箱管的是 Agent 发起的工具调用;钩子、监视进程和 MCP 服务进程在沙箱外运行。
Codex 的插件结构类似,可以带 Skill、MCP 服务和钩子。不同的是,Codex 给非托管钩子加了一道闸:钩子要先在 /hooks 里审阅并信任,Codex 按钩子定义的哈希记下信任,定义一变就要重新审。这条记录写在 config.toml 里。按 Postman issue #14370 贴出的源码,它的安装程序装完插件后会调用 Codex 接口,替自己的 SessionStart 钩子写入 trusted_hash。
信任记录也是一行配置,同一个用户账号下的程序都写得进去。
自查就看三样:装了什么插件、哪些钩子会跑、连着哪些 MCP 服务。
前置条件
- 本机装了 Claude Code 或 Codex CLI(两个都有就都查)。下面的命令都是只读的,最后一节才动配置。
- macOS 或 Linux 终端;Windows 把
~换成%USERPROFILE%,grep 换成Select-String。 - 动手前先备份:
cp ~/.codex/config.toml ~/.codex/config.toml.bak,cp ~/.claude/settings.json ~/.claude/settings.json.bak。
两家的入口对照
| 要查的 | Claude Code | Codex |
|---|---|---|
| 插件记在哪 | ~/.claude/settings.json 的 enabledPlugins(用户级);项目级在 .claude/settings.json、.claude/settings.local.json | ~/.codex/config.toml 的 [plugins."名字@市场"];项目级在 .codex/config.toml |
| 列出插件 | claude plugin list,或会话里 /plugin 的 Installed 页 | 会话里 /plugins,按市场分页 |
| 看钩子 | /hooks(只读,标出来源) | /hooks(可审阅、信任、单个停用) |
| 钩子要不要你点头 | 写进设置文件就生效 | 非托管钩子要先信任,记在 hooks.state |
| 全部钩子一键关 | "disableAllHooks": true | [features] 下 hooks = false |
| 列 MCP | claude mcp list | codex mcp list |
第一步:查 Claude Code
# 插件:每个都有 Version、Scope、Status
claude plugin list
# 某个插件每轮会话固定占多少 token、由哪些组件组成
claude plugin details <插件名>
# 你登记过哪些插件市场(第三方市场在这里现形)
claude plugin marketplace list
# MCP 服务
claude mcp list
然后进一次会话,输入 /hooks。这个菜单只读,会给每个钩子标上来源:用户设置、项目设置、本地设置、某个插件,或当前会话。选中一个能看到它实际执行的完整命令和定义所在的文件。重点看 SessionStart 和 UserPromptSubmit,这两类会往上下文里塞文字。Postman 那个钩子就挂在会话启动上,让 Agent 碰到 API 类任务先加载它的 Skill。
再对一下文件。官方文档说明,用户级插件记在 ~/.claude/settings.json 的 enabledPlugins 里;issue 里的报告者还在 ~/.claude/plugins/installed_plugins.json 看到了安装时间 installedAt,可以拿它和你记得的操作时间对一对。
第二步:查 Codex
# 插件市场、插件开关、钩子信任记录
grep -nE '^\[(marketplaces|plugins)\.|^\[hooks\.state|trusted_hash' ~/.codex/config.toml
# 用户级钩子文件
ls -l ~/.codex/hooks.json 2>/dev/null
# 插件缓存(每个版本一个目录)
ls ~/.codex/plugins/cache/ 2>/dev/null
# MCP 服务
codex mcp list
Postman issue 里,被改过的 config.toml 多了三段:[marketplaces.postman] 指向 Postman 的 GitHub 仓库,[plugins."postman@postman"] 写着 enabled = true,还有一段 [hooks.state."postman@postman:hooks/codex-hooks.json:session_start:0:0"],里面是 trusted_hash。你的文件里每一个 hooks.state 条目都应该对得上一次你自己在 /hooks 里点过的信任。
接着在 Codex 会话里打开 /hooks,它会列出各个来源的钩子,等审阅的会标出来;再打开 /plugins,看看有没有不认识的市场页签。
第三步:一段脚本扫两家
把前两步并成一段,只读,不改任何文件:
#!/usr/bin/env bash
echo "== Claude Code"
command -v claude >/dev/null && claude plugin list && claude mcp list
grep -n -A20 '"enabledPlugins"' ~/.claude/settings.json 2>/dev/null
for f in .claude/settings.json .claude/settings.local.json; do
[ -f "$f" ] && echo "-- $f" && grep -nE '"(enabledPlugins|hooks|disableAllHooks)"' "$f"
done
echo "== Codex"
grep -nE '^\[(marketplaces|plugins)\.|^\[hooks|trusted_hash|^hooks *=' \
~/.codex/config.toml .codex/config.toml 2>/dev/null
ls ~/.codex/hooks.json .codex/hooks.json 2>/dev/null
command -v codex >/dev/null && codex mcp list
echo "== Copilot CLI"
grep -nE 'extraKnownMarketplaces|enabledPlugins' ~/.copilot/settings.json 2>/dev/null
最后那段 Copilot 是 issue 评论里补充的:有用户在 ~/.copilot/settings.json 里也找到了 Postman 的市场和插件开关。在项目根目录跑一次,项目级配置也一起看了。
第四步:关掉或卸掉
先停用,确认没东西坏了再卸载。
# Claude Code:停用 / 卸载(卸载默认作用于用户级)
claude plugin disable <插件>@<市场>
claude plugin uninstall <插件>@<市场> --scope user
# 不信任整个市场:移除它,会连带卸载从它装的所有插件
claude plugin marketplace remove <市场>
# 临时关掉全部钩子(写进 ~/.claude/settings.json)
# "disableAllHooks": true
# 只对这一次运行生效:
claude --settings '{"disableAllHooks": true}'
# Codex:在 config.toml 里停用插件但不卸载(Codex 插件文档的写法)
[plugins."某插件@某市场"]
enabled = false
# 紧急情况:全部钩子先停
[features]
hooks = false
Codex 的卸载在 /plugins 里做:打开插件详情选卸载;已装的插件按空格可以切换开关。单个钩子在 /hooks 里停用。你没点过信任却出现在 hooks.state 里的条目,可以删掉。按 Codex 文档,没有信任记录的钩子会被标成待审阅并跳过,等你在 /hooks 里重新决定。
Claude Code 卸载插件后,文件会在 ~/.claude/plugins/cache/ 下留 14 天才被后台清理;想立刻清掉,删 ~/.claude/plugins/cache/<市场>/<插件>/。
常见坑
- Claude Code 不能单独关一个钩子:官方文档明说,没有办法在保留配置的同时停用某一个钩子。要么从设置文件里删掉那条,要么
disableAllHooks全关,要么停用它所在的插件。 - 项目设置会盖过你的全局开关:项目
.claude/settings.json里写"disableAllHooks": false,会覆盖你用户设置里的true。不放心的仓库,用上面那条--settings参数单次运行。 - 插件会自己更新:Claude Code 对
claude-plugins-official等官方市场默认开着自动更新,社区和第三方市场默认关。开了自动更新,你审过的文件在磁盘上可能已经换了。Codex 这边,插件更新改了打包的脚本,即使钩子定义没变也要重新审。 - 卸了插件,连接还在:OpenAI 的插件文档提醒,卸载插件只移除插件包,在 ChatGPT 里另外连上的 MCP 集成要去那边单独断开。issue 评论里也有用户反映,Postman 菜单里的卸载项没清掉 Copilot 那边的配置,卸完记得再跑一次第三步的脚本。
- 跳过信任的参数:Codex 有
--dangerously-bypass-hook-trust,本次运行里所有已启用的钩子不经信任直接跑。别把它写进别名或 CI 脚本。
完成标准
claude plugin list和/plugins里每一个插件你都说得出是自己什么时候装的。/hooks里每个 SessionStart、UserPromptSubmit 钩子的命令你都读过。~/.codex/config.toml里的每条trusted_hash都对应你亲手信任过的钩子。claude mcp list、codex mcp list里没有你不认识的远程地址。- 第三步的脚本存成文件,装完新软件、升级完桌面应用后再跑一次。
最后
现在就把第三步那段脚本跑一次。查出来的钩子想自己写几条护栏,可以接着看 Claude Code Hooks 教程;Codex 的审批和沙箱怎么配,见 Codex 配置教程。Postman 事件本身的经过在 这条快讯里。