.claude-plugin/plugin.json que reemplaza o se suma a esa carpeta, y un nombre que ve el usuario. Para la tabla de campos completa de cada clave, consulte la referencia de manifiesto.
Utilice esta página para agregar un componente a un plugin que ya se carga.
Después de agregar un componente, ejecute /reload-plugins en una sesión en ejecución o inicie una nueva para que Claude Code lo cargue. Para verificar el archivo del componente antes de cargarlo, ejecute claude plugin validate . en su shell desde el directorio del plugin.
Estos casos se tratan en otras páginas:
- Construir su primer plugin: comience con Crear un plugin
- Instalar el plugin de otra persona: consulte Instalar plugins
- Los usuarios de su plugin están en claude.ai o en Cowork: se carga un conjunto diferente de componentes allí. Consulte Plugins en claude.ai y en Cowork
Explorar el directorio del plugin
El explorador muestra un plugin de ejemplo,my-plugin, que tiene uno de cada tipo de componente en su ubicación predeterminada:
- Una skill de revisión y un comando
about - Un subagente de revisión de seguridad
- Un hook que formatea archivos después de que Claude los edita, y la carpeta
scripts/que llama - Un monitor de registro
- Un estilo de salida y un tema de color
- Un flujo de trabajo de auditoría de rutas
- Un ejecutable
hello-plugin - Configuración predeterminada
- Un servidor MCP local y un servidor de lenguaje Go
Agregar cada tipo de componente
Cada sección a continuación cubre un tipo de componente: dónde van sus archivos en el plugin, un ejemplo que valida, qué ve el usuario una vez que se carga el plugin, y la clave de manifiesto que cambia la ubicación predeterminada. Agregue los que su plugin necesite; ninguno es obligatorio.Skills
Una skill es un archivoSKILL.md que Claude puede cargar cuando su descripción coincide con la tarea. El usuario también puede ejecutarla como un comando. Guarde cada skill en su propio directorio bajo skills/:
SKILL.md una description para que Claude sepa cuándo usarla:
skills/review/SKILL.md
/my-plugin:review ejecuta la skill. El nombre del comando y quién puede invocarlo siguen estas reglas:
- Nombre del comando:
/<plugin>:<directory>, así queskills/review/SKILL.mdenmy-plugines/my-plugin:review. Si establecenameen el frontmatter, reemplaza el último segmento y el prefijo del plugin permanece. Consulte cómo una skill obtiene su nombre de comando - Quién la invoca: Claude, el usuario, o ambos, controlado por frontmatter. Consulte Controlar quién invoca una skill
skills/:
- Directorios adicionales: enumérelos en la clave de manifiesto
skills. Se suman al escaneo predeterminado deskills/en lugar de reemplazarlo, a diferencia decommandsyagents - Una única skill en la raíz del plugin: sin directorio
skills/y sin clave de manifiestoskills, unSKILL.mden la raíz del plugin se carga como una skill. Establezcanameen su frontmatter, porque de lo contrario una instalación de marketplace nombra la skill después de su directorio de caché en lugar de su plugin
CLAUDE.md en la raíz del plugin, y claude plugin validate advierte CLAUDE.md at the plugin root is not loaded as project context.
Para campos de frontmatter y archivos de apoyo, consulte Skills.
Comandos
Un comando es un único archivo Markdown que el usuario ejecuta por nombre, como/my-plugin:about.
Los comandos son el formato anterior, y skills los reemplazan para trabajo nuevo. Una skill se ejecuta por nombre de la misma manera, y también puede llevar archivos de apoyo en su directorio. Mantenga
commands/ para archivos que está moviendo desde .claude/commands/.commands/<file>.md y se convierte en /<plugin>:<file>. Un subdirectorio agrega un segmento, así que commands/db/migrate.md es /my-plugin:db:migrate.
Los archivos de comando toman el mismo frontmatter que las skills.
Definir comandos en el manifiesto
Solo necesita esto si desea mantener archivos de comando en algún lugar que no seacommands/, o para definir un comando corto dentro de plugin.json sin un archivo Markdown separado. Establezca la clave de manifiesto commands, y Claude Code la lee en lugar de escanear commands/. La clave toma una ruta, una matriz de rutas, u un objeto que asigna cada nombre de comando a un archivo source o contenido content en línea.
Este manifiesto define /my-plugin:about en línea, sin archivo Markdown:
.claude-plugin/plugin.json
/my-plugin:about en la sesión para confirmar que se cargó.
Para la sintaxis completa de la clave, consulte commands.
Agentes
Un subagente es un asistente separado, con sus propias instrucciones y ventana de contexto, al que Claude puede delegar una tarea. Cada archivo Markdown bajoagents/ define uno:
agents/security-reviewer.md
my-plugin:security-reviewer, y el usuario puede invocarlo explícitamente con @agent-my-plugin:security-reviewer. La forma del nombre es <plugin>:<name>, donde <name> viene del frontmatter, o del nombre del archivo cuando no hay ninguno.
La clave de manifiesto agents reemplaza el escaneo de agents/.
Organizar agentes en subcarpetas
Puede colocar archivos de agente del plugin en subcarpetas deagents/. Claude Code los carga recursivamente y une el nombre del plugin, cada nombre de subcarpeta y el nombre del archivo con dos puntos para formar el nombre con alcance del agente. Por ejemplo, agents/review/security.md en un plugin llamado my-plugin se carga como my-plugin:review:security. Dos configuraciones cambian ese nombre:
- Frontmatter
name: reemplaza solo el nombre del archivo, así quename: auditenagents/review/security.mdse carga comomy-plugin:review:audit - Campo de manifiesto
agents: un archivo que enumera allí se carga sin nombres de subcarpeta, así que"agents": "./custom/review/security.md"se carga comomy-plugin:security
Campos de frontmatter en agentes de plugin
El frontmatter de un agente de plugin sigue estas reglas:- Campos admitidos:
name,description,model,effort,maxTurns,tools,disallowedTools,skills,memory,background,omitClaudeMd,isolation,color, y la clavecacheTtldeexperimental. El único valor válido deisolationes"worktree". Consulte campos de frontmatter admitidos para ver qué hace cada uno - Campos ignorados:
permissionMode,hooks,mcpServers, einitialPrompt. Un archivo de agente no puede agregar hooks o servidores MCP por su cuenta, así que agregue esos como plugin hooks y servidores MCP en su lugar - Frontmatter que no se analiza: el agente aún se carga con cada campo ignorado. Se nombra después del archivo, y su descripción dice
Agent from my-plugin plugin. Ejecuteclaude plugin validateen su shell para encontrar estos archivos
Hooks
Un hook ejecuta algo automáticamente en un punto del ciclo de vida de Claude Code, como después de cada edición de archivo: un comando de shell, una solicitud HTTP, una llamada a herramienta MCP, un indicador a un modelo o un subagente. Guarde los hooks del plugin enhooks/hooks.json en la raíz del plugin, bajo una clave "hooks" de nivel superior, en la misma forma que el objeto hooks en settings.json. Eso le permite copiar un hook de configuración existente sin cambios.
Este hook ejecuta un script incluido después de cada Write o Edit:
hooks/hooks.json
scripts/format.sh y hágalo ejecutable.
Cargue el plugin y pida a Claude que edite un archivo. Un hook PostToolUse que sale con 0 no muestra nada en la transcripción, así que confirme que se ejecutó con registro de depuración o por lo que el script mismo cambia.
Los hooks en hooks/hooks.json y en la clave de manifiesto hooks se cargan ambos. Para cada evento y su carga útil, consulte Eventos de hook.
Cuándo se activan los hooks del plugin
Los hooks de un plugin no esperan a que se use una de las skills o comandos del plugin. Claude Code los registra cuando una sesión carga el plugin, y se activan en sus eventos a partir de entonces. Para limitar cuándo se ejecuta un hook, reduzca sumatcher.
Si un hook nunca se activa, consulte hooks que no se activan.
Entorno, entrecomillado y coincidencia de herramientas MCP
El entorno del hook, el entrecomillado de${CLAUDE_PLUGIN_ROOT} y los matchers para las herramientas MCP propias del plugin funcionan de la siguiente manera:
- Entorno: cada proceso de hook recibe
CLAUDE_PLUGIN_ROOTyCLAUDE_PLUGIN_DATAen su entorno, másCLAUDE_PLUGIN_OPTION_<KEY>para cada valor de configuración del usuario, para que su script pueda leerlos desde allí - Entrecomillado: cuando
commandno tieneargs, se ejecuta a través de un shell, así que envuelva la ruta${CLAUDE_PLUGIN_ROOT}entre comillas dobles, como hace el ejemplohooks/hooks.jsonbajo Hooks, para mantener la ruta expandida como una palabra de shell. Cuando pasaargsen su lugar, cada elemento se pasa como un argumento sin shell y no necesita entrecomillado. Consulte forma exec y forma shell - Coincidencia de las herramientas MCP propias del plugin: una herramienta de un servidor MCP que este plugin declara se llama
mcp__plugin_<plugin>_<server>__<tool>, así que escriba ese nombre completo en el matcher. Un matcher solo en el nombre del servidor nunca se activa. Consulte Coincidir herramientas MCP
Servidores MCP
Un servidor MCP proporciona a Claude herramientas de un sistema externo. Declárelo en.mcp.json en la raíz del plugin, en la misma forma que un .mcp.json de proyecto. Este .mcp.json declara un servidor llamado db:
.mcp.json
mcpServers y poner db en el nivel superior del archivo.
Cargue el plugin y ejecute /mcp para confirmar que el servidor aparece como plugin:my-plugin:db.
claude plugin validate verifica .mcp.json e informa una entrada de servidor que Claude Code descartaría en el tiempo de carga como un error. Requiere Claude Code v2.1.281 o posterior.
Para ver dónde aparece una entrada incorrecta en el tiempo de carga, consulte Servidores MCP que no se inician.
La clave de manifiesto mcpServers toma un mapa de servidor en línea, una ruta a un archivo JSON, o una matriz de esos. Cuando un servidor de manifiesto tiene el mismo nombre que uno en .mcp.json, el servidor de manifiesto lo reemplaza.
Alcanzar usuarios en claude.ai y Cowork
Un servidor stdio local, como el servidordb bajo Servidores MCP, se ejecuta en Claude Code y en una sesión de Cowork que se ejecuta en su máquina en la aplicación Claude Desktop, pero no en claude.ai. Para alcanzar a los usuarios allí también, haga referencia a un servidor remoto por su URL https://, que claude.ai y Cowork ofrecen al usuario como un conector.
Nombres de servidor, nombres de herramientas y recargas
Los nombres del servidor, la sustitución de variables y el comportamiento de recarga siguen estas reglas:- Nombre del servidor:
plugin:<plugin>:<server>, así que el servidordbenmy-pluginesplugin:my-plugin:dben/mcp. Use la misma forma para nombrar el servidor en un hookmcp_tool - Nombres de herramientas:
mcp__plugin_<plugin>_<server>__<tool>, así que una herramientaqueryen ese servidordbesmcp__plugin_my-plugin_db__query. Ese es el nombre a usar en reglas de permisos y matchers de hook - Sustitución:
${CLAUDE_PLUGIN_ROOT}y las otras variables de ruta se sustituyen encommand,argsyenv. No se necesita entrecomillado enargs, porque cada elemento se pasa como un argumento - Recarga: cuando el usuario ejecuta
/reload-pluginsy la recarga se aplica, un servidor cuya configuración no ha cambiado mantiene su conexión. Un servidor cuya configuración cambió se reconecta, y uno que eliminó se desconecta
Incluir un servidor MCPB empaquetado
La clavemcpServers también acepta un servidor empaquetado como un archivo MCPB, cuya extensión es .mcpb o la anterior .dxt. Apunte la clave al archivo, como una ruta dentro del plugin o una URL https://:
.claude-plugin/plugin.json
name en el manifiesto del paquete.
Para transportes y autenticación, consulte MCP.
Servidores LSP
Un servidor LSP proporciona a Claude diagnósticos y navegación de código para un lenguaje. Si un plugin oficial de inteligencia de código ya cubre su lenguaje, instale ese en su lugar de escribir uno. De lo contrario, declare el servidor en.lsp.json en la raíz del plugin:
.lsp.json
command es el nombre del binario, con sus argumentos en args. extensionToLanguage necesita al menos una extensión, cada una comenzando con ..
claude plugin validate no lee este archivo. Cuando cualquier entrada es inválida, todo el archivo se omite en la carga y Invalid LSP server config for ".lsp.json" aparece en la pestaña Errors de /plugin.
Su plugin configura la conexión pero no instala el binario del servidor, y cada extensión de archivo obtiene un servidor:
- Binario faltante: Claude Code inicia
commandpor nombre desde elPATHdel usuario. Cuando el binario no está allí, el servidor falla al iniciarse yclaude --debugregistraLSP server <name> failed to start - Conflictos de extensión: cuando dos servidores habilitados reclaman la misma extensión, el primero registrado maneja esos archivos y el otro no se usa para ellos, ya sea que los servidores provengan de un plugin o dos. La pestaña Errors de
/pluginmuestra la advertenciaLSP server "<name>" is not used for <ext> files
lspServers toma el mismo mapa en línea, una ruta a un archivo JSON, o una matriz de esos, y sus servidores se suman a los de .lsp.json. Cuando un servidor de manifiesto tiene el mismo nombre que uno en .lsp.json, el servidor de manifiesto lo reemplaza.
Para transport, tiempos de espera, reinicios y los otros campos, consulte lspServers.
Envíe la salida de registro a stderr, no a stdout. Claude Code lee el stdout de un servidor solo como mensajes de protocolo, y acepta encabezados de mensaje de hasta 64 KiB y un cuerpo de mensaje de hasta 32 MiB.
Claude Code desconecta un servidor que excede cualquiera de los límites o escribe salida que no es de protocolo a stdout, y cuenta la desconexión como un bloqueo para restartOnCrash y maxRestarts. Cuando ejecuta con --debug, Claude Code escribe un error que nombra la causa en el registro de depuración.
Ejecutables
Los archivos enbin/ en la raíz del plugin están en el PATH del shell de la herramienta Bash mientras el plugin está habilitado, para que Claude pueda ejecutarlos como comandos simples. Agregue un script ejecutable:
bin/hello-plugin
chmod +x bin/hello-plugin y cargue el plugin. Cuando pide a Claude que ejecute hello-plugin, el resultado de la herramienta Bash muestra la salida del script.
Los directorios bin/ del plugin vienen después de las entradas PATH propias del usuario, así que un plugin no puede sombrear git, ls u otro comando del sistema.
claude.ai y Cowork no instalan un plugin que tenga un directorio bin/ de nivel superior, incluido uno que distribuya a través de la configuración de la organización de claude.ai.
Configuración predeterminada
Para establecer valores predeterminados que se apliquen mientras el plugin está habilitado, agregue unsettings.json en la raíz del plugin, o coloque el mismo objeto en línea en la clave de manifiesto settings. Dos claves tienen efecto, agent y subagentStatusLine, y todas las demás claves se descartan.
Establezca agent para ejecutar uno de los agentes propios del plugin como el hilo principal:
settings.json
security-reviewer y el modelo.
Para todo lo que controla la clave, consulte la configuración agent.
Cuando la misma clave se establece en más de un lugar, estas reglas deciden qué valor se aplica:
- Archivo sobre manifiesto: cuando ambos existen y
settings.jsonestablece al menos una clave admitida,settings.jsonse aplica y elsettingsdel manifiesto se ignora - Configuración del usuario sobre valores predeterminados del plugin: en todas las fuentes de configuración, los valores predeterminados del plugin son la capa más baja, así que un
agentpropio del usuario en~/.claude/settings.jsonanula el suyo - Dos plugins establecen la misma clave: el valor del plugin cargado último se aplica, y
claude --debugregistraoverrides setting
subagentStatusLine, consulte líneas de estado de subagente.
Temas y estilos de salida
Un plugin puede incluir temas de color y estilos de salida. Ambos aparecen en los mismos selectores que los del usuario. Para cualquiera de los dos, establecer la clave de manifiesto reemplaza el escaneo de carpeta.
Los temas del plugin son de solo lectura, así que cuando un usuario edita uno en
/theme, la edición se guarda como una copia en su propio directorio de temas.
Este tema recolora el acento del indicador y el texto de error en el preajuste oscuro:
themes/dracula.json
Canales
Un canal permite que un sistema externo como una aplicación de chat envíe mensajes a una sesión. En un plugin, un canal es uno de los servidores MCP más una entradachannels que se vincula a él y puede solicitar su propia configuración. Este manifiesto vincula un canal a un servidor telegram y solicita un token de bot:
.claude-plugin/plugin.json
server debe coincidir con una clave en mcpServers. El userConfig por canal toma la misma forma que la clave userConfig de nivel superior.
Para lo que el servidor debe implementar y cómo los usuarios habilitan un plugin de canal, consulte Empaquetar como un plugin en la referencia de canales. Para la tabla de campos, consulte channels.
Monitores
Un monitor es un comando de shell que se ejecuta en segundo plano durante toda la sesión. Lo que imprime llega a Claude como notificaciones, para que Claude pueda reaccionar a un registro o un cambio de estado sin que se le pida que lo observe. Guarde las entradas enmonitors/monitors.json:
monitors/monitors.json
- Solo sesiones interactivas: los monitores del plugin comienzan en una sesión interactiva y nunca en modo no interactivo con la bandera
-p. También comienzan solo donde la herramienta Monitor está disponible - Sin configuración del usuario:
commandobtiene las variables de ruta y${ENV_VAR}del entorno, pero nunca${user_config.*}. Un monitor que hace referencia a uno no comienza, y los procesos de monitor tampoco recibenCLAUDE_PLUGIN_OPTION_<KEY> - Deshabilitación a mitad de sesión: si deshabilita un plugin a mitad de sesión, Claude Code no detiene los monitores que ya se están ejecutando. Se detienen cuando termina la sesión
experimental.monitors toma la misma matriz en línea o una ruta a un archivo JSON, y se lee en lugar de monitors/monitors.json.
Para el disparador when y los otros campos, consulte monitors.
Pedir al usuario valores de configuración
Declare los valores que su plugin necesita del usuario en la clave de manifiestouserConfig, para que los usuarios no editen settings.json ellos mismos. Cada opción aparece en un diálogo con su title como etiqueta y su description debajo.
Establezca "sensitive": true para un token o contraseña. El diálogo entonces enmascara la entrada, y el valor se almacena en almacenamiento seguro en lugar de settings.json.
Este manifiesto solicita un punto final y un token:
.claude-plugin/plugin.json
Cuándo aparece el diálogo de configuración
El diálogo aparece solo en la interfaz interactiva/plugin. Se abre para cualquier opción que aún no esté establecida cuando el usuario hace cualquiera de lo siguiente:
- Instala el plugin en
/plugin - Ejecuta
/plugin install <plugin>@<marketplace>dentro de una sesión - Habilita el plugin desde la pestaña Installed en
/plugin
/plugin configure <plugin>@<marketplace>.
El comando de shell claude plugin install nunca solicita valores de userConfig. Para establecer valores desde el shell, pase cada uno como --config KEY=VALUE. Cuando las opciones permanecen sin establecer, el comando imprime una línea userConfig options not yet set que nombra ambas formas de establecerlas. El diálogo userConfig nunca aparece cita la línea.
Para los campos de opción, dónde se almacena cada valor, cómo un componente hace referencia a un valor guardado, y qué campos rechazan ${user_config.*}, consulte Configuración del usuario.
Hacer referencia a rutas de plugin y almacenar datos
No sabe dónde se instalará su plugin, así que haga referencia a sus archivos y datos a través de estas variables en lugar de rutas fijas. Se sustituyen en contenido de skill, comando y agente, en comandos de hook y monitor, y en configuraciones de servidor MCP y LSP. También se exportan a procesos de hook, MCP y LSP:${CLAUDE_PLUGIN_ROOT}: el directorio de instalación del plugin. Cada versión tiene su propio directorio de caché, así que la ruta cambia cuando el plugin se actualiza. No escriba estado allí${CLAUDE_PLUGIN_DATA}: un directorio que sobrevive a las actualizaciones, paranode_modules, entornos virtuales y cachés. Se resuelve a~/.claude/plugins/data/<id>/y se crea cuando se hace referencia por primera vez${CLAUDE_PROJECT_DIR}: la raíz del proyecto, el mismo valor que los hooks reciben
<id> es el identificador del plugin con cada carácter que no sea letra, dígito, _ y - reemplazado por -, así que my-plugin@my-marketplace se convierte en my-plugin-my-marketplace.
En Windows, las rutas sustituidas usan barras diagonales para que un shell no lea las barras invertidas como escapes.
Instalar dependencias en el directorio de datos
Para un plugin instalado desde marketplace, Claude Code instala automáticamente dependencias de paquetes Node.js elegibles cuando almacena en caché el plugin, así que es posible que no necesite instalarlas usted mismo. Cuando lo hace, este hookSessionStart instala node_modules en ${CLAUDE_PLUGIN_DATA} en la primera ejecución y nuevamente después de que una actualización cambie package.json:
hooks/hooks.json
~/.claude/plugins/data/<id>/node_modules existe. Un servidor MCP puede entonces establecer NODE_PATH a ${CLAUDE_PLUGIN_DATA}/node_modules en su env. Para qué campos sustituyen qué variable, consulte Variables de entorno.
Próximos pasos
- Referencia de manifiesto de plugin: campos
plugin.json, reglas de ruta y el diseño estándar - Probar plugins con evals: verifique que los componentes que agregó cambien el comportamiento de Claude de la manera que pretende
- Publicar y distribuir un plugin: versione el plugin y colóquelo en un marketplace
- Solucionar problemas de plugins: qué hacer cuando un componente no se carga o un hook no se activa