Skip to main content
Glama

SerpMCP

PyPI version PyPI downloads Python 3.10+ License: MIT MCP

A Model Context Protocol (MCP) server for Google search using SERP API through the AceDataCloud API.

Perform Google searches and get structured results directly from Claude, VS Code, or any MCP-compatible client.

Features

  • Web Search - Regular Google web search with structured results

  • Image Search - Search for images with URLs and thumbnails

  • News Search - Get latest news articles on any topic

  • Video Search - Find videos from YouTube and other sources

  • Places Search - Search for local businesses and places

  • Maps Search - Find locations and geographic information

  • Knowledge Graph - Get structured entity information

  • Localization - Support for multiple countries and languages

  • Time Filtering - Filter results by time range

Related MCP server: SerpApi MCP Server

Tool Reference

Tool

Description

serp_google_search

Search Google and get structured results using the SERP API.

serp_google_images

Search Google Images and get image results.

serp_google_news

Search Google News and get news article results.

serp_google_videos

Search Google Videos and get video results.

serp_google_places

Search Google for local places and businesses.

serp_google_maps

Search Google Maps for locations.

serp_list_search_types

List all available Google search types.

serp_list_countries

List commonly used country codes for Google search.

serp_list_languages

List commonly used language codes for Google search.

serp_list_time_ranges

List available time range filters for Google search.

serp_get_usage_guide

Get a comprehensive guide for using the Google SERP tools.

Connect: hosted OAuth, API token, or local stdio

The hosted endpoint is https://serp.mcp.acedata.cloud/mcp. Choose one route for the MCP client:

Route

When to use it

Credential setup

Hosted OAuth

The client supports remote MCP OAuth

Add only the URL, then sign in to AceDataCloud and approve access. No token needs to be pasted into client configuration.

Hosted API token

The client cannot finish OAuth, or you need an explicit integration credential

Send an AceDataCloud API token in the Authorization: Bearer … header. Keep it in a local secret store or environment variable.

Local stdio

The client runs a local MCP process

Install mcp-serp and pass ACEDATACLOUD_API_TOKEN to that process. It still calls the AceDataCloud API.

The hosted service advertises OAuth metadata and Dynamic Client Registration (DCR). DCR registers the client application; it is not an API key. OAuth signs you in and the client sends the resulting Bearer token; it may reuse or create an API credential for the account. Browser sign-in still requires an AceDataCloud account. The hosted service can be metered: review current service documentation and displayed pricing before a real operation. Do not configure both an OAuth login and a fixed Authorization header for the same server.

Hosted OAuth examples

  • Claude and Claude Desktop chat: Add a remote custom connector in Customize → Connectors → Add custom connector, enter https://serp.mcp.acedata.cloud/mcp, select sign-in, and choose Register automatically if Claude asks how to register its OAuth client. Complete consent. Claude Desktop's local claude_desktop_config.json is a separate setup. Claude connector guide.

  • Claude Code: claude mcp add --transport http --scope user serp https://serp.mcp.acedata.cloud/mcp, then start claude, open /mcp, and authenticate the Serp server. Claude Code MCP guide.

  • Cursor: Add a remote server with only https://serp.mcp.acedata.cloud/mcp. For a project, merge the entry below into <project>/.cursor/mcp.json; for personal use, use ~/.cursor/mcp.json. Cursor MCP guide.

  • VS Code / Copilot: Run MCP: Add Server, select HTTP, enter https://serp.mcp.acedata.cloud/mcp, then finish the browser sign-in. New portable workspace configs use <project>/.mcp.json; the VS Code-specific format below uses <project>/.vscode/mcp.json or the user profile. Check MCP: List Servers. VS Code MCP setup.

  • Codex: codex mcp add serp --url https://serp.mcp.acedata.cloud/mcp, then codex mcp login serp. Its user settings are in ~/.codex/config.toml. Official Codex MCP guide.

Cursor project config (OAuth):

{
  "mcpServers": {
    "serp": {"url": "https://serp.mcp.acedata.cloud/mcp"}
  }
}

VS Code-specific workspace config (OAuth):

{
  "servers": {
    "serp": {"type": "http", "url": "https://serp.mcp.acedata.cloud/mcp"}
  }
}

Hosted API token

  1. Open Ace Data Cloud → Applications. Sign in, or register an account first.

  2. Find General application. If it has not been created, choose Initialize General Application. A general key can use the services available to your account; a dedicated application's key is limited to its service. Check the required service/model access and current pricing.

  3. Copy the API Key from the application card, or open Keys / Manage Keys → Create to create a separate key for this integration. Give it a recognizable name so you can revoke or rotate it independently.

  4. When creating a key, review Expiration Time, Set Usage Limitation, and Allowed APIs. Enable only the restrictions you need, allow the operations you will call, then click Create and copy the token from the key list. Task lookup does not grant permission to submit a generation. Confirm the application's balance can cover your first request; any trial allowance is whatever your account currently displays.

  5. Copy only the token value, without quotation marks, spaces, or Bearer . An API Key / API Token field expects this raw value; only a manually configured HTTP Authorization header needs the Bearer prefix. A platform-... account-management token cannot replace a generation API key.

Copy an application API key or open Manage Keys

Create a separately named key with optional restrictions

Save the key in the client's credential store or the environment variable shown below. Never put it in a prompt, shared workflow, screenshot, or Git commit. If authentication fails, check the full copied value, application/service access, expiration, usage limit, and balance before creating another key.

A fixed Bearer header bypasses OAuth. If the header is invalid, remove it before trying browser sign-in; keep the saved credential private.

For Claude Code, the shell expands the token when you add the server; treat the saved user MCP config as a secret:

export ACEDATACLOUD_API_TOKEN='YOUR_API_TOKEN'
claude mcp add --transport http --scope user serp https://serp.mcp.acedata.cloud/mcp \
  --header "Authorization: Bearer $ACEDATACLOUD_API_TOKEN"

For a Claude Code project config, put a variable reference in <project>/.mcp.json and set that variable in the environment that launches Claude Code:

{
  "mcpServers": {
    "serp": {
      "type": "http",
      "url": "https://serp.mcp.acedata.cloud/mcp",
      "headers": {"Authorization": "Bearer ${ACEDATACLOUD_API_TOKEN}"}
    }
  }
}

Cursor uses a different environment-variable syntax in ~/.cursor/mcp.json or an uncommitted project config:

{
  "mcpServers": {
    "serp": {
      "url": "https://serp.mcp.acedata.cloud/mcp",
      "headers": {"Authorization": "Bearer ${env:ACEDATACLOUD_API_TOKEN}"}
    }
  }
}

In VS Code, run MCP: Open User Configuration and merge this server plus its masked input; ${input:...} is for VS Code's user/workspace format and is not portable to the Agent Host .mcp.json format:

{
  "inputs": [
    {"id": "acedata-serp-token", "type": "promptString", "description": "AceDataCloud API token", "password": true}
  ],
  "servers": {
    "serp": {
      "type": "http",
      "url": "https://serp.mcp.acedata.cloud/mcp",
      "headers": {"Authorization": "Bearer ${input:acedata-serp-token}"}
    }
  }
}

For Cline, use its MCP configuration UI or CLI file ~/.cline/data/settings/cline_mcp_settings.json; its remote transport value is streamableHttp. For JetBrains AI Assistant, add a remote URL from Settings → Tools → AI Assistant → Model Context Protocol (MCP). For Zed, use a context_servers entry with the URL only for OAuth or add a local Bearer header. These clients have different configuration schemas; follow their current UI rather than copying another client's JSON. Cline · JetBrains · Zed.

Local stdio

Install the package and give the local process an API token:

python -m pip install mcp-serp
export ACEDATACLOUD_API_TOKEN='YOUR_API_TOKEN'
mcp-serp

For Claude Desktop local MCP, merge this entry into the file opened by its developer settings (~/Library/Application Support/Claude/claude_desktop_config.json on macOS). uvx requires uv on PATH:

{
  "mcpServers": {
    "serp": {
      "command": "uvx",
      "args": ["mcp-serp"],
      "env": {"ACEDATACLOUD_API_TOKEN": "YOUR_API_TOKEN"}
    }
  }
}

Keep this user-level file private. Self-hosted HTTP uses mcp-serp --transport http --port 8000; expose it only with suitable network and TLS controls. Local execution still calls the AceDataCloud API.

Check before using the service

  1. https://serp.mcp.acedata.cloud/health returning {"status":"ok"} checks endpoint reachability only.

  2. Confirm that the MCP client loads tools. serp_list_search_types and serp_get_usage_guide are local reference tools with no search API charge; they do not verify downstream API access or balance. Search tools are read-only but consume Credits, and repeating a search can incur another charge.

  3. If you need a full API check, call serp_google_search with your own valid input after reviewing current service documentation and displayed pricing.

For 401, check which auth route the client used and whether the token or OAuth session is valid. A 403 may mean an account permission or content moderation failure; read the returned error. Insufficient balance and downstream service failures need their own diagnosis. A listed tool or submitted task does not prove a successful result.

Available Tools

Search Tools

Tool

Description

serp_google_search

Flexible Google search with all options

serp_google_images

Search for images

serp_google_news

Search for news articles

serp_google_videos

Search for videos

serp_google_places

Search for local places/businesses

serp_google_maps

Search for map locations

Information Tools

Tool

Description

serp_list_search_types

List available search types

serp_list_countries

List country codes for localization

serp_list_languages

List language codes for localization

serp_list_time_ranges

List time range filter options

serp_get_usage_guide

Get comprehensive usage guide

Usage Examples

User: Search for information about artificial intelligence

Claude: I'll search for information about AI.
[Calls serp_google_search with query="artificial intelligence"]

News Search with Time Filter

User: What's the latest news about technology?

Claude: I'll search for recent tech news.
[Calls serp_google_news with query="technology", time_range="qdr:d"]
User: Find popular restaurants in Tokyo

Claude: I'll search for restaurants in Tokyo.
[Calls serp_google_places with query="popular restaurants Tokyo", country="jp"]
User: Find images of the Northern Lights

Claude: I'll search for aurora borealis images.
[Calls serp_google_images with query="Northern Lights aurora borealis"]

Search Parameters

Search Types

Type

Description

search

Regular web search (default)

images

Image search

news

News articles

maps

Map results

places

Local businesses

videos

Video results

Time Range Filters

Code

Time Range

h

Past hour

qdr:h

Past hour

d

Past day

qdr:d

Past day

w

Past week

qdr:w

Past week

m

Past month

qdr:m

Past month

y

Past year

qdr:y

Past year

Image Size Filters (for images search type)

large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp

Common Country Codes

Code

Country

us

United States

uk

United Kingdom

cn

China

jp

Japan

de

Germany

fr

France

Common Language Codes

Code

Language

en

English

zh-cn

Chinese (Simplified)

ja

Japanese

es

Spanish

fr

French

de

German

Response Structure

Regular Search Results

  • knowledge_graph: Entity information (company, person, etc.)

  • answer_box: Direct answers

  • organic: Regular search results with title, link, snippet

  • people_also_ask: Related questions

  • related_searches: Related queries

Image Search Results

  • images: Image results with URLs and thumbnails

News Search Results

  • news: News articles with source and date

Configuration

Environment Variables

Variable

Description

Default

ACEDATACLOUD_API_TOKEN

API token from AceDataCloud

Required

ACEDATACLOUD_API_BASE_URL

API base URL

https://api.acedata.cloud

ACEDATACLOUD_OAUTH_CLIENT_ID

OAuth client ID (hosted mode)

—

ACEDATACLOUD_PLATFORM_BASE_URL

Platform base URL

https://platform.acedata.cloud

SERP_REQUEST_TIMEOUT

Request timeout in seconds

30

LOG_LEVEL

Logging level

INFO

Command Line Options

mcp-serp --help

Options:
  --version          Show version
  --transport        Transport mode: stdio (default) or http
  --port             Port for HTTP transport (default: 8000)

Development

Setup Development Environment

# Clone repository
git clone https://github.com/AceDataCloud/SerpMCP.git
cd SerpMCP

# Create virtual environment
python -m venv .venv
source .venv/bin/activate  # or `.venv\Scripts\activate` on Windows

# Install with dev dependencies
pip install -e ".[dev,test]"

Run Tests

# Run unit tests
pytest

# Run with coverage
pytest --cov=core --cov=tools

# Run integration tests (requires API token)
pytest tests/test_integration.py -m integration

Code Quality

# Format code
ruff format .

# Lint code
ruff check .

# Type check
mypy core tools

Build & Publish

# Install build dependencies
pip install -e ".[release]"

# Build package
python -m build

# Upload to PyPI
twine upload dist/*

Project Structure

SerpMCP/
├── core/                   # Core modules
│   ├── __init__.py
│   ├── client.py          # HTTP client for SERP API
│   ├── config.py          # Configuration management
│   ├── exceptions.py      # Custom exceptions
│   └── server.py          # MCP server initialization
├── tools/                  # MCP tool definitions
│   ├── __init__.py
│   ├── search_tools.py    # Search tools
│   └── info_tools.py      # Information tools
├── prompts/                # MCP prompt templates
│   └── __init__.py
├── tests/                  # Test suite
│   ├── conftest.py
│   ├── test_client.py
│   └── test_config.py
├── deploy/                 # Deployment configs
│   └── production/
│       ├── deployment.yaml
│       ├── ingress.yaml
│       └── service.yaml
├── .env.example           # Environment template
├── .gitignore
├── CHANGELOG.md
├── Dockerfile             # Docker image for HTTP mode
├── docker-compose.yaml    # Docker Compose config
├── LICENSE
├── main.py                # Entry point
├── pyproject.toml         # Project configuration
└── README.md

API Reference

This server wraps the AceDataCloud Google SERP API:

Contributing

Contributions are welcome! Please:

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing)

  3. Commit your changes (git commit -m 'Add amazing feature')

  4. Push to the branch (git push origin feature/amazing)

  5. Open a Pull Request

Documentation

Documentation

License

MIT License - see LICENSE for details.


Made with love by AceDataCloud

Available Tools

11 tools
serp_get_usage_guideGet Google search usage guideA
Read-onlyIdempotent
Inspect

Get a comprehensive guide for using the Google SERP tools.

Provides detailed information on how to use the SERP search tools
effectively, including parameters, examples, and best practices.

Returns:
    Complete usage guide for SERP tools.
NameRequiredDescriptionDefault

No parameters

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, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds only that the guide covers parameters, examples, and best practices, which is modest added context for a zero-param read tool.

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?

Purpose is front-loaded in the first sentence and the text is short. The trailing 'Returns:' block largely restates what the output schema already conveys, which is minor redundancy but not bloat.

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 zero-param, read-only guide tool with an output schema present, the description covers what the tool is and what it yields. Nothing critical is missing, though a hint on when to prefer it over the specific SERP tools would complete it.

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?

The tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless tool.

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: retrieves a usage guide for the Google SERP tools, and clarifies its content (parameters, examples, best practices). It is clearly distinct from the sibling search/list tools by function, though it never explicitly names or contrasts them.

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?

Usage is only implied: an agent infers it should call this when it needs orientation on the SERP tools. There is no explicit when-to-use, no when-not, and no alternative named (e.g. calling a specific list tool instead).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_google_imagesSearch Google ImagesC
Read-only
Inspect

Search Google Images and get image results.

Performs a Google Image search and returns structured image results.

NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1).
queryYesThe search query string for image search. Required.
numberNoNumber of results per page (default: 10). Note: More than 10 results may incur additional credits.
countryNoCountry code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'.
languageNoLanguage code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'.
image_sizeNoImage size filter for image search. Options: large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=false, and destructiveHint=false, covering the safety profile. The description adds nothing beyond them—no pagination behavior, no rate/credit notes (which live only in schema param text), and 'returns structured image results' is redundant with the existing output schema. It does not contradict the annotations, but it contributes no behavioral value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short but structurally wasteful: the second sentence ('Performs a Google Image search and returns structured image results') largely repeats the first without adding new information. Size is fine, but one of two sentences does not earn its place.

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 described, and the schema fully documents parameters. However, for a tool sitting among nine search-related siblings, the total absence of routing guidance leaves a meaningful gap for correct tool selection.

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%, with each of the 6 parameters (query, page, number, country, language, image_size) fully documented including defaults, credit warnings, and enum options. The description adds no parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource ('Search Google Images') and notes it returns image results, so the purpose is identifiable. However, it offers no differentiation from siblings like serp_google_search or serp_google_videos, relying entirely on the tool name to distinguish it. The two sentences are near-synonymous, adding redundancy rather than clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use image search versus the sibling search tools (web, news, videos, places), no mention of prerequisites, quotas, or credit implications beyond what the schema notes. The agent is left to infer usage entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_google_mapsSearch Google MapsC
Read-only
Inspect

Search Google Maps for locations.

Performs a Google Maps search and returns structured map results.

NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1).
queryYesThe search query string for maps/location search. Required.
numberNoNumber of results per page (default: 10). Note: More than 10 results may incur additional credits.
countryNoCountry code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'.
languageNoLanguage code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=false, and destructiveHint=false, covering the safety profile. The description adds nothing beyond annotations: no note on rate limits, credit consumption (relevant given the schema's credit warning on the 'number' param), or result structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is short and front-loaded, which is good, but the second sentence ('Performs a Google Maps search and returns structured map results') is largely redundant with the first and earns little of its place.

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?

With a full output schema, complete parameter descriptions, and a full annotation set, the structured fields carry most of the burden, so the description is minimally adequate. However, with a crowded sibling set (google_search, google_places, google_images, etc.), the absence of any routing guidance leaves a real gap.

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 all five parameters (query, page, number, country, language) are already documented in the schema, including the credit caveat on 'number'. The description adds no parameter detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb (Search) and resource (Google Maps locations), but it largely restates the title 'Search Google Maps' and adds only 'returns structured map results' as new information. It does not differentiate this tool from sibling serp_google_places, which also performs location-oriented search, so the boundary between the two is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives such as serp_google_places or serp_google_search, and no prerequisites or exclusions. The agent must infer the appropriate context purely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_google_newsSearch Google NewsC
Read-only
Inspect

Search Google News and get news article results.

Performs a Google News search and returns structured news results.

NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1).
queryYesThe search query string for news search. Required.
numberNoNumber of results per page (default: 10). Note: More than 10 results may incur additional credits.
countryNoCountry code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'.
languageNoLanguage code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'.
time_rangeNoTime filter for results. Options: 'h'/'qdr:h' (past hour), 'd'/'qdr:d' (past day), 'w'/'qdr:w' (past week), 'm'/'qdr:m' (past month), 'y'/'qdr:y' (past year), or None for no time restriction (default).

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint and destructiveHint, so the safety profile is covered. The description adds no behavioral context of its own — no mention of credit costs (which the schema's `number` param hints at), rate limits, or how open-world results behave.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very short, but the second sentence is pure redundancy of the first, so it fails the "every sentence earns its place" test. Not verbose, just non-informative.

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?

With full schema descriptions, annotations and an output schema, the structured data covers most of what an agent needs. The description is adequate but contributes nothing toward disambiguating this vertical from its many siblings.

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% with per-parameter descriptions for query, number, country, language and time_range, so the schema carries the semantics. The description adds nothing, leaving it at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb+resource ("Search Google News") is clear, but the second sentence merely restates it as "structured news results." Nothing distinguishes it from siblings like serp_google_search or serp_google_videos beyond the word "News."

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose this over serp_google_search or other verticals, and no mention of query construction or time_range usage patterns. The agent must infer selection from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_google_placesSearch Google PlacesC
Read-only
Inspect

Search Google for local places and businesses.

Performs a Google Places search and returns structured place results.

NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1).
queryYesThe search query string for local places/businesses search. Required.
numberNoNumber of results per page (default: 10). Note: More than 10 results may incur additional credits.
countryNoCountry code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'.
languageNoLanguage code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond them: no mention of credit consumption for large result pages (which the schema hints at), rate limits, or result-set behavior. The one sentence about returning structured results is essentially a restatement of the purpose.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short, but the second sentence ('Performs a Google Places search and returns structured place results') largely restates the first and the title rather than adding information, so not every sentence earns its place.

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?

With annotations covering the safety profile and an output schema covering the return shape, the description only needs to establish scope and routing. It establishes scope adequately but omits the disambiguation against serp_google_maps, which is the main informational gap for this tool family.

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 all five parameters (query, page, number, country, language) are already documented with defaults, ranges, and formats in the schema. The description supplies no additional parameter meaning, which lands it at the baseline 3.

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?

The description states a specific verb (Search) and a specific resource (Google local places and businesses), which distinguishes it from generic web search siblings like serp_google_search and serp_google_news. It does not, however, explicitly contrast itself with the closest sibling, serp_google_maps, leaving the agent to infer the boundary between a places lookup and a maps lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use or when-not-to-use guidance and no named alternative, despite the sibling list containing several overlapping search tools (serp_google_search, serp_google_maps) whose selection criteria an agent would need. Usage is only weakly implied by the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_google_videosSearch Google VideosC
Read-only
Inspect

Search Google Videos and get video results.

Performs a Google Video search and returns structured video results.

NameRequiredDescriptionDefault
pageNoPage number for pagination (default: 1).
queryYesThe search query string for video search. Required.
numberNoNumber of results per page (default: 10). Note: More than 10 results may incur additional credits.
countryNoCountry code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'.
languageNoLanguage code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, non-idempotent and non-destructive, so the safety profile is covered. The description adds nothing beyond that — the second sentence merely restates the first, and it omits useful operational context such as credit costs for large `number` values (which only appears buried 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Sized appropriately and front-loaded, but the two sentences are near-duplicates ('get video results' / 'returns structured video results'), so the second sentence does not earn its place.

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 an output schema, full parameter documentation, and annotations covering safety and openness, the definition is nearly complete for a simple search tool. The only meaningful gap is the absence of credit/cost behavior, which is left entirely to the schema.

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 pagination, result count, country and language are all documented in the schema itself. The description adds no parameter guidance or defaults, which is acceptable but unremarkable given full schema coverage.

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 Google Videos and get video results.' An agent can tell this is the video vertical of a SERP search family. It does not differentiate itself from siblings like serp_google_images or serp_google_news, though the name largely does that work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus the sibling search verticals, nor any prerequisites or exclusions. Usage is only implied by the tool name and title, which is below the 'explicit when/when-not' bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_list_countriesList search country codesA
Read-onlyIdempotent
Inspect

List commonly used country codes for Google search.

Shows common country codes that can be used to localize search results.

Returns:
    Table of country codes and their countries.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the key safety profile: read-only, idempotent, non-destructive, and not open-world. The description adds a brief note about the returned table, but does not disclose additional behavioral details beyond annotations and the output 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?

The description is short and front-loaded, with the core purpose stated first. The first two sentences are somewhat repetitive, which keeps it from being maximally concise.

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?

For a simple no-parameter list tool with annotations and an output schema, the description is complete enough. It states what is returned and why the codes are useful.

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?

The tool has zero parameters, so there is no parameter semantics to explain. Baseline 4 is appropriate for a no-argument reference tool.

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: list country codes for Google search. The scope is clear and distinct from sibling list tools such as serp_list_languages and serp_list_search_types.

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?

Explains that the codes can be used to localize search results, giving clear context for use. It does not explicitly name alternatives or when not to use this tool, but the reference-list purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_list_languagesList search language codesA
Read-onlyIdempotent
Inspect

List commonly used language codes for Google search.

Shows common language codes that can be used to get results in specific languages.

Returns:
    Table of language codes and their languages.
NameRequiredDescriptionDefault

No parameters

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, idempotentHint, destructiveHint=false and openWorldHint=false, so safety and determinism are covered. The description adds the useful qualifier 'commonly used' (implying a non-exhaustive subset) but otherwise repeats the return content that the output schema already carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and short, but the second sentence ('Shows common language codes that can be used to get results in specific languages') largely restates the first, so a third of the text earns nothing. The Returns block duplicates the output schema on top of that.

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?

For a trivial zero-parameter lookup with full annotations and an output schema, nothing an agent needs is missing; the description states scope and result shape, and the structured fields cover the rest.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the schema description coverage is 100% and the baseline for a 0-param tool is 4.

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 — listing language codes for Google search — so the agent knows exactly what it gets. It doesn't differentiate itself from the closely named siblings (serp_list_countries, serp_list_search_types, serp_list_time_ranges), but the name plus description together are unambiguous.

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?

Usage is implied: consult this when a search needs a language parameter. There is no explicit when-to-use statement, no mention of when to prefer a sibling list tool, and no note that the codes feed other tools' parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_list_search_typesList Google search typesA
Read-onlyIdempotent
Inspect

List all available Google search types.

Shows all available search types and their use cases.
Use this to understand which search type to use for your query.

Returns:
    Table of all search types with descriptions.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds only that the response is a table of search types with descriptions, which the output schema already conveys; it discloses no additional behavioral traits such as caching or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short and front-loaded, but the second sentence ('Shows all available search types and their use cases') restates the first rather than adding new information, so one of the four lines is largely 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 zero-parameter, read-only listing tool with a rich output schema and full annotation coverage, the description supplies the essential what and why. An agent has everything needed to invoke it correctly, though a pointer to the follow-up search tools would make it fully self-sufficient.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. No misleading parameter guidance is present.

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 ('List all available Google search types') and the payload it returns (search types with use cases). It is distinguishable from the sibling list_* tools by resource, but the description never names or contrasts them explicitly.

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 understand which search type to use for your query' gives a clear selection context — it is the discovery step before serp_google_search. It stops short of naming alternatives or stating when-not to use it (e.g., versus serp_get_usage_guide).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

serp_list_time_rangesList search time filtersA
Read-onlyIdempotent
Inspect

List available time range filters for Google search.

Shows all time range options that can be used to filter results by date.

Returns:
    Table of time range codes and their meanings.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is fully covered. The description adds only that a table of codes and meanings is returned, which is minor additional context beyond the annotations and output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first two sentences are largely redundant ('List available time range filters' vs 'Shows all time range options'), and the explicit 'Returns:' line duplicates information the output schema already provides. It is short but not tightly front-loaded.

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 zero-parameter listing tool with a full output schema and clear annotations, the description supplies enough context to invoke it correctly, though the redundant returns statement leaves a little to trim rather than an actual gap.

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?

The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to compensate for at the parameter level.

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 ('List available time range filters for Google search'), which is clear and distinct from sibling tools such as serp_list_search_types, serp_list_countries, or serp_list_languages. It does not, however, explicitly contrast itself with those siblings beyond the differing resource noun.

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?

Usage is only implied: the description says the options 'can be used to filter results by date,' suggesting this is a discovery/lookup call, but it never states when to call it or when another tool is preferable. No prerequisites or sequencing guidance is given.

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. 6 tool updatesv0.1.49
    • Changedserp_google_images8 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / image_size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "large",
        +        "medium",
        +        "icon",
        +        "2mp",
        +        "4mp",
        +        "6mp",
        +        "8mp",
        +        "10mp",
        +        "12mp",
        +        "15mp",
        +        "20mp",
        +        "40mp",
        +        "70mp"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Image size filter for image search. Options: large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp.",
        +  "title": "Image Size"
        +}
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
    • Changedserp_google_maps7 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
    • Changedserp_google_news9 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "h",
        +      "d",
        +      "w",
        +      "m",
        +      "y",
        +      "qdr:h",
        +      "qdr:d",
        +      "qdr:w",
        +      "qdr:m",
        +      "qdr:y"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / time_range / description
        Previous value: -"Time filter for results. Options: 'qdr:h' (past hour), 'qdr:d' (past day), 'qdr:w' (past week), 'qdr:m' (past month), or None for no time restriction (default)."New value: +"Time filter for results. Options: 'h'/'qdr:h' (past hour), 'd'/'qdr:d' (past day), 'w'/'qdr:w' (past week), 'm'/'qdr:m' (past month), 'y'/'qdr:y' (past year), or None for no time restriction (default)."
    • Changedserp_google_places7 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
    • Changedserp_google_search10 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / image_size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "large",
        +        "medium",
        +        "icon",
        +        "2mp",
        +        "4mp",
        +        "6mp",
        +        "8mp",
        +        "10mp",
        +        "12mp",
        +        "15mp",
        +        "20mp",
        +        "40mp",
        +        "70mp"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Image size filter. Only valid when search_type is 'images'. Options: large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp.",
        +  "title": "Image Size"
        +}
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
      • changedInput schema / properties / time_range / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "h",
        +      "d",
        +      "w",
        +      "m",
        +      "y",
        +      "qdr:h",
        +      "qdr:d",
        +      "qdr:w",
        +      "qdr:m",
        +      "qdr:y"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / time_range / description
        Previous value: -"Time filter for results. Options: 'qdr:h' (past hour), 'qdr:d' (past day), 'qdr:w' (past week), 'qdr:m' (past month), or None for no time restriction (default)."New value: +"Time filter for results. Options: 'h'/'qdr:h' (past hour), 'd'/'qdr:d' (past day), 'w'/'qdr:w' (past week), 'm'/'qdr:m' (past month), 'y'/'qdr:y' (past year), or None for no time restriction (default)."
    • Changedserp_google_videos7 fields changed
      • changedInput schema / properties / country / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / language / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 32,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / number / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / page / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maximum": 100,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / query / maxLength
        Added value: +2048
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / query / pattern
        Added value: +".*\\S.*"
  2. 11 tool updatesv0.1.46
    • Addedserp_get_usage_guide
    • Addedserp_google_images
    • Addedserp_google_maps
    • Addedserp_google_news
    • Addedserp_google_places
    • Addedserp_google_search
    • Addedserp_google_videos
    • Addedserp_list_countries
    • Addedserp_list_languages
    • Addedserp_list_search_types
    • Addedserp_list_time_ranges
  3. 11 tool updatesv0.1.45
    • Removedserp_get_usage_guide
    • Removedserp_google_images
    • Removedserp_google_maps
    • Removedserp_google_news
    • Removedserp_google_places
    • Removedserp_google_search
    • Removedserp_google_videos
    • Removedserp_list_countries
    • Removedserp_list_languages
    • Removedserp_list_search_types
    • Removedserp_list_time_ranges

TDQS

B3.2/5.0

Scored across 11 tools

Disambiguation2/5

The serp_list_* and serp_get_usage_guide tools are distinct, but serp_google_search accepts a search_type parameter covering images/news/videos/places/maps while separate tools exist for each of those same verticals. This creates multiple overlapping search tools with unclear boundaries, so an agent may struggle to choose between the general and specialized versions.

Naming Consistency5/5

All tools use a consistent serp_ prefix and snake_case naming, with predictable groupings: serp_list_* for reference lists, serp_get_* for guides, and serp_google_* for search actions. The pattern is easy to follow and no naming convention is mixed.

Tool Count4/5

At 11 tools, the set is within a reasonable range for a Google SERP API wrapper. However, the five specialized search tools duplicate functionality already available through serp_google_search, so the surface is slightly larger than necessary.

Completeness5/5

The tool set covers the apparent domain well: it provides a general Google search, all major search verticals (images, news, videos, places, maps), and reference lists for search types, countries, languages, and time ranges. There are no obvious missing operations for a read-only SERP search server.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

  • Live Google Maps business search, review, and photo data for AI agents over MCP.

  • Your agent needs the Google results page as it actually renders — organic and paid, the AI overview, maps, images, news, jobs and the finance panel — not a scraped guess. **What you can ask for** • "What does the SERP for this keyword look like in Germany, on mobile?" • "Does this query trigger an AI overview, and what does it say?" • "Who is advertising against our brand name?" • "Find local results and the map pack for this phrase." • "Search Google by this image and tell me where else it appears." **How to use it** Point any MCP client at https://mcp.aisa.one/seo-serp/mcp and sign in with OAuth — there is no key to create or paste. 38 tools across Google's surfaces: organic, ads and advertisers, AI mode, autocomplete, images, news, maps and local, events, jobs, datasets, scholar, finance quotes and markets, plus Semrush's organic and paid result sets. **Why this rather than the source** Location and language are parameters, so you can read the page a customer in another country sees. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Read the SERP here, then ask the same agent who links to the winner or how much traffic they get — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo-serp-other-engines/mcp for Bing, Yahoo, Baidu, Naver, Seznam and YouTube. https://mcp.aisa.one/seo/mcp for all of it at once — rankings, keywords, backlinks, site health and AI-answer visibility across DataForSEO, Semrush and Ahrefs.

  • Official SerpApi MCP server for Google, Bing, and other search engines.

    https://mcp.serpapi.com/mcp
  • Google Shopping products, prices, sellers, and deals as structured data via a hosted MCP server.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP (Model Context Protocol) server that provides Google search capabilities and webpage content analysis tools. This server enables AI models to perform Google searches and analyze webpage content programmatically.
    8 npm
    257
    ISC
  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that integrates with SerpApi to retrieve search results from multiple search engines including Google, Bing, Yahoo, and others, enabling fast access to both live and archived search data.
    3
    182
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) based search API server that provides standardized access to Google Maps, Google Flights, Google Hotels and other services. This server enables AI assistants to access various search services through a unified interface.
    74
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP (Multi-Agent Conversation Protocol) Server that enables interaction with Google's Custom Search API, allowing agents to perform customized web searches through natural language requests.
    -