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

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

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

MCP26antigravity459agents99context7TypeScript11

✦ プレミアム記事

自作の 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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 連携・プラグイン2026-09-18
MCP が欠けたまま始まったセッションを、どこで止めるか
MCP サーバーの初期化に失敗したまま始まったセッションで、エージェントは黙って別の手段に落ちます。ツールが本当に見えているかを手元で確かめる小さなスクリプトと、欠けていたときに取る三つの分岐をあらかじめ決めておく話です。
⬡ 連携・プラグイン2026-09-05
GOOGLE_GEMINI_BASE_URL を差し替えても、鍵の持ち主は変わりません
Antigravity CLI の宛先を自前のゲートウェイへ向けたとき、手元の API キーがどこまで運ばれるかを受け側で記録しました。クロスホストのリダイレクトで Authorization は落ちるのに API キーヘッダーは残る、という挙動差の実測と、鍵を端末から外すゲートウェイの組み方を書き残します。
⬡ 連携・プラグイン2026-08-22
設定ファイルを開かずに MCP サーバーを足す — agy mcp サブコマンドで構成を持ち運ぶ
8月20日の Antigravity CLI 1.1.16 で mcp サブコマンドが追加され、MCP サーバーの追加と切り替えを設定ファイルの手編集なしに行えるようになりました。stdio と HTTP それぞれの登録手順、障害の切り分け方、構成を別のマシンへ運ぶスクリプト化までをまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます