permissions設定の早見表
defaultModeにreadonlyと書くとclaude doctorが弾きました。allow・ask・denyの書式を表で引けます。
- ルールは deny、ask、allow の順に評価され、最初に当たったものが結果になります。広い deny があると、狭い allow は効きません。
- defaultMode の値は default、acceptEdits、plan、auto、dontAsk、bypassPermissions です。"readonly" のように書き間違えると、claude doctor が指摘し、その値は使われません。
- Bash(npm run *) の * はサブコマンドの後ろに置きます。絶対パスは Read(//etc/**) のように / を2つ書きます。
Claude Code の settings.json の permissions を、書き方の早見表にまとめました。allow・ask・deny、defaultMode、additionalDirectories、ルールの書式、設定ファイルの優先順位、そのまま使える設定例3つの順に載せています。書式はすべて公式ドキュメントで確かめました。編集部の検証環境(macOS、Claude Code 2.1.303、jq 1.7.1、2026年10月19日)では、jq と claude doctor で書式のチェックだけをしています。実際のセッションでの挙動は試していません。評価の順番の理由や、allow を広げすぎない考え方はAIエージェントの権限設計で扱っています。
allow・ask・deny
| キー | 何に効くか | 注意点 |
|---|---|---|
allow | 確認なしで使わせる | deny や ask に当たると効かない |
ask | 使うたびに確認を出す | 狭い allow があっても確認が出る |
deny | 使わせない | Bash のようにツール名だけを書くと、ツールそのものが Claude から見えなくなる |
ルールは deny、ask、allow の順に評価され、最初に当たったものが結果になります。ルールが具体的かどうかで順番は変わりません。広い Bash(aws *) を deny すると、狭い Bash(aws s3 ls) を allow しても止まります。
出典:https://code.claude.com/docs/en/permissions 、2026-10-19確認
defaultMode の値
| 値 | 動き |
|---|---|
default | ツールを初めて使うときに確認する。CLI では Manual と表示され、manual も別名として使える |
acceptEdits | ファイルの編集と、mkdir・touch・mv・cp などを、作業ディレクトリの中なら自動で許可する |
plan | ファイルを読み、読み取り専用のコマンドで調べるだけ。ソースは編集しない |
auto | 確認を出さず、実行前に分類器が依頼に沿っているかを確かめる |
dontAsk | 確認が必要になる呼び出しは自動で拒否する。allow 済みのものと確認の要らない操作は動く |
bypassPermissions | 確認を飛ばす。コンテナや VM のような隔離された環境でだけ使う |
plan mode の入り方と計画の承認の流れはClaude Codeのplan modeの使い方で説明しています。
出典:https://code.claude.com/docs/en/permissions 、2026-10-19確認
値を書き間違えると、その値は使われません。 "defaultMode": "readonly" と書いて claude doctor を実行すると、次のように出ました。
- <project>/.claude/settings.json › permissions.defaultMode: Invalid value. Expected one of: "acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "plan"
"manual" と書いた場合は、何も指摘されませんでした。
ルールの書式
| 書き方 | 何に当たるか | 注意点 |
|---|---|---|
Bash / Bash(*) | すべての Bash コマンド | deny に書くと Bash が使えなくなる |
Bash(npm run build) | そのコマンドだけ | npm run build --watch には当たらない |
Bash(npm run *) | npm run で始まるコマンド | * はサブコマンドの後ろに置く。Bash(git *) は git のすべてに当たる |
Bash(npm run test:*) | Bash(npm run test *) と同じ | :* は末尾でだけ使える |
Read(./.env) | 今のディレクトリの .env | ファイル名だけのパターンは、どの深さにも当たる |
Edit(/src/**) | 設定ファイルの場所が基準の src/ | プロジェクトの設定なら <作業ディレクトリ>/src/ になる |
Read(//etc/**) | ファイルシステムの絶対パス | 先頭の / が1つだけだと絶対パスにならない |
Read(~/.ssh/**) | ホームからのパス | ユーザー設定から全プロジェクトに効かせるときに使う |
WebFetch(domain:example.com) | example.com だけ | サブドメインは domain:*.example.com を別に書く |
mcp__github__* | github サーバーのすべてのツール | mcp__github と書いても同じ |
mcp__github__create_issue | そのツールだけ | 括弧付きの MCP ルールは読み飛ばされる |
ファイルのルールに効くのは Read(...) と Edit(...) だけです。Write(docs/**) と書いても受け付けられますが、参照されません。代わりに Edit(docs/**) と書きます。Read の deny は、同じパスへの Edit と Write も止めます。ただし grep -r のように、ファイル名を書かずに読むコマンドには効きません。
出典:https://code.claude.com/docs/en/permissions 、2026-10-19確認
括弧付きの MCP ルールは、claude doctor でこう出ました。
- <project>/.claude/settings.json › permissions.allow: Invalid permission rule "mcp__github__create_issue(repo:x)" was skipped: MCP rules do not support patterns in parentheses. ...
Write(docs/**) と Bash(git * main) は、claude doctor では指摘されませんでした。公式によると、これらはセッションの起動時に警告が出ます(起動時の警告は未確認)。
作業ディレクトリを足す
Claude が確認なしで読めるのは、起動したディレクトリの中です。ほかのディレクトリを足す方法は3つあります。起動時の --add-dir <path>、セッション中の /add-dir、設定の additionalDirectories です。足したディレクトリにも、元の作業ディレクトリと同じルールがかかります。ただし足したディレクトリの .claude/ の設定は、ほとんど読み込まれません。
出典:https://code.claude.com/docs/en/permissions 、2026-10-19確認
設定ファイルの場所と優先順位
| 優先度 | 場所 | 範囲 |
|---|---|---|
| 1(最優先) | managed settings | 組織が配る設定 |
| 2 | コマンドラインの --settings | そのセッションだけ |
| 3 | .claude/settings.local.json | このプロジェクトの自分だけ |
| 4 | .claude/settings.json | このプロジェクト。Git で共有する |
| 5 | ~/.claude/settings.json | 自分のすべてのプロジェクト |
permissions.allow のようなリストは、上書きされず足し合わされます。deny はどの階層にあっても効きます。ユーザー設定で allow しても、プロジェクトの設定で deny されていれば止まります。セッション中は /permissions で、すべてのルールと、それぞれがどのファイルから来たかを見られます。読み込まれた設定ファイルは /status の Setting sources で確かめます。
出典:https://code.claude.com/docs/en/settings 、https://code.claude.com/docs/en/permissions 、2026-10-19確認
そのまま使える設定例
3つとも jq empty を通り、claude doctor でも不正な設定は出ませんでした。
読み取り中心で、安全寄りの設定です。
{
"permissions": {
"defaultMode": "plan",
"allow": ["Bash(git status)", "Bash(git diff *)", "Bash(git log *)"],
"deny": ["Edit", "WebFetch"],
"additionalDirectories": ["../shared-docs"]
}
}
テストとビルドだけを許す設定です。
{
"permissions": {
"allow": [
"Bash(npm run test:*)",
"Bash(npm run build)",
"Bash(npm run lint)",
"Edit(/src/**)",
"Edit(/tests/**)"
],
"ask": ["Bash(npm install *)", "Bash(git push *)"],
"deny": ["Bash(npm publish *)", "Bash(curl *)"]
}
}
秘密ファイルを読ませない設定です。
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(~/.ssh/**)",
"Read(~/.aws/**)",
"Bash(printenv *)"
]
}
}
git -C . push のように書き方を変えたコマンドは、Bash(git push *) に当たりません。確実に止めたいものは hook も併用します。書き方はClaude Code hooks実践を、秘密情報の扱いはClaude Codeに秘密を渡さないを読んでください。
まとめ
- ルールは deny、ask、allow の順に評価され、allow で deny に例外は作れない
defaultModeの値は6つ。書き間違いはclaude doctorで見つかる*はサブコマンドの後ろに置く。:*は末尾だけで使える- ファイルのルールは
ReadとEditだけが効く。/pathは設定ファイルの場所が基準で、絶対パスは//path - 括弧付きの MCP ルールは読み飛ばされる
- 優先順位は managed、
--settings、local、project、user の順。リストは足し合わされる