
En resumen
Un SKILL.md es una carpeta con un solo Markdown: el frontmatter YAML nombra la skill y controla quién puede invocarla, y el cuerpo guarda el procedimiento. El agente solo lee la descripción hasta que la necesita de verdad.
Un archivo SKILL.md es un documento Markdown con un bloque de frontmatter YAML arriba, y es la unidad que cargan las herramientas de agentes cuando quieres un procedimiento reutilizable en lugar de un prompt de una sola vez. Esta guía cubre el formato: cómo se organiza el archivo, qué campos del frontmatter cambian el comportamiento, cómo decide el agente si activa una skill y qué errores dejan una skill muerta sin avisar.
La documentación de Claude Code describe el formato en Extend Claude with skills y lo sitúa dentro de un estándar abierto Agent Skills que funciona en varias herramientas de IA. Puedes pegar cualquier bloque de frontmatter en el validador de YAML de UrsaKit mientras lees: te da la línea y la columna del primer error de sintaxis, algo que aquí importa más de lo habitual porque una skill con el YAML roto se carga igual, solo que con todos los campos ignorados.
01Una skill es un procedimiento guardado, no un prompt más largo
Casi cualquier entorno de agente ya tiene un archivo de hechos permanentes: un AGENTS.md, un CLAUDE.md o un archivo de reglas del editor. Ese archivo se carga entero en cada turno, así que tiene que ser corto. Una skill funciona al revés: el agente solo ve el frontmatter mientras trabaja con normalidad y arrastra el cuerpo al contexto cuando la tarea lo pide.
La documentación lo plantea sin rodeos: el cuerpo de una skill solo se carga cuando se usa, así que un material de consulta largo no cuesta casi nada hasta que hace falta. Por eso una checklist de publicación de 40 pasos puede vivir en el repositorio sin contaminar cada pregunta que no tiene que ver.
AGENTS.md -> always in context -> keep it to facts and constraints
SKILL.md -> loaded when relevant -> put long procedures here
Cada producto amplía el formato común. Claude Code añade control de invocación, ejecución en subagentes e inyección dinámica de contexto sobre los campos estándar, de modo que una skill escrita para una herramienta suele seguir funcionando en otra, aunque puede ganar comportamiento al mudarse.
02Desde dónde se cargan los SKILL.md
La ubicación decide el alcance, y el alcance decide si tu compañero de equipo recibe la skill al clonar el repositorio.
| Ubicación | Ruta | Alcance |
|---|---|---|
| Personal | ~/.claude/skills/<name>/SKILL.md | Todos los proyectos de tu máquina |
| Proyecto | .claude/skills/<name>/SKILL.md | Todo el que clone el repositorio |
| Plugin | skills/ dentro del plugin | Todo el que instale el plugin |
| Gestionado | desplegado por managed settings | Toda la organización |
Las skills de proyecto son las que conviene versionar. El agente busca .claude/skills/ en el directorio donde arranca y en cada directorio padre hasta la raíz del repositorio, así que abrir una sesión dentro de packages/frontend/ sigue encontrando una skill definida arriba. Un directorio .claude/skills/ por debajo del directorio de trabajo no se carga al arrancar, y eso pilla a quien guarda la skill junto al código que describe.
Los comandos personalizados y las skills se han fusionado en un solo concepto. Un archivo en .claude/commands/deploy.md y una carpeta en .claude/skills/deploy/SKILL.md producen la misma invocación /deploy. Para trabajo nuevo conviene la forma de skill, porque solo ella puede llevar archivos de apoyo.
Algunos equipos mantienen un directorio en el repositorio, como .agent/skills/, y enlazan o copian entradas a la ruta que espera su herramienta. Es una decisión de convención, no parte del formato. El archivo que importa sigue siendo SKILL.md.
03Los campos del frontmatter, uno por uno
El frontmatter va entre marcadores --- al principio del archivo y se parsea como YAML. Los nombres de campo van en minúsculas con guiones, salvo when_to_use. Un nombre que no encaja con el esquema se ignora sin error, así que una errata se ve exactamente igual que un campo sin usar.
---
name: config-guard
description: Validate JSON and YAML config files before a commit. Use when the user asks to check a config file, debug a failing lint step, or prepare a release.
allowed-tools: Read Grep Bash(python3 *)
---
| Campo | ¿Obligatorio? | Qué cambia |
|---|---|---|
name | No | El nombre del comando en el menú /. Por defecto, el de la carpeta. |
description | Recomendado | Qué hace la skill y cuándo usarla. El agente enruta con este texto. |
when_to_use | No | Frases de activación y peticiones de ejemplo, añadidas a la descripción. |
allowed-tools | No | Herramientas que el agente puede usar sin preguntar durante el turno que invoca. |
disallowed-tools | No | Herramientas que salen del conjunto mientras la skill está activa. |
disable-model-invocation | No | Con true, solo una persona puede lanzarla con /name. |
user-invocable | No | Con false, solo el agente puede invocarla. |
argument-hint | No | Pista de autocompletado, por ejemplo [issue-number]. |
arguments | No | Argumentos posicionales con nombre para sustituir $name. |
Dos detalles causan casi toda la confusión. Primero, description y when_to_use se concatenan y se truncan a 1.536 caracteres cuando el agente lista las skills disponibles, así que la primera frase carga con el peso del enrutado. Segundo, los campos booleanos aceptan yes, no, on, off, 1 y 0 en cualquier combinación de mayúsculas, lo que significa que un "false" entre comillas y un false sin ellas pueden comportarse distinto después de que YAML haga lo suyo.
Un YAML roto no falla a voces.
Si el frontmatter no se parsea, la skill se carga igual pero sin ningún campo definido. Te queda una skill sin descripción, así que el agente nunca enruta hacia ella y en los registros no aparece nada evidente. Valida el bloque antes de depurar cualquier otra cosa.
04Cómo decide el agente si activa una skill
La activación es una coincidencia de texto, no una consulta a un registro. El agente lee la lista de nombres y descripciones, la compara con la petición actual y carga el cuerpo de las que parecen relevantes. Ese modelo tiene tres consecuencias que puedes diseñar de antemano.
- Escribe la descripción como la petición, no como la función. «Úsala cuando el usuario pida revisar un archivo de configuración» enruta mejor que «utilidades de validación de configuración».
- Mantén el cuerpo estrecho. Una skill que cubre cinco trabajos sin relación tiene una descripción demasiado amplia para enrutar bien.
- Nombra la carpeta con el verbo. Como
nametoma por defecto el nombre de la carpeta,.claude/skills/check-config/SKILL.mdse comporta mejor que una carpeta llamadautils.
También puedes saltarte el enrutado. Una persona siempre puede escribir /skill-name, y disable-model-invocation: true fuerza ese camino para procedimientos que no quieres que se ejecuten solos. El permiso de allowed-tools dura un turno: la documentación indica que se borra cuando envías tu siguiente mensaje, así que una skill no puede escalar permisos en silencio a lo largo de una sesión.
05Un SKILL.md mínimo que puedes copiar
Esta es una skill completa que valida archivos de configuración antes de un commit. La carpeta se llama config-guard y el archivo vive en .claude/skills/config-guard/SKILL.md.
---
name: config-guard
description: Validate JSON and YAML config files before a commit. Use when the user asks to check a config file, debug a failing lint step, or prepare a release.
allowed-tools: Read Grep Bash(python3 *)
---
# Config Guard
Validate every changed config file and report failures as a table.
## Steps
1. List changed files with git diff --name-only -- '*.json' '*.yaml' '*.yml'
2. Parse each file with Python and capture the first error.
3. Print a table with file, line and message. Do not fix anything silently.
Dos hábitos la mantienen viva. Valida el frontmatter antes de hacer commit y escribe el cuerpo en imperativo. El cuerpo es un procedimiento que el agente va a ejecutar, no documentación para que lea una persona, así que «valida cada archivo» resiste mejor las ediciones que «el paso de validación se ejecuta».
06Por qué una skill no se activa
| Síntoma | Causa probable | Arreglo |
|---|---|---|
No pasa nada con /name | El --- de apertura no está en la línea 1 | Quita la línea en blanco o el comentario de encima |
| Nunca se carga sola | Falta la descripción o es demasiado abstracta | Reescríbela con las palabras de la petición real |
| Se activa casi para todo | La descripción es demasiado amplia | Acota el alcance y divide la skill |
| Un campo no hace nada | Nombre mal escrito o con mayúsculas | Cópialo del esquema, guiones incluidos |
| Funciona en tu equipo, no en el de tu compañero | La skill está en una carpeta personal | Muévela a .claude/skills/ y versiona |
Hay dos nombres de carpeta reservados que conviene conocer antes de elegir uno. Claude Code omite una skill llamada synced fuera de su propio directorio de sincronización, y no carga una carpeta llamada anthropic-skills ni nada que empiece por anthropic-skills: salvo que viva dentro de un plugin.
07Skills, MCP y AGENTS.md
Los tres resuelven problemas distintos, y elegir mal es la razón de que algunas configuraciones se sientan impredecibles.
| Mecanismo | Cuándo se carga | Ideal para |
|---|---|---|
AGENTS.md / CLAUDE.md | Siempre | Hechos, restricciones y convenciones que no cambian |
SKILL.md | Cuando es relevante | Procedimientos de varios pasos y checklists |
| Servidor MCP | Cuando se llama | Capacidades que el modelo no tiene, como una base de datos o una API interna |
La regla práctica: una skill cambia cómo trabaja el agente; un servidor MCP le da algo nuevo que usar. Si una skill dedica la mayor parte del texto a explicar cómo llamar a una API, la llamada pertenece a MCP y el procedimiento que la rodea pertenece a la skill.
08Trata cada skill como código no confiable
El cuerpo de una skill son instrucciones, y el agente va a seguirlas. Eso convierte una skill de terceros en una superficie de inyección sin necesidad de ningún ejecutable: una skill hostil o descuidada puede decirle al agente que lea archivos que no debería, o que describa su trabajo de forma engañosa.
Antes de instalar una skill de un marketplace o del repositorio de un desconocido, lee el cuerpo entero, revisa allowed-tools y busca instrucciones que apunten a archivos fuera del proyecto. El mismo criterio que aplicas al script postinstall de una dependencia vale aquí, solo que sin el script.
Si quieres la mitad de validación de este flujo en un solo sitio: el validador de YAML caza errores del frontmatter, el formateador de YAML reindenta sin tocar los comentarios y el validador de JSON cubre los archivos de configuración que una skill trae junto a su SKILL.md. El generador de JSON Schema sirve cuando quieres un contrato de equipo en lugar de una convención.
09Fuentes
- Documentación de Claude Code — Extend Claude with skills(fecha de consulta: 2026-10-04)
Pega el frontmatter de un SKILL.md y obtén la línea y la columna del primer error de sintaxis.
Validador de YAMLPreguntas frecuentes
¿Qué es un archivo SKILL.md?
Es un Markdown con un bloque de frontmatter YAML arriba. El frontmatter nombra la skill y controla cómo se invoca, y el cuerpo Markdown contiene las instrucciones que el agente sigue cuando la skill se carga.
¿Hacen falta todos los campos del frontmatter?
No. Todos son opcionales y solo se recomienda description. Ese campo merece cuidado, porque el agente lo usa para decidir si la skill encaja con la petición actual.
¿Por qué no se activa mi skill?
Comprueba tres cosas: que el YAML entre los marcadores se pueda parsear, que el marcador de apertura sea la primera línea del archivo y que la descripción describa las peticiones que haces de verdad.
¿Cuánto puede medir la descripción de una skill?
Claude Code trunca el texto combinado de description y when_to_use a 1.536 caracteres en el listado de skills, así que el uso principal debe ir en la primera frase.
¿Dónde debería colocar el SKILL.md?
Para un repositorio, en .claude/skills/<name>/SKILL.md y versionado. Para tu equipo entre proyectos, en ~/.claude/skills/<name>/SKILL.md. Los plugins traen su propio directorio skills.
¿En qué se diferencia una skill de un servidor MCP?
Una skill es texto que el modelo lee. Un servidor MCP es un programa que el modelo llama. Usa una skill para cambiar cómo trabaja el agente y MCP cuando necesita una capacidad que no tiene.
¿Es seguro instalar skills de terceros?
Trátalas como tratarías un script. El cuerpo de una skill es texto que el agente va a seguir, así que una skill hostil puede redirigir a tu agente sin traer ningún ejecutable.
Artículos relacionados
- Elegir y autoalojar un harness de agente
Qué entorno carga tus skills y qué cambia cuando lo alojas tú.
- Prompt injection frente a inyección SQL
Una skill de terceros es un canal de instrucciones. Este es su modelo de amenaza.
Herramientas relacionadas
- Validador de YAML
Encuentra la línea y la columna del primer error del frontmatter.
- Formateador de YAML
Reindenta el frontmatter sin tocar comentarios ni anclas.
- Validador de JSON
Revisa el JSON que una skill o un plugin trae junto a SKILL.md.
- Generador de JSON Schema
Convierte un manifiesto de ejemplo en un esquema que puedes exigir en CI.