結論(即答): Claude Code hooksとは
Claude Code hooks(フック)は、Claude Code がセッション中の決まった場面で自動的に実行する処理です。設定ファイルに「どの場面で(イベント)」「何を(ハンドラー)」動かすかを書いておくと、Claude の判断を待たずにプログラムが動きます。
場面を表すイベントは、2026年10月20日時点の公式リファレンスで33種類あります。全部を覚える必要はありません。業務で最初に使うのは、起動時の SessionStart、ツール実行前の PreToolUse、ツール実行後の PostToolUse、応答終了時の Stop の4つです。
できることは3つに分かれます。
- 止める: 危険なコマンドの実行を拒否する。テストが通るまで Claude を終わらせない
- 足す: 起動時に前回の作業メモを読み込ませる。ツールの結果に注意書きを添える
- 記録する: 会話の要約をノートに残す。ファイルの変更を通知する
当社は Obsidian へ作業記録を自動で貯める目的で導入し、2026年10月20日時点で33イベントのうち14イベントを常用しています。形式はすべてシェルコマンド型(command)で、本体は Node.js の短いスクリプトです。
出典: Claude Code 公式ドキュメント「フック リファレンス」(2026年10月20日確認。当社の確認環境は Claude Code v2.1.304)
CLAUDE.md や permissions との違い
CLAUDE.md に書いた指示は、Claude が読んで従う「お願い」です。長い会話では読み落とされることがあります。hooks はプログラムが実行するので、場面が来るたびに動きます。
permissions(権限ルール)は、ツールごとに「許可する、拒否する、確認する」を決める仕組みです。hooks はその前後に任意の処理を挟む仕組みで、PreToolUse から許可や拒否を返すこともできます。公式リファレンスも、許可と拒否そのものは権限システムで決め、hooks はその補助として使うよう書いています。
hooksの種類は「いつ動くか」と「何が動くか」の2軸で分かれる
hooks を分類する軸は2つあります。1つ目はイベントで、どの場面で動くかを表します(33種類)。2つ目はハンドラーの形式で、何が処理を行うかを表します(5種類)。設定は「イベント → matcher(絞り込み)→ ハンドラー」の3階層で書きます。
公式リファレンスは、イベントの頻度を3段階に分けています。
| 頻度 | イベント |
|---|---|
| セッションに1回 | SessionStart、SessionEnd |
| ターン(ユーザーの1回の発言と Claude の応答)に1回 | UserPromptSubmit、Stop、StopFailure |
| ツール呼び出しごと | PreToolUse、PostToolUse |
残りのイベントは、サブエージェントの起動、コンテキストの圧縮、モデルの切り替えなど、その出来事が起きたときだけ発火します。
全33イベントの一覧表(発火タイミング、matcherの対象、ブロック可否)
表の「ブロック」は、終了コード2または JSON で処理を止められるかを表します。「matcher の対象」は、そのイベントの中でさらに絞り込める条件です。
セッションの開始と終了
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| SessionStart | セッションの開始と再開 | 開始方法(startup、resume、clear、compact、fork) | 不可 | 前回の作業メモや環境変数の注入 |
| Setup | --init-only、または -p と --init か --maintenance で起動したとき |
トリガー(init、maintenance) | 不可 | CI やスクリプトでの1回限りの準備 |
| InstructionsLoaded | CLAUDE.md や .claude/rules/*.md が読み込まれたとき |
読み込み理由(session_start、path_glob_match など) | 不可 | どの指示が読まれたかの監査 |
| SessionEnd | セッションの終了 | 終了理由(clear、resume、logout、prompt_input_exit、other) | 不可 | 後片付け、ログの確定 |
ユーザー入力と応答
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| UserPromptSubmit | プロンプトの送信直後、Claude が処理する前 | なし | 可 | 入力の検査、文脈の追加 |
| UserPromptExpansion | スラッシュコマンドがプロンプトに展開されるとき | コマンド名 | 可 | 特定コマンドの禁止や差し替え |
| MessageDisplay | Claude の応答テキストが表示されている間 | なし | 不可 | 表示テキストの置換(タイムアウト10秒) |
| Stop | Claude が応答を終えるとき | なし | 可 | 作業記録の保存、終了条件の検査 |
| StopFailure | API エラーでターンが終わったとき | エラー種別(rate_limit、overloaded、billing_error など) | 不可 | 障害の記録と通知 |
ツール呼び出しと権限
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| PreToolUse | ツール呼び出しの実行前 | ツール名(Bash、Edit|Write、mcp__.* など) |
可 | 危険な操作の拒否、入力の書き換え |
| PermissionRequest | ツール呼び出しが権限の確認を必要とするとき | ツール名 | 可(JSON の decision のみ。終了コード2は無効) | 確認ダイアログの自動応答 |
| PermissionDenied | オートモード(auto mode)がツール呼び出しを拒否したとき | ツール名 | 不可 | 再試行の許可(retry) |
| PostToolUse | ツール呼び出しが成功した後 | ツール名 | 不可 | フォーマッターやテストの実行、結果への注記 |
| PostToolUseFailure | ツール呼び出しが失敗した後 | ツール名 | 不可 | 失敗の記録、復旧のヒント |
| PostToolBatch | 並列ツール呼び出しの一括完了後、次のモデル呼び出しの前 | なし | 可 | バッチ全体を見た検査 |
サブエージェントとタスク
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| SubagentStart | サブエージェントの生成時 | エージェント種別 | 不可 | サブエージェントへの文脈注入 |
| SubagentStop | サブエージェントの終了時 | エージェント種別 | 可 | 成果物の検査、やり直しの指示 |
| TaskCreated | TaskCreate でタスクが作られたとき | なし | 可 | タスクの命名規則の強制 |
| TaskCompleted | タスクが完了にされるとき | なし | 可 | 完了条件の検査 |
| TeammateIdle | エージェントチームのチームメイトが待機に入るとき | なし | 可 | 残作業の割り当て |
環境、設定、ファイル
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| ConfigChange | セッション中に設定ファイルやスキルが変わったとき | 変更元(user_settings、project_settings、local_settings、policy_settings、skills) | 可(policy_settings を除く) | 想定外の設定変更の拒否 |
| CwdChanged | 作業ディレクトリが変わったとき | なし | 不可 | direnv のような環境変数の切り替え |
| DirectoryAdded | /add-dir などでディレクトリが追加されたとき |
追加方法(slash_command、register_repo_root) | 不可 | 追加先の案内 |
| FileChanged | 監視対象のファイルがディスク上で変わったとき | 監視するファイル名(.envrc|.env のように列挙) |
不可 | 設定ファイル変更時の再読み込み |
| WorktreeCreate | worktree が作られるとき | なし | 可(失敗させる) | worktree の作り方を自前の手順に差し替える |
| WorktreeRemove | hooks が作った worktree が削除されるとき | なし | 可(失敗させる) | 後片付け |
圧縮、モデル、MCP、通知
| イベント | 発火タイミング | matcher の対象 | ブロック | 主な用途 |
|---|---|---|---|---|
| PreCompact | コンテキスト圧縮の前 | 圧縮のきっかけ(manual、auto) | 可 | 圧縮前の引き継ぎメモの保存 |
| PostCompact | コンテキスト圧縮の後 | 圧縮のきっかけ(manual、auto) | 不可 | 圧縮後の文脈の補充 |
| PreModelSwitch | モデルの切り替えを適用する前 | 切り替え先のモデル名 | 可 | 高価なモデルへの切り替え確認 |
| PostModelSwitch | モデルが切り替わった後 | 切り替え先のモデル名 | 不可 | モデル変更の記録 |
| Elicitation | MCP サーバーがユーザー入力を求めたとき | MCP サーバー名 | 可 | フォームの自動入力 |
| ElicitationResult | ユーザーが MCP の入力要求に答えた後 | MCP サーバー名 | 可 | 送信前の値の検査 |
| Notification | Claude Code が通知を出すとき | 通知種別(permission_prompt、idle_prompt、agent_completed など) | 不可 | デスクトップ通知、チャットへの連携 |
出典: 公式リファレンスの「フック ライフサイクル」「Matcher パターン」「イベントごとの終了コード 2 動作」の各表(2026年10月20日確認)
止められるのは「まだ起きていないこと」だけ
33イベントのうち、終了コード2で処理を止められるのは16イベントです。PermissionRequest は終了コード2では止まらず、JSON の decision でだけ拒否できます。合わせて17イベントで、hooks から結果を変えられます。
分かれ目は、イベントが「まだ起きていないこと」を表すか「すでに起きたこと」を表すかです。PreToolUse はツール呼び出しの前なので止められます。PostToolUse はツールが動いた後なので止められません。SessionStart や PostModelSwitch も同じ理由で止められません。
| 止められるイベント | 終了コード2で起きること |
|---|---|
| PreToolUse | ツール呼び出しを拒否する |
| UserPromptSubmit | プロンプトを Claude に渡さない |
| UserPromptExpansion | コマンドの展開を止める |
| Stop | Claude を終わらせず、会話を続けさせる |
| SubagentStop | サブエージェントを終わらせない |
| TeammateIdle | チームメイトを待機させず、作業を続けさせる |
| TaskCreated | タスクの作成を取り消す |
| TaskCompleted | タスクを完了にしない |
| PostToolBatch | 次のモデル呼び出しの前にループを止める |
| ConfigChange | 設定変更を適用しない(policy_settings を除く) |
| PreCompact | コンテキスト圧縮を止める |
| PreModelSwitch | モデルの切り替えを取り消す |
| Elicitation | MCP の入力要求を辞退し、ダイアログを出さない |
| ElicitationResult | 回答を送らず、辞退に変える |
| WorktreeCreate | worktree の作成を失敗にする |
| WorktreeRemove | ディレクトリが残っていれば削除を失敗にする |
止められないイベントにも使い道はあります。PostToolUse は Claude に見せる結果を updatedToolOutput で置き換えられ、PermissionDenied は retry: true で再試行を促せ、SessionStart は additionalContext で文脈を足せます。「止める」以外の出力は、後の「終了コードとJSON出力の読み方」で扱います。
注意点が2つあります。1つは、タイムアウトしたフックは止める役目を果たさないことです。PreToolUse のフックが時間切れになると、ツール呼び出しは通常の権限フローで続きます。時間切れでも止めたいときは onFailure: "block" を付けます(PreModelSwitch だけは時間切れで切り替えが止まります)。
もう1つは Stop の安全弁です。Stop のフックが続行の指示(終了コード2か decision: "block")を8回連続で返すと、Claude Code はそれを無視して停止します。Claude がツールを呼ぶと回数は0に戻り、上限は環境変数 CLAUDE_CODE_STOP_HOOK_BLOCK_CAP で変えられます。
出典: 公式リファレンス「イベントごとの終了コード 2 動作」「タイムアウト」「Stop」(2026年10月20日確認)
ハンドラーの形式は5種類(command、http、mcp_tool、prompt、agent)
イベントが決まったら、何に処理をさせるかを type で選びます。
| 形式 | 何が動くか | 結果の返し方 | 既定のタイムアウト | 向く用途 |
|---|---|---|---|---|
| command | シェルコマンド。入力は標準入力の JSON | 終了コードと標準出力の JSON | 600秒 | ほぼすべて。速く、モデルの呼び出しが増えない |
| http | 指定 URL への POST。入力はリクエスト本体の JSON | レスポンス本体の JSON | 600秒 | 社内サーバーでの一元的な検査 |
| mcp_tool | 設定済み MCP サーバーのツール | ツールのテキスト出力(command の標準出力と同じ扱い) | 600秒 | MCP に実装済みの処理の再利用 |
| prompt | Claude への1回の問い合わせ | {"ok": true/false, "reason": "..."} |
30秒 | 「終わってよいか」のような判断 |
| agent | ファイルを読めるサブエージェント(最大50ターン) | 同上 | 60秒 | テストを実際に走らせて確かめる検査(実験的機能) |
当社は command だけを使っています。prompt と agent はモデルの呼び出しが増えるため、その分だけ遅くなり、利用枠も消費します。判断が要る検査でも、まずはシェルスクリプトで書けないかを考えます。
command には書き方が2つあります。args を付けると exec 形式になり、シェルを介さずに引数がそのまま渡ります。args を付けないとシェル形式になり、sh -c を通ります(Windows では Git Bash か PowerShell)。パスを含むコマンドは exec 形式のほうが安全です。
長い処理は "async": true でバックグラウンドで走らせられます。Claude は結果を待たずに進み、処理が終わると additionalContext や systemMessage が次のターンで届きます。ただし非同期のフックは処理を止められません。止めたい対象がすでに終わっているためです。
出典: 公式リファレンス「フック ハンドラー フィールド」「プロンプト ベースのフック」「エージェント ベースのフック」「バックグラウンドでフックを実行」(2026年10月20日確認)
settings.jsonの書き方と置き場所
置き場所で効く範囲が決まる
| 置き場所 | 効く範囲 | 共有のしかた |
|---|---|---|
~/.claude/settings.json |
その PC のすべてのプロジェクト | 共有しない(PC ローカル) |
.claude/settings.json |
そのプロジェクトだけ | リポジトリにコミットして共有する |
.claude/settings.local.json |
そのプロジェクトだけ | 共有しない(gitignore の対象) |
| 管理ポリシー設定 | 組織全体 | 管理者が配布する |
プラグインの hooks/hooks.json |
プラグインが有効な間 | プラグインに同梱 |
| スキルのフロントマター | スキルを呼んだ後、セッションの残りの間 | スキルのファイルで定義 |
| サブエージェントのフロントマター | そのサブエージェントの実行中 | サブエージェントのファイルで定義 |
複数の場所にある hooks は置き換えではなく合算されます。プロジェクトの設定がユーザーの設定を消すことはありません。チームで共有したい規則は .claude/settings.json に、自分だけで使う記録用のフックは ~/.claude/settings.json に置く分け方が基本です。
構造は3階層
設定は「イベント → matcher で絞ったグループ → ハンドラーの配列」の3階層です。次は公式リファレンスにある例で、rm -rf を含む Bash コマンドを拒否する PreToolUse の設定です。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"if": "Bash(rm *)",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh",
"args": []
}
]
}
]
}
}
呼ばれるスクリプトは、標準入力の JSON からコマンドを取り出し、rm -rf を含むときだけ拒否を返します。
#!/bin/bash
# .claude/hooks/block-rm.sh
COMMAND=$(jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q 'rm -rf'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Destructive command blocked by hook"
}
}'
else
exit 0
fi
matcher の書き方
| matcher の値 | 判定 | 例 |
|---|---|---|
"*"、""、省略 |
すべてに一致 | "matcher": "*"、または matcher を書かない |
英数字、_、-、空白、,、| だけ |
完全一致。| か , で複数指定 |
Bash、Edit|Write |
| それ以外の文字を含む | JavaScript の正規表現(前後の固定なし) | mcp__memory__.*、^Edit$ |
正規表現は値のどこかに一致すれば通ります。Edit.* は NotebookEdit にも一致するので、完全に一致させたいときは ^Edit$ と書きます。matcher を持たないイベント(Stop、UserPromptSubmit など)に matcher を書いても無視されます。
ハンドラーの共通フィールド
| フィールド | 意味 |
|---|---|
type |
command、http、mcp_tool、prompt、agent のいずれか(必須) |
if |
権限ルールの構文でさらに絞る("Bash(git *)"、"Edit(*.ts)")。ツール名で絞れる5イベント(PreToolUse、PermissionRequest、PermissionDenied、PostToolUse、PostToolUseFailure)でだけ効き、1つのフックに1条件 |
timeout |
中断までの秒数 |
statusMessage |
実行中にスピナーへ出す文言 |
once |
初回の成功後にフックを外す。スキルのフロントマターでだけ有効 |
設定した hooks は、Claude Code の中で /hooks と打つと一覧できます。全部を一時的に無効にするには設定の disableAllHooks を true にします(管理ポリシーのフックは無効になりません)。
出典: 公式リファレンス「設定」の各節(2026年10月20日確認)
終了コードとJSON出力の読み方
フックは2つの経路で Claude Code に結果を伝えます。終了コードと、標準出力に書く JSON です。
終了コードは0、2、それ以外の3通り
| 終了コード | 意味 |
|---|---|
| 0 | 成功。標準出力が { で始まる JSON なら解釈して適用する。文字列だけなら、一部のイベントで Claude の文脈に足される |
| 2 | 止める。標準エラー出力の文章が理由として使われる(止められるイベントのみ) |
| それ以外 | 止めない失敗。処理は続き、エラーだけ表示される。onFailure: "block" を付けたフックは失敗でも止める |
JSON で返せる共通フィールド
| フィールド | 働き |
|---|---|
continue |
false で Claude の処理を完全に止める。イベント固有の判定より優先 |
stopReason |
continue: false のときユーザーに出す文言 |
systemMessage |
ユーザーに見せる注意書き |
terminalSequence |
デスクトップ通知やベルなどの端末制御(対話セッションのみ) |
hookSpecificOutput |
イベント固有の出力。hookEventName が必須 |
イベント固有の出力は hookSpecificOutput にまとめます。よく使うのは次の3つです。
permissionDecision(PreToolUse): allow、deny、ask、defer のいずれか。複数のフックが違う答えを返したら deny、defer、ask、allow の順で強いほうが勝つupdatedInput(PreToolUse、PermissionRequest): ツールへの入力を丸ごと差し替えるadditionalContext(多くのイベント): Claude の文脈に文章を足す。上限は10,000文字。超えると全文がファイルに保存され、Claude にはそのパスと先頭2,000文字だけが渡る
入力で受け取る共通フィールド
フックは標準入力(http ならリクエスト本体)で JSON を受け取ります。どのイベントにも session_id、transcript_path(会話ログのパス)、cwd、hook_event_name が入り、ツール系なら tool_name と tool_input、Stop なら last_assistant_message のようにイベント固有の項目が足されます。サブエージェントの中で動いたときは agent_id と agent_type も入ります。
標準出力には JSON 以外を出さないようにします。シェルの起動時メッセージが混ざるだけで JSON の解釈に失敗し、終了コード0でも「止めない失敗」として扱われます。
出典: 公式リファレンス「フック入出力」(2026年10月20日確認)
まず入れるなら、この4つ(当社の運用例)
導入の経緯は冒頭のとおりです。当社の設定は ~/.claude/settings.json に14イベントを登録したもので、組み立て方は AIデータ基盤の作り方(2/3)再現手順 に載せています。
その経験から、最初に入れる価値が高い順に4つを挙げます。
1. PreToolUse で危険なコマンドを止める
対象は Bash、条件は rm -rf や git push --force のような取り返しのつかない操作です。rm -rf については「settings.jsonの書き方と置き場所」の block-rm.sh がそのまま使え、git push --force は同じスクリプトに条件を1行足すだけです。拒否の理由は Claude に渡るので、Claude は別の方法を探します。
2. Stop で作業記録を自動保存する
Stop は応答のたびに発火し、入力の last_assistant_message に最後の応答が入ります。当社はこれをデイリーノートの決まった位置に追記しています。失敗しても会話を止めないよう、例外はログに落として終了コード0で返します。
3. SessionStart で前回の文脈を読み込ませる
additionalContext に文章を返すと、起動直後の Claude がそれを読んだ状態で始まります。当社は並行する複数の会話の直近の発言を注入し、「さっきのあれ」が別の会話でも通じるようにしています。プラグインが同じ仕組みを使うこともあり、当社の環境では Vercel のプラグインが SessionStart で自身の使い方の案内を毎回注入しています。
4. PostToolUse でフォーマッターやテストを回す
matcher を Edit|Write にし、ファイルが書かれるたびに整形やテストを走らせます。時間のかかるテストは "async": true にして Claude を待たせず、結果は次のターンで受け取ります。
書くときの約束
- 記録用のフックは、失敗しても会話を止めない(例外は捕捉してログに残し、終了コード0で返す)
- ノートやログへの書き込みは追記だけにし、既存の行を書き換えない
- スクリプトは絶対パスで指し、シェル変数は
"$VAR"のように引用符で囲む .envや鍵のファイルには触らない
出典: 当社の設定(2026年10月20日確認)、AIデータ基盤の作り方(2/3)再現手順、公式リファレンス「セキュリティ ベストプラクティス」
つまずきやすい点と制限
信頼していないフォルダのフックも動くことがある
対話セッションでは、フォルダを信頼するかの確認に応じるまで設定ファイルのフックは動きません。一方、-p で動かす非対話モードや SDK からの実行ではダイアログが出ず、リポジトリにコミットされた .claude/settings.json のフックがそのまま動きます。他人のリポジトリを claude -p で動かす前には、.claude/ の中身を確認するか、--bare で起動するか、--settings '{"disableAllHooks": true}' で無効にします。
タイムアウトの既定値はイベントで違う
command、http、mcp_tool は600秒、prompt は30秒、agent は60秒です。ただし UserPromptSubmit、PreModelSwitch、PostModelSwitch では command、http、mcp_tool も30秒、MessageDisplay は10秒に下がります。SessionEnd は全フックで1.5秒の予算を共有し、個別に timeout を書くと最大60秒まで延びます。
PreToolUse は @ 指定のファイル読み込みでは発火しない
プロンプトに @ファイル名 と書いた読み込みは、ツール呼び出しではないので PreToolUse を通りません。ファイルの読み取りを hooks で守るつもりなら、この抜け道を前提に設計します。公式リファレンスは回避策として環境変数 CLAUDE_CODE_DISABLE_FILE_MENTIONS=1 を挙げています。
止めたプロンプトは消えない
UserPromptSubmit でプロンプトを止めても、原文は、止めたときに表示されるメッセージと、ディスク上の会話ログに残ります。suppressOriginalPrompt は、表示されるメッセージから原文を外すだけです。機密情報の流出防止を hooks で止めることに頼るわけにはいきません。
非同期フックは -p では終了時に打ち切られる
"async": true のフックの結果が届くのは、セッションが動いている間だけです。非対話モードでは、セッション終了時にまだ走っている非同期フックは強制終了されます。セッションより長く続けたい処理は、フックから切り離した別プロセスとして起動します。
Windows の PowerShell では変数の書き方に注意
PowerShell のフックで $CLAUDE_PROJECT_DIR と裸で書くと、未定義の変数として $null になります。${CLAUDE_PROJECT_DIR} か $env:CLAUDE_PROJECT_DIR を使います。
動かないときの調べ方
まず /hooks で読み込まれているかを見ます。次に claude --debug で起動すると、ログが ~/.claude/debug/<session-id>.txt に出ます。v2.1.296 以降は、フックごとに Hooks: PostToolUse:Write [...] finished with status 0 (31ms) のような1行が残り、遅いフックも見つけられます。
出典: 公式リファレンス「セキュリティに関する考慮事項」「タイムアウト」「フックをデバッグ」(2026年10月20日確認)
よくある質問
hooks を使うと料金はかかりますか?
command、http、mcp_tool のフックは Claude のモデルを呼ばないので、フック自体は Claude の利用枠を使いません。ただし additionalContext で足した文章は次の呼び出しの入力に含まれます。prompt と agent はモデルを呼びます。agent は最大50ターン動くので、頻繁に発火するイベントには向きません。
CLAUDE.md に書くのと何が違いますか?
CLAUDE.md は Claude が読む指示で、従うかどうかは Claude の判断です。hooks はプログラムが実行するので、Claude の判断を介さずに動きます。「毎回起こしたいこと」は hooks、「状況に応じて判断してほしいこと」は CLAUDE.md に書きます。
チームで共有するにはどこに書きますか?
プロジェクトの .claude/settings.json に書いてコミットします。個人の PC だけで動かしたいものは ~/.claude/settings.json か .claude/settings.local.json です。
サブエージェントの中でも動きますか?
動きます。設定ファイル、管理ポリシー、プラグインのフックはサブエージェントの中でも発火し、入力に agent_id と agent_type が入るので、本体の会話と区別できます。
プラグインやスキルにも hooks を持たせられますか?
持たせられます。プラグインは hooks/hooks.json、スキルとサブエージェントはフロントマターに書きます。スキルのフックは once: true で初回だけ動かせます。
設定したのに動かないときはどこを見ますか?
まず /hooks に出ているかを確かめます。出ていなければ、フォルダの信頼、JSON の構文、置き場所を疑います。出ているのに動かないなら claude --debug のログで matcher の一致を見ます。終了コード0で JSON を返しているのに効かないときは、標準出力に JSON 以外の文字が混ざっていないかを確かめます。
MCP と hooks はどう違いますか?
MCP は Claude に新しいツール(外部サービスの操作など)を与える仕組みで、使うかどうかは Claude が決めます。hooks は Claude の動作の前後に処理を挟む仕組みで、Claude の判断を待ちません。両者は組み合わせられ、mcp_tool 形式を使えば、フックから MCP のツールを呼べます。
関連リンク
- AIデータ基盤の作り方(2/3)再現手順: 当社の Stop、PreCompact、SessionStart の hooks と Obsidian の組み合わせ
- AI事業(AIコーチング、週次AIリサーチ): 当社の AI 導入支援
- お問い合わせ: hooks や作業記録の自動化のご相談
- 公式ドキュメント: フック リファレンス、フック ガイド(2026年10月20日確認)
Obsidian 連携や Claude Fable 5.1 の記事など、関連する他のリサーチはこの下の一覧にあります。