Referencia de plugins
Documentación de referencia para crear, estructurar y enviar plugins de Cursor. Los plugins agrupan reglas, skills, agentes de programación, comandos, servidores MCP y hooks en paquetes distribuibles compatibles con el IDE de Cursor.
Si empiezas desde cero, usa el repositorio de plantilla de plugins.
Formatos de plugin compatibles
Cursor carga plugins en dos formatos, identificados por la ubicación de su manifiesto:
| Formato | Ubicación del manifiesto | Componentes |
|---|---|---|
| Agent Plugins (estándar abierto) | plugin.json en la raíz del plugin | Skills, servidores MCP |
| Plugins de Cursor | .cursor-plugin/plugin.json | Skills, servidores MCP, reglas, agentes de programación, comandos, hooks, variables |
Un plugin que cumple con la especificación de Agent Plugins se carga en Cursor sin cambios. El resto de esta referencia documenta el formato de plugin de Cursor, que se desarrolla en paralelo con el estándar y admite el conjunto completo de componentes de Cursor.
Estructura del plugin
Un plugin es un directorio que contiene un archivo de manifiesto y los recursos del plugin:
my-plugin/├── plugin.json # Obligatorio: manifiesto de Agent Plugins├── skills/ # Agent Skills│ └── code-reviewer/│ └── SKILL.md└── mcp.json # Definiciones de servidores MCPEl estándar Agent Plugins define skills y servidores MCP portables. Consulta la guía para crear Agent Plugins para ver la referencia completa del paquete y el esquema.
Manifiesto del plugin de Cursor
Todo plugin de Cursor requiere un archivo de manifiesto .cursor-plugin/plugin.json. Las
siguientes secciones documentan los campos, componentes y funciones del marketplace de los plugins de Cursor. Para consultar el manifiesto raíz de Agent Plugins, usa la
referencia del manifiesto del estándar.
Campos obligatorios
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Identificador del plugin. En minúsculas y formato kebab-case (caracteres alfanuméricos, guiones y puntos). Debe comenzar y terminar con un carácter alfanumérico. Ejemplos: my-plugin, prompts.chat |
Campos opcionales
| Campo | Tipo | Descripción |
|---|---|---|
description | string | Breve descripción del plugin |
version | string | Versión semántica (p. ej., 1.0.0) |
author | object | Información del autor: name (obligatorio), email (opcional) |
homepage | string | URL de la página principal del plugin |
repository | string | URL del repositorio del plugin |
license | string | Identificador de licencia (p. ej., MIT) |
keywords | array | Etiquetas para su descubrimiento y categorización |
logo | string | Ruta relativa a un archivo de logotipo en el repositorio (p. ej., assets/logo.svg) o una URL absoluta. Las rutas relativas se resuelven como URL de raw.githubusercontent.com. Se recomienda incluir el logotipo en el repositorio y usar una ruta relativa. |
rules | string or array | Ruta(s) a archivos o directorios de reglas |
agents | string or array | Ruta(s) a archivos o directorios de agentes de programación |
skills | string or array | Ruta(s) a directorios de skills |
commands | string or array | Ruta(s) a archivos o directorios de comandos |
hooks | string or object | Ruta al archivo de configuración de hooks o configuración de hooks en línea |
mcpServers | string, object, or array | Ruta al archivo de configuración de MCP, configuración de servidor MCP en línea o un array de cualquiera de las dos. Anula el descubrimiento predeterminado de mcp.json. |
variables | object | JSON Schema que declara los nombres de las variables (tokens, cadenas de conexión). El plugin no almacena valores secretos; los usuarios los establecen en el panel de control (Plugins → configurar). Se sustituyen en los marcadores de posición ${VAR}. Consulta Variables. |
Ejemplo de manifiesto
{ "name": "enterprise-plugin", "version": "1.2.0", "description": "Enterprise development tools with security scanning and compliance checks", "author": { "name": "ACME DevTools", "email": "devtools@acme.com" }, "keywords": ["enterprise", "security", "compliance"], "logo": "assets/logo.svg"}Variables
Usa variables para declarar los nombres (y tipos/descripciones) de la configuración proporcionada por el usuario; por ejemplo, un token de API para un servidor MCP HTTP. El plugin solo define el esquema; no incluye los valores secretos.
Los administradores de equipo establecen los valores reales en el panel de control, en Plugins (durante la instalación o posteriormente mediante Configurar en el plugin).
No incluyas valores secretos en el repo del plugin. En mcp.json y otra configuración del plugin, incluye solo marcadores de posición ${VAR} que coincidan con los nombres de las propiedades del esquema.
{ "name": "example-plugin", "variables": { "type": "object", "properties": { "API_TOKEN": { "type": "string", "title": "API token", "description": "Bearer token for the example HTTP MCP" } }, "required": ["API_TOKEN"] }}{ "mcpServers": { "example-api": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer ${API_TOKEN}" } } }}El nivel superior debe ser { "type": "object", "properties": { ... } }. Solo se acepta un conjunto fijo de palabras clave de JSON Schema (type, title, description, default, enum, const, properties, required, items y restricciones habituales de longitud y valores numéricos).
Descubrimiento de componentes del plugin de Cursor
Cuando el manifiesto no especifica rutas explícitas para un tipo de componente, el analizador utiliza el descubrimiento automático basado en carpetas:
| Componente | Ubicación predeterminada | Cómo se detecta |
|---|---|---|
| Skills | skills/ | Cada subdirectorio que contiene un archivo SKILL.md |
| Reglas | rules/ | Todos los archivos .md, .mdc o .markdown |
| Agentes de programación | agents/ | Todos los archivos .md, .mdc o .markdown |
| Comandos | commands/ | Todos los archivos .md, .mdc, .markdown o .txt |
| Hooks | hooks/hooks.json | Se analiza para obtener los nombres de eventos de hook |
| Servidores MCP | mcp.json | Se analiza para obtener las entradas de servidor |
| Skill raíz | SKILL.md en la raíz del plugin | Se trata como un plugin con una sola skill (solo si no existe el directorio skills/ ni el campo skills en el manifiesto) |
Si se especifica un campo en el manifiesto (p. ej., "skills": "./my-skills/"), este reemplaza el descubrimiento basado en carpetas para ese componente. La carpeta predeterminada no se analiza adicionalmente.
Formato de las reglas
Las reglas son archivos .mdc que proporcionan instrucciones persistentes a la IA. Colócalas en el directorio rules/.
Las reglas requieren frontmatter YAML con metadatos:
---description: Prefer const over let for variables that are never reassignedalwaysApply: true---prefer-const: Always use `const` for variables that are never reassigned.Only use `let` when the variable needs to be reassigned. Never use `var`.Campos del frontmatter de las reglas
| Campo | Tipo | Descripción |
|---|---|---|
description | string | Breve descripción de lo que hace la regla |
alwaysApply | boolean | Si es true, la regla se aplica a todos los archivos. Si es false, la regla está disponible previa solicitud. |
globs | string o array | Patrones de archivos a los que se aplica la regla (p. ej., "**/*.ts") |
Para consultar la documentación completa, consulta Reglas.
Formato de skills
Los skills son capacidades especializadas definidas en archivos SKILL.md. Cada skill se encuentra en su propio directorio dentro de skills/.
Los skills requieren frontmatter de YAML con metadatos:
---name: api-designerdescription: Design RESTful APIs following OpenAPI 3.0 specification. Use when designing new API endpoints, reviewing API contracts, or generating API documentation.---# API Designer Skill## When to use- Designing new API endpoints- Reviewing API contracts- Generating API documentation## Instructions1. Follow REST conventions for resource naming2. Use appropriate HTTP methods (GET, POST, PUT, DELETE, PATCH)3. Include proper error responses with standard HTTP status codes4. Document all endpoints with OpenAPI 3.0 specification5. Use consistent naming conventions (kebab-case for URLs, camelCase for JSON)Campos de frontmatter de las skills
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Identificador de la skill (en minúsculas y kebab-case) |
description | string | Descripción de lo que hace la skill y cuándo usarla |
Para obtener la documentación completa, consulta Skills.
Formato de los agentes de programación
Los agentes de programación son archivos Markdown que definen el comportamiento y las instrucciones de agentes de programación personalizados. Colócalos en el directorio agents/.
Los agentes de programación requieren frontmatter YAML con metadatos:
---name: security-reviewerdescription: Security-focused code reviewer that checks for vulnerabilities and proven approaches---# Security ReviewerYou are a security-focused code reviewer. When reviewing code:1. Check for injection vulnerabilities (SQL, XSS, command injection)2. Verify proper authentication and authorization3. Look for sensitive data exposure (API keys, passwords, PII)4. Ensure secure cryptographic practices5. Review dependency security and known vulnerabilities6. Check for proper input validation and sanitizationCampos del frontmatter del agente
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Identificador del agente (en minúsculas y formato kebab-case) |
description | string | Breve descripción de la finalidad del agente |
Formato de comandos
Los comandos son archivos Markdown o de texto que definen acciones que los agentes pueden ejecutar. Colócalos en el directorio commands/.
Los comandos admiten las extensiones .md, .mdc, .markdown y .txt. Pueden incluir frontmatter YAML:
---name: deploy-stagingdescription: Deploy the current branch to the staging environment---# Deploy to stagingSteps to deploy to staging:1. Run tests2. Build the project3. Push to staging branchCampos del frontmatter de los comandos
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Identificador del comando (en minúsculas y formato kebab-case) |
description | string | Breve descripción de lo que hace el comando |
Formato de los hooks
Los hooks son scripts de automatización que se activan mediante eventos del agente, Tab o el espacio de trabajo. Defínelos en hooks/hooks.json:
{ "hooks": { "afterFileEdit": [ { "command": "./scripts/format-code.sh" } ], "beforeShellExecution": [ { "command": "./scripts/validate-shell.sh", "matcher": "rm|curl|wget" } ], "sessionEnd": [ { "command": "./scripts/audit.sh" } ] }}Eventos de hook disponibles
- Hooks del agente:
sessionStart,sessionEnd,preToolUse,postToolUse,postToolUseFailure,subagentStart,subagentStop,beforeShellExecution,afterShellExecution,beforeMCPExecution,afterMCPExecution,beforeReadFile,afterFileEdit,beforeSubmitPrompt,preCompact,stop,afterAgentResponse,afterAgentThought - Hooks de Tab:
beforeTabFileRead,afterTabFileEdit - Hooks del ciclo de vida de la app:
workspaceOpen
Para consultar la documentación completa, consulta Hooks.
Servidores MCP
Ambos formatos colocan mcp.json en la raíz del plugin. Agent Plugins usan el
esquema del estándar y declaran el transporte de cada servidor. Los plugins de Cursor pueden usar
variables de Cursor e inferir el transporte a partir de command o url.
{ "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json", "mcpServers": { "code-review": { "type": "stdio", "command": "./bin/code-review", "cwd": "${PLUGIN_ROOT}" } }}Consulta la referencia de MCP de Agent Plugins para conocer los transportes, rutas y directorios de datos compatibles.
Para obtener la documentación completa, consulta MCP.
Logotipos
Incluye los logotipos en tu repositorio y haz referencia a ellos mediante una ruta relativa:
{ "name": "my-plugin", "logo": "assets/logo.svg"}Las rutas relativas se resuelven en URL de raw.githubusercontent.com según el repositorio y el SHA del commit. Por ejemplo, assets/logo.svg en el repositorio acme/plugins en el commit abc123 se resuelve en:
https://raw.githubusercontent.com/acme/plugins/abc123/my-plugin/assets/logo.svgTambién se aceptan las URL absolutas de contenido de usuarios de GitHub (que comienzan por http:// o https://).
Repositorios de varios plugins de Cursor
Un único repositorio de Git puede contener varios plugins mediante un manifiesto del marketplace. Colócalo en .cursor-plugin/marketplace.json, en la raíz del repositorio.
Formato del manifiesto del marketplace
{ "name": "my-marketplace", "owner": { "name": "Your Org", "email": "plugins@yourorg.com" }, "metadata": { "description": "A collection of developer tool plugins" }, "plugins": [ { "name": "plugin-one", "source": "plugin-one", "description": "First plugin" }, { "name": "plugin-two", "source": "plugin-two", "description": "Second plugin" } ]}Campos del manifiesto de Marketplace
| Campo | Tipo | Descripción |
|---|---|---|
name | string | (obligatorio) Identificador del Marketplace (kebab-case) |
owner | object | (obligatorio) name (obligatorio), email (opcional) |
plugins | array | (obligatorio) Lista de entradas de plugins (máx. 500) |
metadata | object | Opcional. description, version, pluginRoot (ruta de prefijo para todas las fuentes de plugins) |
Campos de las entradas de plugins
Cada entrada del array plugins admite:
| Campo | Tipo | Descripción |
|---|---|---|
name | string | (obligatorio) Identificador del plugin (kebab-case) |
source | string u object | Ruta al directorio del plugin u objeto con path y opciones |
description | string | Descripción del plugin |
version | string | Versión semántica |
author | object | Información del autor |
homepage | string | URL |
repository | string | URL |
license | string | Identificador de licencia |
keywords | array | Etiquetas de búsqueda |
logo | string | Ruta relativa o URL del logotipo |
category | string | Categoría del plugin |
tags | array | Etiquetas adicionales |
skills, rules, agents, commands | string o array | Rutas a archivos de componentes |
hooks | string u object | Ruta a la configuración de hooks o configuración inline |
mcpServers | string u object | Ruta a la configuración de MCP o configuración inline |
variables | object | JSON Schema que declara los nombres de las variables (los valores se establecen en el Panel de control Plugins → Configurar). Se recomienda usar plugin.json; los valores del manifiesto tienen prioridad si se establecen ambos. Consulta Variables. |
Cómo funciona la resolución
Para una entrada del marketplace con "source": "my-plugin":
- El parser busca
my-plugin/.cursor-plugin/plugin.json - Si lo encuentra, el manifiesto específico del plugin se fusiona con la entrada del marketplace (los valores del manifiesto tienen prioridad)
- El descubrimiento de componentes se realiza en el directorio
my-plugin/, usando las rutas del manifiesto si se especifican o el descubrimiento basado en carpetas como alternativa
Ejemplo de repositorio multi-plugin
my-plugins/├── .cursor-plugin/│ └── marketplace.json # Enumera todos los plugins├── eslint-rules/│ ├── .cursor-plugin/│ │ └── plugin.json # Manifiesto de cada plugin│ └── rules/│ ├── prefer-const.mdc│ └── no-any.mdc├── docker/│ ├── .cursor-plugin/│ │ └── plugin.json│ ├── skills/│ │ ├── containerize-app/│ │ │ └── SKILL.md│ │ └── setup-docker-compose/│ │ └── SKILL.md│ └── mcp.json└── README.mdEnviar un plugin
El equipo de Cursor revisa los plugins. Para enviar el tuyo:
Crea tu plugin
Añade un archivo plugin.json válido en la raíz para un Agent Plugin o
.cursor-plugin/plugin.json para un plugin de Cursor.
Aloja el plugin en un repositorio de Git
Haz push de tu plugin a un repositorio público de Git. Incluye tu logo en el repositorio (opcional, pero recomendado).
Envía tu plugin
Ve a cursor.com/marketplace/publish y envía el enlace a tu repositorio.
Lista de verificación para el envío
- El plugin tiene un manifiesto válido en la raíz:
plugin.jsono.cursor-plugin/plugin.json namees único, está en minúsculas y usa kebab-case (p. ej.,my-awesome-plugin)descriptionexplica claramente el propósito del plugin- Todos los componentes incluidos tienen archivos y frontmatter válidos
- El logo está incluido en el repositorio y se referencia mediante una ruta relativa (si se proporciona)
README.mddocumenta el uso y cualquier configuración- Los Agent Plugins cumplen con los schemas de Agent Plugins
- Los plugins de Cursor que usan variables declaran cada
${VAR}demcp.jsonen el schema del manifiesto - Todas las rutas del manifiesto son relativas y válidas (sin
..ni rutas absolutas) - El plugin se ha probado localmente
- Los repositorios multi-plugin de Cursor tienen
.cursor-plugin/marketplace.jsonen la raíz del repositorio con nombres de plugin únicos