上級機能

Hooks:あなただけのワークフローを構築

Claude Code のツール呼び出しの各段階にカスタムロジックを挿入 — フォーマット、テスト、セキュリティチェックをすべて自動化

#Hooks #Automation #ClaudeCode #CI/CD

Claude Code Hooks とは?

Hooks は Claude Code のイベントシステムで、ツール呼び出しの前後にカスタムシェルスクリプトを実行できます。ファイル保存後の自動リンター実行、コミット前のテスト実行、機密ファイルアクセス時のアラートなど、すべて自動化できます。

設定は三層です。イベントを選び、matcher でツールを絞り、処理スクリプトは内側の hooks 配列に書きます。スクリプトは標準入力からこのイベントの JSON を読み、終了コードで意思を伝えます。0 は異議なし、2 はブロックできるイベントでその呼び出しを止めます。以下の四つのイベントでは、command フックは既定で 600 秒で取消しです。この四つは頻出であって、公式リファレンスの全項目ではありません(2026-09-22 確認)。

ユーザー
コマンドを入力
Hook 介入点
実行前に検証、拒否も可
ツール実行
通過後にツールが実行される

Hook タイプ詳細

Claude Code の Hook はツール呼び出し・セッション・圧縮といったライフサイクルの節に付き、command・HTTP・agent の三種類のハンドラを置けます

PreToolUse ツール実行前

ツール実行前にトリガー — パラメータ検証、権限チェック、自動承認または拒否

"PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command" }] }]

PostToolUse ツール実行後

ツール実行後にトリガー — 自動フォーマット、テスト実行、通知送信

"PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command" }] }]

Notification 通知のとき

Claude Code 通知時にトリガー — Slack やメールなど外部チャンネルと統合

"Notification": [{ "matcher": "permission_prompt", "hooks": [{ "type": "command" }] }]

Stop 応答終了時

Claude Code 応答終了時にトリガー — ログ記録やクリーンアップの実行

"Stop": [{ "hooks": [{ "type": "command", "command": "~/scripts/on-stop.sh" }] }]

自動化のよくある三つの例

以下の三つは同じ構造です。イベントを選び、matcher で対象を絞り、スクリプトは内側の hooks 配列に置きます。断片は意図の示意だけで、フィールド名と入れ子は公式リファレンスに従ってください。判断に必要な情報は標準入力の JSON から取り出します。

1

コミット前に整形

Claude が git commit を実行しようとする時、PreToolUse はまずパラメータをスクリプトに渡します。スクリプトはコミットを見つけたら整形を走らせ、終了コードで答えます。0 は実行を許可し、2 はブロックします。これらは実行の前なので、止まったら作業ツリーは変わっていません。

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "command": "if echo \"$TOOL_INPUT\" | grep -q 'git commit'; then npm run format; fi"
    }]
  }
}
2

テスト完了を通知

コマンドが正常に戻った後にだけ PostToolUse が発火するので、スクリプトは pytest や npm test を見つけてデスクトップに通知できます。すでに終わった呼び出しは取り消せず、失敗時は発火しないため、この通知は結果が見られるという意味で、合格の保証ではありません。

{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Bash",
      "command": "if echo \"$TOOL_INPUT\" | grep -q 'pytest\\|npm test'; then notify-send 'Tests completed'; fi"
    }]
  }
}
3

機密ファイルの書き込みを拒否

Edit と Write に PreToolUse を設定し、スクリプトは標準入力から対象パスを取って .env や credentials に一致したら終了コード 2 を返します。書き込みはディスクに届く前で拒否されるため、取り消しは不要です。matcher に Edit|Write と書けば二つのツールをまとめて見ます。

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Edit|Write",
      "command": "if echo \"$TOOL_INPUT\" | grep -qE '\\.env|credentials|secrets'; then exit 2; fi"
    }]
  }
}

Headless モードと CI/CD

-p フラグで Claude Code を CI/CD パイプラインで無人実行

-p による非対話実行

claude コマンドに -p(または --print)を付けると、非対話で実行でき、最後に結果をまとめて出力する。

CI パイプラインに接続

非対話モードは stdin から読み、結果を stdout に出力する。成功時は終了コード 0 を返すのでビルドスクリプトで分岐できる。

--output-format による構造化出力

--output-format で出力形式を選べ、json を選ぶと結果にセッション ID などのメタデータが添えられるので、スクリプトで解析しやすい。

CI で使う非対話実行の例
# レビューを一度非対話実行:JSON 出力、最大 5 ターン
claude -p "Review this PR and suggest improvements" \
  --output-format json \
  --max-turns 5

settings.json 設定例

.claude/settings.json で Hooks を定義

.claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "command": "~/scripts/pre-bash-hook.sh"
      },
      {
        "matcher": "Edit|Write",
        "command": "~/scripts/protect-sensitive-files.sh"
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Bash",
        "command": "~/scripts/post-bash-hook.sh"
      }
    ],
    "Notification": [
      {
        "command": "~/scripts/send-notification.sh"
      }
    ],
    "Stop": [
      {
        "command": "~/scripts/on-stop.sh"
      }
    ]
  }
}

Hooks 実装のポイント

以下四点依据 Claude Code 公式の Hooks リファレンス、特にセキュリティの項に沿って整理しました(確認日 2026-09-22)。主題はスクリプトの書き方で、設定の形は上の settings.json の節にあります。

ブロックは終了コード 2

公式には、ほぼすべての Hook イベントで単独にブロックするのは終了コード 2 だけだと書かれています。他の終了コードは非ブロッキングなエラーで処理は進みます。ポリシーを課すスクリプトなら exit 2 を返してください。

matcher で発火範囲を絞る

matcher で Hook の発火を絞り込みます。名前だけなら完全一致、他の文字が入ると未アンカーの JavaScript 正規表現として評価されます。公式例では Edit.* が Edit と NotebookEdit 双方に当たり、全体一致を狙うなら自前でアンカーを付けます。

タイムアウトは停止ではない

Claude Code はタイムアウトした Hook をキャンセルし出力を破棄するので、多くのイベントでは決定が出ません。公式の注記では PreToolUse で遅れた command 系 Hook は呼び出しを止めず、PreModelSwitch では切り替えを止めます。調査は debug ログの実行詳細から。

入力は信頼せず扱う

公式の安全実践には次が並みます。入力データを鵜呑みにしない、シェル変数は引用符で囲む、../ みたいなパス侵入を確認する、.env や .git は避ける。Hook の入力は JSON で、各欄に外部の内容が入り得ます。

よくある質問

フックスクリプトは入力 JSON をどこで受け取りますか?

command 系 Hook は標準入力で JSON を受け取ります。共通項目は session_id、transcript_path、cwd、hook_event_name など、そこに各イベント固有の項目が足され、ツール系なら tool_name と tool_input です。

Hook でツールの実行を止めるには?

スクリプトを PreToolUse に登録し、通したくない呼び出しでは終了コード 2 を返します。公式の一覧で PreToolUse はブロック可能、コード 2 が呼び出しを止めます。条件付き判断なら permissionDecision を含む JSON を出せます。コード 1 は多くのイベントで止めません。

Hook がタイムアウトしたらどうなりますか?

タイムアウトした Hook はキャンセルされ出力は捨てられるので、多くのイベントでは決定が出ません。時間で切れたときにブロックが起きるのは PreModelSwitch です。パスを打ち間違えても非ブロッキングなエラー扱いで、公式はポリシー用 Hook を初めて走らせるときこの通知を確認するよう勧めています。

Hooks の設定はどのファイルに書きますか?

範囲は定義する場所しだいです。~/.claude/settings.json は自分の全プロジェクトに効きますがマシン内に残ります。.claude/settings.json はプロジェクト単位でコミットできます。.claude/settings.local.json もプロジェクト単位で、Claude Code が設定を保存すると gitignore に入ります。

QCode.cc でエンタープライズ自動化

QCode.cc 開発者プラットフォームと Hooks システムを組み合わせ、エンタープライズグレードの AI コーディングパイプラインを構築

ANTHROPIC_BASE_URL によるゲートウェイ接続

Claude Code の公式変数表は、ANTHROPIC_BASE_URL で API エンドポイントをプロキシやゲートウェイに向けられると説明している。QCode サイト内にこの接続の設定ガイドがある(2026-09-22 確認)。

自動化の前にブレーキを

自動化の前にブレーキを。公式サンプルは、保護パターン一覧で対象パスを検証し、終了コード 2 で機密ファイルの編集を止める例を示している。

チームで同じ設定を共有

公式の設定場所表では .claude/settings.json はリポジトリにコミットできる。チーム共用の QCode キーと組み合わせれば、全員の Hook の挙動がそろう。

1 プランで 3 プラットフォーム共有

QCode は OpenAI Codex / GPT-5.6 にも対応

QCode のプラン残高は Claude Code と OpenAI Codex CLI で共通利用でき、重複購入は不要です。

Claude Code ワークフローを自動化

Hooks + QCode.cc で AI コーディングの全潜在能力を解放

更新日 2026-09-22

まず試して、それから決める

どのプランか迷ったら、まずスターター($8.57/月)から。満足したらアップグレードし、旧プランの残り価値は按分で残高に戻ります。