你在终端里按下那个”允许”的时候,其实并不知道它接下来会动哪些文件、删哪几个目录。这个对话框只告诉你”它想干点什么”,从来没告诉你”干完会怎样”。
10 月 1 日之后,这个位置可以归你了。
Anthropic 给 Claude Code 上线了 Mods:写一个几十行的 TypeScript 函数,就能在 Agent 干活的过程中插进去——改提示词、拦工具调用、在界面上画自己的面板,甚至把自带功能整个换掉。
对做 AI 编程工具 的人来说,这不是”多了一批插件”,而是编程 Agent 第一次把程序本身开放出来给人改。
Mods 到底是个什么东西
先把三层说清楚,因为这三个词经常被混着用。
Skills 是说明书——写给模型的文字指令,告诉它该怎么干。但说明书管不住手,模型看完照样可以不照做。
MCP 是外接设备——数据库、API、浏览器,让 Agent 有更多工具能用。工具箱变大了,游戏规则没变。
Mods 改的是游戏本身。它是跑在会话里的 JavaScript 或 TypeScript 模块,挂在 Claude Code 内部的事件上,能在事情发生前、发生后,或者替代它。
按 Anthropic 官方的说法,Mods 是”改变 Claude Code 工作方式的小型 TypeScript 函数”。它们打包在插件里分发,所以在命令行和桌面版都能装、能分享。
它能挂在哪几个位置
Claude Code 每做一个动作,就发一个事件。Mod 就是一个函数,挂到这些事件上:
prompt.submit:你按下回车之后、内容送到模型之前tool.call:Agent 要调任何工具的时候turn.start/turn.step/turn.complete:一轮对话的开始、每次请求模型前、结束session.start:会话起来的时候command.run:斜杠命令ui.render:界面上每一块要画出来的东西
写法是导出 register(on, options),然后在里面用 on(事件, 匹配器?, 处理函数) 挂。处理函数收到三样东西:$(能力对象,用来读会话数据、跑进程、画面板)、e(事件数据,是深冻结的)、next(把控制权交给链路里的下一个)。
于是你有三个动作可选:
- 观察:
await next(e)拿到结果,看一眼,再原样返回 - 改写:把改过的事件交给
next,等于替换了原本要发生的事 - 接管:干脆不调
next,自己返回结果——比如直接拒绝一次工具调用
多个 Mod 挂在同一个事件上时,按加载顺序排队,先加载的先看到事件、最后拿到结果。这是标准的中间件模型,跟 Express 那套是一个路子,意思是不同人写的 Mod 可以叠着用,不用互相协调。
有个细节值得记一下:每次加载 Mod,Claude Code 会把这个版本对应的 TypeScript 类型声明写进插件的 .claude-plugin/types/ 目录。以你机器上正在跑的那个版本为准——官方明说这个 API 会在版本之间变。
三个官方示例,看清它能做什么
Anthropic 放出了三个参考实现,正好对应三种玩法。
Token Weather——每轮结束后读一次会话用量,在输入框上方画一行状态:上下文占用百分比、已用 token 与窗口大小、最近 12 轮的走势小图、以及比上一轮多了多少。整个大概 80 行代码。这类仪表盘以前要么等官方做,要么自己写脚本在外面接,现在直接画在界面上。
Blast Radius——拦截 Bash 工具调用,把 rm -rf、git reset --hard、强制推送这类命令标成危险操作,先跑一遍 dry-run 看看到底会动到什么,再弹一个带”继续/取消”的侧边面板。官方教程里演示删构建目录时,面板提前列出了 9 个文件、共 1.1MB。
这里必须补一句官方的自我限定:它是一张安全网,不是权限系统。命令替换、别名、脚本里调 rm,都能绕过它的文本匹配。别把它当成最后一道闸门。
Replay Theater——记录一轮里 Agent 做过的每一次 Edit 和 Write,然后注册一个 /replay 命令,把那些改动一条一条回放给你看。
还有一个细节比示例本身更有意思:Claude Code 有些自带功能本身就是 Mod。/diff 面板是,AGENTS.md 支持是,遥测也是,组织策略守卫 sec-default 也是。源码就放在公开仓库的 mods/ 目录里。也就是说你天天用的功能,和你要写的插件,用的是同一套机制——这意味着官方在把 Claude Code 往”一个小内核 + 一堆可插拔功能”的方向收。
最该注意的:它不在沙箱里
这一条比所有功能都重要。
Anthropic 官方文档的原话是:Mods 拥有和 Claude Code 本身相同的机器访问权限,它们不在沙箱里运行。
翻译成具体风险:
- 挂
prompt.submit的 Mod,能读、也能改你输入的一切——送进模型之前 - 挂
tool.call的 Mod,站在 Claude 和它每一个动作之间,可以放行、改写参数,也可以直接拒绝 - 一个 Mod 可以读环境变量里的密钥、可以替你批准工具调用、可以花掉你的额度
这也是为什么最近 恶意 Git 仓库能一次攻破七款编程工具 这件事值得记住:编程 Agent 的攻击面从来不在模型身上,在它被允许碰到的东西上。Mods 把这个面又扩大了一层——它是一条全新的软件供应链入口。社区已经有人在提醒:别让开发直接从公共目录里拉 Mod 而不做审查。
好消息是安装门槛低,坏消息也是。
企业版留了个安全阀
如果你在 Team 或 Enterprise 计划上,或者机器推了托管设置,一个叫 sec-default 的内置 Mod 会最先加载。它挡住的是用户自己装的 Mod 去做危险动作,比如覆盖你的权限拒绝规则。官方把它的源码也放出来了,你可以自己看清楚它限制了什么。
管理员还能做两件事:一是允许或屏蔽公共插件市场;二是自己先加载一个治理 Mod,因为 $ 对象的每个能力都从它手里过,先加载的可以先把方法删掉,后面的插件就调不到了。这相当于给平台团队留了一个能管住所有开发者会话的钩子。
早期被点名的三类高价值用法:从提示词里自动抹掉密钥、在敏感代码路径上加质量闸门、按当前目录决定加载哪套团队规则。
五步先跑起来
别一上来看架构,按这个顺序走最快:
- 确认版本。需要 Claude Code 2.1.287 或更高,默认开启。版本不对做什么都白搭。
- 让 Claude 自己写第一个 Mod。直接在会话里说:”给我做一个在输入框上方显示当前 Git 分支的 Mod。”它会生成清单、hooks 配置和模块文件,第一次落盘时同意热重载,这一轮结束时分支名就出现在提示框上方了。
- 改一行看效果。把显示内容换成工具调用计数器,保存,同样在本轮结束生效。不用装构建工具、不用打包——Claude Code 直接加载
.js和.ts。这一步是让你建立”改了就见效”的直觉。 - 装官方的 Blast Radius 试手感。这是最容易看到价值的一个,也最贴近日常痛点。用之前记住它挡不住什么。
- 再考虑自己写。写之前先想清楚这个 Mod 会读到什么、能改什么——因为它拿的是你的权限。
有个状态管理的小坑先记下:模块级的变量在热重载时会重置,而存在 $.state 里的值活在宿主里,跟着会话走,重载后还在。要跨重载保存的东西,别放在模块顶层。
优缺点,摊开说
优点:
- 不用等官方排期,想要的行为自己往里加
- 能改的不只是配置,是事件本身——提示词、工具调用、权限决定、界面都覆盖到了
- 热重载,改完当场生效,试错成本极低
- 自带功能也是 Mod,可以关掉不用的,把工具削成你要的样子
- 中间件式叠加,不同来源的 Mod 能共存
缺点:
- 不在沙箱里,装的每段代码都跟你本人同级,这是最硬的一条
- API 会随版本变,官方只保证你当前这个版本的类型声明
- 参考示例里只有两个能直接改着用,模型路由这类能力有文档但没官方实现
- 权限拦截类 Mod 靠文本匹配,绕过去不难
- 生态刚起步,公共目录里的东西没经过什么审查
适合谁,谁先别急
适合:想让 Agent 遵守团队规矩的平台工程团队;需要给危险命令加一道人工确认的开发;想把上下文用量、CI/CD 状态直接画在会话旁边的人;以及那些被”等官方发功能”卡住过的重度用户。
先别急:个人开发者如果只是偶尔用用,现成功能已经够,没必要多一个需要维护的代码依赖;安全要求高的环境,先把审查流程定下来再说装不装;把 Mod 当备份或权限兜底的想法也要放下——拦截器不是备份。
替代方案
如果你也看 AI 智能体与自动化 这条线,会发现同一个诉求有好几种解法:
- 只用插件和 Hooks:不改界面、不改事件的话,老的 Hooks 机制还在,比 Mods 简单也安全得多
- 自己包一层外挂:写脚本在 Claude Code 外面做拦截,可控但拿不到会话内部状态
- 换工具:Kimi Code 桌面版把权限拆成三档交给用户决定,是另一条思路——不开放内部事件,但把关键权限做成显式选项
- 加权限沙箱:如果核心诉求只是”别乱跑命令”,把 Bash 沙箱缩到单条命令 的收益比写 Mod 更直接
另外,写 Mod 这件事本身也在变便宜——Claude Sonnet 5.5 这类中端模型的编程跑分已经反超上一代旗舰,让模型替你写一个几十行的钩子,现在是很划算的用法。Mods 早期还有过 CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 的预览开关,如果你看到旧教程里提到它,记住它已经过时了。
老达点评
第一,真正的变化不是多了插件,是编程 Agent 开始承认自己只是个平台。以前想改它的行为,要么等更新,要么在外面套壳;现在它把事件流和界面都交出来了。这条路一旦走通,工具之间的差距会从”谁的功能多”变成”谁的扩展面更干净”。Anthropic 把自带功能也改用 Mod 实现,就是在给这句话下注。
第二,“不在沙箱里”这五个字,决定了它现在是给谁用的。个人开发者拿它提效率,收益归自己,风险也归自己,没问题;企业里一旦有人从公共目录随手装一个,那就是把自己的文件系统、密钥、额度一起交出去了。所以先行的不是功能,是审查流程——这也是为什么企业版要留 sec-default 在最前面。
第三,Blast Radius 那个例子值得多想一层。它做的其实是把”允许/拒绝”这个二选一,变成了”先算清楚会发生什么,再让你决定”。这个思路比它本身的实现更重要:Agent 时代真正缺的不是更严的闸门,是让人做决定之前看得懂后果。当然它自己承认拦不住脚本和别名,所以它解决的是理解问题,不是管控问题。
第四,想清楚你要的是控制还是安全感。Mods 给的是前者的工具,而多数人真正怕的是后者出了事。两者不冲突,但顺序不能反——先把关键动作的确认流程定下来,再考虑放开扩展,不然加得越多,看不见的地方越多。
参考来源:Anthropic 官方博客《Customize Claude Code with mods》、Claude Code Mods 官方文档与构建指南、公开仓库 anthropics/claude-code 的 mods/ 目录、以及 Simon Carter、Complete AI Training、AI Primer 等第三方拆解。文中版本号、事件名与官方原话均以官方文档为准,API 可能随版本变化,请以你本机 .claude-plugin/types/ 下的类型声明为最终依据。