🪝

Claude Code Hooks 機能で作業終了時に通知を鳴らしてみる。

に公開

はじめに

Claude Code(claude.ai/code)に新しく「Hooks」機能が追加されました。この機能を使うと、Claude Code の各種イベントに対して任意のシェルコマンドを実行でき、開発ワークフローを自由にカスタマイズできます。

本記事では、Hooks 機能の概要と設定方法をドキュメントを見てざっくり理解した内容の共有と、簡単な例としてセッション終了時に通知音を鳴らす実装を紹介します。

Claude Code Hooks とは

Hooks は、Claude Code のライフサイクル中の特定のイベントに対して、自動的にシェルコマンドを実行する機能です。これにより、以下のような自動化が可能になります:

  • ファイル編集後の自動フォーマット
  • コマンド実行履歴のログ記録
  • 危険なコマンドの実行前確認
  • カスタム通知の送信

設定ファイルの配置場所

Hooks の設定は以下の3つの場所に配置でき、優先順位は次の通りです:

  1. .claude/settings.local.json - ローカル設定(gitignore推奨)
  2. .claude/settings.json - プロジェクト設定(チームで共有)
  3. ~/.claude/settings.json - ユーザー設定(全プロジェクトに適用)

設定項目の説明

基本的な設定ファイル構造

{
  "hooks": {
    "EventName": [
      {
        "matcher": "ToolPattern",
        "hooks": [
          {
            "type": "command",
            "command": "実行するコマンド"
          }
        ]
      }
    ]
  }
}

イベントの種類

Claude Code Hooks では、以下の4つのイベントをサポートしています:

1. PreToolUse

  • 実行タイミング: ツール実行前
  • 用途: 権限チェック、パラメータ検証、実行の可否判定
  • 特徴: decision を返すことで、ツールの実行を制御可能

2. PostToolUse

  • 実行タイミング: ツール実行成功後
  • 用途: 自動フォーマット、ログ記録、後処理
  • 特徴: ツールの実行結果を受けて追加処理を実行

3. Notification

  • 実行タイミング: Claude Code が通知を生成した時
  • 用途: カスタム通知システムとの連携
  • 特徴: システム通知と連携して視覚的なフィードバックを提供

4. Stop

  • 実行タイミング: Claude Code が応答を終了しようとする時
  • 用途: 追加のタスク実行、終了条件の制御
  • 特徴: 終了をブロックして追加作業を促すことも可能

Matcher の設定方法

Matcher は、どのツールに対して Hook を実行するかを指定します:

# 完全一致
"Write"              # Writeツールのみ

# OR条件
"Edit|Write"         # EditまたはWrite

# 正規表現
"Notebook.*"         # Notebookで始まる全て

# ワイルドカード
"mcp__*__write*"     # MCPツールのwrite系

# 全てのイベント
""                   # 空文字列は全てにマッチ

簡単な例:セッション終了時に通知音を鳴らす

Claude Code を使っていると、AI がタスクを完了したタイミングが分かりにくいことがありますよね。じっとみてるのも時間もったいない気がする、そこでHooks を使ってセッション終了時に通知音を鳴らすことで、この問題を解決しようと思います。
公式で音を鳴らす設定方法あるみたいですが、なんでか上手く動かんのでHooks利用したら上手くいくようになりました。

macOS での実装(動作確認済み)

~/.claude/settings.json に以下の設定を記述します:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "afplay /System/Library/Sounds/Glass.aiff"
          }
        ]
      }
    ]
  }
}

この設定では、Stop イベント(Claude Code が応答を終了するタイミング)で macOS のシステムサウンドを再生してくれます。
上記の設定は macOS でのafplay コマンドを使用しています。afplay は macOS に標準搭載されている音声再生コマンドです。

使用できるシステムサウンド

macOS のシステムサウンドは /System/Library/Sounds/ ディレクトリにあります:

  • Glass.aiff - ガラスの音(軽い通知音)
  • Hero.aiff - ヒーローサウンド(成功音)
  • Ping.aiff - ピン音
  • Pop.aiff - ポップ音
  • Sosumi.aiff - 警告音

その他のOSでの実装

他のOSの設定も一応書くのですが、私の環境はMacOSなので動作確認できてません。。

Linux

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "paplay /usr/share/sounds/freedesktop/stereo/complete.oga"
          }
        ]
      }
    ]
  }
}

Windows

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "powershell -c \"[System.Media.SystemSounds]::Beep.Play()\""
          }
        ]
      }
    ]
  }
}

設定の確認方法

設定が正しく動作するか確認するには:

  1. ~/.claude/settings.json に設定を保存
  2. Claude Code で簡単なタスクを実行
  3. タスク完了時に通知音が鳴ることを確認
# 設定ファイルの確認
cat ~/.claude/settings.json

# Claude Code でテスト
claude "What is 2 + 2?"
# 回答後に通知音が鳴るはず

まとめ

Claude Code の Hooks 機能を使えば、セッション完了時に通知音を鳴らす以外にもいろんなことができるようになります。前述にもありましたが、編集時、新規作成時にフォーマットするとか、rmを実行しようとしたときに警告するとか。あとはSlackに通知とかもできるみたいですね!
アップデートが激しいAI Agent界隈ですが、頑張ってキャッチアップしていきましょう。
ではでは。

参考リンク

Discussion