朝、Claude Codeを起動する。AIニュースの収集が始まる。 Todoとスケジュールが表示される。 SNS投稿の下書きができている。 私は何もしていません。PCを開いただけです。 これを実現しているのが「フック」という機能です。Claude Codeユーザーの9割が見落としている、最も過小評価された機能だと思います。
フックを一言で説明します。
「〇〇が起きたら、自動で△△を実行する」 これだけです。 たとえば、「セッションが始まったら、朝のルーティンを登録する」。「ファイルを保存したら、自動でコードを整形する」。「Claude Codeの応答が終わったら、デスクトップに通知する」。 通常のClaude Codeは「指示したら動く」。フックを使うと「何もしなくても動く」。この差は想像以上に大きいです。
フックは特定の「イベント」に反応します。主要なものを7つ紹介します。
注目してほしいのは PreToolUse です。
ツール実行の「直前」に割り込めるので、「rm -rf を含むコマンドはブロックする」といった安全装置を仕込めます。これは、一度設定すれば二度と誤操作で泣かなくて済むということです。
フックには4つのタイプがあります。
最も使います。指定したシェルコマンドを実行します。
{
"type": "command",
"command": "echo '{\"systemMessage\": \"ファイルを整形しました\"}'"
}
外部のURLにPOSTリクエストを送ります。SlackやDiscordへの自動通知に使えます。
Claudeに「この操作は安全か?」とyes/no判定させます。ツール実行前後でのみ使えます。
ファイル読み取りなどのツールを持ったエージェントが、多段階の検証を行います。テスト実行の確認などに向いています。 実用上、ほとんどのケースはcommand型で事足ります。まずはcommandだけ覚えてください。
設定ファイルは ~/.claude/settings.json です。テキストエディタで開いて、hooks を追加するだけ。
コードを書くたびに手動でフォーマッタを走らせていませんか?フックなら自動です。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_response.filePath // .tool_input.file_path' | { read -r f; prettier --write \"$f\"; } 2>/dev/null || true"
}
]
}
]
}
}
matcher が「Write(ファイル作成)またはEdit(ファイル編集)」を指定しています。このツールが使われた直後に、prettierでファイルを整形する。設定したら、あとは何も考えなくていい。
Claude Codeは強力です。強力ゆえに、rm -rf / のような破壊的なコマンドも理論上は実行できてしまいます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command' | grep -qE 'rm\\s+-rf\\s+/' && echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"ルートディレクトリの削除はブロックされました\"}}' || true"
}
]
}
]
}
}
Bashコマンド実行前にフックが割り込み、rm -rf / を検出したらブロックする。安全網は多いほどいいです。
長いタスクを投げて、別の仕事をしている間にClaude Codeの処理が終わった。でも気づかなかった。そんな経験はありませんか?
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claudeの処理が完了しました\" with title \"Claude Code\"'"
}
]
}
]
}
}
Claudeが応答を終えるたびに、Macの通知センターにポップアップが出ます。地味ですが、これだけで作業効率が変わります。
冒頭で紹介した「PCを開くだけで朝のルーティンが動く」仕組みです。
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "echo '{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":\"毎朝7時のルーティンcronを登録してください\"}}'",
"timeout": 5,
"statusMessage": "朝ルーティン設定中..."
}
]
}
]
}
}
SessionStartフックは「セッションが始まった瞬間」に発火します。additionalContext でClaudeに指示を注入し、定期実行の登録を自動で行わせる。
毎朝手動で「ニュース集めて」と入力する必要がなくなりました。
「自動フォーマット」のようにどのプロジェクトでも使いたいものはグローバル(~/.claude/settings.json)へ。
プロジェクト固有のものはローカルへ。
チームで統一したいルールは .claude/settings.json に入れてGitにコミットすれば、メンバー全員に適用されます。
原因の90%はJSONの構文エラーです。
settings.jsonが壊れると、フックどころかすべての設定が無効になります。編集後は必ず jq . ~/.claude/settings.json で構文チェックしてください。
Claude Codeのターミナルで /hooks と入力すると、設定済みのフック一覧が表示されます。
フックが発火すると「Ran N hooks」と表示されますが、正常動作時は静かに処理されます。
2>/dev/null || true をコマンドの末尾につけてください。
エラーを握りつぶして処理を続行します。ただし、これはブロック目的のPreToolUseフックには使わないでください。
ブロックフックは「止まること」が目的だからです。
フックは一度設定すれば、あとは勝手に動き続けます。 まず今日やることは3つです。
~/.claude/settings.json を開く