Permissions in 📝Claude Code are granular allow / ask / deny rules declared in settings.json that control which tools, Bash commands, and MCP calls run without prompting the user for approval.
How Do Permission Rules Work?
The permissions system distinguishes three states per rule: allow (the action runs automatically), ask (the user is prompted before each invocation, the default for sensitive operations), and deny (the action is blocked outright). Rules can be scoped to specific tool types (Bash, Edit, Write, WebFetch), to specific command shapes (Bash(git status:*) matches git status with any args), or to specific MCP tool paths (mcp__mythos__read_memo).
Permission rules layer across the same three 📝settings.json locations as other config — global, project-shared, and project-local. Adding Bash(git diff:*) to global allow removes the approval prompt for every git diff invocation across every project; adding WebFetch(domain:example.com) permits fetching only that domain.
How Do You Always Allow an MCP Tool?
To always allow an MCP tool in Claude Code, add its tool path to the allow list in settings.json:
{
"permissions": {
"allow": [
"mcp__mythos__read_memo",
"mcp__github"
]
}
}mcp__<server>__<tool>allows one specific tool from one servermcp__<server>allows every tool that server exposes- Choosing "Always allow" when Claude Code prompts for an MCP call writes the same rule to the project's
settings.local.jsonautomatically
How Do You Skip Permission Prompts Entirely?
Permission mode can be set at session level via --permission-mode accept-edits for fully autonomous runs, or via --dangerously-skip-permissions to pre-approve every call.
A common practitioner pattern is to bootstrap a project by allowing all the safe read operations and letting Claude prompt only for writes and shell commands. The /fewer-permission-prompts skill scans conversation transcripts and proposes an allowlist tailored to the commands actually used.
Related
- 📝Claude Code Features — full index of all features of 📝Claude Code
