
シリーズ: Claudeで変わる仕事術 中級・第4弾 / 前回:中級・第3弾 SubAgentで仕事を分業させる
前回は、SubAgentで仕事を並列に動かす方法を扱った。
タイトルチェック、本文チェック、SNS投稿文の作成。 3つを同時に走らせて、全部終わったら結果が返ってくる。
これでかなり速くなった。
でも、まだ問題が残っている。
人間は忘れる。
作業が終わったら差分を見る。 文章なら誤字を確認する。 コードならテストを実行する。 公開前ならリンクを確認する。
分かっている。 でも、忙しいと忘れる。
そこで出てくるのが、Hookだ。
Hookは、ざっくり言えば、
あるタイミングで自動的に動く確認ルール
Claude Codeに作業を任せるなら、確認も人間の記憶だけに頼らない。
今回のテーマは、「うっかり」を仕組みで防ぐ方法だ。
1. Hookとは何か
Hookという言葉は、少し技術っぽい。
でも考え方はシンプルだ。
何かが起きたときに、自動で別の処理を走らせる仕組み。
たとえば、
- ファイルを編集したら、整形チェックを走らせる
- コマンドを実行する前に、危険な操作ではないか確認する
- 作業が終わったら、テストや確認項目を表示する
- セッションが終わったら、作業ログを記録する
こういうものだ。
人間で言えば、チェックリストを壁に貼るのではなく、 作業のタイミングで自動的にチェックリストが出てくる感覚に近い。

2. SkillとHookの違い
前々回のSkillと混ざりやすいので、ここで整理する。
| 仕組み | 役割 | 例 |
|---|---|---|
| Skill | 作業の進め方をまとめる | 記事レビュー、議事録整理、週報作成 |
| Hook | あるタイミングで自動確認する | 編集後チェック、危険操作ブロック、テスト実行 |
Skillは「この仕事はこう進めて」。
Hookは「このタイミングでは必ずこれを確認して」。
たとえば記事制作なら、
- Skill:記事レビューの手順
- Hook:公開前にリンク切れや未確認メモをチェック
という分担になる。
Skillは仕事の型。 Hookは安全装置。

3. Hookが動くタイミング
Claude Codeには、Hookを差し込めるポイントがいくつかある。
| タイミング | 意味 | よく使う用途 |
|---|---|---|
UserPromptSubmit | 自分がメッセージを送った直後 | — |
PreToolUse | ツールを実行する直前 | 危険操作ブロック |
PostToolUse | ツール実行が完了した直後 | 整形チェック・ログ記録 |
Stop | セッション終了直前 | 作業ログ保存・通知 |
Notification | Claudeが通知を出すとき | 外部通知連携 |
SessionStart | 新しいセッション開始時 | 初期化 |
SessionEnd | セッション完全終了時 | ログ保存・同期 |
PreCompact | コンテキスト圧縮の直前 | 圧縮前チェック |
SubagentStop | SubAgentが完了したとき | 完了通知・結果回収 |
4. Hookの設定方法
/hooksコマンドで設定する
Claude Codeのターミナルで、次を入力する。
/hooks
設定できるトリガー一覧が表示される。

たとえば、PostToolUse(ツール実行後)を選び、
- 対象:
Write(ファイル書き込み) - 実行するコマンド:
echo hooktest >> hook-simple-test.txt
という形で設定できる。
保存スコープも選べる。
| スコープ | 意味 |
|---|---|
| ユーザーレベル | 自分のPC全体で有効。どのプロジェクトでも動く |
| プロジェクトレベル | このプロジェクトだけ有効。チームで共有できる |
| ローカル・プロジェクトレベル | このマシンのこのプロジェクトだけ。チームには共有しない |
個人でよく使うチェックはユーザーレベル。 チームで揃えたいルールはプロジェクトレベル。
設定ファイルの場所
Hookの設定は、スコープに応じて2種類のファイルに書かれる。
| スコープ | ファイルの場所 |
|---|---|
| ユーザーレベル | ~/.claude/settings.json |
| プロジェクトレベル | {プロジェクトフォルダ}/.claude/settings.json |
ユーザーレベルは自分のPC全体で有効。プロジェクトレベルはそのフォルダ内だけで動き、チームで共有できる。
基本的な形はこうだ。
{
"hooks": {
"イベント名": [
{
"matcher": "対象ツール名",
"hooks": [
{
"type": "command",
"command": "実行するコマンド"
}
]
}
]
}
}
Claude Codeに「こういうHookを設定して」と頼めば、このファイルを直接編集してくれる。
matcher には、Claude Codeが持つツール名を指定する。よく使うものは次のとおりだ。
| matcher値 | 対応する操作 |
|---|---|
Write | ファイルの新規作成 |
Edit | ファイルの編集 |
Read | ファイルの読み込み |
Bash | シェルコマンドの実行 |
WebFetch | URLへのアクセス |
WebSearch | Web検索 |
Task | SubAgentの起動 |
Write|Edit のようにパイプでOR指定もできる。全ツールを対象にしたいときは .* と書く。
5. Hookが効く場面
Hookは何でも自動化するためのものではない。
向いているのは、忘れると困る確認だ。
| 場面 | Hookで防げること |
|---|---|
| ファイル編集後 | 整形漏れ、不要な空白、形式崩れ |
| コード修正後 | テスト未実行、型チェック忘れ |
| 記事公開前 | リンク切れ、画像未設定、下書きメモの残り |
| 危険なコマンド前 | 誤削除、意図しない上書き |
| セッション終了時 | 作業ログの未記録 |
逆に、毎回判断が変わるものはHookに向かない。
「この記事のトーンが読者に合っているか」は人間の判断が必要だ。
でも、「TODOという文字が残っていないか」は自動で見られる。
6. よく使うHookレシピ3つ
レシピのスクリプトはClaude Codeに頼んで作ってもらえる。たとえば「このコードを ~/.claude/hooks/web-access-log.py に保存して」と伝えるだけでいい。フォルダがなければ一緒に作ってくれる。
なお、settings.json の command 欄でスクリプトのパスを指定するとき、~ はシェルで展開されない場合がある。$HOME を使うと確実だ。
レシピ1:特定のサイトへのアクセスをログに残す
Claude Codeが外部URLにアクセスするとき(WebFetch ツール)、どのサイトを参照したかを記録する。
たとえば、作業中に参照したサイトを後から確認したいときに使える。
~/.claude/hooks/web-access-log.py として保存する。
import json, sys, os
from datetime import datetime
data = json.load(sys.stdin)
url = data.get("tool_input", {}).get("url", "")
# 記録したいサイトを指定する
TARGET_SITES = ["github.com", "notion.so", "qiita.com"]
for site in TARGET_SITES:
if site in url:
log_path = os.path.expanduser("~/claude-web.log")
with open(log_path, "a") as f:
f.write(f"{datetime.now()} アクセス: {url}\n")
break
settings.json にはこう書く。
{
"hooks": {
"PostToolUse": [
{
"matcher": "WebFetch",
"hooks": [
{
"type": "command",
"command": "python3 $HOME/.claude/hooks/web-access-log.py"
}
]
}
]
}
}
TARGET_SITES のリストに加えたサイトへのアクセスだけが記録される。全サイトを記録したければ、リストの条件を外せばいい。

本当に動いているか確認するには、Claude Codeにいずれかのサイトを参照させてから次を実行する。
cat ~/claude-web.log
アクセス日時とURLが記録されていれば成功だ。
junli@Juns-MacBook-Pro Wiki % cat ~/claude-web.log
2026-06-20 21:30:09.833499 アクセス: https://qiita.com/utanesuke/items/573cb09959f84965917c
レシピ2:プロジェクト外への書き込みをブロックする
Claude Codeが現在のプロジェクトフォルダの外にファイルを書こうとしたとき、止める。
意図しないフォルダへの書き込みを防ぐ安全装置として使える。
~/.claude/hooks/block-outside-project.py として保存する。
import json, sys, os
data = json.load(sys.stdin)
path = data.get("tool_input", {}).get("file_path", "")
if path:
abs_path = os.path.abspath(path)
cwd = os.getcwd()
if os.path.commonpath([abs_path, cwd]) != cwd:
print(f"プロジェクト外への書き込みをブロックしました: {path}", file=sys.stderr)
sys.exit(2)
settings.json にはこう書く。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "python3 $HOME/.claude/hooks/block-outside-project.py"
}
]
}
]
}
}
exit 2 を返すことでツールの実行が止まり、Claudeにブロックした旨が伝わる。
確認するには、Claude Codeにプロジェクト外のパスにファイルを書くよう指示してみる。ブロックメッセージが表示されれば動いている。

レシピ3:特定のファイルが作成されたらSlackに通知する
Claude Codeが特定のパターンに合うファイルを書き込んだとき、Slackに通知する。
たとえば、レポートや成果物ファイルが完成したタイミングで、チームに自動で知らせる使い方ができる。
~/.claude/hooks/slack-notify.py として保存する。
import json, sys, os, subprocess
data = json.load(sys.stdin)
path = data.get("tool_input", {}).get("file_path", "")
filename = os.path.basename(path)
# 通知したいファイルのパターンを指定する
NOTIFY_PATTERNS = ["-report.md", "-output.md", "summary.md"]
for pattern in NOTIFY_PATTERNS:
if filename.endswith(pattern):
webhook_url = os.environ.get("SLACK_WEBHOOK_URL", "")
if webhook_url:
message = {"text": f"ファイルが作成されました: {path}"}
subprocess.run([
"curl", "-s", "-X", "POST",
"-H", "Content-type: application/json",
"--data", json.dumps(message),
webhook_url
])
break
settings.json にはこう書く。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python3 $HOME/.claude/hooks/slack-notify.py"
}
]
}
]
}
}
NOTIFY_PATTERNS に通知したいファイル名の末尾パターンを書く。
SLACK_WEBHOOK_URL の取得と設定は次の手順で行う。
SlackワークスペースでIncoming Webhookを作成する(Slack公式の「Incoming Webhooks」アプリから追加できる)

発行されたWebhook URLをコピーする


~/.zshrc または ~/.bashrc に次を追記して保存する
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/xxx/yyy/zzz"
ターミナルを再起動するか source ~/.zshrc を実行して反映させる
ただし、VS CodeやデスクトップアプリからClaude Codeを起動する場合、.zshrc が読まれず環境変数が渡らないことがある。確実に動かすには、settings.json の env にも書いておく。
{
"env": {
"SLACK_WEBHOOK_URL": "https://hooks.slack.com/services/xxx/yyy/zzz"
},
"hooks": {
"PostToolUse": [ ... ]
}
}
確認するには、対象パターンのファイルをClaude Codeに作らせてみる。Slackに通知が届けば成功だ。


「気付かない裏で動いている」からこそ、Hookは強力だ。
7. Hookでやりすぎない
Hookは便利だ。
でも、やりすぎると仕事が重くなる。
ファイルを1文字直すたびに重いチェックが走ったら、作業にならない。
Hookに入れるものは、軽くて明確な確認から始める。
| 段階 | 内容 |
|---|---|
| 1 | 危険操作を止める |
| 2 | TODOや要確認の残りを検出する |
| 3 | フォーマットや簡単なチェックを走らせる |
| 4 | 必要に応じてテストを走らせる |
最初から全部やらない。
「これだけは忘れると困る」というものから入れる。
また、Hookはまず「検出」でいい。勝手に直すより、「ここを確認してください」と出す方が安全なことも多い。
8. Claude Codeに頼むときのテンプレート
Hookを作るときは、このテンプレートが使いやすい。
Claude Codeで使うHookを設計したいです。
目的:
- 〇〇を防ぎたい
動かしたいタイミング:
- 〇〇の前 / 後
チェックしたいこと:
- 〇〇
- 〇〇
条件:
- 作業の邪魔にならないように軽くする
- いきなり設定ファイルを変更せず、まず設計案を出す
- 危険な操作がある場合は、実行前に確認する
出力:
- Hookの目的
- 動かすタイミング
- チェック内容
- 注意点
- 実装する場合の設定案
大事なのは、
いきなり設定ファイルを変更せず、まず設計案を出す
を入れること。
Hookは自動化なので、慎重に作る。
9. Hookは「自分への注意」を仕組みにする
Hookを使うとき、私はこう考えている。
Hookは、Claudeを縛るためだけのものではない。自分のうっかりを減らすためのもの。
たとえば、記事を書いているとき。
「あとでリンクを確認しよう」と思って、そのまま忘れる。
「画像はあとで差し替えよう」と思って、そのまま公開前まで行ってしまう。
これは誰にでもある。
Hookは、そういう「あとでやる」を拾ってくれる。
人間の集中力を信用しすぎない。 仕組みに任せる。
これが中級の考え方だ。

次回は、Claude Codeの仕事場をさらに広げる。
テーマはMCP。
初級では「つなぐ」を体験した。 中級では、「何をつなぎ、何はつながないか」を考えていく。
今日から試せる一歩
まず1つだけやってみる。
Claude Codeを開いて、ターミナルに次を入力する。
/hooks
「PostToolUse」を選び、「Write」ツールの後にログが残るHookを1つ設定してみる。

設定が面倒なら、Claude Codeに「Writeツールが動いたあとに、日時と"ファイルを変更した"という文字をログファイルに記録するHookを設定して」と頼めばいい。
1つ動くと、「次はこれを確認させよう」というアイデアが出てくる。
Hookは、小さく始めた方が長続きする。