Claude Code の権限ルールで、書けるのに無視されるもの
権限ルールで困るのは、間違っていても JSON としては正しいことです。
permissions.allow に書いた1行が効いていないとき、
壊れているのか、そういう仕様なのかが設定ファイルからは分かりません。
公式ドキュメントが「無視される」「スキップされる」「起動時に警告する」と 明記しているものを、1か所に集めました。推測は入れていません。
一覧
| 書き方 | 何が起きるか |
|---|---|
"*" / "B*" / "mcp__*" を allow に |
スキップされ、何も自動承認しない。 警告が出る |
Write(...) / NotebookEdit(...) / Glob(...) / MultiEdit(...) のパス指定 |
受け付けられるが参照されない。 起動時に警告 |
Bash(command:...) のように本体の入力をパラメータ指定 |
無視される。 起動時に警告 |
括弧つきの mcp__ ルール(mcp__memory(read)) |
読み込み時にスキップ。 起動時のダイアログと claude doctor に出る |
allow で * のうしろにまだ字が続く(Bash(git * main)) |
効くが、見た目より広く許可する。 起動時に警告 |
どれもエラーにはなりません。 設定は読み込まれ、その1行だけが死にます。
それぞれの中身
アンカーの無い allow グロブ
deny と ask はツール名の位置にグロブを書けますが、allow は書けません。
allow でグロブが使えるのは mcp__<サーバ名>__ まで書いたあとだけです。
// 効く
"mcp__puppeteer__*"
"mcp__github__get_*"
// スキップされる(何も自動承認しない)
"*"
"B*"
"mcp__*"
サーバ名の部分にグロブは置けません。どのサーバかを名指ししている必要があります。
パス指定が参照されないツール
ファイルパスのルールが効くのは Read(...) と Edit(...) だけです。
Write / NotebookEdit / Glob / 旧 MultiEdit に書いても、
受け付けられたうえで一度も参照されません。
本体の入力へのパラメータ指定
Tool(param:value) の形は、deny と ask で上位のパラメータに対して使えます。
ただしそのツールの本体にあたる入力は指定できません。
| ツール | 本体の入力 |
|---|---|
Bash / PowerShell |
command |
Read / Edit / Write |
file_path |
Grep / Glob |
path |
NotebookEdit |
notebook_path |
WebFetch |
url |
Bash(command:rm *) は複合コマンドで抜けられてしまうので、意図的に無視されます。
// 無視される
"Bash(command:rm *)"
"Read(file_path:./.env)"
// こう書く
"Bash(rm *)"
"Read(./.env)"
"WebFetch(domain:example.com)"
括弧つきの mcp__ ルール
設定ファイルを読み込むとき、括弧のある mcp__ ルールは飛ばされます。
MCP ツールのパラメータで絞りたい場合は、設定ファイルではなく
CLI の --disallowedTools を使います。
飛ばされたルールは、対話セッションの起動時ダイアログと claude doctor に出ます。
* のうしろにまだ字が続く allow
* はその位置の文字列すべてに当たります。
だから * を前に置くほど、ルールは広くなります。
| 書き方 | 実際に許可されるもの |
|---|---|
Bash(git log *) |
git log から始まるコマンド |
Bash(git * main) |
git push origin main も含む、あらゆる git サブコマンド |
Bash(* --version) |
あらゆるプログラム |
Bash(git * main) は git の全サブコマンドを許可します。
-c も含むので、git に別のプログラムを起動させることもできます。
ついでに: :* は末尾でだけ効く
Bash(ls:*) は Bash(ls *) と同じです。ただし末尾に置いたときだけ。
Bash(git:* push) の : はただの文字として扱われ、git のコマンドには当たりません。
空白の有無が意味を変えます
末尾の * の前の空白は、ルールの一部です。
| 書き方 | 当たる | 当たらない |
|---|---|---|
Bash(ls *) |
ls -la, ls |
lsof |
Bash(ls*) |
ls -la, lsof |
末尾の * がそのルール唯一のワイルドカードのときだけ、
Bash(ls *) は引数なしの ls にも当たります。
検査する
上の5つは機械で見つけられます。
npx @quintetkit/ccheck
warn .claude/settings.json:14
`Bash(command:rm *)` is ignored. `command` is Bash's own content field and
cannot be matched as a parameter. Write `Bash(rm *)` instead.
why: https://code.claude.com/docs/en/permissions
指摘には必ず出典が付きます。 根拠を示せないものはルールにしていません。
deny / ask のツール名が実在するかはあえて検査していません。
公式は「知らないツール名なら起動時に警告する」としていますが、
その判定には最新のツール一覧が要ります。
こちらが持てるのはスナップショットだけなので、
新しいツールが増えるたびに誤検出します。
出典
https://code.claude.com/docs/en/permissions
2026-09-04 に取得したスナップショットを元にしています。