Gemini Research MCP Server
You can run Gemini-powered web and deep research, resume sessions, export reports, and discover/invoke additional research utilities.
Perform fast grounded web research with citations (
research_web).Launch long-running autonomous Deep Research with task progress, optional file search, and report formatting (
research_deep; README also documentsresearch_deep_max, engine-neutralresearch_run, andresearch_compare).Resume interrupted or in-progress research sessions and retrieve completed reports (
resume_research).Export completed sessions to Markdown, JSON, or DOCX with disk-first saved paths (
export_research_session).Discover hidden tools by relevance and call them by name (
search_tools,call_tool) for follow-ups, webpage extraction, session listing, templates, runs/engines, bundles, and diagnostics.Use persistent sessions, shareable storage, MCP resource artifacts, collaborative planning, visualization, and optional local research engine workflows as described in the README.
Provides AI-powered research through Google Gemini's API, including fast grounded web search, autonomous deep research, session persistence and resume, and report exports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Gemini Research MCP Serverresearch the latest AI safety papers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Gemini Research MCP Server
MCP server for AI-powered research using Gemini. Fast grounded search, URL extraction, comprehensive Deep Research, and session management.
Built on FastMCP 4.1 with the modern sessionless
MCP protocol, Gemini 4 Argon for web research and follow-ups
(3.8 Flash for helpers), MCP Tasks (SEP-1732), the guard-pattern
elicitation flow, a BM25-compacted tool catalog, and pluggable Disk/Redis
storage with a zero-configuration local default.
Architecture

flowchart TB
subgraph Client["MCP Client"]
Claude["Claude / Copilot"]
end
subgraph Server["gemini-research-mcp"]
direction TB
FastMCP["FastMCP 4 Server<br/>@mcp.tool()<br/>BM25SearchTransform"]
subgraph Tools["Tools"]
RW["research_web<br/>Grounded lookup"]
RD["research_deep<br/>Autonomous 3-20min"]
RF["research_followup<br/>Continue session"]
RR["resume_research<br/>Recover interrupted"]
FW["fetch_webpage<br/>Content extraction"]
EX["export_research_session<br/>MD/JSON/DOCX"]
LS["list_research_sessions"]
LT["list_format_templates"]
end
subgraph Modules["Core Modules"]
Quick["quick.py<br/>Web grounding"]
Deep["deep.py<br/>Deep research agent"]
Content["content.py<br/>SSRF protection"]
StorageMod["storage.py<br/>Session + artifact store"]
Templates["templates.py<br/>Format templates"]
end
end
subgraph External["External Services"]
Gemini["Google Gemini API"]
Web["Web Sources<br/>via trafilatura"]
end
subgraph Storage["Persistence"]
Disk["DiskStore<br/>XDG data directory"]
Redis["Redis/Valkey<br/>shared multi-worker storage"]
end
Claude -->|"MCP Protocol"| FastMCP
FastMCP --> Tools
RW --> Quick
RD --> Deep
RF --> StorageMod
RR --> StorageMod
FW --> Content
LT --> Templates
Quick -->|"grounding"| Gemini
Deep -->|"agentic"| Gemini
Content -->|"httpx"| Web
StorageMod --> Disk
StorageMod -.-> RedisRelated MCP server: gemini-deep-research-mcp
Tools
The server exposes a BM25-compacted catalog: only the 7 tools below plus
the synthetic search_tools/call_tool pair are listed by default
(fastmcp.server.transforms.search.BM25SearchTransform). Utility tools
(fetch_webpage, research_followup, list_research_sessions,
list_format_templates, refine_research_plan,
inspect_mcp_server_for_gemini, list_research_engines,
list_research_runs, get_research_run, export_research_bundle) are hidden from the default
listing to keep the catalog small for LLM tool-selection, but remain fully
callable directly by name or via the call_tool proxy, and are discoverable
by relevance through search_tools.
Tool | Description | Latency | Visible by default |
| Web search with citations | varies | ✅ |
| Multi-step autonomous research (MCP Tasks) | 3-20 min | ✅ |
| Maximum-comprehensiveness Deep Research for exhaustive/high-stakes work | longer-running | ✅ |
| Engine-neutral research job (MCP Tasks): Gemini by default, optional local engine | engine-dependent | ✅ |
| Run exactly two engines on one query and return attributed reports (no synthesis) | engine-dependent | ✅ |
| Resume interrupted/in-progress sessions | instant | ✅ |
| Disk-first export to persistent Markdown, JSON, or DOCX artifacts | instant | ✅ |
| Discover hidden utility tools by relevance (BM25) | instant | ✅ |
| Proxy to invoke any hidden tool by name | varies | ✅ |
| Continue conversation after research | varies | discoverable |
| List saved research sessions | instant | discoverable |
| Browse report format templates | instant | discoverable |
| Iterate on or approve a | instant-3min | discoverable |
| Extract article content from a specific URL (SSRF-protected, chunkable) | 0.5-2 sec | discoverable |
| Inspect remote MCP reachability and schemas (diagnostic only) | varies | discoverable |
| Engines, backends, models and availability (configuration only, no provider call) | instant | discoverable |
| Metadata of your research jobs and comparisons ( | instant | discoverable |
| Read one run by | instant | discoverable |
| Attributed JSON/Markdown bundle of a run, with no model or search call | instant | discoverable |
research_deep / research_deep_max Deep Research parameters
Parameter | Type | Default | Description |
|
|
| Let the agent produce and persist supporting images/charts. Images are persisted as MCP resource artifacts ( |
| boolean |
| Return the drafted research plan and an interaction ID instead of running the full report. Approve or iterate on the plan with `refine_research_plan(previous_interaction_id=..., decision="approve" |
| array | null |
| Disabled. Any non-empty value fails before network or Gemini API access because provider-side Deep Research remote MCP is not reliable. |
fetch_webpage Parameters
fetch_webpage is discoverable through search_tools in the default server listing.
The fetch_webpage tool supports chunked reading for large pages and optional proxy routing:
Parameter | Type | Default | Description |
| string | required | HTTP/HTTPS URL to fetch |
| integer | null |
| Maximum characters to return (chunk size) |
| integer |
| Character offset for pagination |
| string | null |
| Optional HTTP(S) proxy URL for the request |
Notes:
SSRF protection is always applied (private/internal hosts are blocked).
robots.txtis checked before fetch whenprotegois installed.When output is truncated, the response includes a continuation hint with next
start_index.If
proxy_urlis omitted, the server falls back toFETCH_PROXY_URLwhen set.proxy_urlmust be a public HTTP(S) host (private/internal proxy hosts are blocked).
Install the web extra for the highest-quality fetch_webpage experience:
pip install 'gemini-research-mcp[web]'
# or
uv add 'gemini-research-mcp[web]'Without [web], fetch_webpage still works using the built-in HTML fallback, but trafilatura
extraction and protego-based robots.txt checks are unavailable.
Power User Workflow
Key insight: Gemini Deep Research runs asynchronously on Google's servers. Even if VS Code disconnects, your research continues. The
resume_researchtool retrieves completed work.
Features
Auto-Clarification:
research_deepasks clarifying questions for vague queries. On the modern sessionless MCP protocol this uses a stateless guard pattern (InputRequiredResult, two independent tool calls, no server-held connection); legacy handshake clients still use MCP Elicitation (ctx.elicit())Deep Research Max:
research_deep_maxexposes Google's Max agent for exhaustive, high-stakes, and offline research workflowsCollaborative Planning:
research_deep(..., collaborative_planning=True)returns the drafted plan for approval before running the full report; refine or approve it withrefine_research_planVisualization:
visualization="auto"lets Deep Research produce supporting images, persisted as downloadable MCP resource artifactsMCP Tasks: Real-time progress with streaming updates
Session Persistence: Research sessions are automatically saved and can be resumed later; shareable across instances with Redis (see Storage backends)
Persistent, Disk-First Exports: Export to Markdown, JSON, or professional DOCX with Table of Contents; artifacts survive restarts and can be shared through Redis while files are still written to disk by default
File Search: Search your own data alongside web using
file_search_store_namesFail-closed remote MCP: Deep Research rejects
mcp_serversbefore network/provider access until Google exposes a reliable structured result contractFormat Instructions: Control report structure (sections, tables, tone)
LangChain-ready: verified consumable via
langchain.mcp.MCPAdapter(LangChain1.4.0a2) over both stdio and streamable-http - seescripts/langchain_interop_smoke.py. LangChain is never a dependency of this package.
Installation
PyPI (recommended)
pip install gemini-research-mcp
# or
uv add gemini-research-mcpClaude Desktop (MCPB Bundle)
Download the .mcpb bundle from GitHub Releases and open it in Claude Desktop for single-click installation.
The bundle uses UV runtime - dependencies are installed automatically, no Python required.
Research jobs and engines
research_run and research_compare are engine-neutral jobs. They require
MCP Tasks, return a normalized result envelope
({"result": <text>, "schema_version": 1, "run": {...}}), and keep the legacy
research_deep/resume_research/export_research_session tools working.
Engine | Backend | Notes |
|
| Gemini Deep Research; recoverable by provider interaction ID |
|
| Gemini Deep Research Max |
|
| Optional, operator-installed Local Deep Research bridge; see below |
research_compare takes exactly two distinct engines and runs both. It
returns each engine's report, attributed and verbatim; it never merges or
synthesizes them. Synthesis is the caller's job. One engine failing yields a
partial result that keeps the other report. Comparing two Gemini profiles can
incur two paid research workloads.
Identifiers
Three IDs are never interchangeable:
Task ID: the MCP Task handle for one submission. A resubmitted Task is a new submission and may create a second paid job (the same logical request is not deduplicated across Tasks; there are no caller idempotency keys).
Run ID (
job_…,cmp_…): stable, derived from the owner and Task. Use it withget_research_run,export_research_bundleandlist_research_runs.Provider ID: the Gemini interaction ID. Only native jobs have one; local jobs never expose a provider ID. Provider IDs are not accepted as run IDs.
Lifecycle and recovery
Job statuses:
queued,running,completed,failed,cancelled,interrupted,expired; a comparison can also bepartial.interruptedmeans the server cannot prove an outcome.Retention uses the existing fixed TTL (
GEMINI_RESEARCH_TTL_SECONDS) set at creation; updates and refreshes never extend it. Expired runs readexpired. A submission is refused (RETENTION_TOO_SHORT) when the TTL cannot cover the engine timeout plus a cleanup margin.Ambiguous submission: if the process dies after the provider request may have been sent but before its ID was stored, the run reads
interruptedwithSUBMISSION_UNKNOWN. It is not resubmitted automatically; the provider job may still exist and be billed.Native recovery: a native run with a stored provider ID is recovered by
get_research_run(refresh=true)or the legacyresume_research. While this process still executes the job,resume_researchanswersbusy.Local non-recovery: a local run is blocking and has no provider ID. After a restart it is reported
interrupted; it is never resumed or re-run.Single owner: submission requires one owner process with in-memory Tasks and local storage. With
GEMINI_RESEARCH_STORAGE_URL(Redis) or a non-memoryFASTMCP_DOCKET_URL, submissions are refused withDISTRIBUTED_SUBMISSION_UNSUPPORTEDrather than risk duplicate paid jobs after a redelivery or a new runner. Read tools still work.
Ownership and HTTP
Runs, their linked sessions, images and bundles are owned by the authenticated
principal. Another principal sees "not found". Over streamable-http the job
tools require an authenticated principal (AUTH_REQUIRED otherwise); stdio has a
single local owner. Historical sessions with no job link stay visible as before.
The local engine is not offered over HTTP unless the operator sets
GEMINI_RESEARCH_LDR_ALLOW_HTTP=true
(LOCAL_ENGINE_HTTP_DISABLED otherwise).
Follow-ups on agent research
The Gemini API does not let a model continue an interaction that belongs to a
Deep Research agent. research_followup therefore answers from the report stored
in the session, treated as untrusted context, in a stateless model call.
Optional local engine (Local Deep Research)
The bridge targets an operator-installed ldr-mcp pinned to LDR commit
362d65652156732b08a704f0d3faa77996b4f0de (stdio only). This server installs
and starts nothing: set GEMINI_RESEARCH_LDR_COMMAND to its absolute path and
configure the LDR_* values in .env.example (Ollama on
loopback plus an explicit search backend). The engine stays unavailable until
all are set, and the Gemini-only default never spawns a child process.
Local does not mean free or private by default: the model runs on your Ollama, but the configured search backend receives queries over the network, and local compute costs time and hardware.
LDR keeps its own data and retention, separate from this server's TTL. The child process is not sandboxed. LDR's configuration is verified before any query is sent.
No boolean here is human authorization; the caller decides whether to run a paid or networked workload.
LDR can return a report with no sources when its search backend throttles or its relevance filter drops every result (observed with Wikipedia and a 4B model). The bundle then lists no sources for that engine; the report is still kept verbatim and untrusted.
Bundles
export_research_bundle(run_id, format="json"|"markdown") renders a run (single
or comparison) from stored data with no model, search or provider call. Each
engine entry carries engine, backend, model, status, recovery state, warnings,
error, sources, usage and its report, labelled verbatim and untrusted. Bundles
are saved to the export directory and as an owner-scoped research://exports/{id}
artifact.
Configuration
Variable | Required | Default | Description |
| Yes | — | |
| No |
| Shared model for |
| No |
| Model for session metadata, titles, and semantic session matching (thinking level |
| No |
| Default agent for |
| No | — | Default HTTP(S) proxy for |
| No | — |
|
| No | — | Advanced Tasks backend override. Takes priority over |
| No | XDG data dir | Custom directory for the local |
| No | backend default | Override session/export TTL |
| No |
| Disk-first destination when |
| No | — | Absolute path of an operator-installed |
| No |
| Operator opt-in to offer the local engine over |
| No |
|
|
| No |
| Bind host for |
| No |
| Bind port for |
| No |
| URL path for |
| No | — | Static bearer token required to call |
The default Gemini 4 Argon
model requires paid-tier API access.
To use the previous Flash model for web research and follow-ups, explicitly set
GEMINI_MODEL=gemini-3.8-flash in the server environment. The server does not
silently fall back to another model.
Query clarification uses fixed gemini-3.8-flash; it is not controlled by
GEMINI_SUMMARY_MODEL. Web research preserves HIGH thinking. Latency varies
with the query and provider load; neither web research nor follow-ups have a
fixed completion-time guarantee.
cp .env.example .env
# Edit .env with your API keyTransports
The server defaults to stdio, matching every existing VS Code/Claude Desktop configuration - no changes required for local, single-client use.
Streamable HTTP is opt-in, for remote or multi-client/multi-worker deployments, and is sessionless (no sticky session required across calls):
# Local-only (no auth required, loopback binding):
uv run gemini-research-mcp --transport streamable-http
# Remote-accessible (bearer token required - refuses to start otherwise):
GEMINI_RESEARCH_HTTP_BEARER_TOKEN=$(openssl rand -hex 32) \
uv run gemini-research-mcp --transport streamable-http --host 0.0.0.0 --port 8000Binding to any non-loopback host (0.0.0.0, ::, a LAN/public IP, etc.)
without GEMINI_RESEARCH_HTTP_BEARER_TOKEN set causes the server to refuse to
start - this prevents accidentally exposing your Gemini API quota to the
public internet. 127.0.0.1/localhost/::1 never require a token.
--transport, --host, --port, and --path CLI flags mirror the
GEMINI_RESEARCH_TRANSPORT/GEMINI_RESEARCH_HTTP_HOST/GEMINI_RESEARCH_HTTP_PORT/GEMINI_RESEARCH_HTTP_PATH
environment variables (CLI flags take precedence).
Storage backends
Research sessions and export artifacts are stored through a single backend-agnostic layer:
Local (default, no Redis required): sessions and exports use
DiskStoreunder the XDG data directory, while FastMCP Tasks use in-process memory (GEMINI_RESEARCH_STORAGE_PATHto override) - zero configuration, single process/single machine.Distributed (Redis/Valkey): set
GEMINI_RESEARCH_STORAGE_URL=redis://host:6379/0to share sessions, exports, and Tasks across multiple server instances or workers. SetFASTMCP_DOCKET_URLonly when Tasks must use a different backend. Requires thedistributedextra:
uv add 'gemini-research-mcp[distributed]'Deep Research vs Deep Research Max
Google exposes Deep Research variants through the Gemini Interactions API agent
field, not the regular Gemini model field:
research_deepusesdeep-research-preview-04-2026by default. Use it for interactive research, comparisons, investigations, and latency/cost-sensitive synthesis.research_deep_maxusesdeep-research-max-preview-04-2026. Use it when the user explicitly asks for Max, exhaustive/comprehensive due diligence, market maps, literature reviews, board-ready reports, offline/nightly research, or maximum completeness over speed.
For Copilot and other LLM clients, the two tools are intentionally separate so
Max can be selected from the tool name and description. There is no public
model parameter for Deep Research, because follow-up and quick research use
Gemini models while Deep Research uses Interactions agents.
Remote MCP servers for Deep Research
Disabled since v0.16.0b2. Any non-empty mcp_servers value is rejected for
both research_deep and research_deep_max before remote inspection, network
access, or Gemini API consumption.
The request shape is valid and Google documents MCP as a Deep Research tool,
but repeated paid E2E runs completed without any
mcp_server_tool_call/mcp_server_tool_result steps. One run also invented
substitute evidence after failing to obtain the fixture data. See
googleapis/python-genai#2126.
inspect_mcp_server_for_gemini remains available to inspect endpoint
reachability, tool names, and schema compatibility. It does not enable the
disabled Deep Research integration.
Remote MCP will only be reconsidered after an upstream correction and repeated E2E runs that retain non-empty structured tool-call and tool-result steps.
Usage
VS Code MCP
Add to .vscode/mcp.json:
{
"servers": {
"gemini-research": {
"command": "uvx",
"args": ["gemini-research-mcp"],
"env": {
"GEMINI_API_KEY": "your-api-key"
}
}
}
}Or run from source:
{
"servers": {
"gemini-research": {
"command": "uv",
"args": ["run", "--directory", "path/to/gemini-research-mcp", "gemini-research-mcp"],
"envFile": "${workspaceFolder}/path/to/gemini-research-mcp/.env"
}
}
}Command Line
uv run gemini-research-mcp
# or
uvx gemini-research-mcpDOCX Export
Export research sessions to professional Word documents with:
Cover page with title, date, and research metadata
Clickable Table of Contents with navigation to sections
Professional typography: Calibri fonts, 1-inch margins, 1.5x line spacing
Executive summary with elegant formatting
Full research report with proper heading hierarchy
Sources section with full clickable URLs
Metadata table with session details
VS Code Setup
To enable DOCX export, install with the [docx] extra:
{
"servers": {
"gemini-research": {
"command": "uvx",
"args": ["--from", "gemini-research-mcp[docx]", "gemini-research-mcp"],
"env": {
"GEMINI_API_KEY": "your-api-key"
}
}
}
}Downloading Files
export_research_session is disk-first: the file is always written
to disk and the absolute path is returned on the first line of the
response text (e.g. ✅ **Saved to:** /…/report.docx). This means any
MCP client — GUI or headless — gets a usable file path back.
By default exports are written to GEMINI_RESEARCH_EXPORT_DIR
(defaults to ~/.gemini-research/exports/; falls back to the system
temp dir if that location isn't writable). Override per-call with the
output_path argument:
{
"name": "export_research_session",
"arguments": {
"interaction_id": "v1_...",
"format": "docx",
"output_path": "/absolute/or/relative/path/report.docx"
}
}When output_path is supplied, the parent directory must already
exist (no silent mkdir). GUI hosts (e.g. VS Code Copilot Chat) also
receive an EmbeddedResource attachment backed by the persistent
research://exports/{id} resource store for native "Save As" — clients that can't render it can safely ignore it.
Client compatibility
research_deep requires MCP Tasks support
(SEP-1732) on the client. Clients that do not advertise the tasks
capability will receive a -32600 error.
Known client status:
VS Code Copilot Chat / MCP Inspector / Claude Desktop — supported.
GitHub Copilot CLI — tracked upstream at github/copilot-cli#2538; until that lands, use
research_webfrom the CLI.
Installation (pip/uv)
# Install with DOCX support
pip install 'gemini-research-mcp[docx]'
# or
uv add 'gemini-research-mcp[docx]'Features
Feature | Description |
Cover Page | Title, date, duration, tokens, AI agent |
Clickable TOC | Internal hyperlinks navigate to sections |
Syntax Highlighting | Pygments-powered code blocks with GitHub colors |
Professional Styling | Calibri fonts, proper heading hierarchy (H1-H4) |
Page Margins | Standard 1-inch (2.54cm) margins |
Heading Spacing |
|
Sources | Full URLs as clickable hyperlinks |
Pure Python | No external binaries (Pandoc not required) |
Resources
MCP Resources provide read-only data that clients can access:
Resource | Description |
| Available models and their capabilities |
| List cached exports ready for download |
| Download an exported file (Markdown, JSON, or DOCX) |
File Downloads
The export_research_session tool creates exports and returns a resource URI. Clients (like VS Code) can then fetch the resource to download the file with proper MIME type handling.
Development
uv sync --extra dev
uv run pytest
uv run mypy src/
uv run ruff check src/Release numbering and gates are described in docs/versioning.md.
Tests
uv run pytest # Unit tests
uv run pytest -m e2e # E2E tests (requires GEMINI_API_KEY)
uv run pytest --cov=src/gemini_research_mcp # With coveragePricing
Tool | Typical Cost |
| ~$0.01-0.05 per query |
| ~$2-5 per task |
Deep Research uses ~80-160 searches and ~250k-900k tokens per task.
License
MIT
Available Tools
9 toolscall_toolCall ToolB
Call a tool by name with the given arguments.
Use this to execute tools discovered via search_tools.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the tool to call | |
| arguments | No | Arguments to pass to the tool |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden for a generic proxy that can invoke arbitrary (potentially destructive) tools, yet says nothing about side effects, permissions, or reversibility. It also omits operational behavior an agent needs: what happens on an unknown tool name, whether arguments are validated against the target's schema, and whether the target tool's result is returned verbatim or wrapped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero padding, with the action stated first and the routing hint second. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated, no-output-schema dispatcher, the description should cover argument conformance to the target schema, error semantics for bad names/arguments, and roughly what comes back. None of that is present, leaving real ambiguity for a tool whose behavior depends entirely on inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so 'name' and 'arguments' are already documented and the baseline of 3 applies. The description adds no meaning beyond the schema — notably it never states that 'arguments' must conform to the target tool's input schema, which is the single most important semantic constraint for this parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Call a tool by name with the given arguments') and implicitly distinguishes execution from discovery by pointing at search_tools. It never mentions get_tool_schema, the other obvious sibling, so an agent can't fully tell whether it needs to inspect a schema first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this to execute tools discovered via search_tools" gives a clear triggering condition tied to a named sibling, which is more than most definitions offer. It gives no guidance on the prerequisite step of fetching argument shapes via get_tool_schema, and no exclusions or failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_research_sessionExport Research SessionARead-onlyIdempotent
Save (export, download, archive) a completed research session to a file
on disk — Word (.docx), Markdown (.md), or JSON. Use this to recover
your report after a research_deep run completes or is interrupted,
and to convert reports into a shareable Word document.
Disk-first contract. The file is always written to disk, and the
absolute path is returned on the first line of the response as
Saved to: <path>. When output_path is omitted the file lands in
GEMINI_RESEARCH_EXPORT_DIR (default ~/.gemini-research/exports/).
An EmbeddedResource is still attached so GUI hosts can expose their
native "Save As" affordance.
Similar to Google's Deep Research export feature, the DOCX output is a professional Word document suitable for sharing, archiving, or further editing.
Supported formats:
docx: Word document with headings, lists, and table of contents
markdown: Clean
.mdfile with full report and citationsjson: Machine-readable, all metadata preserved
Typical recovery flow:
research_deep(...)completes (or is resumed viaresume_research).export_research_session(format="docx")— no other arguments needed; the path on disk is returned in the response text.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional: search for a session by query text instead of interaction_id | |
| format | No | Export format: 'markdown' (.md), 'json' (.json), or 'docx' (Word document) | markdown |
| output_path | No | Filesystem path to save the exported file to. Absolute or relative to the MCP server's working directory. If omitted, the file is automatically written to GEMINI_RESEARCH_EXPORT_DIR (default ~/.gemini-research/exports/) and the resolved path is returned in the response. Parent directory must already exist when an explicit path is supplied. | |
| interaction_id | No | Interaction ID of the session to export. If not provided, exports the most recent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is behaviorally rich — disk-first contract, default export directory, mandatory return of 'Saved to: <path>', parent-directory requirement — which goes well beyond the annotations. But it explicitly says the file 'is always written to disk', which conflicts with readOnlyHint=true; the description rescues the agent from being misled, yet the definition still contains an internal inconsistency an agent must resolve.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the disk-first guarantee, and the recovery flow is scannable. It runs long for a four-parameter tool — the 'Similar to Google's Deep Research' sentence and part of the recovery flow restate usage that was already established.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates fully by specifying the response shape (absolute path on the first line as 'Saved to: <path>') and the attached EmbeddedResource for GUI hosts. An agent knows what it will get back before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds real meaning: what each format actually produces (docx with headings/lists/TOC, markdown with citations, json with metadata) and the fallback behavior and location when output_path is omitted. This lets an agent choose a format without guessing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb set (save/export/download/archive), specific resource (a completed research session), and enumerated output formats. An agent can immediately distinguish it from research_deep or resume_research, which produce or resume the session rather than persist it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States exactly when to reach for it ('to recover your report after a research_deep run completes or is interrupted') and provides a numbered recovery flow showing the preceding sibling call and that no other arguments are required. Nothing about when-not or prerequisites is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_compareResearch CompareA
Run the same question on exactly two engines and return attributed reports.
This can incur two research workloads. No synthesis, merging or scoring is performed; the caller combines the reports.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Research question sent verbatim to both engines. | |
| engines | Yes | Exactly two different engine profiles, e.g. ['gemini', 'local_deep_research']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the cost profile ('can incur two research workloads') and explicitly bounding behavior ('no synthesis, merging or scoring'), which matters given readOnlyHint=false and idempotentHint=false. Attribution of each report to its engine is also disclosed, though permissions and failure behavior when an engine errors are not covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, both load-bearing: the first defines the operation and output, the second sets cost expectations and the division of responsibility. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, no-output-schema tool, the description covers operation, cost, and return contract ('attributed reports'). Missing only the error/degraded-result behavior when one of the two engines fails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the 'exactly two different engine profiles' constraint in the engines description. The prose only reinforces the verbatim re-use of the query, adding little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run the same question), a specific resource (two engines), and a concrete output (attributed reports). The 'exactly two' constraint distinguishes it from the single-engine research_run/research_deep siblings, though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'exactly two engines' constraint implies the comparison use case, and the note that no synthesis is performed clarifies what the caller must do next. However, it never explicitly says when to choose this over research_run, research_deep, or research_web.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_deepResearch DeepARead-only
Comprehensive autonomous research agent. Takes 3-20 minutes.
Uses the fast/default April 2026 Deep Research agent. Use this by default for interactive questions, exploratory research, competitive analysis, comparisons, and latency/cost-sensitive multi-source synthesis.
For maximum-comprehensiveness research, use research_deep_max instead.
For vague queries, the tool automatically asks clarifying questions to refine the research scope before starting (when elicitation is available).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Research question or topic to investigate thoroughly | |
| mcp_servers | No | Disabled: remote MCP is currently unreliable for Deep Research. Any non-empty value fails before network or Gemini API access. | |
| visualization | No | 'auto' allows the agent to include chart/diagram images in its response | off |
| format_instructions | No | Optional report format (e.g., 'executive briefing', 'comparison table') | |
| collaborative_planning | No | When True, return the drafted research plan (not the final report) plus an interaction ID; call refine_research_plan afterwards to iterate on or approve the plan | |
| file_search_store_names | No | Optional: Gemini File Search store names to search your own data alongside web |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered, and the description adds real value on top: a 3-20 minute latency envelope and automatic clarifying-question elicitation when the query is vague. It does not restate that mcp_servers is disabled or describe the collaborative_planning handoff, but those are carried by the schema descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and latency, then the default/recommended use case, then the exclusion — good ordering for scanning. Minor waste in the model-version sentence ('fast/default April 2026 Deep Research agent') and stray line breaks, but nothing is genuinely misleading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and annotations cover the safety profile. Combined with the description's latency, use-case routing, sibling exclusion, and elicitation behavior, an agent has everything needed to decide to call it and what to expect while it runs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter including the disabled mcp_servers, the visualization enum, and the collaborative_planning follow-up call. The description adds only indirect param guidance (vague queries trigger elicitation) and no syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (autonomous research agent) with the scope-defining trait that matters most: 3-20 minute runtime. It explicitly names the sibling research_deep_max as the alternative for maximum comprehensiveness, so an agent can pick between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit default rule ('use this by default for interactive questions, exploratory research, competitive analysis, comparisons, latency/cost-sensitive synthesis') plus an explicit when-not with the named substitute. It also discloses the fallback behavior for vague queries, which changes how an agent should phrase a call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_deep_maxResearch Deep MaxARead-only
Maximum-comprehensiveness autonomous research agent.
Use when the user explicitly says "Max", "deep research max", "exhaustive", "comprehensive", "due diligence", "market map", "literature review", "high stakes", "board-ready", "offline/nightly", or asks for maximum completeness over speed.
For ordinary interactive research, use research_deep instead.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Research question or topic to investigate with maximum depth | |
| mcp_servers | No | Disabled: remote MCP is currently unreliable for Deep Research Max. Any non-empty value fails before network or Gemini API access. | |
| visualization | No | 'auto' allows the agent to include chart/diagram images in its response | off |
| format_instructions | No | Optional report format (e.g., 'executive briefing', 'comparison table') | |
| collaborative_planning | No | When True, return the drafted research plan (not the final report) plus an interaction ID; call refine_research_plan afterwards to iterate on or approve the plan | |
| file_search_store_names | No | Optional: Gemini File Search store names to search your own data alongside web |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered by structured data. The description adds beyond that: this is an autonomous agent trading speed for completeness, which implies long runtime and heavy web usage. It stops short of stating expected duration, cost, or that collaborative_planning returns a plan instead of a report (that detail lives only in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core identity, then the when-to-use triggers, then the alternative. Efficient, though the trigger list is somewhat long and mixes user phrasing with internal scheduling terms ('offline/nightly') that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted. Combined with a fully documented parameter schema and read-only annotations, the agent has nearly everything needed. The remaining gap is operational expectations: runtime, cost, and that this is a long-running autonomous job rather than a quick query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the six parameters including the disabled mcp_servers and the collaborative_planning two-step flow is already documented in the schema. The description adds no additional parameter-level meaning, which is the baseline-3 case when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: an autonomous research agent run at maximum comprehensiveness. It immediately differentiates itself from the closest sibling by naming research_deep as the ordinary-depth alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions (user says 'Max', 'deep research max', 'exhaustive', 'due diligence', 'literature review', 'board-ready', 'offline/nightly') plus the selection rule: maximum completeness over speed. It also names the exclusion case and the alternative tool for ordinary research.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_runResearch RunA
Run one research job on the selected engine as a background Task.
Each new submission can start a separate paid research job; a retried or resubmitted Task is a new job. Use get_research_run with the returned run_id to inspect or recover the result.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Research question. Sent verbatim to the selected engine. | |
| engine | No | Engine profile: 'gemini', 'gemini_max' or 'local_deep_research' (optional, operator-installed). Call list_research_engines for availability. | gemini |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-idempotent, open-world behavior, so the bar is lower; the description still adds real value by disclosing that execution is asynchronous and that retries or resubmissions spawn new paid jobs. That cost/idempotency consequence is exactly the kind of context annotations cannot express. It stops short of describing latency, engine failure behavior, or what happens when a paid job errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded: the core action and its async nature come first, then the cost caveat, then the follow-up pointer. Three tight sentences with no filler, though the phrasing 'a retried or resubmitted Task is a new job' is slightly redundant with the preceding clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly discloses that a run_id is returned and names the tool to consume it, which is the critical missing piece for a fire-and-forget job. Combined with the cost and async disclosures, an agent has enough to invoke it correctly; only error/failure semantics are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (query, engine) are already fully documented with defaults and enum-like values in the schema. The description adds only the phrase 'selected engine' and confirms the query goes to a paid job — marginal value over the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run one research job on the selected engine') and adds the key trait that it executes as a background Task. It does not explicitly differentiate itself from fixed-engine siblings like research_deep or research_web, so the agent must infer that 'selected engine' is the differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear follow-up path ('Use get_research_run with the returned run_id to inspect or recover the result') and warns that each submission is a separately paid job, which implicitly discourages blind retries. However, it never states when to prefer research_deep/research_web/research_compare or when this generic engine-selecting entry point is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_webResearch WebARead-only
Web research with Gemini grounding. Returns an answer with citations.
Uses a fixed high thinking level for higher-quality grounded answers. Latency varies with the query and provider load.
Use for: quick lookups, fact-checking, current events, documentation, "what is", "how to", real-time information, news, API references, error messages.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query or question to research on the web | |
| include_thoughts | No | Include thinking summary in response |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely useful context beyond them: fixed high thinking level (cost/quality tradeoff) and latency varying with query and provider load. It stops short of saying anything about failure modes, cost, or rate limits for an open-world call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and return shape, then one line on quality/latency, then a trigger list. Efficient overall; the latency sentence is arguably secondary but earns its place as a cost signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, and annotations cover the safety/open-world profile. The description is complete enough to call correctly; only the relationship to the deep/compare siblings and any cost expectations are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two parameters, both documented in the schema, so the baseline is 3. The description adds no meaning to either parameter — notably it says nothing about when a caller would want include_thoughts, nor how the query should be phrased (question vs keywords) for grounding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Web research with Gemini grounding. Returns an answer with citations") and adds that it uses "a fixed high thinking level". It implicitly contrasts with the deep/deep_max siblings that presumably vary thinking level, but never names them, so sibling differentiation is only inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The "Use for:" list gives concrete, recognizable triggers — quick lookups, fact-checking, current events, docs, error messages, news. It lacks any when-not guidance or explicit pointer to research_deep / research_compare for heavier or comparative work, so the agent must guess at the escalation path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_researchResume ResearchARead-only
Resume an interrupted or in-progress research_deep session.
Use when a research_deep call was cut short (client disconnect,
transport error, cancellation) or when you want to check whether a
long-running session has since completed on Gemini's servers.
Because research_deep persists its session at the start, the
research continues on Gemini's side even when the MCP client goes
away — this tool retrieves the result once it's ready.
Call with no arguments to list recoverable sessions. Call with an
interaction_id (returned by the original research_deep call or by
list_research_sessions) to check a specific session's status; if it
has completed, the full report is returned. Hand the result off to
export_research_session(format="docx") to save the report to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| interaction_id | No | Optional: specific interaction_id to resume. If not provided, shows resumable sessions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds the crucial non-obvious behavior: the session is persisted at start, so research continues server-side after the client disconnects, and results are retrievable once ready. It also discloses the dual behavior of the two call modes. It stops short of saying what is returned while a session is still running, which is the one remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then conditions, then the no-arg/id distinction, then the handoff. Every sentence carries information, though the paragraph is longer than strictly necessary for a single-optional-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be re-explained; the description instead covers the operational model that the schema cannot express. Both calling modes, the source of the id, and the downstream export path are all accounted for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining where the interaction_id comes from (the original research_deep call or list_research_sessions) and what happens when it is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (resume a research_deep session) and scopes it to interrupted/in-progress sessions. It clearly distinguishes itself from research_deep (which starts a session) so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions (client disconnect, transport error, cancellation) and a second legitimate use case (polling whether a long-running session completed). It also spells out the no-argument vs interaction_id branches and names both the sibling that supplies the id (list_research_sessions) and the natural follow-up (export_research_session).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_toolsSearch ToolsB
Search for tools using natural language.
Returns matching tool definitions ranked by relevance, in the same format as list_tools.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language query to search for tools |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It usefully discloses the ranking behavior ('ranked by relevance') and the return shape, but says nothing about matching semantics (lexical vs semantic), result limits, or whether the search space covers all registered tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core action is front-loaded before the return-format note. Slightly more structure (e.g. a single sentence) would be equally clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single parameter is fully documented. What remains missing is routing context: an agent cannot tell from this description when to search for a tool rather than directly invoke call_tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'query' parameter, so the schema already explains it. The description's 'natural language' phrasing adds only marginal semantics beyond the schema and gives no guidance on query formulation or specificity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search for tools') and adds the input modality ('natural language'), which is more than a restatement of the name. However, it never distinguishes itself from sibling call_tool, which is the obvious competing path for an agent that already knows which tool to invoke.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The reference to 'the same format as list_tools' implies this is a filtered alternative to a full listing, but list_tools is not among the provided siblings, so that anchor may not resolve for the agent. No explicit when-to-use or when-not-to-use guidance is given relative to call_tool or the research_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.17.0- Added
research_compare - Changed
research_deep3 fields changed- added
Input schema / properties / collaborative_planningAdded value: +{ + "default": false, + "description": "When True, return the drafted research plan (not the final report) plus an interaction ID; call refine_research_plan afterwards to iterate on or approve the plan", + "type": "boolean" +} - changed
Input schema / properties / mcp_servers / descriptionPrevious value: -"Optional remote MCP server configs for Deep Research. Each item may include name, url, headers, and allowed_tools."New value: +"Disabled: remote MCP is currently unreliable for Deep Research. Any non-empty value fails before network or Gemini API access." - added
Input schema / properties / visualizationAdded value: +{ + "default": "off", + "description": "'auto' allows the agent to include chart/diagram images in its response", + "enum": [ + "off", + "auto" + ], + "type": "string" +}
- Added
research_deep_max - Added
research_run
6 tool updates
v0.1.0- First observed
call_tool - First observed
export_research_session - First observed
research_deep - First observed
research_web - First observed
resume_research - First observed
search_tools
TDQS
Scored across 9 tools
The research tools are mostly distinguishable by depth, latency, and explicit use-case guidance, but research_run, research_deep, research_deep_max, and research_web have nuanced overlapping intent. The generic search_tools/call_tool pair is clear as meta-tools but sits outside the research workflow.
All names use snake_case and are readable, with a clear research_* family and verb_noun-style lifecycle/meta tools. The convention is not perfectly uniform because some tools use noun-prefixed research_* names while others start with a verb, but this is a minor deviation.
Nine tools is well-scoped for a research server with quick web lookup, deep research variants, comparison, resume/export lifecycle, and meta-tool discovery. Each tool appears to serve a distinct workflow rather than inflating the surface unnecessarily.
The surface covers research web/deep/max/compare, resume, and export, but research_run explicitly relies on get_research_run, which is not present, leaving background research jobs with no stated way to inspect or recover results. Similarly, resume_research references list_research_sessions, which is absent from the tool set.
Maintenance
Related MCP Connectors
One MCP server for all web data. Scrape, search, crawl, and AI research in one install.
Web search API and MCP server for developers building AI agents.
Unified 15-tool SEO, SERP, clean Markdown & GEO (LLM citation Share-of-Voice) MCP server.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that utilizes LangGraph and Google Gemini to conduct comprehensive research through multi-iteration deep searches and quick results. It provides high-quality analysis with automated citations and grounding metadata for thorough investigations.2MIT
- AlicenseAqualityBmaintenanceAn MCP server that exposes Gemini's Deep Research Agent for comprehensive web research.262 npm46 PyPI4MIT
- AlicenseNot gradedqualityDmaintenanceIntegrates Gemini API research capabilities (Deep Research, Quick Search, URL Analysis) into a unified MCP server, enabling comprehensive research, web search, and URL analysis through natural language.MIT
- AlicenseAqualityCmaintenanceMCP server for Google's Gemini API, enabling text, image, video, speech, embeddings, and deep research capabilities through a single tool set.10197 npmMIT