Claude Codeを使いこなすうえで、スキル(Skills)とサブエージェント(Sub Agents)の違いは避けて通れません。
どちらもAIの能力を拡張する仕組みですが、スキルは「業務マニュアル」、サブエージェントは「担当者」です。このシンプルな違いの裏側には、コンテキスト管理やネスト制約といった、ワークフロー設計に直結する重要なルールが存在します。
本記事では、スキルとサブエージェントの依存関係を解説します。「誰が誰を呼び出せるのか」「スキルはどのタイミングでロードされるのか」を理解すれば、複雑なAIワークフローも迷わず設計できるようになります。
なお、スキルの基本的な書き方やインストール方法については、前回の記事「Agent Skillsとは?Claude CodeなどAIのスキル機能を完全解説」で詳しく解説しています。本記事はその続編として、スキルとサブエージェントの「関係性」に焦点を当てます。
スキルとサブエージェントの本質的な違い
スキルは「メインコンテキストに溶け込む指示書」
スキルの正体は、ただのプロンプト注入です。SKILL.mdに書かれた内容は、読み込まれた時点でメインコンテキストの一部になります。
会社で例えるなら、スキルは「業務マニュアル」です。マニュアルそのものは何も実行しません。マニュアルを読んだ人(=メインコンテキストのAI)が、書かれた手順に従って作業を行います。
この「溶け込む」という性質が、後述する呼び出し関係を理解するカギになります。スキルが読み込まれた後は、メインコンテキストと一心同体になるため、メインコンテキストが使えるツールはすべてスキル経由でも使えるのです。
サブエージェントは「別室で働く独立した担当者」
一方、サブエージェント(Sub Agent)はまったく異なる存在です。サブエージェントは独自のコンテキストウィンドウ・システムプロンプト・ツール・モデルを持つ、独立した実行主体です。
会社で例えるなら、サブエージェントは「専門の担当者」です。メインのAI(マネージャー)が「この仕事を頼む」とタスクを委譲すると、担当者は自分のデスク(=独自のコンテキストウィンドウ)で独立して作業を進めます。作業が終わったら結果だけをマネージャーに報告します。
では、メインのAIはどうやってサブエージェントを起動するのでしょうか。ここで登場するのがTask toolです。Task toolは、Claude Codeの内部に組み込まれたツールで、サブエージェントを生成・起動するための専用の仕組みです。ユーザーが直接操作するものではなく、メインコンテキストのAIが裏側で自動的に使います。「○○エージェントを使って」と依頼すると、AIがTask toolを呼び出してサブエージェントを立ち上げる、という流れです。
サブエージェントの特徴を整理すると、以下のようになります。
- 独立したコンテキスト:メインのコンテキストウィンドウを消費しないため、大量のファイル探索や複雑な処理を委譲しても、メイン側の品質が落ちない
- Task toolで生成される:メインコンテキストが内部的にTask toolを使ってサブエージェントを起動する
- 並列実行が可能:複数のサブエージェントを同時に起動し、それぞれ独立して並行作業させられる
- フォアグラウンド/バックグラウンド:完了まで待機する方式と、バックグラウンドで並行作業する方式を選べる
エントリーポイントの違い
スキルとサブエージェントでは、呼び出し方も異なります。
| 種類 | 呼び出し方 | 例 |
|---|---|---|
| スキル | /スキル名(スラッシュコマンド) | /pdf で PDF 作成スキルを起動 |
| サブエージェント | 自然言語で依頼 | 「コードレビューエージェントを使ってレビューして」 |
スキルは/スキル名のスラッシュコマンドで直接呼び出せます。また、AIが状況を判断して自動的にスキルを選ぶこともできます。
サブエージェントは/commandでは呼び出せません。/agentsコマンドはサブエージェントの管理(作成・編集・削除)に使うものであり、起動手段ではありません。サブエージェントの起動は、AIが状況に応じて自動委譲するか、「○○エージェントを使って」と自然言語で依頼する形になります。
呼び出し関係の全体像
誰が誰を呼べるのか
スキルとサブエージェントの呼び出し関係には、明確なルールがあります。以下の表に全パターンをまとめました。
| 呼び出し関係 | 可否 | 仕組み |
|---|---|---|
| メインコンテキスト → スキル | 可能 | /command で呼び出し、またはAIが自動判断してSkill toolで呼び出し |
| メインコンテキスト → サブエージェント | 可能 | Task toolで生成・起動(自動委譲または自然言語で依頼) |
| スキル → サブエージェント | 可能 | スキルはメインコンテキストに溶け込むため、Task toolが使える |
| サブエージェント → スキル | 可能 | 定義ファイル冒頭の設定ヘッダー(フロントマター)のskills:で起動時にフル内容をプリロード |
| サブエージェント → サブエージェント | 不可能 | サブエージェントはTask toolを持たないため、別のサブエージェントを起動できない |
最後の行がポイントです。サブエージェントから別のサブエージェントを起動することはできません。これを「ネスト禁止」と呼びます。
スキルからサブエージェントを呼べる理由
表の3行目「スキル → サブエージェント」が可能な理由は、先ほど説明した「溶け込む」性質にあります。
スキルはメインコンテキストに読み込まれた時点で、メインコンテキストの一部になります。メインコンテキストはTask toolを持っているので、スキルの指示の中で「サブエージェントを起動してこのタスクを委譲せよ」と書けば、そのとおりに動きます。
つまり、スキルの中でサブエージェントの起動を指示するワークフローは、技術的に問題なく動作します。たとえば「ブログ記事を作成するスキル」の中に「画像生成エージェントを起動してアイキャッチ画像を作らせる」という手順を書くことも可能です。
サブエージェントからスキルを使う方法
表の4行目「サブエージェント → スキル」も可能ですが、仕組みが少し特殊です。
サブエージェントの定義ファイル(.claude/agents/に置くMarkdownファイル)には、ファイル冒頭に---で囲んだ設定ヘッダーがあります。これを「フロントマター」と呼びます(SKILL.mdの設定ヘッダーと同じ仕組みです)。このフロントマターの中にskills:フィールドを書き、使いたいスキル名を指定します。
---
name: code-reviewer
description: コードレビューを行う専門エージェント
skills:
- lint-check
- security-scan
---
あなたはシニアエンジニアとしてコードレビューを行います。
... 上の例では、---で囲まれた部分がフロントマターです。skills:にlint-checkとsecurity-scanの2つのスキルを指定しています。
こうすると、サブエージェントが起動するときに、指定されたスキルのフル内容がコンテキストに注入されます。サブエージェントは起動後、注入されたスキルの手順に従って作業を進められます。
ネスト禁止の制約と回避策
なぜサブエージェントはネストできないのか
先ほどの表で最も重要なルールが、サブエージェント → サブエージェントの呼び出しが不可能だということです。
技術的な理由は単純です。サブエージェントにはTask toolが提供されていません。Task toolはメインコンテキスト専用のツールであり、サブエージェントの環境には存在しないのです。
公式ドキュメントでも、この制約について明確に言及されています。
Subagents cannot spawn other subagents. If your workflow requires nested delegation, use Skills or chain subagents from the main conversation.
Claude Code Docs: Choose between subagents and main conversation
つまり、「サブエージェントAがサブエージェントBを呼び出し、Bがさらにサブエージェントcを呼ぶ」といった多段の委譲はできません。
回避策1:スキルで代替する
ネストが必要になるケースの多くは、サブエージェント内で別の専門的な手順を実行したい場合です。こういったケースでは、その手順をスキルとして定義し、サブエージェントのフロントマターで読み込ませることで対処できます。
たとえば、「コードレビューエージェント」の中で「セキュリティスキャン」も行いたい場合を考えます。
NG:サブエージェントのネスト(動かない)
コードレビューエージェント
└→ セキュリティスキャンエージェントを起動 ← Task toolがないので不可能 OK:スキルで代替する
コードレビューエージェント(skills: [security-scan] を指定)
└→ セキュリティスキャンスキルの手順に従って実行 ← スキルは注入済みなので実行可能 サブエージェントがスキルの手順に従って直接作業を行うため、ネストは不要になります。
回避策2:メインからチェーンする
もう1つの方法は、メインコンテキストから複数のサブエージェントを順番に起動する「チェーン」パターンです。
メインコンテキスト
├→ サブエージェントA を起動 → 結果を受け取る
└→ サブエージェントB を起動(Aの結果を渡す) → 結果を受け取る この方法なら、サブエージェント同士は直接呼び出し合わず、メインコンテキストが仲介役を果たします。メインコンテキストはTask toolを持っているので、何回でもサブエージェントを起動できます。
チェーンパターンは、前のサブエージェントの出力を次のサブエージェントの入力にしたい場合に適しています。たとえば「テストエージェントでテストを実行 → 結果をコードレビューエージェントに渡してレビュー」のような流れが作れます。
スキルのロード方式の違い
メインコンテキストでの遅延ロード
メインコンテキストでは、スキルは2段階でロードされます。
- 起動時:各スキルの
description(説明文)だけがコンテキストに載る - 実行時:選ばれたスキルの
SKILL.md本文がフルロードされる
この遅延ロード方式により、プロジェクトに100個のスキルが登録されていても、実際にコンテキストウィンドウを消費するのは使われたスキルだけです。公式ドキュメントでは、descriptionは常にコンテキストに含まれること(Description always in context)が明記されています。
サブエージェントでの即時フルロード
サブエージェントでは、ロード方式がまったく異なります。フロントマターのskills:フィールドで指定されたスキルは、起動時にフル内容がすべて注入されます。descriptionだけの遅延ロードではありません。
なぜこうなっているのか。理由は、サブエージェントがSkill toolを持っていないからです。
メインコンテキストには「Skill tool」という内部ツールがあり、これを使ってスキルの本文をオンデマンドで読み込めます。しかしサブエージェントにはSkill toolが提供されていないため、実行中にスキルを追加で読み込む手段がありません。だから起動時に全内容を注入するしかないのです。
| 場面 | ロードされる内容 | 理由 |
|---|---|---|
| メインコンテキスト | descriptionのみ(実行時にフルロード) | Skill toolでオンデマンド読み込みが可能 |
| サブエージェント | 起動時にフル内容を注入 | Skill toolを持たず、オンデマンドで読み込めない |
この違いが設計に与える影響
このロード方式の違いは、サブエージェントに持たせるスキルの数に直結します。
メインコンテキストなら、大量のスキルを登録しても問題ありません。descriptionだけが載るので、コンテキストウィンドウへの影響はわずかです。
しかしサブエージェントの場合、指定したスキルはすべてフル内容で注入されるため、スキルを増やすほどコンテキストウィンドウを圧迫します。サブエージェントのコンテキストウィンドウにはサイズ上限があるので、不要なスキルまで詰め込むと、本来の作業に使える容量が減ってしまいます。
設計のポイント:サブエージェントには、そのエージェントの役割に本当に必要なスキルだけを厳選して指定しましょう。「念のため入れておく」は逆効果になります。
Task toolの位置づけ
サブエージェントを生成する内部ツール
ここまで何度も登場した「Task tool」について、改めて整理します。
Task toolは、サブエージェントを生成・起動するためのClaude Code内部のツールです。ユーザーが直接操作するものではなく、メインコンテキストのAIが内部的に使用します。
Task toolの特徴をまとめると、以下のとおりです。
- メインコンテキスト専用:サブエージェントからは使用できない
- 並列起動が可能:複数のサブエージェントを同時に起動できる
- フォアグラウンド/バックグラウンド:完了まで待つか、バックグラウンドで動かすかを選べる
Task toolがメインコンテキスト専用であることが、「サブエージェントはネストできない」制約の根拠になっています。この設計は、無限に深いネストが発生してリソースを食い尽くすことを防ぐための意図的な制限だと考えられます。
スキル内からのTask tool利用
繰り返しになりますが、スキルはメインコンテキストに溶け込むため、スキルの指示の中でTask toolを使うことは問題ありません。
これは、複雑なワークフローを組む際に非常に強力です。たとえば、以下のようなスキルが作れます。
---
name: full-review
description: コードの品質チェックを一括で行う。レビュー依頼されたときに使う。
---
# フルレビュー手順
1. 以下のサブエージェントを並列で起動する
- code-reviewer エージェント:コード品質のレビュー
- security-scanner エージェント:セキュリティチェック
2. 両方の結果を統合して、ユーザーにレポートする このスキルはメインコンテキストで実行されるため、Task toolで複数のサブエージェントを並列起動できます。スキルが「オーケストレーター」の役割を果たすわけです。
まとめ
スキルとサブエージェントの依存関係を理解することは、Claude Codeで複雑なワークフローを設計するための基礎知識です。最後に、本記事の要点を整理します。
- スキルはメインコンテキストに溶け込む指示書。読み込まれた後はメインコンテキストの一部になるため、Task toolも使える
- サブエージェントは独立した実行主体。独自のコンテキストウィンドウを持ち、メインのコンテキストを汚さない
- サブエージェントのネストは禁止。回避策はスキルでの代替か、メインからのチェーン
- スキルのロード方式が異なる。メインでは遅延ロード、サブエージェントでは即時フルロード
- サブエージェントに持たせるスキルは厳選する。フルロードされるため、増やすほどコンテキストを圧迫する
これらのルールを押さえておけば、「スキルにすべきかサブエージェントにすべきか」「どこからどこを呼び出すか」といった設計判断で迷うことはなくなるはずです。
