.claude-plugin/plugin.json que substitui ou adiciona àquela pasta, e um nome que o usuário vê. Para cada tabela de campos completa da chave, consulte a referência de manifesto.
Use esta página para adicionar um componente a um plugin que já carrega.
Depois de adicionar um componente, execute /reload-plugins em uma sessão em execução ou inicie uma nova para que Claude Code o carregue. Para verificar o arquivo do componente antes de carregá-lo, execute claude plugin validate . no seu shell a partir do diretório do plugin.
Estes casos são cobertos em outras páginas:
- Construindo seu primeiro plugin: comece com Criar um plugin
- Instalando o plugin de outra pessoa: consulte Instalar plugins
- Os usuários do seu plugin estão em claude.ai ou em Cowork: um conjunto diferente de componentes carrega lá. Consulte Plugins em claude.ai e em Cowork
Explorar o diretório do plugin
O explorador mostra um plugin de exemplo,my-plugin, que tem um de cada tipo de componente em sua localização padrão:
- Uma skill de revisão e um comando
about - Um subagente de revisão de segurança
- Um hook que formata arquivos após Claude editá-los, e a pasta
scripts/que ele chama - Um monitor de log
- Um estilo de saída e um tema de cor
- Um workflow de auditoria de rotas
- Um executável
hello-plugin - Configurações padrão
- Um servidor MCP local e um servidor de linguagem Go
Adicionar cada tipo de componente
Cada seção abaixo cobre um tipo de componente: onde seus arquivos vão no plugin, um exemplo que valida, o que o usuário vê uma vez que o plugin carrega, e a chave de manifesto que altera a localização padrão. Adicione os que seu plugin precisa; nenhum é obrigatório.Skills
Uma skill é um arquivoSKILL.md que Claude pode carregar quando sua descrição corresponde à tarefa. O usuário também pode executá-la como um comando. Salve cada skill em seu próprio diretório em skills/:
SKILL.md uma description para que Claude saiba quando usá-la:
skills/review/SKILL.md
/my-plugin:review executa a skill. O nome do comando e quem pode invocá-lo seguem estas regras:
- Nome do comando:
/<plugin>:<directory>, entãoskills/review/SKILL.mdemmy-pluginé/my-plugin:review. Se você definirnameno frontmatter, ele substitui o último segmento e o prefixo do plugin permanece. Consulte como uma skill obtém seu nome de comando - Quem a invoca: Claude, o usuário ou ambos, controlado pelo frontmatter. Consulte Controlar quem invoca uma skill
skills/:
- Diretórios adicionais: liste-os na chave de manifesto
skills. Eles adicionam à varredura padrãoskills/em vez de substituí-la, diferentemente decommandseagents - Uma única skill na raiz do plugin: sem diretório
skills/e sem chave de manifestoskills, umSKILL.mdna raiz do plugin carrega como uma skill. Definanameem seu frontmatter, porque caso contrário uma instalação de marketplace nomeia a skill após seu diretório de cache em vez de seu plugin
CLAUDE.md na raiz do plugin, e claude plugin validate avisa CLAUDE.md at the plugin root is not loaded as project context.
Para campos de frontmatter e arquivos de suporte, consulte Skills.
Comandos
Um comando é um único arquivo Markdown que o usuário executa por nome, como/my-plugin:about.
Comandos são o formato mais antigo, e skills os superam para novo trabalho. Uma skill é executada por nome da mesma forma, e também pode carregar arquivos de suporte em seu diretório. Mantenha
commands/ para arquivos que você está movendo de .claude/commands/.commands/<file>.md e ele se torna /<plugin>:<file>. Um subdiretório adiciona um segmento, então commands/db/migrate.md é /my-plugin:db:migrate.
Arquivos de comando usam o mesmo frontmatter que skills.
Definir comandos no manifesto
Você só precisa disso se quiser manter arquivos de comando em algum lugar diferente decommands/, ou para definir um comando curto dentro de plugin.json sem um arquivo Markdown separado. Defina a chave de manifesto commands, e Claude Code a lê em vez de varrer commands/. A chave usa um caminho, uma matriz de caminhos ou um objeto que mapeia cada nome de comando para um arquivo source ou content inline.
Este manifesto define /my-plugin:about inline, sem arquivo Markdown:
.claude-plugin/plugin.json
/my-plugin:about na sessão para confirmar que carregou.
Para a sintaxe completa da chave, consulte commands.
Agentes
Um subagente é um assistente separado, com suas próprias instruções e janela de contexto, que Claude pode delegar uma tarefa. Cada arquivo Markdown emagents/ define um:
agents/security-reviewer.md
my-plugin:security-reviewer, e o usuário pode invocá-lo explicitamente com @agent-my-plugin:security-reviewer. A forma do nome é <plugin>:<name>, onde <name> vem do frontmatter, ou do nome do arquivo quando não há.
A chave agents substitui a varredura agents/.
Organizar agentes em subpastas
Você pode colocar arquivos de agente do plugin em subpastas deagents/. Claude Code os carrega recursivamente e une o nome do plugin, cada nome de subpasta e o nome do arquivo com dois-pontos para formar o nome com escopo do agente. Por exemplo, agents/review/security.md em um plugin nomeado my-plugin carrega como my-plugin:review:security. Duas configurações alteram esse nome:
- Frontmatter
name: ele substitui apenas o nome do arquivo, entãoname: auditemagents/review/security.mdcarrega comomy-plugin:review:audit - Campo de manifesto
agents: um arquivo que você lista lá carrega sem nomes de subpasta, então"agents": "./custom/review/security.md"carrega comomy-plugin:security
Campos de frontmatter em agentes de plugin
O frontmatter de um agente de plugin segue estas regras:- Campos suportados:
name,description,model,effort,maxTurns,tools,disallowedTools,skills,memory,background,omitClaudeMd,isolation,colore a chavecacheTtldeexperimental. O único valorisolationválido é"worktree". Consulte campos de frontmatter suportados para saber o que cada um faz - Campos ignorados:
permissionMode,hooks,mcpServerseinitialPrompt. Um arquivo de agente não pode adicionar hooks ou servidores MCP por conta própria, então adicione-os como plugin hooks e servidores MCP em vez disso - Frontmatter que não analisa: o agente ainda carrega com cada campo ignorado. É nomeado após o arquivo, e sua descrição lê
Agent from my-plugin plugin. Executeclaude plugin validateno seu shell para encontrar esses arquivos
Hooks
Um hook executa algo automaticamente em um ponto do ciclo de vida do Claude Code, como após cada edição de arquivo: um comando shell, uma solicitação HTTP, uma chamada de ferramenta MCP, um prompt para um modelo ou um subagente. Salve os hooks do plugin emhooks/hooks.json na raiz do plugin, sob uma chave "hooks" de nível superior, na mesma forma que o objeto hooks em settings.json. Isso permite copiar um hook de configurações existente sem alterações.
Este hook executa um script agrupado após cada Write ou Edit:
hooks/hooks.json
scripts/format.sh e torne-o executável.
Carregue o plugin e peça a Claude para editar um arquivo. Um hook PostToolUse que sai com 0 não mostra nada na transcrição, então confirme que foi executado com log de depuração ou pelo que o script em si altera.
Hooks em hooks/hooks.json e na chave de manifesto hooks ambos carregam. Para cada evento e sua carga útil, consulte Eventos de hook.
Quando os hooks do plugin disparam
Os hooks de um plugin não esperam que uma das skills ou comandos do plugin seja usada. Claude Code os registra quando uma sessão carrega o plugin, e eles disparam em seus eventos a partir de então. Para limitar quando um hook é executado, restrinja seumatcher.
Se um hook nunca dispara, consulte hooks que não disparam.
Ambiente, citação e correspondência de ferramentas MCP
O ambiente do hook, a citação de${CLAUDE_PLUGIN_ROOT} e os matchers para as próprias ferramentas MCP do plugin funcionam da seguinte forma:
- Ambiente: cada processo de hook recebe
CLAUDE_PLUGIN_ROOTeCLAUDE_PLUGIN_DATAem seu ambiente, maisCLAUDE_PLUGIN_OPTION_<KEY>para cada valor de configuração do usuário, para que seu script possa lê-los de lá - Citação: quando
commandnão temargs, ele é executado através de um shell, então envolva o caminho${CLAUDE_PLUGIN_ROOT}em aspas duplas, como o exemplohooks/hooks.jsonem Hooks faz, para manter o caminho expandido como uma palavra de shell. Quando você passaargsem vez disso, cada elemento é passado como um argumento sem shell e não precisa de citação. Consulte forma exec e forma shell - Correspondência das próprias ferramentas MCP do plugin: uma ferramenta de um servidor MCP que este plugin declara é nomeada
mcp__plugin_<plugin>_<server>__<tool>, então escreva esse nome completo no matcher. Um matcher apenas no nome do servidor nunca dispara. Consulte Corresponder ferramentas MCP
Servidores MCP
Um servidor MCP fornece a Claude ferramentas de um sistema externo. Declare-o em.mcp.json na raiz do plugin, na mesma forma que um .mcp.json de projeto. Este .mcp.json declara um servidor nomeado db:
.mcp.json
mcpServers e colocar db no nível superior do arquivo.
Carregue o plugin e execute /mcp para confirmar que o servidor aparece como plugin:my-plugin:db.
claude plugin validate verifica .mcp.json e relata uma entrada de servidor que Claude Code descartaria no tempo de carregamento como um erro. Requer Claude Code v2.1.281 ou posterior.
Para onde uma entrada ruim aparece no tempo de carregamento, consulte Servidores MCP que não iniciam.
A chave de manifesto mcpServers usa um mapa de servidor inline, um caminho para um arquivo JSON ou uma matriz daqueles. Quando um servidor de manifesto tem o mesmo nome que um em .mcp.json, o servidor de manifesto o substitui.
Alcançar usuários em claude.ai e Cowork
Um servidor stdio local, como o servidordb em Servidores MCP, é executado em Claude Code e em uma sessão Cowork que é executada em sua máquina no aplicativo Claude Desktop, mas não em claude.ai. Para alcançar usuários lá também, referencie um servidor remoto por sua URL https://, que claude.ai e Cowork oferecem ao usuário como um conector.
Nomes de servidor, nomes de ferramentas e recarregamentos
Os nomes do servidor, substituição de variáveis e comportamento de recarga seguem estas regras:- Nome do servidor:
plugin:<plugin>:<server>, então o servidordbemmy-pluginéplugin:my-plugin:dbem/mcp. Use a mesma forma para nomear o servidor em um hookmcp_tool - Nomes de ferramentas:
mcp__plugin_<plugin>_<server>__<tool>, então uma ferramentaquerynaquele servidordbémcp__plugin_my-plugin_db__query. Esse é o nome a usar em regras de permissão e matchers de hook - Substituição:
${CLAUDE_PLUGIN_ROOT}e as outras variáveis de caminho são substituídas emcommand,argseenv. Nenhuma citação é necessária emargs, porque cada elemento é passado como um argumento - Recarga: quando o usuário executa
/reload-pluginse o recarga se aplica, um servidor cuja configuração não foi alterada mantém sua conexão. Um servidor cuja configuração mudou se reconecta, e um que você removeu se desconecta
Incluir um servidor MCPB empacotado
A chavemcpServers também aceita um servidor empacotado como um arquivo MCPB, cuja extensão é .mcpb ou a mais antiga .dxt. Aponte a chave para o arquivo, como um caminho dentro do plugin ou uma URL https://:
.claude-plugin/plugin.json
name no manifesto do pacote.
Para transportes e autenticação, consulte MCP.
Servidores LSP
Um servidor LSP fornece a Claude diagnósticos e navegação de código para uma linguagem. Se um plugin oficial de inteligência de código já cobre sua linguagem, instale esse em vez de escrever um. Caso contrário, declare o servidor em.lsp.json na raiz do plugin:
.lsp.json
command é o nome do binário, com seus argumentos em args. extensionToLanguage precisa de pelo menos uma extensão, cada uma começando com ..
claude plugin validate não lê este arquivo. Quando qualquer entrada é inválida, o arquivo inteiro é ignorado no carregamento e Invalid LSP server config for ".lsp.json" aparece na aba Errors de /plugin.
Seu plugin configura a conexão mas não instala o binário do servidor, e cada extensão de arquivo obtém um servidor:
- Binário ausente: Claude Code inicia
commandpor nome doPATHdo usuário. Quando o binário não está lá, o servidor falha ao iniciar eclaude --debugregistraLSP server <name> failed to start - Conflitos de extensão: quando dois servidores habilitados reivindicam a mesma extensão, o primeiro registrado manipula esses arquivos e o outro não é usado para eles, se os servidores vêm de um plugin ou dois. A aba Errors de
/pluginmostra o avisoLSP server "<name>" is not used for <ext> files
lspServers usa o mesmo mapa inline, um caminho para um arquivo JSON ou uma matriz daqueles, e seus servidores adicionam aos em .lsp.json. Quando um servidor de manifesto tem o mesmo nome que um em .lsp.json, o servidor de manifesto o substitui.
Para transport, timeouts, reinicializações e os outros campos, consulte lspServers.
Envie a saída de log para stderr, não stdout. Claude Code lê stdout de um servidor apenas como mensagens de protocolo e aceita cabeçalhos de mensagem até 64 KiB e um corpo de mensagem até 32 MiB.
Claude Code desconecta um servidor que excede qualquer limite ou escreve saída não-protocolo para stdout, e conta a desconexão como uma falha para restartOnCrash e maxRestarts. Quando você executa com --debug, Claude Code escreve um erro nomeando a causa para o log de depuração.
Executáveis
Arquivos embin/ na raiz do plugin estão no PATH do shell da ferramenta Bash enquanto o plugin está habilitado, para que Claude possa executá-los como comandos simples. Adicione um script executável:
bin/hello-plugin
chmod +x bin/hello-plugin e carregue o plugin. Quando você pede a Claude para executar hello-plugin, o resultado da ferramenta Bash mostra a saída do script.
Diretórios bin/ de plugin vêm após as entradas PATH do próprio usuário, então um plugin não pode sombrear git, ls ou outro comando do sistema.
claude.ai e Cowork não instalam um plugin que tem um diretório bin/ de nível superior, incluindo um que você distribui através das configurações da organização claude.ai.
Configurações padrão
Para definir padrões que se aplicam enquanto o plugin está habilitado, adicione umsettings.json na raiz do plugin, ou coloque o mesmo objeto inline na chave de manifesto settings. Duas chaves têm efeito, agent e subagentStatusLine, e todas as outras chaves são descartadas.
Defina agent para executar um dos próprios agentes do plugin como o thread principal:
settings.json
security-reviewer.
Para tudo que a chave controla, consulte a configuração agent.
Quando a mesma chave é definida em mais de um lugar, estas regras decidem qual valor se aplica:
- Arquivo sobre manifesto: quando ambos existem e
settings.jsondefine pelo menos uma chave suportada,settings.jsonse aplica e osettingsdo manifesto é ignorado - Configurações do usuário sobre padrões do plugin: entre fontes de configurações, padrões de plugin são a camada mais baixa, então um
agentpróprio do usuário em~/.claude/settings.jsonsubstitui o seu - Dois plugins definem a mesma chave: o valor do plugin carregado por último se aplica, e
claude --debugregistraoverrides setting
subagentStatusLine, consulte linhas de status de subagente.
Temas e estilos de saída
Um plugin pode incluir temas de cor e estilos de saída. Ambos aparecem nos mesmos seletores que os do usuário. Para qualquer um, definir a chave de manifesto substitui a varredura de pasta.
Temas de plugin são somente leitura, então quando um usuário edita um em
/theme, a edição é salva como uma cópia no diretório de temas próprio.
Este tema recolore o prompt de acento e texto de erro na predefinição escura:
themes/dracula.json
Canais
Um canal permite que um sistema externo, como um aplicativo de chat, envie mensagens para uma sessão. Em um plugin, um canal é um dos servidores MCP mais uma entradachannels que se vincula a ele e pode solicitar sua própria configuração. Este manifesto vincula um canal a um servidor telegram e solicita um token de bot:
.claude-plugin/plugin.json
server deve corresponder a uma chave em mcpServers. O userConfig por canal usa a mesma forma que a chave userConfig de nível superior.
Para o que o servidor deve implementar e como os usuários habilitam um plugin de canal, consulte Empacotar como um plugin na referência de canais. Para a tabela de campos, consulte channels.
Monitores
Um monitor é um comando shell que é executado em segundo plano para toda a sessão. O que ele imprime chega a Claude como notificações, para que Claude possa reagir a um log ou mudança de status sem ser solicitado a observá-lo. Salve as entradas emmonitors/monitors.json:
monitors/monitors.json
- Apenas sessões interativas: monitores de plugin iniciam em uma sessão interativa e nunca em modo não-interativo com a flag
-p. Eles também iniciam apenas onde a ferramenta Monitor está disponível - Sem configuração do usuário:
commandobtém as variáveis de caminho e${ENV_VAR}do ambiente, mas nunca${user_config.*}. Um monitor que referencia um não inicia, e processos de monitor não recebemCLAUDE_PLUGIN_OPTION_<KEY>também - Desabilitação no meio da sessão: se você desabilitar um plugin no meio da sessão, Claude Code não para monitores que já estão em execução. Eles param quando a sessão termina
experimental.monitors usa a mesma matriz inline ou um caminho para um arquivo JSON, e é lida em vez de monitors/monitors.json.
Para o gatilho when e os outros campos, consulte monitors.
Solicitar ao usuário valores de configuração
Declare os valores que seu plugin precisa do usuário na chave de manifestouserConfig, para que os usuários não editem settings.json eles mesmos. Cada opção aparece em um diálogo com seu title como o rótulo e sua description abaixo.
Defina "sensitive": true para um token ou senha. O diálogo então mascara a entrada, e o valor é armazenado em armazenamento seguro em vez de settings.json.
Este manifesto solicita um endpoint e um token:
.claude-plugin/plugin.json
Quando o diálogo de configuração aparece
O diálogo aparece apenas na interface interativa/plugin. Ele abre para qualquer opção que ainda não está definida quando o usuário faz qualquer um dos seguintes:
- Instala o plugin em
/plugin - Executa
/plugin install <plugin>@<marketplace>dentro de uma sessão - Habilita o plugin da aba Installed em
/plugin
/plugin configure <plugin>@<marketplace>.
O comando shell claude plugin install nunca solicita valores userConfig. Para definir valores do shell, passe cada um como --config KEY=VALUE. Quando opções permanecem indefinidas, o comando imprime uma linha userConfig options not yet set que nomeia ambas as formas de defini-las. O diálogo userConfig nunca aparece cita a linha.
Para os campos de opção, onde cada valor é armazenado, como um componente referencia um valor salvo e quais campos rejeitam ${user_config.*}, consulte Configuração do usuário.
Referenciar caminhos de plugin e armazenar dados
Você não sabe onde seu plugin será instalado, então refira-se a seus arquivos e dados através destas variáveis em vez de caminhos fixos. Elas são substituídas em conteúdo de skill, comando e agente, em comandos de hook e monitor, e em configurações de servidor MCP e LSP. Elas também são exportadas para processos de hook, MCP e LSP:${CLAUDE_PLUGIN_ROOT}: o diretório de instalação do plugin. Cada versão tem seu próprio diretório de cache, então o caminho muda quando o plugin é atualizado. Não escreva estado lá${CLAUDE_PLUGIN_DATA}: um diretório que sobrevive a atualizações, paranode_modules, ambientes virtuais e caches. Ele se resolve para~/.claude/plugins/data/<id>/e é criado quando primeiro referenciado${CLAUDE_PROJECT_DIR}: a raiz do projeto, o mesmo valor que hooks recebem
<id> é o identificador do plugin com cada caractere diferente de letras, dígitos, _ e - substituído por -, então my-plugin@my-marketplace se torna my-plugin-my-marketplace.
No Windows, os caminhos substituídos usam barras para frente para que um shell não leia barras invertidas como escapes.
Instalar dependências no diretório de dados
Para um plugin instalado no marketplace, Claude Code instala dependências de pacote Node.js elegíveis automaticamente quando armazena em cache o plugin, então você pode não precisar instalá-las você mesmo. Quando você faz, este hookSessionStart instala node_modules em ${CLAUDE_PLUGIN_DATA} na primeira execução e novamente após uma atualização alterar package.json:
hooks/hooks.json
~/.claude/plugins/data/<id>/node_modules existe. Um servidor MCP pode então definir NODE_PATH para ${CLAUDE_PLUGIN_DATA}/node_modules em seu env. Para quais campos substituem qual variável, consulte Variáveis de ambiente.
Próximos passos
- Referência de manifesto de plugin: campos
plugin.json, regras de caminho e o layout padrão - Testar plugins com evals: verifique se os componentes que você adicionou alteram o comportamento de Claude da forma que você pretende
- Publicar e distribuir um plugin: versione o plugin e coloque-o em um marketplace
- Solucionar problemas de plugins: o que fazer quando um componente não carrega ou um hook não dispara