vantage-mcp
Vantage is an AI visibility MCP server that tells you whether AI answer engines (ChatGPT, Gemini, Perplexity, Google AI Overviews) cite your site — for which questions, who is cited instead, and how it's changing.
Check remaining quota (
get_usage): see units left this billing period before spending any (0 units).Find who wins a topic (
find_citation_leaders): top-cited domains for a keyword/platform, plus optional rank check for your domain.Track visibility over time (
analyze_citation_trend): month-by-month mention counts to see if a domain is growing or fading.See what a winning answer looks like (
analyze_citation_structure): list-led? opening length, outline, table, sources, source mix; supports multiple samples.Do that across a cluster (
analyze_citation_structure_batch): same shape analysis for up to 10 keywords in one call.Check if AI cites your site (
check_prompt_coverage): for up to 10 prompts, which cite a domain (and which don't), with cited vs. mentioned separated, brand matching, and change tracking.See what to change (
analyze_citation_gap): diffs your page against the winning AI-cited answer and returns an ordered fix_brief, including an off-site step.Find questions you're already cited for (
find_cited_questions): starts from your domain, returns most-asked questions AI cites it for.Review past checks (
get_check_history): read back your earlier coverage checks, newest first (0 units).
Across tools: every cited-domain response includes source_mix (community vs. other sites), and most tools accept country/language (default US/en) for non-US markets, with platform/engine selectable where supported.
Allows checking whether a domain is cited in Perplexity answers, analyzing citation leaders for a topic, and inspecting the citation structure of winning answers.
Vantage
Vantage is an AI visibility MCP server that checks whether ChatGPT, Gemini, Perplexity and Google AI Overviews cite your site.
Know if AI actually cites you: for which questions, who is cited instead, and whether that is changing. Call it directly from Claude Code, Cursor, or any MCP client. No dashboard to interpret, just a straight answer.
Try it without installing anything
vantagemcp.dev/check runs a real citation check with no account, no email and no card. Give it a keyword and it returns the measured shape of the answer ChatGPT actually cites for it: whether the answer opens with a list, how long the opening is, how many sources it cites, and which domains those are.
Every answer keeps a permanent page, and they are all listed in check/sitemap.xml.
Published on the Official MCP Registry under the domain-verified namespace dev.vantagemcp/vantage.
Not to be confused with: vantage.sh, a cloud cost-management company with its own, unrelated MCP server also named Vantage. Different product, same name.
Related MCP server: ai-visibility-mcp
Install
If your client supports MCP sign-in (OAuth), add https://vantagemcp.dev/mcp with no key and sign in: a free account from your email, or an existing key. Otherwise add to your MCP client config:
{
"mcpServers": {
"vantage": {
"url": "https://vantagemcp.dev/mcp",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}If your client only starts servers as a local command, use the npm package vantage-ai-visibility-mcp, which connects to the same hosted server:
{
"mcpServers": {
"vantage": {
"command": "npx",
"args": ["-y", "vantage-ai-visibility-mcp"],
"env": { "VANTAGE_API_KEY": "YOUR_API_KEY" }
}
}
}Try it first with no account at all at vantagemcp.dev/check, or get a free API key (30 quota units a month, no card required) at vantagemcp.dev.
Tools
get_usage
How much of this billing period's quota is left, before spending any of it. Costs 0 units - reads Vantage's own record, never calls the paid data provider.
"How many checks do I have left?"
find_cited_questions
Starts from your domain instead of a keyword: the questions where AI answers already cite it, most asked first. 10 units.
"What does ChatGPT already cite us for?"
check_prompt_coverage
Which of several prompts actually cite a specific domain, and which don't - up to 10 keywords in one call. ChatGPT, Gemini or Perplexity (engine), 1 unit per keyword per sample. Pass samples=3 to get "cited in 2 of 3 answers" instead of one yes or no. Each result is remembered for 180 days, so the next check reports what changed (previous, change, newly_cited).
Cited and named are reported separately. An answer can name your brand without linking you (mentioned_not_cited: the model already knows you, it just isn't citing you) or link a page it never names. Pass brand (e.g. "Notion") so the name check looks for your real brand instead of a guess from the domain.
"Out of everything we care about, where do we already show up?"
get_check_history
Your earlier check_prompt_coverage results for a domain, newest first. 0 units.
"Did our changes last week move anything?"
find_citation_leaders
Who dominates AI-answer citations for a topic, and whether a domain is among them.
"Who's winning AI search for this?"
analyze_citation_trend
Month-by-month mention counts for a domain, so you can see whether visibility is growing or fading.
"Is our AI visibility improving?"
analyze_citation_structure
How the winning AI answer for a topic is actually shaped: list-led, sources cited, opening length.
"What does a winning answer look like?"
analyze_citation_structure_batch
Same as analyze_citation_structure, across up to 10 related topics in one call, for content planning across a cluster.
"What do winning answers look like across this whole topic cluster?"
analyze_citation_gap
Diffs your own page's structure against the winning AI-cited answer for the same keyword and returns a fix_brief: ordered rewrite instructions your agent can carry out on the page (opening, sections, the answer's points your page does not cover, table, sources), ending with one step beyond the page: which community sites or other websites the answer relies on. The brief never contains the cited answer's text.
"What should I actually change on this page to get cited?"
Source mix
Every tool that returns cited domains also returns source_mix: how much of them are community sites (Reddit, YouTube, X, Quora and similar) and which. A high share means the topic is won by what people say about a brand elsewhere, not by any one site's pages.
Country and language
Every tool except get_usage takes optional country (e.g. "Italy") and language (e.g. "it"), default United States / en. Tools that read a live ChatGPT answer work in any supported market; find_citation_leaders and analyze_citation_trend only have ChatGPT data for the United States in English, so use platform: "google" for other countries.
Example
> agent calls find_citation_leaders(
keyword: "best mood tracker app",
platform: "chat_gpt"
)
< response
{
"keyword": "best mood tracker app",
"platform": "chat_gpt",
"top_domains": [
{ "domain": "www.reddit.com", "mentions": 59 },
{ "domain": "apps.apple.com", "mentions": 55 },
{ "domain": "en.wikipedia.org", "mentions": 49 },
{ "domain": "www.makeuseof.com", "mentions": 12 },
{ "domain": "play.google.com", "mentions": 11 }
]
}Running your own instance
This repo is the MCP server itself: API-key auth, usage metering, one tool per read (see Tools above). Billing and account provisioning are a separate internal service, not included here.
uv pip install -e .
export DATAFORSEO_USERNAME=...
export DATAFORSEO_PASSWORD=...
# stdio (local MCP client, e.g. Claude Desktop config pointing at this command)
python -m vantage_mcp.server
# streamable-http (network service, bind to loopback behind your own reverse proxy)
export VANTAGE_PORT=8420
python -m vantage_mcp.server --httpRequires a DataForSEO account for the underlying SERP/AI-answer data.
Star it
Useful? A star on GitHub helps others find it. Already starred? Tell us what brought you here: support@vantagemcp.dev.
License
MIT
Available Tools
9 toolsanalyze_citation_gapCompare your page with the cited answerARead-onlyIdempotentInspect
Compare your own page's structure against the AI-generated answer actually cited for this keyword, and return a fix brief: ordered rewrite instructions for your page, not just a description of the winner. Use this to answer 'what should I change on this page to get cited' rather than only 'what does a winning answer look like'. Carry out the fix_brief on the user's page in their own words; it never contains the cited answer's text.
Read-only: no side effects, safe to retry. Costs 1 quota unit/call (free tier is 30 units/month shared across every metered tool, so up to 30 calls to this tool alone if nothing else is used that period).
Returns: {"keyword", "your_url", "winning" (structure of the AI-cited answer, same shape as analyze_citation_structure), "yours" (same structure computed for your_url, including its own "outline" and "has_table", with "num_links_out"/"linked_domains" standing in for source count), "gaps" (list of plain-English differences worth acting on), "possibly_missing" (heads from the winning outline whose key words mostly do not appear on your page; word matching, so check each before adding it), "fix_brief" (list of instructions, most important first: opening, number, list, sections, missing points, table, sources, then a reminder to write in your own words - or a "no structural change indicated" line when every check already matches - and always last, one off-site step drawn from the winning answer's source_mix: which community sites (Reddit, YouTube, X...) it cites, or which other sites to get mentioned on. Page shape gets a page into the running; being cited is decided mostly by what other sites say about the brand)}, or {"error"} if either side couldn't be fetched/parsed.
Use analyze_citation_structure instead if you just want the winning answer's shape, not a comparison against your own page. Use check_prompt_coverage first if you have several keywords and do not yet know which ones you are missing from - this tool is for one keyword you already know needs work.
Args: keyword: the topic/query to check, e.g. "best project management tool". your_url: full URL of your own page to compare, e.g. "https://example.com/best-project-management-tools". country: market to read the cited answer in, e.g. "Italy". Defaults to "United States". language: language code, e.g. "it". Defaults to "en". engine: "chat_gpt" (default), "gemini" or "perplexity": whose answer to compare your page against.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | chat_gpt | |
| country | No | United States | |
| keyword | Yes | ||
| language | No | en | |
| your_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses cost (1 quota unit/call, 30/month shared free tier), confirms retry safety and no side effects, and adds a critical behavioral constraint that the fix_brief never contains the cited answer's text and must be rewritten in the user's own words. It also enumerates the return payload and the error case, which no structured field provides.
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 cost are front-loaded, and the dense returns block earns its space given there is no output schema. It is longer than ideal and the fix_brief field enumeration could be tightened, but almost every clause carries decision-relevant 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 tool with no output schema and 0% parameter coverage, the description supplies both: it documents the full return shape (winning, yours, gaps, possibly_missing, fix_brief) and the error variant, and explains the fix_brief ordering. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and does so: it defines each of the 5 params with examples and defaults, and supplies the engine's value set ('chat_gpt', 'gemini', 'perplexity') plus country/language examples that the schema lacks entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: comparing the user's own page structure against the AI-cited answer for a keyword and returning an actionable fix brief. It explicitly differentiates from the sibling analyze_citation_structure ('Use analyze_citation_structure instead if you just want the winning answer's shape'), so an agent can route 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 explicit when-to-use framing ('what should I change on this page to get cited'), names two alternatives with their selecting conditions (analyze_citation_structure for the winner's shape; check_prompt_coverage first when several keywords and the missing ones are unknown). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_citation_structureAnalyze a winning AI answerARead-onlyIdempotentInspect
Analyze the structural shape of the AI-generated answer actually cited for a keyword: does it lead with a list, how long is the opening passage, how many sources does it cite and from which domains. Use this to understand what a winning AI-search answer looks like for a topic, e.g. before writing content meant to get cited.
Read-only: no side effects, safe to retry. Costs 1 quota unit per sample (1 by default; free tier is 30 units/month shared across every metered tool, so up to 30 single-sample calls to this tool alone if nothing else is used that period).
Returns: {"keyword", "engine", "model" (the answering model's version, as the provider reports it), "checked_at" (when the answer was fetched, UTC), "leads_with_list" (bool), "opening_word_count" (int), "opening_has_number" (bool), "outline" (list of up to 12 section heads, in order: the answer's headings, or its top-level list items when it has fewer than two headings; heads only, never the text under them), "has_table" (bool), "num_sources_cited" (int), "source_domains" (list of up to 10 domain strings), "source_mix" ({"community_pct" (share of those sources that are community sites such as Reddit, YouTube, X, Quora), "community_domains", "other_domains"}), "country", "language"}. With samples above 1 the shape fields describe the first answer, plus "samples_ok" (answers that came back) and "source_frequency" (list of {"domain", "runs"}: how many of the answers cited each domain, most often first). Answers change from run to run, so a domain cited in every sample is a far stronger signal than one sample.
Use analyze_citation_structure_batch instead if you need this for more than one keyword - one call per topic here adds up fast for a cluster. Use analyze_citation_gap instead if you have your own page for this keyword and want the gap to the winner, not just the winner's shape.
Args: keyword: the topic/query to analyze, e.g. "how to reduce churn". country: market to read the answer in, e.g. "Italy". Defaults to "United States". For perplexity a 2-letter code also works. language: language code, e.g. "it". Defaults to "en". Write the keyword in that language too. engine: "chat_gpt" (default), "gemini" or "perplexity". chat_gpt and gemini are the answers a person sees in those apps; perplexity is Perplexity's sonar API with web search. samples: how many independent answers to read, 1 to 5. Default 1.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | chat_gpt | |
| country | No | United States | |
| keyword | Yes | ||
| samples | No | ||
| language | No | en |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the metering model: 1 quota unit per sample, 30 units/month shared across all metered tools, and how that caps single-sample calls. It also warns that answers change run to run, so cross-sample domain frequency is a stronger signal than a single run — real behavioral context an agent cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and routing are front-loaded, and since there is no output schema the returns block is justified. It is nevertheless long and dense, with the quota explanation and the returns enumeration both sizeable for a 5-parameter read tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description documents the entire return shape (including conditional fields only present when samples > 1), plus cost, defaults, and the run-to-run variance caveat. Nothing an agent needs in order to call this 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 0%, so the description carries the full burden and does: it explains engine values with their real semantics (chat_gpt/gemini are in-app answers; perplexity is the sonar API with web search), gives examples for country and language, warns to write the keyword in the target language, and bounds samples at 1–5.
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 ('analyze the structural shape of the AI-generated answer actually cited for a keyword') and enumerates the exact dimensions measured (list-leading, opening length, source count/domains). It is clearly distinguishable from siblings like analyze_citation_gap and analyze_citation_structure_batch, which it names.
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 the agent: use the batch variant for more than one keyword, and analyze_citation_gap when you already have your own page and want the gap rather than the winner's shape. It also gives a concrete use case ('before writing content meant to get cited').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_citation_structure_batchAnalyze winning AI answers in bulkARead-onlyIdempotentInspect
Analyze the structural shape of the winning AI answer across several related keywords/topics in one call: does each lead with a list, how long is the opening, how many sources it cites. Use this for content planning across a topic cluster, e.g. before writing several related pieces meant to get cited, instead of calling analyze_citation_structure once per topic.
Read-only: no side effects, safe to retry. Costs 1 quota unit per keyword in the batch (free tier is 30 units/month shared across all the metered tools, so up to 30 keywords total that period if nothing else is used). A per-keyword provider error doesn't fail the whole batch - that keyword's entry just carries an "error" field instead.
Returns: {"results" (list, one {"keyword", ...same shape as analyze_citation_structure, or "error"} per keyword, in the order given), "summary": {"topics_analyzed", "topics_requested", "list_led_count", "avg_sources_cited", "avg_community_pct" (average source_mix.community_pct across the analyzed topics)}}.
Args: keywords: topics/queries to analyze, e.g. ["how to reduce churn", "churn rate benchmarks", "reduce customer churn saas"]. Max 10. country: market to read the answers in, e.g. "Italy". Defaults to "United States". language: language code, e.g. "it". Defaults to "en". engine: "chat_gpt" (default), "gemini" or "perplexity", as in analyze_citation_structure. One answer per topic.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | chat_gpt | |
| country | No | United States | |
| keywords | Yes | ||
| language | No | en |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description still adds real value beyond them: the quota cost (1 unit per keyword, 30/month shared across metered tools) and the partial-failure contract (a per-keyword provider error does not fail the whole batch). Those are meaningful operational disclosures not present in 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?
Well front-loaded: purpose and when-to-use come first, then safety/cost/failure semantics, then the return shape, then args. Slightly long, but nearly every sentence earns its place given the 0% schema coverage and absent 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?
For a 4-param batch tool with no output schema, the description supplies the return shape (results list with per-keyword error entries plus a summary object with named fields), the quota model, and the partial-failure semantics. Nothing an agent needs in order to call or interpret 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 0%, so the description carries the full burden and does so: keywords are documented with concrete examples and a hard max of 10, country and language are given with defaults, and engine enumerates the valid values ('chat_gpt' default, 'gemini', 'perplexity') plus the one-answer-per-topic behavior. This fully compensates for the empty 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 (analyze) and resource (structural shape of the winning AI answer) at batch scope, and explicitly contrasts itself with the single-topic sibling analyze_citation_structure. An agent can distinguish it from siblings like analyze_citation_gap or find_citation_leaders 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?
Gives an explicit when (content planning across a topic cluster, e.g. before writing several related pieces meant to get cited) and an explicit alternative with its selection rule ('instead of calling analyze_citation_structure once per topic'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_citation_trendTrack a site's AI citations over timeARead-onlyIdempotentInspect
Track how a domain's AI-citation count has moved month over month, so you can see whether visibility is growing or fading instead of only ever checking a single point in time. Use this to answer 'is our AI visibility improving' or 'did that content push actually move the needle'.
Read-only: no side effects, safe to retry. Costs 1 quota unit/call (free tier is 30 units/month shared across every metered tool, so up to 30 calls to this tool alone if nothing else is used that period).
Returns: {"domain", "platform", "months" (list of {"year", "month",
"mentions" (int, 0 for a month with no tracked citations. A zero
between two large months can be a gap in the provider's history rather
than a real drop, so read isolated zeros with care), "ai_search_volume"},
oldest to newest),
"trend": {"direction" ("up"/"down"/"flat"/"no_data"), "earliest_mentions",
"latest_mentions", "excluded_current_partial_month" (bool, only present
and true when the most recent calendar month was excluded from the trend
calculation because it is still in progress and its count is not yet
final - it is still returned inside months, just not compared)}}.
The most recent entry in months (or trend.latest_mentions when the
current month is not excluded) already IS the current count, so there is
no need for a separate call just to see it right now.
Args: domain: bare domain to check, e.g. "example.com" (no https://, no www). platform: "chat_gpt" or "google" (Google's AI Overview). Defaults to chat_gpt. Perplexity and Gemini aren't available - the underlying data provider doesn't cover them for this check. months: how many recent months of history to return. Defaults to 6, capped at 13 - DataForSEO's historical data only goes back to 2025-08-01. country: market to check, e.g. "Italy". Defaults to "United States". chat_gpt only has data for the United States; use platform "google" for any other country. language: language code, e.g. "it". Defaults to "en" (the only option for chat_gpt).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| months | No | ||
| country | No | United States | |
| language | No | en | |
| platform | No | chat_gpt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantially beyond that: cost (1 quota unit per call, 30 units/month shared across all metered tools), the zero-in-history caveat, and the partial-current-month exclusion behavior. This is exactly the kind of behavioral 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?
Front-loaded with purpose, then cost, then return shape, then args — a sensible ordering. The return-shape block is long, but it is justified because no output schema exists; the only minor drag is some repetition around the partial-month/latest-month explanation.
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, so the description carries the full return contract and does so, including the trend object's possible values and the presence-condition on excluded_current_partial_month. Combined with quota, platform limits, and history depth, an agent has everything needed to call and interpret 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?
With 0% schema description coverage, the description fully compensates: it documents all five parameters with formats ('example.com', no https:// or www), defaults, the 13-month cap with the reason (provider history starts 2025-08-01), and hard platform constraints (chat_gpt is US-only and en-only; use 'google' for other countries).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: tracking a domain's AI-citation count month over month. It explicitly contrasts itself with point-in-time checking ('instead of only ever checking a single point in time'), which cleanly separates it from siblings like analyze_citation_gap or find_citation_leaders.
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 concrete trigger questions ('is our AI visibility improving', 'did that content push actually move the needle') and a negative guideline: don't make a separate call just to read the current count, since the latest entry already is it. Context for when this beats a single-point check is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_prompt_coverageCheck if AI cites your siteARead-onlyIdempotentInspect
Check which of several prompts/keywords actually cite a specific domain, and which ones don't. This is usually the first real question in an AI-answer-engine audit - not "what does a winning answer look like" (analyze_citation_structure) or "who wins this one topic" (find_citation_leaders), but "out of everything we care about, where do we already show up, and where are we invisible." Use this first, then use analyze_citation_gap on whichever keywords come back not cited to see what to actually change.
Read-only for the caller, safe to retry. Costs 1 quota unit per keyword per sample (1 sample by default; free tier is 30 units/month shared across every metered tool, so up to 30 keyword checks that period if nothing else is used). A per-keyword provider error doesn't fail the whole call - that keyword's entry just carries an "error" field instead. On the hosted endpoint each keyword's result is remembered for 180 days against your API key, so the next check of the same domain and keyword reports what changed (see "previous" and "change"); get_check_history reads that record back for free.
Returns: {"domain", "engine", "samples", "keywords_checked" (int, excludes any that errored), "keywords_cited" (int), "coverage_pct" (float, 0-100), "not_cited" (list of the keyword strings where domain was not cited - the actionable list), "newly_cited" and "no_longer_cited" (keywords whose status flipped since your last check of them), "results" (one entry per keyword, in the order given: {"keyword", "cited" (bool: cited in at least half of the samples), "cited_runs" (how many sampled answers cited it), "samples_ok" (how many answers came back), "rank" (int|null, best 1-based position among the answers' sources, null when never cited), "num_sources_cited", "source_domains" (who IS cited, for a keyword you are not in), "source_mix" (how much of that is community sites such as Reddit, YouTube, X - where to get discussed to close the gap), "source_frequency" (only with samples above 1: {"domain", "runs"} per domain), "leads_with_list", "opening_word_count", "mentioned" (bool - the answer's text names the domain or brand in at least half of the samples, whether or not it links to it), "model", "checked_at", "previous" ({"checked_at", "cited_runs", "samples", "best_rank"} from your last check of this domain and keyword on the same engine and market, or null), "change" ("first_check", "up", "down" or "same", comparing citation rates)}, or {"keyword", "error"} for one that failed), "keywords_mentioned" (int), "mentioned_not_cited" (keywords where the answer names you but does not cite you - the model already knows you, it just isn't linking you), "mention_terms" (exactly what was looked for in the answer text)}. "Cited" and "mentioned" are separate claims and are never merged. Answers change from run to run: with samples=1 a single answer decides "cited", so use samples=3 before telling someone they are or are not cited.
Args: domain: bare domain to check, e.g. "example.com" (no https://, no www). keywords: prompts/topics to check it against, e.g. ["best project management software", "asana alternatives", "free project management tool"]. Max 10. brand: optional brand name to look for in the answer text, e.g. "Notion". Without it, the domain's first label is used ("notion" for notion.so), which can match an ordinary word by accident for a dictionary-word domain, so pass the real brand when known. country: market to read the answers in, e.g. "Italy". Defaults to "United States". language: language code, e.g. "it". Defaults to "en". Write the keywords in that language too. engine: "chat_gpt" (default), "gemini" or "perplexity", as in analyze_citation_structure. samples: independent answers to read per keyword, 1 to 5. Default 1.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | ||
| domain | Yes | ||
| engine | No | chat_gpt | |
| country | No | United States | |
| samples | No | ||
| keywords | Yes | ||
| language | No | en |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: states quota cost per keyword per sample with the free-tier budget (30 units/month), how per-keyword provider errors are isolated rather than failing the call, the 180-day server-side retention window and how get_check_history reads it back for free, and the critical caveat that samples=1 lets a single answer decide 'cited' so samples=3 is needed before telling someone they are or are not cited. Annotations only declare readOnly/idempotent, so this description carries and exceeds the full behavioral burden.
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 answer and the routing decision before the cost/behavioral detail, and each paragraph covers a distinct concern. It is long, but the length is earned by a 7-parameter, no-output-schema, no-schema-description tool. Slight density cost from the inline edge-case parentheticals.
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, so the description documents the full return shape (coverage_pct, not_cited, newly_cited/no_longer_cited, per-keyword fields including mentioned vs cited, previous/change, error entries) and even explains the cited/mentioned distinction that a caller could easily conflate. Complete for the tool's 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?
Schema description coverage is 0%, so the description must compensate, and it does for every parameter: domain format ('bare domain... no https://, no www'), keywords with examples and the max-10 limit, brand with the first-label fallback hazard for dictionary-word domains, country/language defaults plus the instruction to write keywords in that language, engine values, and samples range 1-5 with the reliability caveat. No parameter is left undocumented.
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 (check which prompts/keywords cite a domain) and explicitly distinguishes itself from three siblings: analyze_citation_structure ('what does a winning answer look like'), find_citation_leaders ('who wins this one topic'), and analyze_citation_gap (the follow-up for not-cited keywords). An agent can tell exactly what this tool answers 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?
Explicit when-to-use ('use this first'), explicit sequencing ('then use analyze_citation_gap on whichever keywords come back not cited'), and explicit exclusions naming sibling alternatives. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_citation_leadersFind who AI cites for a questionARead-onlyIdempotentInspect
Find which domains dominate AI-answer citations for a topic/keyword, and optionally check whether a specific domain shows up among them. Use this to answer 'who's winning AI search for this topic' or 'is my competitor cited more than me for X'.
Read-only: no side effects, safe to retry. Costs 10 quota units/call (free tier is 30 units/month shared across every metered tool, so up to 3 calls to this tool alone if nothing else is used that period).
Returns: {"keyword", "platform", "top_domains" (list of {"domain",
"mentions"}, most-cited domains for this keyword/platform, order as
ranked by the provider), "top_domains_limit" (int, the provider's own
cap on this list - absence from it is NOT evidence a domain has zero
citations, only that it did not rank in the top top_domains_limit),
"compare_domain_rank" (int|null, only present when compare_domain was
passed: the domain's 1-based position in top_domains, or null if it
did not rank in the top top_domains_limit), "country", "language",
"source_mix" ({"community_pct" (share of these mentions that go to
community sites such as Reddit, YouTube, X, Quora), "community_domains",
"other_domains"}: a high community_pct means this topic is won by what
people say about a brand elsewhere, not by any one site's pages)}.
This tool's citation universe is the provider's tracked mention corpus for the keyword, which is a different measurement from analyze_citation_structure's single live answer - the two can legitimately disagree on whether a given domain shows up.
Use check_prompt_coverage instead if you already know which domain you care about and just want to know whether it is cited.
Args: keyword: the topic/query to check, e.g. "best project management tool". platform: "chat_gpt" or "google" (Google's AI Overview). Defaults to chat_gpt. Perplexity and Gemini aren't available - the underlying data provider doesn't cover them for this check. compare_domain: optional bare domain to look up in the results (exact match against the registrable domain, e.g. "notion.so" will not match "mynotion.so.example.com"). country: market to check, e.g. "Italy". Defaults to "United States". chat_gpt only has data for the United States; use platform "google" for any other country. language: language code, e.g. "it". Defaults to "en" (the only option for chat_gpt).
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | United States | |
| keyword | Yes | ||
| language | No | en | |
| platform | No | chat_gpt | |
| compare_domain | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/destructive, so the description earns credit for adding quota economics (10 units/call, 30/month shared, max ~3 calls), provider coverage gaps, and the crucial caveat that absence from top_domains is not evidence of zero citations. It also explains that its measurement universe can legitimately disagree with analyze_citation_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, then cost, then returns, then args – a sensible order. It is long (roughly 300 words) and the 'Read-only: no side effects' clause partly repeats the annotations, but nearly every other sentence adds non-redundant, decision-relevant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return shape (top_domains, compare_domain_rank, source_mix, etc.) and the interpretation caveats an agent needs. For a 5-param, no-schema tool it 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 0%, so the description carries the full burden and does: keyword meaning plus example, platform enum values with default and what's excluded, compare_domain with exact-match/registrable-domain semantics and a worked example, country default and chat_gpt limitation, and language default with 'it' example.
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 (find) and resource (domains dominating AI-answer citations for a keyword), plus the exact user questions it answers ('who's winning AI search for this topic'). It explicitly distinguishes itself from analyze_citation_structure (single live answer vs. tracked mention corpus) and check_prompt_coverage, 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?
Gives direct routing rules: use check_prompt_coverage 'instead if you already know which domain you care about,' and use the compare_domain arg when you want a specific domain's rank. It also states platform availability limits (Perplexity/Gemini unavailable) and country/language constraints (chat_gpt is US/English only), which are genuine when-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_cited_questionsFind questions AI cites your site forARead-onlyIdempotentInspect
Find the questions people ask AI answer engines where a domain is already cited as a source, most-asked first. Starts from the domain, so nobody has to guess keywords first. Use this to answer 'what does ChatGPT already cite us for' or to pick the keywords to feed check_prompt_coverage and analyze_citation_gap.
Read-only: no side effects, safe to retry. Costs 10 quota units/call (free tier is 30 units/month shared across every metered tool, so up to 3 calls to this tool alone if nothing else is used that period).
Returns: {"domain", "platform", "country", "language", "total_questions"
(int, every tracked question citing the domain, which can exceed the
list), "questions" (up to limit, most-asked first: {"question",
"ai_search_volume" (monthly asks as the provider estimates them),
"your_position" (1-based position of the domain among that answer's
sources), "source_domains" (who else that answer cites), "last_seen"
(when the provider last recorded this answer, UTC)})}. An empty list means
the provider's tracked answers do not cite the domain, not that no
answer anywhere does.
This reads the provider's tracked answer corpus, the same measurement as find_citation_leaders, not a live answer: re-check a question with check_prompt_coverage to see today's answer.
Args: domain: bare domain, e.g. "example.com" (no https://, no www). Subdomains are included. platform: "chat_gpt" (default) or "google" (Google's AI Overview). limit: how many questions to return, 1 to 20. Default 20. country: market, e.g. "Italy". Defaults to "United States". chat_gpt only has United States data; use platform "google" elsewhere. language: language code, e.g. "it". Defaults to "en", the only option for chat_gpt.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| domain | Yes | ||
| country | No | United States | |
| language | No | en | |
| platform | No | chat_gpt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds context annotations cannot carry: quota cost (10 units/call, 30 unit free tier shared across metered tools) and the important semantic caveat that an empty list means the provider's tracked corpus lacks the domain, not that no answer anywhere cites 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?
Purpose, cost, return shape, and parameter notes are ordered logically and mostly front-loaded. The inline return-value block is long but earns its place given there is no output schema; a couple of parenthetical explanations 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?
With no output schema, the description fully specifies the return object, field meanings, truncation behavior (total_questions can exceed the returned list), and the key limitation of the data source. Nothing needed to call or interpret 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?
Schema description coverage is 0%, so the description carries the full burden and does so: bare domain format with subdomains included, platform values with default, limit range (1-20, default 20), country default plus the chat_gpt-only-United-States constraint, and language default plus the en-only constraint for chat_gpt.
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 with scope: 'Find the questions people ask AI answer engines where a domain is already cited as a source, most-asked first.' It also differentiates itself from siblings by naming find_citation_leaders (same measurement corpus) and check_prompt_coverage/analyze_citation_gap as downstream consumers.
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 gives the use case ('what does ChatGPT already cite us for') and the follow-on workflow ('pick the keywords to feed check_prompt_coverage and analyze_citation_gap'). It also states when to re-verify with check_prompt_coverage instead of trusting this corpus snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_check_historyShow your past citation checksARead-onlyIdempotentInspect
Read back your own earlier check_prompt_coverage results for a domain, newest first, to show progress over time or to confirm whether a change (a rewrite, a new mention somewhere) moved anything. Use this for 'has our citation status changed since last week' without spending units.
Costs 0 quota units: it only reads Vantage's own record of your checks, never the data provider. Results are kept 180 days per API key and are only visible to that key.
Returns: {"domain", "keyword" (or null for every keyword), "checks" (newest first: {"keyword", "engine", "country", "language", "samples", "cited_runs", "best_rank", "mentioned_runs", "checked_at"})}.
Args: domain: the bare domain the checks were run for, e.g. "example.com". keyword: optional, only this keyword's history. limit: how many rows to return, 1 to 200. Default 50.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| domain | Yes | ||
| keyword | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/idempotent/non-destructive), but the description adds material behavior the agent could not infer: zero quota cost, reads Vantage's own record rather than the data provider, and 180-day per-API-key retention with key-scoped visibility.
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 purpose sentence, then cost, then return shape, then args -- a logical order with little waste. The nested Returns block is dense, though it is justified since no 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?
With no output schema present, the description compensates by spelling out the return fields, and it fully documents all three parameters plus retention and cost behavior. 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 0%, so the description carries the full burden and does so: domain is defined as the bare domain with an example, keyword is scoped to a single keyword's history, and limit is bounded 1-200 with a default of 50.
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 ('read back your own earlier check_prompt_coverage results for a domain, newest first') and explicitly frames it as distinct from the sibling check_prompt_coverage, which runs new checks. An agent can select this 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?
Names the selecting condition ('show progress over time', 'has our citation status changed since last week') and contrasts with the unit-spending alternative, making the when-to-use decision unambiguous. No exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageCheck remaining monthly unitsARead-onlyIdempotentInspect
Check how much of this billing period's quota is left, before spending any of it. Use this to answer 'how many checks do I have left' or to decide whether a batch call will fit before running it.
Costs 0 quota units - this never touches the paid data provider, it only reads Vantage's own record of what has been used.
Returns: {"tier", "period" (YYYY-MM), "units_used", "units_limit",
"units_remaining"}. find_citation_leaders and find_cited_questions cost
10 units/call; analyze_citation_trend, analyze_citation_structure (and
its batch form, per keyword), check_prompt_coverage (per keyword) and
analyze_citation_gap cost 1, times samples where a tool takes it.
get_check_history costs 0.
stdio/local-dev mode (no HTTP access token) has no metering at all - this returns tier "unmetered" with no real limit in that case.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/non-destructive; the description adds substantial context beyond them: it costs 0 quota units, never touches the paid data provider, reads Vantage's own usage record, and degrades to tier 'unmetered' in stdio/local-dev mode with no HTTP token. This is exactly the operational context an agent needs and could not derive from 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?
Purpose and the zero-cost caveat are front-loaded, followed by the return shape and the sibling cost table. Although long, every sentence serves the agent's decision (whether to spend quota, what comes back), so nothing is 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?
No output schema exists, but the description supplies the full return shape ({tier, period, units_used, units_limit, units_remaining}), the quota-cost table for every sibling, and the stdio-mode edge case. An agent has everything required to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is no schema semantics to elaborate. The description instead documents the return shape, which is useful but not a parameter concern.
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 ('Check how much of this billing period's quota is left') and frames the scope precisely. It clearly distinguishes itself from siblings by naming them and their costs, so an agent knows this is the free quota-inspection tool, not a data-consuming analysis 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?
Gives explicit when-to-use ('before spending any of it', to answer 'how many checks do I have left', to check whether a batch call will fit) and reinforces the decision with per-sibling cost figures. No inference about when to prefer this tool is left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.8.0- Changed
analyze_citation_gap1 field changed- added
Input schema / properties / engineAdded value: +{ + "default": "chat_gpt", + "title": "Engine", + "type": "string" +}
- Changed
analyze_citation_structure2 fields changed- added
Input schema / properties / engineAdded value: +{ + "default": "chat_gpt", + "title": "Engine", + "type": "string" +} - added
Input schema / properties / samplesAdded value: +{ + "default": 1, + "title": "Samples", + "type": "integer" +}
- Changed
analyze_citation_structure_batch1 field changed- added
Input schema / properties / engineAdded value: +{ + "default": "chat_gpt", + "title": "Engine", + "type": "string" +}
- Changed
check_prompt_coverage2 fields changed- added
Input schema / properties / engineAdded value: +{ + "default": "chat_gpt", + "title": "Engine", + "type": "string" +} - added
Input schema / properties / samplesAdded value: +{ + "default": 1, + "title": "Samples", + "type": "integer" +}
- Added
find_cited_questions - Added
get_check_history
6 tool updates
v1.7.0- Changed
analyze_citation_gap2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
analyze_citation_structure2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
analyze_citation_structure_batch2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
analyze_citation_trend2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
check_prompt_coverage2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
find_citation_leaders2 fields changed- added
Input schema / properties / countryAdded value: +{ + "default": "United States", + "title": "Country", + "type": "string" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
3 tool updates
v1.6.0- Removed
check_ai_visibility - Added
check_prompt_coverage - Added
get_usage
3 tool updates
v1.5.2- Added
analyze_citation_gap - Removed
citation_leaders - Added
find_citation_leaders
5 tool updates
v1.3.0- Added
analyze_citation_structure - Added
analyze_citation_structure_batch - Added
analyze_citation_trend - Removed
citation_structure - Removed
citation_structure_batch
4 tool updates
v1.1.2- First observed
check_ai_visibility - First observed
citation_leaders - First observed
citation_structure - First observed
citation_structure_batch
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose, and the descriptions explicitly cross-reference related tools to guide selection. Overlaps such as find_citation_leaders vs. find_cited_questions and analyze_citation_structure vs. analyze_citation_gap are well differentiated by starting point and output.
All tool names use consistent snake_case with a predictable verb_noun or verb_noun_qualifier pattern, e.g. find_citation_leaders, analyze_citation_structure, check_prompt_coverage. The batch variant is clearly named as a suffix, which maintains readability and consistency.
Nine tools is well scoped for an AI citation analytics server, with separate tools for discovery, auditing, diagnosis, tracking, and usage. No tool feels redundant or trivial, and the batch forms are justified by cost/scale concerns.
The surface covers the core lifecycle: quota checks, leaderboard discovery, cited-question discovery, domain trend tracking, prompt coverage auditing, answer-structure analysis, gap analysis, and history. Minor gaps remain, such as no batch form for analyze_citation_gap or analyze_citation_trend, but agents can work around these one keyword at a time.
Maintenance
Related MCP Connectors
Check if ChatGPT, Perplexity & Gemini mention or cite a brand. Share of voice + GEO/AEO tracking.
Track brand visibility in ChatGPT, Gemini and Google AI answers: competitors, cited sources, checks.
See how ChatGPT, Perplexity, Gemini and Google AI Overviews mention and cite your brand.
Track your brand's visibility in ChatGPT, Perplexity, Claude, Gemini, Grok and DeepSeek answers.
Related MCP Servers
- AlicenseAqualityDmaintenanceAudit your brand's visibility across ChatGPT, Perplexity, Claude, and Google AI - get citation rates, AEO health scores, content gap analysis, and a 9-page content suite to rank in AI-generated answers.570 npmMIT
- AlicenseAqualityCmaintenanceTrack brand visibility across ChatGPT, Perplexity, Claude, and Gemini.692 npm10MIT
- AlicenseBqualityBmaintenanceEnables AI agents to check brand mentions across AI search surfaces like ChatGPT, Claude, Gemini, Perplexity, and Google AI Overviews using natural language queries.43 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to monitor and analyze a brand's visibility across ChatGPT, Claude, Perplexity, and Google AI Overviews, providing insights, recommendations, and competitive analysis without switching tabs.2519 npm1MIT