DEV M3 · Claude Code, MCP & Integration — Resumen de estudio

Curso 3 de 5 · 21 pantallas, 8 secciones, 8 checkpoints, ~142 min

El problema de fondo: lo que funciona en tu máquina tiene que funcionar cuando otro lo ejecuta, en producción y contra sistemas reales. Permisos, contexto durable, empaquetado, MCP y autenticación empresarial.


1. Loop de Claude Code, permission modes y gates humanos

Loop: explore → plan → code. Primero lee y entiende, luego propone un plan y solo con tu aprobación edita y ejecuta. Plan mode lo mantiene en exploración (sin edits ni comandos).

ModoAuto-apruebaSigue pidiendo confirmaciónPara qué
defaultSolo lecturasTodo edit y comandoBase para proyectos nuevos o desconocidos
acceptEditsLecturas, edits y comandos comunes de archivos (mkdir, touch, rm, rmdir, mv, cp, sed) dentro del directorio de trabajoOtros comandos de shell, escrituras fuera del directorio, protected pathsTrabajo local confiable
planSolo lecturasTodo, hasta que apruebas el planExplorar código sensible o desconocido
autoTodo, pero un clasificador revisa cada acciónBloquea por defecto: deploys y migraciones de producción, borrados masivos, exfiltración de credenciales, force-push a mainMenos prompts (research preview; depende del plan, el modelo y el admin)
dontAskSolo lo que está en las allow rules + comandos de solo lectura; niega todo lo demásNo hay cola de confirmaciónCI y scripts cerrados
bypassPermissionsTodo, sin checks (también quita el guard de protected paths)Solo rm -rf / y rm -rf ~ piden confirmación como último recursoSolo en contenedores o VMs desechables

Dónde vive la configuración:

Una regla deny siempre gana a una allow, sea cual sea el modo. El control más durable es un deny a nivel enterprise (aplica incluso en bypass).

¿Dónde va el gate humano? Pregunta: ¿qué es lo peor si esto corre sin que nadie lo revise?

Revisión de código con IA: son hallazgos para priorizar, no un veredicto. Confía en lo que se puede probar con el diff (null check faltante, recurso sin cerrar) y verifica las líneas que cita. Lo que afirme sobre el runtime u otros sistemas es una hipótesis a probar. Dale las convenciones del equipo para que no tenga que adivinarlas.

⚠️ Watch out: con bypass para "solo renombrar endpoints", el patrón /v1/legacy/ coincidió también con /deploy/config/prod/ y un script borró 3 archivos de producción. Lo que habría pedido confirmación era la ejecución del script (en acceptEdits, un rm directo dentro del directorio no pide confirmación; en default sí). Pon deny rules antes de cambiar de modo; si quieres menos prompts, usa auto en vez de bypass.

Checkpoint 1: piezas C (allow Bash(npm run:*), deny rm y git push) + D (deny Read(.env.production)). Gate: b, un humano aprueba el cambio al archivo de configuración de despliegue antes de escribirlo.


2. Contexto durable: CLAUDE.md, rules, hooks y subagents

MecanismoCargaCuándoCosto de contextoQué va ahí
CLAUDE.mdArchivo completoSiemprePersistente; se diluyeRestricciones universales
Rules fileContenidoAl tocar rutas que coinciden (sin paths = siempre)Solo cuando se activaGuía por ruta
HookEjecuta un script (no añade contexto)En el eventoMínimoGuardrails, efectos automáticos, auditoría
SubagentSolo la tareaAl delegarDevuelve un resumenExploración e investigación paralelizable

⚠️ Watch out: con un CLAUDE.md de 847 líneas, la regla de "no tocar /legacy/tokens/" (línea 347) quedó diluida y se editó igual. El historial y las notas archivadas no van ahí. La regla que no puedes permitirte diluir debería ser un hook.

Checkpoint 2: PreToolUse + un script que lee la tool call de stdin y sale con código 2 si la ruta es .env.production (razón en stderr).


3. Empaquetar workflows: Skills, comandos y plugins

El mismo SKILL.md en 4 runtimes:

RuntimeCómo cargaDónde correOjo
Claude CodeSe descubre en .claude/skills por coincidencia de descripción o por nombreTu terminal, con permisos y deny rulesBasado en el sistema de archivos
Messages APIVa con el request; headers beta de code-execution + skillsContenedor de code execution de AnthropicNo asumas archivos ni tools locales
Agent SDKSegún settingSources / setting_sourcesTu procesoSorpresa típica: no carga porque settingSources nunca se configuró
Managed AgentsSe declara en el recurso del agente (header managed-agents-2026-04-01)Sandbox de AnthropicSin ZDR ni BAA. Para cambiar los Skills, actualiza la definición

3 reglas de portabilidad:

  1. La descripción es el criterio de coincidencia.
  2. No asumas un filesystem ni tools locales.
  3. Los subagents no heredan Skills.
CapaPara quiénCuándo
SkillUso interactivo, individuo o equipoProcedimiento que no debe ocupar contexto hasta que se necesite
ComandoQuien quiere un punto de entrada explícitoProcedimiento frecuente con nombre claro
PluginEquipoCompartir una configuración versionada e instalable en un paso

⚠️ Watch out: un Skill con /Users/alexmorgan/projects/deploy-utils/validate.sh se instaló bien en todas partes pero falló en todas menos en la máquina del autor; otro necesitaba DEPLOY_TOKEN sin documentarlo. Usa $CLAUDE_PROJECT_DIR (scripts del proyecto) y ${CLAUDE_PLUGIN_ROOT} (scripts del plugin), incluye los assets, documenta y valida las variables de entorno, y prueba en una máquina limpia.

Checkpoint 3: Claude Code → SKILL.md en .claude/skills · Messages API → headers beta + sin dependencias locales · Agent SDK → settingSources explícito · Managed → recurso de agente + header beta. Checkpoint 4: defecto C (ruta absoluta) · fix C ($CLAUDE_PROJECT_DIR).


4. Servidores MCP

Scopes:

ContextoTransporteScopeSecretos
Herramienta local personalstdioLocalSolo variables de entorno
Servidor compartido del equipoHTTPProject (.mcp.json)OAuth o variables de entorno; nunca keys en .mcp.json
Experimento personalstdio o HTTPLocalVariables de entorno
Despliegue a toda la orgHTTPEnterpriseLos gestiona el admin; configuración bloqueada

⚠️ Watch out: se commiteó una API key en .mcp.json. En 48 h estaba en el repo, en 3 máquinas y en CI. Sobrescribir el archivo no la saca del historial → hay que rotarla (y la rotación rompió otros 2 servicios). Correcto: "Bearer ${WAREHOUSE_MCP_TOKEN}". Prevención en 2 capas: regla en CLAUDE.md + hook PreToolUse que bloquee credenciales inline.

Checkpoint 5: SQLite local = stdio + Local · búsqueda de código del equipo = HTTP + Project · experimento = stdio o HTTP + Local · escáner de seguridad para todos = HTTP + Enterprise.


5. Integración empresarial y autenticación

Preguntas que un prototipo ignora: ¿con qué identidad actúa el modelo y es auditable? ¿A qué datos accede y dónde salen? ¿Un admin puede bloquear la configuración? ¿Queda registro para una auditoría?

Tipo de servicioAutenticaciónDónde viven los secretosLogQuién bloquea la config
Remoto con identidad de usuario (SaaS)OAuth (el 401 dispara el login en el navegador)Token del proveedor guardado por el clienteHook PostToolUse → audit logAdmin vía managed settings
Remoto con identidad de servicio (API interna)API key en variable de entorno (en CI la inyecta el runner)Solo en el entorno, nunca en un config commiteadoHook PostToolUseAdmin vía managed settings
Local (filesystem, base local)Permisos del filesystem (stdio, sin red)No hay credencial; deny rulesHook PostToolUseDeny rules en managed settings

Manejo de secretos (3 prácticas):

  1. Separación: el config tiene la referencia, nunca el valor.
  2. Dónde vive el valor: variable de entorno (local o de corta vida) o un secret store (compartido o auditado; una rotación actualiza a todos).
  3. Rotación: periódica y de inmediato ante una sospecha de exposición. Un valor en código commiteado no se puede rotar limpiamente.

Además: alcance mínimo por credencial y un registro de qué servicio usa cada una.

Entornos regulados: configuración bloqueada por managed settings · audit hooks PostToolUse · residencia (endpoint HTTP regional + plataforma con región fija).

Modernización de código legacy:

⚠️ Watch out: OAuth funcionaba en staging y en producción daba redirect URI mismatch. Las redirect URIs se registran por host; muchas empresas exigen apps OAuth separadas por entorno. Inclúyelo en el checklist de despliegue.

Checkpoint 6: Fix B. El 401 indica una key rechazada y hay un secreto en texto plano en un archivo de ruta conocida → rotar + mover a una variable de entorno en el runner de CI y referenciarla. (A deja el mismo defecto de almacenamiento; C usa OAuth, que no corresponde a una cuenta de servicio.)


Tarea acumulativa (3 archivos, 3 bugs)

  1. settings.json: bypassPermissions en una estación de producción → acceptEdits (el deny de .env.production estaba bien).
  2. SKILL.md: ruta absoluta /Users/priya/... → $CLAUDE_PROJECT_DIR/scripts/validate-migration.sh.
  3. .mcp.json: key inline sk-prod-... → Bearer ${WAREHOUSE_MCP_TOKEN} (y rotar la key expuesta).

Para recordar (7 takeaways)

  1. El permission mode es una decisión de riesgo, no de velocidad. Los deny rules cubren lo que el modo no cubre.
  2. Una revisión de código con IA da hallazgos que priorizar, no un veredicto.
  3. Un Skill es portable, pero hay que diseñarlo para que lo sea.
  4. Contexto durable = el mecanismo correcto para cada cosa (CLAUDE.md, rules, hooks, subagents).
  5. Una configuración compartible necesita componentes portables (rutas relativas, variables documentadas, prueba en una máquina limpia).
  6. Transporte y scope son decisiones independientes con consecuencias que dependen una de otra (un servidor stdio en .mcp.json parece compartible y no lo es).
  7. En empresas, identifica antes del despliegue: OAuth, variables de entorno, hooks de auditoría, managed settings.