插件
本文你会学到:
- 🎯 什么是插件,以及它和「独立配置」的区别
- 🔧 如何安装、启用、禁用和卸载插件
- 📦 插件市场的概念和工作原理(官方市场 + 第三方市场 + 演示市场)
- ⚙️ 如何从零开发一个插件(含目录结构和 manifest 配置)
- 🧩 如何给插件添加组件(Hook、MCP、LSP、监视器、默认设置)
- 🚀 如何发布到官方市场,以及从独立配置迁移到插件
- 🔧 故障排除:常见插件问题的诊断与解决
- 🏷️ 插件的命名空间机制,以及为什么要做命名隔离
🔌 什么是插件¶
想象一下你的手机:出厂时系统功能有限,但通过应用商店安装 App 后,它能变成导航仪、支付工具、社交平台。Claude Code 的插件系统做的就是类似的事(v2.0.12 发布) —— 让你把 Skills、Hooks、MCP 服务器、LSP 服务器 等扩展功能打包成一个可分发、可版本管理的「扩展包」,一键安装到 Claude Code 中。
💡 简单来说:Plugin(插件)就是一个自包含的目录,里面装着各种扩展组件,附带一份描述文件(manifest)告诉 Claude Code 怎么加载它们。
插件能装什么¶
一个插件可以包含以下任意组合的组件:
| 组件 | 存放位置 | 作用 |
|---|---|---|
Skills |
skills/ 目录 |
给 Claude 新增可调用的技能(自动或手动触发) |
Commands |
commands/ 目录 |
斜杠命令(遗留方式,新插件推荐用 skills/) |
Agents |
agents/ 目录 |
专用的子代理(Subagent),Claude 会根据任务自动调用 |
Hooks |
hooks/hooks.json |
事件处理器,在特定生命周期事件触发时自动执行 |
MCP 服务器 |
.mcp.json |
MCP 服务器配置,连接外部工具和服务 |
LSP 服务器 |
.lsp.json |
语言服务器配置,为 Claude 提供实时代码智能 |
| 可执行文件 | bin/ 目录 |
添加到 Bash 工具 PATH 的可执行脚本 |
| 输出风格 | output-styles/ 目录 |
自定义 Claude 的回复风格 |
插件 vs 独立配置¶
你可能会问:这些组件我也可以直接放在项目的 .claude/ 目录下,为什么要打包成插件?两者的区别如下:
| 对比维度 | 独立配置(.claude/) |
插件(Plugin) |
|---|---|---|
| 适用范围 | 仅当前项目 | 可跨项目复用 |
| 分发方式 | 手动复制文件 | 通过市场一键安装 |
| 命名 | /hello(短名) |
/my-plugin:hello(带命名空间前缀) |
| 版本管理 | 无 | 支持 Semantic Versioning |
| 团队共享 | 通过 Git 仓库共享 | 通过插件市场分发 |
| 更新方式 | 手动同步 | 自动更新 |
📌 选择建议:个人快速实验用独立配置;需要分享给团队、社区,或者要在多个项目间复用,就用插件。
📥 安装与管理插件¶
插件的安装范围(Scope)¶
安装插件时,Claude Code 让你选择一个**安装范围**,决定插件在哪些地方生效、谁能使用:
| 范围 | 配置文件 | 典型场景 |
|---|---|---|
user(默认) |
~/.claude/settings.json |
个人插件,所有项目通用 |
project |
.claude/settings.json |
团队插件,通过 Git 共享给协作者 |
local |
.claude/settings.local.json |
项目专属但不上传 Git |
managed |
托管设置 | 管理员统一部署,只读 |
安装插件¶
从市场安装插件最简单的方式:
你也可以在交互界面操作:运行 /plugin,进入 Discover 标签页,选中插件后选择安装范围。
Installed 标签页改进(v2.1.110 改进):Installed 视图现在会将需要关注的项和收藏项置顶,禁用的插件折叠隐藏。按 f 键可以收藏选中的插件,方便你快速找到常用的插件。
管理已安装的插件¶
会话中热重载¶
安装、启用或禁用插件后,不需要重启 Claude Code。运行以下命令即可让所有改动立即生效(v2.1.69 新增 /reload-plugins 命令):
Claude Code 会重新加载所有活跃的插件,并显示插件、Skills、Agents、Hooks、MCP 服务器和 LSP 服务器的数量统计。
清理孤立依赖¶
随着插件的安装和卸载,node_modules 中可能积累不再被任何插件使用的孤立依赖。v2.1.121 新增了清理命令:
当另一个插件的版本约束导致某个插件自动更新并被跳过时,/doctor 和 /plugin Errors 标签页会显示提示(v2.1.118 新增),方便你发现版本约束冲突。
插件错误处理与诊断¶
当插件依赖不满足时,Claude Code 会进行智能降级处理(v2.1.111 改进):依赖错误现在区分冲突、无效和过于复杂的版本要求,给出更明确的错误提示。在 headless 模式下使用 --output-format stream-json 时,如果插件因依赖问题被降级,init 事件中会包含 plugin_errors 字段(v2.1.111 新增),方便自动化脚本检测和告警。
从 v2.1.113 起,plugin install 在依赖版本与已安装插件冲突时不再静默成功,而是**明确报告 range-conflict**——之前这种情况可能导致插件以错误版本被加载,行为难以排查。
🏪 插件市场¶
🔌 什么是插件市场¶
如果说插件是「App」,那插件市场就是「应用商店」。它本质上是一个**插件目录清单**,描述了有哪些插件可用、从哪里下载。使用插件市场的过程分两步:
- 添加市场 —— 类似于「在手机上添加一个应用商店的源」
- 从市场安装插件 —— 类似于「从商店里下载一个 App」
官方市场¶
Anthropic 维护了一个官方市场(名称为 claude-plugins-official),它在 Claude Code 启动时自动可用。你可以直接运行 /plugin 进入 Discover 标签页浏览,或者访问 claude.com/plugins 查看在线目录。
官方市场包含以下类别的插件:
代码智能(Code Intelligence)¶
这些插件为 Claude 接入语言服务器(Language Server),让它获得和 VS Code 一样的代码分析能力。安装插件并确保语言服务器二进制可用后,Claude 获得两项功能:
- 自动诊断:Claude 每次文件编辑后,语言服务器自动分析变更并报告类型错误、缺失导入和语法问题。如果引入了错误,Claude 会在同一轮中修复。当"发现诊断"指示器出现时,按 Ctrl+O 可内联查看诊断
- 代码导航:Claude 可以跳转到定义、查找引用、获取悬停类型信息、列出符号、查找实现和追踪调用层次结构——比基于 grep 的搜索更精确
| 语言 | 插件名 | 需要安装的二进制 |
|---|---|---|
| Java | jdtls-lsp |
jdtls |
| Python | pyright-lsp |
pyright-langserver |
| TypeScript | typescript-lsp |
typescript-language-server |
| Go | gopls-lsp |
gopls |
| Rust | rust-analyzer-lsp |
rust-analyzer |
| C/C++ | clangd-lsp |
clangd |
| Kotlin | kotlin-lsp |
kotlin-language-server |
| C# | csharp-lsp |
csharp-ls |
| PHP | php-lsp |
intelephense |
| Lua | lua-lsp |
lua-language-server |
| Swift | swift-lsp |
sourcekit-lsp |
⚠️ 安装 LSP 插件前,必须先确保对应的语言服务器二进制已安装并可用。以 TypeScript 为例:
输出风格¶
自定义 Claude 的响应方式:
explanatory-output-style:在回复中加入关于实现选择的教育性见解learning-output-style:交互式学习模式,帮助技能构建
外部集成¶
打包了预配置的 MCP 服务器,让 Claude 能直接连接外部服务:
- 源码管理:
github、gitlab - 项目管理:
atlassian(Jira/Confluence)、asana、linear、notion - 设计:
figma - 基础设施:
vercel、firebase、supabase - 通讯:
slack - 监控:
sentry
开发工作流¶
为常见开发任务提供命令和代理:
commit-commands:Git 提交工作流(commit、push、创建 PR)pr-review-toolkit:PR 审查专用代理agent-sdk-dev:使用 Claude Agent SDK 构建的工具plugin-dev:插件开发工具包
添加第三方市场¶
除了官方市场,任何人都可以创建和发布自己的市场。添加方式如下:
基于 Git 的市场和基于 URL 的市场有一个重要区别:Git 市场会完整克隆仓库,插件中的相对路径(如引用仓库内的脚本文件)可以正常工作;而基于远程 URL 的市场只下载 marketplace.json 文件本身,如果插件定义中使用了相对路径,安装时可能出现「路径未找到」错误。遇到这种情况,建议改用 Git 方式添加。
💡 快捷方式:/plugin market 可以代替 /plugin marketplace,rm 可以代替 remove。
演示市场(anthropics/claude-code)¶
Anthropic 还维护一个演示市场(claude-code-plugins),包含展示插件系统功能的示例插件。需要手动添加:
管理市场¶
注意:移除市场时会**级联卸载**你从该市场安装的所有插件。如果你只是想停止使用某个市场但保留已安装的插件,建议先改为手动更新,再手动管理各插件。
你也可以通过交互式界面管理市场:运行 /plugin,进入 Marketplaces 标签页,可以查看市场列表、添加新市场、更新市场数据和删除市场。
自动更新¶
官方市场默认开启自动更新。你也可以为第三方市场手动开启:运行 /plugin -> Marketplaces -> 选择市场 -> 启用自动更新。
启动时如果检测到插件有更新,Claude Code 会提示你运行 /reload-plugins 来加载新版本。
通过环境变量精细控制自动更新行为:
插件安全最佳实践¶
插件和市场是高度受信任的组件 —— 它们以你的用户权限运行,可以执行任意代码。在安装前请牢记以下几点:
- 审查插件来源:只从你信任的开发者或组织安装插件。检查插件的
homepage或repository字段,了解其代码来源 - 检查市场配置:添加第三方市场前,确认市场维护者的可信度。市场本质上只是一个插件列表,里面的插件来自不同作者
- 关注安装范围:在
project范围安装的插件会通过 Git 共享给所有协作者。安装前考虑团队成员是否都需要这个插件 - 利用托管限制:企业环境可以通过托管市场限制控制用户允许添加的市场,防止安装未经审核的插件
- 及时更新:保持插件和市场更新,以获取安全修复
安全警告
Anthropic 不控制插件中包含的 MCP 服务器、脚本或其他软件,也无法验证它们是否按预期工作。安装前请务必检查每个插件的主页以获取更多信息。
团队市场配置¶
团队管理员可以在项目的 .claude/settings.json 中预配置市场,让团队成员在信任项目文件夹时自动提示安装:
extraKnownMarketplaces 支持的 source 类型除了 github(owner/repo 格式),还可以是 git(任意 Git URL)或 url(远程 marketplace.json URL)。团队成员信任项目文件夹后,Claude Code 会检测到这些预配置的市场并提示安装。
如果团队希望某些插件在所有成员的项目中默认启用(不依赖成员手动操作),可以在同一个 settings.json 中搭配 enabledPlugins 使用,实现市场和插件的自动化配置。
🛠️ 插件开发基础¶
创建第一个插件¶
让我们从最简单的情况开始 —— 创建一个只有一个 Skill 的插件。
创建目录结构
编写 plugin.json(清单文件)
编写 SKILL.md
💡 $ARGUMENTS 是一个特殊变量,用于捕获用户调用技能时传入的参数。
本地测试
💡 --plugin-dir 加载的本地插件与已安装的市场插件同名时,本地副本在该会话中优先(托管设置强制启用的市场插件除外)。修改插件后运行 /reload-plugins 即可热重载。
完整的插件目录结构¶
当你的插件包含更多组件时,目录结构会更丰富:
⚠️ 常见错误:把组件目录(如 commands/、agents/)放到 .claude-plugin/ 里面。正确做法是放在插件根目录,只有 plugin.json 属于 .claude-plugin/。
plugin.json 详解¶
清单文件是可选的 —— 如果不提供,Claude Code 会自动从默认目录发现组件,并用目录名作为插件名。但推荐总是提供一份 plugin.json,因为它携带了版本号、描述等元数据。
💡 commands、agents、skills 等路径字段可以**替换**默认目录位置。如果指定了这些字段,对应的默认目录就不会被扫描。想同时保留默认目录并添加额外路径,可以用数组形式:"commands": ["./commands/", "./extras/deploy.md"]。
当 skills 使用 "skills": ["./"] 声明时,插件会扫描指定目录下的所有 Skill。此时 Skill 的调用名称取自 SKILL.md frontmatter 中的 name 字段而非目录名(v2.1.94 改进),这确保了 Skill 名称在不同安装方式下保持一致。
除了上述字段,plugin.json 还支持 monitors 键(2.1.105 新增):
monitors 用于声明插件的后台监控脚本,Claude Code 会在插件激活时定期运行这些脚本,并将输出作为上下文注入对话。适合需要持续跟踪外部状态(如日志文件、服务健康)的插件。
两个重要的环境变量¶
Claude Code 为插件提供了两个特殊的环境变量,在 Hook 命令、MCP/LSP 配置、Skill 和 Agent 内容中都可以使用:
| 变量 | 含义 | 用途 |
|---|---|---|
${CLAUDE_PLUGIN_ROOT} |
插件安装目录的绝对路径 | 引用插件自带的脚本、配置文件 |
${CLAUDE_PLUGIN_DATA} |
插件持久化数据目录 | 存放 node_modules、缓存、生成文件等 |
⚠️ ${CLAUDE_PLUGIN_ROOT} 在插件更新后会变化,不要在这里存放需要持久化的数据。需要跨版本保留的文件请用 ${CLAUDE_PLUGIN_DATA}。
给插件添加组件¶
给插件添加 Hook¶
在 hooks/hooks.json 中定义事件处理器:
这会在 Claude 每次使用 Write 或 Edit 工具后自动运行格式化脚本。
给插件添加 MCP 服务器¶
在 .mcp.json 中配置 MCP 服务器:
给插件添加 LSP 服务器¶
对于官方市场没有覆盖的语言,可以通过 .lsp.json 添加自定义语言服务器配置:
| .lsp.json | |
|---|---|
⚠️ 安装插件的用户需要在其机器上安装对应的语言服务器二进制文件。
给插件添加后台监视器¶
后台监视器让插件在后台持续监控日志、文件或外部状态,当事件到达时通知 Claude。Claude Code 在插件激活时自动启动每个监视器。
| monitors/monitors.json | |
|---|---|
command 的每行 stdout 输出在会话期间作为通知传递给 Claude。
插件默认设置¶
在插件根目录放置 settings.json 可以在插件启用时应用默认配置。目前支持以下键:
agent:指定插件中某个 agent 作为主线程subagentStatusLine:控制子代理的状态行显示内容(如进度提示、任务摘要),让用户在主会话中能直观看到子代理的工作状态
这会激活插件 agents/ 目录中定义的 security-reviewer agent 作为主线程,应用其系统提示、工具限制和模型。settings.json 中的设置优先于 plugin.json 中声明的 settings。
发布到官方市场¶
当你的插件足够成熟,想分享给所有 Claude Code 用户时,可以通过以下入口提交:
- Claude.ai:claude.ai/settings/plugins/submit
- Console:platform.claude.com/plugins/submit
发布前的准备工作:
- 完善
plugin.json:确保name、version、description、repository和license字段齐全。repository应指向公开可访问的代码仓库,方便审核和用户审查源码 - 准备
README.md:提供插件功能说明、安装步骤、配置方法和使用示例 - 测试覆盖:使用
claude --plugin-dir ./my-plugin本地验证所有组件正常工作 - 版本号规范:遵循 Semantic Versioning(如
1.0.0),后续更新递增版本号
提交后 Anthropic 会审核你的插件。审核通过后,插件会出现在官方市场中,所有用户都可以通过 /plugin install <name>@claude-plugins-official 安装。官方市场的插件默认开启自动更新,用户无需手动操作即可获取你发布的后续版本。
如果你想独立分发插件(不通过官方市场),可以创建自己的市场并与用户共享。
从独立配置迁移到插件¶
如果你已经在 .claude/ 目录下积累了 Skills 或 Hooks,可以轻松迁移到插件:
独立配置(.claude/) |
插件 |
|---|---|
.claude/commands/ |
plugin-name/commands/ |
.claude/skills/ |
plugin-name/skills/ |
settings.json 中的 Hooks |
hooks/hooks.json |
| 只在当前项目可用 | 通过市场安装,跨项目复用 |
📛 插件的命名空间¶
为什么需要命名空间¶
Claude Code 可能同时安装多个插件,如果两个插件都定义了一个叫 deploy 的 Skill,该怎么区分?答案就是命名空间。
每个插件的组件都会自动加上**插件名前缀**,格式为 插件名:组件名。例如:
- 插件
team-a-tools中的deploy技能 ->/team-a-tools:deploy - 插件
team-b-tools中的deploy技能 ->/team-b-tools:deploy
这样即使两个插件有同名组件也不会冲突。这也是为什么插件名必须使用 kebab-case(如 my-plugin)—— 它会作为命名空间的前缀。
命名空间的具体体现¶
| 场景 | 独立配置 | 插件 |
|---|---|---|
| 调用技能 | /hello |
/my-plugin:hello |
| 查看代理 | /agents 中显示 hello |
/agents 中显示 my-plugin:hello |
| 命名冲突 | 后加载的覆盖先加载的 | 通过前缀区分,永不冲突 |
📌 总结:命名空间就是给每个插件的组件加了一个「姓氏」,确保全局唯一。虽然名字变长了,但换来的是多插件共存的稳定性 —— 这和 Java 的包名、Docker 的容器名是同样的设计思路。
🔧 故障排除¶
/plugin 命令无法识别¶
如果 /plugin 命令不出现:
- 检查版本:运行
claude --version确认版本支持插件 - 更新 Claude Code:
npm update -g @anthropic-ai/claude-code或brew upgrade claude-code - 重启 Claude Code:更新后重启终端
常见问题¶
| 问题 | 解决方案 |
|---|---|
| 市场未加载 | 检查 URL 可访问且 .claude-plugin/marketplace.json 存在 |
| 插件安装失败 | 确认源 URL 可访问,仓库公开或你有访问权限 |
| 安装后找不到文件 | 插件被复制到缓存,引用插件目录外的路径无效 |
| Skills 未出现 | 清除缓存 rm -rf ~/.claude/plugins/cache,重启后重装 |
Executable not found in $PATH |
安装 LSP 插件前需先安装对应的语言服务器二进制 |
代码智能常见问题¶
- 语言服务器未启动:验证二进制已安装且在
$PATH中,检查/plugin错误标签页 - 高内存使用:
rust-analyzer、pyright等在大型项目上可能消耗大量内存,可临时禁用并改用内置搜索工具 - monorepo 误报诊断:工作区配置不正确时,语言服务器可能报告内部包的未解析导入错误——这不影响 Claude 编辑代码的能力