Claude Code はフラットなパーミッションモデルを持っていません。ツールを実行する前に — bash コマンドでも、ファイル編集でも、Web フェッチでも — 複数の信頼シグナルを評価して、確認を求めるか、自動で進むか、拒否するかを決定します。
このシステムを理解すると、安全な操作での割り込みが減り、危険な操作でのサプライズも減ります。
4つのパーミッションレイヤー
Claude Code は以下の順序でパーミッションをチェックします。
- オペレーターシステムプロンプト — Claude Code を実行している環境から注入されます。エンタープライズ展開では、ユーザーが操作する前に機能をロックダウンします。
- ユーザーレベル設定 —
~/.claude/settings.json。マシン上のすべてのプロジェクトに適用されます。 - プロジェクトレベル設定 — リポジトリ内の
.claude/settings.json。バージョン管理に追加されチームで共有されます。 - セッションレベルのオーバーライド — セッション中にインタラクティブに付与されます。永続化されません。
操作を明示的に拒否する最初のレイヤーが勝ちます。レイヤーがサイレントであれば、次のレイヤーに評価が落ちます。
ツールカテゴリとパーミッションが必要なもの
Claude Code はツールをカテゴリにグループ化しています。各カテゴリのデフォルトのパーミッション要件は以下の通りです。
| ツールカテゴリ | 例 | デフォルト |
|---|---|---|
| 読み取り専用ファイル操作 | Read, Glob, Grep | 許可 |
| 書き込みファイル操作 | Write, Edit, MultiEdit | 許可(差分表示あり) |
| Bash コマンド | すべてのシェル実行 | 確認 |
| Web ツール | WebSearch, WebFetch | 確認 |
| MCP ツール | サーバーによる | サーバーによる |
「確認」のデフォルトは、Claude Code がコマンドを表示して実行前に確認を待つことを意味します。これは外部システムに触れるものや現在のリポジトリ外に副作用があるものに対する意図的なフリクションです。
settings.json での許可コマンド設定
最も一般的なカスタマイズは、安全な bash コマンドをホワイトリストに登録して Claude Code が繰り返し確認を求めないようにすることです。
プロジェクトレベル (.claude/settings.json):
{
"permissions": {
"allow": [
"Bash(npm run test)",
"Bash(npm run lint)",
"Bash(npm run build)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force *)"
]
}
}
ユーザーレベル (~/.claude/settings.json):
{
"permissions": {
"allow": [
"Bash(ls *)",
"Bash(cat *)",
"Bash(echo *)",
"WebSearch(*)"
]
}
}
allow と deny のグロブパターンはフルコマンド文字列に対してマッチします。Bash(git *) は任意の git サブコマンドをカバーします。同じレベルでは拒否ルールが許可ルールを上書きします。
危険な操作とハードリミット
一部の操作は allow リストに関係なく強化されたスクリーニングが適用されます。
常に確認が必要:
sudoを含むコマンドshやbashにパイプするコマンド(例:curl | bash)- 現在の作業ディレクトリ外への書き込み
- ファイルの削除(明らかに安全でない
rm)
設定に関係なく常に不許可:
- シークレットや認証情報の流出
- オペレーターシステムプロンプトが明示的にブロックした操作
- Claude Code の既知のツールセットにないツール呼び出し
これらの制限は設定レベルではなくモデルレベルに存在します。allow リストに Bash(sudo *) を追加しても、Claude Code は確認なしに sudo コマンドを実行しません — 権限昇格のように見えるものに対してモデルが引き続き確認を求めます。
信頼レベル: Claude Code のコンテキスト読み取り
明示的な設定を超えて、Claude Code は環境から「信頼レベル」を推測します。
高信頼シグナル:
.gitフォルダを持つディレクトリ内(自分のプロジェクト)- このセッションでコマンドを一貫して確認している
- プロジェクトの CLAUDE.md からのパターンに操作が一致する
低信頼シグナル:
- 一時ディレクトリや
/tmp内 - コマンドがリモートシステム(SSH、curl、API)と対話する
- ファイルパスがプロジェクトルート外
これはヒューリスティックであり決定論的ではありません。信頼レベルは Claude Code が確認ダイアログをどのように表示するかに影響します — 高信頼では説明が少ない短いプロンプト、低信頼では長い警告が表示されます。
CLAUDE.md でのパーミッション設定
パーミッションポリシーを CLAUDE.md に自然言語で記述できます。これは設定システムへの命令ではなく Claude への指示ですが、動作に影響します。
## パーミッション
- `npm run test`、`npm run lint`、`npm run build` は確認なしで実行する
- すべての `git push` または `git commit` の前に必ず確認する
- `rm -rf` を実行しない — 削除が必要な場合は代わりに `trash-cli` を使う
- localhost 以外へのネットワークリクエストの前に確認する
これは JSON 設定より柔軟で、Claude Code は一般的にこれらの指示に従いますが、会話でオーバーライドできます。ハードリミットには settings.json を使ってください。
MCP サーバーのパーミッション
MCP サーバーは独自のパーミッション面を宣言します。MCP サーバーを接続すると、Claude Code が公開するツールカテゴリを表示します。プロジェクトレベルで利用可能な MCP ツールを制限できます。
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/safe-dir"]
}
},
"permissions": {
"deny": [
"mcp__filesystem__write_file",
"mcp__filesystem__delete_file"
]
}
}
これにより MCP サーバーに /Users/me/safe-dir への読み取りアクセスを与えながら、Claude Code のパーミッションレイヤーで書き込み操作をブロックします。
チーム向けの実践的なセットアップ
典型的なチームセットアップは3つのレイヤーを使います。
~/.claude/settings.json (開発者マシンのデフォルト):
{
"permissions": {
"allow": [
"Bash(ls *)", "Bash(echo *)", "Bash(cat *)",
"Bash(git status)", "Bash(git diff *)", "Bash(git log *)"
]
}
}
.claude/settings.json (プロジェクト固有、コミット済み):
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(docker compose ps)",
"Bash(docker compose logs *)"
],
"deny": [
"Bash(docker compose down --volumes)",
"Bash(git push --force *)"
]
}
}
CLAUDE.md (ソフトな行動ガイダンス):
## ツール使用ポリシー
- CI 互換のテスト実行には `npm run test -- --watch=false` を優先する
- マイグレーション実行前に `docker compose ps` でコンテナ状態を確認する
- 本番データベースをドロップしない。ステージングは明示的な確認があれば可。
この組み合わせにより: グローバルな安全コマンドは常に許可、プロジェクト固有スクリプトは確認不要、少数の危険な操作はポリシーでハードブロック。CLAUDE.md はグロブパターンでうまく表現できない微妙なケースを処理します。
まとめ
パーミッションシステムには3つのツールがあります。
- JSON 許可/拒否リスト — 決定論的で、バージョン管理されたポリシー
- CLAUDE.md の指示 — パターンに収まらない微妙な行動ガイダンス
- オペレーターシステムプロンプト — エンタープライズレベルのロックダウン環境
大半のチームにとって正しい答えは、ハードルールにはプロジェクトレベルの settings.json(コミット済みで強制力あり)、ソフトルールには CLAUDE.md(アドバイザリー、柔軟)、個人の生産性ショートカットにはユーザーレベル設定(チームポリシーに影響しない)という組み合わせです。