創刊準備号 · 2026年秋English · RSS
AgentKoji

permissions設定の早見表

defaultModeにreadonlyと書くとclaude doctorが弾きました。allow・ask・denyの書式を表で引けます。

要点(TL;DR)

  • ルールは 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に秘密を渡さないを読んでください。

まとめ

関連記事