CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/API & SDK
API & SDK/2026-05-20上級

Claude エージェントのツール返り値を圧縮する — 巨大レスポンスを文脈に積まずに集約する設計

データベースの数千行、Webスクレイプ後のHTML、ファイル読み込みの数MBといった巨大なツール出力をそのまま Claude に渡すと文脈が破裂し、コストも品質も同時に悪化します。スキーマ縮約・サマリ・参照渡しの3層で圧縮する本番アーキテクチャを実装パターン付きで整理しました。

claude-agent2tool-use21context-management5mcp18production87

プレミアム記事

データベースを叩いて 8,000 行返ってきたとき、あるいは Web ページをスクレイプして 200KB の HTML が返ってきたとき、その全文をそのまま Claude のツール返り値として渡すと何が起きるか。私自身、個人開発で運営している6サイトの自動投稿パイプラインで、最初に大きく踏んだのがこの落とし穴でした。返り値 1 件あたり 60,000 トークンを超えるツールがループの中で3〜4回呼ばれ、context window はあっという間に飽和し、最終的なアウトプットの品質まで巻き添えで悪化したのです。

ツール返り値の圧縮は、エージェントを長く動かすほど効いてくる地味だが致命的な設計領域です。Anthropic の公式ドキュメントは「ツール定義の書き方」までは丁寧に書かれていますが、返り値の側をどう絞り込むかは実装者の裁量に任されています。ここでは、私が運用する自動投稿エージェント・コンテンツ監査エージェント・収益分析エージェントで実装している3層の圧縮アーキテクチャを、TypeScript のコード例とともに整理していきます。

巨大ツール返り値が引き起こす3つの劣化

「context window が大きくなったから生で渡しても大丈夫」という考え方は、コスト面でも品質面でも誤りです。具体的には次の3つが同時に悪化します。

  1. トークンコストの直接的な増加: Claude Sonnet 4.6 で 60,000 トークン × 4 ツール呼び出し = 240,000 トークン分の入力が毎ターン乗ります。$3/M トークンとして 1 リクエスト $0.72。1 日 200 リクエスト動かす自動投稿パイプラインなら月 $4,300 規模の純粋な無駄が発生します
  2. 指示追従性能の低下: 入力長が伸びるほど、システムプロンプトや指示の影響力が薄まる傾向があります。私の運用では、ツール返り値合計が 30,000 トークンを超えたあたりからスタイルガイド違反率が体感で 2 倍ほど増える印象です
  3. キャッシュ効率の崩壊: prompt caching を効かせている場合、ツール返り値が毎回変動する性質を持つため、cache hit 率がツール呼び出し回数に応じて急速に下がっていきます

整理すると、ツール返り値の圧縮は「コスト最適化」だけの問題ではなく、エージェント全体の信頼性に関わる設計レベルの判断だということです。

圧縮の3層モデル

私が実装で使っている分類は次の3層です。上の層ほど安全(情報損失が少ない)、下の層ほど強力(圧縮率が高い)。実運用ではツールごとに3層から選び、必要なら複数を組み合わせます。

第1層: スキーマプロジェクション(必要なフィールドだけ返す)

最も情報損失の少ない圧縮方法は、そもそも不要なフィールドを返さないことです。例えば Stripe の Charge オブジェクトは 50 を超えるフィールドを持ちますが、エージェントが消費分析のために必要なのは id, amount, currency, created, description の5つだけ、ということが珍しくありません。

// Claude に渡す前にプロジェクション
async function searchCharges(query: SearchQuery) {
  const charges = await stripe.charges.search({
    query: query.text,
    limit: 100,
  });
 
  // 50+フィールド × 100件 = 数十万トークン → 5フィールド × 100件 = 約1万トークン
  return {
    data: charges.data.map((c) => ({
      id: c.id,
      amount: c.amount,
      currency: c.currency,
      created: c.created,
      description: c.description,
    })),
    has_more: charges.has_more,
    next_cursor: charges.data[charges.data.length - 1]?.id,
  };
}

経験上、プロジェクションだけで 70〜90% のトークン削減が達成できることが多いです。特に外部 API ラッパー型の MCP サーバーを書くときは、「Claude が判断に使うフィールド」と「人間がダッシュボードで見たいフィールド」を区別する設計を意識すると、自然にこのレイヤーに到達します。

第2層: サマリ生成(Haiku に要約させてから渡す)

スキーマレベルでは絞れない、自由テキストの返り値が来るツールがあります。Web 検索、ファイル読み込み、ログ取得などがこれに当たります。ここでは Haiku に要約させてから Sonnet/Opus のエージェントループに渡すカスケード構成が効きます。

import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
 
async function fetchAndSummarize(url: string, focus: string) {
  const html = await fetch(url).then((r) => r.text());
  const text = stripHtml(html).slice(0, 50_000); // 約 25,000 トークン分
 
  // 5,000トークン分の入力 → 400トークン分のサマリにダウンサイズ
  const summary = await client.messages.create({
    model: "claude-haiku-4-5-20251001",
    max_tokens: 400,
    system: `次のWebページを要約してください。要約観点: ${focus}。
事実のみ。推測や評価は含めない。重要な数値は必ず残す。`,
    messages: [{ role: "user", content: text }],
  });
 
  return {
    url,
    focus,
    summary: summary.content[0].type === "text" ? summary.content[0].text : "",
    original_length: text.length,
  };
}

このパターンで重要なのは、要約観点 (focus) を呼び出し側のツールパラメータに含めることです。Claude 自身が「自分が今何を知りたいか」をツール呼び出し時に宣言する設計にしておくと、Haiku の要約が呼び出し意図に沿った内容になり、再質問のターンが減ります。

ちなみにこの「上位モデルが下位モデルに圧縮させる」発想は、私のアプリ事業で 2014 年から AdMob の最適化に使っていたメディエーション設計と発想が似ています。高単価リクエストは限られた頻度で呼び、安価な処理で先にスクリーニングして本命に回す、という構造です。Claude のエージェント設計でも同じ経済合理性が働きます。

第3層: 参照ハンドル渡し(中身は渡さず、ID だけ返す)

データそのものを文脈に積む必要がない場面では、ツール返り値を「保存しました。ID は xxxx です」だけにして、Claude が必要なときに別ツールで参照する設計が最強です。

const blobStore = new Map<string, unknown>();
 
async function executeQuery(sql: string) {
  const rows = await db.query(sql);
  const handle = `query-${crypto.randomUUID()}`;
  blobStore.set(handle, rows);
 
  // 数千行を返さず、ハンドルとサンプル3件・行数だけ返す
  return {
    handle,
    row_count: rows.length,
    sample: rows.slice(0, 3),
    columns: rows[0] ? Object.keys(rows[0]) : [],
    note: "use `query_result_aggregate` or `query_result_filter` with the handle to drill down",
  };
}
 
async function queryResultAggregate(handle: string, groupBy: string, agg: string) {
  const rows = (blobStore.get(handle) ?? []) as Record<string, unknown>[];
  // group by + 集計を実行してから返す
  return aggregate(rows, groupBy, agg);
}

参照ハンドルパターンは、Claude を「データを直接見るのではなく、集計指示を出すアナリストとして使う」発想です。本番運用では blobStore を Cloudflare KV や Durable Objects に置き換え、TTL を 1 時間程度に設定すると安定します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
巨大ツール返り値が引き起こす3種類のコスト悪化を、定量的なトークン消費の観点から把握できます
スキーマプロジェクション・サマリ生成・参照ハンドルの3層構造を、TypeScript の実装コードと一緒に取り込めます
個人開発の運用で実際に踏んだ落とし穴と、ツールごとの圧縮レベルの選び分け基準を持ち帰れます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API & SDK2026-06-29
Claude API の Context Editing を入れたらエージェントが同じ調査を繰り返したとき — クリア境界とキャッシュ無効化を計測する運用メモ
Context Editing でツール結果を自動クリアしたら、エージェントが直前に読んだ内容を忘れて同じツールを呼び直し、キャッシュも毎回壊れてコストが上がった。沈黙する劣化を計測ログで切り分け、trigger・keep・clear_at_least を実測で決める運用メモです。
API & SDK2026-06-22
pause_turn の継続ループに上限を入れる — 無人で長時間サーバーツールを安全に回す
web_search や code execution など長時間サーバーツールを使うと返ってくる pause_turn を、無人運用で安全に継続する設計をまとめました。4種類の stop_reason を1ループで分岐し、継続回数と時間に上限を入れ、セグメントを跨ぐ usage を数える実装まで扱います。
API & SDK2026-06-21
検索結果を二度運ばない — response_inclusion で消費済みブロックを応答から外す設計
dynamic filtering を有効にしたエージェントで出力トークンが膨らむ原因は、code execution が消費し終えた検索結果ブロックが応答に二重で乗ることにあります。response_inclusion を excluded にして安全に外せる条件と、full を保つべき条件を実装と判断表で整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →