Local SEO Data
OfficialMCP-сервер данных локального SEO
Сервер Model Context Protocol для Local SEO Data. Предоставляет ИИ-ассистентам доступ к 42 инструментам локального SEO: отслеживание SERP, мониторинг отзывов, исследование ключевых слов, оценка видимости для ИИ, сканирование по геосетке и многое другое.
Настройте один раз, а затем задавайте вопросы на обычном языке — ваш ассистент будет автоматически вызывать нужные эндпоинты.
Предварительные требования
Зарегистрируйтесь на localseodata.com/signup
Создайте API-ключ в своей панели управления API-ключами
Замените
YOUR_API_KEYниже на ваш ключ (начинается сsk_live_)
Related MCP server: google-seo-mcp
Настройка
Claude Code
claude mcp add localseodata --transport http "https://mcp.localseodata.com/mcp?key=YOUR_API_KEY" --scope userФлаг --scope user делает его доступным для всех ваших проектов. Перезапустите Claude Code после добавления.
Claude Desktop
Добавьте в файл конфигурации:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"localseodata": {
"url": "https://mcp.localseodata.com/mcp?key=YOUR_API_KEY"
}
}
}Перезапустите Claude Desktop после сохранения.
Cursor
Добавьте в .cursor/mcp.json в корне вашего проекта или в ~/.cursor/mcp.json для глобального доступа:
{
"mcpServers": {
"localseodata": {
"url": "https://mcp.localseodata.com/mcp?key=YOUR_API_KEY"
}
}
}VS Code (GitHub Copilot)
Добавьте в .vscode/mcp.json в вашем проекте:
{
"servers": {
"localseodata": {
"type": "streamable-http",
"url": "https://mcp.localseodata.com/mcp?key=YOUR_API_KEY"
}
}
}Cline
Откройте настройки Cline > MCP Servers > Add Remote Server:
Name: localseodata
URL:
https://mcp.localseodata.com/mcp?key=YOUR_API_KEY
Windsurf
Добавьте в ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"localseodata": {
"serverUrl": "https://mcp.localseodata.com/mcp?key=YOUR_API_KEY"
}
}
}Доступные инструменты
Категория | Инструменты |
Данные SERP |
|
Оптимизация ИИ/LLM |
|
Данные о бизнесе |
|
Исследование ключевых слов |
|
Аудиты |
|
Конкурентная разведка |
|
Отчеты |
|
Геосетка |
|
Локации |
|
Утилиты |
|
Примеры запросов
После подключения просто спрашивайте естественным языком:
"Кто ранжируется в локальном пакете по запросу 'сантехник' в Денвере?"
"Проведи полный локальный SEO-аудит для Mike's Plumbing в Остине, штат Техас"
"Сравни мои отзывы в Google с отзывами моих 3 главных конкурентов"
"На какие ключевые слова стоит ориентироваться стоматологу в Портленде?"
"Проверь, согласована ли информация о моем бизнесе (NAP) в различных каталогах"
"Отобрази мои позиции на геосетке 5x5 по запросу 'пекарня' в Бруклине"
"Каков мой показатель видимости для ИИ по запросу 'лучшая пицца в Чикаго'?"
Аутентификация
Ваш API-ключ передается как параметр запроса URL (?key=YOUR_API_KEY). Это работает с любым MCP-клиентом без необходимости настройки пользовательских заголовков. Ключи можно создавать или отзывать в любое время в панели управления API-ключами.
Ценообразование
Вызовы MCP расходуют кредиты с вашего аккаунта Local SEO Data, так же как и вызовы REST API. Большинство эндпоинтов стоят 1 кредит ($0.005). Отслеживайте использование в своей панели управления.
См. localseodata.com/pricing для ознакомления с тарифами.
Самостоятельный хостинг
Если вы хотите запустить MCP-сервер самостоятельно:
git clone https://github.com/localseodata/mcp-server.git
cd mcp-server
npm install
npm run buildУстановите необходимую переменную окружения и запустите:
export API_BASE_URL=https://api.localseodata.com
npm startСервер по умолчанию работает на порту 3003 (установите PORT для изменения). Dockerfile включен для развертывания в контейнерах.
Разработка
npm run dev # Watch mode with hot reload
npm run build # Compile TypeScript
npm run typecheck # Type check without emitting
npm start # Run compiled outputЛицензия
MIT
Available Tools
53 toolsai_compareARead-only
Compares 2–5 domains' AI visibility side by side. Returns per-domain total_mentions, total_impressions, and ai_search_volume. For one domain's detailed platform breakdown, see ai_visibility. IMPORTANT: results are country-level (location_scope: "country") regardless of the location passed — a city resolves to its country and the numbers cover all of it. Check location_used. For city-level AI results use ai_scraper or ai_mode. Costs 81 credits per domain compared (2 domains = 162).
| Name | Required | Description | Default |
|---|---|---|---|
| domains | Yes | Domains to compare (e.g. ["yoursite.com", "competitor.com"]) | |
| keywords | Yes | Keywords to compare across | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise. | |
| location | No | Location for results (e.g. "Denver, CO"). Default: US |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes | |
| language | No | |
| by_domain | Yes | |
| location_used | No | |
| location_scope | No | |
| platforms_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the basic readOnly and destructive hints in annotations, the description adds vital behavioral context: the cost (81 credits per domain), the guaranteed scope (country-level), and the specific metrics returned. This significantly reduces ambiguity.
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 definition is highly efficient. It front-loads the core function, immediately provides the necessary operational constraints (cost/metrics), and ends with clear decision trees (when to use this vs. when to use siblings).
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?
The description addresses all likely cognitive blockers for the agent: output metrics, cost, hard operational constraints (2-5 domains), and scope limitations (country-level). It is perfectly suited for its complexity.
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?
Since schema coverage is 100%, the description does not need to explain data types. However, it enhances semantics by adding critical structural constraints that the schema handles passively, such as the 2-5 domain limit and the definitive country-level scope of the location parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the function (compares 2-5 domains' AI visibility) and the exact output metrics (total_mentions, total_impressions, ai_search_volume). It also provides immediate differentiation by referring the user to ai_visibility for a detailed platform breakdown.
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?
It provides extensive usage guidance by defining clear boundaries: 1) for detailed breakdowns, use ai_visibility; 2) for city-level results, use ai_scraper or ai_mode. Crucially, it establishes that the tool operates strictly at a country level, despite location input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_keyword_dataARead-only
Use when measuring how often keywords are searched in ChatGPT and other LLMs. Returns ai_search_volume and monthly trend data per keyword. IMPORTANT: volumes are country-level (volume_scope: "country") regardless of the location passed — check location_used. Costs 9-16 credits, scaling with keyword count (100 keywords = 16).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Keywords to get AI volume for (e.g. ["plumber near me", "emergency plumber"]) | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to the language we hold AI keyword data for in that country. | |
| location | No | Location for results (e.g. "Miami, FL"). Default: US |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes | |
| language | No | |
| location | No | |
| volume_scope | No | |
| location_used | No | |
| total_keywords | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations by disclosing the country-level volume scope caveat, the instruction to check location_used, and a credit cost model (9-16 credits, scaling with keyword count, 100 keywords = 16). That cost and scope information is exactly the kind of behavioral detail an agent needs before calling.
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?
Four short sentences, each carrying distinct information (use case, return fields, scope caveat, cost). The use case is front-loaded and the 'IMPORTANT' marker correctly flags the one gotcha an agent could trip on.
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 present, return values don't need explanation, and the description nonetheless names the key fields. Cost, scope limitation, and default behavior are all covered, leaving nothing an agent needs in order to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, yet the description still adds real meaning: it warns that results are country-level regardless of the location argument and points at location_used for verification, and it ties keyword count to credit cost. This is substantive guidance beyond the field descriptions.
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 — measuring how often keywords are searched in ChatGPT and other LLMs — and names the return fields (ai_search_volume, monthly trend). The 'AI' qualifier implicitly separates it from the Google-oriented search_volume sibling, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when measuring how often keywords are searched in ChatGPT and other LLMs' gives a clear triggering condition. It stops short of explicitly routing the agent away from search_volume or keyword_trends for traditional search data, so the alternative is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_llm_responseARead-only
Gets what a specific LLM says about a query. Returns response_text, the model used, sources with URLs, fan_out_queries, and web_search_used. Each source carries a position — the order it was cited, from 1, counted after duplicate pages collapse. Supports chat_gpt, claude, gemini, perplexity.
WHETHER YOU GET SOURCES depends on whether the model searched the web. perplexity searches on every call, so its sources are populated and it needs no parameters. The other three answer from training data unless you set web_search: true, and on local business questions they otherwise do not search at all.
WEB SEARCH SUPPORT DIFFERS BY PLATFORM. claude takes web_search, force_web_search, search_country and search_city — the full set. chat_gpt takes all four except that GPT-5 models drop force_web_search. gemini takes web_search only: a search can be permitted but never compelled, and it cannot be geographically scoped. perplexity takes search_country only and cannot be switched off. Asking for something a platform does not support returns a 400 saying what it does support.
COST: 8 credits, or 20/40 if model pins a premium/frontier model. With web_search: true it is priced from the measured cost of searching — 24 for chat_gpt, 27 for gemini, 40 for claude. perplexity stays at 8 with search included.
ACCURACY WARNING: without web search a model may state confident, wrong facts about a local business, including that an open business has closed. When checking what a model says about a real business, use a platform that searches: perplexity, or any platform with web_search: true.
MATCHING CITATIONS ON GEMINI: domain is the registrable domain and never the subdomain, because Google's grounding data does not transmit one — a client at orangecounty.example.com is reported as example.com. Match on the registrable domain for subdomain-hosted sites. The other three platforms return the full hostname.
Sampling settings are left at each platform's defaults, which differ and are not all low, so repeating a prompt returns different wording — treat one run as a sample, not a fixed answer.
May take 15-60 seconds; with web_search: true, expect the upper end.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free. | |
| model | No | Optional model name (e.g. gpt-5.4-mini, claude-sonnet-5, claude-opus-5, gemini-3.8-flash, sonar). Defaults to the newest standard-tier model for each platform at 8 credits. Pinning changes the cost: standard 8 credits, premium (Opus-class) 20, frontier (Fable-class) 40; an unrecognised model bills at the frontier rate. An unsupported value returns a 400 listing what the platform accepts. | |
| prompt | Yes | Prompt to send to the LLM (e.g. "What is the best plumber in Portland?"). Max 500 characters. | |
| platform | Yes | Which LLM to query | |
| web_search | No | Let the model search the web before answering, so it can cite sources. Strongly recommended when asking about a real business — without it models answer from training data and can assert an open business has closed. Not accepted on perplexity, which always searches. Raises the price to the measured cost of searching: 24 credits chat_gpt, 27 gemini, 40 claude. | |
| search_city | No | City to search from, e.g. "Wichita". Grounds the search where the customer actually is, which is usually the point for local work. Accepted on chat_gpt and claude only. | |
| search_country | No | ISO 3166-1 alpha-2 country to search from, e.g. "US". Accepted on chat_gpt, claude and perplexity; not on gemini. | |
| force_web_search | No | Require the search rather than leaving it to the model's judgement. Requires web_search: true. Accepted on claude, and on chat_gpt only for non-GPT-5 models. Not available on gemini or perplexity. In testing it changed which sources were retrieved more than what the answer said, so reach for it when you need a search guaranteed, not for better answers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | Yes | |
| prompt | Yes | |
| sources | Yes | |
| platform | Yes | |
| response_text | Yes | |
| fan_out_queries | Yes | |
| web_search_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: exact credit costs including premium/frontier model pinning and search-priced tiers, 15-60s latency, one-hour caching with the fresh escape hatch, per-platform 400 failures, and the Gemini registrable-domain collapse that changes how citations must be matched. The sampling-variance warning ('treat one run as a sample') is precisely the kind of non-obvious behavior an agent cannot infer from 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?
Front-loaded with purpose and output shape, then clearly demarcated by capitalized headers (COST, ACCURACY WARNING, MATCHING CITATIONS), so an agent can skim to the section it needs. It is long, and a few facts (web_search pricing, force_web_search platform limits) repeat what the schema already states, which is wasted weight rather than harmful.
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 no prose, and the description still supplies everything else an agent needs to call correctly: which platforms compel vs permit search, cost tradeoffs, latency expectation, nondeterminism, and the citation-matching caveat. Nothing material is left for the caller to discover by trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by stating the platform-by-platform support matrix as a coherent rule (claude gets the full set, GPT-5 drops force_web_search, gemini is web_search-only and un-geocodable, perplexity is search_country-only) and the dependency that force_web_search requires web_search: true. Some of this duplicates the per-parameter schema text, keeping it out of the 5 band.
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?
Opens with a specific verb+resource ('Gets what a specific LLM says about a query') and immediately enumerates the return payload and supported platforms, so the agent knows exactly what the tool does and which models it can address. It is distinguishable from the surrounding ai_* siblings by being the raw per-platform query tool rather than an aggregate/visibility metric.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance: perplexity always searches and needs no parameters, the other three need web_search: true for local business questions, and the accuracy warning directs the agent to a searching platform when checking a real business. It stops short of naming sibling tools (ai_overview, ai_mode, ai_sample) as alternatives, so the routing against the rest of the family is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_matchARead-only
Use when deciding whether a business an AI named IS the business you are tracking. Takes the businesses array from ai_scraper, ai_mode or ai_sample plus a target, and returns matched, confidence, matched_on, rank and the near misses.
WHY NOT DO IT YOURSELF: the two obvious rules both fail quietly. Matching on domain misses roughly a third of appearances, because that is how often ChatGPT names a business with an empty website and domain. Matching on name fails on Google AI Mode, which labels cards editorially — the same business came back as "The Classic Staple" in one answer and under its trading name in the next. This matches on cid, then domain, then phone, then name-with-address, then name, and tells you which one it used.
THE TARGET IS RESOLVED FOR YOU: pass business_name and location and the business is looked up in the local graph first, so a name-only target ends up matching on a cid, a domain and a phone rather than on a string. That lookup is what the 5 credits buy. Pass a cid, domain, website or phone yourself and no lookup is made and it costs 1.
ONE ANSWER OR A WHOLE SAMPLE: pass businesses for one answer and get a verdict; pass runs from an ai_sample result and get appearance_rate, best_rank, worst_rank and mean_rank across the sample, with the verdict for each run. Pass one or the other, never both.
READING confidence: 1.0 is a cid, 0.9 a domain or phone, 0.8 a name with a matching address, 0.65 a name alone. matched is true exactly when confidence is 0.5 or above, so a name-only tie between two candidates comes back matched: false — one of them is the client, but nothing in the answer says which. Filter on matched_on when you need identifier-grade certainty.
WHAT IS NOT A SIGNAL: a website on a shared host (Facebook, Instagram, Linktree, business.site, the big directories) is not a domain match. A name matches only when the shorter of the two is wholly contained in the longer, and a one-word name never matches alone. Two addresses agree only when the street number, street line and town all agree. target.place_id needs target.location beside it.
IDENTIFIER COVERAGE — READ THIS BEFORE QUOTING A LOW RATE: identifier_coverage says how much of the answer could be identified AT ALL. identified counts the businesses carrying a cid, a domain or a phone, out of candidates. Two of six means four rows could only ever be matched by name, and a name-only miss is not the same fact as an absence — say so rather than reporting the rate alone. Coverage is a property of what the platform published, not of the client.
WHERE THE CID GOES: pass a cid inside target, where it makes the match exact and skips the lookup. Never filter the businesses you pass in on whether they carry one — the rows without a cid are most of the answer, and dropping them removes the appearances you are trying to count.
SOURCE PROVENANCE, NOT A WARNING: source_graph says which platform's record the AI repeated — google, bing, yelp, aggregator, or unknown. A cid means Google; a Yelp URL means Yelp; a business's own domain means unknown, because it says the AI has the business and not where it read it. entity_variants lists the spellings of the matched business across the runs, each with its source_graph. Two or three variants is the NORMAL state of a business that exists on more than one platform — do not report it as a problem, report it as provenance. It is what lets you say: your Google profile is fine, ChatGPT is reading Bing, and Bing has you in the wrong town.
WHAT IS A PROBLEM: nap_conflicts, and only that. It carries a value that genuinely contradicts the client's own record — a phone number that is not theirs, an address in the wrong town — with the source_graph that supplied it, so the fix has an address. An empty nap_conflicts beside three entity_variants means the client is listed in three places and all three are right.
| Name | Required | Description | Default |
|---|---|---|---|
| runs | No | The runs array from an ai_sample result, to get a rate across the whole sample instead of one verdict. | |
| target | Yes | The business to look for | |
| resolve | No | Force the profile lookup on (true) or off (false). Default: on when there is a location and no identifier was supplied. | |
| businesses | No | One answer's businesses, exactly as ai_scraper, ai_mode or a single ai_sample run returns them. Extra fields are ignored, so pass the array through untouched. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rank | No | |
| runs | No | |
| match | No | |
| target | Yes | |
| matched | No | |
| best_rank | No | |
| mean_rank | No | |
| candidates | No | |
| confidence | No | |
| matched_on | No | |
| worst_rank | No | |
| appearances | No | |
| runs_checked | No | |
| nap_conflicts | No | |
| appearance_rate | No | |
| entity_variants | No | |
| identifier_coverage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/open-world, and the description adds substantial context beyond them: credit cost (5 with lookup, 1 without), a confidence scale with thresholds, the exact match precedence chain, false-signal rules (shared hosts, name containment, address agreement), and what entity_variants and nap_conflicts actually mean. This is behavioral disclosure that annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with "Use when..." and organized under clear headings, with no sentence that is pure padding. It is long and the capitalized emphasis headings add bulk, but for a tool with this much matching nuance the length is largely earned rather than filler.
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?
Despite an output schema existing, the description still explains how to read confidence, matched, identifier_coverage, entity_variants and nap_conflicts — the fields most likely to be misreported. Nothing an agent needs to call this correctly or interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds real meaning by explaining the interaction between place_id and location, that cid belongs inside target and skips the lookup, the resolve default logic, and that extra fields in passed arrays are ignored. It slightly restates schema-documented identifiers (domain/website/phone all "skip the lookup"), which keeps it from a perfect score.
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 first sentence states a specific verb and resource — deciding whether a business an AI named is the business being tracked — and names the sibling tools (ai_scraper, ai_mode, ai_sample) that produce its input. An agent can distinguish it from the surrounding AI-visibility tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the two entry modes and their exclusivity ("Pass one or the other, never both"), when a lookup occurs versus not (cid/domain/phone supplied), when to filter on matched_on, and the edge case that a low rate should be reported alongside identifier_coverage. Alternatives and exclusions are named rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_mentionsARead-only
Use when finding where a keyword appears in ChatGPT and Google AI outputs. Returns ai_search_volume, total_mentions, and mention details with question, answer_snippet, sources_cited, and platform. IMPORTANT: results are country-level (location_scope: "country") regardless of the location passed — a city resolves to its country and the numbers cover all of it. Check location_used. For city-level AI results use ai_scraper or ai_mode. Costs 88 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max mentions. Default: 10, max: 100 | |
| keyword | Yes | Keyword to search for (e.g. "best plumber in Buffalo") | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise. | |
| location | No | Location for results (e.g. "Portland, OR"). Default: US | |
| platforms | No | Platforms to query. Default: all |
Output Schema
| Name | Required | Description |
|---|---|---|
| language | No | |
| mentions | Yes | |
| location_used | No | |
| location_scope | No | |
| total_mentions | Yes | |
| ai_search_volume | Yes | |
| platforms_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so safety is covered; the description goes further with behavior the annotations cannot express — results are country-level regardless of the location passed, the returned location_used should be verified, and each call costs 88 credits. That is exactly the kind of hidden trait an agent needs before calling.
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?
Tight and front-loaded: purpose, then return shape, then the IMPORTANT caveat, then the alternative, then cost. The mid-sentence enumeration of return fields (question, answer_snippet, sources_cited, platform) is partly redundant given an output schema exists, but it is compact enough to 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?
For a 5-parameter, read-only, open-world tool with a full output schema and full annotation coverage, nothing an agent needs is missing: purpose, scope degradation caveat, alternative routing, and cost are all stated. Output schema handles return values, so the description need not expand further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real semantics beyond the schema: it warns that the 'location' parameter is silently degraded to country scope even for a city input, which directly contradicts what the schema example ('Portland, OR') implies. Other parameters are left to the schema, which is adequate.
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 first sentence gives a specific verb ('finding where a keyword appears') and a specific resource scope ('ChatGPT and Google AI outputs'), and the return fields (ai_search_volume, total_mentions, mention details) pin down the output shape. An agent can distinguish this from ai_visibility or brand_mentions without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the condition for use ('finding where a keyword appears') and names the alternatives with their own condition: 'For city-level AI results use ai_scraper or ai_mode.' It also flags the 88-credit cost, which lets an agent make a cost/benefit call before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_modeARead-only
Use when getting the Google AI Mode (SGE) generated answer for a keyword. Returns ai_response text, local_businesses, reference links, and shopping items. Costs 2 credits. May take 10-30 seconds; Google generates the answer per request.
LOCAL BUSINESSES: on a local question Google recommends businesses inside the answer and we return them as local_businesses — rank, name, category, rating, reviews_count, address, website, domain, cid. Field names shared with /v1/serp/local-pack mean the same things; the sets differ in that this adds category and domain and has no hours. cid is an empty string when the Directions link was unreadable. Two differences from ai_scraper on chat_gpt: phone is always empty (Google renders a Call button and never sends the number), and cid is populated — Google's own identifier for the business, in decimal, which /v1/business/profile also takes. Match on cid rather than on name where you can.
REVIEW COUNTS ARE ROUNDED: Google abbreviates above a thousand, so reviews_count is 1200 where the exact figure is 1194. Do not compare it to a count from another endpoint and read the difference as change.
parse_status reports whether the businesses could be read: "ok", "no_businesses" when the answer named none, or "unparsed" when business cards were present and none could be read — which means Google changed the format. references is unreliable for citations: on some answers it carries real domains, on others every entry collapses to a google.com redirect, and it never names the businesses either way.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free. | |
| keyword | Yes | Search keyword (e.g. "best plumber near me") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| location | Yes | |
| references | Yes | |
| ai_response | Yes | |
| parse_status | No | |
| location_used | No | |
| shopping_items | Yes | |
| local_businesses | No | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld/destructive annotations: discloses the 2-credit cost, the 10-30 second latency and why (Google generates per request), that results are cached for an hour, the meaning of each parse_status value, that reviews_count is rounded, and that references is unreliable. These are exactly the non-obvious traits an agent needs to interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, cost, and latency, which is good. However, most of the remaining length enumerates return-field semantics and caveats, and since an output schema exists some of this is redundant; the dense field-by-field commentary is not as tight as it could be.
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 tool with an output schema, two required params, and cost/latency involved, the description covers everything an agent needs to call it correctly and to avoid misreading results (rounding, empty cid, unreliable references, parse_status failures).
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% and the fresh parameter is already fully explained including the billing caveat in the schema. The description adds invocation-level cost/latency context but no per-parameter syntax or semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('getting the Google AI Mode (SGE) generated answer for a keyword') and then names what comes back. It also distinguishes itself from siblings by explicitly contrasting field sets with /v1/serp/local-pack and calling out two differences from ai_scraper on chat_gpt (phone always empty, cid populated).
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 when getting the Google AI Mode (SGE) generated answer for a keyword' is an explicit trigger condition, and the fresh parameter guidance tells the caller when bypassing cache matters. There is no explicit 'when not to use' or routing to ai_overview/ai_scraper, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_overviewARead-only
Use when checking if Google shows an AI Overview for a keyword and what sources it cites. Returns has_ai_overview, asynchronous_ai_overview, summary_text, and cited_sources with URLs. Each cited source carries a position — the order the overview cited it, from 1, counted after duplicate pages collapse. asynchronous_ai_overview reports that Google rendered the overview after page load — this tool fetches those as well, so summary_text and cited_sources are populated either way. Costs 2 credits. May take 10-30 seconds — fetching an asynchronous overview is a second request to Google.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free. | |
| keyword | Yes | Search keyword (e.g. "best plumber near me") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| location | Yes | |
| summary_text | Yes | |
| cited_sources | Yes | |
| location_used | No | |
| has_ai_overview | Yes | |
| location_alternatives | No | |
| asynchronous_ai_overview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint/destructiveHint annotations: 2-credit cost, 10-30 second latency, the reason for that latency (a second request to Google for asynchronous overviews), and the guarantee that summary_text and cited_sources are populated in both sync and async cases. The position numbering rule and duplicate-collapse behavior are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then return fields, then behavioral caveats (async, cost, latency). Every sentence contributes a distinct fact and there is no repetition of the schema.
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?
Covers the things an agent cannot get from structured fields: cost, runtime, caching, and the async-overview edge case. Although an output schema exists (so return documentation is somewhat redundant), the explanation of asynchronous_ai_overview and citation position ordering adds real interpretive value for a 3-parameter, single-purpose tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a thorough explanation of the non-obvious 'fresh' cache-bypass flag, so the schema already carries parameter meaning. The description adds nothing further about keyword/location/fresh semantics and instead spends its words on return shape. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: checking whether Google shows an AI Overview for a keyword and which sources it cites. That is unambiguous and distinct in meaning from generic SERP tools. It never names or contrasts itself with close siblings like ai_mode, ai_visibility, or ai_mentions, so the agent must infer the boundary.
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 when checking if Google shows an AI Overview for a keyword' gives a clear triggering condition. There are no explicit exclusions or alternatives — nothing tells the agent when to pick ai_mode or ai_visibility instead of this tool, which matters given the dense AI-* sibling cluster.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_sampleARead-only
Use when measuring HOW OFTEN an AI answer names a business, not just whether it did once. Read-only: it asks the same question samples times and reports how often each business appears; nothing is changed or posted anywhere. The runs take one to three minutes, longer than a tool call can wait, so this returns a job_id right away -- call ai_sample_status with it to get the result.
COLLECTING: ai_sample_status is free and the result does not expire. Typical answers are ready in 30-60 seconds and the slowest in about 130 -- wait 30 seconds before the first check and roughly 15 between checks. status is "pending" or "running" until then.
WHY SAMPLE: a model composes its answer per request, so one answer is a sample, not a fact -- ask twice ten minutes apart and the businesses and their order can differ. A client asking "am I showing up in AI answers?" is asking for a rate, which a single ai_scraper or ai_mode call cannot give.
REPEATS: an identical request within 10 minutes returns the run already in progress (deduplicated: true, 0 credits), so retrying after a dropped connection is safe. To measure the same prompt again on purpose, pass force_new: true. Pass idempotency_key to group requests yourself.
PLATFORMS: chat_gpt and gemini cost 4 credits per sample; google_ai_mode costs 2 credits per sample and requires a location. The mention and visibility tools read stored aggregates, so they are not sampleable -- running one ten times returns the same numbers ten times.
COST: samples x the per-run price; 10 samples on chat_gpt is 40 credits. Samples that never complete are refunded, and the final figure is credits_charged on the status response.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | The prompt or keyword to ask repeatedly (e.g. "best plumber in Orchard Park NY") | |
| samples | Yes | How many times to run the prompt, 2-25. Below about 5 the rate is too coarse to act on; 10 is the usual daily figure. | |
| language | No | Language to ask in, as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to the language of the market you pass. | |
| location | No | Location (e.g. "Orchard Park, NY"). Required on google_ai_mode. Gemini supports city-level; ChatGPT resolves to country. | |
| platform | Yes | Which generator to sample. google_ai_mode is Google AI Mode and requires a location. | |
| force_new | No | Run the prompt again even though an identical submit is within the 10-minute replay window. This is how you take a SECOND measurement of the same prompt on purpose; without it the repeat is treated as a retry and returns the first job. | |
| idempotency_key | No | Your own key for this submit. Two submits carrying the same key return the same job for 24 hours, whatever their parameters. Use it when you are driving runs from a schedule and want the grouping to be yours rather than ours. | |
| force_web_search | No | Require the platform to search the web before answering. chat_gpt only. Use it when a local prompt comes back as a clarifying question rather than an answer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job_id | Yes | |
| status | Yes | |
| poll_url | Yes | |
| deduplicated | No | |
| estimated_seconds | Yes | |
| samples_requested | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world, and the description still adds substantial operational context beyond them: the call is asynchronous, returns a job_id immediately, costs 1-3 minutes, typical completion is 30-60s with a 130s worst case, deduplication replays identical requests within 10 minutes at 0 credits, and incomplete samples are refunded with credits_charged as the final figure. That is exactly the behavioral payload annotations cannot express.
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 lead sentence front-loads the decision criterion, and the labeled sections (COLLECTING, WHY SAMPLE, REPEATS, PLATFORMS, COST) make it scannable. It runs long for a tool description and repeats the dedup window in both REPEATS and the force_new schema text, so a sentence or two could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an asynchronous, credit-consuming tool with an output schema, the description supplies everything an agent needs to call it and act on it: the polling cadence against ai_sample_status, cost math before spending credits, refund behavior, and dedup semantics for safe retries. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter economics (samples x per-run price, 4 credits on chat_gpt vs 2 on google_ai_mode, location required for google_ai_mode) and the reasoning behind force_new and idempotency_key rather than restating their schema text. The extra value is real but partly duplicative of the schema wording.
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?
Opens with a specific use condition — measuring HOW OFTEN an AI answer names a business, explicitly contrasted with a single-answer tool — and names both the resource sampled and the job-based return shape. It also distinguishes itself from siblings (ai_scraper, ai_mode, mention/visibility tools) so the agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'WHY SAMPLE' section states exactly when this tool is right (a client asking for a rate) and when it is not (mention and visibility tools read stored aggregates, so running them repeatedly returns identical numbers). It also names the follow-up tool (ai_sample_status) and the overrides (force_new, idempotency_key) with the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_sample_statusARead-only
Collects the answer to an ai_sample job. FREE — poll as often as you need.
Returns status "pending" or "running" with progress and total_steps while the samples are still going, "complete" with the full distribution once they are done, and "failed" with an error if the job died (a failed job is refunded in full). Typical completion is 30-60 seconds, tail around 130.
WHAT COMES BACK: per business — appearances, appearance_rate, shortlist_rate, mean_rank, mean_shortlist_rank, best_rank, worst_rank, top_pick_count and runs_seen — plus every individual run.
TWO DIFFERENT RANKINGS, DO NOT MERGE THEM. businesses in a run is the platform's LISTING, in the order it emitted cards. recommended_businesses is the SHORTLIST read out of the answer's own prose, in the order the answer argued for it — that is the recommendation, and the two disagree routinely: a business the prose puts third can sit tenth in the listing. Report shortlist_rank when a client asks where an AI recommends them — it is null for a business the answer named in a sentence rather than listed, and those runs are counted in mention_appearances instead of shortlist_appearances. Each entry's mention quotes what the answer actually said. reader_version says which version of that reader produced the shortlist: it is our reading of the answer, not the platform's own listing, so before comparing this job with an older stored one confirm the versions match -- across a bump the numbers are not comparable and a reader improvement reads as a drop. mean_rank and best_rank are listing positions and are null for a business that was never in a listing.
GEMINI HAS NO LISTING AT ALL. It sends no structured business block, so businesses is empty in every gemini run and every gemini figure comes from the prose shortlist. An empty businesses array on gemini is not evidence that nobody was named.
READING THE RATES: every rate is out of samples_returned, which counts only runs that ANSWERED. A failed run and a refusal are both excluded — a run where the model said "I'm having a hard time fulfilling your request" is not a run where the client was absent. Check samples_refused: a high count means the platform is declining the prompt, not that the client is invisible, and per-run outcome says which runs those were. An answer that named nobody IS counted, because that is a real absence. mean_rank averages only the runs that named the business, so a business named 2nd in 3 of 10 runs reads mean_rank 2 and appearance_rate 0.3; do not collapse the two into one score.
cited_domains says which SOURCE the answers cited for each business and in how many runs, most-used first -- an answer sourcing a business from its BBB listing rather than its own site is telling you which page it treats as authoritative, and that is usually the finding a client wants. Note that domain and website on the same row hold a citation too, under names that read as the business's own site.
A business the answers spelled more than one way ("WNY Snow Removal" and "WNY Snow Removal LLC") is reported as ONE row, with every spelling in name_variants -- on gemini there is no cid behind a prose mention, so without that the same business reports two rows at half its real rate each. Only a legal form (LLC, Inc), a bare connector, or a tradeless corporate suffix (Service, Services, Company, Group, Solutions) merges; any word naming a different trade leaves the rows separate, as does a cid. A cited domain separates rows only when it looks like the business's own site -- a directory citation is not evidence of identity. Two rows can still be one business: where one name is the other plus a trade word and both carry the same own-site domain in cited_domains, that is usually one business split across spellings, and its real rate is the two rates added. The split is deliberate -- a chain's branches ("Smith Dental" and "Smith Dental Downtown") share a domain exactly the same way, and nothing in the answer says which case this is. Merging them is yours to decide with context about the business that we do not have; we leave the seam visible rather than guess, because a wrong merge cannot be undone from the payload.
matched_on says how runs were tied together: "cid" is Google's own identifier and is exact, "domain" is domain plus name, "name" is the string alone and is the weakest. Google labels AI Mode cards editorially, so on google_ai_mode prefer the cid.
BILLING: this poll costs nothing, so its credit line reads 0. What the job cost is credits_charged — the submit's reservation less the refund for samples that never completed. Refusals are NOT refunded: the prompt was run and the model answered, it just declined.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id ai_sample returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | No | |
| error | No | |
| job_id | Yes | |
| status | Yes | |
| keyword | No | |
| location | No | |
| platform | No | |
| progress | No | |
| businesses | No | |
| total_steps | No | |
| completed_at | No | |
| reader_version | No | |
| samples_failed | No | |
| credits_charged | No | |
| samples_refused | No | |
| credits_refunded | No | |
| credits_reserved | No | |
| samples_returned | No | |
| samples_requested | No | |
| samples_unreadable | No | |
| samples_shortlist_read | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, openWorld), and the description layers on non-obvious behavior: this poll costs 0 credits, credits_charged is the submit reservation minus refunds, refusals are not refunded, and failed jobs are refunded in full. It also discloses the returned statuses and their shapes, which no annotation conveys.
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?
Status semantics and the free-to-poll point are front-loaded, and section headers (WHAT COMES BACK, TWO DIFFERENT RANKINGS, GEMINI, READING THE RATES, BILLING) aid scanning. It is nonetheless very long for a single-parameter poll, and the name-merging discussion is a dense paragraph that could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the payload — listing vs. shortlist rankings, gemini's missing listing, rates out of samples_returned, matched_on strength, name merging — the description supplies the interpretive guidance an output schema cannot. Nothing needed to read the result correctly is missing.
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?
Only one parameter and schema coverage is 100%, with the schema itself saying 'The job_id ai_sample returned.' The description adds no syntax or format detail beyond that, so the schema is doing all the work — baseline 3 for a fully covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Collects the answer to an ai_sample job' — and explicitly ties it to the sibling that creates the job. An agent can tell this is the status/result-fetch counterpart to ai_sample without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'FREE — poll as often as you need' plus the pending/running/complete/failed breakdown makes the polling usage pattern clear, and typical timing (30-60s, tail ~130) implies cadence. It stops short of naming alternatives (e.g. ai_llm_response or ai_visibility) or stating when NOT to call it, so no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_scraperARead-only
Use when scraping ChatGPT or Gemini search results for a keyword. Returns markdown response, local_businesses, sources, fan_out_queries, and brand_entities. Each entry in sources carries a position — the order it was cited, from 1, after duplicates collapse. Costs 4 credits.
TWO RANKINGS, DO NOT MERGE THEM: local_businesses is the platform's LISTING, in the order it emitted cards. recommended_businesses is the SHORTLIST read out of the answer's own prose, in the order the answer argued for it, with shortlist_rank, listed, mention, is_top_pick and the citation offered beside each entry. listed: true means the entry held a place in a list the answer presented and shortlist_rank is that place; listed: false means the answer named it in a sentence instead, so shortlist_rank is null rather than a position it never had. mention is the answer's own words about the business, plain text — the evidence behind the row. They disagree routinely — ChatGPT opens a local answer by dumping its whole result set and only then writes the list it recommends, so a business the prose puts third can sit tenth in the array. Quote shortlist_rank when a client asks where an AI RECOMMENDS them.
GEMINI HAS NO LISTING AT ALL: it sends no business block, so local_businesses is empty on every gemini local query and recommended_businesses is the only place a business appears. An empty array on gemini is not evidence that nobody was named.
LOCAL BUSINESSES: on a local question, chat_gpt lists businesses inside its answer and we return them as local_businesses — rank, name, category, rating, reviews_count, address, phone, website, domain. Field names it shares with /v1/serp/local-pack mean the same things, so code reading those works against both — but the sets differ: this adds category and domain, and has no cid or hours. gemini has no equivalent and returns an empty array — read recommended_businesses there.
FORCE A SEARCH ON CHAT_GPT: chat_gpt sometimes answers a local prompt with a clarifying question ("which Orange County do you mean?") instead of an answer, which reads as an empty result. force_web_search: true makes it answer, at the same 4 credits, and is what makes the local_businesses block appear reliably. gemini decides for itself and returns a 400 if you ask.
MATCHING CITATIONS ON GEMINI: local answers often cite Google Business Profiles, which arrive with domain "maps.google.com" and the business name in title, identified by the cid in the URL. Match on title or cid rather than domain for those.
search_results is a reserved field we have not observed populated on either platform — read sources. fan_out_queries and brand_entities depend on the query and platform and are often empty.
SLOW: we ask ChatGPT or Gemini the question live and wait for the full answer. May take 30-90 seconds. This is normal, not an error — do not retry a call still in flight, it starts a second billable job.
| Name | Required | Description | Default |
|---|---|---|---|
| fresh | No | Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free. | |
| keyword | Yes | Keyword to scrape results for (e.g. "best electrician") | |
| language | No | Language to ask in, as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to the language of the market you pass — a French location is asked in French. This tool queries the model live and covers 43 languages worldwide, so this is not limited the way the AI mention endpoints are. | |
| location | No | Location for results (e.g. "Boston, MA"). Gemini supports city-level; ChatGPT resolves to country. Default: US | |
| platform | Yes | Which platform to scrape (chat_gpt or gemini) | |
| force_web_search | No | Require the platform to search the web before answering. chat_gpt only; gemini returns a 400. Does not change the price. Reach for it when a local prompt comes back as a clarifying question rather than an answer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | Yes | |
| keyword | Yes | |
| sources | Yes | |
| markdown | Yes | |
| platform | Yes | |
| brand_entities | Yes | |
| reader_version | No | |
| search_results | Yes | |
| fan_out_queries | Yes | |
| local_businesses | No | |
| recommended_businesses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context the annotations cannot carry: 4-credit cost, 30-90 second live latency with an explicit 'do not retry' warning, hour-long caching, and Gemini's 400 on force_web_search. It also discloses that search_results is unpopulated and that fan_out_queries/brand_entities are often empty.
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-loads the trigger well, but the body sprawls across six all-caps sections and spends a lot of prose on return-value semantics that an output schema already covers. The two-rankings warning earns its place; the LOCAL BUSINESSES field-by-field recap is redundant padding.
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?
Despite an output schema, the description supplies the interpretive knowledge an agent cannot derive structurally: local_businesses vs recommended_businesses ordering divergence, listed/shortlist_rank null semantics, and Gemini's empty-listing trap. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented in the schema, and the description largely restates force_web_search behavior rather than extending it. No new syntax, format, or edge-case detail is added for keyword, location, language or fresh.
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?
Opens with a specific trigger verb and resource: scrape ChatGPT or Gemini search results for a keyword. The distinction from siblings like ai_mode or ai_llm_response is only implicit (platform-level AI answers), never named, so it misses the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context ('Use when scraping ChatGPT or Gemini search results for a keyword') plus situational guidance for force_web_search and for reading recommended_businesses on Gemini. It never names a sibling alternative or an explicit when-not, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_top_pagesARead-only
Use when finding specific pages (not just domains) that AI models reference most. Returns top_pages with url, domain, mentions, and ai_search_volume. More granular than ai_top_sources. IMPORTANT: results are country-level (location_scope: "country") regardless of the location passed — a city resolves to its country and the numbers cover all of it. Check location_used. For city-level AI results use ai_scraper or ai_mode. Costs 81 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max pages. Default: 10, max: 50 | |
| keyword | Yes | Keyword to search for (e.g. "best dentist") | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise. | |
| location | No | Location for results (e.g. "Chicago, IL"). Default: US | |
| platforms | No | Platforms to query. Default: all |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| language | No | |
| top_pages | Yes | |
| location_used | No | |
| location_scope | No | |
| platforms_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses critical behavior: results are country-level regardless of the location passed, city inputs resolve to country scope, location_used should be checked, and the call costs 81 credits. These are exactly the operational details an agent needs before invoking it.
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 dense but front-loaded: purpose first, return fields second, the country-level caveat third, alternatives fourth, and cost last. Every sentence contributes actionable information.
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 read-only, open-world lookup tool with full schema descriptions and an output schema, the description covers the remaining decision-critical context: granularity, country-level behavior, alternatives, and cost. Nothing important for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds important meaning about location semantics that the schema does not capture: location is effectively country-level and city values are resolved upward. It does not add much beyond the schema for limit, language, or platforms, but the location caveat is significant.
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 resource and scope: finding specific pages that AI models reference most, not just domains. It explicitly distinguishes the tool from ai_top_sources as more granular, so an agent can select it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use case and names alternatives for the key edge case: city-level AI results should use ai_scraper or ai_mode. It also makes clear that this tool is the page-level counterpart to ai_top_sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_top_sourcesARead-only
Discovers which domains AI models cite most for a topic. Returns top_domains with domain, mentions count, and ai_search_volume. Reports at the domain level; ai_top_pages reports individual pages. IMPORTANT: results are country-level (location_scope: "country") regardless of the location passed — a city resolves to its country and the numbers cover all of it. Check location_used. For city-level AI results use ai_scraper or ai_mode. Costs 81 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max domains. Default: 10, max: 20 | |
| keyword | Yes | Keyword to search for (e.g. "plumber near me") | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise. | |
| location | No | Location for results (e.g. "Seattle, WA"). Default: US | |
| platforms | No | Platforms to query. Default: all |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| language | No | |
| top_domains | Yes | |
| location_used | No | |
| location_scope | No | |
| platforms_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and open-world annotations, the description discloses that results are country-level regardless of the city passed, that location_used should be checked, and that the call costs 81 credits. These are meaningful behavioral constraints and operational details not present in the annotations or 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 compact and front-loaded: purpose first, then return shape, sibling distinction, critical location caveat, alternatives, and cost. Every sentence carries useful information with no filler.
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?
The tool has an output schema, so return values need not be fully explained. The description still covers the key caveat, alternatives for different granularity, and credit cost, making it complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters. The description adds critical meaning beyond the schema by explaining that location resolves to country level regardless of the provided city, which directly affects how the location parameter should be interpreted.
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 names a specific verb and resource: it discovers which domains AI models cite most for a topic. It also states the returned fields and explicitly distinguishes itself from ai_top_pages, which reports individual pages rather than domains.
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?
It explicitly directs agents to ai_top_pages for page-level results and to ai_scraper or ai_mode for city-level AI results. The country-level limitation is clearly stated, including the instruction to check location_used, which prevents incorrect usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_visibilityARead-only
Measures a single domain's overall AI citation score across platforms. Returns total_mentions, total_impressions, ai_search_volume, and platform_breakdown (chat_gpt, google). Covers one domain; ai_compare covers several side by side. IMPORTANT: results are country-level (location_scope: "country") regardless of the location passed — a city resolves to its country and the numbers cover all of it. Check location_used. For city-level AI results use ai_scraper or ai_mode. Costs 81 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to analyze (e.g. "example.com") | |
| keywords | Yes | Keywords to check visibility for | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "French"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise. | |
| location | No | Location for results (e.g. "Austin, TX"). Default: US | |
| platforms | No | Platforms to query. Default: all |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| language | No | |
| top_sources | Yes | |
| location_used | No | |
| location_scope | No | |
| total_mentions | Yes | |
| ai_search_volume | Yes | |
| total_impressions | Yes | |
| platform_breakdown | Yes | |
| platforms_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the readOnly/openWorld annotations: a concrete cost (81 credits), the country-level resolution behavior that will silently differ from the requested city, and the instruction to verify location_used. It stops short of describing rate limits or failure modes, so not a 5.
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-loads purpose, then scope caveat, then alternatives, then cost. Every sentence carries distinct routing or behavioral information; nothing is padding, even though the field list partially duplicates the output schema.
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 the return-value enumeration is mild redundancy rather than a gap. The description covers the two things an agent can't infer from structured fields: the credit cost and the country-level scoping gotcha. Minor omission: no hint about latency or how keywords affect volume of work.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description earns above baseline by correcting a misleading schema hint — 'location' is documented in the schema as accepting "Austin, TX"-style input, but the description warns the result is country-level regardless, which materially changes how an agent should use that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — measures a single domain's AI citation score across platforms — and immediately names the sibling it is not (ai_compare handles multiple domains side by side). An agent can distinguish it from ai_compare, ai_mentions, and ai_scraper without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes three ways: single domain here, ai_compare for side-by-side comparison, and ai_scraper or ai_mode for city-level AI results. The country-level scope caveat also tells the agent when this tool will NOT give what it wants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_business_profileARead-only
Fetches a business's Apple Maps listing (NAP, rating, categories, coordinates). Use when auditing Apple Business Connect or checking NAP consistency on Apple. matched:false means no Apple listing exists at all. A listing that exists but has claimed:false means it exists and was never claimed in Apple Business Connect — a different, very common finding. claimed:null means unknown, not claimed. Both are results worth reporting, not errors. Check data_source before reporting a website mismatch: a non-empty value ("yelp") means Apple ingested the record from that provider, so its website is the provider's page by design. The returned platform_id is Apple's MUID: pass it back as muid on later calls to skip the name-resolution search, which drops the cost from 5 credits to 3. Costs 5 credits (3 with muid).
| Name | Required | Description | Default |
|---|---|---|---|
| muid | No | Apple MUID from a previous response, to skip the lookup search | |
| location | Yes | City and state (e.g. "Orchard Park, NY") | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| matched | Yes | |
| location | Yes | |
| platform | Yes | |
| business_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: discloses per-call cost (5 credits, 3 with muid) and the exact optimization path to reduce it. It pre-empts three common misreads of the response (matched:false, claimed:false vs claimed:null, data_source non-empty meaning Apple ingested from a provider), which are precisely the traps that would cause an agent to misreport results.
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 clause, then each subsequent sentence handles one distinct concern (existence states, claim states, data_source caveat, cost/optimization). Dense for its length but no sentence is filler, and the gotchas are ordered by likelihood of misinterpretation.
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 shape is covered elsewhere, yet the description still explains how to interpret the ambiguous result fields, plus the billing model and cost tradeoff. An agent has everything needed to call it, interpret the response, and report findings without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value: it explains that platform_id from a response is the MUID to pass back as `muid`, and that doing so skips the name-resolution search. The 5→3 credit framing also clarifies muid's practical value, not just its type.
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?
Opens with a specific verb+resource+payload: fetches a business's Apple Maps listing, with the returned fields enumerated (NAP, rating, categories, coordinates). Distinguishes it from the generic business_profile / apple_maps siblings by naming the Apple Business Connect context 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 when auditing Apple Business Connect or checking NAP consistency on Apple" gives a clear triggering condition and the tool's domain. It does not name alternatives (e.g., bing_business_profile for the Bing equivalent, or apple_maps for raw search results), so cross-tool routing is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apple_mapsARead-only
Checks how businesses rank on Apple Maps for a keyword. Use when the question is about Apple Maps, Siri, Apple Business Connect, or visibility on iPhone — Google local_pack does not cover these. Returns rank, name, address, phone, website, rating, reviews_count, categories, hours, coordinates, and platform_id (Apple's MUID, stable and worth keeping for later lookups). claimed: false means Apple states the listing has never been claimed in Apple Business Connect — report that as a finding, it is usually more actionable than any NAP mismatch. claimed: null means Apple said nothing about claim state; report it as unknown and never as claimed, because Apple only ever reports the unclaimed case. Ratings are normalized to a 5-point scale (Apple mixes 5-point and 100-point scales internally). data_source names who Apple credits for the record ("yelp", "foursquare"; empty when Apple credits no one) — when it is non-empty the record was ingested from that provider rather than supplied by the owner, so website often points at the provider's page and must NOT be reported as a NAP mismatch against the client's domain. A 502 mentioning results outside the requested location means Apple applied the location inconsistently and answered from elsewhere; retry once, and if it persists say Apple Maps data is unavailable for that city right now — never substitute a nearby city's rankings. Costs 3 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Result ordering. Default: default (best match) | |
| limit | No | Results to return. Default: 20 | |
| keyword | Yes | Search keyword (e.g. "plumber") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| results | Yes | |
| location | Yes | |
| platform | Yes | |
| total_results | 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 genuinely valuable operational context (3 credits cost, 502 retry policy, claimed-state semantics, rating normalization, data_source caveats), but much of that is really about interpreting return values rather than how the tool behaves as a call. Solid but not exceptional behavioral disclosure.
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 and trigger are front-loaded and every section is information-dense, but the single dense paragraph runs long and some field-by-field detail could be trimmed. Efficient rather than tight.
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, yet the description still anticipates the tricky interpretation cases an agent will hit: claimed:false vs claimed:null, provider-ingested records vs owner data, mixed rating scales, and the location-scoped 502. Given the tool's interpretive complexity, the coverage is complete.
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 four documented parameters, so the schema does the heavy lifting. The description mentions location behavior only indirectly, via the warning not to substitute a nearby city, and says nothing about sort or limit; the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Checks how businesses rank on Apple Maps for a keyword.' It explicitly contrasts with the Google-oriented sibling local_pack, so an agent can distinguish it from maps, local_pack, and bing_local without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions (Apple Maps, Siri, Apple Business Connect, iPhone visibility) and names the alternative that does not cover them (Google local_pack). It also supplies operational guidance for the 502 partial-location failure, including retry once and never substituting a nearby city.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backlink_gapARead-only
Use when finding link building opportunities -- sites that link to competitors but not to you. Returns referring domains with domain_authority and which competitors they link to. Costs 23 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max opportunities. Default: 50, max: 100 | |
| your_domain | Yes | Your domain (e.g. "example.com") | |
| competitor_domains | Yes | Competitor domains to compare against |
Output Schema
| Name | Required | Description |
|---|---|---|
| your_domain | Yes | |
| opportunities | Yes | |
| total_opportunities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint, so the safety profile is covered. The description adds genuinely non-redundant behavior: the credit cost (23 credits) and the shape of what comes back, which an agent needs for cost-aware planning. No contradiction with annotations.
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?
Three short sentences: the trigger first, the return second, the cost last. Every sentence carries distinct information — no restatement of the title or the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and all three parameters are documented inline. The description covers trigger, output gist, and cost; it does not mention the limit cap or result volume, which a 3-parameter costed tool could afford to note.
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 inline descriptions for limit (default 50, max 100), your_domain, and competitor_domains (1–5 items), so the baseline is 3. The description adds no parameter-level detail beyond naming competitors as the comparison target, so it neither compensates nor detracts.
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 — finds sites linking to competitors but not to the user's domain — and previews the return shape (referring domains with authority and competitor linkage). That distinguishes it conceptually from backlink_summary and competitor_gap, though neither sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when finding link building opportunities" gives an explicit use context rather than leaving it implied. There are no stated exclusions or named alternatives (e.g., when to prefer competitor_gap or backlink_summary instead), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
backlink_summaryARead-only
Use when getting a domain's backlink profile overview. Returns rank, backlinks_total, referring_domains, broken_backlinks, spam_score, and backlinks_by_type. Costs 23 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain to analyze (e.g. "example.com") |
Output Schema
| Name | Required | Description |
|---|---|---|
| rank | Yes | |
| domain | Yes | |
| spam_score | Yes | |
| backlinks_total | Yes | |
| broken_backlinks | Yes | |
| backlinks_by_type | Yes | |
| referring_domains | Yes | |
| referring_domains_nofollow | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, non-destructive, open-world operation. The description adds useful behavioral context by disclosing a 23-credit cost and summarizing the returned profile fields. It does not discuss rate limits or authorization, but the cost disclosure is a meaningful addition beyond the annotations.
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 three compact sentences, with usage context front-loaded, followed by return fields and cost. Every sentence carries actionable information and there is no filler.
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?
The tool has a simple one-parameter schema, an output schema, and annotations covering safety behavior. The description supplies the remaining relevant context: when to use it, what it returns, and its credit cost. Nothing material for invoking the tool is missing.
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?
There is one parameter and schema description coverage is 100%, so the schema fully documents the 'domain' argument. The description implies a domain input but adds no format, validation, or domain-handling detail beyond the schema. A baseline score of 3 is appropriate.
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 action and resource: getting a domain's backlink profile overview. It lists the returned metrics, making the tool's purpose concrete. It does not explicitly distinguish this overview from the sibling backlink_gap tool, so it misses full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening phrase 'Use when getting a domain's backlink profile overview' gives a clear use condition. However, it does not name exclusions or compare against alternatives such as backlink_gap, so the agent must infer when this overview is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bing_business_profileARead-only
Fetches a business's Bing Maps listing (NAP, rating, coordinates). Use when auditing Bing Places or checking NAP consistency on Bing. matched:false means no Bing listing was found, which usually means Bing Places was never claimed — a finding, not an error. Costs 3 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state (e.g. "Orchard Park, NY") | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| matched | Yes | |
| location | Yes | |
| platform | Yes | |
| business_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive semantics, and the description adds genuinely new context: the meaning of matched:false and its implication that Bing Places was never claimed, plus a concrete cost of 3 credits. It doesn't mention failure modes such as invalid location strings or quota exhaustion, so not a 5.
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?
Three tight sentences, front-loaded with the verb and returned data, then usage, then the edge-case semantics and cost. Nothing is redundant or padded.
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 shape need not be explained, and the description still covers cost and the not-found case. The remaining gap is disambiguation from adjacent tools such as bing_local and business_profile, which the agent must resolve on its own.
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 only two required params, and both are already documented in the schema. The description adds no syntax or format guidance for business_name or location beyond what the schema says, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — fetching a business's Bing Maps listing — and names the returned fields (NAP, rating, coordinates), so the agent knows exactly what it gets back. It does not explicitly distinguish itself from near-siblings like bing_local or business_profile, which keeps it from a 5.
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 when auditing Bing Places or checking NAP consistency on Bing" gives a clear triggering context. It stops short of naming an alternative for the same job (e.g., business_profile or apple_business_profile for other platforms), so routing between siblings still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bing_localARead-only
Checks how businesses rank in Bing's local results for a keyword. Use when the question is about Bing, Bing Places, Copilot, or ChatGPT local recommendations — ChatGPT's web layer draws on Bing, so this is the closest measurable proxy for it. Returns rank, name, address, phone, website, hours, coordinates, and platform_id. Bing publishes no ratings or review counts on local results, so rating is null and reviews_count is 0 — that is a platform limitation, not missing data. claimed is always null: Bing gives no claimed/unclaimed signal. Costs 3 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Results to return. Default: 20 | |
| keyword | Yes | Search keyword (e.g. "plumber") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| results | Yes | |
| location | Yes | |
| platform | Yes | |
| total_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, it discloses the returned field set, explains the counterintuitive null rating, reviews_count=0, and claimed=null as platform limitations rather than data gaps, and states the cost (3 credits). This is exactly the context annotations cannot carry.
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 is front-loaded in the first sentence, and every following sentence carries actionable payload — proxy rationale, return fields, null-field caveats, cost. No filler or restatement of the name.
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 present, the description need not enumerate return values, yet it pre-empts the most likely agent confusion (null rating, reviews_count=0, claimed=null). Combined with annotations covering safety and cost noted explicitly, nothing needed to call it correctly is missing.
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% and every parameter (keyword, location, limit) is documented in the schema itself. The description adds no parameter-specific syntax or constraints, 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 ('Checks how businesses rank') and a specific resource ('Bing's local results for a keyword'), and the Bing framing cleanly distinguishes it from siblings like apple_maps, local_pack, and organic_serp. An agent knows exactly what this tool produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage conditions — Bing, Bing Places, Copilot, or ChatGPT local recommendations — and explains the proxy rationale. It stops short of naming a specific alternative (e.g. the Google equivalent) or an explicit when-not-to-use case, so it is clear context without full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brand_mentionsARead-only
Use when monitoring where a brand is mentioned online with sentiment analysis. Returns total_mentions, sentiment_breakdown (positive/neutral/negative), and mention details with domain_authority and sentiment. Costs 23 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max mentions. Default: 20, max: 100 | |
| business_name | Yes | Business or brand name to search for |
Output Schema
| Name | Required | Description |
|---|---|---|
| mentions | Yes | |
| total_mentions | Yes | |
| sentiment_breakdown | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and open-world access, so the description's main contribution is the 23-credit cost, a genuinely useful operational detail absent from structured fields. Return contents are summarized but largely duplicated by the output schema, and nothing is said about pagination or coverage limits for the search.
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?
Three tight sentences: trigger first, output shape second, cost last. Nothing is padded and the most actionable line is 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 two-parameter read-only tool with an output schema and full annotations, the description covers purpose, outputs, and cost adequately. The remaining gap is sibling disambiguation against ai_mentions, which matters in a toolset this dense.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, fully documenting business_name and the limit range/default. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('monitoring where a brand is mentioned online') plus the differentiating capability of sentiment analysis. It does not distinguish itself from the sibling ai_mentions, so an agent must infer which mention-tracking tool applies.
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 when monitoring where a brand is mentioned online' gives an implied context for use, but there are no exclusions, prerequisites, or named alternatives (notably ai_mentions or reputation_audit).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
business_listingsARead-only
Use when discovering all businesses in a category and location (bulk discovery, not single business lookup). Returns name, rating, reviews_count, address, city, phone, website, place_id, lat/lng, and categories for each, searched within search_radius_km of the location (location_used echoes where). Costs 10 credits per 50 results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results (1-200). Default: 50 | |
| category | Yes | Business category (e.g. "plumber", "dentist") | |
| location | Yes | City and state |
Output Schema
| Name | Required | Description |
|---|---|---|
| category | No | |
| location | No | |
| businesses | Yes | |
| location_used | No | |
| total_available | Yes | |
| search_radius_km | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, and the description adds real value beyond that: the credit cost model ('10 credits per 50 results'), the radius semantics, and the location_used echo. Minor deduction for referencing search_radius_km and location_used, which are not present in the input schema, which could make an agent search for a parameter it cannot set.
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?
A single front-loaded sentence opening with the usage trigger, followed by return fields, scoping behaviour and pricing. Every clause adds information an agent needs; nothing is redundant filler.
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?
Pricing, radius scoping and result-set composition make this callable without follow-up questions, and an output schema exists so return values need not be enumerated. However the description enumerates return fields that the output schema already covers, and the phantom radius/location_used references slightly muddy the parameter picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both required parameters are already documented, establishing a baseline of 3. The description adds meaning about radius behaviour and an echoed location field outside the schema, but says nothing about the limit parameter or how it interacts with the per-50-results cost, so it does not materially enrich parameter semantics.
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 ('discovering all businesses in a category and location') and immediately scopes it against the wrong interpretation ('bulk discovery, not single business lookup'). An agent can distinguish this from a single-business lookup or profile tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when discovering all businesses in a category and location') plus one negative case (not single business lookup). It stops short of naming a specific sibling alternative such as local_finder or maps for overlapping discovery needs, so routing between near-duplicates is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
business_profileARead-only
Use when pulling one business's complete GBP data. Returns name, address, phone, website, hours, categories, photos_count, rating, reviews_count, description, attributes, cid, place_id, and verified status. If no exact match is found, returns matched=false with up to 5 suggestions from Google Maps including place_id for exact retry. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| cid | Yes | |
| name | Yes | |
| hours | No | |
| phone | Yes | |
| rating | Yes | |
| address | Yes | |
| matched | No | |
| website | Yes | |
| place_id | Yes | |
| verified | Yes | |
| attributes | Yes | |
| categories | Yes | |
| description | Yes | |
| suggestions | No | |
| photos_count | Yes | |
| reviews_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior, and the description adds real operational context the annotations cannot: a 5-credit cost and a defined no-match path (matched=false plus up to 5 Maps suggestions with place_id for retry). It doesn't mention rate limits or auth, but it adds substantive behavior beyond structured fields.
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?
Four tight sentences, front-loaded with the use case and followed by payload, fallback, and cost. Every sentence carries information an agent would otherwise have to guess.
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?
Covers the use case, the fallback behavior, and the credit cost; an output schema exists so the field list is supplementary. Only gap is that the field enumeration duplicates the output schema, but nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so business_name, location and place_id are already documented. The description's 'place_id for exact retry' reinforces but does not meaningfully extend the schema's own 'Google Place ID for exact match', so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope: 'pulling one business's complete GBP data', plus an explicit field inventory. 'GBP' plus the Google Maps fallback makes it distinguishable from the apple_business_profile and bing_business_profile siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when pulling one business's complete GBP data' gives a clear selection condition, and the single-business scope implies it is not the tool for multi-record listing work. It does not name an alternative or exclusion explicitly (e.g. business_listings for bulk), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citation_auditARead-only
Use when checking NAP (Name, Address, Phone) consistency across business directories (Yelp, BBB, Facebook, YellowPages, Angi, Houzz, Trustpilot and more). Returns consistency_score (0-100 partial-credit average over found listings; null when no listings found) and per-directory match details. Match fields are true (verified), false (conflicting value found), or null (listing found but the field isn't visible in search data, so it can't be verified). Every directory selected is scanned whether or not a listing exists there, so directories_checked always equals what was requested -- a business listed on only a handful still returns a row per directory. Scans the top 20 directories by default (50 credits); directories takes a count up to 50 or an explicit list of directory names, and costs 2.5 credits each (all 50 = 125 credits). Expensive -- confirm with user first.
| Name | Required | Description | Default |
|---|---|---|---|
| phone | Yes | Business phone number | |
| address | Yes | Full business address | |
| directories | No | How much to scan, at 2.5 credits per directory. A number takes the top N of 50 (default 20 = 50 credits; 50 = 125 credits), or pass exact directory names e.g. ["yelp", "bbb", "houzz"] | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| found | No | |
| details | Yes | |
| not_found | Yes | |
| consistent | Yes | |
| unverified | No | |
| inconsistent | Yes | |
| consistency_score | Yes | |
| directories_checked | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly/openWorld annotations already covering the safety profile, the description adds substantial extra context: per-directory credit cost (2.5, 50 credits for the default 20, 125 for all 50), the fact that every selected directory is scanned whether or not a listing exists, and the exact meaning of null vs false match values. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use case, then return semantics, then cost. Dense but every sentence carries actionable content; the only mild redundancy is restating return-value semantics that the output schema already covers.
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, yet the description still resolves the key ambiguities an agent would hit: what consistency_score means, how nulls differ from falses, and why directories_checked always matches the request. Cost and confirmation requirements are also covered, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description still adds meaning the schema does not: the credit math tied to `directories`, that a count takes the top N of 50, the default of 20, and the total cost ceiling. It doesn't add format hints for business_name/address/phone, which limits it to a 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: checking NAP (Name, Address, Phone) consistency across named business directories (Yelp, BBB, Facebook, etc.). This clearly separates it from siblings like business_listings, local_audit, or profile_health, which do not audit citation consistency.
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?
Begins with an explicit 'Use when checking NAP consistency...' trigger and adds a strong gating condition: 'Expensive -- confirm with user first.' It does not name an alternative sibling tool or state when NOT to use it, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
competitor_adsARead-only
Use when seeing what Google Ads a competitor domain is running. Returns advertiser, total_ads (after limit), total_available, and per creative: advertiser_name, creative_id, format, first/last shown, and preview_image_url / transparency_url links. Google's Ads Transparency Center does not carry ad headline or body text, landing URLs, or platforms. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max ads. Default: 20, max: 100 | |
| domain | Yes | Competitor domain (e.g. "competitor.com") | |
| format | No | Ad format filter | |
| location | No | Geographic location filter |
Output Schema
| Name | Required | Description |
|---|---|---|
| ads | Yes | |
| domain | No | |
| total_ads | Yes | |
| advertiser | Yes | |
| total_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnly/openWorld annotations already covering the safety profile, the description still adds real value: the 2-credit cost, the explicit data gaps (no headline/body text, landing URLs, or platforms), and the distinction between total_ads and total_available. Cost and coverage limits are exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger, then returns, then limitations and cost, with no filler sentences. The per-creative field enumeration is somewhat verbose given an output schema exists, but it is not wasteful enough to penalize heavily.
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 covers return values and annotations cover safety, so the description only needs to add cost and data-coverage caveats — both are present, including what the source fundamentally lacks. Nothing an agent needs to decide or call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so domain/limit/format/location are already documented in the schema, and the description only implies limit behavior via 'total_ads (after limit)'. It adds no format or location filter semantics beyond the enum already 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+resource: what Google Ads a competitor domain is running. Clearly distinct from organic SERP or keyword siblings, though it doesn't explicitly separate itself from the local_services_ads sibling, which is the nearest neighbor an agent could confuse it with.
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 when seeing what Google Ads a competitor domain is running' gives a clear triggering context. No explicit when-not conditions or named alternatives, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
competitor_gapARead-only
Use when comparing your business vs local competitors on rankings, reviews, ratings, and Google Business Profile completeness. Returns your_business stats, competitor details with advantages, and your_gaps. Costs 10 credits + 2 per competitor actually returned (default 5 competitors = 20 credits; thin markets may return fewer and cost less).
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No | Keyword to compare on (defaults to business name) | |
| location | Yes | City and state | |
| competitors | No | Number of competitors to analyze (1-10). Default: 5 | |
| business_name | Yes | Your business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| your_gaps | Yes | |
| competitors | Yes | |
| your_business | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavior beyond the annotations: it discloses credit costs, per-competitor billing, the default competitor count, and that thin markets may return fewer competitors and cost less. These are material operational details not captured by readOnlyHint, openWorldHint, or destructiveHint.
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 front-loaded with the use case, then states what is returned, then explains cost. Every sentence carries actionable information and there is no filler.
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 present and full schema description coverage, the description still provides the key operational context an agent needs: purpose, return structure at a high level, default behavior, and credit cost. Nothing important appears missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning for the competitors parameter by explaining default count, billing per actually returned competitor, and cost variability in thin markets. It does not further clarify business_name, location, or keyword beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific comparison task: comparing your business vs local competitors on rankings, reviews, ratings, and Google Business Profile completeness. This clearly distinguishes it from sibling tools focused on single-business audits, reviews, or backlinks.
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?
It gives a clear usage condition with 'Use when comparing your business vs local competitors...' but does not name when to avoid it or explicitly route to alternative sibling tools such as local_audit or reputation_audit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geogrid_scanARead-only
Use when mapping where a business ranks across a geographic area. Read-only: it checks public Google Maps rankings at each point of a grid and changes nothing. Ranks count organic listings only (ads are skipped), top 20. Returns: grid (2D array, 0 = not found), grid_points (flat array with row, col, lat, lng, rank, status -- use for map plotting), center, average_rank (ARP), atrp (not found = 21), solv (% of points in the top 3), found_in, failed_points, total_points. Set include_listings to also get the top 20 businesses at every point (competitor analysis). Expensive: 2 cr per point -- 18 cr (3x3), 50 cr (5x5, the default), 98 cr (7x7), 162 cr (9x9); confirm with user first. Points that could not be checked are refunded. Usually takes 30-60 seconds; this tool waits for the result.
IF THE RESULT IS NOT READY IN TIME: a 9x9 can take longer than the wait. You then get a job_id instead of a grid -- fetch the grid with geogrid_status, which is free. Calling geogrid_scan again with the same inputs returns that same lookup at 0 credits rather than running a second one, and a finished grid is cached for 24 hours -- but geogrid_status is the way to get the grid.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | Maps zoom each point searches at. Default: auto (14). Fix it only to match an existing series. | |
| center | No | Exact grid center. Use the business's own coordinates to track it over time; overrides location. | |
| keyword | Yes | Search keyword to check rankings for | |
| business | No | Business name to track. Required unless place_id is given. | |
| location | No | Center location for the grid, e.g. "Buffalo, NY". Required unless center is given. | |
| place_id | No | Google Place ID for precise matching (e.g. ChIJ...). When provided, the business is matched by Place ID instead of name, which is far more reliable. | |
| grid_size | No | Grid dimensions. Default: 5x5. Larger grids cost more (2 cr per point). | |
| radius_miles | No | Radius in miles from center. Default: 3 | |
| include_listings | No | Also return the top 20 organic listings at every point. Default: false. Same price; larger response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, openWorldHint, destructiveHint), so the lower bar applies. The description adds substantial beyond-schema context — organic-only ranking, credit pricing per grid size, refunds for failed points, 30-60s wait, job_id fallback, and 24h caching — making it unusually transparent for a 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?
Front-loaded with the use case, then cost, then the timeout/retry path — every section earns its place. It is dense and long, but the density is functional rather than padding; only the return-field enumeration is more verbose than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description fully enumerates the return fields (grid, grid_points, center, average_rank, atrp, solv, etc.), plus cost, timing, and the async fallback — everything an agent needs to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real value by mapping grid sizes to credit costs (18/50/98/162 cr) and explaining include_listings triggers the top-20 competitor listings, beyond what the schema field text states.
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?
Opens with a specific use condition (mapping where a business ranks across a geographic area) and clarifies scope: public Google Maps organic rankings only, top 20, ads skipped. An agent can distinguish it from geogrid_status, which is explicitly named as the follow-up tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it, when to instead call geogrid_status ('if the result is not ready in time'), and that re-calling with same inputs returns a cached lookup rather than a duplicate run. Also mandates confirming cost with the user first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geogrid_statusARead-only
Collects the grid from a geogrid_scan that returned a job_id instead of a result. FREE -- poll as often as you need.
Returns status "pending" or "running" while the grid is being searched, "complete" with the full grid once done, and "failed" with an error if the scan died (it is refunded). Most scans finish inside geogrid_scan itself and never need this; a scan that runs long is the one that does.
Points that could not be checked have status "error" in grid_points, are counted in failed_points, and are refunded.
READING THE GRID: grid is a 2D array where 0 means the business was not found at that point, not that it ranked zero. average_rank and found_in count only the points where it WAS found, so a strong average_rank across a low found_in means the business ranks well in a small area and is invisible outside it -- which is the finding a geogrid exists to produce.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id geogrid_scan returned instead of a grid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| atrp | No | |
| grid | No | |
| solv | No | |
| zoom | No | |
| error | No | |
| total | No | |
| cached | No | |
| center | No | |
| job_id | Yes | |
| status | Yes | |
| keyword | No | |
| warning | No | |
| found_in | No | |
| place_id | No | |
| progress | No | |
| grid_size | No | |
| zoom_mode | No | |
| grid_points | No | |
| average_rank | No | |
| completed_at | No | |
| radius_miles | No | |
| total_points | No | |
| business_name | No | |
| failed_points | No | |
| credits_refunded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, open-world, and non-destructive, but the description adds substantial context: FREE unlimited polling, the full pending/running/complete/failed lifecycle, refunds on failure, and per-point error/refund semantics. No annotation contradiction.
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-loads the core trigger in the first sentence, then moves through statuses, error/refund handling, and grid-reading notes in short labeled chunks. The length is justified by async polling and interpretation guidance, with no filler.
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?
Even with an output schema present, the description supplies interpretive rules the schema cannot convey: 0 means not found, and average_rank/found_in count only found points. Combined with annotations and complete parameter coverage, nothing needed to call it correctly is missing.
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?
There is only one parameter, and schema coverage is 100% with a description that already explains job_id as the value returned by geogrid_scan. The description repeats that meaning but does not materially extend it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: collect the grid from a geogrid_scan job that returned a job_id. It also names the exact sibling scenario that triggers it, so an agent can distinguish it from geogrid_scan and unrelated status tools.
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?
Explicitly says to use it only when geogrid_scan returned a job_id instead of a result, notes that most scans never need this tool, and encourages polling because it is free. That covers both when to use it and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceARead-only
Returns available credits (split into the monthly plan allowance, spent first, and the never-expiring wallet), daily spending cap, plan, and environment. Useful before running multi-step or expensive analyses to confirm the account has enough credits. Free (0 credits).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| balance | Yes | |
| wallet_balance | No | |
| monthly_balance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds value beyond them by disclosing the cost model ('Free (0 credits)') and the exact content of the response breakdown, including the spending order of the two credit pools — information an agent needs to interpret the result.
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?
Three short sentences, front-loaded with what is returned, then when to call it, then cost. Each sentence carries distinct information — payload contents, usage trigger, and free-call status — with no restatement of the name or title.
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?
A zero-parameter, read-only, free tool with an output schema that documents the return shape and annotations that cover the safety profile. The description adds the two things structured fields cannot: the semantic meaning of the two credit pools and the recommended call timing.
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?
Zero parameters, so there is nothing to document beyond what the empty schema already conveys; baseline applies. The description correctly avoids inventing or implying any inputs.
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?
Names a specific verb and resource ('Returns available credits') and enumerates the exact breakdown: monthly plan allowance (spent first), never-expiring wallet, daily spending cap, plan, and environment. No sibling tool in the list does anything similar, so an agent can distinguish it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger — call it before multi-step or expensive analyses to confirm sufficient credits. It does not state when the call is unnecessary (e.g., cheap single-shot queries), but with no competing sibling for balance information there is little ambiguity left.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
google_reviewsARead-only
Use when reading actual review text and owner replies for sentiment analysis or reply auditing. Returns text, rating, date, author_name, owner_reply for each review plus total_reviews and average_rating. For multi-location brands pass place_id (from business_profile) — name+location lookups can silently return empty. Costs 1 credit per 10 reviews. May take 10-30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order. Default: newest | |
| limit | No | Number of reviews (1-100). Default: 10 | |
| language | No | Review language as ISO 639-1 code or name (e.g. "fr", "French"). Default "en" machine-translates non-English reviews — pass the market's language to get original review text. | |
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match (recommended for multi-location brands) | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| reviews | Yes | |
| total_reviews | Yes | |
| average_rating | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: cost (1 credit per 10 reviews), expected latency (10-30s), a silent-failure mode for ambiguous lookups, and the fact that the default language machine-translates. That is exactly the context an agent needs to plan a call and interpret an empty result.
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-loads the trigger, then return shape, then the parameter caveat, then cost and latency. Every sentence carries a distinct constraint; nothing is restated from the schema without a reason.
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 read-only lookup with a full schema and output schema, the remaining unknowns are the ones that actually cause bad calls — cost, latency, ambiguous-match emptiness, translation behaviour — and all four are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description's job is only to add meaning. It usefully elevates place_id to a recommended override and flags that the language default translates rather than returns originals — real added value — but sort, limit and business_name get no treatment. Marginally above 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?
States a specific verb and resource — reading review text and owner replies — plus the intended analysis use (sentiment, reply auditing) and the exact fields returned. It never names its closest siblings (multi_platform_reviews, review_velocity), so an agent must infer that this one is Google-only and text-level rather than aggregate or velocity.
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?
Opens with an explicit "Use when..." trigger and gives a concrete operational rule: pass place_id for multi-location brands because name+location can silently return empty. It stops short of naming when to prefer a different review tool, so there is no true exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_getARead-only
Returns one past call in full, including the response body exactly as it was returned at the time. Free (0 credits).
Takes the request_id from any previous response, or the id from history_search. This is how you read an answer you already paid for rather than buying it again.
A null body is not an error and not a missing call: the call happened, and its cost and timing are still there. response_data_omitted is "not_stored" and deliberately does not guess which of four causes applied — logging off for the account, a body over the size limit, a non-JSON body, or an endpoint whose response is never stored.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A request_id from a previous response, or an entry id from history_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| method | Yes | |
| params | No | |
| endpoint | Yes | |
| created_at | Yes | |
| error_code | Yes | |
| request_id | Yes | |
| status_code | Yes | |
| credits_used | Yes | |
| response_data | No | |
| response_time_ms | Yes | |
| response_data_omitted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: it is free, null bodies are not errors, and response_data_omitted="not_stored" intentionally does not infer one of four possible causes. This is exactly the kind of operational context annotations do not provide.
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-loads the purpose and cost, then explains id sourcing, then addresses the null-body edge case. Every sentence carries useful information without repetition.
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?
Given an output schema, annotations covering read-only safety, and a fully documented parameter, the description supplies the remaining important context: cost, id source, and non-error null body behavior.
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 schema has 100% description coverage and documents the single id parameter. The description repeats that the id comes from a previous response or history_search but does not add syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: returns one past call in full, including the response body as originally returned. It explicitly distinguishes this from history_search by saying where the id comes from and frames the value as reading an already-paid-for answer.
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 when to use it: with a request_id from a previous response or an id from history_search. It also gives the alternative implicitly by saying this reads an answer already paid for rather than buying it again.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
history_searchARead-only
Finds calls this account has already made, with what was asked and what it cost. Free (0 credits).
USE THIS BEFORE BUYING DATA AGAIN. Every response this API has returned is kept, so "has this changed since last month?", "what did we see last time?" and "did we already check this?" are answerable from what has been paid for once. Running the original endpoint again to answer them charges full price for a second copy.
Filter by endpoint, by date range, and by what was asked: keyword, location, business_name and domain match the parameters of the original call, so "every AI Mode call for this keyword" is one search. Note that a sandbox key sees only sandbox calls, and if the account turned response logging off then params were not stored either and these filters find nothing. Values match exactly, not as substrings — "best plumber" and "best plumber near me" are different questions and are not merged.
Returns entries with request_id, endpoint, params, credits_used, status_code and created_at, newest first, but NOT the response bodies — they are large and a search is for finding the call. Pass a request_id to history_get for the answer itself.
Building a trend: search for the calls, then history_get each one. A month of daily AI Mode calls is 30 cheap reads instead of 30 paid ones.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Latest date, ISO. | |
| from | No | Earliest date, ISO (e.g. "2026-08-01"). | |
| page | No | Page number, from 1. | |
| sort | No | Default created_at. | |
| limit | No | Entries per page, max 100. Default 25. | |
| order | No | Default desc, newest first. | |
| domain | No | Exact domain the original call was made with. | |
| status | No | Only successful calls, or only failed ones. | |
| keyword | No | Exact keyword the original call was made with. | |
| endpoint | No | Endpoint path, matched as a substring (e.g. "/v1/serp/ai-mode" or just "ai-"). | |
| location | No | Exact location the original call was made with. | |
| business_name | No | Exact business_name the original call was made with. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| limit | Yes | |
| pages | Yes | |
| total | Yes | |
| entries | Yes | |
| total_is_exact | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world, so the description correctly spends its words elsewhere: zero-credit cost, full response retention, the sandbox-key scoping caveat, the logging-disabled caveat that silently empties all param filters, and the fact that response bodies are deliberately excluded. These are exactly the behavioral traps an agent could otherwise fall into.
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-loads the cost-saving instruction before any mechanics, and each paragraph covers a distinct concern (why, filters, return shape, composition). It runs long for a search tool and the 'did we already check this?' example list is slightly padded, but nothing is genuinely wasted.
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 12-parameter search tool with an output schema, the description supplies the pieces structured data cannot: free-vs-paid framing, retention guarantees, account-state caveats, matching semantics, and the request_id handoff to history_get. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining the conceptual semantics — filters match the parameters of the original call, values match exactly rather than as substrings ('best plumber' ≠ 'best plumber near me'), and endpoint is the one substring field. It doesn't touch from/to, sort, order, page or limit, but the schema handles those.
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 ('finds calls this account has already made') and immediately scopes it to request history rather than response bodies, explicitly routing to history_get for the payload. An agent can distinguish it from the dozens of live-endpoint siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit imperative ('USE THIS BEFORE BUYING DATA AGAIN'), names the concrete question shapes it answers, states the cost consequence of the alternative (re-running the original endpoint charges full price), and names the complementary tool (history_get) with the exact composition pattern. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_opportunitiesARead-only
Use when finding the best local keywords to target based on difficulty vs current rank. Returns keywords with estimated_difficulty, your_rank, and search_volume. Costs 4 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Business category to find keywords for (defaults to business name) | |
| location | Yes | City and state | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful non-annotation context — the credit cost (4 credits) and the returned fields — which helps the agent understand the operational tradeoff.
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?
Three tightly written sentences: usage condition, return shape, and cost. It is well front-loaded with no filler, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with a full input schema, annotations, and an output schema, the description covers the core purpose, result fields, and cost. It could be slightly richer about how ranking is determined or prerequisites, but nothing essential for correct invocation is missing.
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 three parameters are already documented in the schema. The description adds no parameter-level guidance beyond what the schema provides, making the baseline score appropriate.
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 outcome — finding the best local keywords based on difficulty vs current rank — which distinguishes it from generic sibling tools like keyword_suggestions or search_volume. It does not explicitly name alternatives, but the purpose is concrete and agent-actionable.
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?
Begins with an explicit usage condition ('Use when finding...') tied to the ranking-vs-difficulty scenario, giving clear context for selection. It does not mention when not to use it or name sibling alternatives, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_overviewARead-only
Use when you have keywords and want the full picture on them: search volume, CPC and competition PLUS keyword_difficulty and search_intent (informational, navigational, commercial, transactional) and the averaged backlink profile of the pages currently ranking (backlinks, dofollow, referring_pages, referring_domains, referring_main_domains, and the 0-1000 rank and main_domain_rank authority scores) — what it takes to rank for each term. Accepts up to 1000 keywords. IMPORTANT: volumes are country-level (volume_scope: "country") — use search_volume instead when the city/state number is what matters. A null value means no data, not zero. Costs 10-116 credits, by keyword count (10 for one keyword, 20 for a hundred).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Keywords to look up | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "fr-FR", "French"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise. | |
| location | Yes | Geographic location — scoped to its country (e.g. "Orchard Park, NY" reads as United States) |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes | |
| language | No | |
| location | Yes | |
| data_source | No | |
| total_count | Yes | |
| volume_scope | No | |
| location_used | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, open-world, non-destructive, so the safety profile is covered; the description still adds substantial context the annotations cannot express — credit cost band (10-116, scaling with keyword count), the 1000-keyword cap, country-level volume scoping, and that null means no data rather than zero. That is exactly the kind of extra context that earns full marks against an annotated 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?
Front-loaded with the trigger condition and the sibling contrast, and every sentence carries information (output fields, cap, cost, null semantics). The one long parenthetical enumerating backlink fields is dense and slightly hard to scan, which keeps it from a 5.
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?
Covers limits, cost, scoping caveats, and null handling, and the tool has an output schema so return shapes need not be spelled out — yet the description still previews the key fields. An agent has everything needed to decide and call correctly.
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 three parameters are already documented and the baseline is 3. The description reinforces the 1000-keyword limit and the country-level scoping of location, but adds little syntax or format detail beyond what the schema states, and includes no guidance on language fallback behavior.
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?
Names a specific resource (keywords) and enumerates the exact payload it returns: volume, CPC, competition, keyword_difficulty, search_intent, and the averaged backlink profile. It explicitly contrasts itself with the sibling search_volume, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with a trigger condition ("Use when you have keywords and want the full picture on them") and names the alternative plus the precise condition that selects it ("use search_volume instead when the city/state number is what matters"). Both when-to-use and when-to-use-something-else are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keywords_for_siteARead-only
Use when reverse-engineering what keywords a competitor domain ranks for. Returns keywords with search_volume, cpc, and competition. IMPORTANT: volumes are country-level (volume_scope: "country") — our keyword database for this tool has no city/state granularity; check location_used for the actual scope. Costs 20 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results. Default: 50, max: 1000 | |
| domain | Yes | Domain to analyze (e.g. "example.com") | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "fr-FR", "French"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise. | |
| location | Yes | Geographic location (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| keywords | Yes | |
| language | No | |
| location | Yes | |
| data_source | No | |
| total_count | Yes | |
| volume_scope | No | |
| location_used | No | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only, non-destructive, and open-world. The description adds valuable behavior not in annotations: the 20-credit cost and the important caveat that volume data is country-level only, with location_used indicating actual scope.
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 three sentences, front-loads the use case, lists return fields, and clearly flags the critical volume-scope caveat and cost. Every sentence carries operational value.
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?
Given that annotations cover safety, the schema documents all parameters, and an output schema exists, the description supplies the remaining operational essentials: return metrics, cost, and the country-level volume limitation. Nothing material appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantic context about the location parameter's limitation: volumes are country-level and location_used should be checked for actual scope, which is more than the schema states.
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: reverse-engineering what keywords a competitor domain ranks for, and names the returned metrics. This clearly distinguishes it from generic keyword suggestion or search-volume tools in the sibling list.
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?
It gives an explicit usage context: 'Use when reverse-engineering what keywords a competitor domain ranks for.' However, it does not name alternatives such as keyword_opportunities or keyword_overview or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_suggestionsARead-only
Use when generating new keyword ideas from a seed keyword. Keyword ideas come from our national keyword database; volumes and CPC are then localized via Google Ads for city/state locations (volume_scope: "local") with a labeled country-level fallback (volume_scope: "country") — check location_used for the actual scope, and location_alternatives for sibling entities like townships. keyword_difficulty remains national (SERP-based). A null search_volume means no data, not zero searches. For metrics on keywords you already have, search_volume returns volume/CPC directly. Costs 92 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max suggestions. Default: 50, max: 1000 | |
| keyword | Yes | Seed keyword (e.g. "plumber") | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "fr-FR", "French"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise. | |
| location | Yes | Geographic location (e.g. "Orchard Park, NY") | |
| include_seed_keyword | No | Include seed keyword in results. Default: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| language | No | |
| location | Yes | |
| data_source | No | |
| suggestions | Yes | |
| total_count | Yes | |
| seed_keyword | Yes | |
| volume_scope | No | |
| location_used | No | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the readOnly/openWorld annotations: it explains the national database source, Google Ads localization for city/state scopes, country fallback, location_used and location_alternatives fields, national keyword_difficulty, null search_volume semantics, and a 92-credit cost.
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 front-loaded with the usage condition and remains dense with relevant operational details. It is appropriately sized for the tool's complexity, though the single long paragraph could be easier to scan.
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?
Given the output schema and annotations, the description covers the key behavioral context an agent needs: data source, localization scope, fallback behavior, null handling, alternative tool routing, and cost. Nothing material appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns an extra point by explaining how the required location parameter affects volume_scope, fallback behavior, and related output fields, though it does not elaborate on limit, language, or include_seed_keyword beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: generating new keyword ideas from a seed keyword. It also distinguishes the tool from search_volume for users who already have keywords and need metrics.
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?
It explicitly says when to use this tool and gives search_volume as the alternative for existing keywords. It does not clarify when to choose related_keywords, keyword_opportunities, or keywords_for_site, so the sibling routing guidance is good but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_trendsARead-only
Use when checking if a keyword is rising, stable, or declining over time. Returns one series per keyword: interest data points (weekly or monthly — see granularity; each point has date), peak_month (null when the keyword has no data), trend_direction, and has_data. The in-progress week/month is left out (partial_period_excluded). IMPORTANT: interest data is country-level (volume_scope: "country") — Google Trends via this source has no city/state granularity; check location_used for the actual scope. Periods: 3m, 6m, 12m (default), 5y. Costs 9 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Time period. Default: "12m" | |
| keywords | Yes | Keywords to get trends for | |
| location | Yes | Geographic location (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| period | Yes | |
| trends | Yes | |
| keywords | Yes | |
| location | Yes | |
| data_source | No | |
| total_count | Yes | |
| volume_scope | No | |
| location_used | No | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: the in-progress week/month is omitted, interest data is country-level with no city/state granularity, peak_month can be null, and the tool costs 9 credits. These are exactly the operational details an agent needs to invoke it correctly.
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 front-loaded with the usage condition and keeps important caveats near the end. It is dense but largely purposeful, though it enumerates return fields even though an output schema exists.
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?
Given the output schema and annotations, the description is complete: it covers when to use the tool, supported periods, cost, return shape, missing-data behavior, and the critical country-level limitation. An agent has enough context to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning by clarifying the period options and default and warning that location resolves to country-level scope via location_used. It also indicates one series is returned per keyword.
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 clearly states that the tool checks whether a keyword is rising, stable, or declining over time, and it summarizes the returned trend data. It does not explicitly differentiate this from sibling keyword tools such as search_volume, keyword_overview, or keyword_opportunities.
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?
It gives a clear usage context: use when checking keyword trend direction over time. It also notes the supported periods, default period, credit cost, and country-level limitation, but it does not name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_auditARead-only
Use when running a comprehensive local SEO check: SERP + profile + reviews + competitors in one call. Returns local_pack_position, organic_positions, rating, reviews_count, profile_completeness, review_velocity, competitors, and recommendations. Expensive (50 credits) -- confirm with user first. Async, takes 15-45 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| business_name | Yes | Business name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, it discloses cost (50 credits), latency (15-45 seconds), and async execution — three operational traits an agent cannot get from structured fields. It also names the concrete return fields, so the agent knows the shape of the result without an 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?
Three sentences, each doing distinct work: trigger, return payload, and cost/latency warning. The most decision-critical constraint (expensive, confirm first) is placed after the payload but before the timing caveat, and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-param aggregator with no output schema, the description supplies the trigger, the full list of returned metrics, the credit cost, and the expected wall time. An agent has everything needed to decide whether to call it and to warn the user.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters documented ('City and state', 'Business name'), so the schema already carries the semantic load. The description adds no format guidance or constraints on business_name/location (e.g., disambiguation, use of location_search first), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and composite resource: 'comprehensive local SEO check: SERP + profile + reviews + competitors in one call'. It enumerates exactly which data domains are bundled, which distinguishes it from single-signal siblings like local_pack, organic_serp, google_reviews, and competitor_gap.
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 when running a comprehensive local SEO check' gives a clear triggering context, and the 'in one call' framing implicitly signals the alternative is running the individual tools separately. It also adds a procedural gate: 'confirm with user first' due to cost. It stops short of explicitly naming the narrower sibling tools or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_authorityARead-only
Use when calculating a composite 0-100 local authority score. Returns authority_score with breakdown by ranking, reviews, profile, and citations (each with score, max, and detail), plus percentile. Good single metric to track over time. Costs 10 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No | Keyword to evaluate authority for (defaults to business name) | |
| location | Yes | City and state | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| breakdown | Yes | |
| percentile | Yes | |
| authority_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered; the description adds genuinely new context by disclosing the 10-credit cost and the shape of the result (sub-scores with score/max/detail plus percentile). It does not mention permission or quota nuances beyond the flat credit price, keeping it short of a 5.
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?
Four short sentences, front-loaded with the trigger condition and immediately followed by return shape, then a tracking hint and cost. No filler, though the 'Good single metric to track over time' line is the softest and could be folded into the usage sentence.
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 present, the description needn't explain return values, yet it summarizes them usefully; combined with annotations covering safety and the disclosed credit cost, an agent has enough to decide and call correctly. The only gap is no guidance on when a more granular audit sibling is preferable.
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 business_name, location, and keyword are already documented at the field level. The description adds nothing about parameter behavior (e.g., how keyword alters the score versus defaulting to the business name), which is the baseline-3 case where the schema carries the load.
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+resource ('calculating a composite 0-100 local authority score') and enumerates the output components (ranking, reviews, profile, citations, percentile), so an agent knows exactly what this produces. It does not explicitly name a sibling it is not (e.g., local_audit or reputation_audit), so differentiation from the many audit tools is only inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use when calculating a composite 0-100 local authority score' and 'Good single metric to track over time' imply the usage context (a rollup/tracking metric versus detailed point-in-time audits), but there is no explicit when-not condition or named alternative to select instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_finderARead-only
Use when you need local listings with Google CID identifiers (instead of GPS coordinates from maps). Returns names, ratings, reviews, addresses, phone, hours, websites, and CIDs. Supports min_rating filter. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results. Default: 20, max: 100 | |
| keyword | Yes | Search keyword (e.g. "plumber") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") | |
| min_rating | No | Minimum star rating filter (0-5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| results | Yes | |
| location | Yes | |
| location_used | No | |
| total_results | Yes | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and non-destructive behavior. The description adds useful context beyond annotations: the output fields returned and a concrete cost of 2 credits.
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-loads the usage condition, then lists return data, filter support, and cost in compact sentences with no waste.
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 safety, an output schema present, and full schema descriptions, the description supplies the remaining decision-critical context: CID-vs-GPS distinction, return content, filter support, and credit cost.
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 parameter meanings are already documented. The description mentions the `min_rating` filter but adds no format or edge-case detail beyond that, making the baseline 3 appropriate.
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 capability: local listings with Google CID identifiers, and explicitly contrasts it with map-based GPS coordinate results. This lets an agent distinguish it from the `maps` sibling without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use condition — local listings with CIDs rather than GPS coordinates — and names the alternative `maps` scenario. It does not cover when-not-to-use relative to other local listing siblings, but the primary routing cue is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_packARead-only
Checks where businesses rank in Google's local pack for a keyword. Returns rank, name, cid, rating, reviews_count, address, phone, hours, website. Returns the top 3 by default; set depth for a deeper local ranking list (up to 60), and device to check desktop vs mobile. maps returns GPS coordinates and place_ids instead of CIDs. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Number of results. Default: 20, max: 60 | |
| device | No | Device type. Default: desktop | |
| keyword | Yes | Search keyword (e.g. "plumber") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| results | Yes | |
| location | Yes | |
| location_used | No | |
| total_results | Yes | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, open-world, non-destructive operation. The description adds useful behavior beyond annotations: it states the credit cost, describes the returned fields, and explains depth and device effects. The only issue is that its stated default result count conflicts with the schema's default.
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 front-loaded with the core purpose and then efficiently covers output fields, depth, device, the `maps` distinction, and cost. It is appropriately sized and has no wasted sentences.
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, and annotations cover the safety profile, so the description does not need to carry the full burden. It is still mostly complete, but the incorrect default-result statement conflicts with the schema and leaves an agent unsure about how many results will be returned without setting depth.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents keyword, location, depth, and device. The description adds some semantic context for depth and device, but it says the tool returns the top 3 by default while the schema says depth defaults to 20, creating a meaningful ambiguity.
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 names a specific verb and resource: checking where businesses rank in Google's local pack for a keyword. It also distinguishes the tool from the sibling `maps` tool by explaining that `maps` returns GPS coordinates and place_ids instead of CIDs.
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?
It implies the use case is local-pack rank checking and explicitly contrasts with `maps` for a different output shape. However, it does not say when to use this instead of other local or keyword tools such as `local_finder`, `organic_serp`, or `business_profile`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
local_services_adsARead-only
Use when checking Google Guaranteed/Screened ads for service categories (home services, legal, etc.). Returns business names, ratings, and reviews from the LSA carousel on the Google results page; badge, years_in_business, phone and services are filled only when Google shows them there. Retries on the mobile SERP when desktop shows no LSAs; lsa_block_found: false means Google showed none for the query. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | Search keyword (e.g. "plumber") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| ads | Yes | |
| keyword | Yes | |
| location | Yes | |
| total_ads | Yes | |
| device_used | No | |
| location_used | No | |
| lsa_block_found | No | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses conditional field population (badge, years_in_business, phone, services only when Google shows them), a mobile-SERP retry fallback, the meaning of lsa_block_found: false, and a 2-credit cost. These are exactly the non-obvious operational facts an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage condition, and each subsequent clause (returned fields, fallback, lsa_block_found semantics, cost) adds distinct value. The semicolon-chained single paragraph is dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value structure need not be explained, and the description still covers the key behavioral caveats: partial field population, retry fallback, no-LSA signal, and credit cost. Nothing needed to invoke it correctly is missing.
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 only two parameters (keyword, location) that already carry examples. The description implies the query/location split only indirectly and adds no format guidance beyond the schema, so 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 names a specific resource (Google Guaranteed/Screened Local Services Ads in the LSA carousel of the SERP) and a specific action (check ads for service categories), and it enumerates the returned fields. This is distinguishable from siblings like local_pack or organic_serp, which cover different SERP elements.
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 when checking Google Guaranteed/Screened ads for service categories (home services, legal, etc.)" gives a clear trigger condition with examples. It does not explicitly name an alternative tool or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
location_searchARead-only
Use when resolving city names to the exact format needed by other tools. Call this when a tool returns no results for a location or when the format is ambiguous. Returns name, code, type (location taxonomy: City, County, State, DMA Region, ...), state, country, and parent_code, plus total_count and a truncated flag. IMPORTANT for multi-location ambiguity: many municipalities exist twice (e.g. "Hamilton" AND "Hamilton Township" in NJ — different entities with very different search volumes); pass a bare place name plus the state param to see all of them. Free (0 credits).
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Place name (e.g. "Cherry Hill" or "Austin, TX"). Prefer a bare name + state param over baking the state into q. | |
| limit | No | Max results. Default: 10 | |
| state | No | State/province filter, name or abbreviation (e.g. "NJ"). Scopes matching without hiding suffixed entities like townships. | |
| country | No | Country filter (e.g. "United States" or "US") |
Output Schema
| Name | Required | Description |
|---|---|---|
| locations | Yes | |
| truncated | No | |
| total_count | No |
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 safety is covered. The description adds real behavioral context beyond that: free at 0 credits, truncated flag on results, and the substantive warning that many municipalities exist twice (Hamilton vs. Hamilton Township) with different search volumes. It loses a point because the return-field enumeration duplicates the output schema rather than adding to it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage trigger and tightly written, with the ambiguity warning given the emphasis it deserves. The one wasted clause is the list of returned fields, which the output schema already supplies.
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 four-parameter read-only resolver with a full output schema, the description covers every decision an agent must make: when to invoke, how to disambiguate, what shape the answer comes in, and that it costs nothing. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3. The description goes beyond it by explaining why the state param is preferable to baking the state into q — it scopes matching without hiding suffixed entities like townships. That is genuine semantic guidance the schema only asserts, not justifies.
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 — resolving place names to the canonical format other tools require — and names the returned taxonomy (City, County, State, DMA Region). No sibling tool in the list performs this normalization, and the agent can distinguish it immediately from search/listing tools.
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?
Explicit trigger conditions are given: call it when another tool returns no results for a location or when the location format is ambiguous. It also prescribes the exact invocation pattern for the ambiguous case (bare place name plus the state param) so all suffixed entities are surfaced. This is when-to-use plus how-to-call, not just context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mapsARead-only
Returns local map results with GPS coordinates — up to 60 listings with name, place_id, rating, reviews_count, address, phone, website, hours, lat/lng, and categories. Paid map pins are excluded from the ranking and listed in sponsored_results. If the first search returns nothing, the API automatically retries once with the city appended to the keyword (geo_fallback_applied: true, keyword_used shows the retried keyword). Unresolvable locations return a validation error instead of silently searching country-wide. local_pack returns just the top 3 with CIDs if that's all you need. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of results. Default: 20, max: 100 | |
| keyword | Yes | Search keyword (e.g. "dentist") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keyword | Yes | |
| results | Yes | |
| location | Yes | |
| keyword_used | No | |
| total_results | Yes | |
| location_resolved | No | |
| sponsored_results | No | |
| geo_fallback_applied | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, and the description adds genuinely new behavior: paid pins excluded from ranking and split into sponsored_results, an automatic one-shot retry with city appended (geo_fallback_applied/keyword_used flags), and a validation error for unresolvable locations instead of a silent country-wide search. These are exactly the non-obvious traits an agent needs before calling.
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?
Roughly five sentences, each carrying distinct information — return shape, sponsored exclusion, fallback behavior, error mode, alternative, cost — with the primary purpose front-loaded and no filler.
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 over-explained, yet the field list is a useful preview; combined with the fallback/error semantics and credit cost, an agent has everything needed to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description goes beyond it by explaining what happens with the location value (unresolvable locations raise a validation error rather than broadening the search) and with the keyword (retried once with the city appended). Minor tension: the text says "up to 60 listings" while the schema allows limit up to 100, which slightly muddies the limit parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — returns local map results with GPS coordinates — and immediately enumerates the fields returned, so an agent knows exactly what it gets. It explicitly distinguishes itself from the sibling local_pack ("returns just the top 3 with CIDs if that's all you need").
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?
Names a concrete alternative (local_pack) and the condition that selects it, and explains the cost (2 credits), which helps an agent budget calls. It does not cover when-not-to-use cases such as preferring business_profile or google_reviews for details on a known place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
multi_platform_reviewsARead-only
Compares ratings across Google + Trustpilot in one call. Returns per-platform rating, count, and trend, plus combined_rating and total_reviews. Covers both platforms; google_reviews covers Google alone. Costs 6 credits. May take 10-30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match (recommended for multi-location brands) | |
| platforms | No | Platforms to check. Default: ["google", "trustpilot"] | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| platforms | Yes | |
| total_reviews | Yes | |
| combined_rating | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, but the description adds genuinely new operational facts beyond them: 6 credit cost and 10-30 second latency. Those are the two things most likely to change how an agent schedules or limits this call. It stops short of explaining why it is slow or whether errors still bill credits.
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?
Five short sentences, zero repetition, front-loaded with purpose, then return shape, then differentiation, then cost and latency. Every sentence carries information an agent would otherwise have to guess.
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 the description only needs to sketch the return shape — which it does (per-platform rating, count, trend, plus combined_rating and total_reviews). With annotations covering safety and the description covering cost and latency, the only real gap is failure behavior, such as what happens when Trustpilot has no listing.
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 four parameters (business_name, location, place_id, platforms) are already documented in the schema, including the platforms enum and the place_id recommendation for multi-location brands. The description adds no syntax or interpretation guidance beyond that, 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?
Opens with a specific verb and resource: 'Compares ratings across Google + Trustpilot in one call.' It immediately names the sibling it overlaps with (google_reviews) and states the scope difference, so an agent can pick the right tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Covers both platforms; google_reviews covers Google alone' is an explicit routing rule toward the alternative. What's missing is the reverse guidance — when to prefer google_reviews (e.g. single-platform queries) or whether platforms can be narrowed to avoid the 6-credit cost.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
organic_serpARead-only
Use when you need the complete Google search results page in one call: organic listings, local pack, ads, People Also Ask, AI overview, LSA ads, and knowledge panel. Best for auditing overall search presence. Costs 2 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | Search keyword (e.g. "best plumber near me") | |
| location | Yes | City and state (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| ads | Yes | |
| lsa_ads | Yes | |
| local_pack | Yes | |
| ai_overview | Yes | |
| location_used | No | |
| knowledge_panel | Yes | |
| organic_results | Yes | |
| people_also_ask | Yes | |
| location_alternatives | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld/non-destructive, so the description doesn't need to restate safety. It adds genuinely useful operational context the annotations lack: credit cost (2 credits) and the breadth of returned sections. It doesn't cover pricing edge cases (e.g. whether credits are consumed on empty results), keeping it just under a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus a cost note; the use condition leads, the component list follows, and the practical cost detail comes last. Nothing is redundant or padded.
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 safety, an output schema present, and full parameter documentation, the remaining burden on the description is selection context and cost — both supplied. Minor gaps (per-result credit behavior, geography variability) are low-impact for a read-only SERP tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with keyword and location documented with examples in the schema itself. The description adds no additional semantics about parameter formats or constraints, 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 names a specific verb-and-resource pairing ('complete Google search results page in one call') and enumerates exactly what comes back (organic listings, local pack, ads, PAA, AI overview, LSA ads, knowledge panel). That enumeration also implicitly distinguishes it from single-component siblings such as local_pack, ai_overview, and local_services_ads.
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 when you need the complete ... in one call' and 'Best for auditing overall search presence' give a clear selection context. It stops short of explicitly naming the alternative single-surface tools or saying when not to use it (e.g. when only a local pack is needed, use local_pack), so it's clear but not fully routing-guiding.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_auditARead-only
Use when auditing a single page's on-page SEO. Returns seo_score, title, meta_description, h1, word_count, load_time_ms, body_text_unreadable, core_web_vitals (lab lcp in ms and cls; inp is null — it needs field data), issues with severity (seo_score is 100 minus 15 per critical, 5 per warning, 1 per info), schema_markup, and mobile_friendly. Costs 1 credit.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full URL to audit (e.g. "https://example.com/page") |
Output Schema
| Name | Required | Description |
|---|---|---|
| h1 | Yes | |
| title | Yes | |
| issues | Yes | |
| seo_score | Yes | |
| word_count | Yes | |
| load_time_ms | Yes | |
| schema_markup | Yes | |
| core_web_vitals | Yes | |
| mobile_friendly | Yes | |
| meta_description | Yes | |
| body_text_unreadable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses credit cost ('Costs 1 credit'), the exact seo_score arithmetic, and a real limitation ('inp is null — it needs field data', 'body_text_unreadable'). These are behavioral traits the agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage trigger, then a dense but purposeful enumeration of returns and the cost note. Every clause carries information, though the return list is long enough that it slightly outweighs the opening guidance.
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?
Covers the trigger, the cost, the scoring formula, the known-null metric and its cause, and a flag for unreadable content. Combined with the existing output schema, an agent has everything needed to call it and interpret results correctly.
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?
There is a single parameter and schema description coverage is 100%, so the schema already explains the URL format. The description adds nothing about URL semantics (e.g. http vs https, redirects, trailing slash), so it sits at the baseline for fully documented params.
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: auditing a single page's on-page SEO. The 'single page' scope distinguishes it from site-wide siblings such as local_audit and citation_audit, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening clause 'Use when auditing a single page's on-page SEO' gives a clear selection condition against the site-level audit siblings. It does not explicitly name when-not to use it or call out the alternative tool by name, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingARead-only
Use when diagnosing connection or authentication issues. Tests API connectivity end-to-end by verifying the API key against the backend. Free (0 credits).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context the annotations do not carry: it performs an end-to-end check against the backend (validating the key, not just network reachability) and costs 0 credits. Annotations already cover safety (readOnly, non-destructive), so this added cost and validation-scope information is meaningful. No mention of failure output or rate limits, keeping it below a 5.
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?
Three short sentences, front-loaded with the usage trigger, then the mechanism, then the cost. No waste.
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 parameterless diagnostic with no output schema and full annotation coverage, the description gives an agent everything needed to decide to call it. Only gap is what a success/failure response looks like, which is minor given the tool's simplicity.
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?
Zero parameters, so baseline is 4; the description correctly implies no arguments are needed to invoke it. Nothing further is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Tests API connectivity end-to-end by verifying the API key against the backend.' This clearly separates it from the data-retrieval siblings (organic_serp, get_balance, etc.), which all return local marketing data rather than a health check.
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 when diagnosing connection or authentication issues' gives an explicit trigger condition. No when-not guidance or named alternative is given, but none of the siblings overlap enough to require routing instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_healthARead-only
Audits what's missing or weak on a Google Business Profile. Returns completeness_score (0-100), missing_fields, incomplete_fields, and specific recommendations. For the raw profile fields without scoring, business_profile returns them directly. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| qa_count | Yes | |
| verified | Yes | |
| photos_count | Yes | |
| missing_fields | Yes | |
| posts_last_30d | Yes | |
| recommendations | Yes | |
| incomplete_fields | Yes | |
| completeness_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds a valuable behavioral detail beyond annotations: 'Costs 5 credits', which lets an agent weigh the call against cheaper alternatives. It doesn't mention failure modes when the profile isn't found, but the core behavioral info is present.
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?
Three sentences, front-loaded with purpose, then the sibling alternative, then cost. Every sentence carries distinct value with no redundancy.
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 present and rich annotations, the description needn't explain return values — yet it still names the key outputs. Combined with the credit cost and the explicit sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (location, place_id, business_name). The description adds no parameter-level detail beyond the schema — its mention of return fields is separate — 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 opens with a specific verb and resource: 'Audits what's missing or weak on a Google Business Profile.' It explicitly distinguishes itself from the sibling tool 'business_profile', which returns raw fields without scoring, so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the condition that selects this tool (getting a scored completeness audit) and names the alternative (business_profile) for raw fields. It doesn't explicitly say when NOT to use the tool (e.g., for Bing/Apple profiles, or when a profile doesn't exist yet), but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qaARead-only
Use when checking what questions people ask on a GBP and whether they have answers. Returns questions with text, author, date, and answers with upvotes. Costs 5 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| questions | Yes | |
| total_questions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and destructiveHint=false. The description adds valuable context by disclosing the 5-credit cost and summarizing returned content (questions, author, date, answers with upvotes), though it does not cover auth or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the usage condition, followed by return shape and cost. Every sentence carries information with no filler.
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 input schema and an output schema, the description is nearly complete for a simple read tool. It covers usage, cost, and return content; only sibling differentiation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema for business_name, location, or place_id; it only implies a GBP context.
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 uses a specific verb ('checking what questions people ask') and resource ('GBP' Q&A), and makes the tool's focus clear. It does not explicitly differentiate itself from sibling tools like google_reviews or business_profile, but the Q&A framing is distinct enough.
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?
It gives a clear use case ('Use when checking what questions people ask...') but does not name alternatives or say when not to use it. With many sibling tools available, a mention of e.g. google_reviews for review content would have helped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reputation_auditARead-only
Use when analyzing cross-platform review reputation with sentiment. Returns reputation_score, per-platform ratings, sentiment themes, response_rate, and recommendations. Costs 30 credits. May take 10-30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| location | Yes | City and state | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| platforms | Yes | |
| sentiment | Yes | |
| response_rate | Yes | |
| recommendations | Yes | |
| reputation_score | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, and non-destructive behavior; the description adds operational context: 30-credit cost and 10-30 second latency, plus return contents. It does not disclose data freshness or the exact platform list, but the added cost and latency context is valuable.
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?
Three compact sentences; the usage trigger, output contents, cost, and latency are front-loaded with no filler. Every sentence provides operational or selection value.
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?
Given an existing output schema, annotations, and complete input schema, the description covers what the tool does, return fields, cost, and runtime. It is sufficiently complete for an agent to decide and call it, though platform scope remains implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both required parameters have descriptions, so the schema carries parameter meaning. The description does not add any parameter-level guidance for business_name or location, so the baseline of 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 names a specific analysis (cross-platform review reputation with sentiment) and lists output contents, so an agent can identify the capability. It does not explicitly distinguish this from sibling review tools such as multi_platform_reviews or local_audit, so it is clear but not sibling-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Use when analyzing cross-platform review reputation with sentiment' supplies a clear triggering condition. It gives no when-not guidance or named alternatives, which matters given the many sibling review and audit tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_velocityARead-only
Analyzes review growth rate, rating changes, reply rate, and sentiment themes over time. Returns reviews_per_month, rating_trend, reply_rate, sentiment_themes, and monthly breakdown. For raw review text without trend analysis, see google_reviews. For multi-location brands pass place_id (from business_profile) — name+location lookups can silently return empty. Costs 6 credits. May take 10-30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Time period: "30d", "90d", "6m", or "1y". Default: "90d" | |
| location | Yes | City and state | |
| place_id | No | Google Place ID for exact match (recommended for multi-location brands) | |
| business_name | Yes | Business name |
Output Schema
| Name | Required | Description |
|---|---|---|
| reply_rate | Yes | |
| rating_trend | Yes | |
| period_rating | Yes | |
| current_rating | Yes | |
| sentiment_themes | Yes | |
| reviews_per_month | Yes | |
| review_count_by_month | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, non-destructive, open-world operation. The description adds important behavior beyond those annotations: 6-credit cost, 10-30 second latency, and the silent-empty-result risk for name+location lookups.
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 compact and well ordered: purpose, return values, alternative tool, multi-location caveat, cost, and latency. Each sentence adds actionable information without repetition.
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?
Given the presence of an output schema and read-only annotations, the description supplies the remaining decision-critical context: output metrics, when to use a sibling tool, place_id guidance, cost, and expected runtime. Nothing important for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter definitions already do most of the work. The description adds meaningful operational semantics for place_id, explaining that it comes from business_profile and is recommended for multi-location brands because name+location can silently fail.
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?
Starts with a specific verb-resource pairing: analyzes review growth rate, rating changes, reply rate, and sentiment themes over time. It clearly distinguishes itself from the sibling google_reviews by framing that tool as raw review text without trend analysis.
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?
Explicitly routes users to google_reviews for raw review text, and gives a concrete multi-location recommendation to pass place_id because name+location lookups can silently return empty. The cost and latency notes further help an agent decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_volumeARead-only
Use when you have specific keywords and need monthly volume, CPC, and competition data. Accepts up to 1000 keywords. Returns search_volume, cpc, competition, competition_level, and monthly_searches trend. Volumes are locally scoped when the location is a city/state (volume_scope: "local", data_source: "google_ads"); falls back to country-level numbers when local data is unavailable (volume_scope: "country") — check location_used for the actual scope. If location_alternatives is present, the location has sibling entities (e.g. "Hamilton" vs "Hamilton Township", NJ) whose volumes can differ 3-5x — check them before treating one number as the whole market. A null search_volume means no data, not zero searches. Costs 72 credits.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Array of keywords to analyze | |
| language | No | Language as ISO 639-1 code or name (e.g. "fr", "fr-FR", "French"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise. | |
| location | Yes | Geographic location (e.g. "Orchard Park, NY") |
Output Schema
| Name | Required | Description |
|---|---|---|
| keywords | Yes | |
| language | Yes | |
| location | Yes | |
| data_source | No | |
| total_count | Yes | |
| volume_scope | No | |
| location_used | No | |
| location_alternatives | No | |
| country_fallback_unavailable | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: discloses local-vs-country fallback logic with volume_scope values, the location_alternatives trap (3-5x divergence for sibling entities), the null-means-no-data rule, the 1000-keyword ceiling, and the 72-credit cost. That is exactly the caveat material an agent cannot get from structured fields.
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-loads the trigger, then returns, then scope caveats, then cost — good ordering with no filler. The explicit return-field list partly duplicates the output schema that already exists, which is the only wasted material.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-world, credit-charging lookup with a complex geo-scoping failure mode, it covers inputs, outputs, fallbacks, cost, and null semantics. Nothing an agent needs in order to call it correctly and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds real semantic depth on `location` by explaining local vs country scoping, location_used, and location_alternatives divergence. It does not touch `language` at all, so it does not fully round out all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (keyword search volume) and enumerates exactly which metrics are returned (volume, CPC, competition, trend), which implicitly separates it from discovery siblings like keyword_suggestions or keyword_trends. An agent can tell this is the metrics-lookup tool, not a keyword-generation tool.
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?
Opens with a clear trigger: 'Use when you have specific keywords and need monthly volume, CPC, and competition data,' which sets the precondition (you must already have keywords). It does not name an alternative tool or state when to prefer a sibling instead, so it stops short of the 5 bar.
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.
52 tool updates
v1.1.0- Changed
ai_compare2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "by_domain": { + "items": { + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "total_impressions": { + "type": "number" + }, + "total_mentions": { + "type": "number" + } + }, + "required": [ + "domain", + "total_mentions", + "total_impressions", + "ai_search_volume" + ], + "type": "object" + }, + "type": "array" + }, + "keywords": { + "items": { + "type": "string" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "location_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + }, + "location_used": { + "type": "string" + }, + "platforms_available": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "keywords", + "by_domain" + ], + "type": "object" +}
- Changed
ai_keyword_data2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to the language we hold AI keyword data for in that country.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keywords": { + "items": { + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "keyword": { + "type": "string" + }, + "monthly_searches": { + "items": {}, + "type": "array" + } + }, + "required": [ + "keyword", + "ai_search_volume", + "monthly_searches" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_used": { + "type": "string" + }, + "total_keywords": { + "type": "number" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "total_keywords", + "keywords" + ], + "type": "object" +}
- Changed
ai_llm_response7 fields changed- added
Input schema / properties / force_web_searchAdded value: +{ + "description": "Require the search rather than leaving it to the model's judgement. Requires web_search: true. Accepted on claude, and on chat_gpt only for non-GPT-5 models. Not available on gemini or perplexity. In testing it changed which sources were retrieved more than what the answer said, so reach for it when you need a search guaranteed, not for better answers.", + "type": "boolean" +} - added
Input schema / properties / freshAdded value: +{ + "description": "Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free.", + "type": "boolean" +} - changed
Input schema / properties / model / descriptionPrevious value: -"Optional model name (e.g. gpt-4o, claude-sonnet-4-20250514, gemini-2.5-flash, sonar). Defaults to latest for each platform."New value: +"Optional model name (e.g. gpt-5.4-mini, claude-sonnet-5, claude-opus-5, gemini-3.8-flash, sonar). Defaults to the newest standard-tier model for each platform at 8 credits. Pinning changes the cost: standard 8 credits, premium (Opus-class) 20, frontier (Fable-class) 40; an unrecognised model bills at the frontier rate. An unsupported value returns a 400 listing what the platform accepts." - added
Input schema / properties / search_cityAdded value: +{ + "description": "City to search from, e.g. \"Wichita\". Grounds the search where the customer actually is, which is usually the point for local work. Accepted on chat_gpt and claude only.", + "maxLength": 100, + "type": "string" +} - added
Input schema / properties / search_countryAdded value: +{ + "description": "ISO 3166-1 alpha-2 country to search from, e.g. \"US\". Accepted on chat_gpt, claude and perplexity; not on gemini.", + "maxLength": 2, + "minLength": 2, + "type": "string" +} - added
Input schema / properties / web_searchAdded value: +{ + "description": "Let the model search the web before answering, so it can cite sources. Strongly recommended when asking about a real business — without it models answer from training data and can assert an open business has closed. Not accepted on perplexity, which always searches. Raises the price to the measured cost of searching: 24 credits chat_gpt, 27 gemini, 40 claude.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "fan_out_queries": { + "items": { + "type": "string" + }, + "type": "array" + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "platform": { + "type": "string" + }, + "prompt": { + "type": "string" + }, + "response_text": { + "type": "string" + }, + "sources": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "position": { + "type": "number" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "title", + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "web_search_used": { + "default": false, + "type": "boolean" + } + }, + "required": [ + "platform", + "prompt", + "response_text", + "model", + "sources", + "fan_out_queries" + ], + "type": "object" +}
- Added
ai_match - Changed
ai_mentions2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "language": { + "type": "string" + }, + "location_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + }, + "location_used": { + "type": "string" + }, + "mentions": { + "items": { + "additionalProperties": true, + "properties": { + "answer_snippet": { + "type": "string" + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "platform": { + "type": "string" + }, + "question": { + "type": "string" + }, + "sources_cited": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "question", + "answer_snippet", + "sources_cited", + "platform", + "date" + ], + "type": "object" + }, + "type": "array" + }, + "platforms_available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_mentions": { + "type": "number" + } + }, + "required": [ + "ai_search_volume", + "total_mentions", + "mentions" + ], + "type": "object" +}
- Changed
ai_mode2 fields changed- added
Input schema / properties / freshAdded value: +{ + "description": "Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ai_response": { + "type": [ + "string", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "local_businesses": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "category": { + "type": "string" + }, + "cid": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "rank", + "name", + "category", + "rating", + "reviews_count", + "address", + "phone", + "website", + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "parse_status": { + "enum": [ + "ok", + "no_businesses", + "unparsed" + ], + "type": "string" + }, + "references": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "position": { + "type": "number" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url", + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "shopping_items": { + "items": {}, + "type": "array" + } + }, + "required": [ + "ai_response", + "references", + "shopping_items", + "keyword", + "location" + ], + "type": "object" +}
- Changed
ai_overview2 fields changed- added
Input schema / properties / freshAdded value: +{ + "description": "Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "asynchronous_ai_overview": { + "default": false, + "type": "boolean" + }, + "cited_sources": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "position": { + "type": "number" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url", + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "has_ai_overview": { + "type": "boolean" + }, + "keyword": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "summary_text": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "has_ai_overview", + "summary_text", + "cited_sources", + "keyword", + "location" + ], + "type": "object" +}
- Added
ai_sample - Added
ai_sample_status - Changed
ai_scraper5 fields changed- added
Input schema / properties / force_web_searchAdded value: +{ + "description": "Require the platform to search the web before answering. chat_gpt only; gemini returns a 400. Does not change the price. Reach for it when a local prompt comes back as a clarifying question rather than an answer.", + "type": "boolean" +} - added
Input schema / properties / freshAdded value: +{ + "description": "Bypass the hour of caching and run the query again. Use when sampling the same prompt repeatedly to measure how the answer varies — a cached hit would return the earlier run and hide the variance. Always billed at the normal price, since there is no cache hit to be free.", + "type": "boolean" +} - added
Input schema / properties / languageAdded value: +{ + "description": "Language to ask in, as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to the language of the market you pass — a French location is asked in French. This tool queries the model live and covers 43 languages worldwide, so this is not limited the way the AI mention endpoints are.", + "type": "string" +} - changed
Input schema / properties / location / descriptionPrevious value: -"Location for results (e.g. \"Boston, MA\"). Default: US"New value: +"Location for results (e.g. \"Boston, MA\"). Gemini supports city-level; ChatGPT resolves to country. Default: US" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "brand_entities": { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title", + "category" + ], + "type": "object" + }, + "type": "array" + }, + "fan_out_queries": { + "items": { + "type": "string" + }, + "type": "array" + }, + "keyword": { + "type": "string" + }, + "local_businesses": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "category": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "rank", + "name", + "category", + "rating", + "reviews_count", + "address", + "phone", + "website", + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "markdown": { + "type": "string" + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "platform": { + "type": "string" + }, + "reader_version": { + "type": "number" + }, + "recommended_businesses": { + "items": { + "additionalProperties": true, + "properties": { + "citation": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "domain" + ], + "type": "object" + }, + "is_top_pick": { + "type": "boolean" + }, + "listed": { + "type": "boolean" + }, + "mention": { + "type": "string" + }, + "name": { + "type": "string" + }, + "shortlist_rank": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "shortlist_rank", + "name", + "is_top_pick", + "citation" + ], + "type": "object" + }, + "type": "array" + }, + "search_results": { + "items": { + "additionalProperties": true, + "properties": { + "description": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url", + "domain", + "description" + ], + "type": "object" + }, + "type": "array" + }, + "sources": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "position": { + "type": "number" + }, + "snippet": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url", + "domain", + "snippet" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "keyword", + "platform", + "model", + "markdown", + "search_results", + "sources", + "fan_out_queries", + "brand_entities" + ], + "type": "object" +}
- Changed
ai_top_pages2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keyword": { + "type": "string" + }, + "language": { + "type": "string" + }, + "location_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + }, + "location_used": { + "type": "string" + }, + "platforms_available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "top_pages": { + "items": { + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "mentions": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "url", + "domain", + "mentions", + "ai_search_volume" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "keyword", + "top_pages" + ], + "type": "object" +}
- Changed
ai_top_sources2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keyword": { + "type": "string" + }, + "language": { + "type": "string" + }, + "location_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + }, + "location_used": { + "type": "string" + }, + "platforms_available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "top_domains": { + "items": { + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "mentions": { + "type": "number" + } + }, + "required": [ + "domain", + "mentions", + "ai_search_volume" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "keyword", + "top_domains" + ], + "type": "object" +}
- Changed
ai_visibility2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Defaults to English wherever we hold English AI data for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "language": { + "type": "string" + }, + "location_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + }, + "location_used": { + "type": "string" + }, + "platform_breakdown": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "ai_search_volume": { + "type": "number" + }, + "impressions": { + "type": "number" + }, + "mentions": { + "type": "number" + } + }, + "required": [ + "mentions", + "ai_search_volume", + "impressions" + ], + "type": "object" + }, + "type": "object" + }, + "platforms_available": { + "items": { + "type": "string" + }, + "type": "array" + }, + "top_sources": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "impressions": { + "type": "number" + }, + "mentions": { + "type": "number" + } + }, + "required": [ + "domain", + "mentions", + "impressions" + ], + "type": "object" + }, + "type": "array" + }, + "total_impressions": { + "type": "number" + }, + "total_mentions": { + "type": "number" + } + }, + "required": [ + "domain", + "total_mentions", + "total_impressions", + "ai_search_volume", + "platform_breakdown", + "top_sources" + ], + "type": "object" +}
- Added
apple_business_profile - Added
apple_maps - Changed
backlink_gap1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "opportunities": { + "items": { + "additionalProperties": true, + "properties": { + "domain_authority": { + "type": "number" + }, + "links_to_competitors": { + "items": { + "additionalProperties": true, + "properties": { + "backlinks": { + "type": "number" + }, + "domain": { + "type": "string" + } + }, + "required": [ + "domain", + "backlinks" + ], + "type": "object" + }, + "type": "array" + }, + "links_to_you": { + "const": false, + "type": "boolean" + }, + "referring_domain": { + "type": "string" + } + }, + "required": [ + "referring_domain", + "domain_authority", + "links_to_competitors", + "links_to_you" + ], + "type": "object" + }, + "type": "array" + }, + "total_opportunities": { + "type": "number" + }, + "your_domain": { + "type": "string" + } + }, + "required": [ + "your_domain", + "opportunities", + "total_opportunities" + ], + "type": "object" +}
- Changed
backlink_summary1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "backlinks_by_type": { + "additionalProperties": true, + "properties": { + "anchor": { + "type": "number" + }, + "image": { + "type": "number" + }, + "redirect": { + "type": "number" + } + }, + "required": [ + "anchor", + "image", + "redirect" + ], + "type": "object" + }, + "backlinks_total": { + "type": "number" + }, + "broken_backlinks": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "referring_domains": { + "type": "number" + }, + "referring_domains_nofollow": { + "type": "number" + }, + "spam_score": { + "type": "number" + } + }, + "required": [ + "domain", + "rank", + "backlinks_total", + "referring_domains", + "referring_domains_nofollow", + "broken_backlinks", + "spam_score", + "backlinks_by_type" + ], + "type": "object" +}
- Added
bing_business_profile - Added
bing_local - Changed
brand_mentions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "mentions": { + "items": { + "additionalProperties": true, + "properties": { + "date": { + "type": [ + "string", + "null" + ] + }, + "domain": { + "type": "string" + }, + "domain_authority": { + "type": [ + "number", + "null" + ] + }, + "sentiment": { + "enum": [ + "positive", + "neutral", + "negative" + ], + "type": "string" + }, + "snippet": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "title", + "url", + "domain", + "domain_authority", + "sentiment", + "snippet", + "date" + ], + "type": "object" + }, + "type": "array" + }, + "sentiment_breakdown": { + "additionalProperties": true, + "properties": { + "negative": { + "type": "number" + }, + "neutral": { + "type": "number" + }, + "positive": { + "type": "number" + } + }, + "required": [ + "positive", + "neutral", + "negative" + ], + "type": "object" + }, + "total_mentions": { + "type": "number" + } + }, + "required": [ + "total_mentions", + "sentiment_breakdown", + "mentions" + ], + "type": "object" +}
- Changed
business_listings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "businesses": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cid": { + "type": "string" + }, + "city": { + "type": "string" + }, + "latitude": { + "type": [ + "number", + "null" + ] + }, + "longitude": { + "type": [ + "number", + "null" + ] + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "place_id": { + "type": "string" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "name", + "rating", + "reviews_count", + "address", + "phone", + "place_id", + "categories" + ], + "type": "object" + }, + "type": "array" + }, + "category": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_used": { + "type": "string" + }, + "search_radius_km": { + "type": "number" + }, + "total_available": { + "type": "number" + } + }, + "required": [ + "businesses", + "total_available" + ], + "type": "object" +}
- Changed
business_profile1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "attributes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cid": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hours": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "matched": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "photos_count": { + "type": "number" + }, + "place_id": { + "type": "string" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "suggestions": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "place_id": { + "type": "string" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "name", + "address", + "rating", + "reviews_count", + "place_id", + "phone", + "categories" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "verified": { + "type": "boolean" + }, + "website": { + "type": "string" + } + }, + "required": [ + "name", + "address", + "phone", + "website", + "categories", + "photos_count", + "rating", + "reviews_count", + "description", + "attributes", + "cid", + "place_id", + "verified" + ], + "type": "object" +}
- Changed
citation_audit2 fields changed- added
Input schema / properties / directoriesAdded value: +{ + "anyOf": [ + { + "maximum": 50, + "minimum": 1, + "type": "integer" + }, + { + "items": { + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + } + ], + "description": "How much to scan, at 2.5 credits per directory. A number takes the top N of 50 (default 20 = 50 credits; 50 = 125 credits), or pass exact directory names e.g. [\"yelp\", \"bbb\", \"houzz\"]" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "consistency_score": { + "type": [ + "number", + "null" + ] + }, + "consistent": { + "type": "number" + }, + "details": { + "items": { + "additionalProperties": true, + "properties": { + "address_match": { + "type": [ + "boolean", + "null" + ] + }, + "directory": { + "type": "string" + }, + "expected_address": { + "type": "string" + }, + "expected_phone": { + "type": "string" + }, + "name_match": { + "type": [ + "boolean", + "null" + ] + }, + "phone_match": { + "type": [ + "boolean", + "null" + ] + }, + "status": { + "enum": [ + "consistent", + "inconsistent", + "unverified", + "not_found" + ], + "type": "string" + } + }, + "required": [ + "directory", + "status", + "name_match", + "address_match", + "phone_match" + ], + "type": "object" + }, + "type": "array" + }, + "directories_checked": { + "type": "number" + }, + "found": { + "type": "number" + }, + "inconsistent": { + "type": "number" + }, + "not_found": { + "type": "number" + }, + "unverified": { + "type": "number" + } + }, + "required": [ + "consistency_score", + "directories_checked", + "consistent", + "inconsistent", + "not_found", + "details" + ], + "type": "object" +}
- Changed
competitor_ads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ads": { + "items": { + "additionalProperties": true, + "properties": { + "advertiser_id": { + "type": [ + "string", + "null" + ] + }, + "advertiser_name": { + "type": "string" + }, + "creative_id": { + "type": [ + "string", + "null" + ] + }, + "first_shown": { + "type": [ + "string", + "null" + ] + }, + "format": { + "type": "string" + }, + "last_shown": { + "type": [ + "string", + "null" + ] + }, + "preview_image_url": { + "type": [ + "string", + "null" + ] + }, + "preview_url": { + "type": [ + "string", + "null" + ] + }, + "transparency_url": { + "type": [ + "string", + "null" + ] + }, + "verified": { + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "format", + "first_shown", + "last_shown" + ], + "type": "object" + }, + "type": "array" + }, + "advertiser": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "total_ads": { + "type": "number" + }, + "total_available": { + "type": "number" + } + }, + "required": [ + "advertiser", + "total_ads", + "ads" + ], + "type": "object" +}
- Changed
competitor_gap1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "competitors": { + "items": { + "additionalProperties": true, + "properties": { + "advantages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "profile_completeness": { + "type": [ + "number", + "null" + ] + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "name", + "rank", + "rating", + "reviews_count", + "profile_completeness", + "advantages" + ], + "type": "object" + }, + "type": "array" + }, + "your_business": { + "additionalProperties": true, + "properties": { + "name": { + "type": "string" + }, + "profile_completeness": { + "type": [ + "number", + "null" + ] + }, + "rank": { + "type": [ + "number", + "null" + ] + }, + "rating": { + "type": "number" + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "name", + "rank", + "rating", + "reviews_count", + "profile_completeness" + ], + "type": "object" + }, + "your_gaps": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "your_business", + "competitors", + "your_gaps" + ], + "type": "object" +}
- Changed
geogrid_scan8 fields changed- changed
Input schema / properties / business / descriptionPrevious value: -"Business name to track"New value: +"Business name to track. Required unless place_id is given." - added
Input schema / properties / centerAdded value: +{ + "additionalProperties": false, + "description": "Exact grid center. Use the business's own coordinates to track it over time; overrides location.", + "properties": { + "lat": { + "type": "number" + }, + "lng": { + "type": "number" + } + }, + "required": [ + "lat", + "lng" + ], + "type": "object" +} - changed
Input schema / properties / grid_size / descriptionPrevious value: -"Grid dimensions. Default: 5x5"New value: +"Grid dimensions. Default: 5x5. Larger grids cost more (2 cr per point)." - changed
Input schema / properties / grid_size / enumPrevious value: -[ - "5x5", - "7x7", - "9x9" -]New value: +[ + "3x3", + "5x5", + "7x7", + "9x9" +] - added
Input schema / properties / include_listingsAdded value: +{ + "description": "Also return the top 20 organic listings at every point. Default: false. Same price; larger response.", + "type": "boolean" +} - changed
Input schema / properties / location / descriptionPrevious value: -"Center location for the grid"New value: +"Center location for the grid, e.g. \"Buffalo, NY\". Required unless center is given." - added
Input schema / properties / zoomAdded value: +{ + "anyOf": [ + { + "const": "auto", + "type": "string" + }, + { + "maximum": 21, + "minimum": 3, + "type": "integer" + } + ], + "description": "Maps zoom each point searches at. Default: auto (14). Fix it only to match an existing series." +} - changed
Input schema / requiredPrevious value: -[ - "business", - "location", - "keyword" -]New value: +[ + "keyword" +]
- Added
geogrid_status - Changed
get_balance2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "balance": { + "type": "number" + }, + "monthly_balance": { + "type": "number" + }, + "plan": { + "additionalProperties": true, + "properties": { + "credits_per_month": { + "type": "number" + }, + "current_period_end": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "credits_per_month", + "current_period_end" + ], + "type": "object" + }, + "wallet_balance": { + "type": "number" + } + }, + "required": [ + "balance", + "plan" + ], + "type": "object" +}
- Changed
google_reviews3 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Review language as ISO 639-1 code or name (e.g. \"fr\", \"French\"). Default \"en\" machine-translates non-English reviews — pass the market's language to get original review text.", + "type": "string" +} - added
Input schema / properties / place_idAdded value: +{ + "description": "Google Place ID for exact match (recommended for multi-location brands)", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "average_rating": { + "type": [ + "number", + "null" + ] + }, + "reviews": { + "items": { + "additionalProperties": true, + "properties": { + "author_name": { + "type": "string" + }, + "author_url": { + "type": "string" + }, + "date": { + "type": "string" + }, + "owner_reply": { + "type": [ + "string", + "null" + ] + }, + "owner_reply_date": { + "type": [ + "string", + "null" + ] + }, + "rating": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "rating", + "date", + "author_name", + "author_url", + "owner_reply", + "owner_reply_date" + ], + "type": "object" + }, + "type": "array" + }, + "total_reviews": { + "type": "number" + } + }, + "required": [ + "reviews", + "total_reviews", + "average_rating" + ], + "type": "object" +}
- Added
history_get - Added
history_search - Changed
keyword_opportunities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keywords": { + "items": { + "additionalProperties": true, + "properties": { + "competitor_rank": { + "type": [ + "number", + "null" + ] + }, + "estimated_difficulty": { + "type": "number" + }, + "keyword": { + "type": "string" + }, + "search_volume": { + "type": "number" + }, + "top_competitor": { + "type": [ + "string", + "null" + ] + }, + "your_rank": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "keyword", + "estimated_difficulty", + "your_rank", + "search_volume", + "top_competitor", + "competitor_rank" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "keywords" + ], + "type": "object" +}
- Added
keyword_overview - Changed
keyword_suggestions2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"fr-FR\", \"French\"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data_source": { + "type": "string" + }, + "language": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "seed_keyword": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "cpc": { + "type": [ + "number", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "keyword_difficulty": { + "type": [ + "number", + "null" + ] + }, + "search_volume": { + "type": [ + "number", + "null" + ] + }, + "serp_features": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "keyword", + "search_volume", + "keyword_difficulty", + "cpc", + "serp_features" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "suggestions": { + "items": { + "additionalProperties": true, + "properties": { + "cpc": { + "type": [ + "number", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "keyword_difficulty": { + "type": [ + "number", + "null" + ] + }, + "search_volume": { + "type": [ + "number", + "null" + ] + }, + "serp_features": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "keyword", + "search_volume", + "keyword_difficulty", + "cpc", + "serp_features" + ], + "type": "object" + }, + "type": "array" + }, + "total_count": { + "type": "number" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "seed_keyword", + "suggestions", + "total_count", + "location" + ], + "type": "object" +}
- Changed
keyword_trends1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data_source": { + "type": "string" + }, + "keywords": { + "items": { + "type": "string" + }, + "type": "array" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "period": { + "type": "string" + }, + "total_count": { + "type": "number" + }, + "trends": { + "items": { + "additionalProperties": true, + "properties": { + "data_points": { + "items": { + "additionalProperties": true, + "properties": { + "date": { + "type": "string" + }, + "interest": { + "type": "number" + }, + "month": { + "type": "string" + } + }, + "required": [ + "month", + "interest" + ], + "type": "object" + }, + "type": "array" + }, + "granularity": { + "enum": [ + "daily", + "weekly", + "monthly", + "unknown" + ], + "type": "string" + }, + "has_data": { + "type": "boolean" + }, + "keyword": { + "type": "string" + }, + "partial_period_excluded": { + "type": [ + "string", + "null" + ] + }, + "peak_month": { + "type": [ + "string", + "null" + ] + }, + "trend_direction": { + "enum": [ + "rising", + "declining", + "stable" + ], + "type": "string" + } + }, + "required": [ + "keyword", + "data_points", + "peak_month", + "trend_direction" + ], + "type": "object" + }, + "type": "array" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "trends", + "total_count", + "keywords", + "location", + "period" + ], + "type": "object" +}
- Changed
keywords_for_site2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"fr-FR\", \"French\"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data_source": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "keywords": { + "items": { + "additionalProperties": true, + "properties": { + "competition": { + "type": [ + "number", + "null" + ] + }, + "cpc": { + "type": [ + "number", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "search_volume": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "keyword", + "search_volume", + "cpc", + "competition" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "total_count": { + "type": "number" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "keywords", + "total_count", + "domain", + "location" + ], + "type": "object" +}
- Changed
local_authority1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "authority_score": { + "type": "number" + }, + "breakdown": { + "additionalProperties": true, + "properties": { + "citations": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "max": { + "const": 20, + "type": "number" + }, + "score": { + "type": "number" + } + }, + "required": [ + "score", + "max", + "detail" + ], + "type": "object" + }, + "profile": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "max": { + "const": 25, + "type": "number" + }, + "score": { + "type": "number" + } + }, + "required": [ + "score", + "max", + "detail" + ], + "type": "object" + }, + "ranking": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "max": { + "const": 25, + "type": "number" + }, + "score": { + "type": "number" + } + }, + "required": [ + "score", + "max", + "detail" + ], + "type": "object" + }, + "reviews": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "max": { + "const": 30, + "type": "number" + }, + "score": { + "type": "number" + } + }, + "required": [ + "score", + "max", + "detail" + ], + "type": "object" + } + }, + "required": [ + "ranking", + "reviews", + "profile", + "citations" + ], + "type": "object" + }, + "percentile": { + "type": "string" + } + }, + "required": [ + "authority_score", + "breakdown", + "percentile" + ], + "type": "object" +}
- Changed
local_finder1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keyword": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "cid": { + "type": "string" + }, + "hours": {}, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "rank", + "name", + "rating", + "reviews_count", + "address", + "phone", + "website", + "cid" + ], + "type": "object" + }, + "type": "array" + }, + "total_results": { + "type": "number" + } + }, + "required": [ + "results", + "total_results", + "keyword", + "location" + ], + "type": "object" +}
- Changed
local_pack1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "keyword": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "cid": { + "type": "string" + }, + "hours": {}, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "rank", + "name", + "cid", + "rating", + "reviews_count", + "address", + "phone", + "website" + ], + "type": "object" + }, + "type": "array" + }, + "total_results": { + "type": "number" + } + }, + "required": [ + "results", + "total_results", + "keyword", + "location" + ], + "type": "object" +}
- Changed
local_services_ads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ads": { + "items": { + "additionalProperties": true, + "properties": { + "badge": { + "type": [ + "string", + "null" + ] + }, + "business_name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "services": { + "items": { + "type": "string" + }, + "type": "array" + }, + "years_in_business": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "rank", + "business_name", + "rating", + "reviews_count", + "badge", + "years_in_business", + "phone", + "services" + ], + "type": "object" + }, + "type": "array" + }, + "device_used": { + "enum": [ + "desktop", + "mobile" + ], + "type": "string" + }, + "keyword": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "lsa_block_found": { + "type": "boolean" + }, + "total_ads": { + "type": "number" + } + }, + "required": [ + "ads", + "total_ads", + "keyword", + "location" + ], + "type": "object" +}
- Changed
location_search4 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "Country filter (e.g. \"United States\" or \"US\")", + "type": "string" +} - changed
Input schema / properties / q / descriptionPrevious value: -"Location query (e.g. \"Orchard Park\" or \"Austin TX\")"New value: +"Place name (e.g. \"Cherry Hill\" or \"Austin, TX\"). Prefer a bare name + state param over baking the state into q." - added
Input schema / properties / stateAdded value: +{ + "description": "State/province filter, name or abbreviation (e.g. \"NJ\"). Scopes matching without hiding suffixed entities like townships.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "locations": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "country": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent_code": { + "type": [ + "number", + "null" + ] + }, + "state": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type", + "country", + "state" + ], + "type": "object" + }, + "type": "array" + }, + "total_count": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "locations" + ], + "type": "object" +}
- Changed
maps1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "geo_fallback_applied": { + "type": "boolean" + }, + "keyword": { + "type": "string" + }, + "keyword_used": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_resolved": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "address": { + "type": "string" + }, + "categories": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hours": {}, + "latitude": { + "type": [ + "number", + "null" + ] + }, + "longitude": { + "type": [ + "number", + "null" + ] + }, + "name": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "place_id": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + }, + "website": { + "type": "string" + } + }, + "required": [ + "rank", + "name", + "place_id", + "rating", + "reviews_count", + "address", + "phone", + "website", + "latitude", + "longitude", + "categories" + ], + "type": "object" + }, + "type": "array" + }, + "sponsored_results": { + "items": { + "additionalProperties": true, + "properties": { + "name": { + "type": "string" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "name", + "rating", + "reviews_count" + ], + "type": "object" + }, + "type": "array" + }, + "total_results": { + "type": "number" + } + }, + "required": [ + "results", + "total_results", + "keyword", + "location" + ], + "type": "object" +}
- Changed
multi_platform_reviews2 fields changed- added
Input schema / properties / place_idAdded value: +{ + "description": "Google Place ID for exact match (recommended for multi-location brands)", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "combined_rating": { + "type": "number" + }, + "platforms": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "rating": { + "type": "number" + }, + "recent_trend": { + "type": "string" + } + }, + "required": [ + "rating", + "count", + "recent_trend" + ], + "type": "object" + }, + "type": "object" + }, + "total_reviews": { + "type": "number" + } + }, + "required": [ + "platforms", + "combined_rating", + "total_reviews" + ], + "type": "object" +}
- Changed
organic_serp1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ads": { + "items": { + "additionalProperties": true, + "properties": { + "description": { + "type": "string" + }, + "position": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "position", + "title", + "url", + "description" + ], + "type": "object" + }, + "type": "array" + }, + "ai_overview": { + "type": [ + "string", + "null" + ] + }, + "knowledge_panel": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "description": { + "type": "string" + }, + "image_url": { + "type": [ + "string", + "null" + ] + }, + "subtitle": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "title", + "subtitle", + "description", + "url", + "image_url" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "local_pack": { + "items": { + "additionalProperties": true, + "properties": { + "cid": { + "type": "string" + }, + "name": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "rank", + "name", + "cid", + "rating", + "reviews_count" + ], + "type": "object" + }, + "type": "array" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "lsa_ads": { + "items": { + "additionalProperties": true, + "properties": { + "business_name": { + "type": "string" + }, + "rank": { + "type": "number" + }, + "rating": { + "type": [ + "number", + "null" + ] + }, + "reviews_count": { + "type": "number" + } + }, + "required": [ + "rank", + "business_name", + "rating", + "reviews_count" + ], + "type": "object" + }, + "type": "array" + }, + "organic_results": { + "items": { + "additionalProperties": true, + "properties": { + "organic_position": { + "type": "number" + }, + "rank": { + "type": "number" + }, + "snippet": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "rank", + "title", + "url", + "snippet" + ], + "type": "object" + }, + "type": "array" + }, + "people_also_ask": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "organic_results", + "local_pack", + "ads", + "people_also_ask", + "ai_overview", + "lsa_ads", + "knowledge_panel" + ], + "type": "object" +}
- Changed
page_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "body_text_unreadable": { + "type": "boolean" + }, + "core_web_vitals": { + "additionalProperties": true, + "properties": { + "cls": { + "type": [ + "number", + "null" + ] + }, + "inp": { + "type": [ + "number", + "null" + ] + }, + "lcp": { + "type": [ + "number", + "null" + ] + }, + "note": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": [ + "lcp", + "cls" + ], + "type": "object" + }, + "h1": { + "items": { + "type": "string" + }, + "type": "array" + }, + "issues": { + "items": { + "additionalProperties": true, + "properties": { + "issue": { + "type": "string" + }, + "severity": { + "enum": [ + "critical", + "warning", + "info" + ], + "type": "string" + } + }, + "required": [ + "severity", + "issue" + ], + "type": "object" + }, + "type": "array" + }, + "load_time_ms": { + "type": "number" + }, + "meta_description": { + "type": "string" + }, + "mobile_friendly": { + "type": "boolean" + }, + "schema_markup": { + "items": { + "type": "string" + }, + "type": "array" + }, + "seo_score": { + "type": "number" + }, + "title": { + "type": "string" + }, + "word_count": { + "type": "number" + } + }, + "required": [ + "seo_score", + "title", + "meta_description", + "h1", + "word_count", + "load_time_ms", + "core_web_vitals", + "issues", + "schema_markup", + "mobile_friendly" + ], + "type": "object" +}
- Changed
ping1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
profile_health1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "completeness_score": { + "type": "number" + }, + "incomplete_fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "missing_fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "photos_count": { + "type": "number" + }, + "posts_last_30d": { + "type": "number" + }, + "qa_count": { + "type": "number" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "verified": { + "type": "boolean" + } + }, + "required": [ + "completeness_score", + "verified", + "photos_count", + "qa_count", + "posts_last_30d", + "missing_fields", + "incomplete_fields", + "recommendations" + ], + "type": "object" +}
- Changed
qa1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "questions": { + "items": { + "additionalProperties": true, + "properties": { + "answers": { + "items": { + "additionalProperties": true, + "properties": { + "author": { + "type": "string" + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": "string" + }, + "time_ago": { + "type": [ + "string", + "null" + ] + }, + "upvotes": { + "type": "number" + } + }, + "required": [ + "text", + "author", + "date", + "upvotes" + ], + "type": "object" + }, + "type": "array" + }, + "asked_by": { + "type": "string" + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "question_text": { + "type": "string" + }, + "time_ago": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "question_text", + "asked_by", + "date", + "answers" + ], + "type": "object" + }, + "type": "array" + }, + "total_questions": { + "type": "number" + } + }, + "required": [ + "questions", + "total_questions" + ], + "type": "object" +}
- Changed
related_keywords2 fields changed- added
Input schema / properties / languageAdded value: +{ + "description": "Language as ISO 639-1 code or name (e.g. \"fr\", \"fr-FR\", \"French\"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data_source": { + "type": "string" + }, + "keywords": { + "items": { + "additionalProperties": true, + "properties": { + "competition": { + "type": [ + "number", + "null" + ] + }, + "competition_level": { + "type": [ + "string", + "null" + ] + }, + "cpc": { + "type": [ + "number", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "search_volume": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "keyword", + "search_volume", + "cpc", + "competition" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "seed_keywords": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_count": { + "type": "number" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "keywords", + "total_count", + "seed_keywords", + "location" + ], + "type": "object" +}
- Changed
reputation_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "platforms": { + "additionalProperties": true, + "properties": { + "google": { + "additionalProperties": true, + "properties": { + "count": { + "type": "number" + }, + "rating": { + "type": "number" + }, + "trend": { + "type": "string" + } + }, + "required": [ + "rating", + "count", + "trend" + ], + "type": "object" + } + }, + "required": [ + "google" + ], + "type": "object" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "reputation_score": { + "type": "number" + }, + "response_rate": { + "type": "number" + }, + "sentiment": { + "additionalProperties": true, + "properties": { + "negative": { + "items": { + "type": "string" + }, + "type": "array" + }, + "positive": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "positive", + "negative" + ], + "type": "object" + } + }, + "required": [ + "reputation_score", + "platforms", + "sentiment", + "response_rate", + "recommendations" + ], + "type": "object" +}
- Changed
review_velocity2 fields changed- added
Input schema / properties / place_idAdded value: +{ + "description": "Google Place ID for exact match (recommended for multi-location brands)", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "current_rating": { + "type": "number" + }, + "period_rating": { + "type": "number" + }, + "rating_trend": { + "enum": [ + "improving", + "declining", + "stable" + ], + "type": "string" + }, + "reply_rate": { + "type": "number" + }, + "review_count_by_month": { + "items": { + "additionalProperties": true, + "properties": { + "avg_rating": { + "type": "number" + }, + "count": { + "type": "number" + }, + "month": { + "type": "string" + } + }, + "required": [ + "month", + "count", + "avg_rating" + ], + "type": "object" + }, + "type": "array" + }, + "reviews_per_month": { + "type": "number" + }, + "sentiment_themes": { + "additionalProperties": true, + "properties": { + "negative": { + "items": { + "type": "string" + }, + "type": "array" + }, + "positive": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "positive", + "negative" + ], + "type": "object" + } + }, + "required": [ + "reviews_per_month", + "rating_trend", + "current_rating", + "period_rating", + "reply_rate", + "sentiment_themes", + "review_count_by_month" + ], + "type": "object" +}
- Changed
search_volume2 fields changed- changed
Input schema / properties / language / descriptionPrevious value: -"Language code. Default: \"en\""New value: +"Language as ISO 639-1 code or name (e.g. \"fr\", \"fr-FR\", \"French\"). Defaults to English wherever we hold an English database for that country, and to the largest database that country has otherwise." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "country_fallback_unavailable": { + "type": "string" + }, + "data_source": { + "enum": [ + "google_ads", + "labs" + ], + "type": "string" + }, + "keywords": { + "items": { + "additionalProperties": true, + "properties": { + "competition": { + "type": [ + "number", + "null" + ] + }, + "competition_level": { + "type": [ + "string", + "null" + ] + }, + "cpc": { + "type": [ + "number", + "null" + ] + }, + "keyword": { + "type": "string" + }, + "monthly_searches": { + "items": { + "additionalProperties": true, + "properties": { + "month": { + "type": [ + "number", + "null" + ] + }, + "search_volume": { + "type": [ + "number", + "null" + ] + }, + "year": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "year", + "month", + "search_volume" + ], + "type": "object" + }, + "type": "array" + }, + "search_volume": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "keyword", + "search_volume", + "cpc", + "competition", + "competition_level", + "monthly_searches" + ], + "type": "object" + }, + "type": "array" + }, + "language": { + "type": "string" + }, + "location": { + "type": "string" + }, + "location_alternatives": { + "items": { + "additionalProperties": true, + "properties": { + "code": { + "type": "number" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "code", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "location_used": { + "type": "string" + }, + "total_count": { + "type": "number" + }, + "volume_scope": { + "enum": [ + "local", + "country" + ], + "type": "string" + } + }, + "required": [ + "keywords", + "total_count", + "location", + "language" + ], + "type": "object" +}
42 tool updates
v0.1.0- First observed
ai_compare - First observed
ai_keyword_data - First observed
ai_llm_response - First observed
ai_mentions - First observed
ai_mode - First observed
ai_overview - First observed
ai_scraper - First observed
ai_top_pages - First observed
ai_top_sources - First observed
ai_visibility - First observed
backlink_gap - First observed
backlink_summary - First observed
brand_mentions - First observed
business_listings - First observed
business_profile - First observed
citation_audit - First observed
competitor_ads - First observed
competitor_gap - First observed
geogrid_scan - First observed
get_balance - First observed
google_reviews - First observed
keyword_opportunities - First observed
keyword_suggestions - First observed
keyword_trends - First observed
keywords_for_site - First observed
local_audit - First observed
local_authority - First observed
local_finder - First observed
local_pack - First observed
local_services_ads - First observed
location_search - First observed
maps - First observed
multi_platform_reviews - First observed
organic_serp - First observed
page_audit - First observed
ping - First observed
profile_health - First observed
qa - First observed
related_keywords - First observed
reputation_audit - First observed
review_velocity - First observed
search_volume
TDQS
Scored across 53 tools
The descriptions work hard to separate overlapping tools, but with 53 tools there are several clusters where boundaries blur: local_pack vs maps vs local_finder vs business_listings, and ai_overview vs ai_mode vs ai_scraper vs ai_llm_response vs ai_sample. Keyword tools (search_volume, keyword_overview, keyword_suggestions, related_keywords, keywords_for_site, keyword_trends) are distinguishable in principle but easy to misselect without careful reading.
Names are consistently lower-case snake_case, and useful prefix families (ai_, keyword_, backlink_, geogrid_, apple_, bing_) make related tools easy to scan. The convention is mostly noun-first with a few verb-first names like get_balance and history_get, so it is predictable but not a strict verb_noun pattern.
At 53 tools the surface is far above the typical 3-15 range and is heavy even for a broad local SEO data platform. Many tools represent distinct paid data products, but the set is large enough that agents must navigate substantial overlap and pricing tiers before choosing correctly.
Coverage is very broad: SERP/local pack, Apple/Bing profiles, GBP data, reviews, citations, audits, geogrid ranking, keywords, backlinks, competitor ads, and AI visibility all have dedicated tools. Obvious remaining gaps are mostly adjacent lifecycle features such as scheduled monitoring, alerts, or write actions, which this read-only data API does not appear to target.
Maintenance
Related MCP Connectors
AI visibility + fact-checks (ChatGPT/Perplexity), review gaps & competitor scans, local SEO.
Free SEO tools for AI agents: Google results from any location, plus rank, ad and AI visibility.
AI-search visibility: GEO audits, tracked prompts, competitors, citations.
Real Google and Google Maps SERPs for AI assistants: pixel positions, AI Overviews and sources.
Related MCP Servers
- -licenseNot gradedqualityCmaintenanceEnables AI assistants to perform comprehensive SEO and GEO measurements, including site audits, keyword research, ranking tracking, and brand visibility analysis across search engines and generative AI platforms.-
- AlicenseAqualityAmaintenanceEnables AI agents to diagnose and fix technical SEO, content, and generative engine optimization issues by providing 72 tools that integrate Google Search Console, Google Analytics 4, PageSpeed Insights, structured data, llms.txt, WordPress, and GitHub.7212 npm18MIT

georanker-seo-mcpofficial
AlicenseAqualityAmaintenanceEnables AI assistants to search Google SERPs, track rankings across locations, run Lighthouse SEO audits, find broken internal links, analyze backlinks, and get keyword volume data through a hosted service.15182 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables agents to analyze a business's Google Maps visibility, compare it with local competitors, and scan an area for prioritized improvement opportunities through SerpApi-backed tools.MIT