何のためのものか
Claude がツール使用許可や作業方針の確認を必要とする場合に、canUseTool コールバックを通じてユーザーとやり取りする機能。SDK でアプリを作るなら、承認 UI はここに繋ぐ。
触る
発火条件を確かめる。
| 状況 | 発火するか |
|---|---|
| allow ルール・パーミッションモードで自動承認済み | しない |
| パーミッションフローで未解決のツール呼び出し | する |
AskUserQuestion ツール呼び出し | する |
dontAsk モード | しない(拒否される) |
コールバックは戻り値を返すまで実行を一時停止する。 SDK はクエリがキャンセルされるまで待ち続ける。
入れる
レスポンスの形を守る。
| 種別 | Python | TypeScript |
|---|---|---|
| 許可 | PermissionResultAllow(updated_input=input_data) | { behavior: "allow", updatedInput: input } |
| 拒否 | PermissionResultDeny(message="理由") | { behavior: "deny", message: "理由" } |
- 許可時に
updated_input/updatedInputを省略しない。 Claude Code v2.1.207 以前では拒否扱いになる - 拒否時の
messageは Claude に渡され、次の行動の判断に使われる。 「なぜ駄目か」と「代わりに何ならよいか」を書く
引数から何が読めるかも押さえる。Bash なら command / description / timeout、Write なら file_path / content、Edit なら file_path / old_string / new_string。
効かせる
- 同じ確認を繰り返さない。
updatedPermissions/updated_permissionsにsuggestionsの要素を返すと、次回以降の同パターン呼び出しを承認するルールを保存できる。destination == "localSettings"の提案を返すと.claude/settings.local.jsonに書き込まれる AskUserQuestionは方針の確認。toolName == "AskUserQuestion"で識別して、選択肢を出す UI に繋ぐ- プロセスを終了して後で再開したいなら
deferフックデシジョンを返す
落とし穴
- ツールを絞っているなら
AskUserQuestionを明示的に含める。 読み取り専用エージェントでtoolsを列挙していると、確認そのものができなくなる dontAskモードではコールバックが呼ばれない。 承認フローを前提にした実装がそのまま無効になる- Python で
updatedPermissionsを使うならclaude-agent-sdk0.1.80 以降が要る