SerpMCP
SerpMCP lets you run Google searches and retrieve structured results through MCP tools.
Perform regular Google web searches.
Search Google Images, with optional image-size filters.
Search Google News and filter by time range.
Search Google Videos.
Search local places/businesses and Google Maps locations.
Localize results by country and language.
Paginate results and control results per page.
Access reference tools for search types, country codes, language codes, time ranges, and usage guidance.
Return complete structured JSON responses from the SERP API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SerpMCPsearch for the latest news about artificial intelligence"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SerpMCP
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 |
| Search Google and get structured results using the SERP API. |
| Search Google Images and get image results. |
| Search Google News and get news article results. |
| Search Google Videos and get video results. |
| Search Google for local places and businesses. |
| Search Google Maps for locations. |
| List all available Google search types. |
| List commonly used country codes for Google search. |
| List commonly used language codes for Google search. |
| List available time range filters for Google search. |
| 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 |
Local stdio | The client runs a local MCP process | Install |
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, enterhttps://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 localclaude_desktop_config.jsonis a separate setup. Claude connector guide.Claude Code:
claude mcp add --transport http --scope user serp https://serp.mcp.acedata.cloud/mcp, then startclaude, 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.jsonor the user profile. Check MCP: List Servers. VS Code MCP setup.Codex:
codex mcp add serp --url https://serp.mcp.acedata.cloud/mcp, thencodex 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
Open Ace Data Cloud → Applications. Sign in, or register an account first.
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.
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.
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.
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 HTTPAuthorizationheader needs theBearerprefix. Aplatform-...account-management token cannot replace a generation API key.


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-serpFor 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
https://serp.mcp.acedata.cloud/healthreturning{"status":"ok"}checks endpoint reachability only.Confirm that the MCP client loads tools.
serp_list_search_typesandserp_get_usage_guideare 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.If you need a full API check, call
serp_google_searchwith 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 |
| Flexible Google search with all options |
| Search for images |
| Search for news articles |
| Search for videos |
| Search for local places/businesses |
| Search for map locations |
Information Tools
Tool | Description |
| List available search types |
| List country codes for localization |
| List language codes for localization |
| List time range filter options |
| Get comprehensive usage guide |
Usage Examples
Basic Web Search
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"]Localized Search
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"]Image Search
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 |
| Regular web search (default) |
| Image search |
| News articles |
| Map results |
| Local businesses |
| Video results |
Time Range Filters
Code | Time Range |
| Past hour |
| Past hour |
| Past day |
| Past day |
| Past week |
| Past week |
| Past month |
| Past month |
| Past year |
| 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 |
| United States |
| United Kingdom |
| China |
| Japan |
| Germany |
| France |
Common Language Codes
Code | Language |
| English |
| Chinese (Simplified) |
| Japanese |
| Spanish |
| French |
| 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 |
| API token from AceDataCloud | Required |
| API base URL |
|
| OAuth client ID (hosted mode) | — |
| Platform base URL |
|
| Request timeout in seconds |
|
| Logging level |
|
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 integrationCode Quality
# Format code
ruff format .
# Lint code
ruff check .
# Type check
mypy core toolsBuild & 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.mdAPI Reference
This server wraps the AceDataCloud Google SERP API:
Contributing
Contributions are welcome! Please:
Fork the repository
Create a feature branch (
git checkout -b feature/amazing)Commit your changes (
git commit -m 'Add amazing feature')Push to the branch (
git push origin feature/amazing)Open a Pull Request
Documentation
License
MIT License - see LICENSE for details.
Links
Made with love by AceDataCloud
Available Tools
11 toolsserp_get_usage_guideGet Google search usage guideARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, 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.
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.
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.
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.
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.
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 ImagesCRead-onlyInspect
Search Google Images and get image results.
Performs a Google Image search and returns structured image results.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string for image search. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. | |
| image_size | No | Image size filter for image search. Options: large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=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.
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.
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.
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.
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.
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 MapsCRead-onlyInspect
Search Google Maps for locations.
Performs a Google Maps search and returns structured map results.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string for maps/location search. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=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.
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.
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.
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.
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.
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 NewsCRead-onlyInspect
Search Google News and get news article results.
Performs a Google News search and returns structured news results.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string for news search. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. | |
| time_range | No | 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). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, 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.
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.
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.
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.
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.
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 PlacesCRead-onlyInspect
Search Google for local places and businesses.
Performs a Google Places search and returns structured place results.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string for local places/businesses search. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=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.
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.
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.
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.
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.
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_searchSearch GoogleBRead-onlyInspect
Search Google and get structured results using the SERP API.
Performs a Google search and returns the complete JSON response from the API,
preserving all available fields and data.
Args:
query: The search query string. Required.
search_type: Type of search to perform. Options:
- "search": Regular web search (default)
- "images": Image search
- "news": News articles
- "maps": Map results
- "places": Local business/place results
- "videos": Video results
country: Country code for localized results (e.g., "us", "cn", "uk").
Default is "us".
language: Language code for results (e.g., "en", "zh-cn", "fr").
Default is "en".
time_range: Time filter for results. Options:
- "qdr:h": Past hour
- "qdr:d": Past day
- "qdr:w": Past week
- "qdr:m": Past month
- None: No time restriction (default)
number: Number of results per page (default: 10).
Note: More than 10 results may incur additional credits.
page: Page number for pagination (default: 1).
Returns:
Complete JSON response from the SERP API containing all available data.
Example:
serp_google_search(query="artificial intelligence", search_type="news")
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. | |
| image_size | No | Image size filter. Only valid when search_type is 'images'. Options: large, medium, icon, 2mp, 4mp, 6mp, 8mp, 10mp, 12mp, 15mp, 20mp, 40mp, 70mp. | |
| time_range | No | 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). | |
| search_type | No | Type of search to perform. Options: 'search' (regular web search, default), 'images' (image search), 'news' (news articles), 'maps' (map results), 'places' (local business/place results), 'videos' (video results). | search |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint=false, and destructiveHint=false, so safety is covered. The description adds genuinely useful context beyond that: the credit-cost caveat on 'number' above 10 and the fact that the complete unfiltered JSON response is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose statement is front-loaded and clear, but the Args section duplicates the schema descriptions nearly word-for-word, padding length without adding information. Given 100% schema coverage, that block does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still notes the full JSON response is preserved. Combined with the enum options and defaults, an agent has enough to call it correctly; only the sibling-routing gap keeps this from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema. The Args block largely restates those same descriptions verbatim and adds almost no new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search Google and get structured results using the SERP API') and is unambiguous about what the tool does. However, it never distinguishes itself from the many overlapping siblings like serp_google_news, serp_google_images, serp_google_places, and serp_google_maps, which it partially duplicates via its own search_type enum.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all. Critically, the search_type enum ('news', 'images', 'maps', 'places', 'videos') overlaps directly with dedicated sibling tools, and the description offers no rule for choosing between them. An agent is left to guess whether to call serp_google_search(search_type='news') or serp_google_news.
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 VideosCRead-onlyInspect
Search Google Videos and get video results.
Performs a Google Video search and returns structured video results.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 1). | |
| query | Yes | The search query string for video search. Required. | |
| number | No | Number of results per page (default: 10). Note: More than 10 results may incur additional credits. | |
| country | No | Country code for localized results (e.g., 'us', 'cn', 'uk'). Default is 'us'. | |
| language | No | Language code for results (e.g., 'en', 'zh-cn', 'fr'). Default is 'en'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=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.
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.
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.
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.
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.
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 codesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 codesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, 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.
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.
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.
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.
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.
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 typesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, 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.
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.
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.
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.
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.
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 filtersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, 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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.49- Changed
serp_google_images8 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / image_sizeAdded 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" +} - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*"
- Changed
serp_google_maps7 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*"
- Changed
serp_google_news9 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*" - changed
Input schema / properties / time_range / anyOfPrevious 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" + } +] - changed
Input schema / properties / time_range / descriptionPrevious 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)."
- Changed
serp_google_places7 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*"
- Changed
serp_google_search10 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / image_sizeAdded 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" +} - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*" - changed
Input schema / properties / time_range / anyOfPrevious 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" + } +] - changed
Input schema / properties / time_range / descriptionPrevious 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)."
- Changed
serp_google_videos7 fields changed- changed
Input schema / properties / country / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / language / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 32, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / number / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / page / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / query / maxLengthAdded value: +2048 - added
Input schema / properties / query / minLengthAdded value: +1 - added
Input schema / properties / query / patternAdded value: +".*\\S.*"
11 tool updates
v0.1.46- Added
serp_get_usage_guide - Added
serp_google_images - Added
serp_google_maps - Added
serp_google_news - Added
serp_google_places - Added
serp_google_search - Added
serp_google_videos - Added
serp_list_countries - Added
serp_list_languages - Added
serp_list_search_types - Added
serp_list_time_ranges
11 tool updates
v0.1.45- Removed
serp_get_usage_guide - Removed
serp_google_images - Removed
serp_google_maps - Removed
serp_google_news - Removed
serp_google_places - Removed
serp_google_search - Removed
serp_google_videos - Removed
serp_list_countries - Removed
serp_list_languages - Removed
serp_list_search_types - Removed
serp_list_time_ranges
TDQS
Scored across 11 tools
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.
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.
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.
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
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.
Google Shopping products, prices, sellers, and deals as structured data via a hosted MCP server.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn 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 npm257ISC
- AlicenseAqualityAmaintenanceAn 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.3182MIT
- AlicenseNot gradedqualityDmaintenanceA 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.74MIT
- -licenseNot gradedqualityNot gradedmaintenanceAn 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.-