← MCPサーバー メモリ →

05 フック — イベント駆動の自動実行


フックとは

フックは 特定のイベント発生時に自動実行されるシェルスクリプト。Claude Codeの動作を拡張・制御する。

ユーザーがツールを実行
  │
  ▼
PreToolUse フックが発火 ──→ チェックOK → ツール実行
  │                          └─ チェックNG → ブロック
  ▼
ツールが実行される
  │
  ▼
PostToolUse フックが発火 ──→ ログ記録・後処理

主要4種のフック

SessionStart

セッション開始時に実行。

項目 説明
タイミング Claude Code起動時
用途 環境変数の読み込み、初期化処理、設定の検証、ハンドオフ読込
備考 なし

PreToolUse

ツール実行前に実行。最も重要なフック。

項目 説明
タイミング 各ツール(Read, Edit, Bash等)の実行前
用途 セキュリティチェック、危険コマンドのブロック、入力検証
備考 なし
ブロック可能 Yes — スクリプトがエラーを返すとツール実行がキャンセルされる

💡 ※2026-07-02統合撤去: 2026-06-30に追加していた minimax系MCPブロック(matcher mcp__minimax-(official|video)__.*exit 2)は、32MB真因=glm-rate-proxy client_max_size 未設定と判明(9ac5f24fd解決)したため PreToolUse hook を削除し撤去。minimax-official/video は日常セッションで即呼び可能。

現場の知見: フックのスクリプトがエラー(exit code ≠ 0)を返すと、ツールの実行がサイレントにブロックされる。意図せぬブロックに注意。→ 11_現場の知見

クロスプラットフォーム対応: フックスクリプトで python3 を直接呼ぶとWindows Git Bashで動作しない。run-security-check.sh ラッパーが python3 / python / wsl を自動検出する。Bashフックは純bash(grep/sed)でJSON解析しpython3に依存しない。

ブロックされるコマンドの例:

PostToolUse

ツール実行後に実行。

項目 説明
タイミング 各ツールの実行後
用途 ログ記録、実行結果の後処理、設定の自動同期、通知
備考 なし

Stop

セッション終了時に実行。

項目 説明
タイミング Claude Code終了時
用途 クリーンアップ、ログ保存、ハンドオフ情報の書き出し
備考 なし

Notification / PostToolUseFailure

エラー・ブロック時(Notification)、ツール失敗時(PostToolUseFailure)に実行。Discord通知等の異常系ハンドリングに使用。


設定方法

フックは settings.jsonhooks セクションに定義する。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.claude/scripts/security/check-command-safety.py"
          }
        ]
      }
    ],
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "source ~/.secrets.env"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/session/save-session-log.sh",
            "timeout": 5000
          },
          {
            "type": "command",
            "command": "~/.claude/scripts/session/generate-handoff.sh",
            "timeout": 3000
          },
          {
            "type": "command",
            "command": "~/.claude/scripts/session/queue-guide-updates.sh",
            "timeout": 5000
          }
        ]
      }
    ]
  }
}

matcherについて


現在のフック構成(実態)

フック スクリプト 役割
SessionStart
check-cwd.sh 作業ディレクトリチェック
check-version.sh バージョン確認・新機能検知
load-handoff.sh 最新5件ハンドオフ自動読込(履歴空ならstate fallback)
load-obsidian-log.sh SSOT日記読み込み(今日・昨日のセッションログ+バックログ+7日以上経過タスクの自動確認プロンプト・セッション数カウント付きサマリー)
start-clipboard-watcher.sh クリップボード監視起動
load-secrets.sh APIキー注入
sync-secrets-to-settings.sh シークレットをsettings.jsonに同期
check-secrets-leak.sh シークレット漏洩チェック
check-decision-indexes.sh _INDEX.md同期チェック
check-submodule-sync.sh サブモジュール同期チェック
auto-update-indexes.sh _INDEX.md自動更新
auto-fix-links.sh Markdownリンク自動修正
check-mcp-guide-sync.sh MCPガイドとの差分検知
check-knowledge-lint.sh Knowledge Lint cron設定確認
check-claude-config-sync.sh claude-configリポジトリ同期チェック
check-proxy-compat.sh CC版変化時にプロキシ互換性(GLM応答のtool_use)を自動検証・同版かつ前回okは省略・警告のみでブロックしない(2026-07-09 追加)
sync-settings-to-example.sh settings.jsonのサンプル同期
skill-guard.sh スキル定義の整合性ガード
check-ssot-sync-staleness.sh SSOT整合性の日次自動発動(state日付≠今日で /ssot-sync auto をプロンプト注入・1日1回・REPL idle依存なし)
generate-skill-catalog.py SKILL_CATALOG.md自動生成(自作Skills+Plugin+MCP・廃止旧sync-claude-md.sh代替)
PreToolUse
check-command-safety.py 危険コマンドのブロック(APIキー漏洩防止等)
guard-destructive-commands.sh 破壊的コマンドのガード(python3不要・純bash動作)
PostToolUse
track-tool-usage.sh ツール使用ログ記録
detect-commit-for-ssot.sh git commitでSSOT記録トリガー検知
post-tool-settings-sync.sh settings.json変更後のSSOT設定ファイルへの同期
mirror-to-custom.sh スキル変更をskills-customへmirror
PostToolUseFailure
(atuin) シェル履歴統合
Stop
save-session-log.sh SSOT日記にセッション終了タイムスタンプ記録
generate-handoff.sh ハンドオフ情報の書き出し
queue-guide-updates.sh claude-code-guideの更新キュー記録
sync-skills-windows.sh Windows側のskillsをWSL側に同期
notify-done.sh 完了通知(Discord)
next-issue.py 自律開発ループの継続判定
claude-config-sync.sh ~/.claude/ → knowledge-base + claude-config へ自動同期
Notification
notify-discord-on-error.sh エラー・ブロック時にDiscord通知

SessionStartは20コマンド構成。初期化・セキュリティ・SSOT同期・設定チェック・日次自動発動の5カテゴリに分類される。PreToolUseの check-command-safety.pyrun-security-check.sh ラッパー経由でクロスプラットフォーム対応。

state日付管理による日次自動発動パターン(再利用可能)

check-ssot-sync-staleness.sh が実装する「stateファイルの日付で1日1回を制御」する汎用パターン。CronCreateは REPL idle時しか発火しないが、SessionStart hookはセッション開始で確実に走るため、この組合せで「忘れない」を担保する。

STATE="$HOME/.claude/state/<task>-last-run"
TODAY=$(date +%Y-%m-%d)
LAST=$(cat "$STATE" 2>/dev/null)
if [ "$LAST" != "$TODAY" ]; then
  # stdout がプロンプトとして注入される → CCが自律実行
  echo "[<task> 日次実行トリガー] ...を実行してください"
fi

実行側スキルは完了後 date +%Y-%m-%d > "$STATE" で再発火を抑制する。


自律タスクループ(Stop Hook 応用)

概要

GitHub Issue を順番に自動実装するイベント駆動ループ。
CronCreate が時間トリガーのみなのに対し、Stop Hook を使うことで「前のタスク完了後に次を起動」が実現できる。

ファイル構成

~/.claude/scripts/auto-dev/
├── state.json       # キュー状態(永続)
├── start.sh         # 手動起動エントリポイント
├── next-issue.py    # Stop Hook 本体
└── loop.log         # 実行ログ(自動生成)

使い方

# WSL で実行(Issue #76 → #75 の順で自律実行)
bash ~/.claude/scripts/auto-dev/start.sh 76 75

# 状態確認
cat ~/.claude/scripts/auto-dev/state.json

# ログ確認
tail -f ~/.claude/scripts/auto-dev/loop.log

緊急停止

python3 -c "
import json
p='/home/<USER>/.claude/scripts/auto-dev/state.json'
s=json.load(open(p))
s['active']=False
json.dump(s,open(p,'w'),indent=2)
print('停止しました')
"

誤爆防止

動作フロー

start.sh 76 75
  → state.json: active=true / pending=[76,75]
  → claude --print "Issue #76 を実装して..."
  → [セッション終了]
  → Stop Hook → next-issue.py
      → completed=[76] / pending=[75]
      → claude --print "Issue #75 を実装して..."
      → [セッション終了]
  → Stop Hook → next-issue.py
      → completed=[76,75] / pending=[] → active=false → 完了

詳細: [[../../01_DECISIONS/claude-code/2026-05-30_自律タスクループ実装.md]]


デバッグ方法

フックが期待通りに動かない場合:

  1. フックのログを確認 — エラーメッセージが表示される
  2. 手動でスクリプトを実行 — ターミナルで直接実行して動作確認
  3. /config で設定確認 — hooks セクションの内容を確認
  4. 一時的に無効化 — settings.json で該当フックをコメントアウト

💡 やさしい補足(初心者向け)