ツールシステムと権限
Claude Code がモデルの要求をツール操作に変換し、権限モードとルールがその操作を制御する仕組みを学ぶ。
学ぶこと
ツールにより、Claude Code はテキストを生成するだけでなく環境に対して操作できます。このセッションでは次を学びます。
- Claude が組み込みツールを選択して呼び出す仕組み
- 権限チェックが行われる場所
- 各権限モードが実際に変えるもの
allow、ask、denyルールによる細かな制御
意図から操作まで
ツールには名前、説明、入力スキーマがあります。Claude がツールと構造化された入力を選択し、Claude Code が呼び出しを検証して権限ポリシーを適用してから実行します。
ユーザーの要求
↓
Claude がツール呼び出しを提案
↓
Claude Code がモード + 権限ルールを確認
├─ allow → 実行
├─ ask → 承認を待つ
└─ deny → ブロックし、結果を Claude に返す
Read、Edit、Bash、WebFetch、TaskCreate などの組み込みツール名は、権限ルール、サブエージェントのツール一覧、hook matcher でも使われる正確な名前です。大規模なツールカタログは遅延され、ToolSearch で必要に応じて読み込まれるため、すべての完全なスキーマが最初からコンテキストにあるとは限りません。
権限の基準
Manual モードの設定値は default です。通常、作業ディレクトリ内の読み取りは確認なしで実行され、ファイル編集と読み取り専用ではない shell コマンドは確認されます。他のモードはこの基準を変更します。
| モード | 通常の承認なしで実行されるもの | 用途 |
|---|---|---|
default(manual エイリアス) | 読み取り | 初めての作業、機密性の高い作業 |
acceptEdits | 読み取り、ファイル編集、一般的なファイル操作 | レビューしながら行うローカル作業 |
plan | 読み取りと読み取り専用の調査 | 編集前の分析と設計 |
auto | バックグラウンド安全チェックを通過した操作 | 方向性を信頼できる長時間作業 |
dontAsk | 事前承認済み操作と組み込み読み取り専用操作のみ | allowlist を使う非対話型自動化 |
bypassPermissions | ほぼすべて | 分離されたコンテナまたは VM のみ |
auto と bypassPermissions は同義ではありません。Auto モードは別の安全分類器で操作を評価し、明示的なルールも適用します。bypass モードは通常の権限チェックを飛ばすため、保護は大幅に弱くなります。
--permission-mode で起動モードを指定できます。
claude --permission-mode plan
claude --permission-mode auto
claude --permission-mode dontAsk
claude --permission-mode bypassPermissions
次の従来のフラグは bypassPermissions と同等であり、Auto モードではありません。
claude --dangerously-skip-permissions
きめ細かなルール
モードが基準を設定し、ルールが個々の呼び出しを許可、確認、拒否のいずれにするか決めます。構文は Tool または Tool(specifier) です。
{
"permissions": {
"allow": [
"Bash(npm test *)",
"Read(/docs/**)"
],
"ask": [
"Bash(git push *)"
],
"deny": [
"Read(./.env)",
"WebFetch(domain:paste.example)"
]
}
}
ルールは deny → ask → allow の順で評価されます。広い deny を狭い allow で上書きすることはできません。/permissions では、有効なルールと各ルールの設定ファイルを確認できます。
実用的なメンタルモデル
システムを二つの質問に分けて考えます。
- Claude はこのツールを認識し、要求できるか。 ツールの可用性、遅延読み込み、MCP 設定が決めます。
- この呼び出しを今実行してよいか。 現在のモード、権限ルール、保護パス、hooks、組織ポリシーが決めます。
ツールを隠すことと、特定の使い方を拒否することは別の制御です。"Bash" のようなツール名だけの deny はツールを Claude のコンテキストから除外します。"Bash(rm *)" のような範囲付き deny は Bash を残したまま一致する呼び出しだけをブロックします。
試してみる
.claude/settings.local.json に狭いルールを作成し、Manual モードで起動して、テスト実行とブランチの push を依頼してください。テストは確認なし、push は確認ありになることを確かめます。
{
"permissions": {
"allow": ["Bash(npm test *)"],
"ask": ["Bash(git push *)"]
}
}
Bash 全体を許可するより、狭いコマンドパターンを優先してください。権限パターンはポリシー境界であり、危険なコマンドのレビューに代わるものではありません。
次のセッション
セッション 3 では、構造化された TaskCreate、TaskGet、TaskList、TaskUpdate を使い、承認済みの計画を可視化された追跡可能な作業に変えます。
公式ソース
最終確認:2026-07-20。