Claude Code Hooksの設定方法 — 初めて書く人の完全手順
Claude CodeのHooksはツール実行の前後に任意コマンドを挟める仕組み。初めて書く人が動くところまで到達できるよう、最小例→実用例の順に手順を追います。
要点
Hooksは .claude/settings.json に10行ほど書くだけで設定できます。最初の難所は "どのイベントに紐付けるか" の把握。ここでは PostToolUse でWrite後に自動でフォーマッタを走らせる実用例を、最小構成から順に手を動かして作ります。
このチュートリアルで得られること
.claude/settings.jsonにHookを書く最小構成がわかるPostToolUseイベントの使い方がわかる- WriteしたファイルにPrettierを自動適用する実動作まで到達する
前提条件
- Claude Codeがインストール済み(
claude --versionが通る) - Node.jsプロジェクトでPrettierが導入済み(
npx prettier --versionが通る) - macOS / Linux / WSL(Windows PowerShellのパスは最後に補足)
手順1: 設定ファイルを作る
プロジェクトルートに .claude/ ディレクトリと settings.json を作ります:
mkdir -p .claude
touch .claude/settings.json確認:
ls -la .claude/
# -> settings.json が存在する手順2: 最小のHookを書く
.claude/settings.json に以下を書きます。まずはただログを出すだけのhookで、設定が効いていることを確認します。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "echo \"[hook] Write が実行されました\" >> /tmp/claude-hooks.log"
}
]
}
]
}
}ポイント:
PostToolUseは「ツール実行後」に走るイベントmatcher: "Write"でWriteツールだけに限定(*にすると全ツール)commandはただのシェルコマンド。標準出力・標準エラーは通常は捨てられるので、ファイルに書き出す
手順3: Claude Codeを再起動して確認
settings.jsonの変更は起動中のセッションには反映されないので、一度Claude Codeを終了して再起動します。
# セッション終了後
claude新しいセッションで、簡単なWriteを含むタスクを頼みます:
README.md に "Hello Hooks" と書いて保存してください別のターミナルで確認:
cat /tmp/claude-hooks.log
# -> [hook] Write が実行されましたログが書かれていれば成功です。
手順4: Prettierを走らせる実用版に拡張
ログだけのhookを、Prettierを走らせる実用hookに置き換えます:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "FILE=$(jq -r '.tool_input.file_path // empty' <<< \"$CLAUDE_HOOK_INPUT\") && [ -n \"$FILE\" ] && npx prettier --write \"$FILE\" 2>/dev/null || true"
}
]
}
]
}
}解説:
matcher: "Write|Edit"でWriteとEdit両方を対象に(正規表現)$CLAUDE_HOOK_INPUTにhookのコンテキストJSONが渡ってくる(Claude Codeから提供される環境変数)jqでツール入力からfile_pathを抜き出す- Prettierが走るのは拡張子が対応するファイルだけ(非対応なら静かに失敗、
|| trueでhook全体は成功扱い)
手順5: 動作確認
Claude Codeを再起動し、以下を頼みます:
src/utils.ts を作って、foo 関数を書いてください作成されたファイルを確認:
cat src/utils.tsPrettierのフォーマット(セミコロン・クォート規約・インデント等)が適用された状態になっていれば成功です。
うまくいかないとき
症状1: hookが発火しない
- 原因: settings.jsonの変更が反映されていない
- 対処: Claude Codeを一度終了して再起動
症状2: jq: command not found
- 原因:
jqが未インストール - 対処:
brew install jq(macOS) /apt install jq(Debian系)。もしくはnodeスクリプトに置き換える
症状3: Prettierが走らない
- 原因:
npx prettierのパスが通っていない、package.jsonにprettierが無い - 対処:
npm install --save-dev prettierでインストール。既にあるならcdでプロジェクトルートに居るかを確認
症状4: Windows PowerShellで動かない
- 原因: 上記例はPOSIXシェル前提
- 対処: command部分をPowerShell構文に書き換え、
CLAUDE_CODE_USE_POWERSHELL_TOOL=1を設定
症状5: hookが遅すぎてClaudeの応答が詰まる
- 原因: Prettierが重い / 大量ファイルに一斉適用
- 対処: hookを
.ts/.tsx/.jsに限定するglobマッチを追加するか、hook自体をasync化する(内部でバックグラウンド&する)
まとめ
Hookは最小10行のJSONで設定できますが、起動中セッションには反映されないのが最初の躓きポイントです。最小ログ版で設定の存在を確認してから実用版に拡張するのが、最も短時間で動作に到達する手順でした。
次のステップは、PreToolUse で危険コマンドを事前ブロックするhook、Stop でセッション終了時にコミット支援を走らせるhookなど。Hooksは「実行時の自動化レイヤ」ですが、プロジェクトの暗黙ルールはCLAUDE.md側、繰り返し呼び出したい知識はSkills側 に置くと役割分担が綺麗に整います。
関連する記事
Claude Code をもっと見る →CursorからClaude Codeへの移行ガイド — 設定の引き継ぎから「Tab補完がない」問題までの実務手順
Claude Code設定ガイド — settings.jsonの主要フィールド・環境変数・実戦レシピ
Claudeを学ぶ1週間ロードマップ — 初日から実戦投入までの7日ガイド
MCPサーバを自作してClaude Codeにつなぐ — TypeScript実装の完全手順
Claude Codeでよくあるエラー10選 — 起動失敗から認証・MCP・権限まで実機で踏みやすい順に対処
Claude CodeのPro / Max / API従量、どれを選ぶか — コスト試算と選び方の判断ガイド
Claude CodeをGitHub Actionsに組み込む実用ガイド — claude-code-action v1とheadless実行の使い分け
Anthropic Agent SDKでSlack常駐botを作る — 実装30分のミニチュートリアル