Plugins
Los plugins extienden Claude Code con paquetes modulares que agrupan comandos, skills, agentes, estilos de salida, hooks, servidores MCP, servidores LSP, canales y configuraciones. Se instalan desde un marketplace, se cargan via CLI o vienen integrados como built-ins.
.claude-plugin/plugin.json.
Todo lo demás es opcional y se auto-detecta por convención de directorios.
Fuentes de Plugins y Almacenamiento
| Fuente | Formato ID | Descripción |
|---|---|---|
| Marketplace | plugin@marketplace | Instalado desde un repositorio de marketplace |
| Sesión | (basado en ruta) | Cargado via flag CLI --plugin-dir |
| Built-in | plugin@builtin | Integrado en Claude Code (actualmente ninguno registrado) |
Ubicaciones de almacenamiento
# Archivos de plugin en caché
~/.claude/plugins/cache/{marketplace}/{plugin}/{version}/
# Lista de plugins habilitados
~/.claude/settings.json → enabledPlugins: [...]
# Opciones por plugin
~/.claude/settings.json → pluginConfigs: {...} Estructura de Directorios del Plugin
my-plugin/
├── .claude-plugin/
│ ├── plugin.json # Manifiesto (OBLIGATORIO)
│ └── marketplace.json # Para editores
├── commands/ # Slash commands (auto-detectado)
│ ├── build.md
│ └── deploy.md
├── agents/ # Agentes personalizados (auto-detectado)
│ └── test-runner.md
├── skills/ # Skills (auto-detectado)
│ └── my-skill/
│ └── SKILL.md
├── output-styles/ # Estilos de salida (auto-detectado)
│ └── conciso.md
├── hooks/
│ └── hooks.json # Configuraciones de hooks
└── .mcp.json # Servidores MCP (opcional) El manifiesto en .claude-plugin/plugin.json es el único archivo obligatorio. Claude Code auto-detecta capacidades desde los directorios estándar sin necesidad de declaración en el manifiesto.
Directorios auto-detectados
commands/ Cualquier .md → slash commands agents/ Cualquier .md → tipos de agente personalizados skills/ Dirs con SKILL.md → skills output-styles/ Cualquier .md → estilos de salida hooks/hooks.json Configuraciones de hooks .mcp.json Configuraciones de servidores MCP Manifiesto del Plugin (plugin.json)
Schema completo
{
"name": "my-plugin",
"version": "1.0.0",
"description": "Qué hace este plugin",
"author": {
"name": "Nombre del Autor",
"email": "[email protected]",
"url": "https://ejemplo.com"
},
"homepage": "https://ejemplo.com/plugin",
"repository": "https://github.com/org/plugin",
"license": "MIT",
"keywords": ["testing", "despliegue"],
"dependencies": [
"otro-plugin",
"dep-plugin@otro-marketplace"
],
"commands": { ... },
"agents": [ ... ],
"skills": [ ... ],
"outputStyles": [ ... ],
"hooks": { ... },
"mcpServers": { ... },
"lspServers": { ... },
"channels": [ ... ],
"userConfig": { ... },
"settings": { ... }
} Campos de metadatos
| Campo | Req. | Descripción |
|---|---|---|
| name | Sí | kebab-case, sin espacios |
| version | No | Semver (ej. "1.2.3") |
| description | No | Descripción corta |
| author | No | name obligatorio si es objeto |
| license | No | Identificador SPDX |
| keywords | No | Palabras clave de búsqueda |
| dependencies | No | "nombre" o "nombre@marketplace" |
Capacidades del Plugin (9 tipos)
Comandos
Slash commands como /build, /deploy.
"commands": {
"build": {
"source": "./commands/build.md",
"description": "Construir el proyecto",
"argumentHint": "[objetivo]",
"model": "claude-sonnet-4-6",
"allowedTools": ["Bash", "Read"]
},
"about": {
"content": "# Acerca de\nContenido inline.",
"description": "Mostrar info del plugin"
}
} También acepta: string de ruta única o array de rutas.
Agentes
Tipos de agentes de IA personalizados con sus propias herramientas y modelo.
"agents": [
"./agents/test-runner.md",
"./agents/reviewer.md"
] Los archivos .md de agente usan el mismo formato de frontmatter que los agentes definidos por el usuario (tools, model, disallowedTools).
Skills
Directorios de skill que contienen SKILL.md.
"skills": [
"./skills/my-skill",
"./skills/another-skill"
] Auto-detectado: cualquier directorio en skills/ que contenga SKILL.md.
Estilos de Salida
Formato de respuesta personalizado.
---
name: Conciso
description: Respuestas cortas y directas
keepCodingInstructions: true
forceForPlugin: false
---
Responde en 1-2 frases. Sin preámbulo. forceForPlugin: true anula la configuración del usuario cuando el plugin está activo.
Hooks
Compatible con los 27 eventos de hook. Tres formatos de declaración:
// Objeto inline
"hooks": { "PostToolUse": [...] }
// Referencia a archivo
"hooks": "./hooks/extra.json"
// Array mezclando ambos
"hooks": [
"./hooks/formatting.json",
{ "Stop": [...] }
] Servidores MCP
Integraciones de herramientas externas. Variables especiales disponibles:
"mcpServers": {
"my-server": {
"type": "stdio",
"command": "node",
"args": ["`${plugin_root}`/server.js"],
"env": {
"API_KEY": "`${user_config.API_KEY}`"
}
}
} También acepta: ./archivo.json, ./server.mcpb o URL remota.
Servidores LSP
Language server protocol para inteligencia de código.
command — comando de inicio (obligatorio)extensionToLanguage — ext → ID de lenguaje (obligatorio)transport — stdio / socketrestartOnCrash / maxRestartsstartupTimeout / shutdownTimeout (ms)Canales
Canales de mensajería para el modo asistente KAIROS.
"channels": [{
"server": "my-chat-server",
"displayName": "Chat del Equipo",
"userConfig": {
"CHANNEL_ID": {
"type": "string",
"title": "ID del Canal"
}
}
}] server debe coincidir con una clave en mcpServers. El servidor MCP debe declarar la capacidad claude/channel.
Configuración (Settings)
Anulaciones de configuración cuando el plugin está habilitado.
"settings": {
"agent": {
"my-agent": {
"tools": ["Read", "Grep"],
"model": "haiku"
}
}
} Actualmente solo se soporta la clave "agent". Se fusiona en la cascada de settings cuando está habilitado.
Configuración de Usuario (userConfig)
Los plugins pueden definir opciones que se solicitan al habilitarlos. Los valores se inyectan como $`${user_config.CLAVE}` en configs MCP/LSP, hooks y contenido de skills — y como variables de entorno CLAUDE_PLUGIN_OPTION_CLAVE en comandos de hook.
Ejemplo de schema
"userConfig": {
"API_KEY": {
"type": "string",
"title": "Clave API",
"description": "Tu clave API",
"required": true,
"sensitive": true // guardado en Keychain
},
"MAX_RESULTS": {
"type": "number",
"title": "Máx. Resultados",
"default": 10,
"min": 1,
"max": 100
},
"VERBOSE": {
"type": "boolean",
"default": false
},
"PROJECT_DIR": { "type": "directory" },
"CONFIG_FILE": { "type": "file" }
} Tipos de opción de configuración
| Tipo | Entrada | Campos extra |
|---|---|---|
| string | Texto | multiple (array) |
| number | Numérico | min, max |
| boolean | Toggle | — |
| directory | Selector de ruta | — |
| file | Selector de archivo | — |
Almacenamiento
settings.json → pluginConfigs[pluginId].options.credentials.jsonSistema de Marketplace
Formatos de fuente de plugin
| Tipo | Formato |
|---|---|
| Ruta relativa | "./plugins/my-plugin" |
| NPM | { "source": "npm", "package": "@org/plugin" } |
| Pip | { "source": "pip", "package": "my-plugin" } |
| Git URL | { "source": "url", "url": "...", "ref": "main" } |
| GitHub | { "source": "github", "repo": "owner/repo" } |
| Subdirectorio Git | { "source": "git-subdir", "url": "...", "path": "plugins/my" } |
Anti-suplantación
Los nombres de marketplace se validan contra registros conocidos. Un marketplace no puede suplantar los plugins de otro. Las dependencias cruzadas requieren declarar explícitamente allowCrossMarketplaceDependenciesOn.
extraKnownMarketplaces en settings.json
{
"extraKnownMarketplaces": [
{
"type": "github",
"repo": "org/plugins",
"ref": "main"
},
{
"type": "url",
"url": "https://plugins.example.com/marketplace.json"
},
{
"type": "npm",
"package": "@org/marketplace"
},
{
"type": "directory",
"path": "/marketplace/local"
},
{
"type": "settings",
"name": "marketplace-inline",
"plugins": [
{ "name": "my-plugin", "source": "./ruta" }
]
}
]
} Flujo de Instalación y Carga
Instalación (10 pasos)
Carga al inicio (5 pasos)
Caché y auto-actualización
Se verifica la versión en cada inicio. La caché soporta modo ZIP. Si forceRemoveDeletedPlugins: true en el marketplace, los plugins eliminados se deshabilitan automáticamente.
Comando /plugin
Alias: /plugins, /marketplace
| Comando | Descripción |
|---|---|
| /plugin | Abrir menú interactivo de gestión de plugins |
| /plugin install [nombre@marketplace] | Instalar un plugin desde el marketplace |
| /plugin manage | Gestionar plugins instalados (habilitar/deshabilitar/configurar) |
| /plugin uninstall <nombre> | Eliminar un plugin |
| /plugin enable <nombre> | Habilitar un plugin deshabilitado |
| /plugin disable <nombre> | Deshabilitar un plugin |
| /plugin validate [ruta] | Validar un manifiesto de plugin |
| /plugin marketplace add <fuente> | Añadir una fuente de marketplace |
| /plugin marketplace remove <nombre> | Eliminar una fuente de marketplace |
| /plugin marketplace update [nombre] | Actualizar índice del marketplace |
| /plugin marketplace list | Listar marketplaces configurados |
Permisos y Políticas Enterprise
Controles de política
| Configuración | Descripción |
|---|---|
| allowedPlugins | Lista blanca de plugins permitidos (nombre o nombre@marketplace) |
| deniedPlugins | Lista negra — siempre tiene precedencia sobre la lista blanca (fail-closed) |
| strictPluginOnlyCustomization | Bloquear superficies (ej. mcp) solo a plugins — servidores MCP configurados por el usuario bloqueados |
Nomenclatura de servidores MCP del plugin
plugin:<nombrePlugin>:<nombreServidor> Se deduplican contra servidores configurados manualmente — el manual gana. Siguen el mismo sistema de permisos que las herramientas MCP regulares.
Formato de ID de plugin
// String
"mi-plugin@mi-marketplace"
// Objeto con opciones
{
"id": "mi-plugin@mi-marketplace",
"version": "^1.0.0",
"required": true,
"config": { "API_KEY": "valor" }
} Ambas partes validadas: [a-z0-9][-a-z0-9._]*
src/plugins/bundled/index.ts
actualmente no registra ningún plugin built-in. La infraestructura existe para migrar skills integrados
a forma de plugin activable por el usuario, pero en el estado actual del código el registro built-in está vacío.