Claude Code settings.json: configuración avanzada

Por Ricardo Gutierrez · · 20 min lectura

En este artículo

  1. Qué es settings.json y dónde vive
  2. Referencia completa de settings.json
  3. Configurar permisos de herramientas
  4. Hooks: automatizar acciones
  5. Servidores MCP
  6. Selección de modelo
  7. Variables de entorno
  8. Configuración compartida en equipo
  9. Migración entre máquinas
  10. Ejemplo completo de settings.json
  11. Errores comunes
  12. Preguntas frecuentes
  13. Siguiente paso

Resumen rápido

Guía completa de settings.json en Claude Code. Permisos, hooks, MCP servers y configuración avanzada con ejemplos reales listos para copiar.

Qué es settings.json y dónde vive

El archivo settings.json controla el comportamiento técnico de Claude Code: qué herramientas puede usar sin pedir permiso, qué scripts se ejecutan automáticamente y qué servidores externos están conectados.

💡 Error frecuente: Al principio usaba Claude Code como un autocompletado glorificado. El salto vino cuando empecé a tratarlo como un compañero de equipo: le paso el CLAUDE.md con las reglas del proyecto, uso agentes paralelos para tareas independientes, y le dejo tomar decisiones arquitectónicas dentro de límites claros.

Mientras que CLAUDE.md define el "qué" (instrucciones en lenguaje natural), settings.json define el "cómo" (configuración técnica).

💡 Experiencia del equipo: Llevo más de 1.000 horas usando Claude Code en 15 proyectos reales. He generado más de 30.000 líneas de código, creado 22 agentes especializados y construido una plataforma completa de inteligencia ciber con 62 endpoints API. Lo que te cuento aquí viene de haberme equivocado muchas veces primero.

Hay dos ubicaciones:

La jerarquía de precedencia es: proyecto > global. Si defines allowedTools en ambos, el del proyecto gana. Los MCP servers se combinan (merge): puedes tener MCPs globales y añadir más a nivel de proyecto.

Referencia completa de settings.json

Todas las claves disponibles en settings.json:

{
 // Herramientas permitidas sin confirmación
 "allowedTools": ["Bash(comando)", "Read", "Write", "Edit"],

 // Herramientas bloqueadas (nunca se ejecutan)
 "deniedTools": ["Bash(rm -rf *)"],

 // Scripts automáticos por evento
 "hooks": {
   "PreCommit": [],
   "PostCommit": [],
   "PreFileWrite": [],
   "PostFileWrite": [],
   "PreToolUse": [],
   "PostToolUse": [],
   "SessionStart": [],
   "SessionEnd": []
 },

 // Servidores MCP (conexiones externas)
 "mcpServers": {},

 // Modelo por defecto
 "model": "claude-sonnet-4-20250514",

 // Modelo para tareas de agente (subagentes)
 "smallModel": "claude-haiku-4-20250514",

 // Máximo de tokens de respuesta
 "maxTokens": 16384,

 // Activar/desactivar telemetría
 "telemetry": true,

 // Directorio de trabajo (rara vez necesario)
 "cwd": "/ruta/absoluta"
}

Configurar permisos de herramientas

Por defecto, Claude Code pide confirmación antes de ejecutar cualquier comando o modificar archivos. Con allowedTools puedes definir qué acciones se ejecutan sin preguntarte:

{
 "allowedTools": [
 "Bash(npm test)",
 "Bash(npm run lint)",
 "Bash(npm run build)",
 "Bash(git status)",
 "Bash(git diff)",
 "Bash(git log *)",
 "Bash(pytest *)",
 "Read",
 "Write",
 "Edit",
 "Glob",
 "Grep"
 ]
}

Cada entrada permite una acción específica. Bash(npm test) permite ejecutar solo npm test, no cualquier comando bash. Read permite leer cualquier archivo. Write y Edit permiten modificar archivos. El asterisco (*) funciona como wildcard: Bash(git log *) permite cualquier variación de git log.

Patrones de permisos por tipo de proyecto

// Frontend (Next.js / React)
"allowedTools": [
 "Bash(npm test)", "Bash(npm run lint)", "Bash(npm run build)",
 "Bash(npx tsc --noEmit)", "Bash(git *)",
 "Read", "Write", "Edit", "Glob", "Grep"
]

// Backend (Python / FastAPI)
"allowedTools": [
 "Bash(pytest *)", "Bash(ruff check *)", "Bash(ruff format *)",
 "Bash(python -m mypy *)", "Bash(git *)",
 "Read", "Write", "Edit", "Glob", "Grep"
]

// Full-stack (monorepo)
"allowedTools": [
 "Bash(npm test)", "Bash(pytest *)", "Bash(git *)",
 "Bash(docker compose *)", "Bash(make *)",
 "Read", "Write", "Edit", "Glob", "Grep"
]

Seguridad

Nunca añadas Bash(*) a allowedTools. Eso permite ejecutar cualquier comando sin confirmación, incluyendo rm -rf. Sé selectivo: solo los comandos que usas constantemente y son seguros. Una buena regla: si el comando puede destruir datos o enviar algo a producción, no lo pongas en allowedTools.

También puedes bloquear herramientas con deniedTools:

{
 "deniedTools": [
 "Bash(rm -rf *)",
 "Bash(git push --force *)",
 "Bash(git reset --hard *)",
 "Bash(git checkout -- .)",
 "Bash(docker system prune *)"
 ]
}

Hooks: automatizar acciones

Los hooks ejecutan scripts automáticamente cuando ocurre un evento. Son la clave para convertir Claude Code en un sistema proactivo que mantiene calidad sin que tú intervengas.

{
 "hooks": {
 "PreCommit": [
 {
 "command": "npm run lint && npm test",
 "description": "Lint y tests antes de commit"
 }
 ],
 "PostFileWrite": [
 {
 "command": "prettier --write $FILE",
 "description": "Formatear archivo después de escribir"
 }
 ],
 "PreToolUse": [
 {
 "command": "echo 'Tool: $TOOL_NAME'",
 "description": "Log de herramientas usadas"
 }
 ],
 "SessionStart": [
 {
 "command": "echo 'Session started at $(date)'",
 "description": "Log inicio de sesión"
 }
 ]
 }
}

Eventos disponibles y cuándo se disparan:

Variables de entorno en hooks

Cada hook recibe variables de contexto:

Servidores MCP

MCP (Model Context Protocol) permite conectar Claude Code con herramientas externas. La configuración va en settings.json:

{
 "mcpServers": {
 "github": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-github"],
 "env": {
 "GITHUB_TOKEN": "${GITHUB_TOKEN}"
 }
 },
 "supabase": {
 "command": "npx",
 "args": ["-y", "@supabase/mcp-server-supabase"],
 "env": {
 "SUPABASE_ACCESS_TOKEN": "${SUPABASE_ACCESS_TOKEN}"
 }
 },
 "filesystem": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-filesystem", "/ruta/extra"]
 }
 }
}

Cada MCP server se ejecuta como un proceso hijo de Claude Code. Se inicia al arrancar y permanece activo durante la sesión. Para profundizar en MCP, consulta nuestra guía de MCP en Claude Code y el tutorial de MCP + Supabase.

Selección de modelo

Puedes especificar qué modelo usa Claude Code por defecto:

{
 // Modelo principal para tareas complejas
 "model": "claude-sonnet-4-20250514",

 // Modelo para subagentes (más rápido y barato)
 "smallModel": "claude-haiku-4-20250514"
}

Modelos disponibles y cuándo usar cada uno:

También puedes cambiar el modelo durante la sesión con el flag --model al iniciar Claude Code, o con /model dentro de una sesión activa.

Variables de entorno

Los settings.json soportan variables de entorno con la sintaxis ${VARIABLE}. Esto evita poner secretos directamente en archivos que podrían acabar en git:

// settings.json usa variables del sistema
{
 "mcpServers": {
 "github": {
 "env": {
 "GITHUB_TOKEN": "${GITHUB_TOKEN}"
 }
 }
 }
}

// Las variables se definen en tu shell profile (~/.zshrc):
// export GITHUB_TOKEN="ghp_xxxxxxxxxxxx"
// export SUPABASE_ACCESS_TOKEN="sbp_xxxxxxxxxxxx"
// export ANTHROPIC_API_KEY="sk-ant-xxxxxxxxxxxx"

Variables de entorno que Claude Code reconoce automáticamente:

Configuración compartida en equipo

El archivo .claude/settings.json del proyecto se sube a git y todos los miembros del equipo lo comparten. Esto garantiza consistencia:

// .claude/settings.json (del proyecto, en git)
{
 "allowedTools": [
 "Bash(npm test)",
 "Bash(npm run lint)",
 "Read", "Edit", "Write", "Glob", "Grep"
 ],
 "deniedTools": [
 "Bash(git push --force *)",
 "Bash(rm -rf *)"
 ],
 "hooks": {
 "PreCommit": [
 {
   "command": "npm run lint && npm run test:unit",
   "description": "Calidad de código antes de commit"
 }
 ]
 },
 "mcpServers": {
 "github": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-github"],
 "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
 }
 }
}

Buenas prácticas para configuración de equipo:

Migración entre máquinas

Cuándo cambias de ordenador o configuras un nuevo entorno de desarrollo:

Qué copiar

Qué reconfigurar

Automatizar con dotfiles

# En tu repo de dotfiles:
# ~/.dotfiles/claude/settings.json → symlink a ~/.claude/settings.json

# Script de setup:
#!/bin/bash
mkdir -p ~/.claude
ln -sf ~/.dotfiles/claude/settings.json ~/.claude/settings.json
ln -sf ~/.dotfiles/claude/CLAUDE.md ~/.claude/CLAUDE.md

# Las variables de entorno van en ~/.dotfiles/shell/exports.sh
# (que se carga desde ~/.zshrc)

Ejemplo completo de settings.json

Un settings.json de producción para un proyecto Next.js + FastAPI + Supabase:

{
 "model": "claude-sonnet-4-20250514",
 "smallModel": "claude-haiku-4-20250514",
 "allowedTools": [
 "Bash(npm test)",
 "Bash(npm run lint)",
 "Bash(npm run build)",
 "Bash(npx tsc --noEmit)",
 "Bash(pytest *)",
 "Bash(ruff check *)",
 "Bash(git status)",
 "Bash(git diff *)",
 "Bash(git log *)",
 "Bash(git add *)",
 "Read",
 "Edit",
 "Write",
 "Glob",
 "Grep"
 ],
 "deniedTools": [
 "Bash(rm -rf *)",
 "Bash(git push --force *)",
 "Bash(git reset --hard *)",
 "Bash(git checkout -- .)",
 "Bash(DROP TABLE *)",
 "Bash(docker system prune *)"
 ],
 "hooks": {
 "PreCommit": [
 {
 "command": "npm run lint && pytest --tb=short -q",
 "description": "Lint frontend + tests backend antes de commit"
 }
 ],
 "PostFileWrite": [
 {
 "command": "prettier --write $FILE",
 "description": "Autoformato al crear/modificar archivos"
 }
 ]
 },
 "mcpServers": {
 "github": {
 "command": "npx",
 "args": ["-y", "@modelcontextprotocol/server-github"],
 "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
 },
 "supabase": {
 "command": "npx",
 "args": ["-y", "@supabase/mcp-server-supabase"],
 "env": { "SUPABASE_ACCESS_TOKEN": "${SUPABASE_ACCESS_TOKEN}" }
 }
 }
}

Errores comunes

Preguntas frecuentes

¿Puedo tener settings.json diferentes por rama?

Sí, porque .claude/settings.json es un archivo normal en git. Cada rama puede tener su propia versión. Útil para ramas de feature que necesitan MCPs específicos o permisos diferentes.

¿Se puede usar settings.json sin CLAUDE.md?

Sí. Son independientes. settings.json funciona solo y viceversa. Pero la combinación es donde está el poder real: CLAUDE.md dice qué hacer, settings.json controla cómo puede hacerlo.

¿Los hooks funcionan en modo agente (subagentes)?

Los hooks del proyecto aplican a todos los agentes que trabajan en ese directorio. Si un subagente crea un commit, el PreCommit hook se ejecuta igualmente.

¿Cómo desactivo temporalmente un hook?

No hay flag de desactivación temporal. Puedes comentar la línea (pero es JSON, no admite comentarios). La opción más limpia: renombra temporalmente el settings.json o usa una rama diferente.

Siguiente paso

Con un settings.json bien configurado, Claude Code se adapta a tu flujo de trabajo. Combínalo con un buen CLAUDE.md para que Claude Code sepa qué hacer Y cómo hacerlo.

Después, explora la memoria de Claude Code para persistir contexto entre sesiones, los skills para crear comandos personalizados, y el tutorial de MCP + Supabase para ver en la práctica cómo funciona un MCP configurado.

Configura Claude Code como un profesional

En IAcademy te enseñamos la configuración completa: CLAUDE.md, settings.json, hooks, MCP y más. Los primeros módulos son gratis.

Empieza gratis

Curso completo: 108 módulos de IA aplicada

11 especializaciones por departamento. Dashboard con progreso. Quizzes y skills desbloqueables. Desde 399 EUR.

Ver precios Acceder al portal