サブエージェントのtools:で使えるツールを絞る:入力トークンが約4.7万から約3,000に減った
私の経験に基づく記録ですので、これを推奨するものでも、動作を保証するものでもありません。あくまでも参考情報としてご覧ください。
サブエージェントに CLAUDE.md を渡さないようにしても、子の入力は約4.7万トークン残っていて、中身はほぼツールの定義でした(コチラ)。
いらないツールを読み込まないようにできないかな?と思い、frontmatter の tools: で使えるツールを絞ってみました。
ツールを Read だけにしたら、子の入力トークンは約4.7万から約3,000に減りました。
確認した環境は Claude デスクトップアプリ(Claude Code 2.1.309)です。
作ったもの
前回の nomd と同じ中身に、tools: Read を1行足した nomd-min を .claude/agents/ に置きました。
公式ドキュメントによると、tools: を省略すると親が使える全部のツール(MCP 含む)を子が引き継ぎます。
---
name: nomd-min
description: 実験用。与えられた情報だけで質問に答える
model: haiku
omitClaudeMd: true
tools: Read
---
あなたは実験用のサブエージェントです。ツールは使わず、与えられている情報だけで答えてください。知らないことは「知らない」と書いてください。
今回の子はツールを使わないので Read も要りませんが、tools: を空にする書き方は試していないので、読むだけの Read を1つ残しました。
試したこと
前回と同じ3問を、新しいセッションから nomd と nomd-min にそれぞれ答えさせました。
nomd-min のサブエージェントを1つ起動して、ツールを使わず、与えられている情報だけで次の3つに答えさせて。知らなければ「知らない」と書かせて。子の報告は要約せず、そのまま返して。
①このプロジェクトの CLAUDE.md に書いてあるブログ名・ペンネーム
②自分に CLAUDE.md の内容が渡されているか(渡されていれば、その冒頭の見出し行をそのまま引用)
③自分のモデル ID
① 知らない。与えられた情報に CLAUDE.md の内容は含まれていない。
② 渡されていない。
③ claude-haiku-5-5。
結果
| tools 指定なし | tools: Read | |
|---|---|---|
| 子に送られたツールの定義 | 44個・約15万字 | 3個・約4千字 |
| スキル一覧(説明文の列挙) | 約1.6万字 | なし |
| 子の入力トークン | 約4.7万 | 約3,000 |
| 指示から報告まで | 5秒 | 3秒 |
相当減りました。
減り方は、繋いでいる MCP やスキルの数、Claude Code の版で変わります。私の環境では約94%減でした。
トークン数は前回と同じく、~/.claude/projects/ の下の subagents/ に残る子のログの usage から取りました。
44個のうち30個ほどは、デスクトップアプリが足すブラウザや画面系の MCP ツールで、今回の子には1つも要らないものでした。
tools: Read にすると、残るのは Read と、報告を親に返すための内部ツールだけになります。
スキル一覧も一緒に消えた
減ったのはツールの定義だけではありませんでした。
tools を絞らない方の子は、ブログ名を「スキル一覧の説明文に出てくる」と答えていましたが、絞った方は「知らない」でした。
tools: に Skill を入れないと、スキル一覧(各スキルの説明文の列挙・約1.6万字)も子に付かなくなります。
公式には「Skill を外すとスキルを呼べなくなる」とだけあるので、一覧ごと消えるのは私の環境での実測です。
スキルの説明文は「コンテキストを食うので短く」と公式にもあり、34本分で1.6万字は確かに短くなかったです笑
MCP のツールも指定してみる
tools: には MCP のツールも書けます。
公式によると、名前は mcp__<サーバー名>__<ツール名> で、末尾を __* にするとそのサーバーのツールを全部許可できます。
試しに Google Drive(claude.ai のコネクタ)を足した nomd-drive を作り、同じ3問で答えさせました。
Drive のコネクタは、親のセッションで接続済み(ON)の状態で試しています。
tools: Read, mcp__<サーバー名>__*
Google Drive のサーバー名は、英数字の ID のようです。
セッションで「Google Drive の MCP のツール名を一覧して」と聞くと、mcp__ のようにそのまま書ける形で出てきました。
nomd-min と比べた結果です。
| tools: Read | tools: Read+Drive | |
|---|---|---|
| 子に送られたツールの定義 | 3個・約4千字 | 8個・約1万字 |
| 子の入力トークン | 約3,000 | 約4,300 |
Drive のツール5個が増えた分だけ、入力が約1,300増えました。
必要な MCP だけ足しても軽いままです。
まとめ
サブエージェントに CLAUDE.md が不要なら omitClaudeMd と書き、tools: で必要な MCP やスキルに絞ることで、トークンの節約ができました。
親本体はこの絞り方ができないので、子ごとに CLAUDE.md・ツール・モデルを選べるのは、サブエージェントのメリットの1つだと思います。
今後は、子に何をさせるかをちゃんと設計した上で、tools: を書くようにしていきます。