何のためのものか
何にアクセスし何をできるかを、ルールで細かく決める仕組み。mode が基準なら、こちらは個別の例外である。
permission ルールは Claude Code が強制するものであり、モデルが強制するものではない。 プロンプトや CLAUDE.md の指示は Claude が何を試みるかを形作るだけで、何を許すかは変えない。
触る
/permissionsを開く。全ルールと、それぞれの出所となるsettings.jsonが見える- permission prompt が出たときに
Ctrl+Eを押す。コマンドの説明が Low risk / Med risk / High risk のラベル付きで表示される(押したときにだけモデルへ送られ、表示しても実行はされない)
「Yes, don't ask again」で承認したものは、git リポジトリルートの .claude/settings.local.json に保存される。
入れる
書き方は Tool または Tool(specifier)。括弧なしはそのツールのすべての使用に一致する。
| 対象 | 例 | 注意 |
|---|---|---|
| Bash | Bash(ls *) | 末尾のスペース付き * は語境界を強制する。Bash(ls *) は lsof に一致しない |
| ファイル読み書き | Read(.env)、Edit(/src/**/*.ts) | Edit ルールはファイルを編集するすべての組み込みツールに適用される |
| ドメイン | WebFetch(domain:*.example.com) | 先頭 *. はサブドメインのみ。example.com 自体には一致しない |
| MCP | mcp__puppeteer、mcp__github__get_* | allow の glob は mcp__<server>__ の後ろにのみ置ける |
| subagent | Agent(Explore) |
パスの anchor を覚える。//path はファイルシステムルート、~/path はホーム、/path はsettings のソースからの相対、path は現在のディレクトリからの相対。/Users/alice/file は絶対パスではない。
効かせる
- 評価順は deny → ask → allow。 最初に一致したものが結果を決め、ルールの具体度は順序を変えない。
Bash(aws *)の deny は、より狭いBash(aws s3 ls)の allow に一致する呼び出しもブロックする - deny はどのスコープからでも勝つ。 user が allow、project が deny なら deny
- 深さの一致がルール種別で変わる。 allow の
Edit(src/**)は<cwd>/src配下のみ。deny / ask のRead(secrets/**)は任意の深さのsecretsに一致する - ラッパーは事前に取り除かれる。
timeout/time/nice/nohupなどは照合前に外れる。一方devbox runやnpxのような環境ランナーは外れないので、Bash(devbox run npm test)のようにランナーと内側のコマンドを両方含めて書く - hook を重ねられる。
PreToolUsehook は permission prompt の前に走るが、hook の判断は permission ルールを迂回しない(deny と ask は hook の戻り値に関わらず評価される)
落とし穴
- パスルールを書ける先は
EditとReadだけ。Write/NotebookEdit/Globにパスルールを書いても参照されず、起動時に警告が出る。どのツールにも触らせたくないパスにはEditの deny を書く - deny ルールは任意のサブプロセスには効かない。 組み込みファイルツールと、Claude Code が認識する Bash のファイルコマンドまで。Python や Node のスクリプトが自分で開くファイルは止まらない。OS レベルで止めるなら sandbox
- project の allow ルールは workspace trust の承認後にしか効かない。 ルールは読まれるが適用されない。
-pの非対話モードではダイアログが出ないため、無視されたままになる - ツールの主要コンテンツフィールドは
Tool(param:value)で指定できない。Bash(command:rm *)のようなルールは無視され、起動時に警告が出る --add-dirとpermissions.additionalDirectoriesは同じではない。 前者からは skill と subagent が読み込まれるが、後者はファイルアクセスだけを与える