Claude Agent SDK のサブエージェントは、メインのエージェントが特定の作業を任せるために起動する、別のエージェントインスタンスです。調べものや検査を切り出して文脈を汚さない、独立した作業を並行して進める、専門の指示やツール制限を付けて任せる、といった使い方ができます。
この記事では、公式ドキュメント「Subagents in the SDK」に沿って、query() の agents オプションでサブエージェントを定義する方法、AgentDefinition の各項目、サブエージェントに渡る情報、呼び出しの検出と再開、ツール制限と深さ・同時実行数・費用の上限までを整理します。対話型の Claude Code でサブエージェントを使う方法は「Claude Code のサブエージェント活用法」を参照してください。
サブエージェントを使う利点
SDK でサブエージェントを作る方法は3つあります。
- プログラムで定義:
query()のオプションagentsに渡す(SDK アプリではこれが推奨) - ファイルで定義:
.claude/agents/ディレクトリに Markdown ファイルとして置く - 組み込みの general-purpose:何も定義しなくても、Claude は Agent ツール経由で組み込みの
general-purposeサブエージェントを呼べる
公式は、サブエージェントに任せる利点として次の4つを挙げています。
| 利点 | 内容 |
|---|---|
| 文脈の分離 | サブエージェントは自分の会話で動き、途中のツール呼び出しや結果はその中にとどまる。親に返るのは最終メッセージだけなので、大量のファイルを読んでもメインの会話に積み上がらない |
| 並列化 | 独立したサブタスクを同時に走らせられ、合計ではなく最も遅いものの時間で終わる(例:コードレビューでスタイル・セキュリティ・テストカバレッジを同時に確認) |
| 専門の指示 | サブエージェントごとに専用のシステムプロンプトを持たせられ、メインの指示に余計な情報を足さずに済む |
| ツール制限 | 使えるツールを絞れるので、意図しない操作のリスクを減らせる(例:Read と Grep だけのレビュー担当) |
agents オプションと AgentDefinition
プログラムで定義する場合は、agents に「名前 → AgentDefinition」のオブジェクトを渡します。Claude はサブエージェントを Agent ツールで呼び出すので、事前承認したいときは allowedTools に "Agent" を入れます。次は読み取り専用のレビュー担当とテスト実行担当を定義する TypeScript の例です(公式の例の prompt を短くしたもの)。
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "Review the authentication module for security issues",
options: {
allowedTools: ["Read", "Grep", "Glob", "Agent"],
agents: {
"code-reviewer": {
description: "Expert code review specialist. Use for quality, security, and maintainability reviews.",
prompt: "You are a code review specialist with expertise in security, performance, and best practices.",
tools: ["Read", "Grep", "Glob"],
model: "sonnet"
},
"test-runner": {
description: "Runs and analyzes test suites. Use for test execution and coverage analysis.",
prompt: "You are a test execution specialist. Run tests and provide clear analysis of results.",
tools: ["Bash", "Read", "Grep"]
}
}
}
})) {
if ("result" in message) console.log(message.result);
}
Python では ClaudeAgentOptions(agents={"code-reviewer": AgentDefinition(...)}) の形で同じ内容を渡します。AgentDefinition の主な項目は次のとおりです(必須は description と prompt のみ)。
| 項目 | 型 | 内容 |
|---|---|---|
description | string | 必須。どんなときにこのエージェントを使うかの説明。Claude はこれを見て任せる相手を選ぶ |
prompt | string | 必須。役割や振る舞いを決めるシステムプロンプト |
tools | string[] | 使えるツール名。省略するとサブエージェントが使えるツールをすべて引き継ぐ |
disallowedTools | string[] | 外すツール名。mcp__server・mcp__server__*・mcp__* の形も使える |
model | string | 'opus'・'sonnet'・'haiku'・'inherit' などの別名か完全なモデル ID。'inherit' はメインと同じモデル |
skills | string[] | 起動時に文脈へ読み込んでおくスキル名 |
mcpServers | 配列 | このエージェントが使える MCP サーバー(名前またはインライン設定) |
maxTurns | number | 止まるまでの最大ターン数。上限に達すると出力が途中(partial)として返り、再開して続けられる |
background | boolean | true にすると、Claude の指定にかかわらず常にバックグラウンドで実行する |
effort | 文字列または数値 | 推論の努力レベル('low'〜'max') |
permissionMode | PermissionMode | このエージェント内でのツール実行の権限モード |
ほかに memory・initialPrompt・omitClaudeMd(TypeScript のみ)もあります。Python でも disallowedTools や mcpServers のような複数語の項目は、snake_case ではなく camelCase のまま書きます。同じ名前のエージェントがファイルにもある場合は、agents で渡した定義が優先されます。
サブエージェントは既定でバックグラウンド実行です。Agent ツールの呼び出しで run_in_background が省略されるとバックグラウンドで起動し、結果を待つ必要があるときは Claude が run_in_background: false を付けます。
定義は実行時に組み立てられるので、条件に応じて中身を変えることもできます。公式の例では、厳しさのレベルを引数に取るファクトリ関数を作り、厳格なレビューのときだけ model: "opus" を使う AgentDefinition を返しています。
サブエージェントが受け取るもの
サブエージェント(フォークでないもの)の文脈は親の会話を含まずに始まります。親から渡せるのは Agent ツールの prompt 文字列だけなので、必要なファイルパス・エラーメッセージ・決定事項はその prompt に直接書きます。
| 受け取る | 受け取らない |
|---|---|
自分のシステムプロンプト(AgentDefinition.prompt)と Agent ツールの prompt | 親の会話履歴やツール結果 |
プロジェクトの CLAUDE.md(settingSources で読み込まれる場合。omitClaudeMd を指定したエージェントは除く) | スキルの中身(AgentDefinition.skills に書いたものを除く) |
ツール定義(親から引き継ぐか、tools で絞った分) | 親のシステムプロンプト |
拡張思考の設定はメインのセッションから引き継ぎます。親が受け取るのはサブエージェントの最終報告ですが、親はそれを要約して返すことがあります。サブエージェントの出力をそのまま利用者に見せたい場合は、メインの query() に渡す prompt か systemPrompt にその旨を書いておきます。
呼び出し方と検出・再開
自動の呼び出しと明示的な呼び出し
Claude はタスクの内容と各サブエージェントの description を照らし合わせて、任せるかどうかを自分で判断します。確実に特定のエージェントを使わせたいときは、prompt の中で名前を出します。
"Use the code-reviewer agent to check the authentication module"
Claude がサブエージェントに任せずに自分で処理してしまう場合も、この「名前を出す」方法と、いつ使うかがはっきり分かる description を書くことが公式の対処です。
呼び出しを検出する
サブエージェントの起動は、name が "Agent" の tool_use ブロックとして現れます。ただし system:init のツール一覧では "Task" と表示され、Claude Code v2.1.63 より前は tool_use でも "Task" だったため、両方の名前に一致させるのが安全です。サブエージェント内から来たメッセージには parent_tool_use_id が入ります(メインのセッションのメッセージでは null)。
for await (const message of query({ prompt, options })) {
const msg = message as any;
for (const block of msg.message?.content ?? []) {
if (block.type === "tool_use" && (block.name === "Task" || block.name === "Agent")) {
console.log(`Subagent invoked: ${block.input.subagent_type}`);
}
}
if (msg.parent_tool_use_id) {
console.log(" (running inside subagent)");
}
}
TypeScript ではコンテンツは message.message.content にあります(Python は message.content)。TypeScript SDK v0.3.292 以降では、サブエージェントのメッセージに agent_id も付きます。
サブエージェントを再開する
再開したサブエージェントは、それまでのツール呼び出しや結果を含む会話履歴をすべて保ったまま続きから動きます。手順は次の3つです。
- 最初の
query()のメッセージからsession_idを控える - Agent ツールの結果テキストに含まれる
agentId: <id>を取り出す - 2回目の
query()にresume: sessionIdを渡し、prompt にエージェント ID を含める(例:Resume agent ${agentId} and list the top 3 most complex endpoints)
query() は毎回新しいセッションを始めるため、同じセッションを再開しないとサブエージェントの記録にアクセスできません。カスタムエージェントの場合は、2回とも同じ agents 定義を渡します。組み込みの Explore と Plan は1回限りで agentId を返さないので、再開したいときはカスタムエージェントか general-purpose を使います。
ツール制限と上限の設定
tools でできることを絞る
tools を省略するとサブエージェントが使えるツールをすべて持ち、列挙するとそのツールだけになります。外したツールはセッションに存在しないので、許可の確認やエラーも出ずに、Claude はそれ以外の手段で作業します。公式は典型的な組み合わせを次のように示しています。
| 用途 | ツール |
|---|---|
| 読み取り専用の分析 | Read・Grep・Glob |
| テスト実行 | Bash・Read・Grep |
| コード修正(コマンド実行なし) | Read・Edit・Write・Grep・Glob |
| すべて | tools を省略 |
深さ・同時実行数・費用に上限を付ける
サブエージェントはさらに自分のサブエージェントを起動できるため、1つの prompt がエージェントの木に広がることがあります。各サブエージェントの API リクエストはクエリ全体の total_cost_usd に加算されます。公式は次の3つの上限を用意しています(TypeScript SDK v0.3.219・Python SDK v0.2.127 以降)。
| 上限 | 設定方法 | 既定値と上限に達したとき |
|---|---|---|
| 深さ | 環境変数 CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH | 既定はメインの下に3層。1 にするとサブエージェントは自分のサブエージェントを起動できない |
| 同時実行数 | 環境変数 CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS | 既定 20。超えると Concurrent subagent limit reached を返して起動を断る |
| 費用 | maxBudgetUsd(Python は max_budget_usd) | 既定は無制限。達すると新規起動を断り、走っているバックグラウンドのサブエージェントを止め、error_max_budget_usd で終了する |
環境変数は env オプションで渡します。TypeScript SDK の env はサブプロセスの環境を置き換えるので、PATH などを残すために ...process.env を展開します(Python は継承した環境にマージされます)。
options: {
allowedTools: ["Read", "Grep", "Glob", "Agent"],
env: {
...process.env,
CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH: "1",
CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS: "5",
},
maxBudgetUsd: 5,
}
数十〜数百のエージェントを協調させる規模になったら、オーケストレーションをスクリプトに移す Workflow ツール(TypeScript Agent SDK v0.3.149 以降)が公式の示す次の選択肢です。詳しくは「Claude Code のダイナミックワークフローで多数のサブエージェントを動かす」も参考にしてください。
本ページは Subagents in the SDK の内容に基づく非公式の日本語解説で、AgentDefinition の項目と parent_tool_use_id は Agent SDK reference - TypeScript と照合しています(確認日 2026-10-14)。オプション名・フィールド名は公式表記のまま記載しています。最新の仕様は公式ドキュメントを確認してください。