PTENES
MÓDULO 2.2

🧩 Skills, sub-agents y MCP en Claude Code

Dónde reside la inteligencia personalizada del agente — skills bien escritas, sub-agents que se activan por sí solos, MCP servers y la inyección dinámica que solo tiene Claude.

7
Temas
35
Minutos
Inter.
Nivel
Práctico
Tipo

🎯Lo que obtienes aquí

Salir sabiendo escribir una skill que se active sola, un sub-agent al que Claude delegue en el momento adecuado, y entender las funciones exclusivas de Claude Code (inyección dinámica, allowed-tools) que NO existen en Codex.

Contenido detallado

1

📦 Anatomía de una skill

La skill en Claude Code es una carpeta en .claude/skills/<nome>/ con una estructura convencional. El corazón es SKILL.md, pero hay más piezas con una función clara.

Estructura completa

.claude/skills/minha-skill/
├── SKILL.md              ← obrigatório (frontmatter + body)
├── scripts/             ← scripts auxiliares chamáveis
│   ├── check.sh
│   └── format.py
├── references/          ← docs profundas (lazy-load)
│   ├── api-spec.md
│   └── examples.md
└── assets/              ← imagens, binários, templates
    └── template.html

SKILL.md completo (ejemplo real)

---
name: revisar-pr
description: Use quando o usuário pedir pra revisar uma PR ou diff. Triggers: "revisa PR", "review pull request", "olha o diff".
allowed-tools: Bash(git diff:*), Bash(gh pr:*), Read, Grep, Glob
disable-model-invocation: false
---

# Revisar PR

## Passo a passo

1. Identifica a PR (número via $ARGUMENTS ou \`gh pr list\`)
2. Lê diff completo com \`gh pr diff <numero>\`
3. Para cada arquivo mudado, verifica:
   - Bugs de correção (não estilo)
   - Edge cases não tratados
   - Vulnerabilidades comuns
4. Consulta \`references/security-checklist.md\` se tocar em auth
5. Retorna findings categorizados por severity (high/med/low)

## Referências
- Checklist completo: \`references/security-checklist.md\`
- Padrões do repo: \`references/repo-conventions.md\`

✓ Skill bien hecha

  • • Body breve y directo (paso a paso)
  • • Detalles en references/ (lazy)
  • • allowed-tools restringido a lo necesario
  • • description con triggers del mundo real
  • • Scripts para acciones deterministas

✗ Antipatrón

  • • Body de 200KB con TODO incluido
  • • description que solo repite el nombre
  • • Sin allowed-tools (puede hacer todo)
  • • Scripts en el body en vez de scripts/
  • • Mezclar varias responsabilidades

Conceptos clave

Frontmatter
name + description min
Cuerpo corto
Paso a paso, < 5KB
references/ lazy
Se carga bajo demanda
scripts/ determ.
Acciones sin LLM
2

🎯 Description — el arte del disparador

La causa más común de que una "skill no funcione" es description deficiente. No es un bug: falla la coincidencia semántica. Claude lee las descripciones de todas las skills y elige la que mejor se ajusta al contexto actual. Tu descripción compite por atención.

✗ Description deficiente

description: Skill de revisão

→ Vaga. No indica cuándo usarla. No tiene un disparador. La skill queda invisible.

✓ Buena description

description: Use quando o usuário pedir
pra revisar PR/diff. Triggers: "revisa
PR #123", "review da branch", "olha o
diff", "code review".

→ Indica cuándo. Lista triggers reales. Match acierta.

Receta para una description de calidad

1.
"Use when..." — empieza por el disparador situacional
2.
Lista de trigger phrases reales — frases que el usuario REALMENTE escribe
3.
Ejemplos — 1-2 escenarios concretos
4.
Evita repetir el nombre — la descripción "skill X hace X" es un desperdicio
5.
Indica cuándo NO usarlo — si es útil, deja claro el caso contrario

💡Prueba empírica

Después de escribir, abre Claude Code y simula 5 prompts reales que deberían activar la skill. Si se activa en 4/5, está bien. Si se activa en 2/5, la descripción es débil. Itera.

Conceptos clave

Coincidencia semántica
Claude lee y decide
"Use when..."
Estándar de activación
Frases de activación
Frases del usuario
Prueba empírica
5 prompts reales
3

👤 Sub-agents autoinvocables

Un subagente es un persona especializada con su propio system prompt, una superficie de herramientas restringida y un contexto aislado. Claude principal lee la description y DELEGA — por sí solo, sin que se lo pidas expresamente. Es la función que más diferencia a Claude de Codex.

Ejemplo — .claude/agents/code-reviewer.md

---
name: code-reviewer
description: Use proactively when the user finishes implementing a feature or before merging a PR. Specializes in catching correctness bugs.
tools: Read, Grep, Glob, Bash(git diff:*)
model: claude-opus-4-6
---

You are a senior code reviewer focused on correctness.

## Your role
- Read the diff carefully
- Flag correctness bugs (NOT style — linter handles that)
- Check edge cases (null, empty, off-by-one, race conditions)
- Note security risks (SQLi, XSS, path traversal, auth bypass)

## Output format
A numbered list of findings:
1. **[severity]** file:line — what's wrong, why, suggested fix

Be terse. No fluff.
🎯

Aislamiento de contexto

El sub-agent abre su propia ventana; no contamina el contexto del agente principal. Devuelve solo el resultado.

⚡

Paralelismo

Claude puede ejecutar varios sub-agents en paralelo (Task tool). Es útil para investigar desde varios ángulos.

🔬

Modelo dedicado

Cada sub-agent puede usar un modelo diferente. Haiku para búsquedas, Opus para análisis. Ahorro + calidad.

Description con «proactively»: el secreto

La palabra "proactively" en la description es una señal fuerte para Claude principal: "usa esto SIN que el usuario lo pida, cuando el contexto coincida". Sin ella, el sub-agent casi nunca se activa por sí solo.

description: Use proactively when... // dispara sozinho
description: Use when the user explicitly asks... // só sob pedido

Conceptos clave

Auto-dispatch
Por descripción
Task tool
Mecanismo de delegación
Subconjunto de herramientas
tools: [a, b, c]
"proactively"
Palabra clave
4

🔌 MCP servers — declaración y uso

El servidor MCP expone herramientas externas a Claude. Se declara en .mcp.json (proyecto, va al git) o ~/.claude.json (global). Cada herramienta expuesta se convierte en mcp__servidor__nome-tool.

.mcp.json (proyecto)

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
    },
    "postgres": {
      "command": "uvx",
      "args": ["mcp-server-postgres", "--db-url", "${DATABASE_URL}"]
    },
    "linear": {
      "type": "http",
      "url": "https://mcp.linear.app/sse",
      "headers": { "Authorization": "Bearer ${LINEAR_TOKEN}" }
    }
  }
}

Lista de permitidos en settings.json

{
  "enabledMcpjsonServers": ["github", "postgres"],   // só estes ativam
  "permissions": {
    "allow": [
      "mcp__github",                          // libera tudo do server
      "mcp__postgres__query"                  // libera tool específica
    ]
  }
}

📦 Transporte stdio

El server se ejecuta como proceso hijo mediante stdin/stdout. Es lo más común para MCP local.

Ejemplo: npm/uvx que inicia un proceso, Claude conversa mediante pipe.

🌐 Transporte HTTP/SSE

El server se ejecuta como servicio remoto. Claude se conecta mediante HTTP con Server-Sent Events.

Ejemplo: Linear, Slack, servicios SaaS con endpoint MCP oficial.

Conceptos clave

.mcp.json
Proyecto, va al git
~/.claude.json
Global
stdio vs HTTP
Dos transports
Naming
mcp__server__tool
5

🎨 Inyección dinámica (backtick-bang) — exclusiva de Claude

Sintaxis específica de Claude Code: dentro de SKILL.md o commands, código entre crase-bang (`!comando`) se ejecuta en el shell ANTES de que la skill llegue al LLM. El resultado se incorpora directamente al prompt, sin una llamada adicional a una herramienta.

Ejemplo práctico

---
name: branch-status
description: Mostra contexto da branch atual antes de propor próxima ação
---

# Status da branch

Branch atual: `!git branch --show-current`
Último commit: `!git log -1 --oneline`

Diff vs main:
`!git diff main...HEAD --stat`

Com base no acima, sugira o próximo passo.

Cuando invocas /branch-status, Claude ya recibe un SKILL.md completado con los outputs reales. No hace falta pedir "ejecuta git status": ya está ahí.

✓ Buenos usos

  • • Instantánea del estado (git, versión, ENV)
  • • Listar archivos/branches relevantes
  • • Obtener el último log/error
  • • Inyectar timestamp/fecha
  • • Resultado de un comando idempotente

✗ Cuidado

  • • Comandos destructivos (rm, drop)
  • • Entrada del usuario interpolada directamente (inyección)
  • • Comandos lentos (mantiene la skill ocupada durante segundos)
  • • Output enorme (desborda el contexto)
  • • Efectos secundarios que cambian el estado

⚠️Cuidado con la portabilidad

Backtick-bang NO existe en Codex. La skill que depende de esto fallará allí. Polyskill lo reescribe como prosa de respaldo ("ejecuta git status y analiza el resultado") cuando compila para Codex, pero pierde la inyección real.

Conceptos clave

Build-time
Ejecuta antes del prompt
Sin tool call
Ya viene en el contexto
No es portable
Solo Claude tiene
Polyskill abarca
Prosa de respaldo
6

🚦 disable-model-invocation y allowed-tools

Dos campos del frontmatter que dan control detallado sobre cuándo y cómo se ejecuta la skill. Esencial para skills peligrosas o especializadas.

🔒 disable-model-invocation

disable-model-invocation: true

Impide el auto-trigger. Solo se ejecuta cuando lo invocas explícitamente (/nome-skill).

Cuándo usar: skills destructivas (drop, deploy, push), skills que tienen un costo (llaman a una API paga), skills que SOLO tú invocas conscientemente.

🛡️ allowed-tools

allowed-tools: Read, Grep, Bash(git:*)

Restringe qué herramientas puede usar la skill. Principio de mínimo privilegio.

Cuándo usar: una skill de lectura nunca debería escribir, una skill de análisis nunca debería abrir la terminal. Restringe.

💡Combo de seguridad

Para una skill peligrosa: disable-model-invocation: true + allowed-tools ultrarestrictivo + descripción con aviso explícito. Garantía triple.

Conceptos clave

Invocación opt-in
disable-model-invoke
Interfaz de herramientas
allowed-tools
Privilegio mínimo
Lo mínimo necesario
Model override
model: haiku
7

🛍️ Plugins y marketplace

Plugin es un paquete distribuible: agrupa skills + agents + commands + hooks en un único bundle versionado. Así consumes el trabajo de otras personas (claude-mem, context-mode, superpowers, etc.) y publicas el tuyo.

plugin.json — manifiesto

{
  "name": "meu-plugin",
  "version": "1.2.0",
  "description": "Conjunto de skills pra refatorar TypeScript",
  "author": "@meu-handle",
  "skills": ["./skills/ts-refactor", "./skills/ts-test-gen"],
  "agents": ["./agents/ts-reviewer.md"],
  "commands": ["./commands/refactor.md"],
  "hooks": [{ "event": "PostToolUse", "matcher": "Edit", "command": "./scripts/format.sh" }]
}
📦

Namespace

Las Skills del plugin se convierten en plugin:skill-name para evitar colisiones.

🏪

Marketplace

Índice de plugins (marketplace.json). Instala mediante /plugins.

🔄

Control de versiones

semver al estilo de npm. Se actualiza mediante marketplace.

🦜Polyskill como plugin

Polyskill se distribuye como plugin. Lo instalas una vez y obtienes el CLI + la metaskill que dirige el CLI mediante lenguaje natural. El plugin es la forma moderna de distribuir.

Conceptos clave

plugin.json
Manifiesto del bundle
marketplace.json
Índice público
plugin:skill
Namespace
Semver
Control de versiones

🎯Resumen del módulo

✓
Skill = SKILL.md + scripts/ + references/ + assets/ — body breve, detalles bajo demanda.
✓
Una buena Description = «use when» + activadores reales — pruébalo empíricamente.
✓
Los subagentes se activan automáticamente con «proactively» — contexto aislado, modelo dedicado.
✓
MCP mediante .mcp.json (proyecto) o ~/.claude.json (global) — stdio o HTTP.
✓
Backtick-bang inyecta la salida de shell en el prompt — exclusivo de Claude, NO portable.
✓
disable-model-invocation + allowed-tools = control detallado — combinación de seguridad.
✓
Los plugins distribuyen skills + agents + commands + hooks — versionados, con namespace.

Siguiente ruta:

T3 — Anatomía de Codex (AGENTS.md, .codex/, .agents/, openai.yaml)