Criar e distribuir um marketplace de plugins
Crie e hospede marketplaces de plugins para distribuir extensões Claude Code em equipes e comunidades.
Um marketplace de plugins é um catálogo que permite distribuir plugins para outros. Os marketplaces fornecem descoberta centralizada, rastreamento de versão, atualizações automáticas e suporte para múltiplos tipos de fonte, incluindo repositórios git e caminhos locais. Este guia mostra como criar seu próprio marketplace para compartilhar plugins com sua equipe ou comunidade.
Procurando instalar plugins de um marketplace existente? Veja Descobrir e instalar plugins pré-construídos.
Visão geral
Criar e distribuir um marketplace envolve:
- Criar plugins: construir um ou mais plugins com skills, agents, hooks, MCP servers ou LSP servers. Este guia assume que você já tem plugins para distribuir; veja Criar plugins para detalhes sobre como criá-los.
- Criar o arquivo de marketplace: definir um
marketplace.jsonque lista seus plugins e onde encontrá-los. Veja Criar o arquivo de marketplace. - Hospedar o marketplace: fazer push para GitHub, GitLab ou outro host git. Veja Hospedar e distribuir marketplaces.
- Compartilhar com usuários: usuários adicionam seu marketplace com
/plugin marketplace adde instalam plugins individuais. Veja Descobrir e instalar plugins.
Depois que seu marketplace estiver ativo, você pode atualizá-lo fazendo push de alterações para seu repositório. Os usuários atualizam sua cópia local com /plugin marketplace update.
Passo a passo: criar um marketplace local
Este exemplo cria um marketplace com um plugin: uma skill quality-review para revisões de código. Você criará a estrutura de diretórios, adicionará uma skill, criará o manifesto do plugin e o catálogo do marketplace, depois instalará e testará.
Criar a estrutura de diretórios
mkdir -p my-marketplace/.claude-plugin
mkdir -p my-marketplace/plugins/quality-review-plugin/.claude-plugin
mkdir -p my-marketplace/plugins/quality-review-plugin/skills/quality-review
Criar a skill
Crie um arquivo SKILL.md que define o que a skill quality-review faz.
---
description: Revisar código para bugs, segurança e desempenho
---
Revise o código que selecionei ou as alterações recentes para:
- Possíveis bugs ou casos extremos
- Preocupações de segurança
- Problemas de desempenho
- Melhorias de legibilidade
Seja conciso e acionável.
Criar o manifesto do plugin
Crie um arquivo plugin.json que descreve o plugin. O manifesto vai no diretório .claude-plugin/.
{
"name": "quality-review-plugin",
"description": "Adiciona uma skill quality-review para revisões rápidas de código",
"version": "1.0.0",
"author": {
"name": "Seu Nome"
}
}
Definir version significa que os usuários só recebem atualizações quando você altera este campo, então aumente-o em cada lançamento. Um plugin com uma command source não é fixado por este campo. Nem é um plugin carregado no local de um marketplace adicionado como um diretório local. Se você omitir version, a versão vem da próxima fonte em gerenciamento de versão.
Criar o arquivo de marketplace
Crie o catálogo de marketplace que lista seu plugin.
{
"name": "my-plugins",
"owner": {
"name": "Seu Nome"
},
"plugins": [
{
"name": "quality-review-plugin",
"source": "./plugins/quality-review-plugin",
"description": "Adiciona uma skill quality-review para revisões rápidas de código"
}
]
}
Adicionar e instalar
A partir do diretório que contém my-marketplace, inicie Claude Code e execute os seguintes comandos. O comando install abre uma visualização de detalhes do plugin onde você seleciona um escopo de instalação para confirmar a instalação. Verifique o resumo da instalação: se ele relatar Run /reload-plugins to activate., veja Aplicar alterações de plugin sem reiniciar.
/plugin marketplace add ./my-marketplace
/plugin install quality-review-plugin@my-plugins
Experimentar
Selecione algum código em seu editor e execute sua nova skill. As skills do plugin são nomeadas com o nome do plugin.
/quality-review-plugin:quality-review
Para saber mais sobre o que os plugins podem fazer, incluindo hooks, agents, MCP servers e LSP servers, veja Plugins.
Como os plugins são instalados: quando os usuários instalam um plugin, Claude Code copia o diretório do plugin para um local de cache, a menos que o plugin seja carregado no local. Uma command source em link mode é carregada no local, assim como uma fonte de caminho relativo em um marketplace adicionado de um diretório local. Os plugins copiados não podem referenciar arquivos fora de seu diretório usando caminhos como ../shared-utils, porque esses arquivos não serão copiados.
Se você precisar compartilhar arquivos entre plugins, use symlinks. Veja Plugin caching and file resolution para detalhes.
Criar o arquivo de marketplace
Crie .claude-plugin/marketplace.json na raiz do seu repositório. Este arquivo define o nome do seu marketplace, informações do proprietário e uma lista de plugins com suas fontes.
Cada entrada de plugin precisa no mínimo de um name e um source que diz ao Claude Code onde buscá-lo. Veja o esquema completo abaixo para todos os campos disponíveis.
{
"name": "company-tools",
"owner": {
"name": "DevTools Team",
"email": "devtools@example.com"
},
"plugins": [
{
"name": "code-formatter",
"source": "./plugins/formatter",
"description": "Formatação automática de código ao salvar",
"version": "2.1.0",
"author": {
"name": "DevTools Team"
}
},
{
"name": "deployment-tools",
"source": {
"source": "github",
"repo": "company/deploy-plugin"
},
"description": "Ferramentas de automação de implantação"
}
]
}
Esquema de marketplace
Campos obrigatórios
| Campo | Tipo | Descrição | Exemplo |
|---|---|---|---|
name |
string | Identificador de marketplace em kebab-case, sem espaços, caracteres de controle ou caracteres de formatação bidirecional. Isso é público: os usuários o veem ao instalar plugins (por exemplo, /plugin install my-tool@your-marketplace). Cada usuário pode registrar apenas um marketplace por nome: quando adiciona um segundo marketplace com o mesmo nome, Claude Code substitui o primeiro. Para publicar múltiplos plugins sob um nome de marketplace, liste-os todos em um único marketplace.json. |
"acme-tools" |
owner |
object | Informações do mantenedor do marketplace. Veja Campos do proprietário | |
plugins |
array | Lista de plugins disponíveis | Veja Entradas de plugin |
Nomes reservados: os seguintes nomes de marketplace são reservados para uso oficial da Anthropic e não podem ser usados por marketplaces de terceiros: claude-code-marketplace, claude-code-plugins, claude-plugins-official, claude-plugins-community, claude-community, anthropic-marketplace, anthropic-plugins, agent-skills, anthropic-agent-skills, knowledge-work-plugins, life-sciences, claude-for-legal, claude-for-financial-services, financial-services-plugins, first-party-plugins, claude-tag-plugins, healthcare. Nomes que imitam marketplaces oficiais, como official-claude-plugins ou anthropic-plugins-v2, também são bloqueados. Reservar esses nomes impede que um marketplace de terceiros se apresente como uma fonte publicada pela Anthropic.
Claude Code verifica novamente os nomes reservados toda vez que carrega um marketplace, não apenas quando você adiciona um. Um marketplace que foi registrado sob um desses nomes antes do nome se tornar reservado para de carregar e relata que está registrado de uma fonte não confiável. Remova esse marketplace e adicione-o novamente da fonte oficial da Anthropic. Um marketplace de terceiros afetado por um nome recém-reservado carrega novamente assim que você o adiciona novamente sob um nome diferente. Antes da v2.1.205, first-party-plugins e healthcare não eram reservados, e um marketplace já registrado sob um nome reservado continuava carregando. Antes da v2.1.265, claude-tag-plugins não era reservado.
Você também não pode nomear um marketplace como npm, pip, uv, cargo, github ou gh, em qualquer capitalização. Esta verificação requer Claude Code v2.1.275 ou posterior.
Campos do proprietário
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
name |
string | Sim | Nome do mantenedor ou equipe |
email |
string | Não | Email de contato do mantenedor |
url |
string | Não | Site, perfil do GitHub ou URL da organização |
Campos opcionais
| Campo | Tipo | Descrição |
|---|---|---|
$schema |
string | URL do JSON Schema para autocompletar e validação do editor. Claude Code ignora este campo no momento do carregamento. |
description |
string | Breve descrição do marketplace |
version |
string | Versão do manifesto do marketplace |
metadata.pluginRoot |
string | Diretório que Claude Code resolve nomes de fonte de plugin simples. Veja Caminhos relativos. Requer Claude Code v2.1.239 ou posterior. |
allowCrossMarketplaceDependenciesOn |
array | Outros marketplaces que plugins neste marketplace podem depender. Dependências de um marketplace não listado aqui são bloqueadas na instalação. Veja Depender de um plugin de outro marketplace. |
renames |
object | Mapa de um antigo name de plugin para seu nome atual, ou para null se o plugin foi removido. Permite que usuários existentes migrem automaticamente quando você renomeia ou remove uma entrada em plugins. Veja Renomear ou remover um plugin. Requer Claude Code v2.1.193 ou posterior. |
description e version também são aceitos sob metadata para compatibilidade com versões anteriores.
Entradas de plugin
Cada entrada de plugin no array plugins descreve um plugin e onde encontrá-lo. Você pode incluir qualquer campo do esquema de manifesto de plugin, como description, version, author, commands e hooks, além destes campos específicos do marketplace: source, category, tags, strict, relevance, headers e headersHelper.
Campos obrigatórios
| Campo | Tipo | Descrição |
|---|---|---|
name |
string | Identificador de plugin em kebab-case, sem espaços, caracteres de controle ou caracteres de formatação bidirecional. Isso é público: os usuários o veem ao instalar (por exemplo, /plugin install my-plugin@marketplace). |
source |
string|object | Onde buscar o plugin (veja Fontes de plugin abaixo) |
Campos de plugin opcionais
Campos de metadados padrão:
| Campo | Tipo | Descrição |
|---|---|---|
displayName |
string | Nome legível por humanos exibido em superfícies de UI. Quando nem a entrada nem o plugin.json do plugin define um, os usuários veem o name do plugin. Pode conter espaços e qualquer capitalização. Não é usado para namespacing ou lookup. |
description |
string | Breve descrição do plugin |
version |
string | Versão do plugin. Se definido (aqui ou em plugin.json), o plugin é fixado a esta string e os usuários recebem atualizações apenas quando ela muda. Um plugin com uma command source não é fixado por nenhum dos dois campos. Nem um plugin carregado no local de um marketplace adicionado como diretório local. Se não definido em nenhum lugar, a versão vem da próxima fonte em gerenciamento de versão. |
author |
object | Informações do autor do plugin (name obrigatório; email e url opcionais) |
homepage |
string | URL da página inicial ou documentação do plugin |
repository |
string | URL do repositório de código-fonte |
license |
string | Identificador de licença SPDX (por exemplo, MIT, Apache-2.0) |
keywords |
array | Tags para descoberta e categorização de plugins |
metadata |
object | Objeto de forma livre para seus próprios campos, como dados de direito ou catálogo. Claude Code não o lê. Antes da v2.1.222, claude plugin validate relatava a chave como um campo não reconhecido. |
category |
string | Categoria do plugin para organização |
tags |
array | Tags para pesquisabilidade |
strict |
boolean | Controla se plugin.json é a autoridade para definições de componentes (padrão: true). Veja Strict mode abaixo. |
relevance |
object | Sinais que informam ao Claude Code quando sugerir este plugin aos usuários. Tem efeito apenas para marketplaces que um administrador coloca na lista de permissões em configurações gerenciadas. Veja Recomendar plugins para sua organização. |
defaultEnabled |
boolean | Se o plugin está habilitado após a instalação (padrão: true). Defina como false para instalar o plugin desabilitado até que o usuário opte por ativá-lo. Tem precedência sobre o mesmo campo no plugin.json do plugin. Veja Default enablement. |
Tanto a entrada quanto o próprio plugin.json do plugin podem definir os campos de exibição displayName, description, author, homepage, repository, license e keywords. Em listagens e detalhes de plugins, antes e depois da instalação:
- Para um campo que você define na entrada, os usuários veem o valor da entrada, mesmo quando
plugin.jsondefine um diferente. - Para um campo que a entrada deixa indefinido, os usuários veem o valor de
plugin.json.
Antes da instalação, Claude Code pode ler plugin.json apenas para entradas com uma fonte de caminho relativo, cujos arquivos de plugin vivem dentro do próprio marketplace. Para uma entrada com qualquer outro tipo de fonte, os usuários veem apenas os campos da própria entrada até que instalem o plugin.
Campos de configuração de componentes:
| Campo | Tipo | Descrição |
|---|---|---|
skills |
string|array | Caminhos personalizados para diretórios de skill contendo <name>/SKILL.md |
commands |
string|array | Caminhos personalizados para arquivos de skill .md simples ou diretórios |
agents |
string|array | Caminhos personalizados para arquivos de agent |
hooks |
string|object | Configuração de hooks personalizada ou caminho para arquivo de hooks |
mcpServers |
string|object | Configurações de MCP server ou caminho para config de MCP |
lspServers |
string|object | Configurações de LSP server ou caminho para config de LSP |
Campos de autenticação de arquivo:
Defina estes quando a entrada tiver uma archive source em um servidor que requer credenciais.
| Campo | Tipo | Descrição |
|---|---|---|
headers |
object | Cabeçalhos HTTP que Claude Code envia quando baixa o arquivo desta entrada. Substitui os cabeçalhos do marketplace com o mesmo nome. Requer Claude Code v2.1.238 ou posterior. |
headersHelper |
string | Comando que imprime os cabeçalhos HTTP para o download do arquivo desta entrada como um objeto JSON, para uma credencial que expira. Veja Autenticar downloads de arquivo. A entrada também deve definir "strict": false. Requer Claude Code v2.1.238 ou posterior. |
Fontes de plugin
As fontes de plugin informam ao Claude Code onde buscar cada plugin individual listado em seu marketplace. Elas são definidas no campo source de cada entrada de plugin em marketplace.json.
Claude Code copia cada plugin instalado para o cache de plugin versionado local em ~/.claude/plugins/cache, exceto quando o plugin é carregado no lugar. Uma fonte command em modo link é carregada no lugar, assim como uma fonte de caminho relativo em um marketplace adicionado de um diretório local. Claude Code também instala as dependências de pacote Node.js elegíveis do plugin na cópia em cache. Veja Plugin caching and file resolution para como um plugin carregado no lugar de um marketplace de diretório local capta suas edições.
| Fonte | Tipo | Campos | Notas |
|---|---|---|---|
| Caminho relativo | string (por exemplo, "./my-plugin") |
nenhum | Diretório local dentro do repositório de marketplace. Deve começar com ./, a menos que você escreva um nome simples sob metadata.pluginRoot. Claude Code resolve o caminho relativamente à raiz do marketplace, não ao diretório .claude-plugin/ |
github |
object | repo, ref?, sha? |
|
url |
object | url, ref?, sha? |
Fonte de URL Git |
git-subdir |
object | url, path, ref?, sha? |
Subdiretório dentro de um repositório git. Clona esparsamente para minimizar largura de banda para monorepos |
npm |
object | package, version?, registry? |
Pacote npm, buscado com seu cliente npm e desempacotado sem executar scripts de instalação |
archive |
object | url, sha256? |
Arquivo zip baixado via HTTPS. Funciona sem git ou npm na máquina do usuário. Requer Claude Code v2.1.224 ou posterior |
command |
object | command, timeout?, mode? |
Diretório de plugin produzido pela execução de um comando local, re-executado uma vez por sessão para captar mudanças. Requer Claude Code v2.1.229 ou posterior |
Fontes de marketplace vs fontes de plugin: Estes são conceitos diferentes que controlam coisas diferentes.
- Fonte de marketplace: onde buscar o próprio catálogo
marketplace.json. Definido quando os usuários executam/plugin marketplace addou em configuraçõesextraKnownMarketplaces. Fontes de marketplace baseadas em Git suportamref(branch/tag) mas nãosha. - Fonte de plugin: onde buscar um plugin individual listado no marketplace. Definido no campo
sourcede cada entrada de plugin dentro demarketplace.json. Fontes de plugin baseadas em Git suportam tantoref(branch/tag) quantosha(commit exato).
Por exemplo, um marketplace hospedado em acme-corp/plugin-catalog (fonte de marketplace) pode listar um plugin buscado de acme-corp/code-formatter (fonte de plugin). A fonte de marketplace e a fonte de plugin apontam para repositórios diferentes e são fixadas independentemente.
Os tipos de fonte baseados em git abaixo são github, url e git-subdir. Quando tanto ref quanto sha são definidos em qualquer um deles, o sha é o pino efetivo. Claude Code busca e faz checkout do commit fixado diretamente.
Na maioria dos hosts git, incluindo GitHub, GitLab e Bitbucket, isso significa que a instalação é bem-sucedida mesmo se o branch ou tag nomeado por ref tenha sido deletado upstream, desde que o commit ainda seja alcançável a partir do repositório. Alguns servidores, como AWS CodeCommit, não suportam busca de commits por SHA. Nesses servidores, o ref ainda deve existir e o commit fixado deve ser alcançável a partir dele.
Se você distribuir plugins através de Configurações da Organização > Plugins, apenas alguns tipos de fonte são permitidos. Veja Distribuir através de configurações da organização.
Caminhos relativos
Para plugins no mesmo repositório, use um caminho começando com ./:
{
"name": "my-plugin",
"source": "./plugins/my-plugin"
}
Os caminhos são resolvidos relativamente à raiz do marketplace, que é o diretório contendo .claude-plugin/. A fonte ./plugins/my-plugin portanto aponta para <repo>/plugins/my-plugin, mesmo que marketplace.json viva em <repo>/.claude-plugin/marketplace.json. Não use ../ para referenciar caminhos fora da raiz do marketplace. Em macOS e Linux, Claude Code recusa uma entrada de caminho com uma barra invertida em qualquer lugar após o ./ inicial, então escreva os separadores como / em todas as plataformas.
Um nome simples é um único nome de diretório sem /, como "formatter". Para escrever nomes simples em vez de caminhos ./, defina metadata.pluginRoot para o diretório sob o qual eles se resolvem. Com "pluginRoot": "./plugins", Claude Code resolve "source": "formatter" para ./plugins/formatter. Requer Claude Code v2.1.239 ou posterior.
metadata.pluginRoot deve ser um caminho relativo dentro do marketplace. Claude Code o ignora para uma fonte que já começa com ./. Uma fonte que contém um /, como team-a/formatter, não é um nome simples e ainda precisa do prefixo ./, mesmo quando metadata.pluginRoot está definido.
Claude Code resolve caminhos relativos contra uma cópia local do marketplace, então funcionam quando os usuários adicionam seu marketplace de uma fonte git ou um diretório local. Se os usuários adicionarem seu marketplace via URL direta para o arquivo marketplace.json, caminhos relativos não serão resolvidos, porque Claude Code baixa apenas esse arquivo. Para distribuição baseada em URL, use qualquer outra fonte de plugin em vez disso. Veja Troubleshooting para detalhes.
Repositórios GitHub
{
"name": "github-plugin",
"source": {
"source": "github",
"repo": "owner/plugin-repo"
}
}
Você pode fixar a um branch, tag ou commit específico:
{
"name": "github-plugin",
"source": {
"source": "github",
"repo": "owner/plugin-repo",
"ref": "v2.0.0",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
repo |
string | Obrigatório. Repositório GitHub no formato owner/repo |
ref |
string | Opcional. Branch ou tag Git (padrão é o branch padrão do repositório) |
sha |
string | Opcional. SHA de commit git completo de 40 caracteres para fixar a uma versão exata |
Repositórios Git
{
"name": "git-plugin",
"source": {
"source": "url",
"url": "https://gitlab.com/team/plugin.git"
}
}
Você pode fixar a um branch, tag ou commit específico:
{
"name": "git-plugin",
"source": {
"source": "url",
"url": "https://gitlab.com/team/plugin.git",
"ref": "main",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
url |
string | Obrigatório. URL completa do repositório git (https:// ou git@). O sufixo .git é opcional, então URLs do Azure DevOps e AWS CodeCommit sem o sufixo funcionam |
ref |
string | Opcional. Branch ou tag Git (padrão é o branch padrão do repositório) |
sha |
string | Opcional. SHA de commit git completo de 40 caracteres para fixar a uma versão exata |
Subdiretórios Git
Use git-subdir para apontar para um plugin que vive dentro de um subdiretório de um repositório git. Claude Code usa um clone parcial e esparso para buscar apenas o subdiretório, minimizando largura de banda para grandes monorepos.
{
"name": "my-plugin",
"source": {
"source": "git-subdir",
"url": "https://github.com/acme-corp/monorepo.git",
"path": "tools/claude-plugin"
}
}
Você pode fixar a um branch, tag ou commit específico:
{
"name": "my-plugin",
"source": {
"source": "git-subdir",
"url": "https://github.com/acme-corp/monorepo.git",
"path": "tools/claude-plugin",
"ref": "v2.0.0",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}
O campo url também aceita atalho GitHub (owner/repo) ou URLs SSH (git@github.com:owner/repo.git).
| Campo | Tipo | Descrição |
|---|---|---|
url |
string | Obrigatório. URL do repositório Git, atalho GitHub owner/repo ou URL SSH |
path |
string | Obrigatório. Caminho do subdiretório dentro do repositório contendo o plugin (por exemplo, "tools/claude-plugin") |
ref |
string | Opcional. Branch ou tag Git (padrão é o branch padrão do repositório) |
sha |
string | Opcional. SHA de commit git completo de 40 caracteres para fixar a uma versão exata |
Pacotes npm
Uma fonte npm pode nomear qualquer pacote no registro npm público ou em um registro privado que sua equipe hospeda. Claude Code resolve o pacote com seu cliente npm, baixa o tarball e o desempacota no cache de plugin.
Os scripts de instalação do pacote, como preinstall ou postinstall, nunca são executados, e suas dependências não são instaladas durante a busca.
Se o pacote enviar um lockfile suportado ao lado de seu package.json, Claude Code instala essas dependências de pacote Node.js em uma etapa separada, também com scripts desabilitados. Caso contrário, publique o plugin com tudo que ele precisa já construído. Um servidor MCP que precisa de outros pacotes pode ser iniciado através de npx, que os instala na primeira execução.
{
"name": "my-npm-plugin",
"source": {
"source": "npm",
"package": "@acme/claude-plugin"
}
}
Para fixar a uma versão específica, adicione o campo version:
{
"name": "my-npm-plugin",
"source": {
"source": "npm",
"package": "@acme/claude-plugin",
"version": "2.1.0"
}
}
Para instalar de um registro privado ou interno, adicione o campo registry:
{
"name": "my-npm-plugin",
"source": {
"source": "npm",
"package": "@acme/claude-plugin",
"version": "^2.0.0",
"registry": "https://npm.example.com"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
package |
string | Obrigatório. Nome do pacote ou pacote com escopo (por exemplo, @org/plugin) |
version |
string | Opcional. Versão ou intervalo de versão (por exemplo, 2.1.0, ^2.0.0, ~1.5.0) |
registry |
string | Opcional. URL de registro npm personalizado. Padrão é o registro npm do sistema (tipicamente npmjs.org) |
Arquivos zip
Use archive para distribuir um plugin como um arquivo zip que Claude Code baixa via HTTPS, para que as instalações funcionem sem git ou npm na máquina do usuário. Hospede o arquivo em qualquer servidor de arquivo estático ou repositório de artefatos, como um bucket S3, um repositório genérico do Artifactory ou nginx. Requer Claude Code v2.1.224 ou posterior. Nas versões v2.1.120 até v2.1.223, a instalação do plugin falha com This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again.; em versões mais antigas, um marketplace contendo uma entrada archive falha ao carregar completamente.
Esta entrada instala o plugin de um arquivo zip em um servidor de artefatos:
{
"name": "my-plugin",
"source": {
"source": "archive",
"url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip"
}
}
Quando você constrói o zip, você pode fazer zip do conteúdo do plugin diretamente ou fazer zip da pasta do plugin em si. Claude Code procura por .claude-plugin/ no topo do arquivo, depois dentro de uma única pasta de nível superior, então ambos os layouts instalam:
my-plugin.zip my-plugin.zip
├── .claude-plugin/ └── my-plugin/
│ └── plugin.json ├── .claude-plugin/
└── commands/ │ └── plugin.json
└── commands/
Claude Code não procura mais profundamente do que uma pasta, então um plugin aninhado mais abaixo falha ao instalar. Claude Code recusa arquivos maiores que 256 MiB.
Para fixar o arquivo exato, adicione um campo sha256 com o resumo do arquivo:
{
"name": "my-plugin",
"source": {
"source": "archive",
"url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip",
"sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"
}
}
Se o arquivo baixado não corresponder ao pino, Claude Code recusa a instalação e relata Plugin archive integrity check failed.
As fontes de arquivo aceitam estes campos:
| Campo | Tipo | Descrição |
|---|---|---|
url |
string | Obrigatório. URL HTTPS do arquivo zip. Claude Code rejeita URLs http://, junto com hosts de loopback, link-local e cloud-metadata. Cada salto de redirecionamento deve satisfazer as mesmas regras, ou Claude Code recusa o download |
sha256 |
string | Opcional. Resumo SHA-256 do arquivo como 64 caracteres hexadecimais, maiúsculos ou minúsculos. Claude Code verifica cada download contra ele e recusa a instalação em caso de incompatibilidade |
O resumo sha256 também serve como a versão do plugin quando nem plugin.json nem a entrada de marketplace declara uma. Veja Gerenciamento de versão. Se você declarar uma version, essa string de versão é o sinal de atualização, então após alterar o zip e seu resumo, aumente a versão também, ou os usuários mantêm a cópia em cache.
Autenticar downloads de arquivo
Para autenticar um download de arquivo, como um download de um registro privado, defina os cabeçalhos HTTP que Claude Code envia com ele. Defina headers na fonte url de onde você registrou o marketplace, como uma entrada extraKnownMarketplaces. No Claude Code v2.1.238 ou posterior, você pode defini-lo na entrada do plugin em vez disso, ao lado de source.
Se o valor que você colocaria em headers for de curta duração, como um token que seu registro cria sob demanda, defina um comando headersHelper no mesmo lugar em vez disso. Claude Code executa o comando e envia o objeto JSON que ele imprime como os cabeçalhos desse lugar. Requer Claude Code v2.1.238 ou posterior.
O lugar que você escolhe decide quais downloads recebem os cabeçalhos e quando Claude Code executa o comando:
| Lugar | Downloads que recebem os cabeçalhos | Quando Claude Code executa um headersHelper definido lá |
|---|---|---|
Fonte url do marketplace |
Downloads de arquivo na origem da URL do marketplace, significando o mesmo esquema, host e porta | Antes de cada busca do marketplace.json do marketplace e antes de cada download de arquivo nessa origem. Claude Code reutiliza a saída de uma execução por até 60 segundos |
| Entrada de plugin | Apenas o download dessa entrada | Apenas quando um usuário instala ou atualiza esse plugin sozinho e aceita o comando |
Onde ambos os lugares definem um cabeçalho do mesmo nome, Claude Code envia o valor da entrada. Dentro de um lugar, um cabeçalho que o comando imprime substitui um cabeçalho do mesmo nome listado em headers.
Adicionar um headersHelper a uma entrada de plugin
Esta entrada define headersHelper ao lado de source. Ela também define "strict": false, que Claude Code requer de uma entrada marketplace.json que define headersHelper. Com "strict": false, a entrada de marketplace é a definição completa do plugin, então um usuário pode revisar o que o plugin contém antes de aceitar o comando:
{
"name": "my-plugin",
"description": "Formatting commands for internal services",
"strict": false,
"commands": "./commands",
"source": {
"source": "archive",
"url": "https://registry.example.com/plugins/my-plugin-2.1.0.zip"
},
"headersHelper": "/opt/bin/mint-registry-token.sh"
}
Para verificar a entrada, execute claude plugin install my-plugin@your-marketplace. Claude Code mostra o comando e a URL do arquivo, e baixa o zip após você aceitar.
Antes de v2.1.238, Claude Code baixava um arquivo de entrada sem seus headers ou headersHelper, então uma instalação que dependia deles falhava com HTTP 401 while downloading plugin archive from, seguido pela URL, com o código de status do registro no lugar de 401.
Escrever o comando headersHelper
Se você definir headersHelper em uma fonte url de um marketplace ou em uma entrada de plugin, escreva o comando para atender a estes requisitos:
- Texto do comando: no máximo 500 caracteres de ASCII imprimível, sem execução de quatro ou mais espaços.
- Saída: imprima um objeto JSON de nomes de cabeçalho e valores de string em stdout, depois saia com 0 dentro de 10 segundos.
- Shell e diretório de trabalho: Claude Code executa o comando através de
sh, oucmd.exeno Windows, a partir do diretório de configuração,~/.claudeouCLAUDE_CONFIG_DIR. Dê um caminho absoluto ou um comando emPATH, porque um caminho relativo se resolve contra esse diretório, não o projeto do usuário. - Variáveis que Claude Code remove: do ambiente de um comando definido em uma entrada
marketplace.jsonou em um.claude/settings.jsonou.claude/settings.local.jsonde um projeto, Claude Code remove cada variável cujo nome contém uma palavra comoTOKEN,SECRET,KEYouAUTH, incluindoANTHROPIC_API_KEY. Claude Code não aplica essa remoção a um comando definido em configurações de usuário, um arquivo--settingsou configurações gerenciadas. - Variáveis que Claude Code define:
CLAUDE_CODE_MARKETPLACE_URLeCLAUDE_CODE_MARKETPLACE_NAMEpara um comando de fonteurl, eCLAUDE_CODE_PLUGIN_NAMEeCLAUDE_CODE_PLUGIN_ARCHIVE_URLpara um comando de entrada.CLAUDE_CODE_MARKETPLACE_NAMEnão está definido na primeira busca após um usuário adicionar um marketplace por URL, porque essa busca é o que fornece o nome.
Um comando que cria um token bearer imprime um objeto como este:
{"Authorization": "Bearer eyJhbGciOiJSUzI1NiJ9"}
Quando Claude Code pula um comando headersHelper ou descarta sua saída
Claude Code não executa um comando headersHelper, ou descarta cabeçalhos que vieram de headers ou da saída do comando, nestas situações:
- Comando falha: se o comando sair com código não-zero, executar por mais de 10 segundos ou imprimir qualquer coisa que não seja um objeto JSON de valores de string, Claude Code não faz a busca ou download para o qual executou o comando.
- URL do marketplace não começa com
https://: Claude Code não executa o comando da fonteurldesse e envia apenas os cabeçalhos listados em seu campoheaders. - Redirecionamento sai da origem: quando um download é redirecionado para fora da origem da URL do arquivo, Claude Code descarta os valores de
headerse saída de comando tanto da fonteurldo marketplace quanto da entrada de plugin. - Entrada define um cabeçalho de roteamento ou identidade: Claude Code descarta nomes de roteamento de requisição e identidade de cliente como
Host,CookieeX-Forwarded-*de umheadersde entrada e saída de comando, e mantém nomes de autenticação comoAuthorization. Claude Code filtra cada entradamarketplace.jsondessa forma, e uma entrada de configurações inline dependendo de qual arquivo a declara. - Comando definido em configurações de um diretório
--add-dir: Claude Code o ignora, em uma fonteurle em uma entrada de plugin inline igualmente, e envia apenas osheadersdesse arquivo. - Configurações gerenciadas bloqueiam o comando: definir
disableCommandPluginSourcescomotruebloqueia comandosheadersHelper, eallowManagedHooksOnlytambém os bloqueia a menos quedisableCommandPluginSourcesseja explicitamentefalse. Sob qualquer bloqueio, Claude Code ainda executa o comando para um marketplace que as próprias configurações gerenciadas declaram.
Como usuários aceitam um comando headersHelper
Um usuário aceita o comando de uma entrada de plugin cada vez que instala ou atualiza esse plugin sozinho, a partir da própria visualização do plugin em /plugin ou com claude plugin install ou claude plugin update. Claude Code mostra o comando e a URL do arquivo, e executa o comando apenas após o usuário aceitar.
Em um shell não-interativo, passe --yes para aceitar o comando. Para aceitar apenas o comando que uma execução anterior com --json exibiu, passe --accept-command com o sha256 que a execução relatou.
Claude Code executa apenas o comando que mostrou, para a URL do arquivo que mostrou. Se o comando ou URL do arquivo da entrada mudou entre, Claude Code recusa a instalação ou atualização. Uma mudança apenas na string de consulta não conta.
Instalações e atualizações que recusam o comando em vez de perguntar
Em qualquer operação que não seja uma instalação ou atualização de um único plugin, Claude Code não executa o comando de uma entrada nem baixa seu arquivo, então o plugin permanece em sua versão instalada ou permanece desinstalado. O que o usuário vê depende da operação:
- Instalando vários plugins de uma vez, de uma sugestão de plugin ou como dependência de outro plugin: Claude Code recusa o plugin que tem o comando e aponta o usuário para a própria visualização desse plugin em
/plugin. Os outros plugins em uma instalação em massa ainda instalam. Um plugin que depende do plugin recusado falha ao instalar até o usuário instalar o plugin recusado sozinho. - Atualização automática em segundo plano, ou início de sessão para um plugin cujo arquivo nunca foi baixado: Claude Code lista o plugin na aba Erros de
/pluginpara que o usuário saiba instalá-lo ou atualizá-lo manualmente. Uma atualização automática que encontra a entrada ainda anuncia a versão instalada lista nada.
Quando o comando de uma fonte `url` de marketplace é executado
Um headersHelper de fonte url de marketplace é declarado em um arquivo de configurações, como uma entrada extraKnownMarketplaces, em vez de no catálogo que o marketplace publica, então Claude Code não pede ao usuário para aceitá-lo em cada instalação ou atualização. O arquivo de configurações que o declara decide quando Claude Code o executa:
| Arquivo de configurações | Quando Claude Code executa o comando |
|---|---|
Configurações de usuário, um arquivo --settings ou um arquivo de configurações gerenciadas na máquina |
Sem perguntar, incluindo durante uma atualização de marketplace em segundo plano |
Um .claude/settings.json ou .claude/settings.local.json de um projeto |
Apenas após o usuário aceitar o diálogo de confiança de workspace para essa pasta em si. Uma sessão -p ou SDK não conta como aceitá-lo, e nem a confiança concedida a uma pasta pai |
| Configurações gerenciadas pelo servidor | Apenas após o usuário aprovar as configurações entregues no diálogo de aprovação de segurança |
Em uma sessão -p ou SDK, Claude Code não pode mostrar o diálogo de aprovação de segurança. Ele aplica as outras configurações entregues, mas a busca de marketplace e qualquer download de arquivo que precise do comando falha até um usuário ter aprovado em uma sessão interativa.
Para uma entrada de plugin inline em um desses arquivos, Claude Code requer a mesma confiança de pasta ou aprovação de configurações que para um comando de nível de marketplace nesse arquivo, e o usuário também aceita o comando da entrada em cada instalação ou atualização.
Fontes de comando
Use command quando uma ferramenta instalada localmente produz o diretório de plugin, como um IDE que renderiza seu plugin para a cadeia de ferramentas atualmente selecionada. Claude Code executa o comando quando o usuário instala o plugin e o re-executa em segundo plano uma vez por sessão, então seus usuários captam a saída alterada da ferramenta sem reinstalar. Requer Claude Code v2.1.229 ou posterior. Na v2.1.120 até v2.1.228, a instalação do plugin falha com This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again., e em versões mais antigas o marketplace inteiro falha ao carregar.
Esta entrada instala o plugin de qualquer diretório que a ferramenta imprime:
{
"name": "my-plugin",
"source": {
"source": "command",
"command": "my-tool claude-plugin-path"
}
}
Claude Code executa o comando através do shell da plataforma, sh em macOS e Linux ou cmd.exe no Windows, a partir do diretório inicial do usuário. O comando deve imprimir exatamente uma linha em stdout e sair com código 0. Essa linha é o caminho absoluto de um diretório que contém o plugin completo no momento em que o comando sai, e o caminho pode mudar entre execuções.
Claude Code para um comando que executa mais tempo que timeout segundos, e a instalação ou atualização falha. Claude Code também recusa o caminho impresso nestas situações, e a instalação ou atualização falha da mesma forma:
- O diretório não tem conteúdo de plugin em seu nível superior, como um diretório
.claude-plugin/ou um diretórioskills/,commands/,agents/ouhooks/ - O diretório é aquele em que Claude Code foi iniciado, ou um de seus pais
- No Windows, o caminho é um caminho UNC
As fontes de comando aceitam estes campos:
| Campo | Tipo | Descrição |
|---|---|---|
command |
string | Obrigatório. Comando shell que imprime o caminho absoluto do diretório de plugin como uma única linha em stdout e sai com 0. Deve ser ASCII imprimível, no máximo 500 caracteres, sem execuções de quatro ou mais espaços, para que os usuários possam revisar o comando inteiro que são solicitados a aceitar |
timeout |
number | Opcional. Número inteiro de segundos para esperar pelo comando antes de desistir (padrão: 60, máximo: 600) |
mode |
string | Opcional. "copy" (padrão) copia o diretório impresso para o cache de plugin. "link" usa o diretório impresso no lugar. Veja Modo de cópia e modo de link |
Modo de cópia e modo de link
Com o padrão "mode": "copy", Claude Code copia o diretório impresso para o cache de plugin versionado e deriva a versão do plugin de um hash do conteúdo do diretório. Sua ferramenta pode deletar ou reescrever o diretório após o comando sair, e uma re-execução que produz conteúdo idêntico conta como atualizado. Claude Code recusa instalar um diretório maior que 256 MiB ou contendo mais de 20.000 entradas.
Defina "mode": "link" para diretórios de plugin grandes que não devem ser copiados, como uma exportação de SDK renderizada. Claude Code preenche a entrada de cache do plugin com um link para cada entrada de nível superior do diretório impresso e usa os arquivos no lugar, então nada é copiado, conteúdos de arquivo não são hash, e os limites de tamanho não se aplicam. A instalação falha se uma entrada de nível superior é um symlink que aponta para fora do diretório impresso. Claude Code também pula a instalação de dependência de pacote Node.js para um plugin em modo link, então imprima um diretório que já contém qualquer node_modules que o plugin precisa.
Mantenha o diretório impresso no lugar enquanto o plugin permanecer instalado, porque Claude Code carrega o plugin através desses links em cada inicialização. Claude Code deriva a versão do plugin do caminho real do diretório impresso e suas entradas de nível superior, não dos arquivos dentro, então imprima um caminho diferente para sinalizar novo conteúdo. Em uma sessão iniciada no diretório impresso ou em qualquer lugar abaixo dele, Claude Code não carrega o plugin.
Claude Code não suporta modo link no Windows e recusa instalar um plugin em modo link lá. Declare "mode": "copy" em vez disso.
Como usuários aceitam o comando
Claude Code executa seu comando na máquina do usuário, então vincula cada execução à aceitação explícita do usuário:
- Quando os usuários instalam o plugin a partir de sua tela de detalhes em
/plugin, ou instalam ou atualizam comclaude plugin installouclaude plugin updateem um terminal interativo, Claude Code mostra a eles a string de comando exato primeiro e registra o comando aceito para essa instalação. Umclaude plugin updateque pode prosseguir na aceitação registrada do mesmo comando mostra nada. - Em um shell não-interativo, como um script de provisionamento, passe
--yesparaclaude plugin installouclaude plugin updatepara aceitar o comando que imprime. Para aceitar apenas o comando que uma execução anterior com--jsonexibiu, passe--accept-commandcom osha256que a execução relatou. - Cada outro caminho executa apenas o comando que o usuário já aceitou. Isso inclui atualizações iniciadas de
/plugine as execuções em segundo plano descritas em Quando Claude Code re-executa o comando. Quando nenhum foi aceito, Claude Code recusa executar o comando e diz ao usuário como revisar. Claude Code nunca instala um plugin com fonte de comando como dependência de outro plugin, então os usuários o instalam sozinhos primeiro. - Se você alterar o
commandda entrada, ou alternar seumode, os usuários mantêm a versão que já têm e Claude Code para de re-executar o comando. Em sessões interativas, a aba Erros de/pluginmostra o novo comando até o usuário revisar e aceitar executandoclaude plugin update <plugin>@<marketplace>.
Administradores podem bloquear fontes de comando em toda uma organização com a configuração gerenciada disableCommandPluginSources. Se uma organização definir allowManagedHooksOnly, Claude Code bloqueia fontes de comando por padrão.
Quando Claude Code re-executa o comando
O diretório impresso reflete o estado da ferramenta no momento em que o comando foi executado, então Claude Code executa o comando novamente nestes momentos:
- Cada vez que o usuário instala ou atualiza o plugin
- Uma vez por sessão para cada plugin com fonte de comando habilitado, em segundo plano, pouco após a sessão iniciar. Esta execução não passa pela atualização automática de marketplace, então não depende da configuração de atualização automática do marketplace
- Na inicialização ou em
/reload-plugins, quando a versão instalada de um plugin habilitado está faltando do cache de plugin
Claude Code pula as duas execuções em segundo plano quando o usuário define CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC. Instalações e atualizações explícitas ainda executam o comando com essa variável definida.
Quando a saída hash do comando mudou, Claude Code instala o resultado como uma nova versão e o recarrega na sessão interativa em execução, alternando os mesmos componentes que /reload-plugins alterna. O usuário vê uma notificação de que o plugin foi recarregado. Se recarregar no lugar invalidaria o cache de prompt da sessão, Claude Code em vez disso solicita ao usuário executar /reload-plugins, que avisa sobre o custo do cache e se aplica quando re-executado com --force.
Entradas de plugin avançadas
Este exemplo mostra uma entrada de plugin usando muitos dos campos opcionais, incluindo caminhos personalizados para commands, agents, hooks e MCP servers:
{
"name": "enterprise-tools",
"source": {
"source": "github",
"repo": "company/enterprise-plugin"
},
"description": "Ferramentas de automação de fluxo de trabalho empresarial",
"version": "2.1.0",
"author": {
"name": "Enterprise Team",
"email": "enterprise@example.com"
},
"homepage": "https://docs.example.com/plugins/enterprise-tools",
"repository": "https://github.com/company/enterprise-plugin",
"license": "MIT",
"keywords": ["enterprise", "workflow", "automation"],
"category": "productivity",
"commands": [
"./commands/core/",
"./commands/enterprise/",
"./commands/experimental/preview.md"
],
"agents": ["./agents/security-reviewer.md", "./agents/compliance-checker.md"],
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"
}
]
}
]
},
"mcpServers": {
"enterprise-db": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"]
}
},
"strict": false
}
Coisas importantes a notar:
commandseagents: você pode especificar múltiplos diretórios ou arquivos individuais. Os caminhos são relativos à raiz do plugin e devem permanecer dentro dela.- Claude Code rejeita um caminho que se resolve fora do diretório de plugin, como
./../shared.md, com um erropath escapes plugin directory, e ainda carrega o plugin sem esse componente
- Claude Code rejeita um caminho que se resolve fora do diretório de plugin, como
${CLAUDE_PLUGIN_ROOT}: use esta variável em comandos de hook e configurações de MCP server para referenciar arquivos dentro do diretório de instalação do plugin.- Veja a tabela de substituição para quais campos de configuração a substituem por tipo de servidor
- Para dependências ou estado que devem sobreviver a atualizações de plugin, use
${CLAUDE_PLUGIN_DATA}em vez disso
strict: false: como isso está definido como false, o plugin não precisa de seu próprioplugin.json. A entrada de marketplace define tudo. Veja Strict mode abaixo.
Por padrão, as skills de um plugin são carregadas do diretório skills/ sob sua source. Os caminhos listados no campo skills adicionam a essa varredura:
"skills": ["./skills/", "./extra-skills/"]
Quando várias entradas de plugin compartilham uma pasta skills/ na raiz do marketplace (source: "./"), liste subdiretórios específicos em vez disso para que cada entrada carregue apenas suas próprias skills:
"source": "./",
"skills": ["./skills/code-review", "./skills/docs"]
Com uma source de raiz de marketplace, os caminhos listados são o conjunto completo para essa entrada, e outros diretórios na pasta skills/ compartilhada não são carregados. Listar ./skills/ em si, ou a raiz do plugin, mantém a varredura completa. Se nenhum dos caminhos listados existir, a varredura padrão é executada em vez disso.
Strict mode
O campo strict controla se plugin.json é a autoridade para definições de componentes (skills, agents, hooks, MCP servers, output styles).
| Valor | Comportamento |
|---|---|
true (padrão) |
plugin.json é a autoridade. A entrada de marketplace pode complementá-lo com componentes adicionais, e ambas as fontes são mescladas. |
false |
A entrada de marketplace é a definição completa. Se o plugin também tem um plugin.json que declara componentes, isso é um conflito e o plugin falha ao carregar. |
Quando usar cada modo:
strict: true: o plugin tem seu próprioplugin.jsone gerencia seus próprios componentes. A entrada de marketplace pode adicionar skills ou hooks extras no topo. Este é o padrão e funciona para a maioria dos plugins.strict: false: o operador do marketplace quer controle total. O repositório do plugin fornece arquivos brutos, e a entrada de marketplace define quais desses arquivos são expostos como skills, agents, hooks, etc. Útil quando o marketplace reestrutura ou curada os componentes de um plugin de forma diferente do que o autor do plugin pretendia.
Hospedar e distribuir marketplaces
Quando os usuários adicionam um marketplace hospedado em um repositório git, ou instalam um plugin baseado em git que ele lista, Claude Code clona esse repositório de marketplace ou plugin na máquina deles. O clone nunca baixa conteúdo de Git LFS, então arquivos rastreados por LFS chegam como arquivos de ponteiro. Mantenha os arquivos que seus plugins precisam fora do LFS.
Hospedar no GitHub (recomendado)
GitHub é a forma recomendada para hospedar e distribuir um marketplace:
- Criar um repositório: configure um novo repositório para seu marketplace
- Adicionar arquivo de marketplace: crie
.claude-plugin/marketplace.jsoncom suas definições de plugin - Compartilhar com equipes: os usuários adicionam seu marketplace com
/plugin marketplace add owner/repo
Benefícios: controle de versão integrado, rastreamento de problemas e recursos de colaboração em equipe.
Hospedar em outros serviços git
Qualquer serviço de hospedagem git funciona, como GitLab, Bitbucket e servidores auto-hospedados. Os usuários adicionam com a URL completa do repositório:
/plugin marketplace add https://gitlab.com/company/plugins.git
Repositórios privados
Claude Code suporta instalar plugins de repositórios privados. Se você distribuir seu marketplace através de Organization settings > Plugins em vez disso, suas credenciais git não estão envolvidas: a sincronização da organização lê o repositório de marketplace através da conexão da sua organização no GitHub ou GitLab em claude.ai. Veja Distribuir através de configurações de organização para quais fontes de plugin podem ser privadas.
Comandos que você executa
Quando você executa /plugin marketplace add, /plugin install, /plugin update ou /plugin marketplace update, Claude Code usa seus ajudantes de credencial git existentes, então acesso HTTPS via gh auth login, Keychain do macOS ou git-credential-store funciona da mesma forma que em seu terminal. Acesso SSH funciona desde que o host já esteja em seu arquivo known_hosts e a chave esteja carregada em ssh-agent, já que Claude Code suprime prompts SSH interativos para a impressão digital do host e passphrase da chave. O atalho owner/repo do GitHub clona por SSH por padrão; defina CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 para cloná-los via HTTPS em vez disso.
Atualizações automáticas em segundo plano
A verificação de atualização em segundo plano verifica o remoto do marketplace para novos commits com seus ajudantes de credencial git configurados, da mesma forma que os comandos que você executa. Para remotos SSH, uma chave carregada em ssh-agent autentica a verificação. Claude Code executa a verificação de forma não-interativa: desativa prompts de terminal do git e programas askpass, e diz aos ajudantes de credencial para não solicitar. Se a verificação pode autenticar em um repositório privado via HTTPS depende do seu ajudante:
- Um ajudante que pode fornecer uma credencial armazenada sem solicitar autentica a verificação. Git Credential Manager, o ajudante Keychain do macOS e
git-credential-storefuncionam dessa forma uma vez que mantêm uma credencial para o host. - Um ajudante que precisa solicitá-lo não consegue responder em segundo plano. A atualização falha silenciosamente e o checkout existente permanece no lugar, então seus plugins continuam funcionando a partir do último estado sincronizado. Execute
/plugin marketplace update <name>para atualizar o marketplace com suas credenciais.
Quando a verificação encontra o checkout atualizado, Claude Code o deixa como está. Quando a verificação encontra novos commits, ou falha porque não consegue alcançar ou autenticar no remoto, Claude Code clona o marketplace novamente e troca o novo clone. Se esse clone falhar, o checkout existente permanece no lugar. O re-clone pode expirar em repositórios grandes.
Duas configurações fazem marketplaces privados se comportarem de forma previsível:
- Defina
CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1para manter o checkout existente sem tentar o re-clone quando a verificação em segundo plano não consegue alcançar ou autenticar no remoto. Seus plugins continuam funcionando a partir do último estado sincronizado, e atualizações manuais com/plugin marketplace updateainda autenticam com suas credenciais. - Configure um ajudante de credencial git, por exemplo com
gh auth setup-gitpara GitHub, para que a verificação em segundo plano e o re-clone possam autenticar sem solicitar.
Definir um token de provedor como GITHUB_TOKEN em seu ambiente não habilita autenticação em segundo plano por si só. Tokens têm efeito apenas através de um ajudante de credencial configurado, por exemplo o ajudante CLI gh, que lê GH_TOKEN e GITHUB_TOKEN.
Em ambientes CI/CD, configure um ajudante de credencial git antes de instalar plugins de repositórios privados. No GitHub Actions, exporte um token com acesso de leitura ao repositório de marketplace como GH_TOKEN, depois execute gh auth setup-git. O token de workflow padrão pode apenas acessar o repositório do próprio workflow, então um marketplace privado em outro repositório precisa de um token de acesso pessoal ou token de app.
Distribuir através de configurações de organização
Se você distribuir plugins através de Organization settings > Plugins em um plano Team ou Enterprise, estas regras de fonte se aplicam:
- No github.com e gitlab.com, o repositório de marketplace deve ser privado ou interno. A sincronização da organização lê o repositório através da conexão que corresponde ao seu host:
- github.com: o Claude GitHub App
- Seu host GitHub Enterprise Server: o GitHub Enterprise App da sua organização
- gitlab.com ou sua instância GitLab auto-gerenciada: o token de acesso na configuração GitLab da sua organização para esse host
- Cada fonte de plugin deve ser do tipo
github,urlougit-subdir, ou um caminho relativo que comece com./. Se você listar um plugin por nome simples sobmetadata.pluginRoot, a sincronização da organização o rejeita como uma fonte não suportada, então escreva o caminho, como./plugins/deploy-tools. - Uma fonte de plugin pode ser privada em três casos:
- Uma fonte github.com que compartilha o proprietário do repositório de marketplace
- Uma fonte no host GitHub Enterprise da sua organização com o GHE App instalado no repositório
- Uma fonte
urlougit-subdirno mesmo host GitLab que o repositório de marketplace. No gitlab.com, a fonte também deve estar sob o mesmo namespace de grupo de nível superior ou usuário que o repositório de marketplace.
- Qualquer outra fonte de plugin deve ser um repositório público no github.com, gitlab.com ou bitbucket.org, que a sincronização da organização busca sem credenciais. A sincronização da organização rejeita fontes de plugin em hosts que essas regras não cobrem.
Veja Manage plugins for your organization para o fluxo de trabalho do administrador.
Para incluir plugins privados, coloque as pastas de plugin dentro do repositório de marketplace e as referencie com um caminho relativo. A sincronização da organização empacota cada plugin durante a distribuição, então os usuários nunca precisam de acesso a um repositório de fonte separado.
Por exemplo, esta entrada de plugin marketplace.json referencia um plugin que você confirmou em plugins/deploy-tools no repositório de marketplace:
{
"name": "deploy-tools",
"source": "./plugins/deploy-tools"
}
Sincronizar um marketplace hospedado no GitLab
Para sincronizar um marketplace do gitlab.com ou de uma instância GitLab auto-gerenciada, um Owner primeiro adiciona uma configuração GitLab para esse host em Organization settings > Claude Code. As configurações GitLab estão em beta público e se aplicam apenas à sincronização de marketplace de plugin. Adicionar uma não torna repositórios GitLab disponíveis em Claude Code na web. Veja Manage plugins for your organization para as etapas de configuração.
Quando você adiciona o marketplace, insira a URL HTTPS do projeto, como https://gitlab.example.com/platform/claude-plugins. Projetos em subgrupos aninhados funcionam. A sincronização da organização lê o branch padrão do projeto. Se você ativar Sync automatically, apenas pushes para o branch padrão iniciam uma sincronização.
Manter executáveis fora do diretório bin de nível superior
Não inclua um diretório bin/ de nível superior em nenhum plugin que você distribua através de configurações de organização. claude.ai rejeita um plugin que tenha um, seja o plugin chegue por sincronização de marketplace ou por upload direto:
- Sincronização de marketplace: a sincronização da organização rejeita esse plugin e sincroniza o resto do marketplace. A mensagem de erro começa com
Plugin contains a top-level bin/ directory. - Upload direto: se você fizer upload do plugin em Organization settings > Plugins em vez disso, claude.ai rejeita o upload com a mesma mensagem.
Mantenha executáveis em outro diretório, como scripts/, e os referencie como ${CLAUDE_PLUGIN_ROOT}/scripts/<name> a partir de suas skills, hooks ou configurações de servidor MCP.
Exigir marketplaces para sua equipe
Você pode configurar seu repositório para que Claude Code adicione seu marketplace para membros da equipe uma vez que eles confiem na pasta do projeto, sem nenhum prompt separado. Adicione seu marketplace a .claude/settings.json:
{
"extraKnownMarketplaces": {
"company-tools": {
"source": {
"source": "github",
"repo": "your-org/claude-plugins"
}
}
}
}
Você também pode especificar quais plugins devem ser habilitados por padrão:
{
"enabledPlugins": {
"code-formatter@company-tools": true,
"deployment-tools@company-tools": true
}
}
Para opções de configuração completas, veja Plugin settings.
Se você usar uma fonte local directory ou file com um caminho relativo, o caminho é resolvido contra o checkout principal do seu repositório. Quando você executa Claude Code de um git worktree, o caminho ainda aponta para o checkout principal, então todos os worktrees compartilham o mesmo local de marketplace. O estado do marketplace é armazenado uma vez por usuário em ~/.claude/plugins/known_marketplaces.json, não por projeto.
Pré-popular plugins para containers
Para imagens de container e ambientes CI, você pode pré-popular um diretório de plugins no tempo de construção para que Claude Code inicie com marketplaces e plugins já disponíveis, sem clonar nada em tempo de execução. Defina a variável de ambiente CLAUDE_CODE_PLUGIN_SEED_DIR para apontar para este diretório.
Para colocar em camadas múltiplos diretórios seed, separe caminhos com : em Unix ou ; no Windows. Claude Code procura cada diretório em ordem e usa o primeiro seed que contém um determinado marketplace ou cache de plugin.
O diretório seed espelha a estrutura de ~/.claude/plugins:
$CLAUDE_CODE_PLUGIN_SEED_DIR/
known_marketplaces.json
marketplaces/<name>/...
cache/<marketplace>/<plugin>/<version>/...
Para construir um diretório seed, execute Claude Code uma vez durante a construção da imagem, instale os plugins que você precisa, depois copie o diretório ~/.claude/plugins resultante em sua imagem e aponte CLAUDE_CODE_PLUGIN_SEED_DIR para ele.
Para pular a etapa de cópia, defina CLAUDE_CODE_PLUGIN_CACHE_DIR para seu caminho de seed de destino durante a construção para que os plugins sejam instalados diretamente lá:
CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin marketplace add your-org/plugins
CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin install my-tool@your-plugins
Então defina CLAUDE_CODE_PLUGIN_SEED_DIR=/opt/claude-seed no ambiente de tempo de execução do seu container para que Claude Code leia do seed na inicialização.
Na inicialização, Claude Code registra marketplaces encontrados no known_marketplaces.json do seed na configuração primária, e usa caches de plugin encontrados sob cache/ no local sem re-clonar. Isso funciona tanto em modo interativo quanto em modo não-interativo com a flag -p.
Detalhes de comportamento:
- Somente leitura: Claude Code nunca escreve no diretório seed.
- Auto-updates desabilitadas: marketplaces seed não auto-atualizam.
- Entradas seed têm precedência: marketplaces declarados no seed sobrescrevem qualquer entrada correspondente na configuração do usuário em cada inicialização. Para optar por não usar um plugin seed, use
/plugin disableem vez de remover o marketplace. - Resolução de caminho: Claude Code localiza conteúdo de marketplace sondando
$CLAUDE_CODE_PLUGIN_SEED_DIR/marketplaces/<name>/em tempo de execução, não confiando em caminhos armazenados dentro do JSON do seed. Isso significa que o seed funciona corretamente mesmo quando montado em um caminho diferente de onde foi construído. - Mutação é bloqueada: executar
/plugin marketplace removeou/plugin marketplace updatecontra um marketplace gerenciado por seed falha com orientação para pedir ao seu administrador para atualizar a imagem seed. - Compõe com configurações: se
extraKnownMarketplacesouenabledPluginsdeclaram um marketplace que já existe no seed, Claude Code usa a cópia do seed em vez de clonar.
Restrições de marketplace gerenciado
Para organizações que exigem controle rigoroso sobre fontes de plugin, administradores podem restringir quais marketplaces de plugin os usuários podem adicionar usando a configuração strictKnownMarketplaces em configurações gerenciadas. Para também rejeitar as flags CLI que carregam plugins, agentes e servidores MCP para uma única execução, combine com disableSideloadFlags. Para criar uma lista de permissões de quais plugins de marketplaces podem aparecer como sugestões de instalação contextual, defina pluginSuggestionMarketplaces.
strictKnownMarketplaces corresponde ao marketplace de onde um plugin vem, não às entradas dentro dele, então os usuários ainda podem instalar um plugin com uma fonte command de um marketplace permitido. Para bloquear fontes de comando também, defina disableCommandPluginSources.
Quando strictKnownMarketplaces é configurado em configurações gerenciadas, o comportamento de restrição depende do valor:
| Valor | Comportamento |
|---|---|
| Indefinido (padrão) | Sem restrições. Os usuários podem adicionar qualquer marketplace |
Array vazio [] |
Bloqueio completo. Bloqueia todas as fontes de marketplace, incluindo o marketplace oficial da Anthropic |
| Lista de fontes | Lista de permissões aplicada. Os usuários podem adicionar apenas marketplaces que correspondem a uma entrada |
Configurações comuns
Desabilitar todas as adições de marketplace, incluindo o marketplace oficial da Anthropic:
{
"strictKnownMarketplaces": []
}
Claude Code baixa os plugins sincronizados do claude.ai da sua conta em vez de um marketplace, então esse bloqueio não os cobre. Para parar também, defina syncClaudeAiPlugins como false em configurações gerenciadas, ou desative Skills para sua organização em claude.ai.
Permitir apenas o marketplace oficial da Anthropic. A correspondência para uma entrada de repositório único é exata, então esta entrada não cobre variantes ref ou path do mesmo repositório:
{
"strictKnownMarketplaces": [
{
"source": "github",
"repo": "anthropics/claude-plugins-official"
}
]
}
Com esta entrada, Claude Code mantém um marketplace oficial já registrado disponível e, em uma máquina nova, registra o marketplace automaticamente na primeira vez que você inicia Claude Code interativamente.
O registro automático não cobre todas as máquinas. Ele mais comumente perde:
- Ambientes não-interativos que executam antes do primeiro lançamento interativo da máquina.
- Máquinas onde Claude Code já foi executado interativamente sob uma política que bloqueou o marketplace, como o bloqueio de array vazio. Claude Code registra a tentativa bloqueada e não tenta novamente após a política mudar.
Nessas máquinas, adicione o marketplace a extraKnownMarketplaces no mesmo managed-settings.json para que Claude Code o registre automaticamente, ou execute claude plugin marketplace add anthropics/claude-plugins-official.
Permitir apenas marketplaces específicos:
{
"strictKnownMarketplaces": [
{
"source": "github",
"repo": "acme-corp/approved-plugins"
},
{
"source": "github",
"repo": "acme-corp/security-tools",
"ref": "v2.0"
},
{
"source": "url",
"url": "https://plugins.example.com/marketplace.json"
}
]
}
Permitir todos os repositórios de marketplace sob uma organização GitHub com uma entrada owner-wildcard. Owner wildcards requerem Claude Code v2.1.223 ou posterior.
{
"strictKnownMarketplaces": [
{
"source": "github",
"repo": "acme-corp/*"
}
]
}
Permitir todos os marketplaces de um servidor git interno usando correspondência de padrão regex no host. Esta é a abordagem recomendada para GitHub Enterprise Server ou instâncias GitLab auto-hospedadas:
{
"strictKnownMarketplaces": [
{
"source": "hostPattern",
"hostPattern": "^github\\.example\\.com$"
}
]
}
Permitir marketplaces baseados em sistema de arquivos de um diretório específico usando correspondência de padrão regex no caminho:
{
"strictKnownMarketplaces": [
{
"source": "pathPattern",
"pathPattern": "^/opt/approved/"
}
]
}
Use ".*" como pathPattern para permitir qualquer caminho de sistema de arquivos enquanto ainda controla fontes de rede com hostPattern.
strictKnownMarketplaces restringe o que os usuários podem adicionar, mas não registra marketplaces por conta própria. Para registrar um marketplace permitido para usuários automaticamente, adicione-o a extraKnownMarketplaces no mesmo managed-settings.json.
O marketplace oficial da Anthropic é o único que Claude Code registra por conta própria, e apenas quando a lista de permissões o permite. O registro automático também perde algumas máquinas, como ambientes não-interativos e máquinas onde uma política anterior o bloqueou. Para cobrir essas máquinas, adicione o marketplace oficial a extraKnownMarketplaces também. Para os dois ajustes lado a lado, veja a referência strictKnownMarketplaces.
Como as restrições funcionam
As restrições são verificadas antes de qualquer operação de rede ou sistema de arquivos. A verificação é executada na adição de marketplace e na instalação, atualização, atualização e auto-atualização de plugin. Se um marketplace foi adicionado antes da política ser configurada e sua fonte não corresponder mais à lista de permissões, Claude Code recusa instalar ou atualizar plugins a partir dele. A mesma aplicação se aplica a blockedMarketplaces.
Onde as duas listas são aplicadas depende de onde você as define:
- O console de administração claude.ai: Claude Code aplica ambas as listas nas sessões que leem configurações gerenciadas pelo servidor. claude.ai também as verifica quando qualquer pessoa em sua organização adiciona um novo marketplace de um repositório git em claude.ai, ou de Customize no aplicativo Claude Desktop fora de sua aba Code. Isso cobre um marketplace que um membro adiciona para sua própria conta e um adicionado para toda a organização em Organization settings > Plugins. claude.ai recusa um repositório que a lista de permissões não admite ou que a lista de bloqueio nomeia. Ele não re-verifica um marketplace que foi adicionado em qualquer lugar antes de você definir as listas, e não verifica plugins enviados.
- Um arquivo de configurações gerenciadas, política de nível do SO ou outra fonte gerenciada: Claude Code aplica ambas as listas onde lê essa fonte. claude.ai não a lê.
Para bloquear todos os repositórios de marketplace sob um proprietário GitHub, use a forma owner-wildcard em uma entrada blockedMarketplaces: { "source": "github", "repo": "untrusted-org/*" }. Requer Claude Code v2.1.223 ou posterior. Para as regras de correspondência, que diferem entre a lista de bloqueio e a lista de permissões, veja Owner wildcards.
Quando um usuário adiciona uma URL de repositório https:// que Claude Code clona em vez de buscar, como um repositório github.com ou gitlab.com simples, Claude Code também a verifica contra as entradas url em blockedMarketplaces. Claude Code bloqueia a adição se uma entrada nomeia a mesma URL. Nessa comparação, Claude Code ignora o sufixo .git e qualquer ref que o usuário acrescente após #. Requer Claude Code v2.1.232 ou posterior. Antes de v2.1.232, Claude Code correspondia a uma entrada url apenas contra uma URL que buscava como um arquivo marketplace.json hospedado.
A lista de permissões usa correspondência exata para a maioria dos tipos de fonte, além de entradas github com owner-wildcard. Para um marketplace ser permitido, todos os campos especificados devem corresponder:
- Para fontes GitHub:
repoé obrigatório, nomeando um repositório ou usando a forma owner-wildcardowner/*para cobrir todos os repositórios sob esse proprietário. Para como entradas wildcard correspondem, incluindo as regras de caso, veja Owner wildcards. Para entradas de repositório único,refdeve corresponder exatamente ou estar ausente tanto da fonte de marketplace quanto da entrada de lista de permissões, e a mesma regra se aplica apath - Para fontes de URL: a URL completa deve corresponder exatamente
- Para fontes
hostPattern: o host do marketplace é correspondido contra o padrão regex - Para fontes
pathPattern: o caminho do sistema de arquivos do marketplace é correspondido contra o padrão regex
A correspondência exata da lista de permissões trata URLs que diferem apenas por uma barra à direita, um sufixo .git ou o esquema ssh:// e https:// como valores diferentes. Se o marketplace da sua organização pode ser clonado por mais de uma forma de URL, prefira uma entrada hostPattern em vez de uma URL literal para que as formas https://, ssh:// e user@host:path todas correspondam.
Um marketplace hospedado em claude.ai é correspondido por host: uma entrada hostPattern que corresponde a claude.ai o governa, em strictKnownMarketplaces e em blockedMarketplaces. Na lista de permissões, tal entrada não admite uploads pessoais de claude.ai de um membro. Requer Claude Code v2.1.273 ou posterior.
Como strictKnownMarketplaces é definido em configurações gerenciadas, configurações individuais de usuários e projetos não podem substituir essas restrições.
Para detalhes de configuração completos incluindo todos os tipos de fonte suportados e comparação com extraKnownMarketplaces, veja a referência strictKnownMarketplaces.
Resolução de versão e canais de lançamento
As versões de plugin determinam caminhos de cache e detecção de atualização: se a versão resolvida corresponder ao que um usuário já tem, /plugin update e auto-atualização pulam o plugin. Para fontes baseadas em git, se você omitir version, Claude Code usa o SHA do commit resolvido da fonte, então os usuários recebem uma atualização sempre que esse commit muda; esta é a configuração mais simples para plugins internos ou em desenvolvimento ativo. Veja Version management para a ordem de resolução completa, incluindo fontes archive.
Definir version fixa o plugin para todos os tipos de fonte exceto command, cuja versão sempre inclui um hash do que o comando produziu. Um plugin carregado em lugar de um marketplace adicionado como um diretório local também não é fixado. Se você declarar "version": "1.0.0" em plugin.json e fazer push de novos commits sem alterar essa string, usuários existentes desses tipos de fonte mantêm a cópia em cache, porque Claude Code vê a mesma versão. Aumente o campo em cada lançamento, ou omita-o para usar a versão resolvida.
Evite definir version em ambos plugin.json e a entrada de marketplace. O valor plugin.json sempre vence silenciosamente, então uma versão de manifesto obsoleta pode mascarar uma versão que você definiu em marketplace.json.
Configurar canais de lançamento
Para suportar canais de lançamento "stable" e "latest" para seus plugins, você pode configurar dois marketplaces que apontam para diferentes refs ou SHAs do mesmo repositório. Você pode então atribuir cada grupo de usuários seu próprio marketplace através de configurações gerenciadas de uma de duas formas:
- Implante configurações gerenciadas gerenciadas por endpoint separadas, como um arquivo de configurações gerenciadas ou um perfil MDM, para os dispositivos de cada grupo. Como Claude Code combina fontes gerenciadas diz se o arquivo por grupo ou perfil se aplica em um dispositivo que também tem uma fonte em toda a organização.
- Defina uma política de gateway de aplicativos Claude por grupo. O gateway aplica a primeira política cuja regra de correspondência se encaixa em um usuário, então ordene as políticas para que cada usuário chegue à política do seu grupo. A
extraKnownMarketplacesde uma política de grupo substitui o mapa da política catch-all em vez de mesclar com ele, então liste todos os marketplaces que o grupo precisa na política do grupo, não apenas seu marketplace de canal.
Configurações gerenciadas pelo servidor do console de administração se aplicam a todos os usuários em sua organização, então não conseguem carregar uma atribuição por grupo.
Cada canal deve resolver para uma versão diferente. Se você usar versões explícitas, plugin.json deve declarar uma version diferente em cada ref fixado. Se você omitir version, os SHAs de commit distintos já distinguem os canais. Se dois refs resolverem para a mesma string de versão, Claude Code os trata como idênticos e pula a atualização.
Exemplo
{
"name": "stable-tools",
"plugins": [
{
"name": "code-formatter",
"source": {
"source": "github",
"repo": "acme-corp/code-formatter",
"ref": "stable"
}
}
]
}
{
"name": "latest-tools",
"plugins": [
{
"name": "code-formatter",
"source": {
"source": "github",
"repo": "acme-corp/code-formatter",
"ref": "latest"
}
}
]
}
Atribuir canais a grupos de usuários
Atribua cada marketplace ao seu grupo de usuários através das configurações gerenciadas por endpoint por grupo ou política de gateway descrita em Configurar canais de lançamento. Por exemplo, o grupo stable recebe:
{
"extraKnownMarketplaces": {
"stable-tools": {
"source": {
"source": "github",
"repo": "acme-corp/stable-tools"
}
}
}
}
O grupo early-access recebe latest-tools em vez disso:
{
"extraKnownMarketplaces": {
"latest-tools": {
"source": {
"source": "github",
"repo": "acme-corp/latest-tools"
}
}
}
}
Fixar versões de dependência
Um plugin pode restringir suas dependências a um intervalo semver para que atualizações de uma dependência não quebrem o plugin dependente. Veja Constrain plugin dependency versions para a convenção de git-tag {plugin-name}--v{version}, sintaxe de intervalo e como múltiplas restrições na mesma dependência são combinadas.
Renomear ou remover um plugin
O name de um plugin é seu identificador estável. Os usuários o referenciam em enabledPlugins, pluginConfigs e comandos /plugin install, então alterá-lo quebra cada instalação existente. Para alterar o rótulo mostrado na UI sem quebrar instalações, defina displayName e mantenha name inalterado.
Se você deve alterar o name de um plugin, ou remover um plugin do array plugins, adicione uma entrada de nível superior renames para que usuários existentes migrem em vez de ver um erro plugin-not-found. A migração automática requer Claude Code v2.1.193 ou posterior. Mapeie cada nome anterior para seu nome atual, ou para null se o plugin não existir mais. O exemplo a seguir renomeia formatter para code-formatter e registra que legacy-linter foi removido:
{
"name": "acme-tools",
"owner": { "name": "Acme" },
"plugins": [
{ "name": "code-formatter", "source": "./plugins/code-formatter" }
],
"renames": {
"formatter": "code-formatter",
"legacy-linter": null
}
}
Quando um usuário inicia Claude Code com o nome antigo ainda em suas configurações, Claude Code segue o mapa renames:
- Se a entrada aponta para um novo nome, Claude Code carrega o plugin sob seu novo nome e mostra um aviso de uma linha como
Renamed to "code-formatter" in the "acme-tools" marketplace. Ele então reescreve a chave antiga para a chave nova nos escopos de configurações do usuário, projeto e local para ambosenabledPluginsepluginConfigs, para que o aviso apareça uma vez. - Para uma entrada
null, Claude Code descarta a chave antiga e o aviso relata que o plugin foi removido do marketplace. - Se o plugin renomeado usa uma fonte remota como
githubounpm, Claude Code relataplugin-cache-missapós o renome e o usuário deve executar/plugin installuma vez para buscá-lo sob o novo nome.
Trate renames como histórico apenas para anexação: mantenha entradas antigas no lugar mesmo depois que você espera que cada usuário tenha migrado. Claude Code segue cadeias, então se você depois renomear code-formatter para formatter-pro, adicione uma segunda entrada em vez de editar a primeira. Um usuário que ainda tem o formatter original habilitado então resolve através de ambas as entradas para formatter-pro.
Execute claude plugin validate . após editar o mapa; ele rejeita qualquer entrada cuja cadeia forma um ciclo ou não termina em null ou um nome listado em plugins.
Configurações gerenciadas e de política são somente leitura para Claude Code, então plugins habilitados lá não podem ser reescritos automaticamente. O plugin renomeado ainda carrega cada sessão, mas o aviso de renome recorre até que um administrador atualize enabledPlugins no arquivo de configurações gerenciadas para usar o novo nome. O mesmo se aplica a plugins habilitados através de outras fontes somente leitura como --add-dir.
Versões anteriores de Claude Code ignoram o campo renames e relatam plugin-not-found para o nome antigo.
Validação e testes
Teste seu marketplace antes de compartilhar. A validação verifica a estrutura do arquivo; para testar se um plugin muda o que Claude faz em prompts realistas, execute seu conjunto de avaliação com claude plugin eval antes de publicar uma nova versão.
Do seu diretório de marketplace, valide a sintaxe JSON:
claude plugin validate .
Ou de dentro de Claude Code:
/plugin validate .
Adicione o marketplace para testes:
/plugin marketplace add ./path/to/marketplace
Instale um plugin de teste para verificar se tudo funciona:
/plugin install test-plugin@marketplace-name
Para fluxos de trabalho completos de testes de plugin, veja Testar seus plugins localmente. Para troubleshooting técnico, veja Plugins reference.
Gerenciar marketplaces a partir da CLI
Claude Code fornece subcomandos claude plugin marketplace não-interativos para scripting e automação. Estes são equivalentes aos comandos /plugin marketplace disponíveis dentro de uma sessão interativa.
Plugin marketplace add
Adicione um marketplace de um repositório GitHub, URL git, URL remota ou caminho local.
claude plugin marketplace add <source> [options]
Argumentos:
<source>: Atalho GitHubowner/repo, URL git, URL remota para um arquivomarketplace.jsonou caminho de diretório local. Para fixar a um branch ou tag, anexe@refao atalho GitHub ou#refa uma URL git
Uma URL deve incluir seu esquema. A partir de Claude Code v2.1.196, um host digitado sem um, como gitlab.example.com/team/plugins, é rejeitado como um atalho owner/repo inválido e o erro informa para adicionar https:// ou usar ./ para um caminho local. Versões anteriores o interpretavam como um caminho de repositório GitHub e falham no momento do clone com um erro de não encontrado do GitHub.
Opções:
| Opção | Descrição | Padrão |
|---|---|---|
--scope <scope> |
Onde declarar o marketplace: user, project ou local. Veja Plugin installation scopes |
user |
--sparse <paths...> |
Limitar checkout a diretórios específicos via git sparse-checkout. Útil para monorepos | |
--claudeai |
Leia o argumento como o nome de um marketplace hospedado em claude.ai em vez de uma fonte. Requer Claude Code v2.1.273 ou posterior |
Adicione um marketplace do GitHub usando atalho owner/repo:
claude plugin marketplace add acme-corp/claude-plugins
Fixe a um branch ou tag específico com @ref:
claude plugin marketplace add acme-corp/claude-plugins@v2.0
Adicione de uma URL git em um host não-GitHub:
claude plugin marketplace add https://gitlab.example.com/team/plugins.git
Adicione de uma URL remota que serve o arquivo marketplace.json diretamente:
claude plugin marketplace add https://example.com/marketplace.json
Adicione de um diretório local para testes:
claude plugin marketplace add ./my-marketplace
Declare o marketplace no escopo do projeto para que seja compartilhado com sua equipe via .claude/settings.json:
claude plugin marketplace add acme-corp/claude-plugins --scope project
Para um monorepo, limite o checkout aos diretórios que contêm conteúdo de plugin:
claude plugin marketplace add acme-corp/monorepo --sparse .claude-plugin plugins
Adicione um marketplace hospedado em claude.ai pelo nome impresso na seção From claude.ai: de claude plugin marketplace list:
claude plugin marketplace add --claudeai claudeai-organization-library
Com --claudeai, o comando recusa --scope e --sparse. O marketplace é hospedado para sua conta, não declarado em um arquivo de configurações, portanto você não pode compartilhá-lo através do .claude/settings.json de um projeto.
Plugin marketplace list
Liste todos os marketplaces configurados.
claude plugin marketplace list [options]
Opções:
| Opção | Descrição |
|---|---|
--json |
Saída como JSON |
Com --json, cada entrada inclui name, source, um campo installLocation com o caminho do cache local onde o marketplace é armazenado, e campos específicos da fonte: repo para fontes GitHub, url para fontes git e URL, e path para fontes locais. Fontes GitHub e git também incluem um campo ref quando o marketplace foi adicionado com um branch ou tag fixado.
Um marketplace claude.ai adicionado não tem um clone local, portanto sua entrada carrega seus identificadores claude.ai, marketplaceId e organizationUuid, no lugar de installLocation.
Em sessões de terminal onde plugins sincronizam de sua conta claude.ai, a listagem de texto termina com uma seção From claude.ai: nomeando o que claude.ai lista para sua conta além dos marketplaces que você adicionou. Para adicionar um deles, veja Adicionar de claude.ai. A saída --json cobre apenas marketplaces configurados e deixa essa seção de fora. Requer Claude Code v2.1.273 ou posterior.
Plugin marketplace remove
Remova um marketplace configurado. O alias rm também é aceito.
claude plugin marketplace remove <name> [options]
Argumentos:
<name>: nome do marketplace a remover, conforme mostrado porclaude plugin marketplace list. Este é onamedemarketplace.json, não a fonte que você passou paraadd
Opções:
| Opção | Descrição | Padrão |
|---|---|---|
--scope <scope> |
Restringir remoção a um único escopo de configurações: user, project ou local. Veja Plugin installation scopes. Quando omitido, a declaração é removida de cada escopo editável. Quando fornecido, apenas a declaração desse escopo é removida; o estado compartilhado, cache e dados de plugin instalado são preservados quando o marketplace ainda está declarado em outro escopo |
(todos os escopos) |
Remover um marketplace de seu último escopo restante também desinstala qualquer plugin que você instalou dele. Para atualizar um marketplace sem perder plugins instalados, use claude plugin marketplace update em vez disso.
Plugin marketplace update
Atualize marketplaces de suas fontes para recuperar novos plugins e mudanças de versão. Um marketplace adicionado com um branch ou tag ref é atualizado para o commit mais recente dessa ref, não para o branch padrão do repositório.
claude plugin marketplace update [name]
Argumentos:
[name]: nome do marketplace a atualizar, conforme mostrado porclaude plugin marketplace list. Atualiza todos os marketplaces se omitido
Tanto remove quanto update falham quando executados contra um marketplace gerenciado por seed, que é somente leitura. Ao atualizar todos os marketplaces, entradas gerenciadas por seed são puladas e outros marketplaces ainda são atualizados. Para alterar plugins fornecidos por seed, peça ao seu administrador para atualizar a imagem seed. Veja Pré-popular plugins para containers.
Troubleshooting
Marketplace não carregando
Sintomas: Não consegue adicionar marketplace ou ver plugins dele
Soluções:
- Verifique se a URL do marketplace é acessível
- Verifique se
.claude-plugin/marketplace.jsonexiste no caminho especificado - Garanta que a sintaxe JSON é válida usando
claude plugin validate .ou/plugin validate .do diretório do marketplace. Para verificar o frontmatter de skill, agent e command, veja Validate a plugin or a directory without a manifest - Para repositórios privados, confirme que você tem permissões de acesso
Erros de validação de marketplace
Execute claude plugin validate . ou /plugin validate . do seu diretório de marketplace para verificar problemas. Quando apontado para um diretório de marketplace, o validador verifica marketplace.json para erros de schema, nomes de plugin duplicados e travessia de caminho de fonte. Para cada entrada cuja source é um caminho local, ele também valida o próprio plugin.json daquele plugin e avisa quando a version da entrada não corresponde à do plugin.json. Problemas encontrados no plugin.json de um plugin são prefixados com o índice da entrada, na forma plugins[2] plugin.json →.
A partir de Claude Code v2.1.196, a passagem por entrada também:
- inclui plugins cuja
sourceé. - executa quando
marketplace.jsonestá fora de um diretório.claude-plugin, resolvendo fontes contra o próprio diretório do arquivo - relata os problemas de cada entrada mesmo quando outra parte do arquivo tem erros de schema
Versões anteriores pulam plugins na raiz do marketplace e apenas descem de um .claude-plugin/marketplace.json.
Do diretório de um marketplace, Claude Code não abre os arquivos de skill, agent, command ou hook dos plugins. Para encontrar erros nesses arquivos, veja Validate a plugin or a directory without a manifest. A tabela abaixo lista os erros mais comuns de um diretório de marketplace, com a causa e correção para cada um:
| Erro | Causa | Solução |
|---|---|---|
No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json |
O diretório que você nomeou não tem .claude-plugin/marketplace.json ou plugin.json, e nenhum arquivo de skill, agent ou command para verificar |
Execute a partir da raiz do marketplace, ou crie .claude-plugin/marketplace.json com os campos obrigatórios |
Invalid JSON syntax: Unexpected token... |
Erro de sintaxe JSON em marketplace.json | Verifique vírgulas ausentes, vírgulas extras ou strings não citadas |
Duplicate plugin name "x" found in marketplace |
Dois plugins compartilham o mesmo nome | Dê a cada plugin um valor name único |
plugins[0].source: Path contains ".." |
Um segmento do caminho de fonte é .. |
Use caminhos relativos à raiz do marketplace sem segmentos ... Veja Relative paths |
Marketplace name cannot contain control or bidirectional-formatting characters |
O name do marketplace contém um caractere de formatação bidirecional Unicode ou um caractere de controle, como um escape ou uma quebra de linha |
Remova o caractere do nome. Antes de v2.1.247, esses caracteres produziam o erro Marketplace name impersonates an official Anthropic/Claude marketplace |
Plugin name cannot contain control or bidirectional-formatting characters |
Um name de plugin contém um caractere de formatação bidirecional Unicode ou um caractere de controle, como um escape ou uma quebra de linha |
Remova o caractere do nome. Antes de v2.1.247, Claude Code não executava essa verificação |
Avisos (não bloqueadores):
Marketplace has no plugins defined: adicione pelo menos um plugin ao arraypluginsNo marketplace description provided: adicione umadescriptionde nível superior para ajudar os usuários a entender seu marketplacePlugin name "x" is not kebab-case: renomeie para apenas letras minúsculas, dígitos e hífens (por exemplo,my-plugin). Claude Code aceita outras formas, mas a sincronização de marketplace do claude.ai as rejeita.Marketplace name "x" is reserved in Claude Desktop: o marketplace é nomeadoorg,org-provisionedouunknown, em qualquer casing. Claude Code aceita esses nomes, mas a sincronização de marketplace gerenciada do Claude Desktop rejeita o marketplace inteiro. Renomeie o marketplace. Antes de v2.1.221,claude plugin validatenão executava essa verificação.Marketplace name "x" is not accepted by Claude DesktopouPlugin name "x" is not accepted by Claude Desktop: Claude Desktop aceita nomes de até 128 caracteres feitos de letras, dígitos,.,_e-, começando com uma letra ou dígito. Claude Code aceita outras formas, mas a sincronização de marketplace gerenciada do Claude Desktop rejeita um marketplace cujo nome falha na verificação e silenciosamente descarta uma entrada de plugin cujo nome falha. Renomeie o marketplace ou plugin. Antes de v2.1.221,claude plugin validatenão executava essas verificações.
Validate a plugin or a directory without a manifest
Para encontrar arquivos de skill, agent e command cujo frontmatter não analisa, execute claude plugin validate e nomeie o diretório que os contém. Claude Code não procura fora do diretório que você nomeia. Toda execução exceto uma contra um plugin que tem um plugin.json requer Claude Code v2.1.233 ou posterior.
Pick the directory to name
Claude Code verifica diferentes arquivos dependendo de qual diretório você nomeia. Encontre o que você quer verificar na primeira coluna e execute o comando dessa linha:
| Para verificar | Execute | Claude Code verifica |
|---|---|---|
Um plugin que tem um plugin.json |
claude plugin validate ./plugins/my-plugin |
plugin.json, hooks/hooks.json e os diretórios skills, agents e commands na raiz do plugin |
Um diretório de skills, agents ou commands, como um plugin que ainda não tem plugin.json |
claude plugin validate .claude/skills, ~/.claude/agents ou ./my-plugin/agents |
Cada arquivo de skill, agent ou command naquele diretório |
Uma pasta cujo skill é seu SKILL.md raiz |
claude plugin validate ./skills, nomeando o diretório skills que contém a pasta |
O SKILL.md raiz de cada pasta. O diretório que contém deve ser nomeado skills; uma pasta sob outro nome, como plugins/, não tem uma execução que verifica seu SKILL.md raiz |
| Os três diretórios de um projeto de uma vez | claude plugin validate .claude, ou a raiz do projeto quando não tem manifesto .claude-plugin/ |
.claude/skills, .claude/agents e .claude/commands |
| Seus diretórios de nível de usuário | claude plugin validate ~/.claude |
~/.claude/skills, ~/.claude/agents e ~/.claude/commands |
Check a plugin whose skill is its root `SKILL.md`
Quando você executa claude plugin validate contra um diretório de plugin, Claude Code não verifica um SKILL.md na raiz do plugin. Quando o plugin fica em um diretório nomeado skills, execute o comando duas vezes:
- Nomeie aquele diretório
skillspara verificar oSKILL.mdraiz do plugin. - Nomeie o diretório do plugin para verificar o resto.
Quando o plugin fica sob outro nome, como plugins/, a execução do diretório skills não está disponível e nenhuma execução verifica seu SKILL.md raiz.
Check files behind symlinks
Quando você executa claude plugin validate, Claude Code não segue symlinks dentro do diretório que você nomeia. O que ele faz depende de onde o link está:
- Um diretório
skills,agentsoucommandsvinculado sob a raiz do plugin ou.claude: Claude Code avisa que nada nele foi lido. - Uma entrada vinculada dentro de um diretório
skills,agentsoucommands: Claude Code a pula e avisa, por diretório, quantas entradas pulou que uma sessão carregaria. - O diretório
skills,agentsoucommandsque você nomeia é ele próprio um symlink, ou seu diretório pai.claudeé: Claude Code relata um erro e não verifica nada nele. Nomeie o diretório real em vez disso.
Em dois casos de skills, a execução passa com avisos. Para verificar os arquivos vinculados, execute novamente e nomeie um diretório que os contém diretamente:
- Um plugin cujo diretório
skillsvincula aos skills de um plugin irmão: nomeie o diretório do plugin irmão. - Uma entrada de skill vinculada em
~/.claude/skillsou.claude/skills: Claude Code segue a entrada em uma sessão. Para verificá-la, nomeie um diretório chamadoskillsque contém a pasta real.
Read the validation results
Uma execução limpa termina com Validation passed.
No manifest found in directory significa que Claude Code não encontrou plugin.json ou marketplace.json lá, e nenhum arquivo de skill, agent ou command nos diretórios que ele sonda sob ele. Nomeie o diretório skills, agents ou commands que contém seus arquivos em vez disso.
Dois dos erros que Claude Code relata dessas execuções, com a correção para cada um:
YAML frontmatter failed to parse: ...: corrija o YAML no bloco frontmatter do arquivo de skill, agent ou command. Até você fazer isso, uma sessão lê nenhum campo frontmatter do arquivoInvalid JSON syntax: ...emhooks/hooks.json: corrija a sintaxe JSON. Até você fazer isso, uma sessão carrega o plugin sem os hooks naquele arquivo. Claude Code relata esse erro apenas em uma execução de plugin
Em uma execução de plugin, Claude Code também avisa sobre um CLAUDE.md na raiz do plugin. Para caminhos que você define através dos component path fields em plugin.json, Claude Code verifica que cada caminho existe mas não lê os arquivos lá.
Falhas de instalação de plugin
Sintomas: Marketplace aparece mas a instalação do plugin falha
Soluções:
- Verifique se as URLs de fonte do plugin são acessíveis
- Verifique se os diretórios de plugin contêm arquivos obrigatórios
- Para fontes GitHub, garanta que repositórios são públicos ou você tem acesso
- Teste fontes de plugin manualmente clonando/baixando
- Se a fonte fixa tanto
refquantosha, uma branch ou tag upstream deletada não bloqueia a instalação na maioria dos hosts git, incluindo GitHub, GitLab e Bitbucket. Em servidores que não suportam busca de commits por SHA, como AWS CodeCommit, orefainda deve existir e o commit fixado deve ser alcançável a partir dele. Se a instalação ainda falhar, confirme que o commit fixado ainda existe no repositório
Falha de autenticação de repositório privado
Sintomas: Erros de autenticação ao instalar plugins de repositórios privados
Soluções:
Para instalação manual e atualizações:
- Verifique se você está autenticado com seu provedor git (por exemplo, execute
gh auth statuspara GitHub) - Verifique se seu ajudante de credencial está configurado:
git config --global credential.helper - Execute
git ls-remote <marketplace-url>para testar se git consegue autenticar por conta própria. Se git pedir um nome de usuário ou senha, armazene a credencial primeiro: para GitHub sobre HTTPS, executegh auth setup-git, e para remotes SSH, carregue sua chave emssh-agent
Para atualizações automáticas em segundo plano:
- A verificação em segundo plano usa seus ajudantes de credencial git configurados mas nunca solicita, então seu ajudante deve conseguir responder com uma credencial armazenada. Remotes SSH com uma chave carregada em
ssh-agenttambém autenticam - Se seu ajudante precisa solicitar você, a atualização em segundo plano falha silenciosamente e o checkout existente fica no lugar. Entre em seu ajudante primeiro para que ele mantenha uma credencial para o host. Para GitHub, execute
gh auth login, depoisgh auth setup-git - Quando a verificação encontra novos commits, ou não consegue alcançar ou autenticar no remoto, Claude Code re-clona o marketplace com as mesmas credenciais. A re-clonagem pode expirar em repositórios grandes
- Defina
CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1para manter o checkout existente sem tentar a re-clonagem quando a verificação em segundo plano não conseguir alcançar ou autenticar no remoto - Se a re-clonagem expirar em um repositório grande, aumente o limite com
CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS - Ou atualize marketplaces privados manualmente com
/plugin marketplace update <name>, que usa suas credenciais
Antes de v2.1.280, a verificação em segundo plano executava sem seus ajudantes de credencial e não conseguia autenticar em repositórios privados sobre HTTPS.
Atualizações de marketplace falham em ambientes offline
Sintomas: Em um ambiente offline ou airgapped, a atualização de marketplace em segundo plano não consegue alcançar o remoto e Claude Code repetidamente tenta uma re-clonagem que não consegue ter sucesso.
Causa: A atualização em segundo plano verifica o remoto do marketplace para novos commits, e quando a verificação não consegue alcançar o remoto, Claude Code tenta clonar o marketplace novamente. Offline, o clone falha da mesma forma e o checkout existente fica no lugar. Antes de v2.1.274, a atualização executava git pull no checkout existente, movia o checkout para o lado para re-clonar quando o pull falhava, e o restaurava depois em base de melhor esforço.
A atualização é executada em segundo plano após a inicialização, então não atrasa a inicialização. Cada sessão ainda repete a tentativa falhada, e cada operação git pode esperar o timeout de 120 segundos.
Solução: Defina CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 para pular a tentativa de re-clonagem e continuar usando o checkout existente quando a verificação não conseguir alcançar o remoto:
export CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1
Para implantações totalmente offline onde o repositório nunca será alcançável, use CLAUDE_CODE_PLUGIN_SEED_DIR para pré-popular o diretório de plugins no tempo de construção em vez disso.
Operações Git expiram
Sintomas: Instalação de plugin ou atualizações de marketplace falham com um erro de timeout como Git clone timed out after 120s.
Causa: Claude Code usa um timeout de 120 segundos para todas as operações git, incluindo clonagem de repositórios de plugin e re-clonagem de um marketplace para atualizá-lo. Repositórios grandes ou conexões de rede lentas podem exceder este limite.
Solução: Aumente o timeout usando a variável de ambiente CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS. O valor está em milissegundos:
export CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000 # 5 minutos
Plugins com caminhos relativos falham em marketplaces baseados em URL
Sintomas: Adicionou um marketplace via URL como https://example.com/marketplace.json, mas plugins com fontes de caminho relativo como "./plugins/my-plugin" falham ao instalar com its marketplace entry path does not stay inside the marketplace directory. Plugins já instalados falham ao carregar com Plugin source path refused. Ambas as mensagens têm uma entrada de referência de erro.
Causa: adicionar um marketplace baseado em URL baixa apenas o próprio arquivo marketplace.json, e Claude Code não busca arquivos de plugin por caminho relativo daquele servidor. Caminhos relativos na entrada de marketplace referenciam arquivos no servidor remoto que não foram baixados.
Soluções:
- Use fontes externas: altere entradas de plugin para qualquer plugin source outro que não seja um caminho relativo:
{ "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } } - Use um marketplace baseado em Git: Hospede seu marketplace em um repositório Git e adicione-o com a URL git. Marketplaces baseados em Git clonam o repositório inteiro, tornando caminhos relativos funcionarem corretamente.
Arquivos não encontrados após instalação
Sintomas: Plugin instala mas referências a arquivos falham, especialmente arquivos fora do diretório do plugin
Causa: Claude Code copia plugins instalados para um diretório de cache, a menos que o plugin carregue no local. Uma command source em link mode carrega no local, e assim também uma relative path source em um marketplace adicionado de um diretório local. Caminhos que referenciam arquivos fora do diretório do plugin copiado (como ../shared-utils) não funcionarão porque esses arquivos não são copiados.
Soluções: Veja Plugin caching and file resolution para workarounds incluindo symlinks e reestruturação de diretório.
Para ferramentas de debugging adicionais e problemas comuns, veja Debugging and development tools.
Veja também
- Descobrir e instalar plugins pré-construídos - Instalando plugins de marketplaces existentes
- Plugins - Criando seus próprios plugins
- Plugins reference - Especificações técnicas completas e esquemas
- Plugin settings - Opções de configuração de plugin
- strictKnownMarketplaces reference - Restrições de marketplace gerenciado