# Claude Agent SDKの便利だけど知られていない機能
🌍 エージェントがファイルを勝手に削除しようとしたら?実行時承認で安全にコントロールできます!
`canUseTool` コールバックを使えば、ツール実行前にリアルタイムで承認・拒否・入力変更が可能です。
📌 タイトル:canUseTool コールバックによる実行時承認
🔗 URL:
🧩 概要
`canUseTool` はクエリオプションに渡すコールバック関数で、権限評価フローの最終ステップ(6番目)で呼び出されます。先行するステップ(allow ルールや `acceptEdits`・`bypassPermissions` モードなど)で自動承認されたツール呼び出しではコールバックは呼ばれないため、すべてのツール呼び出しに適用したいチェックは `PreToolUse` フックを使ってください。コールバックはツール名と入力パラメータを受け取り、`allow`(許可)または `deny`(拒否)を返します。許可時には入力を変更することも可能で、例えばパスをサンドボックス内に書き換えたり、危険なコマンドをブロックしたりできます。`dontAsk` モードでは呼び出されません。
🛠 使い方
```python
# Python - ツール実行の承認コールバック
from claude_agent_sdk import ClaudeAgentOptions, query
from claude_agent_sdk.types import PermissionResultAllow, PermissionResultDeny, HookMatcher
async def can_use_tool(tool_name, input_data, context):
print(f"\nツール: {tool_name}")
if tool_name == "Bash":
print(f"コマンド: {input_data.get('command')}")
# rm コマンドをブロックしてアーカイブを提案
if "rm" in input_data.get("command", ""):
return PermissionResultDeny(
message="削除の代わりにアーカイブしてください"
)
response = input("許可しますか? (y/n): ")
if response.lower() == "y":
return PermissionResultAllow(updated_input=input_data)
return PermissionResultDeny(message="ユーザーが拒否しました")
# ダミーフック(Python のストリーミングモードで必要)
async def dummy_hook(input_data, tool_use_id, context):
return {"continue_": True}
```
```typescript
// TypeScript - 入力を変更して許可する例
import { query } from "
@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Clean up temporary files",
options: {
canUseTool: async (toolName, input) => {
if (toolName === "Bash") {
// パスをサンドボックス内に書き換え
const sandboxed = { ...input, command: input.command.replace("/tmp", "/tmp/sandbox") };
return { behavior: "allow", updatedInput: sandboxed };
}
return { behavior: "allow", updatedInput: input };
}
}
})) { /* ... */ }
```
🏗 本番システムへの組み込み方
・Web UIでツール実行の承認ダイアログを表示し、ユーザーの判断を返します
・`context.suggestions` から `PermissionUpdate` を取得し、「今後も許可」の永続化ルールを設定できます
・危険な操作(`rm`、`DROP TABLE` など)は自動的にブロックし、安全な代替案をメッセージで提案します
・入力のサニタイズ(パスの制限、パラメータの上書き)で、エージェントの行動範囲を動的に制御します
💡 ユースケース
🔒 本番データベースへの書き込みコマンドを承認制にする
📁 ファイル操作を特定のディレクトリに制限する(パスの動的書き換え)
👥 マルチユーザー環境で、ユーザーの権限レベルに応じてツール利用を制御する
⚠️ 注意点
・Python では `canUseTool` を使うにはストリーミングモードと `PreToolUse` フックの設定が必要です
・`dontAsk` モードではコールバックがスキップされるため、セキュリティ上の制限にはフックを使用してください
・コールバックは回答まで無期限に実行を一時停止します。長時間のケースには `defer` フック決定を利用してください
✨ 「全部おまかせ」か「全部手動」かの二択ではなく、canUseTool で「要所だけ人間が判断する」スマートな運用を実現しましょう!
#
ClaudeAgentSDK# #
AIAgent#