canUseTool コールバックを使用して、実行時にそれ以外のすべてを処理します。
権限がどのように評価されるか
Claude がツールをリクエストすると、SDK は以下の順序で権限をチェックします。1
Hooks
最初に hooks を実行します。Hook は呼び出しを完全に拒否するか、それを通すことができます。
allow を返す Hook は、以下の deny および ask ルールをスキップしません。これらは Hook の結果に関係なく評価されます。allow を返す PreToolUse Hook は、重要なパス をターゲットとする rm または rmdir の削除を承認することもできません。plan モードでその allow がどのように動作するかについては、plan モードでの Hook の承認 を参照してください。2
Deny ルール
deny ルール(disallowed_tools および settings.json から)をチェックします。Deny ルールがマッチした場合、bypassPermissions モードでもツールはブロックされます。Bash のような裸名の deny ルールは、この評価が始まる前に Claude のコンテキストからツールを削除するため、Bash(rm *) のようなスコープ付きルールのみがこのステップでチェックされます。3
Ask ルール
settings.json から
ask ルールをチェックします。Ask ルールがマッチした場合、呼び出しは確認のために canUseTool コールバック にフォールスルーします。bypassPermissions モードでも同様です。ユーザーインタラクションが必要なツールは同じように動作します。AskUserQuestion および _meta["anthropic/requiresUserInteraction"] を設定する MCP ツールサーバーは、allow ルールがマッチした場合でも常にコールバックにフォールスルーします。dontAsk モードでは、このモードは決してプロンプトを表示しないため、両方のケースが拒否されます。MCP アノテーションには Claude Code v2.1.199 以降が必要です。組織が ask に設定した claude.ai コネクタ ツールもこのステップでフローを離れます。bypassPermissions モードでも allow ルールがマッチした場合でも、すべての呼び出しはコールバックにフォールスルーします。コールバックは理由 Your organization requires approval for this tool を受け取ります。dontAsk モードでは、このモードは決してプロンプトを表示しないため、呼び出しは拒否されます。4
Permission モード
アクティブな permission モード を適用します。
bypassPermissionsモードでは、Claude Code はこのステップに到達したすべてのものを承認します。ただし、重要なパス をターゲットとするrmおよびrmdirの削除は除きます。これらはフォールスルーします。acceptEditsモードでは、Claude Code は Accept edits モード の下にリストされたファイル操作を承認します。planモードでは、Claude Code は allow ルールに関係なく、ファイル編集およびシェル書き込みツールをcanUseToolコールバックに送信します。これにより、計画中に書き込み操作を自動承認することはできません。- その他のモードでは、リクエストはフォールスルーします。
5
Allow ルール
allow ルール(allowed_tools および settings.json から)をチェックします。ルールがマッチした場合、ツールは承認されます。ツール自体が承認する呼び出しもこのステップで解決されます。ルールは不要です。例えば、作業ディレクトリ内のファイル読み取りまたは 読み取り専用 Bash コマンド。rm および rmdir の削除で 重要なパス をターゲットとするものは、allow ルールによって決して承認されません。その後、コールバックに到達するかどうかは permission モードに依存します。例えば、auto モードの Agent SDK セッションでは、Claude Code はデフォルトでそれを呼び出さずに拒否します。重要なパス モード表は、各モードがそれらで何をするかをリストしています。allow ルールは、ネットワークパス からの読み取りを承認しません。6
canUseTool コールバック
上記のいずれでも解決されない場合、決定のために
canUseTool コールバック を呼び出します。dontAsk モードでは、このステップはスキップされ、ツールは拒否されます。TypeScript SDK では、permissionPrompts: 'none' を設定した場合、このステップではコールバックは呼び出されません。PermissionRequest hook はまだ決定する機会があり、そうしない場合、Claude Code は呼び出しを拒否します。このオプションには Claude Code v2.1.259 以降が必要です。canUseTool コールバックを渡す場合、SDK はクエリが構築されるときに Node.js プロセス警告を 1 回発行します。警告のコードは CLAUDE_SDK_CAN_USE_TOOL_SHADOWED です。2 つの設定がそれをトリガーします。
permissionMode: 'bypassPermissions'。これは permission モードステップに到達するすべての呼び出しを自動承認します。ただし、どのモードも自動承認しないアクション は除きます。"Read"などの各裸のallowedToolsエントリ。これはコールバックが相談される前にそのツール全体を自動承認します。ただし、どのモードも自動承認しないアクション および ネットワークパスからの読み取り は除きます。
Bash(ls *) などの指定子を持つエントリおよび acceptEdits モードはそれをトリガーしません。また、設定ファイルから来る allow ルールはチェックに表示されません。
process.on('warning', ...) でリッスンし、コードをマッチさせてログまたは抑制します。モードとルールに関係なくすべてのツール呼び出しをゲートするには、代わりに PreToolUse hook を使用します。
このページは allow および deny ルール および permission モード に焦点を当てています。その他のステップについては、以下を参照してください。
- Hooks: ツールリクエストを許可、拒否、または変更するカスタムコードを実行します。実行を Hook で制御する を参照してください。
- canUseTool コールバック: 前のステップで呼び出しが解決されない場合、実行時にユーザーの承認をプロンプトします。承認とユーザー入力を処理する を参照してください。
許可ルールと拒否ルール
allowed_tools と disallowed_tools(TypeScript:allowedTools / disallowedTools)は、上記の評価フロー内の許可ルールと拒否ルールリストにエントリを追加します。allowed_tools にタスク追跡ツールの 1 つを名前で指定すると、Claude Code もセッションをオプトインします。allowed_tools にリストされていない他のツールは、Claude でも利用可能であり、承認が必要なそのツールへの呼び出しは権限モードにフォールスルーします。拒否ルールは、ツール名を指定するか、ツール内のパターンをスコープするかによって動作が異なります。
許可ルールは、リテラル
mcp__<server>__ プレフィックスの後にのみツール名グロブを受け入れます。サーバーセグメントはグロブフリーである必要があり、設定したサーバーを指定します:mcp__puppeteer__* は puppeteer サーバーからのすべてのツールにマッチし、mcp__github__get_* はその get_ ツールにマッチします。allowed_tools=["*"] や allowed_tools=["mcp__*"] のようなアンカーなしエントリは、スタートアップ警告で無視され、何も自動承認しません。
Read と Edit のスコープ付きルールはパスパターンを取ります。Edit(path) ルールは、Write と NotebookEdit を含む、ファイルを書き込むすべての組み込みツールを管理します。Write(path) ルールはファイル権限チェックによってマッチすることはありません。
絶対ファイルシステムパスには //path を使用します:Edit(//secrets/**) の拒否ルールは、ディスク上の /secrets の下のどこでも書き込みをブロックします。単一の先頭スラッシュの場合、Edit(/secrets/**) はルールのソースでアンカーします。allowed_tools または disallowed_tools を通じて渡されるルールの場合、それはセッションの作業ディレクトリを意味するため、ルールはディスク上の /secrets をブロックしません。Read と Edit ルールで 4 つのアンカー形式と、設定ファイルからのルール解決方法を参照してください。
ロックダウンされたエージェントの場合、allowedTools を permissionMode: "dontAsk" と組み合わせます:
default モードで承認が不要な呼び出しは、リストするかどうかに関わらず実行されます。例えば、読み取り専用 Bash コマンド、Agent のような実行前に尋ねないツール、および作業ディレクトリ内のファイル読み取りなどです。ツールをリクエストから完全に削除するには、その裸の名前を disallowedTools に追加します。
.claude/settings.json で許可、拒否、および質問ルールを宣言的に設定することもできます。これらのルールは、project 設定ソースが有効な場合に読み込まれます。デフォルト query() オプションではこれが有効です。setting_sources(TypeScript:settingSources)を明示的に設定する場合は、それらを適用するために "project" を含めます。権限設定でルール構文を参照してください。
権限モード
権限モードは、Claude がツールをどのように使用するかについてグローバルコントロールを提供します。query() を呼び出すときに権限モードを設定するか、ストリーミングセッション中に動的に変更できます。
設定しない場合、Claude Code は セッションが開始するモード のルールに従って開始権限モードを選択します。
自動モードで開始するセッションは、自動モードがアクションを評価する方法 で説明されているように、Bash エントリなどの広い許可ルールを削除します。アプリケーションが default モードまたはそのようなルールに依存している場合は、default を明示的に渡してください。
TypeScript Agent SDK v0.3.286 より前では、permissionMode を省略することは default を渡すことと同じでした。
利用可能なモード
SDK は以下の権限モードをサポートしています。権限モードを設定する
クエリを開始するときに権限モードを一度設定するか、セッションがアクティブな間に動的に変更できます。- クエリ時
- ストリーミング中
クエリを作成するときに
permission_mode(Python)または permissionMode(TypeScript)を渡します。モードの詳細
編集受け入れモード(acceptEdits)
ファイル操作を自動承認して、Claude がプロンプトなしでコードを編集できるようにします。その他のツール(ファイルシステム操作ではない Bash コマンドなど)は通常の権限が必要です。
自動承認される操作:
- ファイル編集(Edit、Write ツール)
- ファイルシステムコマンド:
mkdir、touch、rm、rmdir、mv、cp、sed
additionalDirectories 内のパスにのみ適用されます。acceptEdits モードでは、Claude が以下の場合、Claude Code は要求を自動承認しません。
- そのスコープ外のパスで作業する
- 保護されたパスに書き込む
rmまたはrmdirで 重要なパス を削除する
質問しないモード(dontAsk)
canUseTool を呼び出さずに、権限プロンプトを拒否に変換します。allowed_tools、settings.json 許可ルール、またはフックで事前承認されたツール、および default モードで承認が不要なコール(作業ディレクトリ内のファイル読み取りや Agent への呼び出しなど)は通常どおり実行されます。コネクタツール(組織が ask に設定)、ユーザーインタラクションが必要なツール、ネットワークパスからの読み取り、および 重要なパス をターゲットとする rm および rmdir の削除は、許可ルールが一致する場合でも拒否されます。PreToolUse フックによる許可も、重要なパスの削除やネットワークパスからの読み取りをクリアしません。
使用時期: ヘッドレスエージェント用に固定された明示的なツールサーフェスを望み、canUseTool が存在しないことへの暗黙的な依存よりもハード拒否を優先する場合。
権限バイパスモード(bypassPermissions)
以下に示す場合を除き、プロンプトなしでツール使用を自動承認します。フックは引き続き実行され、必要に応じて操作をブロックできます。Linux および macOS では、Claude Code はこのモードで root として、または 認識されたサンドボックス 外の sudo の下で起動することを拒否し、クエリは最初のターンの前に失敗します。
計画モード(plan)
Claude はソースファイルを編集せずにコードベースを探索し、計画を作成します。読み取り専用ツールは default 権限モードと同じように実行されます。
plan モードでは、許可ルールが一致する場合や PreToolUse フックが allow を返す場合でも、ファイル編集は自動承認されません。代わりに canUseTool コールバックを通じてプロンプトが表示されます。Claude Code v2.1.212 以降では、touch や rm などのファイルを変更するシェルコマンドは同じ方法で canUseTool コールバックに到達します。
TypeScript SDK で allowDangerouslySkipPermissions: true を permissionMode: 'plan' と一緒に設定した場合、ファイル編集とファイルを変更するシェルコマンドは引き続き canUseTool コールバックに到達します。このオプションにより、後で setPermissionMode() で bypassPermissions に切り替えることができます。
Claude は計画を最終化する前に、AskUserQuestion を使用して要件を明確にする場合があります。これらのプロンプトの処理については、承認とユーザー入力の処理 を参照してください。
使用時期: Claude に変更を実行せずに提案させたい場合。コードレビュー中や、変更が行われる前に承認する必要がある場合など。
auto モード(auto)
分類器モデルが、シェルコマンドやネットワークリクエストなどのアクションを実行前にレビューし、レビューする各アクションを許可またはブロックします。auto モードに必要なモデルとプロバイダー、およびアクションを評価する順序については、auto モードで権限プロンプトをなくす を参照してください。
auto モードのセッションを、set_model()、setModel()、または applyFlagSettings() を使用して auto モードがサポートしていないモデルに切り替えると、セッションは default モードに変わります。
- 表示される内容:subtype が
statusで、permissionModeが"default"に設定されたsystemメッセージです。TypeScript SDK ではこれをSDKStatusMessageとして型付けしています。それ以降、承認が必要で許可ルールに一致しないコールはcanUseToolコールバックに到達します。 - auto モードに戻すには:サポートされているモデルに切り替えてから、
set_permission_mode("auto")またはsetPermissionMode("auto")を呼び出します。この呼び出しを行わずにモデルを元に戻した場合、セッションはdefaultモードのままです。サポートされていないモデルがアクティブな間は、この呼び出しはCannot set permission mode to auto: auto mode unavailable for this modelで失敗します。
set_model()、setModel()、または applyFlagSettings() の呼び出し後の default モードへの変更には、Claude Code v2.1.299 以降が必要です。
関連リソース
権限評価フローの他のステップについては、以下をご覧ください。- 承認とユーザー入力の処理:インタラクティブな承認プロンプトと確認質問
- Hooks ガイド:エージェントライフサイクルの重要なポイントでカスタムコードを実行
- 権限ルール:
settings.jsonの宣言的な許可/拒否ルール