プログラミング・スキルアップ

Claude Code Subagent自作ガイド2026

読了時間: 約13分

Claude CodeのSubagent機能を使うと、.claude/agentsに1枚ファイルを置くだけでミニClaude Codeを追加できる。ビルドもインストールも要らない。

この記事の要点

  • subagentの実体は.claude/agents/に置くYAMLフロントマター付きMarkdownファイル1枚だけ
  • 必須フィールドはnamedescriptionの2件のみ。toolsを絞れば渡す権限を最小化できる
  • descriptionに「use proactively」を書くかどうかで、自動委譲される頻度が変わる

このAI Career Japanのリポジトリにも、2026年7月時点で実際に運用しているsubagentが4件ある。競合記事のH2見出しを抜き出すcompetitor-analyzer、AI臭い文章を検出するfreshness-gate、読者の悩みを集めるpersona-researcher、最新トレンドを追うtrend-researcherだ。この記事はそれらの実物のfrontmatterと、Anthropic公式ドキュメントの仕様を突き合わせて書いている。

サブエージェントとは何か

サブエージェント(subagent)は、独立したコンテキストウィンドウを持つミニClaude Codeだ。メインの会話とは別のスレッドで動き、指示された作業を終えたら要約だけを親会話に返す。

独立コンテキストという設計

効果は明確だ。競合記事を10本読んで比較表にまとめる作業をメインの会話でやると、10本分のHTML本文がそのままコンテキストに残り続ける。subagentに投げれば、親会話が受け取るのは「比較表と結論」だけになる。長い調査タスクほど、この差が響く。

このリポジトリでcompetitor-analyzerを動かしてみると、1回の呼び出しで約7万トークン・約20回のツール呼び出しを消費した。7万トークンがメインの会話に残らずに済む。これがsubagentを使う理由の中核だ。

向く作業・向かない作業

サブエージェントが向く作業

大量の中間出力が出る調査・検索・ログ解析。結論だけ持ち帰ればいい作業。

サブエージェントが向かない作業

数手先を親と相談しながら進める編集作業。会話の文脈を細かく共有し続ける必要がある処理。

最小構成で1体作る

ディレクトリとファイル名

まずは動くものを作る。.claude/agents/ディレクトリが存在しなければ作成し、その中にMarkdownファイルを1枚置く。ファイル名がそのままエージェント名になるわけではなく、frontmatter内のnameフィールドが識別子になる。

mkdir -p .claude/agents
cat > .claude/agents/log-summarizer.md << 'EOF'
---
name: log-summarizer
description: ビルドログやテスト失敗ログを読み、原因と該当箇所を要約するエージェント。長いログを扱うときに使う。
tools: Read, Grep, Glob
model: sonnet
---

あなたはログ解析の専門エージェントです。

## 役割
渡されたログファイルを読み、エラーの原因・発生箇所・再現条件を
簡潔にまとめて返します。

## 出力フォーマット
- 原因: [1行で]
- 該当ファイル・行番号
- 再現条件
- 推奨する次のアクション
EOF

動かして確認する

これだけで新しいsubagentが使えるようになる。tools: Read, Grep, Globと書いた時点で、このエージェントはファイルの書き換えも実行もできない。読んで要約するだけの専門職として封じ込められる。

ここは見落としがちだが

frontmatterのtoolsを書かなければ、サブエージェントは親と同じ全ツールを継承する。「読むだけでいい」作業ほど、明示的に絞ったほうが事故が減る。

frontmatterの必須・任意フィールド

公式ドキュメント「Create custom subagents」で確認できるフィールドを、必須・任意で分けて整理する。

必須は2フィールドだけ

フィールド 必須 説明
name必須小文字とハイフンのみ。エージェントの識別子
description必須Claude Codeが自動委譲するかどうかの判断材料になる文章
tools任意許可するツールのリスト。省略時は親を継承
disallowedTools任意拒否リスト。toolsより先に適用され、重複分は除外される
model任意sonnet/opus/haiku/fable/フルIDまたはinherit。デフォルトはinherit
permissionMode任意default/acceptEdits/plan等。省略時は親の設定を継承
isolation任意worktreeを指定すると独立したgit worktreeで作業する
background任意trueでバックグラウンド実行。組み込みツールに縮小される

tools/disallowedToolsの解決順

ツール権限はdisallowedToolsが先に適用され、そのあとtoolsが適用される。両方に同じツール名があれば除外される側が優先される。MCPサーバーのツールだけ許可したい場合はmcp__サーバー名mcp__サーバー名__*の形式でtoolsに書ける。

modelの解決順

modelを省略するとinheritになり、親会話と同じモデルが使われる。解決順は環境変数によるサブエージェント指定、呼び出し時の引数、frontmatterのmodel、親のモデルという4件の参照先を順番に見ていく設計だ。このリポジトリの4件のsubagentは全員model: sonnetを明示している。inheritのまま任せず固定しているのは、親の会話でモデルを切り替えても調査系エージェントの挙動を一定に保ちたいからだ。

descriptionの書き方で発動頻度が変わる

descriptionはただの説明文ではない。Claude Codeが「このタスクをこのsubagentに投げるべきか」を判断する唯一の材料だ。曖昧なdescriptionは、いつまで経っても自動発動しない。

このリポジトリのtrend-researcherは次のように書いている。

description: AI/キャリア関連の最新トレンドをWeb検索で調査し、記事ネタに使える要約を返すエージェント。/run や /research 実行時にリサーチフェーズで使用する。

「何をするエージェントか」だけでなく「いつ使うべきか」まで書いてある。ここが薄いと、メインのClaude Codeは自力で調査を始めてしまい、subagentは存在しないのと同じになる。

強制発動フレーズ

もったいないと感じるのが

descriptionに「use proactively」「must be used」のような強制発動フレーズを入れないケースだ。公式ドキュメントでも明記されている手法で、頻繁に使いたいサブエージェントほどこの一言の有無で発動率が変わる。

既存4件を実例として読み解く

権限を絞った例

freshness-gateのtoolsはRead, Globの2件だけだ。WebSearchもBashも渡していない。理由は単純で、このエージェントの仕事は「完成した記事HTMLを読んでAI臭い表現を指摘する」ことに限定されているから、それ以外の権限は不要という判断だ。

---
name: freshness-gate
description: 記事HTMLからAI臭い文章パターンを検出し、具体的な書き換え案を提示するエージェント。記事完成前の品質チェックに使用する。
tools: Read, Glob
model: sonnet
---

権限を広げた例

対してcompetitor-analyzerとpersona-researcher、trend-researcherの3件はRead, Grep, Glob, Bash, WebSearch, WebFetchという同じ6件のツールを共有している。Web検索と外部ページ取得が要る調査系タスクという共通点があるからだ。tools行を見るだけで、そのエージェントが何をする役割か推測できる設計になっている。

エージェント tools 役割
competitor-analyzerRead, Grep, Glob, Bash, WebSearch, WebFetch競合記事のH2構成抽出
freshness-gateRead, GlobAI臭い文章の検出
persona-researcherRead, Grep, Glob, Bash, WebSearch, WebFetch読者の悩み収集
trend-researcherRead, Grep, Glob, Bash, WebSearch, WebFetch最新トレンド調査

ファイルサイズを調べてみると、4件を合計しても約17KBのMarkdownで、4つの専門職が定義されている。1件あたり平均4KB弱という軽さも、subagentを増やすハードルの低さを裏付けている。

サブエージェントとAgent Teamsの違い

Claude Codeには、subagentとよく混同される機能がもう1つある。複数のセッションを並行稼働させる「Agent Teams」だ。両者の違いは「結果だけ返すか、互いに直接会話できるか」に集約される。バックグラウンドで動かした複数セッションを1画面で管理する「Agent View」という別機能もあり、こちらは並列実行の監視に特化している。

使い分けの基準

subagentは親(呼び出し元)にしか結果を報告しない。一方Agent Teamsのメンバー同士は、共有タスクリストを介して直接メッセージをやり取りする。セキュリティ・性能・テストカバレッジを別々の観点でレビューさせたいときはAgent Teams、単発の調査結果だけ欲しいときはsubagentという住み分けだ。

Subagent向き

結果だけ受け取れればいい単発調査。トークンコストを抑えたいとき。メインエージェントが全工程を管理する場合。

Agent Teams向き

複数の視点を突き合わせたい議論・レビュー。担当ファイルが分かれた並行実装。仮説を競わせるデバッグ。

項目 Subagent Agent Teams
通信親にのみ結果を報告メンバー同士が直接メッセージ
調整方法親エージェントが一括管理共有タスクリストで自律調整
トークンコスト低い(要約のみ返る)高い(各自が独立インスタンス)
既定状態常に利用可能既定で無効。環境変数で有効化が必要

Agent Teamsは既定で無効になっており、有効化には環境変数の設定が要る。公式ドキュメントは推奨チーム規模として3〜5件のteammateを挙げており、1メンバーあたり5〜6件のタスクを持たせるとコーディネーションが崩れにくいとしている。TeammateIdle・TaskCreated・TaskCompletedという3件のhooksでチーム側の品質ゲートを組めるのも、subagentにはない特徴だ。

迷ったら、まずsubagentから試すのがいい。Agent Teamsはコーディネーションのオーバーヘッドが確実に乗る分、並行調査・並行レビューのように「複数の視点が本当に必要な場面」でだけ使う機能だと考えている。

出力フォーマットを固定して事故を減らす

subagentの本文(Markdown部分)には、役割の説明だけでなく出力フォーマットも書き込んでおく。competitor-analyzerの本文には、見出し構成・比較表・KW実測データという3ブロックのテンプレートが埋め込まれている。

これをやらないと、同じsubagentを2回呼んだときに毎回違う形式で結果が返ってくる。親会話側でパースするコードを書くなら尚更、フォーマットの固定は必須だ。

禁止事項セクションを本文末尾に書く

これだけで、同じsubagentを2回呼んだときの出力形式のブレが減る。freshness-gateやcompetitor-analyzerには「主観的な評価はしない」「記事構成の推奨はしない」という禁止事項が明記されている。役割を狭めるほど、返ってくる結果の再現性が上がる。

つまずきやすいポイント

toolsを書き忘れて権限が広すぎる

toolsを省略すると親のツールをすべて継承する。読み取り専用のはずのエージェントにEdit/Writeが渡っていないか、frontmatterを見直す。

descriptionが短すぎて自動発動しない

「〇〇するエージェント」だけでなく「いつ使うか」まで書く。このリポジトリの4件は全員、末尾に用途(「記事作成時のSEO戦略立案に使用する」等)を添えている。

優先順位を誤解する

同名エージェントは、Managed settings、--agentsフラグ、プロジェクトの.claude/agents/、ユーザーの~/.claude/agents/、プラグインという5件の優先順で解決される。プロジェクト側の定義がユーザー側より優先されると誤解しやすい。

backgroundを付けたのにツールが足りない

バックグラウンド実行では組み込みツールがRead/Grep/Glob/Bash/Edit/Write等に縮小される。frontmatterでtoolsを広く指定していても除去される点に注意する。

よくある質問

Q. サブエージェントとカスタムスラッシュコマンドは何が違う?

スラッシュコマンドは決まった手順を呼び出すショートカットで、実行はメインの会話のコンテキストで行われる。subagentは独立したコンテキストで動き、ツール権限も個別に絞れる。中間出力を大量に出す調査系はsubagent向きだ。

Q. サブエージェントからさらにサブエージェントを呼べるか?

ネストは可能だが、無制限ではない。深さの上限を設定する環境変数が用意されており、意図しない多段呼び出しでコストが膨らむのを防いでいる。なおAgent Teamsのteammateは自分のteammateを持てず、これは明確な制限として公式ドキュメントに明記されている。

Q. モデルを指定しないとどうなる?

デフォルトはinheritで、親会話と同じモデルが使われる。解決順は環境変数のサブエージェント指定、呼び出し時の引数、frontmatterのmodel、親のモデルの順で上書きされる。

Q. MCPサーバーのツールだけ許可したい場合は?

mcp__サーバー名やmcp__サーバー名__*の形式でtoolsに書ける。特定のMCPサーバーだけ使わせたいときに使う。

Q. subagentとAgent Teamsはどちらを先に覚えるべき?

subagentを先に覚えるべきだ。常時利用可能で設定も名前とdescriptionの2件だけで動く。Agent Teamsは既定で無効な実験的機能なので、subagentで手が届かなくなってから検討すればいい。

まとめ

subagent自作の要点は3つに絞れる。name/descriptionの2件だけで動く最小構成から始めること、toolsで権限を必要最小限に絞ること、descriptionに「いつ使うか」まで書いて自動委譲の精度を上げること。この3つを外すと、せっかく作ったsubagentは呼ばれないか、権限過多で事故る。

自分ならまず既存の会話を振り返り、「同じ調査を何度も手作業でやっている」箇所を1つ見つけてsubagent化する。汎用的な万能エージェントを最初から目指さず、freshness-gateのように役割を1つに絞ったものから増やしていく。Agent Teamsに手を出すのは、subagentを3〜4件運用してみて「メンバー同士の会話が要る」と実感してからで十分だ。