跳到正文
claudemods

什么是 Claude Code 插件?

更新于

什么是 Claude Code 插件?它们是在 Claude Code 内部运行你自己的 JavaScript 或 TypeScript 代码的 plugin,因此可以改变 Claude Code 的外观和行为:在输入框上方显示一行文字、在状态栏里放上数字、拒绝执行危险的 shell 命令,或者添加一个斜杠命令。插件(mod)功能随 Claude Code 2.1.287 推出,并且默认开启。

本指南会讲清楚插件由什么组成、它能碰什么不能碰什么、插件与设置中的 hooks、MCP 服务器和 skills 有何不同,以及如何判断一个插件是否可以放心安装。最后还会带你用两分钟做出一个能实际运行的插件。

Claude Code 插件到底是什么?

插件就是一个普通的 Claude Code plugin,只是多了一个文件:hooks 模块。这个模块导出一个 register(on, options) 函数。Claude Code 加载该 plugin 时会调用 register,插件则用 on(...) 订阅各种事件,例如“某个工具即将运行”“一轮对话已结束”或“正在绘制加载动画(spinner)”。

每个处理函数都会收到三个参数:

  • $,即插件 API。插件产生的每一个效果都要经过它:$.ui.status、$.ui.toast、$.process.run、$.fs.read、$.command.register 等等。
  • e,即事件本身,例如即将运行的 Bash 命令。
  • next,用于把事件交还给 Claude Code 自身的默认行为。

处理函数可以观察(调用 next(e) 并查看结果)、改写(用修改后的事件调用 next),或者直接应答(返回自己的结果,完全不调用 next,防护类插件就是这样拒绝工具调用的)。

让一个 plugin 成为插件(mod)的,只是一个键。只要 hooks/hooks.json 中包含 modules,这个 plugin 就是插件:

{
  "modules": ["./register.js"]
}

插件在 Claude Code 的进程中以你的用户权限运行,并没有沙箱隔离。与之相对的好处是:所有效果都必须经过 $,因此 Claude Code 可以在你运行之前读取插件源码,准确列出它处理哪些事件、调用哪些 API。

插件能改变哪些东西?

事件列表很长,但大多数插件只会用到其中几类:

领域 事件 示例
工具 tool.call、tool.check 在 rm -rf / 执行之前将其拦截
对话轮次 turn.start、turn.complete 长回答完成时发出提示音
会话 session.start、session.compact 启动计时器,在压缩上下文后刷新
界面 ui.render 在加载动画旁或输入框上方添加文字
命令 command.run 不调用模型,直接响应 /tally
提示词 prompt.submit、prompt.context 为你发送的内容补充上下文

插件还可以打开面板、注册供 Claude 调用的工具、运行子代理、读写文件、发起 HTTP 请求,并把数据保存在一个小型键值存储中。这些能力都是 $ 调用,都会出现在验证结果里。

插件界面会在终端(包括 JetBrains 插件)和桌面应用的 Code 标签页中绘制。在 VS Code 扩展的聊天面板、claude -p 和 Agent SDK 中,hooks 依然会运行,但不会绘制任何内容。因此,防护类插件在无界面运行时照样保护你,而状态栏插件只是没有地方显示文字而已。

插件、hooks、MCP 服务器与 skills 有什么区别?

这四种扩展方式只是名字相近,实际上各不相同:

  • 设置中的 hooks 会在固定时机(工具运行前、工具运行后、停止时)执行一条 shell 命令。它们是独立进程,通过 stdin 和 stdout 上的 JSON 与 Claude Code 通信,无法绘制界面,也无法保存实时状态。
  • 插件(mods) 在进程内运行,并提供带类型的 API。它们能做 hooks 能做的一切,还能在渲染位置上绘制内容、注册命令和工具,并响应 hooks 根本接收不到的事件,例如加载动画的绘制或上下文压缩的开始。
  • MCP 服务器 通过一套协议为 Claude 提供新的工具和数据源,由 Claude 决定何时调用。它们不会改变 Claude Code 的界面,也不会拦截其内置工具。
  • Skills 是 Claude 在任务匹配时加载的说明和文件。它们改变的是 Claude 知道什么,而不是 Claude Code 做什么。

一个粗略的判断标准:如果你希望 Claude 知道某些新东西或能够做某些新事情,就用 skill 或 MCP 服务器;如果你希望 Claude Code 本身看起来或表现得不一样,就写一个插件。

Claude Code 插件安全吗?

插件能做你在终端里能做的任何事,所以安装插件时要像安装任何开发者工具一样谨慎。以下三个习惯可以把风险降到很低:

  1. 阅读验证输出。 claude plugin validate <dir> 会为模块输出一行 hooks: 和一行 calls:。如果一个状态栏插件列出了 $.http.fetch 或 $.fs.write,就值得仔细看一看。
  2. 查看权限标签。 ClaudeMods 上每个插件页面都会把这些调用转换成易懂的标签,例如“执行命令”或“拦截工具调用”,并用一句话说明插件为什么需要这项权限。
  3. 知道如何关闭。 /plugin disable <name> 可以关闭单个插件。claude --safe-mode 会启动一个停用所有插件的会话。在设置中写入 "disableAllHooks": true 则会让插件保持关闭。

组织还可以采取更严格的措施。管理员可以只允许托管插件、禁止通过 --plugin-dir 侧载,并让一个经过审批的防护插件排在用户安装的所有插件之前运行。详情请参阅 插件管理员文档。

需要哪个版本的 Claude Code?

运行 claude --version。终端需要 2.1.287 或更高版本。桌面应用自带一份 Claude Code,从 2.1.286 起即可使用插件。本站每个插件都标注了最近一次测试所用的版本;撰写本文时,这个版本是 2.1.291。

动手做一个小插件,看看它如何运行

三个文件就够了。创建如下目录结构:

hello-status/
├── .claude-plugin/
│   └── plugin.json
└── hooks/
    ├── hooks.json
    └── register.js

.claude-plugin/plugin.json:

{
  "name": "hello-status",
  "version": "0.1.0",
  "description": "Writes a fixed message to the Claude Code status line",
  "author": { "name": "Your Name" }
}

hooks/hooks.json 中写入前面展示过的 modules 键,指向 ./register.js。然后是 hooks/register.js:

export function register(on) {
  on('session.start', async ($, e, next) => {
    const started = await next(e)
    $.ui.status('hello from my first mod')
    return started
  })
}

运行之前先检查一下:

claude plugin validate ./hello-status

在 Claude Code 2.1.291 上,它会输出:

  ❯ ./register.js hooks: session.start
  ❯ ./register.js calls: $.ui.status

✔ Validation passed

现在启动一个只在本次运行中加载该插件的会话:

claude --plugin-dir ./hello-status

状态栏会显示你的消息。编辑 register.js 并保存,Claude Code 会自动重新加载模块,无需重启。该插件以 hello-status@inline 的身份加载,退出后即消失。插件教程 介绍了测试与发布的方法。

去哪里找插件?

插件通过 plugin 市场分发,市场就是包含 marketplace.json 的 Git 仓库或 URL。ClaudeMods 维护着一个这样的市场,插件目录中的每个插件都有专属页面,包含演示录屏、安装命令、可配置选项、实现功能的代码以及它所使用的权限。每个插件在页面上线前,都会在真实的 Claude Code 版本上经过验证、测试和录制。

准备好添加一个了吗?如何安装 Claude Code 插件介绍了所有安装方式,以及更新和删除的方法。

常见问题

插件(mod)和 plugin 是一回事吗?
mod 是 plugin 的一种。任何在 hooks/hooks.json 中带有 modules 键的 plugin 都是 mod。它的安装、更新和删除方式与其他 plugin 完全相同,使用的都是 /plugin 和 claude plugin 命令。
编写插件需要 Node.js 或构建步骤吗?
不需要。Claude Code 会直接加载 .js 和 .ts 格式的 hooks 模块,所以一个插件就是文件夹里的普通文件,不涉及 Node.js、npm 或打包工具。
插件可以调用模型吗?
可以,通过 $.model.complete 及相关调用实现。claude plugin validate 会列出这些调用,因此你在安装前就能看出某个插件是否会消耗 token。
插件在 claude -p 和 VS Code 扩展中能用吗?
插件的 hooks 在这些环境中照常运行,所以像命令拦截器这样的防护依然有效。但它们绘制的内容不会显示,因为只有终端和桌面应用的 Code 标签页会渲染插件界面。
如何快速关闭所有插件?
用 claude --safe-mode 启动 Claude Code,即可在该会话中停用所有插件;或者在设置中写入 "disableAllHooks": true,让它们保持关闭。

# 本指南提到的插件

提示框上方的 Git 分支 在 Claude Code 中运行

提示框上方的 Git 分支

在 Claude Code 输入框上方用一行横条显示当前 git 分支、已修改文件数和领先/落后状态。

  • 输入框上方
  • 执行命令
  • 拦截工具调用
  • 修改界面

已在 v2.1.291 实测

上下文仪表 在 Claude Code 中运行

上下文仪表

在状态栏显示上下文窗口占用、5 小时与 7 天套餐用量和会话花费,并在接近上限时发出提醒。

  • 状态栏
  • 弹出通知
  • 修改界面

已在 v2.1.291 实测

危险命令拦截 在 Claude Code 中运行

危险命令拦截

在 rm -rf /、强推 main、DROP TABLE、curl | sh 等破坏性 Bash 命令执行前将其拒绝。

  • 弹出通知
  • 拦截工具调用
  • 修改界面

已在 v2.1.291 实测

完成提示 在 Claude Code 中运行

完成提示

Claude 较长的一轮结束时弹出「Done in 2m 14s」提示并播放短促提示音,还可选发送桌面通知。

  • 弹出通知
  • 执行命令
  • 修改界面
  • 播放声音

已在 v2.1.291 实测

工具调用计数器 在 Claude Code 中运行

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.291 实测