Help us improve
Share bugs, ideas, or general feedback.
From claude-code-expert
Provides reference for Claude Code permission modes (default, acceptEdits, plan, dontAsk, bypass), allow/deny lists, pattern matching, and tool categories. Use to configure secure tool access and switch modes runtime.
npx claudepluginhub markus41/claude --plugin claude-code-expertHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-code-expert:permissions-securityThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Complete reference for the permission model and security features.
Configures Claude Code permissions: tool rules (allow/deny/ask), modes (plan/dontAsk/bypass), sandboxing. Use for Bash/Edit/WebFetch policies, debugging prompts, org managed settings.
Configures Claude Code security settings with permission wildcards, shell operator protections, and project-level access controls. Use for securing tools like Bash and workflows.
Explains Claude Code settings hierarchy, permission wildcards, allow/deny patterns, and tool configurations. Use for setting up project permissions, debugging access issues, or understanding tool blocks.
Share bugs, ideas, or general feedback.
Complete reference for the permission model and security features.
Claude Code operates in one of several permission modes:
default)acceptEdits)plan)Shift+Tab or --permission-mode plandontAsk)bypassPermissions)--dangerously-skip-permissions flagShift+Tab — Cycle through permission modes interactively--permission-mode <mode> — Set mode at startupIn settings.json or .claude/settings.json:
{
"permissions": {
"allow": [
"Read",
"Write",
"Edit",
"Glob",
"Grep",
"Bash(npm test)",
"Bash(npm run *)",
"Bash(npx tsc *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(ls *)",
"Bash(mkdir *)",
"Bash(cat *)",
"Bash(head *)",
"Bash(tail *)",
"Bash(wc *)",
"Bash(echo *)",
"Bash(pwd)",
"Bash(which *)",
"Bash(node *)",
"Bash(python3 *)",
"WebFetch",
"WebSearch",
"TodoWrite",
"NotebookEdit",
"Agent"
]
}
}
{
"permissions": {
"deny": [
"Bash(rm -rf /)",
"Bash(sudo *)",
"Bash(curl * | bash)",
"Bash(wget * | bash)",
"Bash(chmod 777 *)",
"Bash(> /dev/sda)",
"Bash(mkfs *)",
"Bash(dd if=*)",
"Bash(:(){ :|:& };:)"
]
}
}
| Pattern | Example | Matches |
|---|---|---|
| Exact tool | "Read" | All Read calls |
| Bash prefix | "Bash(npm test)" | Exactly npm test |
| Bash glob | "Bash(npm *)" | Any npm command |
| MCP wildcard | "mcp__server__*" | All tools from server |
| MCP specific | "mcp__fs__read_file" | Specific MCP tool |
Read — Read file contentsGlob — Find files by patternGrep — Search file contentsTodoWrite — Manage todo listWrite — Create/overwrite filesEdit — Modify existing filesBash — Execute shell commandsWebFetch — Fetch web contentWebSearch — Search the webNotebookEdit — Edit Jupyter notebooksAgent — Spawn sub-agents (inherits parent permissions)AskUserQuestion — Always allowed (asks user questions)Skill — Invoke slash commands{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"Bash(npm test)",
"Bash(npx tsc --noEmit)"
]
}
}
Use hooks to guard sensitive paths:
#!/bin/bash
# PreToolUse hook
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
PATH_ARG=$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_input.path // ""')
# Block access to secrets
if echo "$PATH_ARG" | grep -qE '\.(env|pem|key|secret)$'; then
echo '{"decision": "deny", "reason": "Access to secret files is blocked"}'
exit 0
fi
echo '{"decision": "approve"}'
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(npx *)",
"Bash(git *)",
"Bash(ls *)",
"Bash(cat *)"
],
"deny": [
"Bash(rm *)",
"Bash(sudo *)",
"Bash(curl *)",
"Bash(wget *)"
]
}
}
{
"permissions": {
"allow": [
"mcp__filesystem__read_file",
"mcp__filesystem__list_directory"
],
"deny": [
"mcp__filesystem__write_file",
"mcp__filesystem__delete_file"
]
}
}
During a session, when Claude requests a tool:
Session permissions reset when Claude Code restarts. For persistent permissions, add them to settings.json.
Enterprise admins can push managed settings that users cannot override:
{
"managedSettings": {
"permissions": {
"deny": [
"Bash(curl *)",
"Bash(wget *)",
"WebFetch",
"WebSearch"
]
},
"model": "claude-sonnet-4-6",
"hooks": {
"PostToolUse": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "bash /opt/audit/log-tool-use.sh"
}
]
}
]
}
}
}
.mcp.json (use env vars).env files in .gitignore