結論: CLAUDE.mdの真の力は「基本設定」ではなく、hooksによる自動品質保証・MCPによるツール統合・サブエージェント設計の組み合わせにあります。この3つを組み合わせると、Claude Codeは「AIアシスタント」から「自律的に動くチームメンバー」に変わります。
この記事の要点:
- hooksは14種類のライフサイクルイベントをトリガーにできる。PreToolUseで全ツール実行を制御可能
- MCPをCLAUDE.mdと組み合わせるとSlack・Jira・GitHub・DBを自然言語で操作できる
- サブエージェントに専門役割を持たせると、1人の人間が5人分の仕事を並列で回せる
対象読者: CLAUDE.mdの基本設定は済んでいて、さらに深く使いこなしたいエンジニア・技術系マネージャー
読了後にできること: PreToolUseフックを書いてClaude Codeが特定コマンドを実行する前に承認確認を入れる
「CLAUDE.mdに書いても、Claudeが同じことを何度も聞いてくる」
Claude Code研修で一番よく出るこの悩み、実はCLAUDE.mdの構造的な問題ではなく「hookを使っていない」ことが原因です。先日、ある開発会社のCTOから「テストを書かずにコードをコミットしようとするClaudeをどう止めるか」と相談されました。答えはシンプルで、PreToolUseフックでBashツールのコミットコマンドを監視し、テストが未実行なら自動でブロックする設定を追加するだけです。
実際に設定したら、「レビューなしのコミット」が翌週からゼロになりました。CLAUDE.mdに「必ずテストを実行してから」と書くのと、hooksで強制するのでは、信頼性が全く違います。LLMへの「お願い」ではなく、コードとして実行される「ルール」になるからです。
この記事では、CLAUDE.md × hooks × MCP × サブエージェントの連携設計を、コピペで使えるサンプル付きで全公開します。
まず試したい「5分即効」設定3選
即効設定1:PreToolUseフックで危険コマンドをブロック
Claude Codeが予期せずrm -rfやgit push --forceを実行するリスクをゼロにします。
# ~/.claude/hooks/dangerous-command-check.sh
#!/bin/bash
# Claude Codeが実行しようとするコマンドをチェック
TOOL_INPUT="$1"
DANGEROUS_PATTERNS="rm -rf|git push --force|drop table|DELETE FROM.*WHERE.*1=1"
if echo "$TOOL_INPUT" | grep -qiE "$DANGEROUS_PATTERNS"; then
echo "DENY: 危険なコマンドを検出しました。実行前に確認が必要です。"
echo "コマンド: $TOOL_INPUT"
exit 1 # exit 1でClaudeの実行をブロック
fi
exit 0 # exit 0で実行を許可このスクリプトをCLAUDE.mdから参照する設定:
# ~/.claude/CLAUDE.md への追記例
## フック設定
危険なコマンドは実行前に必ずチェックすること。
hooks設定: ~/.claude/settings.json の hooks.PreToolUse を参照。
不足している情報があれば、最初に質問してから作業を開始してください。// ~/.claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/dangerous-command-check.sh "$TOOL_INPUT""
}
]
}
]
}
}効果: 顧問先で設定後、Claude Codeによる意図しない本番DBのデータ削除リスクをゼロに(研修での実証: 2026年2月〜3月、3社で検証)
即効設定2:PostToolUseフックでコード品質を自動チェック
Claude Codeがファイルを編集するたびに自動でlintを走らせる設定です。
// ~/.claude/settings.json に追加
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "npx eslint "$TOOL_OUTPUT_FILE" --fix --quiet 2>/dev/null || true"
}
]
},
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "npx prettier --write "$TOOL_OUTPUT_FILE" 2>/dev/null || true"
}
]
}
]
}
}即効設定3:SessionStartフックで毎回必ずコンテキストを確認
新しいセッションを開始するたびに、プロジェクトの状態(git status、テスト結果)を自動で取得させます。
# ~/.claude/hooks/session-start.sh
#!/bin/bash
echo "=== セッション開始チェック ==="
echo "### Git Status"
git status --short 2>/dev/null || echo "(gitリポジトリではありません)"
echo ""
echo "### 最新コミット(5件)"
git log --oneline -5 2>/dev/null || echo "(コミットなし)"
echo ""
echo "### テスト状態"
if [ -f "package.json" ]; then
echo "npm test を実行してください(このスクリプトは確認のみ)"
fi
echo "========================"CLAUDE.md高度設定は”3つのレイヤー”で考える
| レイヤー | 要素 | 制御の強さ | 難易度 |
|---|---|---|---|
| L1: テキスト指示 | CLAUDE.md本文 | 弱(LLMへのお願い) | 低 |
| L2: 実行制御 | Hooks(14種) | 強(コードで強制) | 中 |
| L3: ツール統合 | MCP サーバー | 最強(外部APIと直結) | 中〜高 |
L1だけで頑張ろうとするのが最も多い失敗パターンです。「CLAUDE.mdに書いても守ってくれない」という悩みは、L2・L3を使えば大半は解決します。
Claude Codeの全体像についてはAIエージェント導入完全ガイドもあわせてどうぞ。
Hooksの全14イベントと実用例
最重要の4イベント
| イベント | タイミング | 主な用途 |
|---|---|---|
| PreToolUse | ツール実行直前 | 危険コマンドブロック、権限チェック |
| PostToolUse | ツール実行直後 | 自動lint/format、ログ記録 |
| SessionStart | セッション開始時 | コンテキスト取得、環境変数確認 |
| Stop | セッション終了時 | 最終確認、レポート生成 |
よくある実用パターン5選
パターン1:テスト必須ガード(コミット前)
# 実装例: Bashツールでgit commitを実行しようとしたらテスト確認を強制
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"condition": {
"inputContains": "git commit"
},
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/require-tests.sh"
}
]
}
]
}
}# require-tests.sh
#!/bin/bash
# テスト結果ファイルが存在するか確認
if [ ! -f ".test-results/latest.json" ]; then
echo "DENY: テストを実行してから git commit してください"
exit 1
fi
LAST_RUN=$(cat .test-results/latest.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('timestamp',''))")
echo "最後のテスト実行: $LAST_RUN"
exit 0パターン2:コスト監視フック(API呼び出し記録)
# PostToolUseで全ツール実行をログに記録
{
"hooks": {
"PostToolUse": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "echo "$(date '+%Y-%m-%d %H:%M:%S') TOOL:$TOOL_NAME" >> ~/.claude/usage.log"
}
]
}
]
}
}パターン3:ファイル変更の自動バックアップ
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'FILE="$TOOL_INPUT_FILE"; [ -f "$FILE" ] && cp "$FILE" "${FILE}.bak.$(date +%s)" || true'"
}
]
}
]
}
}パターン4:セキュリティ監査フック(機密ファイルへのアクセス記録)
# .env, credentials, secretなどの機密ファイルへのアクセスをアラート
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read",
"condition": {
"inputMatchesPattern": ".*(.env|credentials|secret|password).*"
},
"hooks": [
{
"type": "command",
"command": "bash -c 'echo "[SECURITY ALERT] $(date) 機密ファイルへのアクセス: $TOOL_INPUT_FILE" >> ~/.claude/security-audit.log && echo "NOTIFY: 機密ファイルへのアクセスを記録しました"'"
}
]
}
]
}
}パターン5:PostToolUseでSlack通知(長時間タスク完了時)
# Stop イベントでセッション終了時にSlack通知
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "bash ~/.claude/hooks/notify-slack.sh"
}
]
}
]
}
}# notify-slack.sh
#!/bin/bash
SLACK_WEBHOOK="$SLACK_WEBHOOK_URL"
MESSAGE="Claude Codeセッション完了: $(pwd) | $(date '+%H:%M')"
if [ -n "$SLACK_WEBHOOK" ]; then
curl -s -X POST -H 'Content-type: application/json'
--data "{"text":"$MESSAGE"}"
"$SLACK_WEBHOOK" > /dev/null
fiMCP連携の高度な設定
企業でのClaude Code活用で最も威力を発揮するのがMCP(Model Context Protocol)との連携です。研修先のCTOが「これを知ってたら半年前から使い倒してた」と言っていた設定を紹介します。
代表的なMCPサーバーと用途
| MCPサーバー | できること | 設定難易度 |
|---|---|---|
| GitHub MCP | PR作成・レビュー・Issue管理を自然言語で | 低 |
| Jira MCP | チケット作成・ステータス更新 | 中 |
| Slack MCP | チャンネルへの投稿・DM送信 | 中 |
| PostgreSQL MCP | DBクエリをSQLなしで実行 | 中 |
| Google Drive MCP | ドキュメント読み取り・作成 | 中 |
| Figma MCP | デザイントークン取得・コンポーネント確認 | 高 |
MCPの設定例(GitHub + Slack)
// .claude/mcp.json(プロジェクト固有のMCP設定)
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-github"],
"env": {
"GITHUB_TOKEN": "$GITHUB_TOKEN"
}
},
"slack": {
"command": "npx",
"args": ["-y", "@anthropic/mcp-server-slack"],
"env": {
"SLACK_BOT_TOKEN": "$SLACK_BOT_TOKEN",
"SLACK_TEAM_ID": "$SLACK_TEAM_ID"
}
}
}
}CLAUDE.mdでMCPツールの使い方を指定する
# .claude/CLAUDE.md(プロジェクトレベル)
## ツール利用ルール
### GitHubとの連携
- コードレビューを依頼されたらgithub MCPでPRの差分を取得すること
- バグ報告を受けたらgithub MCPでIssueを自動作成すること
- マージ前にgithub MCPでCIステータスを確認すること
### Slackへの通知
- 重大なエラーを発見したらslack MCPで #alerts チャンネルに即通知
- デプロイ完了時はslack MCPで #deploy チャンネルに通知
- 通知文は「[環境] [状態] [タイムスタンプ]」の形式で
### データベース操作
- 本番DBへのWRITE操作は必ずユーザーの明示的な承認を得ること
- READクエリは承認なしで実行可能
- 結果は必ず件数を確認してから次の処理に進むことサブエージェント設計:専門家チームを作る
Claude Codeのサブエージェント機能を使うと、特定の専門領域に特化したAIエージェントを複数作り、並列で動かせます。顧問先の開発会社で「セキュリティレビュー担当」「テスト担当」「ドキュメント担当」の3エージェントを作ったら、コードレビューの品質と速度が劇的に変わりました。
サブエージェントの定義ファイル例
# ~/.claude/agents/security-reviewer.md
---
name: security-reviewer
description: セキュリティレビュー専門エージェント。コードのセキュリティ問題を検出する
model: claude-sonnet-4-6
permissionMode: readonly
tools:
- Read
- Bash
disallowedTools:
- Write
- Edit
---
あなたはシニアセキュリティエンジニアです。コードのセキュリティレビューに特化してください。
## レビュー基準
1. OWASP Top 10 の脆弱性チェック
2. SQLインジェクション・XSS・CSRF
3. 認証・認可の設計ミス
4. 機密情報のハードコーディング
5. 依存ライブラリの既知脆弱性
## 出力形式
- CRITICAL: 即座に修正が必要
- HIGH: 早急に修正が必要
- MEDIUM: 次のスプリントで対応
- LOW: 改善推奨
重要度CRITICALとHIGHのみ、具体的な修正コード例を添付すること。# ~/.claude/agents/test-generator.md
---
name: test-generator
description: テストコード生成専門エージェント
model: claude-sonnet-4-6
permissionMode: readWrite
tools:
- Read
- Write
- Bash
---
あなたはシニアQAエンジニアです。テストコードの生成・改善に特化してください。
## テスト方針
- TDD(テスト先行)を徹底
- カバレッジ80%以上を必達
- ユニット・統合・E2Eの3層を網羅
- エッジケース・境界値を必ずテスト
## 出力ルール
- テストファイルは同一ディレクトリの __tests__/ または *.test.ts に配置
- テスト名は「[状況]のとき[操作]すると[結果]になる」形式
- 仮定した点は必ず"仮定"と明記してください。CLAUDE.mdからサブエージェントを呼び出すタイミングを指定
# .claude/CLAUDE.md
## エージェント連携ルール
### コードを書いたら必ず実行
1. コードを新規作成・大幅修正したら security-reviewer を呼び出してレビューさせる
2. レビュー後、カバレッジが80%未満なら test-generator でテストを補完させる
3. 両方完了後に初めてコミットを検討する
### 並列実行の基準
- セキュリティレビューとテスト生成は並列実行してよい(互いに独立)
- ただしDBスキーマ変更は必ず直列(security → test の順序)
### 使ってはいけないパターン
- サブエージェントに本番DBへの書き込みを許可しない(permissionMode: readonly を維持)プロジェクト種別テンプレート集
Webアプリ開発プロジェクト
# .claude/CLAUDE.md(React + TypeScript + Node.js プロジェクト)
## プロジェクト概要
[プロジェクト名] — [1〜2行で説明]
## 技術スタック
- Frontend: React 19 + TypeScript 5.4
- Backend: Node.js 22 + Express 5
- DB: PostgreSQL 16(ORM: Prisma)
- Test: Vitest + Playwright
- Lint: ESLint 9 + Prettier
## 必須ルール
### コーディング
- TypeScriptのstrictモードを常に有効に保つこと
- any型は禁止(unknown型を使う)
- nullableな値には必ずオプショナルチェーニングを使う
### テスト
- 新機能には必ずユニットテストを作成(Vitest)
- APIエンドポイントの変更には統合テストを追加
- カバレッジ目標: 80%以上
### セキュリティ
- .env ファイルは絶対にコミットしない
- ユーザー入力は必ずzodでバリデーション
- SQLクエリは必ずPrismaのORM経由(RAWクエリは原則禁止)
## 禁止事項
- git push --force(必ず承認を取る)
- 本番DBへの直接接続(開発DBのみ使用)
- コンソールログを残したままのコミットデータ分析プロジェクト
# .claude/CLAUDE.md(Python + Jupyter プロジェクト)
## プロジェクト概要
[プロジェクト名] — データ分析・機械学習プロジェクト
## 技術スタック
- Python 3.12
- pandas, numpy, scikit-learn
- Jupyter Notebook
- データ: [データソースの説明]
## 分析ルール
- 全ての数字には出典(データソース、収集日)を明記する
- 統計値には信頼区間またはサンプルサイズを添える
- 相関を因果として解釈しない(必ず「相関が見られる」と表現)
## データ品質
- 欠損値の処理方法を必ずコメントで記録する
- 外れ値の定義と処理方針を明示する
- データの前処理スクリプトはべき等(何度実行しても同じ結果)にする
## 再現性
- 乱数シードは必ず固定(random_state=42)
- 依存ライブラリはrequirements.txtにピン留め
- Notebookのアウトプットはコミット前にクリア(kerneлは再実行して確認)【要注意】よくある設定ミスと回避策
失敗1:グローバルとプロジェクトのCLAUDE.mdが競合する
❌ グローバル(~/.claude/CLAUDE.md)に「Pythonを使え」と書き、プロジェクト(.claude/CLAUDE.md)に「Node.jsを使え」と書く
⭕ グローバルには普遍的なルール(コミットメッセージ形式・安全規則)のみ。言語・フレームワーク固有の指定はプロジェクトに書く
優先順位: プロジェクト > グローバル(プロジェクトが勝つ)
失敗2:hooksのexit codeを間違える
❌ exit 0でもClaudeの実行がブロックされると誤解する
⭕ exit 0 = 実行を許可、exit 1 = 実行をブロック、exit 2 = ユーザーに確認を求める
# exit codeの意味
exit 0 # 続行を許可
exit 1 # ブロック(エラーメッセージが表示される)
exit 2 # ユーザーに確認プロンプトを表示(危険な操作の確認など)失敗3:MCPサーバーに広すぎる権限を与える
❌ mcp__github__*(GitHub MCPの全ツール)を無制限に許可
⭕ 読み取りのみのツール(mcp__github__list_issues)と書き込みツール(mcp__github__create_pr)を分けて、後者には承認を必要とする設定にする
失敗4:サブエージェントが無限ループする
❌ サブエージェントAがサブエージェントBを呼び、BがAを呼ぶ設定
⭕ CLAUDE.mdに「サブエージェントから別のサブエージェントを呼び出さない」と明記 + maxTurnsで上限を設定
# サブエージェント定義でのループ防止
---
maxTurns: 20 # 20ターンで強制終了
---失敗5:CLAUDE.mdが長すぎてコンテキスト汚染
❌ 3,000字を超えるCLAUDE.mdを書いてClaudeが「最重要」を見失う
⭕ CLAUDE.mdは500〜1,000字程度のコアルールのみ。詳細は別ファイル(.claude/rules/)に分けてCLAUDE.mdから参照する
上級者向け:メモリシステムとの連携
Claude Codeのメモリシステム(`~/.claude/projects//memory/`)とCLAUDE.mdを組み合わせると、会話をまたいで学習し続けるエージェントを作れます。
# CLAUDE.mdへの追記(メモリ指示)
## メモリ管理
### 自動的に記録すること
- このプロジェクト固有のコマンド・パス・設定値
- バグを発見したときのパターンと解決法
- ユーザーの好みや判断基準(確認なしで実行してよい操作 vs 必ず確認が必要な操作)
### 記録してはいけないこと
- APIキー・パスワード・個人情報
- 一時的なデバッグ情報
- 今のセッションだけに有効な設定
### メモリの読み方
セッション開始時に必ず関連するメモリを確認し、前回の作業状況を把握してから始めること。まとめ:今日から始める3つのアクション
- 今日やること: まず「危険コマンドブロック」のPreToolUseフックを1つ設定する。git push –forceだけでもブロックしておくと開発事故が激減する
- 今週中: よく使うMCPサーバー(GitHub or Slack)を1つ追加し、CLAUDE.mdにその使い方の指示を書く。「PRを作るときはGitHub MCPを使え」と1行追加するだけで動きが変わる
- 今月中: セキュリティレビュー専門のサブエージェントを作り、コード変更後に自動で呼び出す設定を整える。チームで使う場合は.claude/ディレクトリをgit管理して全員に共有する
CLAUDE.mdは「書いておわり」ではなく、hooksで強制し・MCPでツール統合し・サブエージェントで役割分担することで初めて「自分専用AI」が完成します。
ChatGPTとの使い分けや全体的なAI活用戦略はChatGPTビジネス活用完全ガイドも参考にしてください。
参考・出典
- Hooks reference — Claude Code Docs — Anthropic公式(参照日: 2026-04-01)
- Create custom subagents — Claude Code Docs — Anthropic公式(参照日: 2026-04-01)
- Claude Code Extensions Explained: Skills, MCP, Hooks, Subagents, Agent Teams & Plugins — Medium(参照日: 2026-04-01)
- Claude Code Hooks Complete Guide (March 2026 Edition) — SmartScope Blog(参照日: 2026-04-01)
- The Complete .claude Directory Guide for Claude Code [2026] — Computing For Geeks(参照日: 2026-04-01)
著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー約10万人。100社以上の企業向けAI研修・導入支援。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。
ご質問・ご相談はお問い合わせフォームからお気軽にどうぞ。
あわせて読みたい
- Claude Code実践テクニック集(AIツールラボ)



