Skip to main content
Glama
machinemates-ai

Gemini Research MCP Server

Gemini Research MCP Server

PyPI version CI Python 3.12+ License: MIT

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

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 -.-> Redis

Related 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

research_web

Web search with citations

varies

✅

research_deep

Multi-step autonomous research (MCP Tasks)

3-20 min

✅

research_deep_max

Maximum-comprehensiveness Deep Research for exhaustive/high-stakes work

longer-running

✅

research_run

Engine-neutral research job (MCP Tasks): Gemini by default, optional local engine

engine-dependent

✅

research_compare

Run exactly two engines on one query and return attributed reports (no synthesis)

engine-dependent

✅

resume_research

Resume interrupted/in-progress sessions

instant

✅

export_research_session

Disk-first export to persistent Markdown, JSON, or DOCX artifacts

instant

✅

search_tools

Discover hidden utility tools by relevance (BM25)

instant

✅

call_tool

Proxy to invoke any hidden tool by name

varies

✅

research_followup

Continue conversation after research

varies

discoverable

list_research_sessions

List saved research sessions

instant

discoverable

list_format_templates

Browse report format templates

instant

discoverable

refine_research_plan

Iterate on or approve a collaborative_planning=True plan

instant-3min

discoverable

fetch_webpage

Extract article content from a specific URL (SSRF-protected, chunkable)

0.5-2 sec

discoverable

inspect_mcp_server_for_gemini

Inspect remote MCP reachability and schemas (diagnostic only)

varies

discoverable

list_research_engines

Engines, backends, models and availability (configuration only, no provider call)

instant

discoverable

list_research_runs

Metadata of your research jobs and comparisons (limit 1-100)

instant

discoverable

get_research_run

Read one run by run_id; refresh=true re-polls a native provider job

instant

discoverable

export_research_bundle

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

visualization

"off" | "auto"

"off"

Let the agent produce and persist supporting images/charts. Images are persisted as MCP resource artifacts (research://exports/{id}), never inlined as text.

collaborative_planning

boolean

false

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"

mcp_servers

array | null

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

url

string

required

HTTP/HTTPS URL to fetch

max_length

integer | null

null

Maximum characters to return (chunk size)

start_index

integer

0

Character offset for pagination

proxy_url

string | null

null

Optional HTTP(S) proxy URL for the request

Notes:

  • SSRF protection is always applied (private/internal hosts are blocked).

  • robots.txt is checked before fetch when protego is installed.

  • When output is truncated, the response includes a continuation hint with next start_index.

  • If proxy_url is omitted, the server falls back to FETCH_PROXY_URL when set.

  • proxy_url must 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

Power User Workflow

Key insight: Gemini Deep Research runs asynchronously on Google's servers. Even if VS Code disconnects, your research continues. The resume_research tool retrieves completed work.

Features

  • Auto-Clarification: research_deep asks 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_max exposes Google's Max agent for exhaustive, high-stakes, and offline research workflows

  • Collaborative Planning: research_deep(..., collaborative_planning=True) returns the drafted plan for approval before running the full report; refine or approve it with refine_research_plan

  • Visualization: visualization="auto" lets Deep Research produce supporting images, persisted as downloadable MCP resource artifacts

  • MCP 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_names

  • Fail-closed remote MCP: Deep Research rejects mcp_servers before network/provider access until Google exposes a reliable structured result contract

  • Format Instructions: Control report structure (sections, tables, tone)

  • LangChain-ready: verified consumable via langchain.mcp.MCPAdapter (LangChain 1.4.0a2) over both stdio and streamable-http - see scripts/langchain_interop_smoke.py. LangChain is never a dependency of this package.

Installation

pip install gemini-research-mcp
# or
uv add gemini-research-mcp

Claude 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 (default)

gemini-native

Gemini Deep Research; recoverable by provider interaction ID

gemini_max

gemini-native

Gemini Deep Research Max

local_deep_research

local-deep-research

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 with get_research_run, export_research_bundle and list_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 be partial. interrupted means 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 read expired. 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 interrupted with SUBMISSION_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 legacy resume_research. While this process still executes the job, resume_research answers busy.

  • 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-memory FASTMCP_DOCKET_URL, submissions are refused with DISTRIBUTED_SUBMISSION_UNSUPPORTED rather 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

GEMINI_API_KEY

Yes

—

Google AI Studio API key

GEMINI_MODEL

No

gemini-4-argon

Shared model for research_web and research_followup

GEMINI_SUMMARY_MODEL

No

gemini-3.8-flash

Model for session metadata, titles, and semantic session matching (thinking level low)

DEEP_RESEARCH_AGENT

No

deep-research-preview-04-2026

Default agent for research_deep; accepts fast, standard, deep-research, max, deep-research-max, or exact agent IDs

FETCH_PROXY_URL

No

—

Default HTTP(S) proxy for fetch_webpage

GEMINI_RESEARCH_STORAGE_URL

No

—

redis://... URL to share sessions, exports, and (unless overridden) Tasks across multiple instances/workers. Local DiskStore + memory Tasks remain the default

FASTMCP_DOCKET_URL

No

—

Advanced Tasks backend override. Takes priority over GEMINI_RESEARCH_STORAGE_URL; unset preserves memory Tasks locally

GEMINI_RESEARCH_STORAGE_PATH

No

XDG data dir

Custom directory for the local DiskStore

GEMINI_RESEARCH_TTL_SECONDS

No

backend default

Override session/export TTL

GEMINI_RESEARCH_EXPORT_DIR

No

~/.gemini-research/exports/

Disk-first destination when export_research_session has no output_path

GEMINI_RESEARCH_LDR_COMMAND

No

—

Absolute path of an operator-installed ldr-mcp; enables the optional local_deep_research engine (see Research jobs and engines)

GEMINI_RESEARCH_LDR_ALLOW_HTTP

No

false

Operator opt-in to offer the local engine over streamable-http

GEMINI_RESEARCH_TRANSPORT

No

stdio

stdio (default, historical) or streamable-http (opt-in, see Transports)

GEMINI_RESEARCH_HTTP_HOST

No

127.0.0.1

Bind host for streamable-http. Non-loopback requires GEMINI_RESEARCH_HTTP_BEARER_TOKEN

GEMINI_RESEARCH_HTTP_PORT

No

8000

Bind port for streamable-http

GEMINI_RESEARCH_HTTP_PATH

No

/mcp

URL path for streamable-http

GEMINI_RESEARCH_HTTP_BEARER_TOKEN

No

—

Static bearer token required to call streamable-http. Never reuse GEMINI_API_KEY for this

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 key

Transports

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 8000

Binding 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 DiskStore under the XDG data directory, while FastMCP Tasks use in-process memory (GEMINI_RESEARCH_STORAGE_PATH to override) - zero configuration, single process/single machine.

  • Distributed (Redis/Valkey): set GEMINI_RESEARCH_STORAGE_URL=redis://host:6379/0 to share sessions, exports, and Tasks across multiple server instances or workers. Set FASTMCP_DOCKET_URL only when Tasks must use a different backend. Requires the distributed extra:

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_deep uses deep-research-preview-04-2026 by default. Use it for interactive research, comparisons, investigations, and latency/cost-sensitive synthesis.

  • research_deep_max uses deep-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-mcp

DOCX 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_web from 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

keep_with_next prevents orphan headings

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

research://models

Available models and their capabilities

research://exports

List cached exports ready for download

research://exports/{id}

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 coverage

Pricing

Tool

Typical Cost

research_web

~$0.01-0.05 per query

research_deep

~$2-5 per task

Deep Research uses ~80-160 searches and ~250k-900k tokens per task.

License

MIT

Available Tools

9 tools
call_toolCall ToolB

Call a tool by name with the given arguments.

Use this to execute tools discovered via search_tools.

NameRequiredDescriptionDefault
nameYesThe name of the tool to call
argumentsNoArguments to pass to the tool

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 SessionA
Read-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 .md file with full report and citations

  • json: Machine-readable, all metadata preserved

Typical recovery flow:

  1. research_deep(...) completes (or is resumed via resume_research).

  2. export_research_session(format="docx") — no other arguments needed; the path on disk is returned in the response text.

NameRequiredDescriptionDefault
queryNoOptional: search for a session by query text instead of interaction_id
formatNoExport format: 'markdown' (.md), 'json' (.json), or 'docx' (Word document)markdown
output_pathNoFilesystem 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_idNoInteraction ID of the session to export. If not provided, exports the most recent.

TDQS

A4.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
queryYesResearch question sent verbatim to both engines.
enginesYesExactly two different engine profiles, e.g. ['gemini', 'local_deep_research'].

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 DeepA
Read-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).

NameRequiredDescriptionDefault
queryYesResearch question or topic to investigate thoroughly
mcp_serversNoDisabled: remote MCP is currently unreliable for Deep Research. Any non-empty value fails before network or Gemini API access.
visualizationNo'auto' allows the agent to include chart/diagram images in its responseoff
format_instructionsNoOptional report format (e.g., 'executive briefing', 'comparison table')
collaborative_planningNoWhen 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_namesNoOptional: Gemini File Search store names to search your own data alongside web

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MaxA
Read-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.

NameRequiredDescriptionDefault
queryYesResearch question or topic to investigate with maximum depth
mcp_serversNoDisabled: remote MCP is currently unreliable for Deep Research Max. Any non-empty value fails before network or Gemini API access.
visualizationNo'auto' allows the agent to include chart/diagram images in its responseoff
format_instructionsNoOptional report format (e.g., 'executive briefing', 'comparison table')
collaborative_planningNoWhen 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_namesNoOptional: Gemini File Search store names to search your own data alongside web

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
queryYesResearch question. Sent verbatim to the selected engine.
engineNoEngine profile: 'gemini', 'gemini_max' or 'local_deep_research' (optional, operator-installed). Call list_research_engines for availability.gemini

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 WebA
Read-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.

NameRequiredDescriptionDefault
queryYesSearch query or question to research on the web
include_thoughtsNoInclude thinking summary in response

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 ResearchA
Read-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.

NameRequiredDescriptionDefault
interaction_idNoOptional: specific interaction_id to resume. If not provided, shows resumable sessions.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
queryYesNatural language query to search for tools

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 4 tool updatesv0.17.0
    • Addedresearch_compare
    • Changedresearch_deep3 fields changed
      • addedInput schema / properties / collaborative_planning
        Added 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"
        +}
      • changedInput schema / properties / mcp_servers / description
        Previous 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."
      • addedInput schema / properties / visualization
        Added value: +{
        +  "default": "off",
        +  "description": "'auto' allows the agent to include chart/diagram images in its response",
        +  "enum": [
        +    "off",
        +    "auto"
        +  ],
        +  "type": "string"
        +}
    • Addedresearch_deep_max
    • Addedresearch_run
  2. 6 tool updatesv0.1.0
    • First observedcall_tool
    • First observedexport_research_session
    • First observedresearch_deep
    • First observedresearch_web
    • First observedresume_research
    • First observedsearch_tools

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers