Skip to main content
Un plugin es un directorio de skills, agentes, hooks y servidores MCP, más un archivo plugin.json, llamado el manifiesto, que nombra el plugin. Claude Code carga el directorio como una unidad, por lo que puede compartirlo con compañeros de equipo, instalarlo en varios proyectos o publicarlo en un marketplace. Esta página es para personas que escriben sus propios plugins.
Estos casos se cubren en otras páginas:
Comience desde la sección que coincida con lo que ya tiene:

Decidir cuándo usar un plugin

Skills, agentes, hooks y servidores MCP funcionan todos de forma independiente en su proyecto o directorio de inicio. Mantenga esa configuración independiente mientras sirva a un proyecto o solo a usted. Cree un plugin cuando desee compartir la configuración con compañeros de equipo, instalarlo en varios proyectos o publicar versiones lanzadas. Cuando mueve skills, agentes, hooks y configuración MCP independientes a un plugin, su ubicación y nombres cambian:
  • Dónde van los archivos: bajo el directorio propio del plugin, llamado la raíz del plugin, como skills/, agents/, hooks/hooks.json y .mcp.json.
  • Cómo se nombran: los skills y agentes del plugin obtienen el nombre del plugin como prefijo, como /my-plugin:hello, por lo que dos plugins pueden proporcionar cada uno un skill hello sin colisionar.
Para mover una configuración existente a un plugin, consulte Convertir una configuración .claude/ existente.

Crear su primer plugin

En este recorrido, crea un plugin cuyo único componente es un skill, un saludo, y lo ejecuta con --plugin-dir, que carga un plugin para una sesión sin instalarlo. Un plugin puede contener cualquier mezcla de componentes, como skills, agentes, hooks y servidores MCP, y ninguno es requerido; un skill es el ejemplo más pequeño que muestra el diseño. Necesita Claude Code instalado e iniciado sesión. Abra una terminal en el directorio donde desea mantener el plugin, como ~/projects, y ejecute los comandos en estos pasos desde él. Puede mantener un plugin en cualquier lugar, porque pasa su ruta a Claude Code cuando inicia una sesión.
1

Crear el directorio del plugin

Cree el directorio del plugin, con una carpeta .claude-plugin/ dentro para mantener el manifiesto:
2

Escribir el manifiesto

El manifiesto es un archivo JSON llamado plugin.json que le dice a Claude Code el nombre del plugin y lo describe. Guarde este como my-first-plugin/.claude-plugin/plugin.json:
my-first-plugin/.claude-plugin/plugin.json
Los cuatro campos hacen esto:
  • name: requerido. Identifica el plugin y se convierte en el prefijo en cada skill y agente que proporciona el plugin. No ponga espacios en él.
  • description: el texto que los usuarios ven para el plugin en /plugin.
  • version: opcional. Configurarlo mantiene a los usuarios en esa versión hasta que la cambie; Lanzar una nueva versión dice cuándo configurarla u omitirla.
  • author: a quién acreditar. name es requerido dentro de él; email y url son opcionales.
Todos los demás campos están en la referencia del manifiesto.Solo plugin.json va dentro de .claude-plugin/. El skill que agrega a continuación va directamente bajo my-first-plugin/, junto a esa carpeta.
3

Agregar un skill

El único componente de este plugin es un skill. Cada skill es un directorio bajo skills/ que contiene un archivo SKILL.md. Cree el directorio del skill:
Luego cree my-first-plugin/skills/hello/SKILL.md con este contenido:
my-first-plugin/skills/hello/SKILL.md
La línea disable-model-invocation: true significa que Claude no ejecuta el skill por su cuenta, por lo que solo usted lo activa. Elimine esa línea de un skill que desee que Claude ejecute por su cuenta. El comando del skill combina el nombre del plugin y el nombre del skill, por lo que ejecuta este como /my-first-plugin:hello. Para los otros campos del frontmatter, consulte la referencia del frontmatter del skill.
4

Validar el plugin

Verifique el manifiesto y el frontmatter del skill antes de ejecutar nada:
El comando imprime la ruta del manifiesto que verificó y ✔ Validation passed. Si imprime ✘ Validation failed en su lugar, cada línea anterior a esa línea de resultado nombra el campo a corregir. Busque cada mensaje bajo claude plugin validate reporta errores.
5

Ejecutar Claude Code con el plugin

Inicie una sesión con el plugin cargado:
Una vez que Claude Code se inicia, ejecute el skill:
Claude responde con un saludo.
El plugin se carga solo en sesiones que inicia con --plugin-dir. Para continuar trabajando en él sin la bandera, o para probar una compilación .zip, consulte Desarrollar sin un marketplace.

Compartir su plugin

Un plugin que construyó con Crear su primer plugin existe solo en su máquina. Cuando está listo para otras personas, hay tres formas de llevarlo a ellas:

Diseño del plugin

Cada tipo de componente, como skills, agentes, hooks y servidores MCP, va en un directorio fijo bajo la raíz del plugin, que es el directorio que pasa a --plugin-dir. Agregue solo los directorios que use. Para hacer clic a través de un directorio de plugin completo y leer qué hace cada archivo, abra el explorador de plugins. La tabla enumera los directorios con los que la mayoría de los plugins comienzan, y el diseño completo enumera el resto.
Solo plugin.json va dentro de .claude-plugin/. Los componentes guardados allí no se cargan.La raíz del plugin es el directorio propio del plugin, no ~/.claude/ en sí. Un .mcp.json guardado en ~/.claude/.mcp.json no se carga.

Desarrollar sin un marketplace

No necesita un marketplace para ejecutar un plugin que está escribiendo. Cárguelo directamente desde el disco o una URL en su lugar:
  • --plugin-dir: carga un directorio o archivo .zip para una sesión.
  • --plugin-url: obtiene un archivo .zip de una URL para una sesión.
  • claude plugin init: estructura un plugin bajo ~/.claude/skills/ que se carga cada sesión.
Si dos plugins cargados de diferentes formas comparten un nombre, consulte Conflictos de nombres para ver cuál mantiene Claude Code.

Cargar un plugin para una sesión

Puede cargar un plugin para una sola sesión de tres formas: desde un directorio o archivo .zip en el disco con --plugin-dir, desde una URL con --plugin-url, o desde una variable de entorno cuando no puede agregar una bandera. Cada plugin se carga solo para esa sesión, y nada se escribe en su configuración para él. Cuando edita los archivos del plugin durante la sesión, ejecute /reload-plugins para cargar los cambios.

Desde un directorio o .zip

Cuando inicia claude desde su shell, pase --plugin-dir con el directorio raíz del plugin o un archivo .zip del mismo. Repita la bandera para cargar varios plugins:

Desde una carpeta de plugins

Para cargar varios plugins desde un lugar, pase una carpeta que los contenga, como --plugin-dir ./plugins. Cargar una carpeta de plugins requiere Claude Code v2.1.265 o posterior. Si la carpeta no tiene un directorio .claude-plugin/ y no tiene componentes de plugin en su nivel superior, Claude Code la trata como una carpeta de plugins. Cada subcarpeta inmediata que tenga un manifiesto .claude-plugin/plugin.json se carga como un plugin separado. Todo lo demás en la carpeta se omite sin un error, incluida una subcarpeta que no tiene manifiesto. Si un plugin en la carpeta no se carga, verifique que su subcarpeta tenga un .claude-plugin/plugin.json. En una sesión interactiva, también puede agregar y eliminar plugins en la carpeta después del inicio:
  • Una subcarpeta que agrega se carga como un nuevo plugin una vez que existe su manifiesto.
  • Cuando elimina una subcarpeta, su plugin se descarga.
Un mensaje aparece en la sesión para cada uno de estos cambios. Si cargar o descargar un plugin a mitad de la conversación invalidaría el caché de prompt, el cambio se retiene en su lugar, y el mensaje le dice que ejecute /reload-plugins para aplicarlo.

Desde una URL

Cuando inicia claude desde su shell, pase --plugin-url con la dirección de un archivo .zip, como un artefacto de compilación que su CI publica:
Claude Code descarga el archivo al inicio. Para cargar varios, repita la bandera o pase las URLs separadas por espacios en un argumento entrecomillado. Apunte la bandera solo a archivos que controle o en los que confíe. Si Claude Code no puede obtener el archivo, o el archivo no es válido, se inicia sin el plugin y registra un error de carga de plugin que puede revisar en la pestaña Errors del administrador /plugin.

Desde una variable de entorno

Para cargar plugins en una sesión donde no puede agregar la bandera --plugin-dir, enumere sus rutas absolutas en la variable de entorno CLAUDE_CODE_PLUGIN_DIRS en su lugar. Claude Code carga cada ruta como carga una ruta --plugin-dir. Estos plugins se cargan además de cualquiera que pase con --plugin-dir. La configuración del proyecto y local no puede establecer esta variable. CLAUDE_CODE_PLUGIN_DIRS requiere Claude Code v2.1.280 o posterior. La configuración administrada puede desactivar --plugin-dir y CLAUDE_CODE_PLUGIN_DIRS. Consulte Banderas que cargan un plugin para una sesión. Para probar un plugin junto con un plugin del que depende, consulte Probar un plugin y su dependencia localmente.

Hacer que un plugin se cargue en cada sesión

Su directorio de skills personal es ~/.claude/skills/. Claude Code carga cualquier carpeta allí que contenga un .claude-plugin/plugin.json como un plugin en cada sesión, sin bandera y sin paso de instalación. claude plugin init estructura uno de estos plugins para usted.

Estructurar el plugin con claude plugin init

claude plugin init escribe un plugin de inicio bajo ~/.claude/skills/. Requiere Claude Code v2.1.157 o posterior. Estructure uno desde su shell:
El comando crea ~/.claude/skills/my-tool/ con un .claude-plugin/plugin.json y un SKILL.md raíz. Imprime ✔ Created plugin "my-tool" at ~/.claude/skills/my-tool seguido de It will auto-load next session as my-tool@skills-dir. Run /reload-plugins to load it now. Pase --with skills para que claude plugin init estructura un skill bajo skills/ para usted. Los otros valores --with están en la referencia de comandos de plugin.

Nombrar los skills del plugin

El skill raíz en ~/.claude/skills/my-tool/SKILL.md también es un skill personal, por lo que lo invoca como /my-tool, no /my-tool:my-tool. Los skills que agrega bajo skills/ dentro del plugin obtienen el prefijo del nombre del plugin, como /my-tool:example.

Dejar de cargar el plugin

Para dejar de cargar un plugin estructurado, elimine su directorio, o ejecute claude plugin disable my-tool@skills-dir en su shell con el nombre my-tool@skills-dir que claude plugin init imprimió. En el ID my-tool@skills-dir, skills-dir se coloca donde iría un nombre de marketplace, porque el plugin se carga desde su directorio de skills en lugar de desde un marketplace.

Compartir el plugin a través de un repositorio

claude plugin init escribe el plugin en su directorio de skills personal en ~/.claude/skills/, por lo que se carga para usted en cada proyecto. Para hacer que un plugin se cargue para todos en un repositorio, cree el mismo diseño usted mismo en <project>/.claude/skills/<name>/, incluido su .claude-plugin/plugin.json. Consulte Plugins compartidos a través de un repositorio para las condiciones bajo las cuales Claude Code lo carga.

Probar y depurar

Cuando un cambio en su plugin no aparece, trabaje a través de estas verificaciones en orden. Cada una le dice qué hizo Claude Code con el plugin:
  1. En su shell, ejecute claude plugin validate <path>. Verifica el manifiesto y el frontmatter de cada archivo de skill, agente y comando, y sale con 0 en Validation passed. Agregue --strict para fallar también en advertencias. Los códigos de salida y el manejo de directorios están en la referencia de comandos de plugin.
  2. En la sesión en ejecución, ejecute /reload-plugins para aplicar ediciones que realizó en el disco. Imprime una línea Reloaded: con conteos. Luego confirme que un skill se cargó escribiendo su comando /plugin-name:skill, o encontrando el plugin en la pestaña Installed de /plugin.
  3. En la misma sesión, ejecute /plugin. La pestaña Installed enumera su plugin y, en los detalles del plugin, los componentes que Claude Code encontró. La pestaña Errors enumera lo que no se cargó y por qué, como una ruta en su manifiesto que no existe.
  4. De vuelta en su shell, ejecute claude plugin list. Imprime plugins de sesión única y del directorio de skills en sus propias secciones con Status: ✔ loaded o el error de carga. Para incluir el plugin que está desarrollando, pase --plugin-dir con su ruta antes de plugin list.
Para verificar un servidor MCP, ejecute /mcp en la sesión para ver el estado del servidor. Cuando el servidor es saludable, /mcp lo enumera como conectado. Si no es así, consulte Servidores MCP que no se inician. Para verificar un hook, active el evento que coincide. Por ejemplo, pida a Claude que edite un archivo para activar un hook PostToolUse. Luego lea el registro de depuración, que muestra qué hooks coincidieron, sus códigos de salida y su salida. Las siguientes secciones cubren los fallos que es más probable que encuentre mientras desarrolla, y la página de solución de problemas tiene la entrada completa para cada uno.

Una ruta de componente no se encuentra

La pestaña Errors de /plugin muestra <component> path not found: <path>, por ejemplo commands path not found. Una ruta de componente en su manifiesto, como commands, skills, agents o hooks, apunta a nada. Corrija la ruta o cree el directorio, luego ejecute /reload-plugins en la sesión. Consulte commands path not found.

--plugin-dir en una raíz de marketplace no carga los plugins bajo plugins/

--plugin-dir toma el directorio raíz del plugin, el que contiene .claude-plugin/plugin.json y los directorios de componentes como skills/. Si lo apunta a una raíz de marketplace en su lugar, Claude Code no lee marketplace.json, por lo que un plugin bajo plugins/ no se carga, y no ve ningún error. Apunte la bandera a la carpeta de un plugin, o agregue el marketplace. Consulte la entrada de solución de problemas.

El plugin se carga pero sus skills faltan

El directorio skills/ está dentro de .claude-plugin/, o una entrada skills en el manifiesto apunta a un archivo. Mueva skills/ a la raíz del plugin, apunte cada entrada skills a un directorio que contenga SKILL.md, y ejecute /reload-plugins en la sesión. Consulte El plugin se carga pero sus skills faltan.

El diálogo userConfig nunca aparece

El diálogo para las opciones userConfig de su plugin es parte de la instalación a través de /plugin en una sesión. Cargar con --plugin-dir no lo muestra, ni tampoco claude plugin install en el shell. Con el plugin cargado, ejecute /plugin configure <plugin-name> en la sesión para abrirlo. Consulte El diálogo userConfig nunca aparece.

Verificar que el plugin cambia el comportamiento de Claude

Un plugin que se carga sin errores aún puede no dirigir a Claude de la manera que pretende. claude plugin eval, que ejecuta en su shell, ejecuta sus casos de prueba con y sin el plugin y califica la diferencia. Consulte Probar plugins con evals, comenzando con Crear su primer conjunto de eval.

Convertir una configuración .claude/ existente

Si ya tiene skills, agentes o hooks bajo el directorio .claude/ de un proyecto, puede moverlos a un plugin sin reescribirlos. Ejecute los comandos en estos pasos desde la raíz del proyecto, que es el directorio que contiene .claude/, porque las rutas cp son relativas a él.
1

Crear la estructura del plugin

Cree el directorio del plugin y su carpeta .claude-plugin/ junto a .claude/. Puede mover el plugin a cualquier lugar después.
Cree my-plugin/.claude-plugin/plugin.json:
my-plugin/.claude-plugin/plugin.json
2

Copiar sus archivos existentes

Copie cada directorio de configuración que tenga a la raíz del plugin, y omita el comando para cualquier directorio que no tenga.
Ejecute ls -a my-plugin para confirmar que cada directorio que copió aparece junto a .claude-plugin.
3

Mover sus hooks

Si tiene hooks en .claude/settings.json o .claude/settings.local.json, cree un directorio de hooks:
Cree my-plugin/hooks/hooks.json y copie el objeto hooks de su archivo de configuración en él. El formato es el mismo.Este ejemplo muestra la forma con un hook que ejecuta un linter en cada archivo que Claude escribe o edita. Reemplace el ejemplo con su propio objeto hooks.
my-plugin/hooks/hooks.json
4

Probar el plugin migrado

Cargue el plugin para una sesión:
Verifique cada componente bajo su nuevo nombre:
  • Skills: ejecute /my-plugin:deploy para un skill que era /deploy.
  • Subagentes: pida a Claude que use el agente my-plugin:reviewer para un agente que era reviewer.
  • Hooks: active el evento que cada hook coincide.
Si algo falta, trabaje a través de Probar y depurar.
Mientras los originales aún estén bajo .claude/, permanecen cargados junto con las copias del plugin:
  • Skills y agentes: los dos conjuntos no colisionan, porque los skills y agentes del plugin llevan el prefijo my-plugin:. /deploy y /my-plugin:deploy funcionan ambos, y Claude ve reviewer y my-plugin:reviewer como dos subagentes.
  • Hooks: los hooks no tienen prefijo, por lo que un hook que está tanto en su archivo de configuración como en hooks/hooks.json se ejecuta dos veces cada vez que se activa su evento.
Después de confirmar que el plugin funciona, elimine los originales de .claude/ y elimine el objeto hooks de su archivo de configuración.

Próximos pasos