パーミッションの設定
パーミッションモード、フック、宣言的な許可/拒否ルールを使用して、エージェントがツールをどのように使用するかを制御します。
Claude Agent SDK は、Claude がツールをどのように使用するかを管理するためのパーミッション制御を提供します。パーミッションモードとルールを使用して、自動的に許可されるものを定義し、canUseTool コールバックを使用して、実行時にそれ以外のすべてを処理します。
このページはパーミッションモードとルールについて説明しています。ユーザーが実行時にツールリクエストを承認または拒否する対話的な承認フローを構築するには、承認とユーザー入力の処理を参照してください。
パーミッションの評価方法
Claude がツールをリクエストすると、SDK は次の順序でパーミッションをチェックします。
フック
最初にフックを実行します。フックはコールを直接拒否するか、それを渡すことができます。allow を返すフックは、以下の拒否および質問ルールをスキップしません。これらはフックの結果に関係なく評価されます。
拒否ルール
deny ルール(disallowed_tools およびsettings.jsonから)をチェックします。拒否ルールが一致する場合、bypassPermissions モードでもツールはブロックされます。Bash のような裸名の拒否ルールはこの評価が開始される前に Claude のコンテキストからツールを削除するため、このステップでチェックされるのは Bash(rm *) のようなスコープ付きルールのみです。
質問ルール
settings.jsonから ask ルールをチェックします。質問ルールが一致する場合、bypassPermissions モードでも、コールは確認のためにcanUseTool コールバックにフォールスルーします。dontAsk モードでは、一致する質問ルールは代わりに拒否されます。このモードはプロンプトを表示しないためです。
パーミッションモード
アクティブなパーミッションモードを適用します。bypassPermissions はこのステップに到達したすべてを承認します。acceptEdits はファイル操作を承認します。plan はファイル編集およびシェル書き込みツールを許可ルールに関係なく canUseTool コールバックにルーティングするため、計画中は書き込み操作を自動承認することはできません。その他のモードはフォールスルーします。
許可ルール
allow ルール(allowed_tools および settings.json から)をチェックします。ルールが一致する場合、ツールは承認されます。
canUseTool コールバック
上記のいずれでも解決されない場合、決定のためにcanUseTool コールバックを呼び出します。dontAsk モードでは、このステップはスキップされ、ツールは拒否されます。
このページは許可および拒否ルールとパーミッションモードに焦点を当てています。その他のステップについては、以下を参照してください。
- フック: カスタムコードを実行して、ツールリクエストを許可、拒否、または変更します。フックで実行を制御を参照してください。
- canUseTool コールバック: 実行時にユーザーに承認を促します。承認とユーザー入力の処理を参照してください。
許可および拒否ルール
allowed_tools および disallowed_tools(TypeScript:allowedTools / disallowedTools)は、上記の評価フロー内の許可および拒否ルールリストにエントリを追加します。許可ルールは承認のみに影響します。allowed_tools にリストされていないツールは引き続き Claude に利用可能であり、パーミッションモードにフォールスルーします。拒否ルールは、ツール全体に名前を付けるか、ツール内のパターンをスコープするかによって異なる動作をします。
| オプション | 効果 |
|---|---|
allowed_tools=["Read", "Grep"] |
Read および Grep は自動承認されます。ここにリストされていないツールは引き続き存在し、パーミッションモードおよび canUseTool にフォールスルーします。 |
disallowed_tools=["Bash"] |
Bash ツール定義はリクエストから削除されます。Claude はツールを認識せず、それを試みることはできません。 |
disallowed_tools=["Bash(rm *)"] |
Bash は利用可能なままです。rm * に一致する呼び出しは、bypassPermissions を含むすべてのパーミッションモードで拒否されます。その他の Bash 呼び出しはパーミッションモードにフォールスルーします。 |
disallowed_tools=["*"] |
すべてのツール定義はリクエストから削除されます。拒否ルールではツール名グロブがサポートされています。"*" はすべてのツールに一致し、"mcp__*" はすべてのサーバー全体のすべての MCP ツールに一致します。 |
許可ルールは、リテラル mcp__<server>__ プレフィックスの後にのみツール名グロブを受け入れます。サーバーセグメントはグロブフリーである必要があり、設定したサーバーに名前を付けます。mcp__puppeteer__* は puppeteer サーバーからのすべてのツールに一致し、mcp__github__get_* はその get_ ツールに一致します。allowed_tools=["*"] または allowed_tools=["mcp__*"] のようなアンカーされていないエントリは、スタートアップ警告で無視され、何も自動承認しません。
自動承認されたツールは canUseTool に到達しません。 任意の前のステップで承認されたツール呼び出し(acceptEdits または bypassPermissions による、または許可ルールによる)は、canUseTool コールバックをスキップするため、そこに配置した権限チェックはそのツールに対して静かにバイパスされます。カバレッジはエントリの形式に依存します。Read または mcp__github__get_issue のような単純な名前は、そのツールへのすべての呼び出しを自動承認しますが、Bash(ls *) のようなスコープ付きルールは一致する呼び出しのみを自動承認し、その他の Bash 呼び出しはコールバックにフォールスルーします。すべてのツール呼び出しで実行する必要があるチェックについては、PreToolUse フックを使用してください。フックはすべての他のステップの前に実行され、フック拒否は bypassPermissions モードでも適用されます。
ロックダウンされたエージェントの場合、allowedTools を permissionMode: "dontAsk" と組み合わせます。リストされたツールは承認されます。その他のものはプロンプトの代わりに直接拒否されます。
const options = {
allowedTools: ["Read", "Glob", "Grep"],
permissionMode: "dontAsk"
};
allowed_tools は bypassPermissions を制限しません。 allowed_tools はリストしたツールのみを事前承認します。リストされていないツールは許可ルールと一致せず、パーミッションモードにフォールスルーします。ここで bypassPermissions はそれらを承認します。allowed_tools=["Read"] を permission_mode="bypassPermissions" と一緒に設定すると、Bash、Write、Edit を含むすべてのツールが承認されます。bypassPermissions が必要だが特定のツールをブロックしたい場合は、disallowed_tools を使用してください。
.claude/settings.json で許可、拒否、および質問ルールを宣言的に設定することもできます。これらのルールは、project 設定ソースが有効な場合に読み込まれます。デフォルトの query() オプションではこれが有効です。setting_sources(TypeScript:settingSources)を明示的に設定する場合は、それらを適用するために "project" を含めてください。ルール構文については、パーミッション設定を参照してください。
パーミッションモード
パーミッションモードは、Claude がツールをどのように使用するかについてのグローバル制御を提供します。query() を呼び出すときにパーミッションモードを設定するか、ストリーミングセッション中に動的に変更できます。
利用可能なモード
SDK は以下のパーミッションモードをサポートしています。
| モード | 説明 | ツール動作 |
|---|---|---|
default |
標準パーミッション動作 | 自動承認なし。一致しないツールは canUseTool コールバックをトリガーします |
dontAsk |
プロンプトの代わりに拒否 | allowed_tools またはルールで事前承認されていないものはすべて拒否されます。canUseTool は呼び出されません |
acceptEdits |
ファイル編集を自動受け入れ | ファイル編集およびファイルシステム操作(mkdir、rm、mv など)は自動的に承認されます |
bypassPermissions |
パーミッションチェックをバイパス | ツールは明示的な ask ルールが一致しない限り、パーミッションプロンプトなしで実行されます(注意して使用してください) |
plan |
計画モード | Claude はソースファイルを編集せずにコードベースを探索および計画します。ファイル編集は自動承認されず、canUseTool コールバックを通じてプロンプトが表示されます |
auto(TypeScript のみ) |
モデル分類承認 | モデル分類器が各ツール呼び出しを承認または拒否します。利用可能性については自動モードを参照してください |
サブエージェント継承: 親が bypassPermissions、acceptEdits、または auto を使用する場合、すべてのサブエージェントはそのモードを継承し、サブエージェントごとにオーバーライドすることはできません。サブエージェントはシステムプロンプトが異なり、メインエージェントよりも制約が少ない動作をする可能性があるため、bypassPermissions を継承すると、完全な自律的なシステムアクセスが付与されます。明示的な ask ルールは引き続きプロンプトを強制します。
パーミッションモードの設定
クエリを開始するときにパーミッションモードを一度設定するか、セッションがアクティブな間に動的に変更できます。
クエリを作成するときに permission_mode(Python)または permissionMode(TypeScript)を渡します。このモードは、動的に変更されない限り、セッション全体に適用されます。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Help me refactor this code",
options=ClaudeAgentOptions(
permission_mode="default", # ここでモードを設定
),
):
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
for await (const message of query({
prompt: "Help me refactor this code",
options: {
permissionMode: "default" // ここでモードを設定
}
})) {
if ("result" in message) {
console.log(message.result);
}
}
}
main();
set_permission_mode()(Python)または setPermissionMode()(TypeScript)を呼び出して、セッション中盤でモードを変更します。新しいモードは、その後のすべてのツールリクエストに対して直ちに有効になります。これにより、制限的に開始し、信頼が構築されるにつれてパーミッションを緩和できます。たとえば、Claude の初期アプローチをレビューした後に acceptEdits に切り替えます。
import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
async def main():
async with ClaudeSDKClient(
options=ClaudeAgentOptions(
permission_mode="default", # デフォルトモードで開始
)
) as client:
await client.query("Help me refactor this code")
# セッション中盤でモードを動的に変更
await client.set_permission_mode("acceptEdits")
# 新しいパーミッションモードでメッセージを処理
async for message in client.receive_response():
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
const q = query({
prompt: "Help me refactor this code",
options: {
permissionMode: "default" // デフォルトモードで開始
}
});
// セッション中盤でモードを動的に変更
await q.setPermissionMode("acceptEdits");
// 新しいパーミッションモードでメッセージを処理
for await (const message of q) {
if ("result" in message) {
console.log(message.result);
}
}
}
main();
モードの詳細
ファイル編集モード(`acceptEdits`)
ファイル操作を自動承認し、Claude がプロンプトなしでコードを編集できるようにします。その他のツール(ファイルシステム操作ではない Bash コマンドなど)は引き続き通常のパーミッションが必要です。
自動承認される操作:
- ファイル編集(Edit、Write ツール)
- ファイルシステムコマンド:
mkdir、touch、rm、rmdir、mv、cp、sed
どちらも、作業ディレクトリまたは additionalDirectories 内のパスにのみ適用されます。そのスコープ外のパスおよび保護されたパスへの書き込みはプロンプトが表示されます。
使用時期: Claude の編集を信頼し、プロトタイピング中など、より高速な反復を望む場合、または分離されたディレクトリで作業する場合。
質問しないモード(`dontAsk`)
パーミッションプロンプトを拒否に変換します。allowed_tools、settings.json 許可ルール、またはフックで事前承認されたツールは通常どおり実行されます。その他のすべては canUseTool を呼び出さずに拒否されます。
使用時期: ヘッドレスエージェント用に固定された明示的なツール表面が必要で、canUseTool が存在しないことへの暗黙的な依存よりもハード拒否を優先する場合。
パーミッションバイパスモード(`bypassPermissions`)
プロンプトなしですべてのツール使用を自動承認します。フックは引き続き実行され、必要に応じて操作をブロックできます。
極度の注意を持って使用してください。Claude はこのモードでフルシステムアクセスを持ちます。すべての可能な操作を信頼できる制御された環境でのみ使用してください。
allowed_tools はこのモードを制限しません。リストしたツールだけでなく、すべてのツールが承認されます。拒否ルール(disallowed_tools)、明示的な ask ルール、およびフックはモードチェック前に評価され、ツールをブロックできます。
計画モード(`plan`)
Claude はコードベースを探索および計画を作成し、ソースファイルを編集しません。読み取り専用ツールはデフォルトモードと同じように実行されます。ファイル編集は計画モードで自動承認されることはなく、許可ルールが一致する場合でも、代わりに canUseTool コールバックを通じてプロンプトが表示されます。Claude は計画を最終化する前に要件を明確にするために AskUserQuestion を使用する場合があります。これらのプロンプトの処理については、承認とユーザー入力の処理を参照してください。
使用時期: Claude に変更を提案させたいが実行させたくない場合、たとえばコードレビュー中または変更を実行する前に承認が必要な場合。
関連リソース
パーミッション評価フロー内の他のステップについては、以下を参照してください。
- 承認とユーザー入力の処理:対話的な承認プロンプトと明確化の質問
- フックガイド:エージェントライフサイクルの主要なポイントでカスタムコードを実行
- パーミッションルール:
settings.jsonの宣言的な許可/拒否ルール