YuruGadget
技術 · 2026-03-14

Claude Code ハーネス作成の重要ポイント — 制御可能なAIエージェントを作る

ハーネスとは何か

Claude Code における ハーネス(harness) とは、AI の振る舞いを制御するためのレイヤーのことです。具体的には以下の要素を組み合わせて構成します。

  • CLAUDE.md — プロジェクトのルールと文脈
  • settings.json — グローバル設定と Hooks
  • Memory — 会話を超えた記憶
  • MCP サーバー — 外部ツール連携
  • Plugins / Skills — 拡張機能

これらを適切に設計することで、Claude Code は「ただのチャットボット」から「チームのルールを理解した開発パートナー」に変わります。


なぜハーネスが重要なのか

AI にコードを書かせること自体は簡単です。難しいのは 「プロジェクトの文脈を理解した上で、一貫性のあるコードを書かせること」 です。

ハーネスなしの場合:

  • 毎回同じ説明を繰り返す必要がある
  • コーディング規約を守らないことがある
  • テストを書かずにコードだけ生成する
  • 危険な操作(force push、本番DBへの接続)を平気で提案する

ハーネスありの場合:

  • プロジェクトのルールを常に参照する
  • 過去のフィードバックを記憶して同じミスを繰り返さない
  • 自動的にテストを実行してから提案する
  • 危険な操作の前に確認を入れる

ハーネスの品質 = AI の出力品質 と言っても過言ではありません。


1. CLAUDE.md の設計

基本構造

CLAUDE.md は「プロジェクトの取扱説明書」です。以下の構造が実用的です。

# プロジェクト名

## ビルドとテスト
(ビルド・テスト・デプロイのコマンド)

## フォルダ構成
(ディレクトリの役割)

## コーディング規約
(命名規則、スタイル、パターン)

## やってはいけないこと
(禁止事項を明確に)

## よくある作業フロー
(日常的なタスクの進め方)

良い CLAUDE.md の例

# my-api

## ビルドとテスト

\```bash
npm run build        # TypeScript コンパイル
npm test             # Jest テスト実行
npm run lint         # ESLint チェック
\```

## フォルダ構成

- src/routes/     — Express ルーティング
- src/services/   — ビジネスロジック
- src/models/     — Prisma モデル定義
- src/middleware/  — Express ミドルウェア
- tests/          — テスト(src/ のミラー構成)

## コーディング規約

- 関数は named export を使う(default export 禁止)
- エラーハンドリングは AppError クラスを使う
- DB アクセスは必ず services/ 経由にする
- 型定義は各ファイルの先頭にまとめる

## やってはいけないこと

- main ブランチへの直接コミット
- .env ファイルのコミット
- Prisma の migration を手動実行
- node_modules/ をコミット
- git push --force

アンチパターン

長すぎる CLAUDE.md

❌ 悪い例:
500行の CLAUDE.md にすべての関数のドキュメントを書く
→ トークンを浪費し、重要なルールが埋もれる

CLAUDE.md は ルールと手順だけ を書きます。コードの詳細はコード自体が語るべきです。

曖昧な指示

❌ 悪い例:
- きれいなコードを書いてください
- テストは適宜書いてください

✅ 良い例:
- 関数は 30 行以内に収める
- すべての public 関数に対してユニットテストを書く

「きれい」「適宜」は人によって解釈が異なります。 数字や具体例で示す のがポイントです。


2. Hooks の設計

Hooks で何ができるか

Hooks は Claude Code のライフサイクルイベントに紐づくシェルコマンドです。これにより、AI の動作に「ガードレール」を設けられます。

実用的な Hook パターン

パターン1: ビルドチェック

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "cd /path/to/project && npm run typecheck 2>&1 | tail -5"
          }
        ]
      }
    ]
  }
}

ファイルを編集するたびに TypeScript の型チェックを自動実行。エラーがあれば Claude のコンテキストに入るので、すぐに修正を提案してくれます。

パターン2: 禁止操作の防止

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo '$TOOL_INPUT' | grep -qE 'push.*--force|reset.*--hard|rm.*-rf' && echo 'BLOCKED: Dangerous command detected' && exit 1 || exit 0"
          }
        ]
      }
    ]
  }
}

git push --forcegit reset --hardrm -rf などの破壊的コマンドを検出してブロックします。

パターン3: 通知

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"タスク完了\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

長い処理が終わったら macOS 通知で知らせる。

Hook 設計のコツ

  1. matcher は絞る — 空文字(全マッチ)は便利だが、不要な実行が増える
  2. 出力は短くする — Hook の stdout は Claude のコンテキストに入るため、tail で絞る
  3. exit code を使い分ける — 0 で通過、非0 でブロック
  4. 冪等にする — 何度実行しても同じ結果になるようにする

3. Memory の活用

Memory の種類

Claude Code の Memory は4種類あります。

種類 用途
user ユーザーの属性 「Go 10年、React 初心者」
feedback フィードバック 「テストは mock 禁止」
project プロジェクト状況 「3/5 から merge freeze」
reference 外部リソース 「バグは Linear の INGEST で管理」

Memory を効果的に使うコツ

明示的に記憶させる

覚えておいて:このプロジェクトでは ESM ではなく CommonJS を使う。
理由は AWS Lambda のデプロイツールが ESM 未対応だから。

「理由」も一緒に伝えると、edge case での判断が適切になります。

否定形のフィードバックを記憶させる

今後、console.log でデバッグするのではなく、
必ず logger.debug() を使ってください。
本番で console.log が残ったことがあるので。

「やらないでほしいこと」+ 「その理由」のセットで記憶させると効果的です。

記憶の棚卸し

Memory は時間とともに古くなります。定期的に ~/.claude/projects/ 以下のメモリファイルを確認し、もう当てはまらないものは削除しましょう。


4. MCP サーバーとの連携

MCP とは

MCP(Model Context Protocol)は、Claude Code が外部ツールにアクセスするための標準プロトコルです。

実用的な MCP 構成例

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxx"
      }
    }
  }
}

この設定で、Claude Code から直接 GitHub Issues や PR を参照・操作できるようになります。

よく使う MCP サーバー

サーバー 用途
GitHub Issue/PR の参照・操作
Figma デザインの読み取り
PostgreSQL DB スキーマの参照
Filesystem 特定ディレクトリへのアクセス制御

5. 全体設計のベストプラクティス

レイヤー構造で考える

ハーネスは以下のレイヤーで設計すると整理しやすい。

┌─────────────────────────────┐
│  Plugins / Skills           │  ← 機能拡張
├─────────────────────────────┤
│  MCP Servers                │  ← 外部ツール連携
├─────────────────────────────┤
│  Hooks (settings.json)      │  ← 自動化・ガードレール
├─────────────────────────────┤
│  Memory                     │  ← 蓄積される知識
├─────────────────────────────┤
│  CLAUDE.md                  │  ← プロジェクトの基盤ルール
└─────────────────────────────┘

下のレイヤーほど安定的で、上のレイヤーほど動的です。

段階的に導入する

いきなり全部を設定しようとすると挫折します。おすすめの導入順序は以下の通り。

  1. CLAUDE.md を書く(30分)
  2. 通知 Hook を設定する(5分)
  3. Memory を有効化して使い始める(1分)
  4. 必要に応じて ガードレール Hook を追加
  5. 外部連携が必要になったら MCP を導入

チームで共有する

CLAUDE.md はリポジトリにコミットするものなので、チーム全員が同じルールを共有できます。「このプロジェクトでは Claude にこう指示する」という認識を揃えることで、誰が Claude を使っても一貫した品質のコードが出力されます。


まとめ

ハーネスの設計は、AI エージェントを「制御可能」にするための根幹です。

要素 役割 投資時間 効果
CLAUDE.md ルールの明文化 30分 即効性が高い
Hooks 自動化と安全装置 1時間 事故防止に直結
Memory 知識の蓄積 継続的 使うほど賢くなる
MCP 外部ツール連携 30分〜 ワークフロー拡張

最も重要なのは CLAUDE.md です。ここが粗いと、どれだけ Hooks や Memory を整備しても効果は限定的。まずはプロジェクトの「当たり前」を言語化することから始めましょう。

AI との協業は、指示の質がそのまま成果の質になります。ハーネスは、その指示の質を仕組みで担保するものです。