◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/高度な活用
⬡ 高度な活用/2026-06-27上級

Gemini Deep Research のレポートを鵜呑みにしない — MCP連携時に引用元を機械検証してから取り込む受け入れゲート

Deep ResearchがMCPで自前データに繋がった今、返ってきたレポートを自動取り込みする前に、引用が信頼ソースへ解決できるかを機械検証する受け入れゲートを実装します。許可リスト・根拠カバレッジ率・却下理由の記録まで動くコードで設計します。

Gemini91Deep Research7MCP6File Search7検証

✦ プレミアム記事

2026年6月27日の更新で、Deep Research の新版が MCP サーバー連携と File Search に対応しました。これまで公開情報を広く調べてくれる機能だったものが、自前のデータストアや手元の MCP ツールを「根拠」として参照できるようになった、という変化です。個人開発で運用の自動化を回している立場からすると、これは素直に嬉しい更新でした。自分のドキュメントやログを根拠に調べ物をさせて、その結果をそのまま下書きパイプラインに流せそうに見えるからです。

ただ、実際に組み込もうとして最初に立ち止まったのは「返ってきたレポートを、本当にそのまま取り込んでよいのか」という点でした。Deep Research の出力は引用つきの散文です。引用がついていると一見もっともらしく読めますが、その引用が本当に自分の信頼しているソースに解決できるのか、それとも外部の出所不明なページや、実体のない参照に紐づいているのかは、文面を眺めただけでは判別できません。無人で取り込む構成では、ここが抜けると「もっともらしいが根拠の怪しい文章」が静かに蓄積していきます。

以下では、Deep Research のレポートを自動取り込みする手前に挟む「受け入れゲート」を実装します。中身は、引用を構造で取り出し、信頼ソースの許可リストへ解決できるかを確かめ、根拠カバレッジ率がしきい値を下回ったら取り込みを止める、という3段構えです。ゲートのコアは外部 API の形に依存しない素の検証ロジックなので、Deep Research の SDK が細部で変わっても作り直さずに済みます。

そのまま信じてしまう構成の、どこが危ういのか

Deep Research を MCP に繋ぐと、調査の根拠として「自分の File Search ストアの文書」と「外部 Web」の両方が混ざり得ます。レポート本文には主張があり、その主張に引用が添えられます。問題は、引用の出所が三種類に分かれることです。ひとつは自分の信頼ソース(許可リストに載っている File Search の文書 ID や自分が許可したドメイン)。ふたつめは外部の知らないドメイン。みっつめは、解決しようとしても実体に辿り着けない引用です。

無人取り込みで事故るのは、二番目と三番目が混じったまま「引用あり=信頼できる」と扱ってしまうときです。とくに三番目は厄介で、引用が形式上は付いているのに、その media_id やページ番号、URL が実際のソースに解決できない、というケースが混ざります。人がレビューしていれば「これは出典が変だ」と気づきますが、自動化ではそのまま通ります。

ですから受け入れゲートで確かめたいのは、レポートの読みやすさでも文章の長さでもなく、たったひとつ「個々の引用が、信頼できるソースへ実際に解決できるか」です。これを主張ごとに集計し、解決できた割合(根拠カバレッジ率)で取り込みの可否を決めます。

レポートを構造で受け取る

検証を機械でやるには、まず引用を散文から取り出して構造にする必要があります。Deep Research を Interactions API 経由で呼ぶときは、ツールとして自分の MCP コネクタと File Search を渡し、出力に grounding メタデータを含めて受け取る形になります。下記はリクエストの骨格です。フィールド名は2026年6月の changelog に沿っていますが、利用中の SDK バージョンに合わせて微調整してください。検証の本体は次節以降の純粋なロジックなので、ここが多少変わってもゲートは作り直しになりません。

from google import genai
from google.genai import types
 
client = genai.Client()
 
# Deep Research を「自前データ優先」で走らせる骨格
# - 自分の MCP サーバーと File Search を根拠ソースとして渡す
op = client.interactions.create(
    model="gemini-flash-latest",  # 3.5 Flash GA。下調べ用途は速度とコストが効く
    agent="deep-research",
    input="社内の運用ログを根拠に、今月の自動投稿の失敗傾向をまとめてください",
    tools=[
        types.Tool(file_search=types.FileSearch(
            file_search_store_names=["projects/me/locations/global/fileSearchStores/ops-logs"],
        )),
        types.Tool(mcp=types.McpConnector(
            server_url="https://mcp.example.internal/ops",
            allowed_tools=["search_runs", "get_run"],
        )),
    ],
    config=types.InteractionConfig(
        include_grounding_metadata=True,  # 引用を構造で受け取る
        background=True,                  # 長時間処理は webhook で受ける
    ),
)

ここで大切なのは include_grounding_metadata=True です。これがないと、引用は本文中の脚注的な表現としてしか得られず、機械検証が一気に難しくなります。構造化された引用が取れれば、後段は素直なデータ処理になります。

受け取り側では、レポートを「主張(claim)」と「その主張に紐づく引用(citations)」の配列として正規化します。引用は出所の種類によって持っている情報が違うので、共通の形に寄せておきます。

from dataclasses import dataclass, field
 
@dataclass
class Citation:
    kind: str                       # "file_search" | "web" | "mcp"
    doc_id: str | None = None       # File Search の文書 ID
    media_id: str | None = None     # 視覚引用の media_id
    page_numbers: list[int] = field(default_factory=list)
    url: str | None = None          # web / mcp の出所 URL
 
@dataclass
class Claim:
    text: str
    citations: list[Citation]
 
def normalize_report(grounding) -> list[Claim]:
    claims: list[Claim] = []
    for seg in grounding.segments:
        cites = []
        for c in seg.citations:
            cites.append(Citation(
                kind=c.source_type,
                doc_id=getattr(c, "document_id", None),
                media_id=getattr(c, "media_id", None),
                page_numbers=list(getattr(c, "page_numbers", []) or []),
                url=getattr(c, "uri", None),
            ))
        claims.append(Claim(text=seg.text, citations=cites))
    return claims

この normalize_report を通すと、レポートが「主張と引用のリスト」という、検証しやすい形になります。ここから先は外部 API に触れません。

✦

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

この記事の続きを読む

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

この記事で得られること
✦Deep Research の grounding メタデータ(doc_id / media_id / page_numbers)を構造で受け取り、信頼ソースへの解決可否で判定する具体実装
✦File Search 文書IDと許可ドメインの許可リスト照合、根拠カバレッジ率(初期しきい値 0.85)による縮退ロジック
✦却下理由(doc_id_not_allowed / media_unresolvable / domain_not_allowed)をSQLiteに記録し毎晩見直す運用設計
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 高度な活用2026-09-17
Gemini の色判定が同じ壁紙で入れ替わったのは、モデルではなく渡し方の側でした
同じ壁紙を渡しているのに色名の判定が入れ替わる原因を、書き出し5通りで数えた記録です。色空間を先に決め、閉じた語彙と機械側の基準値で検算するところまでまとめました。
⬡ 高度な活用2026-08-31
画像の重複検査に埋め込み検索を足す前に、重複の定義を三つに分ける
同じ構図で色だけ違う二枚を、検査は重複と判定しました。知覚ハッシュと File Search の埋め込み検索の守備範囲を距離の実数で切り分け、何を重複と呼ぶかの定義から検査の構成を組み直した判断の記録です。
⬡ 高度な活用2026-10-14
PC では直るのに Safari でだけ画像が読み込まれない — AI に診断を頼む前に、手元で揃えておく 4 つの材料
並べ替えのあとで画像が二度と読み込まれない不具合が、iPhone の Safari でだけ起きました。PC のブラウザでは再現しない不具合を Gemini などの AI に診断してもらうとき、先に手元で揃えておく材料と、そのまま使える依頼文をまとめます。