Claude Code
Permisos de Claude Code: reglas allow, ask y deny, sintaxis de reglas y herramientas permitidas
¿Cómo funcionan los permisos de Claude Code y cómo permito o bloqueo herramientas específicas?
Claude Code compara cada llamada a herramienta con las reglas de permisos de tus archivos de configuración. Las reglas van en permissions.allow, permissions.ask y permissions.deny, usan el formato Tool o Tool(specifier) y se evalúan primero deny, luego ask y luego allow. Usa /permissions para ver cada regla y el archivo del que viene, o pasa --allowedTools y --disallowedTools para una sola sesión.
Esta página es una traducción de la guía en inglés. Los comandos, claves de configuración y el código no se modifican; si hay diferencias, prevalece la versión en inglés. Leer en inglés → · Otros idiomas: 简体中文 · 日本語 · 한국어 · Português (Brasil)
Entérate cuando cambie la configuración
Cuando cambie un ajuste, flag o regla de permisos de estas herramientas, te avisamos en un correo semanal (en inglés), verificado con la documentación oficial.
Allow, ask y deny
- Las reglas allow permiten que Claude Code use la herramienta coincidente sin preguntarte.
- Las reglas ask piden confirmación cada vez que se usa la herramienta coincidente.
- Las reglas deny bloquean la herramienta coincidente.
- El orden es deny, luego ask, luego allow. Gana la primera coincidencia y la especificidad no cambia el orden, así que un deny amplio como Bash(aws *) gana a un allow más específico como Bash(aws s3 ls).
- Una regla deny con solo el nombre de la herramienta, como Bash, quita la herramienta del contexto de Claude. Un deny acotado como Bash(rm *) mantiene la herramienta y bloquea solo las llamadas coincidentes.
Las reglas las aplica Claude Code, no el modelo. Las instrucciones en CLAUDE.md orientan lo que Claude intenta hacer, pero no cambian lo que tiene permitido hacer.
Sintaxis de reglas por herramienta
- Herramienta completa: Bash, Read o WebFetch sin paréntesis. Bash(*) equivale a Bash.
- Bash: Bash(npm run build) coincide con ese comando exacto. Bash(npm run *) coincide con todos los scripts de npm. Pon el * después del subcomando: Bash(git log *) permite solo git log, mientras que Bash(git *) permite todos los comandos de git.
- Bash(ls *) necesita un espacio después de ls, así que no coincide con lsof. Bash(ls:*) es una forma equivalente de escribir el comodín final.
- Read y Edit usan patrones de gitignore. Read(./.env) bloquea el archivo .env del directorio actual y Read(./secrets/**) bloquea una carpeta. Usa reglas Edit, no Write, para rutas que ninguna herramienta debe modificar.
- Rutas: //path es absoluta desde la raíz del sistema de archivos, ~/path parte de tu carpeta personal, /path es relativa al proyecto del archivo de configuración, y path o ./path es relativa al directorio actual.
- WebFetch: WebFetch(domain:example.com) coincide solo con example.com. Agrega WebFetch(domain:*.example.com) para los subdominios.
- MCP: mcp__github coincide con todas las herramientas del servidor github, mcp__github__get_* con sus herramientas get_ y mcp__github__create_issue con una sola herramienta.
- Subagentes: Agent(Explore) o Agent(my-custom-agent). Pon uno en deny para que Claude no use ese subagente.
Configuración de ejemplo
.claude/settings.json
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)",
"WebFetch(domain:docs.example.com)",
"mcp__github__get_*"
],
"ask": ["Bash(git push *)"],
"deny": [
"Read(./.env)",
"Read(./secrets/**)",
"Bash(rm *)"
]
}
}Las reglas allow y additionalDirectories en el .claude/settings.json de un proyecto solo surten efecto después de que aceptas el diálogo de confianza del workspace para esa carpeta. Las reglas deny y ask se aplican de inmediato.
Herramientas permitidas en la línea de comandos
- --allowedTools (o --allowed-tools): herramientas que se ejecutan sin pedir confirmación, con la misma sintaxis de reglas.
- --disallowedTools (o --disallowed-tools): reglas deny para esta sesión. "mcp__*" quita todas las herramientas MCP.
- --tools: limita qué herramientas integradas existen, por ejemplo "Bash,Edit,Read".
- --add-dir: agrega directorios de trabajo que Claude puede leer y editar. Guárdalos en permissions.additionalDirectories para conservarlos.
Terminal
claude -p "summarize recent changes" \ --allowedTools "Bash(git log *)" "Bash(git diff *)" "Read" \ --disallowedTools "Edit"
Qué pide confirmación por defecto y qué guarda "don't ask again"
- Herramientas de solo lectura como lecturas de archivos y Grep: sin confirmación dentro de tu directorio de trabajo y los directorios adicionales.
- Comandos Bash: piden confirmación, salvo un conjunto integrado de comandos de solo lectura. "Yes, and don't ask again" se guarda de forma permanente para ese repositorio y comando.
- Ediciones y escrituras de archivos: piden confirmación. "Don't ask again" dura solo hasta que termina la sesión y no se guarda en un archivo.
- WebFetch: pide confirmación, salvo un conjunto integrado de dominios de documentación preaprobados. La aprobación se guarda por repositorio y dominio.
- WebSearch: pide confirmación. La aprobación se guarda por repositorio.
Una aprobación guardada se escribe como regla en .claude/settings.local.json en la raíz del repositorio git (resuelta a través de los worktrees hasta el checkout principal), así que también aplica en subdirectorios y worktrees. Aprobar un comando compuesto como git status && npm test guarda una regla separada para cada subcomando que necesitaba aprobación, hasta 5 reglas. Puedes abrir /permissions mientras Claude trabaja; una regla que agregues o quites se aplica desde la siguiente llamada a herramienta de Claude.
Comandos Bash que nunca piden confirmación y wrappers que Claude Code atraviesa
- Los comandos de solo lectura se ejecutan sin confirmación en todos los modos: el conjunto integrado incluye ls, cat, echo, pwd, head, tail, grep, find, wc, which, diff, stat, du, cd y las formas de solo lectura de git. El conjunto no es configurable; agrega una regla ask o deny para que uno de ellos pida confirmación.
- Algunos comandos de solo lectura igual piden confirmación en el modo Manual, por ejemplo find, sort, sed o git con un glob sin comillas, o un cd a otro directorio combinado con git.
- Antes de comparar, Claude Code elimina timeout, time, nice, nohup, stdbuf, command, builtin y zsh noglob, así que Bash(npm test *) también coincide con timeout 30 npm test. También elimina xargs sin flags y una asignación inicial de variables de entorno conocidas como seguras.
- Los runners como npx, docker exec, direnv exec, devbox run y mise exec no se eliminan. Bash(devbox run *) coincidiría con cualquier cosa después de run, así que escribe una regla exacta por cada comando interno, como Bash(devbox run npm test).
- Las reglas de prefijo no pueden aprobar automáticamente wrappers de ejecución como watch, setsid, ionice y flock, ni find con -exec, -delete o -fprint. Usa una regla exacta para el comando completo o un hook PreToolUse.
Lo que una regla deny de Bash no detiene
Las reglas de Bash comparan el texto del comando que escribe Claude. Las reglas deny y ask se aplican cuando coincide cualquier subcomando, incluso dentro de una subshell, una sustitución de comandos o un bucle for. No detectan el mismo programa llamado de otra forma.
- Bash(curl *) detiene curl https://example.com, pero no /usr/bin/curl https://example.com ni sh -c 'curl https://example.com'.
- Bash(rm *) detiene rm -rf build/, pero no /bin/rm -rf build/ ni bash -c 'rm -rf build/'.
- Bash(git push *) detiene git push origin main, pero no git -C . push origin main.
- Los patrones que intentan limitar argumentos, como Bash(curl http://github.com/ *), no cubren flags antes de la URL, https, redirecciones ni variables.
- Las redirecciones de salida (>, >>, 2>) y los destinos de tee se comparan con tus reglas Edit y directorios de trabajo, así que Bash(git commit *) permite el comando, pero no dónde se escribe su salida.
Para un límite que se mantenga sin importar el texto del comando, usa las reglas de red y sistema de archivos del sandbox, o un hook PreToolUse que inspeccione el comando completo. Para restringir el acceso web, deniega curl y wget y permite WebFetch(domain:...) para los sitios en los que confías; las reglas WebFetch por sí solas no bloquean el acceso a la red mientras Bash esté permitido.
Qué configuración gana
- Un deny en cualquier nivel no puede ser permitido por otro nivel. Si la configuración de usuario permite algo y la del proyecto lo deniega, queda denegado, y lo contrario también es cierto.
- La configuración administrada (managed settings) tiene la mayor prioridad. Ni siquiera --allowedTools puede anular un deny administrado, mientras que --disallowedTools puede agregar más restricciones.
- allowManagedPermissionRulesOnly hace que la configuración administrada sea la única fuente de reglas de permisos.
- Configura permissions.disableBypassPermissionsMode o permissions.disableAutoMode como "disable" para bloquear esos modos. Son más útiles en la configuración administrada.
Modos de permisos
Las reglas se aplican sobre el modo de permisos de la sesión: default (Manual), acceptEdits, plan, auto, dontAsk o bypassPermissions. Elige uno con claude --permission-mode <mode> o con permissions.defaultMode en la configuración. dontAsk deniega todo lo que pediría confirmación, excepto las herramientas que tus reglas allow ya aprueban. Para ejecutar sin ninguna confirmación, consulta la guía sobre permitir todos los comandos en Claude Code.
Fuentes
Documentación oficial (en inglés) con la que se verificó esta guía. Versión en inglés revisada el: 2026-10-18
Más guías en español
- Permitir todos los comandos en cualquier agente de programación con IA: Cursor, Claude Code, Codex, Gemini CLI, Copilot CLI y 7 más (2026)
- Archivos de reglas e instrucciones en todos los agentes de programación con IA: .cursor/rules, CLAUDE.md, AGENTS.md, GEMINI.md, instrucciones de Copilot y más (2026)
- Ubicación de los archivos de configuración en todos los agentes de programación con IA: Claude Code, Cursor, Codex, Gemini CLI, OpenCode, Qwen Code, Amp y Factory Droid (2026)
- Añadir un MCP server a cualquier agente de programación con IA: Claude Code, Cursor, Codex, Gemini CLI, VS Code y 8 más (2026)
- Hooks en todos los agentes de programación con IA: Claude Code, Cursor, Gemini CLI, GitHub Copilot, Kiro y Factory Droid (2026)
- Agent Skills (SKILL.md) en todos los agentes de programación con IA: Claude Code, Codex, Cline, Amp y OpenHands (2026)
- Cómo permitir que Claude Code ejecute todos los comandos: modos de permisos, reglas allow y omitir permisos
- Cómo permitir que Cursor ejecute todos los comandos: Run Everything, allowlist y sandbox
- Configuración de reglas en Cursor: reglas de proyecto, de usuario y Team Rules, frontmatter .mdc, globs y AGENTS.md
- Agregar servidores MCP a Claude Code (claude mcp add, .mcp.json, scopes)
- Subagentes y agentes personalizados comparados: Claude Code vs Codex vs Cursor vs Gemini CLI vs GitHub Copilot (2026)