はじめに
Claude Codeには、動作をカスタマイズするための「Hooks」と「Plugins」という機能があります。
- Hooks: Claude Codeのライフサイクルに介入してシェルコマンドを実行
- Plugins: Hooks、スラッシュコマンド、MCPサーバーをパッケージ化して共有
本記事では、これらの機能の仕組み、設定方法、活用例について解説します。
対象読者:
- Claude Codeを深くカスタマイズしたい方
- チームで設定を共有したい方
- 品質チェックやワークフローを自動化したい方
Hooksとは
Hooksは、Claude Codeの特定のタイミングで自動実行されるシェルコマンドです。
「if this, then that」のルールをClaude Codeに設定できると考えてください。
Hook Types(フックの種類)
| Hook | タイミング | 用途例 |
|---|---|---|
PreToolUse |
ツール実行前 | 実行をブロック、バリデーション |
PostToolUse |
ツール実行後 | ログ記録、後処理 |
Notification |
通知発生時 | 外部サービス連携 |
Stop |
応答完了時 | 最終チェック、レポート生成 |
PermissionRequest |
権限確認時 | 自動許可/拒否 |
動作フロー例
ユーザー: 「このファイルを編集して」
↓
[PreToolUse Hook] → 編集前チェック(lint等)
↓
Claude: Editツール実行
↓
[PostToolUse Hook] → 編集後処理(テスト実行等)
↓
完了
Hooksの設定方法
設定ファイルの場所
Hooksは以下の設定ファイルに記述します。
| ファイル | 用途 |
|---|---|
~/.claude/settings.json |
ユーザー設定(全プロジェクト共通) |
.claude/settings.json |
プロジェクト設定(Git管理可能) |
.claude/settings.local.json |
ローカル設定(Git除外推奨) |
基本構文
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"command": "echo 'Editing file: $FILE_PATH'"
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"command": "npm run lint --fix"
}
]
}
}
matcherの書き方
| パターン | 説明 |
|---|---|
"Edit" |
Editツールに完全一致 |
"Edit|Write" |
EditまたはWrite |
"Notebook.*" |
Notebookで始まるツール全て |
".*" |
全ツール |
matcherは正規表現をサポートしています。
実践的なHooks活用例
1. TDD Guard(テスト駆動開発の強制)
ファイル変更時にテストが通らなければブロックします。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"command": "npm test || exit 1"
}
]
}
}
exit 1 を返すとツール実行がブロックされます。
2. 自動フォーマット
編集後に自動でコードフォーマットを実行します。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"command": "prettier --write $FILE_PATH"
}
]
}
}
3. Slack通知
長時間タスク完了時にSlackに通知します。
{
"hooks": {
"Stop": [
{
"matcher": ".*",
"command": "curl -X POST -H 'Content-type: application/json' --data '{\"text\":\"Claude Code task completed\"}' $SLACK_WEBHOOK_URL"
}
]
}
}
4. TypeScript型チェック
TypeScriptファイル編集時に型チェックを実行します。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"command": "if [[ $FILE_PATH == *.ts ]]; then npx tsc --noEmit; fi"
}
]
}
}
Pluginsとは
Pluginsは、Hooks、スラッシュコマンド、MCPサーバーをパッケージ化して配布・共有できる機能です。2026年1月現在、Public Betaとして提供されています。
Pluginに含められるもの
Plugin
├── Hooks(自動実行コマンド)
├── Slash Commands(/で始まるコマンド)
├── MCP Servers(外部ツール連携)
└── Subagents(サブエージェント定義)
Pluginのインストール
Claude Code内で /plugin コマンドを使用します。
/plugin install <plugin-name-or-url>
公開されているPlugin例
| Plugin | 機能 |
|---|---|
| GitButler Hooks | GitButler連携のHooks集 |
| TDD Guard | テスト駆動開発支援 |
| TypeScript Quality | TypeScript品質チェック |
| claude-hooks | TypeScriptベースのHooks管理 |
カスタムスラッシュコマンドの作成
スラッシュコマンドは、.claude/commands/ フォルダにMarkdownファイルを配置することで作成できます。
ディレクトリ構造
.claude/
└── commands/
├── test.md → /test コマンド
├── deploy.md → /deploy コマンド
└── review.md → /review コマンド
コマンドファイルの書き方
このプロジェクトのテストを実行してください。
1. `npm test` を実行
2. 失敗したテストがあれば原因を分析
3. 修正案を提示
引数: $ARGUMENTS
$ARGUMENTS で、コマンド実行時の引数を受け取れます。
例: /test --coverage → $ARGUMENTS = --coverage
注意点・落とし穴
1. Hook実行タイムアウト
Hookのデフォルトタイムアウトは60秒から10分に変更されました。長時間のビルドやテストにも対応可能です。
2. 無限ループに注意
PostToolUseでファイルを変更すると、再度Hookがトリガーされる可能性があります。
// NG: 無限ループの可能性
{
"PostToolUse": [{
"matcher": "Edit",
"command": "prettier --write $FILE_PATH" // これがEditをトリガー
}]
}
対策: 外部コマンド(prettier等)での変更はHookをトリガーしないため、通常は問題ありません。ただし、スクリプト内でClaude Codeを呼び出す場合は注意が必要です。
3. セキュリティ
Hooksは任意のシェルコマンドを実行できるため、以下に注意してください。
- プロジェクトの
.claude/settings.jsonは内容を確認してからプルする - 環境変数で機密情報を渡す場合は
settings.local.jsonを使用 - 外部Pluginはソースコードを確認してからインストール
4. 環境依存
Hooksで使用するコマンドがチームメンバー全員の環境に存在するか確認してください。
// 環境依存の例
{
"command": "brew install something" // macOS限定
}
まとめ
- Hooksは、Claude Codeのライフサイクルに介入するカスタマイズ機能
- PreToolUseでブロック、PostToolUseで後処理、Stopで完了時処理
- PluginsでHooks、コマンド、MCPサーバーをパッケージ化して共有
- カスタムスラッシュコマンドで頻繁な操作を簡略化
- セキュリティと環境依存に注意
Hooks & Pluginsを活用することで、チームの開発ワークフローを標準化し、品質を自動で担保できます。まずは簡単なHookから試してみてください。
参考リンク
- Hooks reference | Claude Code Docs
- A complete guide to hooks in Claude Code | eesel.ai
- Customize Claude Code with plugins | Anthropic
- awesome-claude-code | GitHub
- claude-code-hooks-mastery | GitHub
- claudekit | GitHub
Claude Codeをさらに活用したい方へ
Hooks & Pluginsをさらに活用するClaude Code Skillsを公開しています。