ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
連携・プラグイン/2026-06-26上級

自作 MCP サーバの巨大なツール結果でエージェントのコンテキストを溢れさせない設計

自作 MCP サーバのツールが大きな結果を一度に返すと、Antigravity のエージェントは静かに劣化します。フィールド射影・ページング・resource_link・出力予算で、コンテキストを溢れさせない実装を TypeScript の具体コードと実測値で示します。

MCP17antigravity391agents77context6TypeScript11

プレミアム記事

自作の MCP サーバを Antigravity につないで最初は快適に動いていたのに、リポジトリやデータが育ってくると、ある日からエージェントの応答が急に鈍くなった——そんな経験はないでしょうか。私自身、個人開発で4つの技術ブログの記事更新を自動化していて、記事一覧を返す自作ツールが800件を超えたあたりで、エージェントが途中から指示を取りこぼし始めました。原因はモデルの劣化でもプロンプトの崩れでもなく、ツールが一回の呼び出しで全件を返していたことでした。

ツール結果はそのままエージェントのコンテキストに積まれます。つまり MCP サーバの出力設計は、そのままエージェントの「残り思考容量」の設計でもあります。ここでは、結果が大きく育っても破綻しないサーバ側の作り方を、実装と実測の両面から整理します。

大きなツール結果は、エラーにならずに静かに効く

厄介なのは、コンテキストが圧迫されても多くの場合は例外が飛ばないことです。モデルは入る分だけ読み、古い指示や前段のツール結果を静かに押し出していきます。結果として「さっき渡したルールを無視する」「途中の手順を飛ばす」という、再現性の低い不具合として表面化します。

私が運用しているツールの素朴な実装は、こういう形でした。

// ❌ 育つと破綻する: 全件をそのまま返す
server.registerTool(
  "list_articles",
  {
    description: "サイトの記事一覧を返す",
    inputSchema: { site: z.string() },
  },
  async ({ site }) => {
    const articles = await db.allArticles(site); // 800件以上
    return {
      content: [{ type: "text", text: JSON.stringify(articles, null, 2) }],
    };
  }
);

1件あたり本文抜粋やタグを含めて平均 600 トークンだとすると、800件で約 48 万トークンです。これはどのモデルのウィンドウにも収まりません。仮に収まっても、その瞬間にエージェントの作業余力はほぼゼロになります。

まず「ツール結果が何トークンか」を測る

設計を変える前に、現状のコストを数値で押さえます。MCP サーバ側でツール結果のサイズをログに出すだけでも、どのツールが重いかがすぐ見えてきます。

import { encoding_for_model } from "tiktoken";
 
const enc = encoding_for_model("gpt-4o"); // 概算用。厳密でなくてよい
 
function logResultCost(toolName: string, payload: string) {
  const tokens = enc.encode(payload).length;
  console.error(`[mcp] ${toolName} -> ${tokens} tokens (${payload.length} chars)`);
  return tokens;
}

console.error を使うのは、MCP の stdio トランスポートでは標準出力がプロトコル専用で、ログを混ぜると通信が壊れるためです。これは自作サーバで最初にハマりやすい落とし穴なので、デバッグ出力は必ず標準エラーへ送ってください。

実際に測ると、私の環境では list_articles が単独で 48 万トークン相当、次に重い search が 6 万トークン相当でした。重いツール上位2〜3個を直すだけで、体感はほぼ元に戻ります。

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

この記事の続きを読む

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

この記事で得られること
自作 MCP サーバが返す数十万トークン級の結果でエージェントが劣化していた原因を特定し、ページングと継続トークンで1ページ2,000トークン以下に抑えられるようになります
resource_link とフィールド射影を使い、ツール契約の段階で『中身ではなく参照を返す』設計に切り替える TypeScript 実装を、自分のサーバに組み込めるようになります
出力予算(output budget)をツールの入力スキーマに組み込み、Antigravity の Managed Agents や CLI から呼んでもコンテキストが溢れない運用を、4サイト分の自動化で再現できるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

連携・プラグイン2026-05-23
Antigravity × UMP・ATT 同意率最適化エージェント — 地域別の同意 UX を週次で改善し AdMob 収益を底上げする自律ループ設計
iOS の ATT と Google UMP の同意率は AdMob の eCPM を 1.3〜2.0 倍動かす隠れた変数です。Antigravity のサブエージェントに地域別の同意 UX 実験を週次で回させ、6 アプリの ARPDAU を持ち上げた実装メモを書きます。
連携・プラグイン2026-05-19
AdMob と AppLovin MAX を並走させて、Antigravity サブエージェントで日次比較する仕組み
2014年から AdMob で運用してきた壁紙アプリに AppLovin MAX を並走させ、Antigravity のサブエージェント群に eCPM・Fill Rate・ARPDAU を日次で比較させた90日間の実装メモです。広告ネットワーク横断の正規化と異常検知の閾値を中心に書きます。
連携・プラグイン2026-04-17
Google Antigravity Python SDK 本番実装マスターガイド — マルチモーダル・エージェント・RAGパイプラインの設計から運用まで
Google Antigravity Python SDKを本番環境で使い倒すための完全ガイド。マルチモーダル入力・ツール呼び出し・RAGパイプライン・ストリーミング・コスト最適化・Cloud Runデプロイまで、実動作するコード付きで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →