Supershipの名畑です。TVアニメ「Dr.STONE」、完結まで製作してくれたことは本当に感謝しかないです。番外編のアニメ化も願わずにはいられない。
はじめに
2026年6月10日リリースのClaude Code v2.1.172 にて、サブエージェントが自身のサブエージェントを生成できる機能が追加されました。
Sub-agents can now spawn their own sub-agents (up to 5 levels deep)
参考:Claude Code changelog - Claude Code Docs
Subagents can now spawn their own subagents. The subagent panel below the prompt shows the full tree: each row carries a count of its descendants and a path back to main. Subagent chains are capped at five levels deep to prevent runaway concurrent trees.
サブエージェント自体は以前からありましたが、これまでは1階層しか作れませんでした。今回のアップデートでメイン会話の下に最大5階層までネストできるようになり、より複雑なタスクを階層的に分解できるようになっています。
今回はこのサブエージェントのネスト機能を試してみました。
題材は「世界のメディアから "日本" が話題になっているニュースだけを集めて日本語に翻訳・要約する」エージェントとします。
私は普段は日本のメディアの情報を主として生活しているので、興味深い情報が集められそうだと推測しました。
サブエージェントとは
サブエージェントは、特定の種類のタスクを処理する特化した AI アシスタントです。サイドタスクがメイン会話に検索結果、ログ、または再度参照しないファイルコンテンツで溢れかえる場合に使用します。サブエージェントはそのタスクを独自のコンテキストで実行し、概要のみを返します。同じ種類のワーカーを同じ指示で繰り返し生成する場合は、カスタムサブエージェントを定義します。
=== 略 ===
- コンテキストを保持する ことで、探索と実装をメインの会話から分離します
- 制約を強制する ことで、サブエージェントが使用できるツールを制限します
- 設定を再利用する ことで、ユーザーレベルのサブエージェントをプロジェクト全体で再利用します
- 動作を特化させる ことで、特定のドメイン向けの焦点を絞ったシステムプロンプトを使用します
- コストを制御する ことで、Haiku のような高速で安価なモデルにタスクをルーティングします
今回のメインテーマであるサブエージェントのネストについては以下の通りに説明されています。
Claude Code v2.1.172 以降、サブエージェントは独自のサブエージェントを生成できます。委譲されたタスク自体が並行サブタスクに分割される場合、これを使用します。例えば、レビュアーサブエージェントが検出結果ごとに検証者をディスパッチする場合、中間出力がメイン会話に到達することはありません。トップレベルのサブエージェントの概要のみがあなたに返されます。
サブエージェントの定義方法
サブエージェントはMarkdownファイルで定義します。
サブエージェントは YAML フロントマターを含む Markdown ファイルです。スコープに応じて異なる場所に保存します。複数のサブエージェントが同じ名前を共有する場合、より高い優先度の場所が優先されます。
今回はプロジェクト内で使うので .claude/agents/ 配下に置きます。
基本構造は以下のとおりです(公式サンプル)。
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.
frontmatterフィールドの主要項目は以下です。
-
name(必須)- 小文字とハイフンを使った一意の識別子
-
description(必須)- Claudeがこのサブエージェントに委譲するタイミング
-
tools(任意)- サブエージェントが使用できるツール。省略した場合はすべてのツールを継承します。
-
model(任意)- 使用するモデル:sonnet、opus、haiku、fable、完全なモデル ID(例:claude-opus-4-8)、または inherit。デフォルトは inherit
-
permissionMode(任意)- 権限モード:default、acceptEdits、auto、dontAsk、bypassPermissions、または plan。プラグインサブエージェントでは無視されます
環境
MacBookです。
claudeのバージョンを確認しておきます。
claude --version
2.1.195 (Claude Code)
2.1.172よりも後のバージョンであることが確認できました。
今回の構成
メイン+サブエージェント3階層(親・子・孫)で、サブエージェントとしては最大5階層中3階層を使います。
main(メイン会話)
└── japan-news-orchestrator(親、深度1)
├── source-fetcher-america(子、深度2)
│ └── article-translator × N(孫、深度3)
├── source-fetcher-europe(子、深度2)
│ └── article-translator × N
├── source-fetcher-asia(子、深度2)
│ └── article-translator × N
└── source-fetcher-africa(子、深度2)
└── article-translator × N
-
親(深度1)
-
japan-news-orchestrator— 全体のオーケストレーション役
-
-
子(深度2)
- アメリカ・ヨーロッパ・アジア・アフリカの4地域それぞれの集約メディアを担当(4並列)
-
孫(深度3)
-
article-translator— 子から渡されるRSSのtitleとdescriptionだけを材料に、日本語訳タイトルと日本語サマリーを生成(外部アクセスは行わない)
-
本当はもっと階層を深くしてみたいですし、また、取得する情報の範囲を広げたい思いもあるのですが、記事が長くなりすぎるため今回は絞りました。
サブエージェントの定義
.claude/agents/ 配下に Markdown ファイルを作成していきます。
modelは親と子がopus、孫がsonnetとしています。
もう少し低コストな組み合わせにすることも考えたのですが、今回は品質重視で行きます。
親エージェント: japan-news-orchestrator.md
---
name: japan-news-orchestrator
description: 世界のメディアから「日本」が取り上げられているニュースを集めて日本語で一覧化するタスクを統括する。アメリカ・ヨーロッパ・アジア・アフリカの4地域それぞれの集約メディアから取得する。
tools: Agent
model: opus
---
あなたは「世界からの日本関連ニュース」の集約を統括するオーケストレーターです。
手順:
1. 以下の子エージェントを Agent ツールで並列起動する
- source-fetcher-america: アメリカ視点 (Google News US/EN で "Japan" 検索)
- source-fetcher-europe: ヨーロッパ視点 (Euronews と BBC News Asia の2つを集約)
- source-fetcher-asia: アジア視点 (Google News の韓国/インド/台湾の3地域RSSを集約)
- source-fetcher-africa: アフリカ視点 (AllAfrica RSSをフィルタ)
2. 各子エージェントから返ってくる記事リストには、すでに孫エージェント
(article-translator) が RSS の title / description だけを材料に生成した
日本語訳タイトル・日本語サマリーが含まれている
3. 4つの結果は**マージしない**。各子エージェントが返してきたリストを、それぞれ
独立したセクションとして並べる
- 理由: 重複排除をすると「どの地域経由で拾った話題か」が分からなくなり、
同じニュースが米/欧/亜/阿でどう取り上げられているかという比較ができなくなる
4. 各地域の一覧を Markdown のテーブル形式でまとめて返す
- 出典の地域別に「アメリカ / ヨーロッパ / アジア / アフリカ」の **4セクションのみ** で構成する
- アジアは韓国・インド・台湾の出典が混ざるが、**サブセクション(### 韓国メディア等)に
分割せず、1つのテーブルにまとめる**
- **出典メディア列にはメディア名のみを記載する**。「YTN (韓国)」のように
国名を括弧書きで付けない。子エージェントから渡される source フィールドを
そのまま出力する
- **各セクションは最大5件まで**に絞る(子から受け取った記事が5件を超える場合は、
pubDate の新しい順に5件残し、残りは破棄する)
- 各セクションの列: 日本語タイトル / 出典メディア / 日本語サマリー / 元記事リンク
- 該当0件の地域があってもセクションは残し「該当記事なし」と明記
注意: 孫エージェント (article-translator) は親からは呼び出さない。
各子エージェントの内部で並列起動される。
今回は子から受け取る情報をそれぞれ最新の5件のみ使用する設定にしています。
子エージェント: source-fetcher-america.md(アメリカ)
---
name: source-fetcher-america
description: Google News (英語/米国) で "Japan" を検索した RSS フィードから記事リストを取得し、各記事を孫エージェントで日本語訳・要約する。
tools: WebFetch, Agent
model: opus
---
あなたは Google News (英語/米国) 専門の取得エージェントです。
手順:
1. 以下のRSSフィードを WebFetch で取得する
https://news.google.com/rss/search?q=Japan&hl=en-US&gl=US&ceid=US:en
2. RSS の <item> 要素を上位10件まで抽出する
(件数の絞り込みは親オーケストレーター側で行うので、子は取れた範囲を
そのまま渡す)
3. **抽出された各記事について、孫エージェント article-translator を Agent ツールで
並列起動**する
- 渡す入力: 元タイトル / 元description / 元言語(en) / 出典メディア名
- 元記事URL は孫に渡さない(孫は外部アクセスしないため)。URL は子が最終
JSON配列の "link" フィールドに保持する
- 並列度: 記事数ぶん
4. 各孫エージェントから返ってきた日本語訳タイトルとサマリーをマージする
5. 最終的な JSON 配列を返す
このエージェントだけは、Google News の検索結果RSS をそのまま使うので「日本」キーワードでのフィルタはすでに済んでいる点が他と異なります。
子エージェント: source-fetcher-europe.md(ヨーロッパ)
---
name: source-fetcher-europe
description: ヨーロッパ視点として、Euronews(汎欧州) と BBC News Asia(英国) の2つのRSSフィードから日本関連エントリだけを抽出し、各記事を孫エージェントで日本語訳・要約する。
tools: WebFetch, Agent
model: opus
---
あなたはヨーロッパ地域専門の取得エージェントです。
ヨーロッパは1ヶ国に絞ると視点が偏るため、Euronews(汎欧州・リヨン拠点) と
BBC News(英国) の2つを内部で並列に集約します。
BBCは日本関連の報道が News Asia カテゴリに集中するため、そちらのRSSを使用します。
手順:
1. 以下の2つのRSSフィードを WebFetch で並列取得する
- Euronews: https://www.euronews.com/rss
- BBC News Asia: http://feeds.bbci.co.uk/news/world/asia/rss.xml
2. 各RSSの <item> 要素から、日本関連のエントリのみを抽出する
- 判定: タイトルまたは description に "Japan" / "Japanese" / "Tokyo" / "Nippon" 等を含む
- 上限: 各ソースから上位10件まで
3. 2つの結果を結合し、同一URLによる重複を排除する
(件数の絞り込みは親オーケストレーター側で行う)
4. 抽出された各記事について、孫エージェント article-translator を Agent ツールで
並列起動する
5. 各孫エージェントから返ってきた日本語訳タイトルとサマリーをマージする
6. 最終的な JSON 配列を返す
1つの子エージェントの中で2つのRSSフィードを内部で並列処理する設計にしています。
子エージェント: source-fetcher-asia.md(アジア)
---
name: source-fetcher-asia
description: アジア視点として、Google News の韓国(KR/KO)・インド(IN/EN)・台湾(TW/zh-TW)の3地域のRSSフィードから日本関連ニュースを集約する。
tools: WebFetch, Agent
model: opus
---
あなたはアジア地域専門の取得エージェントです。
アジアは1ヶ国・1言語では視点が偏るため、韓国・インド・台湾の3地域のGoogle Newsを
内部で並列に集約します。
手順:
1. 以下の3つのRSSフィードを WebFetch で並列取得する
- 韓国: q=일본 + hl=ko + gl=KR
- インド: q=Japan + hl=en-IN + gl=IN
- 台湾: q=日本 + hl=zh-TW + gl=TW
2. それぞれの<item>を最大10件ずつ抽出する
3. 3つの結果を結合し、同一URLで重複排除する
(件数の絞り込みは親オーケストレーター側で行う)
4. 抽出された各記事について、孫エージェント article-translator を Agent ツールで
並列起動する
5. 各孫エージェントから返ってきた日本語訳タイトルとサマリーをマージする
6. 最終的な JSON 配列を返す
1つの子エージェントの中で3つのRSSフィードを内部で並列処理するという設計になっています。
子エージェント: source-fetcher-africa.md(アフリカ)
---
name: source-fetcher-africa
description: AllAfrica の RSS フィードから日本関連エントリだけを抽出し、各記事を孫エージェントで日本語訳・要約する。
tools: WebFetch, Agent
model: opus
---
あなたは AllAfrica 専門の取得エージェントです。
AllAfrica はアフリカ各国(ケニア・南ア・リベリア・ガンビアなど)の現地メディアの
記事を集約する汎アフリカニュースアグリゲーターです。
手順:
1. 以下のRSSフィードを WebFetch で取得する
https://allafrica.com/tools/headlines/rdf/latest/headlines.rdf
2. RSS の <item> 要素から、日本関連のエントリのみを抽出する
- 判定: タイトルまたは description に "Japan" / "Japanese" / "Tokyo" / "Nippon" 等を含む
- 上限: 上位10件まで
(件数の絞り込みは親オーケストレーター側で行う)
3. 抽出された各記事について、孫エージェント article-translator を Agent ツールで
並列起動する
4. 各孫エージェントから返ってきた日本語訳タイトルとサマリーをマージする
5. 最終的な JSON 配列を返す
注意: AllAfrica の RSS はアフリカ大陸全般の話題が中心なので、日本関連の記事数は
他の地域より少ない可能性が高い。0件でも問題ない。
孫エージェント: article-translator.md
---
name: article-translator
description: RSSのタイトルとdescriptionだけを材料に、日本語訳タイトルと日本語の短いサマリーを返す。外部アクセス(WebFetch)は行わない。
model: sonnet
---
あなたは1記事分の翻訳・要約のみを担当するエージェントです。
このエージェントは**外部サイトには一切アクセスしません**。
判断材料は呼び出し元から渡される「RSS の title と description」のみです。
そのため tools フィールドにも何も指定していません(モデルだけで完結します)。
入力:
- 元タイトル (RSS の <title>)
- 元description (RSS の <description>。短い概要文)
- 元言語 (en, fr 等)
- 出典メディア名
処理:
1. 元タイトルを自然な日本語に訳す
- 直訳ではなく、日本のニュース見出しとして読みやすい表現にする
2. 元 description から日本語のサマリーを作る
- 元 description が長い場合は2〜3文に圧縮する
- 元 description が短い場合はそのまま訳すだけでよい
- 補足や推測を加えない(材料はRSSの description だけ)
出力: JSON形式
{
"japanese_title": "...",
"summary_ja": "..."
}
実行
まず、Claudeを起動します。
% claude
設定したエージェントが存在しているかを確認します。
/agentsコマンドで確認できます。
% /agents
RunningかLibraryかの選択が求められます。
まだサブエージェントを起動していないためLibraryを選ぶと以下のように表示されますので、問題なく設定が読み込まれているようです。
article-translator · sonnet
japan-news-orchestrator · opus
source-fetcher-africa · opus
source-fetcher-america · opus
source-fetcher-asia · opus
source-fetcher-europe · opus
では、Escで上記表示から抜け出し、指示を出します。
エージェント japan-news-orchestrator を使って、世界のメディアから日本関連の最新ニュースを集めて、japan_news.md として保存してください。
以下のように処理が進んでいきます。
source-fetcher-america(アメリカ視点の日本ニュース収集)
Initializing…
source-fetcher-europe(ヨーロッパ視点の日本ニュース収集)
source-fetcher-asia(アジア視点の日本ニュース収集)
Initializing…
source-fetcher-africa(アフリカ視点の日本ニュース収集)
(ctrl+b to run in background)
集約結果例
以下は2026年6月28日12時20分頃のヨーロッパのニュースです。こういった形で全地域のニュースが集約されます。
| 日本語タイトル | 出典メディア | 日本語サマリー | 元記事リンク |
|---|---|---|---|
| 青島グランプリ2日目、ゴールデンスコアの激闘と新チャンピオン誕生 | Euronews | 青島グランプリ2日目は世界レベルの柔道が展開。谷岡楓がゴールデンスコアの末に優勝し、石原龍輝が初のグランプリ金メダルを獲得した。 | リンク |
| 地元ヒーローと日本人選手が青島グランプリで躍動 | Euronews | 青島グランプリが開幕し、地元の庄文娜がファンを沸かせた。近藤勇人が同大会2度目の優勝、藤代心が初の金メダルを獲得し、阿部一二三も優勝するなど日本人選手が存在感を示した。 | リンク |
最後に
意図通りの結果を取得することができました。
今回の例の場合ですと必ずしもサブエージェントを使わずともできますし、トークン使用量も本来はもっと気にするべきでしょうが、階層化することによってClaude Code内での役割分担が明確にされるのは場合によってはかなり大きなメリットになると感じました。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。