插件参考
插件清单 plugin.json 的全部字段、路径规则、组件路径形式、userConfig 与 channels 模式、环境变量、标准目录布局,以及与市场条目的关系;附 marketplace.json 和 claude plugin 命令速查。
插件清单是插件 .claude-plugin/ 目录里的 plugin.json 文件。它携带插件的元数据,以及 Claude Code 向用户提示填写的 userConfig 值,还声明你内联定义或放在默认位置之外的任何组件。本参考面向插件作者,以及把组件字段放进市场条目的市场所有者。学习构建插件见「创建插件」;各组件在运行时做什么见「插件组件」。下面的版本号要求以官方为准。
清单文件
清单是可选的。没有它,Claude Code 会加载在标准布局里找到的组件;此时插件名取自市场条目,或在你用 --plugin-dir 加载插件时取自目录名。当你需要元数据、默认目录之外的组件、userConfig 或内联的组件定义时,才写清单。
把清单保存为插件根目录下的 .claude-plugin/plugin.json。其他所有插件文件放在插件根目录,而不是 .claude-plugin/ 里,包括 skills/、commands/ 和 hooks/。下面的例子设置了字段表里的大部分键,在包含每个被引用路径的插件目录里能通过校验:
{
"name": "deploy-tools",
"displayName": "Deploy Tools",
"version": "1.2.0",
"description": "Deployment commands, a review agent, and a status monitor",
"author": {
"name": "Example Team",
"email": "dev@example.com",
"url": "https://example.com"
},
"homepage": "https://example.com/docs/deploy-tools",
"repository": "https://github.com/example/deploy-tools",
"license": "MIT",
"keywords": ["deployment", "ci"],
"defaultEnabled": true,
"dependencies": ["secrets-vault"],
"metadata": { "catalogId": "cat-123" },
"skills": ["./extra-skills/"],
"commands": {
"status": {
"source": "./commands/status.md",
"description": "Show the current deployment status"
},
"about": {
"content": "Explain what the deploy-tools plugin provides.",
"description": "Describe this plugin"
}
},
"agents": ["./agents/reviewer.md"],
"hooks": "./config/extra-hooks.json",
"mcpServers": {
"deploy-api": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"]
}
},
"lspServers": "./.lsp.json",
"outputStyles": "./styles/",
"experimental": {
"themes": "./themes/",
"monitors": "./config/monitors.json"
},
"userConfig": {
"api_token": {
"type": "string",
"title": "API token",
"description": "Token for the deployment API",
"sensitive": true
}
}
}无法识别的字段
无法识别的顶层键会被剥离,而 userConfig 选项、channels 条目、lspServers 配置或 monitors 条目里无法识别的键会被拒绝:
- 顶层字段:该字段被剥离,插件仍然加载;
claude plugin validate把每个无法识别的顶层字段报告为警告。 - 严格对象:
userConfig选项、channels条目、lspServers配置和monitors条目是严格的;其中的未知键是错误,插件不加载。
校验清单
claude plugin validate 是对清单的权威检查,在 shell 里对插件目录运行:
claude plugin validate ./my-plugin该命令报告以下结果之一:
Validation passed:清单能加载。Validation passed with warnings:清单能加载,但校验器发现了需要修复的东西,例如 Claude Code 会剥离的未知顶层字段、不是 kebab-case 的name,或缺失的version、description或author。在 CI 里传--strict把警告变成失败。Validation failed:清单有类型不匹配、缺失或逃出插件根目录的路径,或userConfig选项、channels条目、lspServers配置、monitors条目里有未知键。Claude Code 加载该插件时会报告同样的问题。
该命令还会检查插件在 .mcp.json 里、在 mcpServers 所指名的 .json 文件里或在 plugin.json 里内联声明的每个 MCP 服务器条目(这些 MCP 检查需要 Claude Code v2.1.281 或更高):
- 错误:Claude Code 加载插件时会丢弃的条目、引用了清单未声明选项的
${user_config.KEY},以及不是有效绝对 URL 的远程url。 - 警告:指向非环回主机的
http://或ws://URL,以及看起来像字面凭据的头值。
字段
下表列出 plugin.json 的顶层键。name 是唯一必需的键。
| 字段 | 类型 | 说明 |
|---|---|---|
$schema | 字符串 | 用于编辑器自动补全的 JSON Schema URL;Claude Code 在加载时忽略它 |
name | 字符串 | 插件标识,必需。使用 kebab-case;每个组件都以它为命名空间 |
displayName | 字符串 | 在界面中代替 name 显示的名称 |
version | 字符串 | 版本字符串。设置它会让用户保持在该版本,直到你改变它 |
description | 字符串 | 插件提供什么的简短说明 |
author | 对象 | name(必需),外加可选的 email 和 url |
homepage | 字符串 | 文档 URL;必须能解析为 URL,否则插件加载失败 |
repository | 字符串 | 源代码仓库 URL;不做校验 |
license | 字符串 | SPDX 标识符,如 MIT 或 Apache-2.0 |
keywords | 字符串数组 | 发现用的标签 |
metadata | 对象 | 供你自己数据用的自由格式对象;Claude Code 不读取它 |
defaultEnabled | 布尔 | 用户没有设置时插件是否默认启用;默认 true |
dependencies | 字符串或对象数组 | 必须启用才能让本插件工作的插件 |
settings | 对象 | 插件启用期间 Claude Code 应用的设置;只有 agent 和 subagentStatusLine 生效 |
userConfig | 对象 | 插件启用时 Claude Code 向用户提示填写的值 |
types | 路径 | 声明 mod 的 $.state 值和 $ 名词的 .d.ts 文件 |
channels | 对象数组 | 插件提供的消息 channel,每个绑定到它的某个 MCP 服务器 |
skills | 路径或路径数组 | 扫描 skills 的目录:每个目录里是 <name>/SKILL.md 文件夹,或一个直接含 SKILL.md 的文件夹;"." 指插件根目录;加到默认的 skills/ 扫描之上 |
commands | 路径、路径数组或对象 | 扁平的 .md 命令文件、它们的目录,或命令名到 source 或 content 的对象映射;替换默认的 commands/ 扫描 |
agents | 路径或路径数组 | 智能体 .md 文件;不接受目录;替换默认的 agents/ 扫描 |
hooks | 路径、对象或两者的数组 | .json hook 文件或内联 hook 配置;与 hooks/hooks.json 一起加载 |
mcpServers | 路径、对象或两者的数组 | .json MCP 配置文件、.mcpb 或 .dxt 包,或按名称为键的内联服务器配置;与 .mcp.json 一起加载,后声明的同名服务器替换先声明的 |
lspServers | 路径、对象或两者的数组 | .json LSP 配置文件或按名称为键的内联服务器配置;与 .lsp.json 一起加载 |
outputStyles | 路径或路径数组 | 输出样式文件或目录;替换默认的 output-styles/ 扫描 |
workflows | 路径或路径数组 | 工作流 .js 文件或目录;替换默认的 workflows/ 扫描 |
experimental | 对象 | themes、monitors 和 evals 的容器,其清单形状可能仍会改变 |
experimental.themes | 路径或路径数组 | 主题文件或目录;替换默认的 themes/ 扫描;顶层的 themes 键仍会加载,但 claude plugin validate 会警告 |
experimental.monitors | 路径或内联数组 | 保存 monitors 数组的 .json 文件,或数组本身;默认 monitors/monitors.json;顶层 monitors 键仍会加载并带警告;monitors 只在交互会话里运行,在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上不运行 |
experimental.evals | 路径或路径数组 | 当插件的评测用例不在默认的 evals/ 时,保存它们的目录;claude plugin eval --eval-dir 会覆盖它 |
类型列里,「路径」是相对插件根目录的字符串,如 "./custom/commands"。
name
插件标识。它必须非空,不含空格、@、:、路径分隔符、控制字符或双向格式化字符;使用 kebab-case。Claude Code 把每个组件都放在它的命名空间下,所以插件 deploy-tools 里的智能体 reviewer 显示为 deploy-tools:reviewer。
claude plugin validate 还检查名称不能冒充 Anthropic 自己的插件。该检查忽略大小写,并把任何一串分隔符当作一个:
| 名称 | 结果 |
|---|---|
以 claude-、anthropic-、anthropics- 或 cc-plugin- 开头 | 错误 |
是 claude、anthropic、anthropics、claude-code 或 claude-mods | 错误 |
把 official 放在 claude 或 anthropic 旁边,如 official-claude-tools | 错误 |
在其他位置把 claude、anthropic 或 anthropics 作为完整单词,如 mcp-for-claude | 警告 |
错误信息是 Plugin name "<name>" is reserved: it passes as one of Anthropic's own,警告是 Plugin name "<name>" reads as one of Anthropic's own。claude plugin init 和 claude plugin tag 拒绝引发错误的名称;只有这些命令检查名称,Claude Code 仍会安装并加载它们拒绝的名称的插件。
displayName
在界面中代替 name 显示的名称。它可以包含空格和任何大小写,不用于命名空间或查找。对从市场安装的插件,市场条目上的 displayName 优先于这个值。
version
版本字符串,不按 semver 检查。设置它会把插件固定在该版本,直到你改变它;见插件加载页的「版本与更新」。带 command 来源的插件、来自 claude.ai 上托管市场的插件,以及从作为本地目录添加的市场原地加载的插件,不受这个字段固定。
metadata
供你自己数据用的自由格式对象,例如目录或授权字段。Claude Code 不读取它(需要 Claude Code v2.1.222 或更高)。
defaultEnabled
用户没有在 enabledPlugins 里设置它时,插件是否默认启用,默认 true。被已启用插件依赖的插件无论如何都默认启用。市场条目里的同名字段覆盖这个字段。用户的 enabledPlugins 条目一旦写入,就会跨插件更新持久保留,所以在之后的发布里改变 defaultEnabled 不会改变现有用户的设置。
dependencies
必须启用才能让本插件工作的插件。每个条目是 "name"、"name@marketplace" 或 { "name": "...", "marketplace": "...", "version": "..." };裸名称针对本插件自己的市场解析。见「插件依赖」。
settings
插件启用期间 Claude Code 应用的设置。只有 agent 和 subagentStatusLine 生效,其他键在加载时被丢弃。插件根目录的 settings.json 优先于这个键;见插件组件页的「默认设置」。
组件路径形式
每个组件键都接受相对插件根目录的路径。hooks、mcpServers、lspServers 和 experimental.monitors 也接受内联配置,commands 还接受对象映射,mcpServers 还接受 MCP 包路径和 URL。
仅路径的字段
agents、skills、outputStyles、workflows 和 experimental.themes 接受一个路径或路径数组。agents 的条目必须是 .md 文件,skills 的条目必须是目录;其他三个接受目录或文件。
{
"agents": ["./custom-agents/reviewer.md", "./custom-agents/tester.md"],
"skills": ["./extra-skills/", "."],
"outputStyles": "./styles/"
}commands
commands 接受路径、路径数组或对象映射。路径指名一个扁平的 .md 命令文件或目录。在对象映射里,每个键在插件前缀之后成为命令名:例如插件 deploy-tools 里的 "about" 运行为 /deploy-tools:about。每个值恰好设置 source 或 content 之一,两者都设或都不设的条目校验失败。该表里的其他字段是可选的:
| 字段 | 类型 | 说明 |
|---|---|---|
source | 字符串 | 命令的 Markdown 文件路径,相对插件根目录 |
content | 字符串 | 命令正文的内联 Markdown,代替 source |
description | 字符串 | 为命令显示的描述 |
argumentHint | 字符串 | 命令名之后显示的参数提示,如 [file] |
model | 字符串 | 命令的默认模型 |
allowedTools | 字符串数组 | 命令无需提示就能使用的工具 |
这个映射从文件声明一个命令,并从内联内容声明另一个:
{
"commands": {
"status": { "source": "./commands/status.md", "argumentHint": "[env]" },
"about": { "content": "Explain what this plugin provides." }
}
}hooks
hooks 接受 .json 文件路径、与 settings.json 里 hooks 形状相同的内联 hooks 对象,或混合两者的数组。hook 事件和处理器字段见 hooks 参考。Claude Code 把你声明的内容与 hooks/hooks.json(存在时)合并。
{
"hooks": [
"./config/extra-hooks.json",
{
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{ "type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/format.sh" }
]
}
]
}
]
}mcpServers
mcpServers 接受 .json 文件路径、MCP 包路径或 URL、内联映射,或混合它们的数组。服务器配置字段见 MCP 页的插件提供的 MCP 服务器。Claude Code 先加载插件根目录的 .mcp.json,再按顺序加载每种声明的形式;后声明的同名服务器替换先声明的。mcpServers 值取以下形状之一:
| 形状 | 示例值 | Claude Code 做什么 |
|---|---|---|
.json 文件路径 | "./mcp/servers.json" | 把文件读作 mcpServers 映射 |
| MCP 包路径 | "./bundle.mcpb" | 把 .mcpb 或 .dxt 包解压到插件根目录下的 .mcpb-cache/,并读取其服务器配置 |
| MCP 包 URL | "https://example.com/server.mcpb" | 把包下载到 .mcpb-cache/,再读取 |
| 内联映射 | { "deploy-api": { "command": "node", "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"] } } | 把映射作为按名称为键的服务器配置 |
包路径或 URL 必须以 .mcpb 或 .dxt 结尾,任何其他扩展名校验失败。
lspServers
lspServers 接受 .json 文件路径、服务器名到配置的内联映射,或两者之一的数组。Claude Code 先加载插件根目录的 .lsp.json,再按顺序加载每个声明的配置;后声明的同名服务器替换先声明的。每个服务器配置是带这些字段的严格对象,未知键会校验失败:
| 字段 | 必需 | 说明 |
|---|---|---|
command | 是 | 语言服务器二进制;除非值以 / 开头,否则不含空格;参数放进 args |
extensionToLanguage | 是 | 文件扩展名到 LSP 语言 ID 的映射,至少一个条目;键以点开头,如 ".go" |
args | 否 | 传给服务器的参数 |
transport | 否 | 通信传输:stdio(默认)或 socket;Claude Code 接受 socket 但让每个服务器都走 stdio,所以 stdout 协议规则适用于所有服务器 |
env | 否 | 服务器进程的环境变量 |
initializationOptions | 否 | 在 initialize 请求里发送的选项 |
settings | 否 | 由 workspace/didChangeConfiguration 发送的设置 |
workspaceFolder | 否 | 服务器的工作区文件夹路径 |
startupTimeout | 否 | 等待启动的毫秒数,正整数 |
shutdownTimeout | 否 | 等待优雅关闭的毫秒数,正整数;超时后 Claude Code 终止服务器进程;未设置时没有超时 |
restartOnCrash | 否 | 服务器崩溃后是否重启,默认 true;设为 false 让崩溃的服务器保持停止 |
maxRestarts | 否 | 放弃之前的重启尝试次数,零或更多 |
diagnostics | 否 | 编辑后是否把诊断推入上下文,默认 true |
这个内联配置为 .go 文件运行 gopls:
{
"lspServers": {
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": { ".go": "go" }
}
}
}Anthropic 作为插件发布的语言服务器以及它们在运行时的行为,见「代码智能插件」。
monitors
experimental.monitors 接受 .json 文件路径或内联数组。省略该键时,如果 monitors/monitors.json 存在,Claude Code 就加载它。每个条目是带这些字段的严格对象:
| 字段 | 必需 | 说明 |
|---|---|---|
name | 是 | 插件内唯一的标识符 |
command | 是 | Claude Code 作为持久后台进程在会话工作目录里运行的 shell 命令 |
description | 是 | 在任务面板和通知摘要里显示的简短说明 |
when | 否 | 取 "always"(默认)时,monitor 在会话开始和插件重新加载时启动;取 "on-skill-invoke:<skill>" 时,在该 skill 第一次运行时启动 |
这个内联数组声明一个在 deploy skill 第一次运行时启动的 monitor:
{
"experimental": {
"monitors": [
{
"name": "deploy-status",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-deploy.sh",
"description": "Deployment status changes",
"when": "on-skill-invoke:deploy"
}
]
}
}monitor 的 command 不能引用 ${user_config.*},见下面「通过 shell 运行的字段」。
路径规则
清单里的每个组件路径都相对插件根目录,且必须以 ./ 开头;commands/foo.md 这样的路径校验失败。skills 和 mcpServers 各接受一种该规则之外的形式:
skills:也接受".";"."和"./"都表示插件根目录。(v2.1.221 之前,"."清单校验失败,所以插件必须在更早版本上加载时用"./"。)mcpServers:也接受https://包 URL。
包含与存在
每个组件路径都必须解析到插件根目录之内并且必须存在。claude plugin validate 检查每个组件键下的路径:
- 包含:解析到插件根目录之外的路径不会加载,
/plugin的 Errors 标签页显示<component> path escapes plugin directory: <path>。含..的路径是常见情形,claude plugin validate报告错误Path contains ".." which could be a path traversal attempt。 - 存在:不存在的路径不会加载,
/plugin的 Errors 标签页显示<component> path not found: <path>;claude plugin validate报告错误Path not found。
对 outputStyles、lspServers、monitors 和 themes 路径,claude plugin validate 的检查需要 Claude Code v2.1.283 或更高。
每个键如何与它的默认位置组合
每个组件键要么替换它的默认位置,要么加到它之上,要么与它合并:
- 替换默认:
commands、agents、outputStyles、workflows、experimental.themes、experimental.monitors。设置了commands时,默认的commands/目录不会被扫描;要保留默认并添加更多,显式列出它:"commands": ["./commands/", "./extras/"]。 - 加到默认之上:
skills。skills/目录仍会被扫描,列出的目录与它一起加载。 - 合并:
hooks、mcpServers、lspServers。默认文件先加载,清单声明的内容合并进去,如「组件路径形式」所述。
如果插件有 commands/ 这样的默认文件夹,同时又设置了替换它的清单键,Claude Code 加载清单路径而不是该文件夹;claude plugin list 和 /plugin 界面随后显示警告 Default <folder>/ folder is ignored because the manifest sets "<key>"。要避免该警告,把键设为该文件夹内的路径:"commands": ["./commands/deploy.md"] 指名默认文件夹里的文件,不产生警告。
用户配置
userConfig 声明插件启用时 Claude Code 向用户提示填写的值,使用户不必自己编辑 settings.json。键是由字母、数字和下划线组成的标识符,不能以数字开头。每个值是带这些字段的严格对象,未知键校验失败:
| 字段 | 必需 | 说明 |
|---|---|---|
type | 是 | string、number、boolean、directory 或 file 之一 |
title | 是 | 配置对话框里显示的标签 |
description | 是 | 显示在字段下方的帮助文字 |
required | 否 | 为 true 时,配置对话框不接受空值 |
default | 否 | 用户什么都不提供时使用的值:字符串、数字、布尔或字符串数组 |
options | 否 | 对 string,字段接受的值,在 /config 里显示为选择器(需要 Claude Code v2.1.271 或更高) |
multiple | 否 | 对 string,允许字符串数组 |
sensitive | 否 | 为 true 时,遮蔽输入,并把值存在安全存储里而不是 settings.json |
min / max | 否 | number 的边界 |
每个已启用插件的每个选项还会作为一行出现在 /config 面板里,sensitive 选项和 multiple 列表除外(/config 里的行需要 Claude Code v2.1.269 或更高)。这个 userConfig 声明一个端点和一个被遮蔽的令牌:
{
"userConfig": {
"api_endpoint": {
"type": "string",
"title": "API endpoint",
"description": "Your team's API endpoint"
},
"api_token": {
"type": "string",
"title": "API token",
"description": "API authentication token",
"sensitive": true
}
}
}把字段限制为固定选项
在 userConfig 字段上设置 options,让用户从固定列表里选择它的值。要把 tone 字段限制为三个选项,把它们列在 options 里并把 default 设为其中之一:
{
"userConfig": {
"tone": {
"type": "string",
"title": "Tone",
"description": "Voice for generated replies",
"options": ["neutral", "warm", "formal"],
"default": "neutral"
}
}
}如果你在任何字段上声明了 options,运行 v2.1.271 之前 Claude Code 版本的用户无法加载该插件。options 适用于既非 multiple 也非 sensitive 的 string 字段;把 default 设为列出的值之一,或设置 required: true 让用户必须选一个。每个选项是 1 到 64 个字符的纯标签,你在 shell 里运行的 claude plugin validate 会报告它拒绝的其他任何东西;options 违反这些规则的插件加载失败。
值存储在哪里
非敏感的值保存在用户 settings.json 的 pluginConfigs 下。敏感的值改为进入平台的安全凭据存储。设置参考页列出了从哪些设置文件读取 pluginConfigs。
引用已保存的值
在插件需要的地方用两种形式之一引用已保存的值:
${user_config.KEY}:在 MCP 服务器配置、LSP 服务器配置、exec 形式 hook 的args,以及 skill 和智能体内容里被替换;在 skill 和智能体内容里,只有非敏感的值被替换,敏感的值在那里变成占位符。CLAUDE_PLUGIN_OPTION_<KEY>:为每个选项导出给 hook 进程,<KEY>大写;shell 形式的 hook 为api_token读取$CLAUDE_PLUGIN_OPTION_API_TOKEN。
通过 shell 运行的字段
shell 形式的 hook 命令、monitor 命令和 MCP 的 headersHelper 拒绝 ${user_config.*}。在这些字段里引用它的组件会以错误失败而不是运行,因为该字段的值被传给 shell,shell 会重新解析被替换的值。下表展示值如何改为到达这些字段:
| 字段 | 值如何到达 |
|---|---|
| shell 形式的 hook 命令 | 用带 args 的 exec 形式,或从 hook 的环境读取 CLAUDE_PLUGIN_OPTION_<KEY> |
| monitor 命令 | 不通过 Claude Code;monitor 进程不接收 CLAUDE_PLUGIN_OPTION_<KEY>,所以 monitor 脚本必须自己获取该值 |
MCP headersHelper | 不通过 Claude Code;helper 的环境带有 CLAUDE_PLUGIN_ROOT、CLAUDE_CODE_MCP_SERVER_NAME 和 CLAUDE_CODE_MCP_SERVER_URL,但没有选项值,所以 helper 脚本必须自己获取该值 |
Channels
channels 声明插件提供的消息 channel,例如到聊天应用的桥。声明一个之后,插件启用时 Claude Code 可以提示填写该 channel 的配置。服务器如何注入消息见 Channels reference。每个条目是绑定到插件某个 MCP 服务器的严格对象,带这些字段:
| 字段 | 必需 | 说明 |
|---|---|---|
server | 是 | channel 所绑定的、本插件 mcpServers 里 MCP 服务器的键 |
displayName | 否 | 配置对话框标题里显示的名称,默认是服务器名 |
userConfig | 否 | 要提示的选项,形状与顶层 userConfig 相同;保存的值替换进服务器 env 里的 ${user_config.KEY} 引用 |
这个清单把 channel 绑定到插件的 telegram MCP 服务器,并提示填写一个会替换进服务器 env 的 bot 令牌:
{
"mcpServers": {
"telegram": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
"env": { "BOT_TOKEN": "${user_config.bot_token}" }
}
},
"channels": [
{
"server": "telegram",
"displayName": "Telegram",
"userConfig": {
"bot_token": {
"type": "string",
"title": "Bot token",
"description": "Telegram bot token",
"sensitive": true
}
}
}
]
}环境变量
Claude Code 给插件组件提供三个路径变量。在「每个变量在哪里解析」列出的字段里把它们引用为 ${NAME},并在接收它们的进程里把它们读作环境变量。
| 变量 | 解析为 | 用于 |
|---|---|---|
${CLAUDE_PLUGIN_ROOT} | 插件已安装版本的绝对路径 | 随插件捆绑的脚本、二进制文件和配置文件 |
${CLAUDE_PLUGIN_DATA} | ~/.claude/plugins/data/<id>/,在第一次引用时创建并跨插件更新保留;<id> 是把插件标识符里字母、数字、_ 或 - 之外的每个字符替换为 - 的结果 | 已安装的依赖(如 node_modules)、生成的代码和缓存 |
${CLAUDE_PROJECT_DIR} | 项目根目录 | 项目本地的脚本和配置文件 |
${CLAUDE_PLUGIN_ROOT} 在插件更新时会变,所以不要把状态写在那里;根目录何时移动、旧目录何时被清理,见加载页。默认情况下,当你从插件最后安装的位置卸载它时,Claude Code 会删除 ${CLAUDE_PLUGIN_DATA} 目录;--keep-data 以及数据保留的其他情形见 plugin uninstall 文档。
每个变量在哪里解析
在每个插件组件里,${...} 引用在特定字段里内联解析,有些组件还在进程环境里接收这些变量:
| 插件组件 | ${...} 解析的字段 | 导出给进程 |
|---|---|---|
| hook 命令 | command 和 args 的任何位置 | CLAUDE_PLUGIN_ROOT、CLAUDE_PLUGIN_DATA、CLAUDE_PROJECT_DIR 和 CLAUDE_PLUGIN_OPTION_<KEY> |
| monitor 命令 | command 的任何位置 | 不导出 |
MCP stdio 服务器 | command、args、env | CLAUDE_PLUGIN_ROOT、CLAUDE_PLUGIN_DATA |
MCP http、sse、ws 服务器 | url、headers、headersHelper | 不适用 |
| LSP 服务器 | command、args、env、workspaceFolder | CLAUDE_PLUGIN_ROOT、CLAUDE_PLUGIN_DATA、CLAUDE_PROJECT_DIR |
| skill、命令和智能体内容 | Markdown 正文的任何位置 | 不适用 |
这些变量不在 Claude 通过 Bash 工具运行的命令的环境里(不论在主会话还是子智能体里)。在 skill、命令和智能体内容里,把 ${...} 引用写在 Markdown 正文里,Claude Code 在加载内容时内联替换路径。
引号和路径分隔符
让每个被替换的路径保持为单个参数:
- hook 命令:用带
args的 exec 形式,使每个路径是一个无需加引号的参数。 - shell 形式的 hook 和 monitor 命令:把变量包在双引号里,使含空格的路径仍是一个词。
如果你在 hooks 文件的 shell 形式命令里把这些变量留在引号之外,claude plugin validate 会警告,除非该 hook 把 shell 设为 "powershell"。这个 shell 形式的 hook 运行随插件捆绑的脚本:
{
"hooks": {
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/process.sh"
}
]
}
]
}
}在 Windows 上,被替换的路径使用正斜杠,这样 shell 不会把反斜杠读作转义。
标准布局
每种组件类型在插件根目录下都有一个默认位置,在清单没有指向别处时使用。
| 组件 | 默认位置 | 内容 |
|---|---|---|
| 清单 | .claude-plugin/plugin.json | 插件元数据和配置;可选 |
| Skills | skills/ | 每个 skill 一个 <name>/SKILL.md;根目录有 SKILL.md、没有 skills/ 也没有 skills 键的插件会作为单个 skill 加载 |
| 命令 | commands/ | 扁平的 Markdown 命令文件;新插件优先用 skills/ |
| 智能体 | agents/ | 智能体 Markdown 文件;子文件夹是智能体名称的一部分 |
| Hooks | hooks/hooks.json | hook 配置 |
| MCP 服务器 | .mcp.json | MCP 服务器定义 |
| LSP 服务器 | .lsp.json | LSP 服务器配置 |
| 输出样式 | output-styles/ | 输出样式 Markdown 文件 |
| 工作流 | workflows/ | 工作流 .js 文件 |
| 主题 | themes/ | 主题 JSON 文件 |
| Monitors | monitors/monitors.json | monitors 数组 |
| 可执行文件 | bin/ | 插件启用期间,这里的文件在 Bash 工具的 PATH 上,所以 Claude 把它们作为裸命令运行;claude.ai 和 Cowork 不安装带这个目录的插件,包括你通过 claude.ai 组织设置分发的 |
| 设置 | settings.json | 插件启用期间应用的 agent 和 subagentStatusLine 默认值 |
一个用到所有默认位置、外加其 hooks 调用的 scripts/ 文件夹的插件,布局如下:
deploy-tools/
├── .claude-plugin/
│ └── plugin.json
├── skills/
│ └── deploy/
│ └── SKILL.md
├── commands/
│ └── status.md
├── agents/
│ └── reviewer.md
├── hooks/
│ └── hooks.json
├── monitors/
│ └── monitors.json
├── output-styles/
│ └── terse.md
├── themes/
│ └── dracula.json
├── workflows/
│ └── release-audit.js
├── bin/
│ └── deploy-tool
├── scripts/
│ └── format.sh
├── settings.json
├── .mcp.json
└── .lsp.json插件根目录的 CLAUDE.md 不会作为上下文加载,claude plugin validate 发现它时会警告。要包含加载进 Claude 上下文的指令,把它们放进 skill。
市场条目与清单
市场条目接受本页的每个字段,外加它自己的字段,包括 strict。strict 字段决定条目是否可以向带有自己 plugin.json 的插件添加组件,默认 true。
条目字段如何与 plugin.json 组合
条目要么充当清单,要么向它添加组件,要么与它冲突:
- 没有
plugin.json:不论strict如何,条目就是清单。条目的hooks只在内联对象形式下加载;对那里的文件路径或数组,/plugin的 Errors 标签页显示not yet supported in a marketplace entry错误。 - 有
plugin.json,strict未设置或为true:Claude Code 加载清单,并把条目的commands、agents、skills、outputStyles和themes追加到它上面。对hooks,条目对某个事件的 matcher 替换清单对同一事件的 matcher,只有清单声明的事件保留它们的。 - 有
plugin.json,strict: false:声明了commands、agents、skills、hooks、outputStyles或themes中任何一个的条目是冲突,插件以Plugin <name> has conflicting manifests加载失败。
当 source 是市场根目录的市场条目列出了具体的 skills 子目录时,只有那些子目录加载,插件默认的 skills/ 目录不被扫描;清单里的 skills 键则是加到默认之上。
元数据优先级
有些元数据字段不论 strict 如何都有固定的优先级:
defaultEnabled和显示字段:条目的defaultEnabled及其displayName这样的显示字段覆盖清单的。version:清单的version覆盖条目的。name:当条目用与清单不同的name列出插件时,enabledPlugins使用条目名,组件则以清单名为命名空间。
完整的优先级表见市场参考的 Strict mode。
marketplace.json 速查
市场文件位于 .claude-plugin/marketplace.json,必须有 name、owner 和 plugins 数组。每个插件条目需要 name 和 source;source 可以是从市场根出发的相对路径,也可以是指向 GitHub 仓库、Git URL 等外部位置的来源对象。条目的 name 要和插件清单的 name 一致。字段的完整列表以官方市场参考为准。
claude plugin 命令速查
在 shell 里管理插件:
| 命令 | 作用 |
|---|---|
claude plugin install <plugin>@<marketplace> | 安装插件 |
claude plugin list | 列出已安装的插件,含版本、范围和状态 |
claude plugin enable <name> / claude plugin disable <name> | 启用 / 停用插件 |
claude plugin uninstall <name> | 卸载插件 |
claude plugin validate <path> | 校验插件或市场目录 |
claude plugin details <name> | 列出插件包含的组件清单 |
claude plugin marketplace add <source> | 添加市场(本地目录、GitHub 仓库或 URL) |
claude plugin marketplace list / remove / update | 列出、移除、更新市场 |
在会话里对应的是 /plugin(打开插件面板)、/plugin install、/plugin marketplace add 和 /reload-plugins(不重启就应用待处理的改动)。启动标志 --plugin-dir、--plugin-url 为单个会话加载插件。
下一步
- 给插件添加组件:各组件在运行时做什么,附带能通过校验的示例。
- 市场参考:市场能为你的插件设置的条目字段。
- 插件命令参考:
claude plugin validate的标志和输出。 - 排查插件:每条校验消息及其修复。