Claude Agent SDKは、アプリケーションでClaudeがツールを使用する方法を管理できる強力な権限制御を提供します。
このガイドでは、canUseToolコールバック、フック、およびsettings.json権限ルールを使用して権限システムを実装する方法について説明します。完全なAPIドキュメントについては、TypeScript SDKリファレンスを参照してください。
Claude Agent SDKは、ツールの使用を制御するための4つの補完的な方法を提供します:
各アプローチの使用例:
canUseTool - カバーされていないケースの動的承認、ユーザーに権限を求める処理順序: PreToolUse Hook → 拒否ルール → 許可ルール → 確認ルール → 権限モードチェック → canUseTool Callback → PostToolUse Hook
権限モードは、Claudeがツールを使用する方法のグローバル制御を提供します。query()を呼び出すときに権限モードを設定したり、ストリーミングセッション中に動的に変更したりできます。
SDKは4つの権限モードをサポートしており、それぞれ異なる動作をします:
| モード | 説明 | ツールの動作 |
|---|---|---|
default | 標準権限動作 | 通常の権限チェックが適用される |
plan | 計画モード - 実行なし | Claudeは読み取り専用ツールのみ使用可能;実行前に計画を提示 (現在SDKではサポートされていません) |
acceptEdits | ファイル編集の自動承認 | ファイル編集とファイルシステム操作が自動的に承認される |
bypassPermissions | すべての権限チェックをバイパス | すべてのツールが権限プロンプトなしで実行される(注意して使用) |
権限モードは2つの方法で設定できます:
クエリを作成するときにモードを設定:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "このコードのリファクタリングを手伝って",
options: {
permissionMode: 'default' // 標準権限モード
}
});ストリーミングセッション中にモードを変更:
acceptEdits)編集承認モードでは:
自動承認される操作:
bypassPermissions)権限バイパスモードでは:
権限モードは権限フローの特定のポイントで評価されます:
bypassPermissionsモード - アクティブな場合、残りのすべてのツールを許可canUseToolコールバックに委譲canUseToolコールバック - 残りのケースを処理これは以下を意味します:
bypassPermissionsモードでもツール使用を常に制御できるbypassPermissionsモードはマッチしないツールに対してcanUseToolコールバックを上書きするモード進行の例:
// 制御された実行のためにdefaultモードで開始
permissionMode: 'default'
// 迅速な反復のためにacceptEditsに切り替え
await q.setPermissionMode('acceptEdits')canUseToolコールバックはquery関数を呼び出すときにオプションとして渡されます。ツール名と入力パラメータを受け取り、許可または拒否の決定を返す必要があります。
canUseToolは、Claude Codeがユーザーに権限プロンプトを表示する場合に発動します。例えば、フックと権限ルールがそれをカバーしておらず、acceptEditsモードでない場合です。
インタラクティブなツール承認の実装方法を示す完全な例は以下の通りです:
import { query } from "@anthropic-ai/claude-agent-sdk";
// ストリーミング入力用の非同期ジェネレーターを作成
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "デフォルト権限で始めましょう"
}
};
// 会話の後で...
yield {
type: 'user',
message: {
role: 'user',
content: "今度は開発を速めましょう"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // デフォルトモードで開始
}
});
// モードを動的に変更
await q.setPermissionMode('acceptEdits');
// メッセージを処理
for await (const message of q) {
console.log(message);
}import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 ツールリクエスト:");
console.log(` ツール: ${toolName}`);
// ツールパラメータを表示
if (input && Object.keys(input).length > 0) {
console.log(" パラメータ:");
for (const [key, value] of Object.entries(input)) {
let displayValue = value;
if (typeof value === 'string' && value.length > 100) {
displayValue = value.substring(0, 100) + "...";
} else if (typeof value === 'object') {
displayValue = JSON.stringify(value, null, 2);
}
console.log(` ${key}: ${displayValue}`);
}
}
// ユーザー承認を取得(UIロジックに置き換えてください)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ 承認\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ 拒否\n");
return {
behavior: "deny",
message: "ユーザーがこのツールの権限を拒否しました"
};
}
}
// 権限コールバックを使用
const result = await query({
prompt: "このコードベースの分析を手伝って",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});