Referencia de Marketplace
Referencia completa de los campos marketplace.json, entradas de plugins y los objetos de origen de plugin y marketplace, con dónde es válido cada uno.
marketplace.json es el archivo que define un marketplace de plugins. Contiene el nombre del marketplace, su propietario y una entrada por cada plugin. La fuente de plugin de cada entrada indica dónde Claude Code obtiene ese plugin.
Una fuente de marketplace es un objeto separado que indica dónde Claude Code obtiene el archivo marketplace en sí. Usted escribe uno en la configuración, o Claude Code construye uno cuando ejecuta claude plugin marketplace add.
Esta referencia es para los mantenedores de marketplace que necesitan un nombre de campo o valor exacto, y para los administradores que necesitan saber qué valores de source son válidos en extraKnownMarketplaces, strictKnownMarketplaces y blockedMarketplaces.
[!NOTE]
Estos casos se cubren en otras páginas:
- Construir u alojar un marketplace: consulte Crear un marketplace y Alojar y mantener un marketplace
- Recetas de lista de permitidos y lista de bloqueados: consulte Administrar plugins para su organización
Encuentre la sección para lo que está escribiendo o leyendo:
- El archivo marketplace: Campos de nivel superior y Entradas de plugins
- El
sourcede una entrada: Fuentes de plugins - Un objeto
sourceen la configuración: Fuentes de marketplace - Salida de
claude plugin validate <path>: Mensajes de validación, que asigna cada mensaje al campo que nombra
Archivo marketplace
Guarde el archivo marketplace en .claude-plugin/marketplace.json en el directorio de su marketplace. Si mantiene el archivo en otro lugar del repositorio, los usuarios tienen que declarar el marketplace en extraKnownMarketplaces con path establecido en su fuente, porque claude plugin marketplace add no tiene opción para ello.
El directorio que contiene .claude-plugin/ se llama raíz del marketplace, y cada fuente de plugin relativa se resuelve desde él, no desde .claude-plugin/.
Cada usuario registra un marketplace por name, por lo que un usuario no puede tener dos marketplaces con el mismo nombre registrados a la vez.
Claude Code ignora una clave de nivel superior desconocida o una clave de entrada de plugin en lugar de rechazarla, por lo que un error tipográfico se carga silenciosamente. claude plugin validate reporta cada clave desconocida como una advertencia.
Nombres reservados
No puede dar a su marketplace ninguno de los siguientes nombres:
- Nombres de marketplace oficial:
claude-code-marketplace,claude-code-plugins,claude-plugins-official,anthropic-marketplace,anthropic-plugins,agent-skills,anthropic-agent-skills,life-sciences,knowledge-work-plugins,claude-for-legal,claude-for-financial-services,financial-services-plugins,first-party-pluginsyclaude-tag-plugins. Reservado a menos que el marketplace provenga de una fuente de marketplacegithubogitbajogithub.com/anthropics/. - Nombres de marketplace comunitario:
claude-community,claude-plugins-communityyhealthcare. Reservado bajo la misma regla que los nombres oficiales. - Nombres de directorio de plugins:
anthropic-plugin-directoryyclaude-plugin-directory. Reservado bajo la misma regla que los nombres oficiales. - Nombres que suplanten un marketplace oficial: nombres como
official-claude-pluginsoclaude-plugins-v2, y cualquier nombre que contenga un carácter no ASCII. El error esMarketplace name impersonates an official Anthropic/Claude marketplace. Un carácter de control o de formato bidireccional en un nombre también reportaMarketplace name cannot contain control or bidirectional-formatting characters. Un marketplace ya registrado bajo tal nombre deja de cargarse, junto con sus plugins. - Otra ortografía de un nombre reservado: un nombre que difiere de un nombre reservado solo por un punto final, o por un símbolo distinto de un guion bajo en lugar de un guion, por lo que
claude.code.pluginscuenta comoclaude-code-plugins. Agregar el marketplace falla conis another spelling of "<reserved>", a reserved marketplace name, y un marketplace ya registrado bajo uno deja de cargarse. Esta verificación requiere Claude Code v2.1.280 o posterior. - Nombres que Claude Code usa para plugins que no provienen de un marketplace:
inlinepara plugins cargados con--plugin-dir,builtinpara plugins integrados,skills-dirpara plugins cargados automáticamente desde.claude/skills/ysyncedpara plugins sincronizados desde su cuenta claude.ai.claude-plugin-testtambién está reservado.skills-dirtambién aparece como{"source": "skills-dir"}enstrictKnownMarketplacesyblockedMarketplaces, descrito bajo Valores de fuente válidos solo en listas de políticas. npm,pip,uv,cargo,githubygh: reservado en cualquier mayúscula. Esta verificación requiere Claude Code v2.1.275 o posterior.- Nombres de miembros que tiene todo objeto de JavaScript:
constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toStringyvalueOf.claude plugin marketplace addrechaza un marketplace que use uno conClaude Code reserves this name and cannot register a marketplace under it. Esta verificación requiere Claude Code v2.1.296 o posterior. - Nombres que comienzan con
claudeai-: reservado para marketplaces alojados en claude.ai.claude plugin marketplace addrechaza cualquier otro marketplace que use uno conCannot add marketplace "<name>": names starting with "claudeai-" are reserved for marketplaces hosted on claude.ai. - La carpeta de descarga de un marketplace de GitHub registrado,
<owner>-<repo>: Claude Code descarga un marketplace agregado desde una fuentegithubcomoacme/x-toolsa través de una carpeta llamadaacme-x-tools, sea cual sea elnamepropio de ese marketplace. Mientras ese marketplace esté registrado con un nombre distinto deacme-x-tools,claude plugin marketplace addrechaza un marketplace diferente llamadoacme-x-toolsdespués de descargarlo, e informaCan't use the marketplace name "acme-x-tools". Esta verificación requiere Claude Code v2.1.290 o posterior.
Cuando un marketplace registrado deja de cargarse porque su nombre imita uno oficial, claude plugin list y /plugin reportan Claude Code refuses the marketplace name "<name>". El mensaje te indica que elimines el marketplace. Eliminarlo también desinstala sus plugins y elimina sus datos, opciones y secretos. Este mensaje de rechazo nombrado requiere Claude Code v2.1.282 o posterior.
Si un archivo de configuración declara el marketplace en línea, el mensaje te indica que cambies el nombre de su entrada antes de eliminar el nombre anterior. Para ver los pasos, consulta Claude Code refuses the marketplace name. El mensaje los enumera en Claude Code v2.1.292 o posterior.
Campos de nivel superior
La tabla enumera cada clave que Claude Code lee de marketplace.json. name, owner y plugins son obligatorios.
| Campo | Tipo | Descripción |
|---|---|---|
name |
string | Identificador de marketplace: letras, dígitos, ., _ y -, comenzando con una letra o dígito, y sin ... claude plugin validate falla con cualquier otro nombre, porque Claude Code no puede instalar plugins desde un marketplace que use uno. Los usuarios escriben el nombre después de @ en un id de plugin como my-plugin@my-marketplace cuando instalan un plugin. Consulta Nombres reservados |
owner |
object | Información del mantenedor. name es obligatorio; email y url son opcionales |
plugins |
array | Entradas de plugins. Cada entrada se valida por sí sola, por lo que una entrada inválida no falla el marketplace |
$schema |
string | URL de JSON Schema para autocompletado del editor. Se ignora en tiempo de carga |
description |
string | Descripción del marketplace mostrada a los usuarios. claude plugin validate advierte cuando falta |
version |
string | Versión del manifiesto del marketplace |
metadata.description, metadata.version |
string | Ubicación alternativa para description y version |
metadata.pluginRoot |
string | Directorio bajo el cual se resuelven los nombres de fuente de plugin desnudos. Consulte Fuente de plugin de ruta relativa. Requiere Claude Code v2.1.239 o posterior |
forceRemoveDeletedPlugins |
boolean | Cuando es true, un plugin que elimina de plugins se desinstala en las máquinas de los usuarios. Consulte Alojar y mantener un marketplace |
allowCrossMarketplaceDependenciesOn |
array of strings | Nombres de marketplace cuyos plugins pueden instalarse como dependencias de los plugins de este marketplace. Cuando instala un plugin, solo se aplica la lista en el propio marketplace del plugin, para toda su cadena de dependencias. Consulte Dependencias de plugins |
renames |
object | Mapa de un name de plugin anterior a su nombre actual, o a null para un plugin que eliminaste. Consulta Alojar y mantener un marketplace |
Entradas de plugins
Cada objeto en el array plugins de nivel superior de marketplace.json nombra un plugin e indica dónde obtenerlo. name y source son obligatorios.
Además de los campos de listado del directorio, una entrada también acepta cada campo de plugin.json, como description, version, author, commands y hooks. Para saber cuándo se aplican esos campos, consulta Cómo una entrada se combina con plugin.json.
La tabla enumera los campos propios de la entrada y los campos del manifiesto cuyo significado cambia en una entrada.
| Campo | Tipo | Descripción |
|---|---|---|
name |
string | Identificador de plugin: letras, dígitos, ., _ y -, comenzando con una letra o dígito. claude plugin validate falla con otros nombres, que Claude Code no puede instalar. Los usuarios lo escriben antes de @ cuando instalan, incluso cuando el propio plugin.json del plugin establece un name diferente |
source |
string or object | Dónde obtener el plugin. Consulta Fuentes de plugins |
description |
string | Se muestra en los listados y detalles de /plugin |
version |
string | Cadena de versión para el plugin. Cuando plugin.json también establece version, plugin.json tiene precedencia y claude plugin validate advierte. Consulta Referencia de carga de plugins |
category |
string | Categoría de forma libre para organizar el catálogo |
tags |
array of strings | Etiquetas de forma libre para búsqueda |
strict |
boolean | Por defecto true. Si plugin.json es la fuente definitiva para los componentes del plugin. Consulta Modo estricto |
relevance |
object | Señales que indican a Claude Code cuándo sugerir el plugin. Consulta Recomendar plugins para tu organización |
dependencies |
array | Plugins que deben estar habilitados para que este funcione. Cada elemento es "name", "name@marketplace" o un objeto. Consulta Dependencias de plugins |
defaultEnabled |
boolean | Por defecto true. Si el plugin comienza habilitado cuando el usuario no lo ha establecido en enabledPlugins. El valor de la entrada tiene precedencia sobre plugin.json |
displayName |
string | Nombre legible por humanos mostrado en la interfaz de usuario. Cuando ni la entrada ni el plugin.json del plugin establece uno, los usuarios ven el name del plugin |
metadata |
object | Objeto de forma libre para tus propios campos. Claude Code no lo lee. Requiere Claude Code v2.1.222 o posterior |
headers |
object | Encabezados HTTP que Claude Code envía cuando descarga el archivo de esta entrada. Un encabezado establecido aquí reemplaza un encabezado del mismo nombre de los headers de la fuente del marketplace. Requiere Claude Code v2.1.238 o posterior |
headersHelper |
string | Comando que imprime los encabezados de descarga de archivo de esta entrada como un objeto JSON, para una credencial que expira. La entrada también debe establecer "strict": false. Requiere Claude Code v2.1.238 o posterior. Consulta Autenticar descargas de archivos |
Cómo una entrada se combina con plugin.json
Los campos de la entrada se aplican de manera diferente a un plugin obtenido que tiene su propio .claude-plugin/plugin.json y a uno que no:
- Sin
plugin.json: la entrada es el manifiesto independientemente destrict. Cada campo de manifiesto que acepta la entrada se aplica, incluidosmcpServers,lspServers,userConfigychannels. plugin.jsonpresente:plugin.jsones el manifiesto. Modo estricto decide si los seis campos de componente de la entrada,commands,agents,skills,hooks,outputStylesythemes, se combinan con él o se rechazan como un conflicto. Los camposmcpServers,lspServers,userConfigychannelsde la entrada no se aplican. Decláralos enplugin.json.
Hooks en una entrada
Escribe los hooks de la entrada como un objeto en línea que asigne nombres de eventos de hook a arrays de matchers. Si escribes una ruta de archivo o un array en su lugar, claude plugin validate lo aprueba. Esos hooks nunca se ejecutan, y Claude Code reporta un error not yet supported in a marketplace entry para el plugin. Coloca los hooks basados en archivos en el propio hooks/hooks.json del plugin o en plugin.json.
Campos de visualización
Tanto la entrada como el propio plugin.json del plugin pueden establecer los campos de visualización displayName, description, author, homepage, repository, license y keywords. Los usuarios ven estos valores en los listados y detalles de plugins, antes y después de instalar:
- Para un campo que establezcas en la entrada, los usuarios ven el valor de la entrada, incluso cuando
plugin.jsonestablece uno diferente. - Para un campo que la entrada deja sin establecer, los usuarios ven el valor de
plugin.json.
Antes de instalar, Claude Code solo puede leer plugin.json para entradas con una fuente de ruta relativa, cuyos archivos de plugin están dentro del marketplace en sí. Para una entrada con cualquier otro tipo de fuente, los usuarios ven solo los campos propios de la entrada hasta que instalen el plugin.
Modo estricto
strict decide qué sucede cuando el plugin obtenido tiene su propio plugin.json y la entrada también declara cualquiera de los campos de componente: commands, agents, skills, hooks, outputStyles o themes. Con strict: true, el predeterminado, Claude Code añade los campos de componente de la entrada a plugin.json, excepto hooks, cuyos matchers reemplazan los del manifiesto por evento. Con strict: false, una entrada que declara cualquier campo de componente es un conflicto, y el plugin falla al cargar. La tabla muestra cada combinación de strict, plugin.json y los campos de componente de la entrada.
strict |
plugin.json |
Campos de componente de entrada | Resultado |
|---|---|---|---|
| cualquiera | ausente | cualquiera | La entrada es el manifiesto |
true, el predeterminado |
presente | cualquiera | plugin.json es la autoridad. Claude Code añade los campos de componente de la entrada a él, excepto hooks, cuyos matchers reemplazan los del manifiesto por evento |
false |
presente | ninguno | plugin.json es el manifiesto, como con true |
false |
presente | uno o más | Conflicto. El plugin falla al cargar con Plugin <name> has conflicting manifests: both plugin.json and marketplace entry specify components |
Orígenes de plugins
El source de una entrada de plugin indica desde dónde Claude Code obtiene ese plugin en particular. Es una cadena de ruta relativa o un objeto cuya propia clave source nombra el tipo, de modo que una entrada se ve así: "source": { "source": "github", "repo": "your-org/formatter" }.
La tabla enumera cada tipo de origen de plugin y sus campos.
| Tipo | Campos | Notas |
|---|---|---|
| Ruta relativa | la propia cadena | Un directorio dentro del marketplace, resuelto desde la raíz del marketplace. Debe comenzar con ./, a menos que escribas un nombre simple bajo metadata.pluginRoot. "." por sí solo significa la propia raíz |
github |
repo, ref, sha |
Repositorio de GitHub en formato owner/repo |
url |
url, ref, sha |
Cualquier repositorio git por URL |
git-subdir |
url, path, ref, sha |
Un subdirectorio de un repositorio git, obtenido con un sparse checkout |
npm |
package, version, registry |
Paquete del registro de npm o enlace a un tarball, obtenido con tu cliente de npm y desempaquetado sin ejecutar scripts de instalación |
archive |
url, sha256 |
Archivo zip a través de HTTPS. Requiere Claude Code v2.1.224 o posterior |
command |
command, timeout, mode |
Directorio impreso por un comando que Claude Code ejecuta en la máquina del usuario. Requiere Claude Code v2.1.229 o posterior |
Los nombres url y github también son tipos de origen de marketplace, donde url significa un enlace directo a un archivo marketplace.json en lugar de a un repositorio git. git existe solo como origen de marketplace, y npm existe como ambos. git-subdir, archive y command existen solo como orígenes de plugin.
Usa una ruta relativa para un plugin que esté en un subdirectorio del propio repositorio del marketplace. Usa git-subdir para un subdirectorio de algún otro repositorio.
Los orígenes github, url y git-subdir comparten los campos ref y sha:
ref: una rama o etiqueta. De forma predeterminada es la rama predeterminada del repositorio.sha: un SHA de commit completo de 40 caracteres en minúsculas. Cuando estableces tantorefcomosha, Claude Code hace checkout desha. En la mayoría de los hosts de git, incluidos GitHub, GitLab y Bitbucket, esto significa que la instalación tiene éxito aunque la rama o etiqueta nombrada porrefse haya eliminado desde entonces en el upstream, siempre que el commit siga siendo alcanzable desde el repositorio. Algunos servidores, como AWS CodeCommit, no admiten obtener commits por SHA. En esos servidores, larefdebe seguir existiendo y el commit fijado debe ser alcanzable desde ella.
Para saber cómo se obtiene, almacena en caché y versiona cada tipo, consulta la referencia de carga de plugins.
Origen de plugin de ruta relativa
La ruta se resuelve desde la raíz del marketplace. ./plugins/formatter es <root>/plugins/formatter aunque el archivo del marketplace esté en <root>/.claude-plugin/.
Una ruta que contiene .. no supera la validación. En macOS y Linux, Claude Code rechaza una ruta de entrada que contenga una barra invertida en cualquier lugar después del ./ inicial, así que escribe la ruta con barras diagonales.
{ "name": "formatter", "source": "./plugins/formatter" }
Una ruta relativa solo se resuelve cuando Claude Code tiene los archivos del marketplace, así que revisa el tipo de origen del marketplace:
github,git,fileydirectory: Claude Code tiene los archivos del marketplace.url: Claude Code obtiene solomarketplace.json, por lo que las rutas relativas no pueden resolverse. En su lugar, dale a cada plugin un origen de tipo objeto, comogithubogit-subdir.settings: las rutas relativas se rechazan directamente.
Submódulos de Git en el repositorio del marketplace
Cuando Claude Code clona un repositorio de marketplace, obtiene solo los submódulos de git que contienen archivos de plugins. Requiere Claude Code v2.1.295 o posterior.
Las versiones anteriores obtienen todos los submódulos, incluidos los anidados. Si el repositorio tiene un submódulo grande, Claude Code puede entonces superar el tiempo de espera de clonación mientras lo obtiene.
Para un plugin en un subdirectorio, como ./plugins/formatter, Claude Code obtiene un submódulo en estos casos:
- El plugin está dentro del submódulo: el submódulo es el directorio del plugin o un directorio por encima de él
- El submódulo está dentro del plugin: el submódulo está en cualquier lugar bajo el directorio del plugin
- Un enlace simbólico apunta dentro del submódulo: un enlace con commit en el repositorio tiene su destino en el submódulo
Un plugin en la raíz del marketplace, con "source": "./", obtiene todos los submódulos del repositorio o ninguno. Claude Code obtiene todos los submódulos cuando alguno de estos apunta dentro de cualquier submódulo:
- Un directorio de componentes: un directorio en la raíz que contiene componentes del plugin, como
skills/,hooks/obin/ - Una ruta en la configuración del plugin: una ruta en la entrada del marketplace del plugin, en su
plugin.jsono en un archivo de configuración como.mcp.jsonohooks/hooks.json - Un enlace simbólico: un enlace con commit en el repositorio
- Texto en los archivos del plugin: la ruta de un submódulo, como
vendor/tool, escrita en un archivo de configuración o en un archivo bajo un directorio de componentes
Cuando ninguno de ellos apunta dentro de un submódulo, Claude Code no obtiene ningún submódulo para ese plugin. Un repositorio que es a la vez un proyecto y un plugin a menudo tiene submódulos que solo usa la compilación del proyecto, y esta regla los deja fuera.
Claude Code también obtiene todos los submódulos cuando no puede determinar cuáles contienen archivos de plugins, por ejemplo:
- Un
SKILL.mden la raíz: en ese caso, todo el repositorio es el directorio de un skill - Un archivo que Claude Code no puede leer: el archivo del marketplace, uno de los archivos de configuración del plugin o
.gitmodules
Si agregas un marketplace con --sparse, o su origen establece sparsePaths, Claude Code hace checkout solo de los directorios nombrados allí y no obtiene ningún submódulo. Las versiones anteriores hacen lo mismo.
Para mantener fuera de la clonación un submódulo que tus plugins no usan, consulta Mantener los submódulos no usados fuera de la clonación.
Nombres simples bajo pluginRoot
Un nombre simple es un único nombre de directorio sin /, como "formatter". Para escribir nombres simples en lugar de rutas ./, establece metadata.pluginRoot en el directorio bajo el cual se resuelven. Con "pluginRoot": "./plugins", "source": "formatter" se resuelve como ./plugins/formatter. Requiere Claude Code v2.1.239 o posterior.
metadata.pluginRoot tiene estos límites:
- Debe ser en sí mismo una ruta relativa dentro del marketplace.
- No tiene efecto sobre un origen que ya comienza con
./. - Un origen que contiene una
/, comoteam-a/formatter, no es un nombre simple y sigue necesitando el prefijo./, incluso cuandometadata.pluginRootestá establecido.
Origen de plugin github
repo acepta owner/repo. ref y sha son opcionales.
{
"name": "formatter",
"source": {
"source": "github",
"repo": "your-org/formatter",
"ref": "v2.0.0",
"sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
}
Origen de plugin url
url es una URL de git completa: https://, http://, file:// o git@. No se requiere el sufijo .git, por lo que las URL de Azure DevOps y AWS CodeCommit funcionan tal como están escritas. Este tipo no acepta la forma abreviada owner/repo.
{
"name": "formatter",
"source": {
"source": "url",
"url": "https://gitlab.example.com/your-group/formatter.git",
"ref": "main"
}
}
Origen de plugin git-subdir
url acepta una URL de git completa o la forma abreviada owner/repo de GitHub. path es el subdirectorio que contiene el plugin, y Claude Code hace checkout solo de ese subdirectorio. Con una URL https o SSH, Claude Code le pide al servidor una clonación parcial, así que desde un host que admite clonaciones parciales, un plugin en un monorepo grande se instala sin descargar el resto del repositorio.
{
"name": "formatter",
"source": {
"source": "git-subdir",
"url": "https://github.com/your-org/monorepo.git",
"path": "tools/formatter"
}
}
Origen de plugin npm
Un origen npm acepta estos campos:
package: un nombre de paquete del registro como@your-org/formatter, un nombre con una versión añadida como@your-org/formatter@2.0.0, o un enlacehttpsal archivo tarball del paqueteversion: una versión, un rango semver o una dist-tag, que se usa cuandopackagees un nombre de paquete sin versión añadida. Omítelo para obtenerlatestregistry: una URL de registro para un paquete que no está en el registro predeterminado
Claude Code obtiene el paquete con tu cliente de npm. Los scripts de instalación del paquete, como preinstall o postinstall, nunca se ejecutan, y sus dependencias no se instalan durante la obtención. Si el paquete tiene un lockfile compatible junto a su package.json, Claude Code instala esas dependencias de paquetes de Node.js en un paso aparte, también con los scripts deshabilitados.
Claude Code revisa el valor de package antes de obtener nada. Un valor rechazado hace fallar la instalación con un mensaje que nombra el valor y el motivo. Los valores rechazados incluyen:
- Una dirección de git, una carpeta o ruta
file:, o un aliasnpm:: usa un origengithub,urlogit-subdirpara un repositorio git, una ruta relativa para una carpeta del marketplace y el propio nombre del paquete en lugar de un alias - Un enlace a un tarball en github.com, gist.github.com, gitlab.com, bitbucket.org o git.sr.ht: se rechaza incluso cuando el enlace es una descarga de una release de GitHub, a menos que sea un enlace al registro npm de GitLab bajo
gitlab.com/api/v4/ - Un enlace a un tarball a través de
http: se rechaza a menos que apunte al registro npm predeterminado del propio usuario que instala
La URL de registry debe usar https a menos que sea el registro npm predeterminado del propio usuario que instala. Con cualquier otro registro http, la instalación falla antes de que npm lo contacte.
{
"name": "formatter",
"source": {
"source": "npm",
"package": "@your-org/formatter",
"version": "^2.0.0",
"registry": "https://npm.example.com"
}
}
Origen de plugin archive
url debe usar https:// y no puede apuntar a un host de loopback, de enlace local (link-local) o de metadatos de la nube. Para conocer los límites de tamaño, tiempo de espera, redirecciones y extracción de la descarga, consulta Mantenerse dentro de los límites de descarga para archivos alojados.
La raíz del plugin puede estar en el nivel superior del zip o un directorio más abajo.
sha256 es el digest del archivo como 64 caracteres hexadecimales, en mayúsculas o minúsculas. Cuando lo estableces, Claude Code rechaza una descarga que no coincida.
{
"name": "formatter",
"source": {
"source": "archive",
"url": "https://artifacts.example.com/formatter-2.0.0.zip",
"sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"
}
}
Origen de plugin command
Usa un origen command cuando una herramienta instalada en la máquina del usuario produce el directorio del plugin, como un IDE que genera su plugin para la cadena de herramientas que el usuario ha seleccionado. Claude Code ejecuta el comando cuando el usuario instala o actualiza el plugin, y de nuevo una vez por sesión, para que los usuarios reciban la salida modificada de la herramienta sin reinstalar.
Un origen command acepta estos campos:
command: un comando de shell que imprime la ruta absoluta del directorio del plugin como una sola línea y termina con código 0. Claude Code muestra a los usuarios la cadena completa para que la revisen antes de ejecutarla. Escríbelo en ASCII imprimible, con un máximo de 500 caracteres y sin secuencias de cuatro o más espacios.timeout: un número entero de segundos entre 1 y 600. El valor predeterminado es 60.mode:copy, el predeterminado, olink. Consulta Modo copy y modo link.
{
"name": "formatter",
"source": {
"source": "command",
"command": "my-tool claude-plugin-path",
"timeout": 120
}
}
Para saber cómo los usuarios aceptan el comando, consulta Instalar desde tu shell. Para saber qué ven los usuarios después de que lo cambias, consulta Cambiar el comando de un origen command. Los administradores desactivan los orígenes command con disableCommandPluginSources.
Qué debe hacer el comando
Escribe el comando de modo que cumpla estos requisitos:
- Shell y directorio de trabajo: Claude Code ejecuta el comando mediante
sh, o mediantecmd.exeen Windows, desde el directorio home del usuario. Indica una ruta absoluta o un comando que esté enPATH. - Salida: imprime exactamente una línea en stdout, la ruta absoluta del directorio del plugin, y termina con código 0 dentro de los
timeoutsegundos. - Contenido del directorio: el directorio contiene el plugin completo en el momento en que el comando termina. La ruta puede ser distinta de una ejecución a otra.
Salida que hace fallar la instalación o actualización
La instalación o actualización falla cuando el comando termina con un código distinto de cero, se ejecuta durante más de timeout o imprime cualquier cosa que no sea exactamente una única ruta absoluta. También falla cuando el directorio impreso es uno de estos:
- Sin contenido de plugin: el directorio impreso no tiene contenido de plugin en su nivel superior, como un directorio
.claude-plugin/o un directorioskills/,commands/,agents/ohooks/. - El propio directorio de la sesión: el directorio impreso es aquel en el que se inició Claude Code, o uno de sus directorios superiores.
- Una ruta de red: en Windows, la ruta impresa es una ruta UNC.
- Demasiado grande para copiar: en modo copy, el directorio ocupa más de 256 MiB o tiene más de 20,000 entradas.
Modo copy y modo link
mode decide si Claude Code copia el directorio impreso o lo usa en su ubicación:
copy: Claude Code copia el directorio en la caché de plugins y deriva la versión del plugin a partir de un hash de los archivos copiados. Tu herramienta puede eliminar o reescribir el directorio después de que el comando termine. Una nueva ejecución que produce archivos idénticos se considera actualizada.link: Claude Code llena la entrada de caché del plugin con un enlace a cada entrada de nivel superior del directorio impreso y carga los archivos en su ubicación. No se copia nada, no se calcula el hash del contenido de los archivos y los límites de tamaño no se aplican. Úsalo para un directorio demasiado grande para copiar, como una exportación de un SDK generada.
Un plugin en modo link tiene estos requisitos:
- Mantén el directorio en su lugar: Claude Code carga el plugin a través de los enlaces en cada inicio, por lo que el directorio impreso debe permanecer donde está mientras el plugin siga instalado.
- Imprime una ruta diferente para indicar contenido nuevo: la versión proviene de la ruta real del directorio impreso y de sus entradas de nivel superior, no de los archivos que contienen.
- Mantén los enlaces simbólicos de nivel superior dentro del directorio: la instalación falla si una entrada de nivel superior es un enlace simbólico que apunta fuera del directorio impreso.
- Incluye
node_modules: Claude Code omite la instalación de dependencias de paquetes de Node.js para un plugin en modo link, así que imprime un directorio que ya contenga los paquetes que el plugin necesita. - Sesiones iniciadas dentro del directorio: una sesión iniciada en el directorio impreso o en cualquier lugar debajo de él no carga el plugin.
- No en Windows: Claude Code se niega a instalar un plugin en modo link en Windows. Declara
"mode": "copy"allí.
Fuentes de marketplace
Una fuente de marketplace indica dónde Claude Code obtiene un marketplace.json. La CLI construye uno para usted cuando agrega un marketplace, y usted escribe uno en la configuración:
claude plugin marketplace add: Claude Code construye la fuente a partir de la cadena que pasa.extraKnownMarketplaces: usted escribe la fuente en sí como el objetosource.strictKnownMarketplacesyblockedMarketplaces: los administradores escriben fuentes en estas dos listas de políticas.strictKnownMarketplaceses la lista de permitidos yblockedMarketplaceses la lista de bloqueados.
Los nombres de tipo url, git y github significan algo diferente en una fuente de marketplace que en una fuente de plugin:
| Nombre de tipo | Como fuente de marketplace | Como fuente de plugin |
|---|---|---|
url |
Un enlace directo a un archivo marketplace.json, con campos url, headers y headersHelper |
Un repositorio git para clonar, con campos url, ref y sha |
git |
Un repositorio git para clonar, con campos url, ref, path y sparsePaths |
No existe |
github |
Un repositorio de GitHub, con campos repo, ref, path y sparsePaths |
Un repositorio de GitHub, con campos repo, ref y sha, y sin path |
La tabla enumera cada tipo de fuente de marketplace con sus campos, la entrada de claude plugin marketplace add que lo produce, y qué hace en cada una de las tres claves de configuración.
| Tipo | Campos | entrada marketplace add |
extraKnownMarketplaces |
strictKnownMarketplaces |
blockedMarketplaces |
|---|---|---|---|---|---|
url |
url, headers, headersHelper |
Una URL http:// o https:// que no coincide con una forma git |
Se carga | Permite la misma URL | Bloquea la misma URL |
github |
repo, ref, path, sparsePaths |
owner/repo, owner/repo@ref u owner/repo#ref |
Se carga | Permite el mismo repo, ref y path. repo puede ser owner/* |
Bloquea lo mismo, y una URL git al mismo repositorio |
git |
url, ref, path, sparsePaths |
Una URL user@host:path, o una URL http:// o https:// que termina en .git, contiene /_git/, o nombra un repositorio github.com o gitlab.com. #ref fija un ref |
Se carga | Permite la misma URL, ref y path |
Bloquea lo mismo, y otras ortografías del mismo repositorio github.com |
npm |
package |
No producido | Falla al cargar: NPM marketplace sources not yet implemented |
Se analiza pero no coincide con nada, porque nada registra un marketplace npm |
Se analiza pero no coincide con nada |
file |
path |
Una ruta a un archivo .json |
Se carga | Permite la misma ruta | Bloquea la misma ruta |
directory |
path |
Una ruta a un directorio | Se carga | Permite la misma ruta | Bloquea la misma ruta |
settings |
name, plugins, owner |
No producido | Se carga | Permite una entrada con el mismo name y plugins idénticos |
Bloquea el mismo name |
skills-dir |
none | No producido | Falla al cargar: Unsupported marketplace source type |
Permite los plugins del directorio de skills. Consulta Valores de fuente válidos solo en listas de políticas | Detiene los plugins del directorio de skills de cargarse |
hostPattern |
hostPattern |
No producido | Falla al cargar: Unsupported marketplace source type |
Permite fuentes github, git y url cuyo host coincida |
Bloquea esas fuentes |
pathPattern |
pathPattern |
No producido | Falla al cargar: Unsupported marketplace source type |
Permite fuentes file y directory cuya path coincida |
Bloquea esas fuentes |
Campos por tipo
La tabla enumera cada campo de fuente de marketplace que tiene un predeterminado, una restricción o un significado específico de su tipo.
| Campo | Tipos | Descripción |
|---|---|---|
url |
url |
Enlace al archivo marketplace.json. Claude Code descarga solo ese archivo, por lo que los plugins del marketplace no pueden usar fuentes de ruta relativa. Consulte Manténgase dentro de los límites de descarga para archivos alojados para los límites de tamaño, tiempo de espera y redirección |
url |
git |
El repositorio git para clonar |
headers |
url |
Mapa de encabezados HTTP que Claude Code envía con la obtención, para hosts autenticados |
headersHelper |
url |
Comando que imprime encabezados cuyos valores son demasiado efímeros para listar en headers. Requiere Claude Code v2.1.238 o posterior. Consulte Autenticar descargas de archivos |
repo |
github |
En marketplace add y extraKnownMarketplaces, repo debe nombrar un repositorio. marketplace add rechaza owner/* como no un atajo owner/repo válido; en extraKnownMarketplaces Claude Code lo toma literalmente y el clon falla |
ref |
github, git |
Rama o etiqueta. Por defecto es la rama predeterminada del repositorio |
path |
github, git |
La ruta del archivo marketplace dentro del repositorio. Por defecto es .claude-plugin/marketplace.json |
path |
file |
El archivo marketplace en sí. Claude Code lo lee en su lugar y toma el directorio dos niveles arriba como la raíz del marketplace, así que mantenga el archivo en <root>/.claude-plugin/marketplace.json |
path |
directory |
La raíz del marketplace, el directorio que contiene .claude-plugin/marketplace.json |
sparsePaths |
github, git |
Array de directorios para un checkout disperso, como [".claude-plugin", "plugins"]. claude plugin marketplace add --sparse lo establece |
skipLfs |
github, git |
Aceptado y no tiene efecto. Consulte Mantener archivos de plugin fuera de Git LFS |
name |
settings |
Debe ser igual a la clave extraKnownMarketplaces y no puede ser un nombre reservado |
plugins |
settings |
El catálogo en línea, sin archivo alojado. Cada elemento toma name, source, description, version, strict, headers y headersHelper. Escriba el source de cada elemento como un tipo de objeto, porque una ruta relativa no tiene repositorio para resolver |
Valores de fuente válidos solo en listas de políticas
hostPattern, pathPattern, skills-dir y la forma owner/* de repo son válidos solo en las dos listas de políticas, strictKnownMarketplaces y blockedMarketplaces:
hostPatternypathPattern: expresiones regulares que Claude Code prueba contra una fuente antes de obtener de ella.skills-dir: no es una fuente. Si establecesstrictKnownMarketplacessin una entrada{"source": "skills-dir"}, los plugins del directorio de skills dejan de cargarse. Si bloqueas cualquier tipo de personalización constrictPluginOnlyCustomization, dejan de cargarse independientemente de que la entrada esté presente o no.owner/*: como un valorrepodegithub, coincide con cada repositorio bajo exactamente ese propietario de GitHub. Requiere Claude Code v2.1.223 o posterior.
Para el orden de coincidencia, la semántica exacta de ref y recetas, consulte Administrar plugins para su organización.
Objetos de fuente en la configuración
Un valor extraKnownMarketplaces es un mapa de nombre de marketplace a un objeto con source. Esta entrada registra un marketplace desde un repositorio git en su rama main:
{
"extraKnownMarketplaces": {
"your-marketplace": {
"source": {
"source": "git",
"url": "https://git.example.com/your-org/your-marketplace.git",
"ref": "main"
}
}
}
}
strictKnownMarketplaces y blockedMarketplaces son arrays de objetos de fuente. Esta lista de permitidos admite un propietario de GitHub y un host interno:
{
"strictKnownMarketplaces": [
{ "source": "github", "repo": "your-org/*" },
{ "source": "hostPattern", "hostPattern": "^git\\.example\\.com$" }
]
}
Mensajes de validación
claude plugin validate <path> toma la raíz del marketplace o el archivo marketplace en sí. Imprime errores y advertencias. Para códigos de salida y --strict, consulte plugin validate.
Un mensaje nombra una entrada de plugin por su índice, escrito como plugins.1.source o plugins[1].source.
Un mensaje prefijado con un índice de entrada y plugin.json →, como plugins[2] plugin.json →, es sobre los propios archivos de ese plugin. claude plugin validate reporta errores enumera esos mensajes con sus correcciones.
Las advertencias que mencionan nombres de banderas de Claude Desktop señalan nombres que Claude Desktop rechaza.
La tabla asigna mensajes de nivel de marketplace al campo sobre el que trata cada uno.
| Mensaje | Nivel | Campo |
|---|---|---|
Marketplace must have a name |
Error | name está vacío |
Marketplace name cannot contain spaces. Use kebab-case (e.g., "my-marketplace") |
Error | name |
Marketplace name cannot contain path separators (/ or \), ".." sequences, or be "." |
Error | name |
Marketplace name impersonates an official Anthropic/Claude marketplace |
Error | name. Consulte Nombres reservados |
Marketplace name cannot contain control or bidirectional-formatting characters |
Error | name contiene un carácter de control, como un escape o una nueva línea, o un carácter de formato bidireccional Unicode |
Marketplace name "inline" is reserved for --plugin-dir session plugins, y las variantes builtin, skills-dir, synced, claude-plugin-test, npm, pip, uv, cargo, github y gh |
Error | name |
Author name cannot be empty |
Error | owner.name |
Plugin name cannot contain spaces. Use kebab-case (e.g., "my-plugin") |
Error | plugins[i].name |
Plugin name cannot contain control or bidirectional-formatting characters |
Error | plugins[i].name |
Plugin name "x" is reserved: it passes as one of Anthropic's own |
Error | plugins[i].name. Consulte el name del manifiesto para los nombres reservados |
Plugin name "x" reads as one of Anthropic's own |
Advertencia | plugins[i].name |
Claude Code cannot install plugins from marketplace "x". Each part of a plugin id (plugin@marketplace) may use only the letters a-z and A-Z, digits, ".", "_" and "-", and must start with a letter or digit. Change the marketplace's "name". |
Error | name |
Claude Code cannot install plugin "x". Each part of a plugin id (plugin@marketplace) may use only the letters a-z and A-Z, digits, ".", "_" and "-", and must start with a letter or digit. Change this entry's "name". |
Error | plugins[i].name |
Duplicate plugin name "x" found in marketplace |
Error | Dos entradas comparten un name |
plugins.i.source: Invalid input |
Error | El source de la entrada no coincide con ningún tipo. Consulte Entrada inválida en una fuente |
plugins.i.source: Invalid string: must start with "./" |
Error | Un source de ruta relativa sin el ./ inicial. Antes de v2.1.285, este error imprimía Invalid input en su lugar |
plugins[i].source: Path contains "..": <path> |
Error | Un source relativo que escapa de la raíz del marketplace |
source.source: 'unsupported' is a parse-time placeholder and cannot be authored |
Error | plugins[i].source |
Plugin "x" sets headersHelper but is not "strict": false |
Error | plugins[i].headersHelper, en una entrada archive |
chain does not resolve (<reason>) — target must be a name in plugins[], a key in renames, or null |
Error | renames.<old> |
target "x" is not a valid plugin name (PluginIdSchema) |
Error | renames.<old> |
Unknown field 'x'. Claude Code ignores it at load time. |
Advertencia | La clave nombrada en el nivel superior, bajo metadata, en una entrada, o bajo el relevance de una entrada |
Marketplace has no plugins defined |
Advertencia | plugins está vacío |
Plugin "x" sets headers/headersHelper, which only apply to "archive" sources; they have no effect on this entry. |
Advertencia | plugins[i].headers o plugins[i].headersHelper, en una entrada cuyo source no es archive |
Plugin "x" fetches its archive with a headersHelper but sets no sha256 pin |
Advertencia | plugins[i].source.sha256 |
Header "x" is a request-routing/identity header that catalog entries may not set; Claude Code drops it at download time. |
Advertencia | plugins[i].headers.<name> |
Local source "x" is or traverses a symlink, so <path> was not read |
Advertencia | plugins[i].source |
No marketplace description provided. Adding a description helps users understand what this marketplace offers |
Advertencia | description |
Entry declares version "x" but <path>/plugin.json says "y". At install time, plugin.json wins |
Advertencia | plugins[i].version, en una entrada de ruta relativa |
'relevance' must be an object containing topic and signals; got <type>. It will be ignored at load time. |
Advertencia | plugins[i].relevance |
'metadata' must be a free-form object; got <type>. It will be ignored at load time. |
Advertencia | plugins[i].metadata |
'experimental' must be an object containing component declarations; got <type>. It will be ignored at load time. |
Advertencia | plugins[i].experimental |
Marketplace name "x" is reserved in Claude Desktop |
Advertencia | name es org, org-provisioned u unknown. Claude Desktop rechaza el marketplace |
Marketplace name "x" is not accepted by Claude Desktop (letters, digits, ".", "_", "-"; must start alphanumeric; max 128 chars) |
Advertencia | name. Claude Desktop rechaza el marketplace |
Plugin name "x" is not accepted by Claude Desktop (letters, digits, ".", "_", "-"; must start alphanumeric; max 128 chars) |
Advertencia | plugins[i].name. Claude Desktop descarta la entrada |
Entrada inválida en una fuente
Invalid input en un source significa que el objeto no coincidió con ningún tipo de fuente. Verifique estas causas:
- Un
packagenpm que contiene.. - Un tipo de
sourceque no es uno de las fuentes de plugins - Un tipo conocido con un campo obligatorio faltante o de tipo incorrecto, como
githubsinrepo
Una ruta relativa que no comienza con ./, que no sea "." o un nombre desnudo bajo metadata.pluginRoot, falla con Invalid string: must start with "./". Antes de v2.1.285, imprimía Invalid input como las causas anteriores.
Fallos que la validación no detecta
claude plugin validate no reporta cada fallo. Un hooks de entrada escrito como una ruta de archivo o array aprueba la validación, y el error aparece solo cuando el plugin se carga, como describe Hooks en una entrada. Los errores al obtener un source también aparecen solo después de instalar, no en la validación.
claude plugin list muestra un plugin que falló al cargar con su error, y Solucionar problemas de plugins cubre las cadenas de tiempo de carga.
Próximos pasos
- Crear un marketplace: construya un marketplace a partir de estos campos e instale desde él localmente
- Alojar y mantener un marketplace: dónde poner el archivo y cómo los usuarios reciben cambios
- Referencia de manifiesto de plugin: los campos
plugin.jsonque una entrada puede anular - Administrar plugins para su organización: recetas de lista de permitidos y lista de bloqueados que usan estos valores de fuente