Website Auditor MCP
This server lets AI agents audit and monitor websites' AI visibility (GEO) and overall site health, powered by the Website Auditor API.
Check AI visibility — 0–100 score, per-engine breakdown (ChatGPT, Perplexity, Claude, Gemini), top competitor appearing instead of you, citation sources, and 7/30-day trends.
Run full site audits — AI visibility, SEO, security, and performance scores, top issues, and a shareable report URL.
Compare competitors — head-to-head AI-visibility rankings, gaps where rivals appear and you don't, quota-aware with skipped lists.
Monitor sites — start/stop weekly tracking, list tracked sites, and get a dashboard of latest scores, scheduled runs, and changes.
See what changed — per-engine score deltas between snapshots that asked the same question, with reasons when no comparison is possible.
Benchmark and improve — compare against industry/geo peers, get prioritized recommendations, generate JSON-LD schema, and build a GTM plan from citation evidence.
Share results — get a shareable report URL and embeddable "Audited by Website Auditor" badge.
Manage subscription — check upgrade/Pro status with any valid key.
Try it free —
get_sample_auditreturns a complete sample report with no API key or subscription.
Provides AI-visibility checks for the Perplexity engine, reporting whether a website is recommended by Perplexity and including a Perplexity-specific score in the per-engine breakdown.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Website Auditor MCPcheck my AI visibility score for example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Website Auditor MCP
An MCP server for website-auditor.io — AI-visibility (GEO) and site-audit tools you can call from any MCP client (Claude Desktop, Claude Code, Cursor, Codex, and other agents).
Ask an agent "does ChatGPT recommend my business?", "what's my AI-visibility score?", "audit example.com", or "how do I stack up against my competitors?" and it answers with real data — an overall AI-visibility score (0–100), a per-engine breakdown across ChatGPT, Perplexity, Claude and Gemini, a full site audit (SEO, security, performance), competitor comparisons, and ongoing monitoring.
The server is a thin, authenticated wrapper over the Website Auditor API — the audit engine, AI-visibility scoring and monitoring live in that service; this server just makes them available to agents.
Tools
Tool | Tier | What it does |
| Free — no key | A complete sample report for |
| Pro | Current AI-visibility score (0–100) + per-engine breakdown (ChatGPT, Perplexity, Claude, Gemini) + the top competitor appearing in your place. Pro subscribers also get |
| Pro, rate-limited | Full one-time audit → category scores (AI visibility, SEO, security, performance) + top issues + a shareable report URL. |
| Pro | What changed in the AI-visibility score — the change in the overall score and the per-engine score changes, for engines measured both times, the overall only when the same engines answered both snapshots (else it is null with an |
| Pro | Head-to-head AI-visibility ranking against named competitor domains + where each appears that you don't. Quota-aware: caps the audit fan-out to your remaining daily quota, reuses recent cached audits, and reports any competitors it had to skip rather than dropping them silently. |
| Pro | Start (or stop) weekly monitoring of a site's AI visibility. Its weekly re-audits join the history |
| Pro | Stop monitoring a site and free up a monitoring slot. Idempotent. |
| Pro | List the sites you're monitoring, with cadence, active state, and slots used/remaining. |
| Pro | A glanceable dashboard across all tracked sites — latest score of each site's series (the series |
| Any valid key | Your own subscription standing — tier, status, period end, and what upgrading unlocks (starting Pro requires a payment method and accepting the Terms). Consumes no audit quota. |
Related MCP server: seo-audit-mcp
Prompts
Clients that support MCP prompts (Claude Desktop, claude.ai) render these as something you can pick from a menu, so you don't have to phrase the request yourself or know which tool to ask for. In clients that don't surface prompts (Codex, currently), nothing is lost but the menu — ask in words and the same tools run.
Prompt | Needs a key? | What it does |
See a sample report | No | Walks through a complete report for |
Check my AI visibility | Pro | Runs |
Run a full site audit | Pro | Runs |
Compare me to a competitor | Pro | Runs |
Each Pro prompt falls back to get_sample_audit when no API key is configured,
so you always get output rather than an error.
Naming the business (optional)
get_ai_visibility and run_audit both accept two optional arguments that
decide what question the AI-visibility check actually asks.
compare_competitors accepts business_location only — see below for why it
takes no name:
Argument | Omitted | Supplied |
| Detected from the site, and flagged with | Taken as fact and recorded as caller-supplied — which suppresses the warning |
| Detected from the site; if nothing is found the questions widen to the country, or drop the place entirely | Scopes the questions to that place |
Supply a name only when you actually know it. A supplied name overrides detection and is treated as confirmed, so a guess is scored exactly as if a human had verified it — and silences the warning that would have told you otherwise. Leaving it out is the safer default: detection is transparent about its own uncertainty.
The same applies to location, in the other direction. Omitting it is correct for a national or global business and wrong for a local one, since a local business measured without a place is measured against the wrong queries.
On compare_competitors: it takes business_location and applies it to
your site and every competitor, because a comparison asks about one market —
scoring you locally while scoring your rivals globally would rank the answers
to two different questions. It deliberately takes no business_name: a name
identifies one business, and forwarding yours to your competitors would score
every one of them as you. The result names the market it used, so a scoped
comparison is never mistaken for a global one.
"Check AI visibility for hawaiibackroad.com,
the business is Big Island Backroad Adventures in Hilo, HI"Install & configure
The server runs directly via npx — no clone or build required.
Try it before you buy it. Install with no API key at all and ask your agent
for a sample audit — get_sample_audit returns a full report for example.com
in the exact format a real run produces, so you can check the shape fits your
needs first.
Pricing. Auditing real domains needs a Website Auditor subscription at
$10/month — eligible new customers get a 7-day free trial (payment
method required to start; no charge until the trial ends; customers who used
a trial in the last 12 months are billed immediately). Sign up and create an
API key at
api.website-auditor.io/admin_portal,
then set it as WA_API_KEY below. There is no free API tier — a key only
functions with an active subscription.
Claude Desktop (claude_desktop_config.json), Cursor
(~/.cursor/mcp.json), and most other clients use the same mcpServers shape:
{
"mcpServers": {
"website-auditor": {
"command": "npx",
"args": ["-y", "website-auditor-mcp"],
"env": {
"WA_API_KEY": "wa_your_key_here"
}
}
}
}Claude Code — add it from the CLI:
claude mcp add website-auditor -e WA_API_KEY=wa_your_key_here -- npx -y website-auditor-mcpCodex — the CLI, IDE extension and ChatGPT desktop app all read the same
~/.codex/config.toml, so one of these covers all three:
codex mcp add website-auditor --env WA_API_KEY=wa_your_key_here -- npx -y website-auditor-mcp[mcp_servers.website-auditor]
command = "npx"
args = ["-y", "website-auditor-mcp"]
[mcp_servers.website-auditor.env]
WA_API_KEY = "wa_your_key_here"Codex doesn't render MCP prompts, so the Prompts above won't appear as menu entries there — ask in words instead ("show me a sample audit").
Or install the packaged Codex plugin, which bundles the same server and restores the prompts as skills (which Codex does render):
codex plugin marketplace add SpikeyCoder/website-auditor-mcp
codex plugin add website-auditor@spikeycoderCursor — one-click install, or put the same mcpServers JSON as above in
~/.cursor/mcp.json:
The one-click config arrives with an empty WA_API_KEY — the sample report
works as-is; fill the key in under Settings → MCP to audit real domains.
There is also a packaged Cursor plugin (this server plus the prompts as
skills) in cursor-plugin/; its Cursor Marketplace listing
is pending — status in docs/CURSOR-PLUGIN.md.
Restart the client and the tools appear.
Getting an API key
WA_API_KEY is a per-user key (it starts with wa_) minted from a Website
Auditor account at
api.website-auditor.io/admin_portal
— the admin portal, where you subscribe and manage keys.
Minting a key requires an active subscription ($10/month; eligible new
customers get a 7-day free trial — payment method required, no charge until
the trial ends): there is no free API tier, so every tool except
get_sample_audit and check_upgrade_status needs one. get_sample_audit
needs no key at all.
Treat the key like a password — set it only in your MCP client's env and never
commit it.
Restart after setting or changing the key. WA_API_KEY is read once, when
the server starts, so a key added while the client is running is invisible to
it — in Claude Desktop, quit and reopen the app. Without the restart the tools
keep returning the same AUTH_REQUIRED you just acted on, which looks
identical to the key not working.
Configuration (environment variables)
Var | Default | Purpose |
| (required) | Per-user API key (starts with |
|
| The Website Auditor API this server wraps. |
|
| Used to build shareable report links. |
|
| Where auth and subscription errors point you. |
|
| Timeout for API calls. |
|
| Reuse a domain's audit within this window instead of spending quota (used by |
|
| How long a resolved Pro/free tier is cached per key before re-checking the subscription. |
| (unset → metrics on) | Set to |
Only WA_API_KEY is normally needed; the rest have sensible defaults. See
.env.example for the full list.
Auth & tiers
Your key is validated on every call. The Pro/free tier is resolved live from the API and cached briefly, so upgrades and downgrades take effect within about a minute:
No key →
get_sample_auditstill works (that's the point of it); every other tool returnsAUTH_REQUIREDwith the price and a sign-up link.Revoked or unrecognized key →
INVALID_KEY, carrying the API's own remediation ("generate a new key"). Distinct fromPRO_REQUIRED: the fix is a new key, not a purchase.No active subscription (valid key, lapsed/canceled/never subscribed) →
PRO_REQUIREDwith the price and an upgrade link — there is no free API tier;check_upgrade_statusstill answers so the caller can learn why.Subscribed (status
activeor a trial in progress) → all tools.
Errors are normalized to stable codes agents can branch on — e.g.
AUTH_REQUIRED, INVALID_KEY, PRO_REQUIRED, OVER_QUOTA,
UNREACHABLE_DOMAIN, INVALID_INPUT, TIMEOUT. A domain that can't be reached
returns UNREACHABLE_DOMAIN — never a fabricated score.
Develop
npm install
npm run build # compile TypeScript → dist/
npm start # serve over stdio
npm run dev # run from source without building
npm test # vitest
npm run typecheckThe suite is hermetic — the API client, subscription provider and meter are
injected, and HTTP is mocked at the fetch boundary, so no network is touched.
Privacy Policy
Anonymous install id. When telemetry is enabled, the server generates a
random UUID on first run and stores it at
~/.config/website-auditor-mcp/install-id (or $XDG_CONFIG_HOME), sending it
with each event. It exists solely to tell one install restarting many times
apart from many separate installs — without it, install counts are just restart
counts. It is randomly generated, never derived from your machine, username or
network, and is not a fingerprint. Setting WA_METRICS_DISABLED stops
telemetry entirely: no id is generated and nothing is written to disk.
This connector talks to a single external service: the Website Auditor API at website-auditor.io. When you invoke a tool it sends only two things to that API:
the target domain you asked to audit or monitor, and
your API key (
WA_API_KEY), used to authenticate the request and resolve your plan tier.
That's the full extent of what leaves your machine. The connector does not collect, store, or transmit your files, prompts, conversation content, or any other personal data, and it does not send data to any third party beyond the Website Auditor API. Your API key is held only in your MCP client's configuration (in Claude Desktop it is stored in the OS keychain and injected as an environment variable); it is never written to the bundle or logged.
Anonymous, aggregate usage telemetry (which tool ran, success/failure, latency —
no domains, no keys, no personal data) may be emitted to improve the service, and
can be disabled entirely by setting WA_METRICS_DISABLED=1. Installed as a
desktop extension, the same opt-out is a "Disable anonymous usage telemetry"
checkbox in the extension's settings.
Full privacy policy: https://website-auditor.io/privacy
License
MIT — © 2026 Kevin Armstrong / SpikeyCoder.
This covers the MCP server in this repo: the client that talks to the Website Auditor API. The audit engine and the API behind it are separate products, not covered here, and running real audits still needs a Website Auditor account.
Learn more at website-auditor.io.
Available Tools
15 toolscheck_upgrade_statusCheck upgrade statusARead-only
Check the caller's own Website Auditor subscription standing. Use this when someone asks "am I on Pro," "is my trial still active," "when does my subscription renew/end," "why is this tool locked," or before suggesting an upgrade. Works with any valid API key and consumes no audit quota. Returns the tier (none/free/pro), raw subscription status, period end, whether the subscription is set to cancel, the upgrade URL, and a plain-language summary — including what starting Pro requires (a payment method and accepting the Terms).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tier | Yes | "none" | "free" | "pro". |
| status | Yes | Raw subscription status: active, trialing, canceled, none, … |
| message | Yes | |
| upgrade_url | Yes | |
| current_period_end | Yes | |
| cancel_at_period_end | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context beyond annotations: it targets the caller's own subscription, works with any valid key, consumes no audit quota, and details the exact return fields including a plain-language summary and Pro requirements. This gives the agent a clear model of what calling the tool will do and what it won't do.
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 well-structured: it opens with the core purpose, follows with explicit usage triggers, then covers behavior and return values in one efficient list. Every sentence adds useful information, and the trigger phrases are front-loaded for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only subscription status tool, the description is complete. It covers purpose, applicable triggers, side-effect-free behavior, and what the caller receives in the response. The output schema exists, but the description still usefully summarizes the meaningful return fields without being redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description still clarifies that the tool inherently operates on 'the caller's own' subscription, which is meaningful contextual semantics even without input 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?
The description states a specific verb ('Check') and a precise resource: the caller's own Website Auditor subscription standing. It clearly distinguishes this from sibling tools by naming the exact user questions it answers ('am I on Pro,' 'is my trial still active'), so the agent can select it unambiguously.
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 description gives explicit when-to-use guidance with concrete trigger phrases and even 'before suggesting an upgrade.' It also clarifies that it 'Works with any valid API key and consumes no audit quota,' which helps the agent decide whether this tool is appropriate in edge cases like locked tools or trial inquiries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_competitorsCompare against competitorsARead-only
Compare a website's AI visibility head-to-head against named competitors. Use this when someone asks "how do I stack up against X and Y," "who does ChatGPT recommend instead of me," or wants a competitive AI-visibility view. Returns each competitor's score and where they appear that the site does not. Each competitor not already cached costs one audit against your daily quota; if the quota can't cover every competitor, it ranks the ones it could audit and returns a quota summary plus a skipped list naming the rest — it never drops competitors silently or invents scores. If the quota is already exhausted it returns an over-quota error with the reset time. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". | |
| competitors | Yes | Competitor domains to compare against. | |
| business_location | No | Optional. The market to compare within, e.g. "Chiang Mai, Thailand". Applied to the site AND every competitor, because a comparison asks about one market — scoring one locally and the others globally would rank answers to two different questions. Leave it out and each audit detects its own location, which is right for national or global businesses and wrong for local ones. |
Output Schema
| Name | Required | Description |
|---|---|---|
| gaps | Yes | Engines where a competitor appears in AI answers and this site does not. |
| quota | Yes | |
| market | Yes | The market every audit in this comparison was scored in, or null when each domain's own location was detected. |
| ranking | Yes | |
| skipped | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description richly discloses quota consumption per uncached competitor, partial-audit behavior with skipped lists, the guarantee that competitors are never silently dropped or scores invented, and over-quota error behavior with reset time. Subscription requirements are also clearly surfaced.
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 every sentence earns its place: purpose, trigger phrasing, return behavior, quota edge cases, and subscription prerequisite. It is front-loaded with the core purpose and avoids 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?
Given the tool's complexity and the existing structured fields, the description covers purpose, input semantics, quota behavior, error handling, prerequisites, and fallback actions. The output schema handles return-value structure, so no additional detail is required.
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?
Even though schema coverage is 100%, the description adds meaningful parameter context: competitors consume quota when not cached, and business_location is explicitly applied to the site AND every competitor to avoid mixed-market comparisons. This exceeds the schema-only meaning.
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 and resource: 'Compare a website's AI visibility head-to-head against named competitors.' It also gives concrete user phrasings that trigger this tool, which clearly separates it from related siblings like get_ai_visibility or get_benchmark.
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 explicit when-to-use triggers with example questions and explains a fallback path (call get_sample_audit if no subscription). However, it does not explicitly state when not to use this tool or name alternative sibling tools beyond the sample-audit fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_schemaGenerate JSON-LD schemaARead-only
Generate ready-to-paste structured data (JSON-LD schema) tailored to a website, to improve how AI assistants and search engines understand it. Use this when someone asks for "schema," "structured data," "JSON-LD," or wants the actual markup to implement a recommendation. Returns valid JSON-LD. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Schema type, or auto-detect. | |
| domain | Yes | The website domain, e.g. "example.com". |
Output Schema
| Name | Required | Description |
|---|---|---|
| jsonld | No | The JSON-LD document, ready to paste into the site. |
| placement_notes | Yes | Where to put the snippet, e.g. "in the <head> of every page". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover non-destructive read-only behavior. The description goes beyond them by disclosing the paid subscription requirement, the free-trial terms, and that the tool returns valid JSON-LD. It doesn't contradict the annotations and adds the non-obvious prerequisite.
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 trigger phrases, then gives return expectations and the subscription/fallback context. It is a bit longer than strictly necessary because of the trial payment details, but each 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?
Given only two parameters, an output schema, and annotations covering safety, the description covers the required context: what it does, when to use it, what it returns, and what to do if the user isn't subscribed. Nothing critical is missing for correct tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with descriptions, including the enum options and a domain example, so schema coverage is 100%. The description doesn't add parameter-specific meaning beyond what the schema provides, which lands it at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it generates ready-to-paste JSON-LD structured data tailored to a website. It also names the exact user triggers ('schema,' 'structured data,' 'JSON-LD') and distinguishes this tool from audit/report siblings.
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 the tool ('when someone asks for...') and provides a clear alternative path: if the user lacks a paid subscription, call get_sample_audit first. This is direct, actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_visibilityCheck AI visibilityARead-only
Check how visible a website is to AI assistants right now. Use this whenever someone asks "does ChatGPT/Perplexity/Claude/Gemini recommend this business," "is my site showing up in AI answers," "what's my AI visibility / GEO score," or wants a quick read on whether an AI assistant would surface a given domain. Returns an overall AI-visibility score (0–100), a per-engine breakdown (ChatGPT, Perplexity, Claude, Gemini), and the top competitor appearing in place of the site. When the audit recorded citations, sources lists the documents the assistants actually read, ranked by cross-engine agreement, each marked yours, competitor or third_party — treat competitor rows as context, not as placement targets; sources: null means the recorded answers cited nothing attributable, and an absent key means citations were not recorded for this audit. The result also includes trend data: 7- and 30-day score movement computed from the domain's stored snapshot history, for the question this audit asked, ending at the snapshot this audit stored; when it stored no measured snapshot, trend is null and trend_note says why. If name_warning is present, the business name behind the score could not be verified — relay that caveat rather than presenting the score as settled fact, and offer to re-run with an explicit business name. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". | |
| business_name | No | Optional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known. | |
| business_location | No | Optional. The city the business trades in, e.g. "Hilo, HI". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| score | Yes | Overall AI-visibility score, 0–100. |
| trend | Yes | Pro only; null when unavailable — trend_note says why. |
| sources | No | |
| summary | Yes | |
| by_engine | Yes | Per-engine AI-visibility score, 0–100. NULL means the engine was not scored — see engine_status for which of the two reasons. A null is NOT a zero: zero means the engine answered and never named the business. |
| trend_note | No | Present exactly when trend is null: the reason. |
| name_source | No | "detected" | "user_supplied" | "domain_fallback". |
| name_warning | No | Set ONLY when the business name behind the score could not be verified. The score is computed from queries built around that name, so relay this caveat rather than presenting the score as settled. |
| coverage_note | No | Present exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the four this tool can query. |
| engine_status | Yes | Why each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all. |
| name_verified | No | |
| top_competitor | Yes | The competitor appearing in place of the site, if any. |
| appears_by_engine | Yes | Whether the site appeared at all on each engine. Distinct from the scores: an engine can have appearances yet a low score, or the reverse. NULL when the engine was not scored — false would assert it did not name the business, which is a claim an unmeasured engine cannot support. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly/openWorld/non-destructive; the description adds substantial behavioral context: the subscription/payment gate, null-vs-absent semantics for sources, null trend with trend_note explanation, and the name_warning caveat that must be relayed. 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?
The description is front-loaded and logically ordered, but it is long and repeats output details that an output schema would already document. Some subscription marketing detail (payment method, trial terms) could be trimmed without losing invocation 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?
Despite its length, it covers all operational context an agent needs: when to call it, the subscription prerequisite and fallback, per-engine output, sources/trend null behavior, and the name_warning caveat. With an output schema present, nothing essential 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 schema carries parameter semantics. The main description mostly restates the business_name verification caveat and does not add new parameter meaning; it links name_warning to the business_name parameter but that link is already implied by 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 precise verb, resource, and time scope: 'Check how visible a website is to AI assistants right now.' It then names the exact outputs (0–100 score, ChatGPT/Perplexity/Claude/Gemini breakdown, top competitor), making the tool's role unambiguous and distinct from report/monitoring siblings.
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 phrases ('does ChatGPT recommend this business', 'what's my AI visibility') and an explicit alternative: call get_sample_audit when no subscription exists. It does not, however, contrast with other audit/monitoring siblings (e.g., get_monitoring_status, get_report), so the when-not-to-use guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_benchmarkBenchmark vs industry/geoARead-only
Benchmark a website's AI visibility against its industry and location. Use this when someone asks "how do I compare to others in my space," "is this a good score for my industry," or wants percentile/peer context rather than an absolute number. Backed by aggregated audit data. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| geo | No | Optional location override. | |
| domain | Yes | The website domain, e.g. "example.com". | |
| industry | No | Optional industry override. |
Output Schema
| Name | Required | Description |
|---|---|---|
| percentile | Yes | The domain's percentile within its industry/geo peer set, 0–100. |
| peer_median | Yes | |
| sample_size | Yes | How many peers the percentile and median are computed over. |
| position_summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive, and the description adds a crucial behavioral constraint: the tool requires a Website Auditor subscription, including free-trial details and the fact that payment information is needed upfront. It also discloses that results are backed by aggregated audit data.
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?
Every sentence contributes a distinct piece of information: what the tool does, when to use it, how the data is derived, the subscription requirement, and the fallback path. The purpose is front-loaded, and no unnecessary boilerplate is present.
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 details are not the description's job. The description covers the prerequisite (subscription), the fallback flow (get_sample_audit), the use-case signals, and the underlying data source. Nothing critical is missing for an agent to decide when to call this 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?
All three parameters already have schema descriptions, so the baseline is 3. The tool description does not add much parameter-level detail beyond implying that geo and industry are optional overrides used for benchmarking context, which the schema already 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 opens with a specific verb and object: 'Benchmark a website's AI visibility against its industry and location,' and clarifies that the user wants percentile/peer context rather than an absolute number. This distinguishes it from tools like get_ai_visibility and compare_competitors by making the benchmark scope (industry/geo) explicit.
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 description gives explicit trigger phrases ('how do I compare to others in my space,' 'is this a good score for my industry') and tells the agent to call get_sample_audit first when the user lacks a subscription. This is clear, actionable routing guidance with a named fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changesWhat changed in AI visibilityARead-only
Report what changed in a website's AI-visibility score, only between two snapshots that asked the same question. Use this when someone asks "did anything change," "what's different this week/month," or "did my AI visibility drop." Requires the domain to be tracked (see track_site). Returns the change in the overall score and the per-engine score changes, for engines measured both times; competitor_changes, new_issues and resolved_issues are always empty, since snapshots record neither competitors nor audit issues. A change is only ever measured between two snapshots that asked the same question (the same business name, market and queries); when there is no such pair it says why instead of giving a number, with the date the series re-baselined when it did. The series is the measured weekly re-audits and any audit that asked the same question as the newest recorded one, while it has no gap longer than four weeks and a day from the newest weekly re-audit that recorded its question, through each later snapshot of the series (weekly re-audits included, recorded or not), to the newest measured snapshot; otherwise every measured snapshot. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional ISO date or "last_check". | |
| domain | Yes | The website domain, e.g. "example.com". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present when skipped_snapshots is above 0, when newer measured snapshots were left out of the series, or when newer weekly re-audits measured nothing of the business: which, and why, in words. Relay it. |
| new_issues | Yes | Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it. |
| score_delta | Yes | Only ever between two snapshots that asked the same question. When there is no such pair, including a re-baseline after the business name, market or queries changed, the tool returns NOT_YET_AVAILABLE saying so, never a number. |
| engine_changes | Yes | |
| to_captured_at | No | When the later one was. |
| resolved_issues | Yes | Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it. |
| from_captured_at | No | When the earlier snapshot compared was captured. |
| skipped_snapshots | No | Snapshots passed over because they asked a different question (another business name, market or queries) or do not record what they asked. |
| competitor_changes | Yes | Always empty: AI-visibility snapshots record no competitors. Kept for clients that read it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only convey read-only and non-destructive hints. The description adds substantial behavioral context: changes are only measured between same-question snapshot pairs, competitor_changes/new_issues/resolved_issues are always empty, no-pair cases explain why and report re-baseline dates, and the series definition is spelled out. 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?
The description is a dense, single-paragraph wall of text with extremely long, convoluted sentences, especially the series-definition clause. Although the first sentence is front-loaded, the subscription/trial details and nested conditional logic make it hard to scan and substantially exceed what is needed for a 2-parameter 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?
Given an output schema exists, the description still explains return semantics (overall and per-engine score changes, always-empty fields), error behavior when no valid snapshot pair exists, subscription requirements, and the fallback to get_sample_audit. An agent has everything needed to invoke and interpret this 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 description coverage is 100%, so both domain and since are already documented in the schema. The description reinforces that the domain must be tracked and that 'since' relates to snapshot pairing, but it adds no new syntax or format details beyond what the schema provides.
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: 'Report what changed in a website's AI-visibility score, only between two snapshots that asked the same question.' This clearly distinguishes the tool from siblings like get_ai_visibility (current value) and compare_competitors (competitor comparisons).
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 description explicitly says when to use it ('Use this when someone asks...') with concrete example queries, and names preconditions and alternatives: domain must be tracked (see track_site) and non-subscribers should call get_sample_audit first. This gives an agent clear selection and fallback logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gtm_planBuild a GTM plan from the auditARead-only
Build a written go-to-market plan from a website's latest audit, grounded in its citation evidence. Use this when someone asks "what should I do about my AI visibility," "turn this audit into a plan," or wants a GTM or marketing plan for their site. The plan is built from the sources the assistants actually read — each marked yours, competitor or third_party; competitor sources shape the analysis but are never placement targets. When the audit recorded no citation evidence the plan grounds itself in the report's issues and stats instead. Pass focus or constraints to steer it, and prior_plan (the markdown from an earlier call) to refine rather than start over. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | What to emphasize — e.g. "local directories", "content", "a launch next month". | |
| domain | Yes | The website domain, e.g. "example.com". | |
| prior_plan | No | The markdown of a plan from an earlier call, to refine instead of starting over. | |
| constraints | No | Budget, team, or time constraints — e.g. "solo founder, $200/mo". |
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| model | Yes | |
| domain | Yes | |
| summary | Yes | |
| sources_used | Yes | |
| evidence_note | No | Additive, never an error: set when the plan had no citation evidence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, the description reveals how the plan is grounded (citation evidence from sources marked yours/competitor/third_party), the fallback behavior when no citations exist, and the subscription requirement. It even specifies the prerequisite call to get_sample_audit for non-subscribers, providing behavioral 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?
Though fairly long, every sentence earns its place: purpose, use cases, grounding mechanism, fallback, parameter steering, subscription prerequisite, and alternative action are all present without filler. The most important information is front-loaded, and the subscription note is placed logically at the end.
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 covers the main purpose, when to use it, how the plan is grounded, what to do without citations, how to use parameters, and the subscription gate. Since an output schema exists, return-value details are already provided elsewhere, so nothing essential 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 schema already documents all four parameters. The description adds modest interpretive value by explaining that focus/constraints 'steer' the plan and prior_plan is for refining rather than starting over, but it does not provide substantial new detail beyond the schema's own parameter 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?
The description opens with a specific verb and resource: 'Build a written go-to-market plan from a website's latest audit.' It also provides concrete user-phrase examples ('what should I do about my AI visibility') and clarifies that competitor sources inform but never become placement targets, which distinguishes this tool from recommendation or report 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?
The description explicitly states when to use the tool with quoted user requests and gives situational guidance: use focus/constraints to steer, prior_plan to refine, and call get_sample_audit first if the user lacks a subscription. It clearly tells an agent when to use this tool versus a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_monitoring_statusMonitoring status summaryARead-only
Get a glanceable summary of monitoring status across all tracked websites. Use this when someone asks "how are my tracked sites doing," "what's my current AI visibility across everything I monitor," "when were my sites last checked or when do they run next," or wants a dashboard of their monitored domains. Returns, per domain, the latest AI-visibility score of its series (the measured weekly re-audits and any audit that asked the same question as the newest recorded one, while it has no gap longer than four weeks and a day from the newest weekly re-audit that recorded its question, through each later snapshot of the series (weekly re-audits included, recorded or not), to the newest measured snapshot; otherwise every measured snapshot; a newer measured snapshot outside the series is not shown, and get_changes names it), the date of its last scheduled run and when the next one runs, and the most recent change against the last snapshot that asked the same question, or a note or the summary saying why there is none; like get_changes, a change carries competitor_changes, new_issues and resolved_issues, always empty. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| used | Yes | |
| limit | Yes | |
| sites | Yes | |
| summary | Yes | |
| remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds substantial behavioral context: the subscription requirement, the complex series logic for AI-visibility scores, the fact that change fields are always empty, and the fallback to get_sample_audit. 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?
The description is very long and dense, especially the series logic explanation, which is a run-on sentence that is difficult to parse. It is front-loaded with purpose and usage, but the level of detail is excessive for a zero-parameter tool and could confuse agents. The structure is logical but not concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage scenarios, return details (per-domain info, series logic, scheduled runs, changes), the subscription requirement, and the fallback to get_sample_audit. An output schema exists, so return values need not be spelled out, but the description still provides enough context 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?
The tool has zero parameters, so the schema trivially covers 100%. The description adds no parameter information because none exists, and the baseline for 0 params is 4. No further compensation needed.
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 clear verb+resource: 'Get a glanceable summary of monitoring status across all tracked websites.' It also lists concrete user queries that should trigger this tool, distinguishing it from siblings like get_changes and get_sample_audit by context and behavior.
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 description explicitly states when to use the tool (specific queries) and gives a clear exclusion: if the user lacks a subscription, call get_sample_audit first. It also references get_changes for a related but distinct use case, providing both when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsPrioritized fixesARead-only
Get specific, prioritized fixes to raise a website's AI visibility and audit scores. Use this when someone asks "how do I fix this," "what should I change," "how do I improve my AI visibility," or after an audit surfaces issues. Returns ranked actions with expected impact. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". |
Output Schema
| Name | Required | Description |
|---|---|---|
| recommendations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/destructive annotations, the description discloses the Website Auditor subscription requirement with trial terms, states the return shape as 'ranked actions with expected impact,' and prescribes the get_sample_audit fallback. No contradiction: readOnlyHint=true aligns with a read operation.
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 usage triggers are front-loaded, followed by return shape and entitlement details in order of importance. The subscription/trial sentence is dense but each clause earns its place by telling the agent whether to call the tool or divert to get_sample_audit; slightly verbose but not bloated.
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 1-parameter tool with an output schema and read-only annotations, the description covers the operational essentials: usage triggers, return content, entitlement gating, and fallback routing. The only ambiguity is whether a prior run_audit is a prerequisite or whether the tool works standalone from the trigger phrases alone.
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% for the single 'domain' parameter, so the schema already documents its meaning and format. The description adds no parameter-level detail, but none is needed for a self-explanatory domain string; 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: 'Get specific, prioritized fixes to raise a website's AI visibility and audit scores.' The title 'Prioritized fixes' and the phrase 'ranked actions with expected impact' clearly distinguish it from siblings like run_audit, get_changes, and get_gtm_plan.
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 usage triggers are listed ('how do I fix this,' 'what should I change,' 'how do I improve my AI visibility,' or after an audit surfaces issues), and the subscription requirement routes to the correct alternative: 'if the user doesn't have one, call get_sample_audit first.' This gives the agent both when-to-use and when-to-fallback guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reportShareable report + badgeARead-only
Get a shareable report URL and the embeddable "Audited by Website Auditor" badge snippet for a website. Use this when someone wants to "share," "export," "send a client," or "embed" the audit result. Returns a link and an HTML badge snippet. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". |
Output Schema
| Name | Required | Description |
|---|---|---|
| badge_html | Yes | |
| report_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false; the description adds the subscription prerequisite, trial terms, and the fallback path to get_sample_audit. It also explicitly states what is returned, going beyond annotations and schema to inform callers of gating and side expectations.
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, followed by use cases, then requirements. Every sentence earns its place: output, when to use, subscription prerequisite, and fallback action. There is no redundant filler or vague wording.
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 a single parameter fully described, the description covers all decision-critical context: when to use, what prerequisite applies, and what to do when it is not met. Nothing needed 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%, and the sole 'domain' parameter already has a clear schema description ('The website domain, e.g. "example.com"'). The description's phrase 'for a website' adds little beyond the schema, so 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 verb and resource: 'Get a shareable report URL and the embeddable "Audited by Website Auditor" badge snippet for a website.' It clearly differentiates the tool from siblings like run_audit or get_sample_audit by naming the exact output (link + HTML badge snippet).
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 guidance is present: 'Use this when someone wants to "share," "export," "send a client," or "embed" the audit result.' It also provides an explicit alternative and condition: if the user lacks a subscription, call get_sample_audit first. This is direct when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sample_auditSee a sample audit (no key needed)ARead-only
Show a complete sample Website Auditor report — no API key required, nothing to set up. Use this whenever someone wants to "try it," "see a demo," "show me what this does," "what does the output look like," or is deciding whether Website Auditor is worth subscribing to — and use it INSTEAD of refusing when no API key is configured. Returns fixed sample data for example.com in the exact shape a real audit returns: scored summary, per-test results, and the AI-visibility breakdown across ChatGPT, Perplexity, Claude and Gemini. It is clearly marked as a sample and always describes example.com, never the user's own site — auditing a real domain needs a subscription.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| audit | Yes | A real GET /api/audit payload, populated with sample data. |
| price | Yes | |
| domain | Yes | The fixed sample domain. Never the caller's own. |
| is_sample | Yes | Always true. Never present this as a live result. |
| upgrade_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior, and the description goes further by disclosing that no API key or setup is required, the data is fixed for example.com, and the response is clearly marked as a sample. It also explains the return shape: scored summary, per-test results, and AI-visibility breakdown across specific models. This is thorough behavioral context 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 detailed but each sentence contributes: it states the purpose, the trigger scenarios, the output contents, and the critical limitation that it never audits the user's own site. There is slight redundancy between 'no API key required' and 'INSTEAD of refusing when no API key is configured,' but overall it is well organized and 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?
Given zero parameters and an existing output schema, the description is remarkably complete: it explains when to use the tool, what data it returns, how that data is structured, that it is sample data, and that real audits require a subscription. Nothing an agent needs to decide whether to call this 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?
The tool has zero parameters, so there is no schema burden to compensate for. The description adds helpful invocation context by stating that no API key or setup is needed, which reinforces that the tool is callable without prerequisites. This meets the baseline for parameterless tools.
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: 'Show a complete sample Website Auditor report.' It clearly distinguishes itself from a real audit by emphasizing that it returns fixed sample data for example.com and never the user's own site. This leaves no ambiguity about what the tool does.
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 description gives explicit trigger scenarios such as 'try it,' 'see a demo,' and 'show me what this does,' and explicitly says to use it instead of refusing when no API key is configured. It also states the key negative condition: never use it for a user's real domain. It does not explicitly name an alternative tool like run_audit, but it makes the boundary between sample and real subscriptions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracked_sitesList monitored sitesARead-only
List the websites currently being monitored for AI visibility on a schedule. Use this when someone asks "what am I tracking," "which sites am I monitoring," "how many monitoring slots am I using," or wants to see their tracked domains. Returns each tracked domain with its cadence and active state, plus slots used and remaining (out of 5). Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| used | Yes | |
| limit | Yes | |
| summary | Yes | |
| tracked | Yes | |
| remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it returns cadence and active state, slots used/remaining out of 5, and importantly discloses the subscription requirement and trial terms. It also explains the fallback behavior (call get_sample_audit). This goes 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 a bit long but every sentence earns its place: the first sentence states the core function, the second gives example queries, the third details the return values, and the fourth explains the subscription requirement and fallback. It is front-loaded with the primary purpose. Slightly verbose but not wasteful.
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 list tool with an output schema and read-only annotations, the description is complete. It covers what the tool does, when to use it, what it returns, the subscription prerequisite, and the alternative path. An agent has everything needed to decide whether to call it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides no parameter semantics. The description compensates by explaining what the tool returns (each tracked domain with cadence, active state, slots used/remaining), which is the relevant semantic content for a parameterless list tool. Baseline 4 for 0 params 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 clearly states the tool lists websites currently being monitored for AI visibility, with a specific verb ('List') and resource ('websites currently being monitored'). It also distinguishes itself from siblings by mentioning the scheduling aspect and the specific output (cadence, active state, slots used/remaining).
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 description provides explicit when-to-use guidance with example user queries ('what am I tracking,' 'which sites am I monitoring,' 'how many monitoring slots am I using'). It also gives a clear alternative: if the user lacks a Website Auditor subscription, call get_sample_audit first. This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_auditRun a full auditARead-only
Run a full one-time audit of a website — AI visibility plus SEO, security headers, broken links, and performance. Use this when someone asks to "audit," "scan," "check," or "review" a website's health or SEO, or wants a complete report rather than just the AI-visibility number. Returns a scored summary across categories and a link to the full report. The ranked cited-sources evidence behind the AI-visibility number is returned by get_ai_visibility, not by this tool. If name_warning is present, the business name the AI-visibility score was measured against could not be verified — relay that caveat rather than presenting the score as settled fact. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". | |
| business_name | No | Optional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known. | |
| business_location | No | Optional. The city the business trades in, e.g. "Hilo, HI". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| scores | Yes | |
| report_url | Yes | |
| top_issues | Yes | |
| name_warning | No | Set ONLY when the business name could not be verified, which puts the AI-visibility score in question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/opennWorld/dstructive annotations, the description discloses the paid-subscription requirement, trial terms, the scored-summary + report-link return shape, and the `name_warning` caveat the agent must relay. It also clarifies this is a one-time audit rather than ongoing monitoring, which is useful operational context.
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?
Every sentence adds distinct value: purpose, trigger use cases, return format, what is not returned, caveat, and billing/alternative. Core purpose is front-loaded in the first sentence and the operational notes are grouped logically, with no filler or redundant schema 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?
The output schema covers return structure/fields, so the description only needs to cover invocation, subscription gating, caveat handling, and sibling routing — and it does all four. For a billing-gated tool with many siblings, nothing essential 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% and the schema already explains domain, business_name, and business_location thoroughly, including the unverified-name caveat and location-detection behavior. The description adds little beyond reinforcing the `name_warning` caveat, so the 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?
Opens with a concrete verb and resource: 'Run a full one-time audit of a website' and lists exactly what is covered (AI visibility, SEO, security headers, broken links, performance). It also differentiates itself from get_ai_visibility by clarifying this is the complete-report tool, which makes sibling distinction immediate.
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 spells out trigger phrases ('audit,' 'scan,' 'check,' 'review') and the complete-report use case. It also routes non-subscribers to get_sample_audit and states that cited-source evidence belongs to get_ai_visibility, not this tool — so the agent knows both when and 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.
track_siteStart/stop monitoringA
Start (or stop) ongoing monitoring of a website's AI visibility on a schedule. Use this when someone wants to "monitor," "track," "watch," or "get alerted about" a site's AI visibility over time, rather than a one-off check. Establishes the history that get_changes reads from. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". | |
| cadence | No | Monitoring cadence (weekly). | weekly |
| enabled | No | Set false to stop monitoring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| domain | Yes | |
| cadence | No | |
| created | No | Present when starting: whether this call created a new tracking. |
| message | Yes | |
| removed | No | Present when stopping. |
| tracking | Yes | True after a start/confirm; false after a stop. |
| already_tracked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark this as non-read-only and non-destructive; the description adds important behavioral context: monitoring continues on a schedule, it establishes history for get_changes, and a paid subscription is required. It also lays out the 7-day free trial terms, so an agent understands the commercial side effect 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?
The opening sentence names the action immediately, followed by precise usage guidance and prerequisite logic. Each sentence adds a distinct piece of information; no filler. The long subscription clause is justified because it determines whether the agent should call a different 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?
Combined with the output schema and annotations, the description covers purpose, when to use, subscription gate, fallback tool, and relationship to get_changes. Nothing an agent needs to decide between this and siblings 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 doesn't add much parameter-level detail; it only hints at scheduling and stopping, which the schema's enabled/cadence docs already cover. No compensation needed, but no extra value either.
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 action ('Start (or stop) ongoing monitoring') on a clear resource ('a website's AI visibility on a schedule'), and distinguishes itself from a one-off check. It also explicitly ties to sibling get_changes, making its role in the workflow unmistakable.
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 phrases ('monitor,' 'track,' 'watch,' 'get alerted about') and contrasts with 'rather than a one-off check.' It also provides a conditional alternative: if no Website Auditor subscription, call get_sample_audit first. This is strong, actionable routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
untrack_siteStop monitoringADestructive
Stop ongoing monitoring of a website's AI visibility. Use this when someone wants to "stop tracking," "unmonitor," "stop watching," or "remove" a site from scheduled monitoring, or to free up a monitoring slot. Idempotent — safe to call even if the site isn't currently tracked. Returns how many monitoring slots are now free. Requires a Website Auditor subscription ($10/month; eligible new customers get a 7-day free trial — payment method required, no charge until the trial ends) — if the user doesn't have one, call get_sample_audit first to show them the exact output format, free and with no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The website domain, e.g. "example.com". |
Output Schema
| Name | Required | Description |
|---|---|---|
| used | No | |
| limit | No | |
| domain | Yes | |
| message | Yes | |
| removed | Yes | |
| tracking | Yes | |
| remaining | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description builds on that by disclosing idempotence, the return value (number of slots freed), and the subscription prerequisite. It also explains the fallback behavior for users without a subscription, which is valuable beyond the structured 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 longer than average, but every sentence contributes: purpose, trigger phrases, idempotence, return value, subscription prerequisite, and alternative tool. The main action is front-loaded, and only the subscription/trial detail adds mild verbosity.
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 destructive, paid-gated tool, the description covers when to use it, what to tell the user about subscription, what happens if the site is not currently tracked, and what the result will be. An output schema exists and the description also mentions the return value, so no critical context 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?
The input schema has 100% coverage for the single required parameter, domain, with a clear example. The description does not add much domain-specific semantic detail beyond the schema, but none is needed given the schema's completeness.
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: "Stop ongoing monitoring of a website's AI visibility." It distinguishes itself from siblings like track_site and list_tracked_sites by clearly stating the reverse operation, and it provides natural-language triggers for when a user wants this action.
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 description explicitly says when to use the tool (“stop tracking,” “unmonitor,” “stop watching,” “remove” a site, free a slot) and provides an explicit alternative path: call get_sample_audit first if the user lacks a subscription. This is strong routing guidance.
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.
4 tool updates
v1.0.24- Changed
get_ai_visibility1 field changed- changed
Output schema / properties / trend / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "change_30d": { - "anyOf": [ - { - "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0" - }, - { - "type": "null" - } - ] - }, - "change_7d": { - "anyOf": [ - { - "additionalProperties": true, - "properties": { - "engine_changes": { - "items": { - "additionalProperties": true, - "properties": { - "delta": { - "type": "number" - }, - "engine": { - "type": "string" - }, - "from": { - "type": "number" - }, - "to": { - "type": "number" - } - }, - "required": [ - "engine", - "from", - "to", - "delta" - ], - "type": "object" - }, - "type": "array" - }, - "from_score": { - "type": "number" - }, - "score_delta": { - "type": "number" - }, - "snapshots": { - "description": "Snapshots that fell inside this window.", - "type": "number" - }, - "to_score": { - "type": "number" - }, - "window_days": { - "type": "number" - } - }, - "required": [ - "window_days", - "from_score", - "to_score", - "score_delta", - "engine_changes", - "snapshots" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "Null when fewer than two snapshots fall in the window." - }, - "includes_simulated": { - "description": "True if any analyzed snapshot was estimated rather than measured.", - "type": "boolean" - }, - "latest_captured_at": { - "type": "string" - }, - "snapshots_analyzed": { - "type": "number" - } - }, - "required": [ - "change_7d", - "change_30d", - "snapshots_analyzed", - "latest_captured_at", - "includes_simulated" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "change_30d": { + "anyOf": [ + { + "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0" + }, + { + "type": "null" + } + ] + }, + "change_7d": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "engine_changes": { + "items": { + "additionalProperties": true, + "properties": { + "delta": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + } + }, + "required": [ + "engine", + "from", + "to", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "from_captured_at": { + "description": "When the snapshot this window compares against was captured.", + "type": "string" + }, + "from_score": { + "type": "number" + }, + "score_delta": { + "type": "number" + }, + "skipped_snapshots": { + "description": "Snapshots in the window that were not compared: they asked a different question (another business name, market or queries), or do not record what they asked.", + "type": "number" + }, + "snapshots": { + "description": "Snapshots that fell inside this window.", + "type": "number" + }, + "to_score": { + "type": "number" + }, + "window_days": { + "type": "number" + } + }, + "required": [ + "window_days", + "from_score", + "to_score", + "score_delta", + "engine_changes", + "snapshots" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when the window holds no earlier snapshot that asked the same question as the latest." + }, + "includes_simulated": { + "description": "Always false: simulated snapshots are left out of the trend. Kept for clients that read it.", + "type": "boolean" + }, + "latest_captured_at": { + "type": "string" + }, + "question_note": { + "description": "Present when what the snapshots asked shaped the trend: no earlier snapshot asked the latest one's question, snapshots from the last 30 days were not compared, or the latest snapshot does not record what it asked. Relay it — a difference between scores that answered different questions is not a change in visibility.", + "type": "string" + }, + "snapshots_analyzed": { + "type": "number" + } + }, + "required": [ + "change_7d", + "change_30d", + "snapshots_analyzed", + "latest_captured_at", + "includes_simulated" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
get_changes8 fields changed- added
Output schema / properties / competitor_changes / descriptionAdded value: +"Always empty: AI-visibility snapshots record no competitors. Kept for clients that read it." - added
Output schema / properties / from_captured_atAdded value: +{ + "description": "When the earlier snapshot compared was captured.", + "type": "string" +} - added
Output schema / properties / new_issues / descriptionAdded value: +"Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it." - added
Output schema / properties / noteAdded value: +{ + "description": "Present when skipped_snapshots is above 0, when newer measured snapshots were left out of the series, or when newer weekly re-audits measured nothing of the business: which, and why, in words. Relay it.", + "type": "string" +} - added
Output schema / properties / resolved_issues / descriptionAdded value: +"Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it." - added
Output schema / properties / score_delta / descriptionAdded value: +"Only ever between two snapshots that asked the same question. When there is no such pair, including a re-baseline after the business name, market or queries changed, the tool returns NOT_YET_AVAILABLE saying so, never a number." - added
Output schema / properties / skipped_snapshotsAdded value: +{ + "description": "Snapshots passed over because they asked a different question (another business name, market or queries) or do not record what they asked.", + "type": "number" +} - added
Output schema / properties / to_captured_atAdded value: +{ + "description": "When the later one was.", + "type": "string" +}
- Changed
get_monitoring_status4 fields changed- changed
Output schema / properties / sites / items / properties / change / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "competitor_changes": { - "items": {}, - "type": "array" - }, - "engine_changes": { - "items": { - "additionalProperties": true, - "properties": { - "delta": { - "type": "number" - }, - "engine": { - "type": "string" - }, - "from": { - "type": "number" - }, - "to": { - "type": "number" - } - }, - "required": [ - "engine", - "from", - "to", - "delta" - ], - "type": "object" - }, - "type": "array" - }, - "new_issues": { - "items": {}, - "type": "array" - }, - "resolved_issues": { - "items": {}, - "type": "array" - }, - "score_delta": { - "type": "number" - } - }, - "required": [ - "score_delta", - "engine_changes", - "competitor_changes", - "new_issues", - "resolved_issues" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "competitor_changes": { + "description": "Always empty: AI-visibility snapshots record no competitors. Kept for clients that read it.", + "items": {}, + "type": "array" + }, + "engine_changes": { + "items": { + "additionalProperties": true, + "properties": { + "delta": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + } + }, + "required": [ + "engine", + "from", + "to", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "from_captured_at": { + "description": "When the earlier snapshot compared was captured.", + "type": "string" + }, + "new_issues": { + "description": "Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it.", + "items": {}, + "type": "array" + }, + "resolved_issues": { + "description": "Always empty: AI-visibility snapshots record no audit issues. Kept for clients that read it.", + "items": {}, + "type": "array" + }, + "score_delta": { + "type": "number" + }, + "skipped_snapshots": { + "description": "Snapshots passed over because they asked a different question (another business name, market or queries) or do not record what they asked.", + "type": "number" + }, + "to_captured_at": { + "description": "When the later one was.", + "type": "string" + } + }, + "required": [ + "score_delta", + "engine_changes", + "competitor_changes", + "new_issues", + "resolved_issues" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / sites / items / properties / change / descriptionPrevious value: -"Latest vs previous snapshot; null if fewer than two."New value: +"The latest change against the most recent earlier snapshot that asked the same question; null when there is none — no scored latest snapshot (the summary says why), a first snapshot, a re-baseline, or snapshots that do not record what they asked." - added
Output schema / properties / sites / items / properties / last_audited_at / descriptionAdded value: +"The date of the last scheduled run, stamped when the scheduler claims it and before the audit runs. It does not say how that run ended: it may still be going, or may have failed, been skipped or measured nothing of the business." - added
Output schema / properties / sites / items / properties / noteAdded value: +{ + "description": "Present when there is no like-for-like change because of a re-baseline or snapshots that do not record what they asked, or when snapshots were passed over: why, in words. Relay it.", + "type": "string" +}
- Changed
list_tracked_sites1 field changed- added
Output schema / properties / tracked / items / properties / last_audited_at / descriptionAdded value: +"The date of the last scheduled run, stamped when the scheduler claims it and before the audit runs. It does not say how that run ended: it may still be going, or may have failed, been skipped or measured nothing of the business."
15 tool updates
v1.0.23- Changed
check_upgrade_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "cancel_at_period_end": { + "type": "boolean" + }, + "current_period_end": { + "type": [ + "string", + "null" + ] + }, + "message": { + "type": "string" + }, + "status": { + "description": "Raw subscription status: active, trialing, canceled, none, …", + "type": "string" + }, + "tier": { + "description": "\"none\" | \"free\" | \"pro\".", + "type": "string" + }, + "upgrade_url": { + "type": "string" + } + }, + "required": [ + "tier", + "status", + "current_period_end", + "cancel_at_period_end", + "upgrade_url", + "message" + ], + "type": "object" +}
- Changed
compare_competitors2 fields changed- added
Input schema / properties / business_locationAdded value: +{ + "description": "Optional. The market to compare within, e.g. \"Chiang Mai, Thailand\". Applied to the site AND every competitor, because a comparison asks about one market — scoring one locally and the others globally would rank answers to two different questions. Leave it out and each audit detects its own location, which is right for national or global businesses and wrong for local ones.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "gaps": { + "description": "Engines where a competitor appears in AI answers and this site does not.", + "items": { + "additionalProperties": true, + "properties": { + "competitor": { + "type": "string" + }, + "engine": { + "type": "string" + } + }, + "required": [ + "engine", + "competitor" + ], + "type": "object" + }, + "type": "array" + }, + "market": { + "description": "The market every audit in this comparison was scored in, or null when each domain's own location was detected.", + "type": [ + "string", + "null" + ] + }, + "quota": { + "additionalProperties": true, + "properties": { + "audits_skipped": { + "description": "Competitors skipped because the daily quota ran out.", + "type": "number" + }, + "audits_used": { + "description": "Fresh audits actually spent by this call.", + "type": "number" + }, + "cached_reused": { + "description": "Domains served from a recent cached audit; cost no quota.", + "type": "number" + }, + "limit": { + "type": [ + "number", + "null" + ] + }, + "remaining": { + "type": [ + "number", + "null" + ] + }, + "reset": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "limit", + "remaining", + "audits_used", + "audits_skipped", + "cached_reused", + "reset" + ], + "type": "object" + }, + "ranking": { + "items": { + "additionalProperties": true, + "properties": { + "domain": { + "type": "string" + }, + "note": { + "type": "string" + }, + "score": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "domain", + "score" + ], + "type": "object" + }, + "type": "array" + }, + "skipped": { + "items": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "reason": { + "description": "\"quota\" | \"unreachable\" | \"error\".", + "type": "string" + } + }, + "required": [ + "domain", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "ranking", + "gaps", + "quota", + "skipped", + "summary", + "market" + ], + "type": "object" +}
- Changed
generate_schema1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "jsonld": { + "description": "The JSON-LD document, ready to paste into the site." + }, + "placement_notes": { + "description": "Where to put the snippet, e.g. \"in the <head> of every page\".", + "type": "string" + } + }, + "required": [ + "placement_notes" + ], + "type": "object" +}
- Changed
get_ai_visibility1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "appears_by_engine": { + "additionalProperties": true, + "description": "Whether the site appeared at all on each engine. Distinct from the scores: an engine can have appearances yet a low score, or the reverse. NULL when the engine was not scored — false would assert it did not name the business, which is a claim an unmeasured engine cannot support.", + "properties": { + "chatgpt": { + "type": [ + "boolean", + "null" + ] + }, + "claude": { + "type": [ + "boolean", + "null" + ] + }, + "gemini": { + "type": [ + "boolean", + "null" + ] + }, + "perplexity": { + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "chatgpt", + "perplexity", + "claude", + "gemini" + ], + "type": "object" + }, + "by_engine": { + "additionalProperties": true, + "description": "Per-engine AI-visibility score, 0–100. NULL means the engine was not scored — see engine_status for which of the two reasons. A null is NOT a zero: zero means the engine answered and never named the business.", + "properties": { + "chatgpt": { + "type": [ + "number", + "null" + ] + }, + "claude": { + "type": [ + "number", + "null" + ] + }, + "gemini": { + "type": [ + "number", + "null" + ] + }, + "perplexity": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "chatgpt", + "perplexity", + "claude", + "gemini" + ], + "type": "object" + }, + "coverage_note": { + "description": "Present exactly when an engine was asked and did not answer. Relay it: the score covers fewer engines than the four this tool can query.", + "type": "string" + }, + "engine_status": { + "additionalProperties": true, + "description": "Why each engine's score is what it is. 'scored' — the engine answered and the number is a measurement. 'unanswered' — it was asked and returned nothing, so there is no score; do not report it as 0. 'not_asked' — it was not part of this run at all.", + "properties": { + "chatgpt": { + "enum": [ + "scored", + "unanswered", + "not_asked" + ], + "type": "string" + }, + "claude": { + "enum": [ + "scored", + "unanswered", + "not_asked" + ], + "type": "string" + }, + "gemini": { + "enum": [ + "scored", + "unanswered", + "not_asked" + ], + "type": "string" + }, + "perplexity": { + "enum": [ + "scored", + "unanswered", + "not_asked" + ], + "type": "string" + } + }, + "required": [ + "chatgpt", + "perplexity", + "claude", + "gemini" + ], + "type": "object" + }, + "name_source": { + "description": "\"detected\" | \"user_supplied\" | \"domain_fallback\".", + "type": "string" + }, + "name_verified": { + "type": "boolean" + }, + "name_warning": { + "description": "Set ONLY when the business name behind the score could not be verified. The score is computed from queries built around that name, so relay this caveat rather than presenting the score as settled.", + "type": "string" + }, + "score": { + "description": "Overall AI-visibility score, 0–100.", + "type": "number" + }, + "sources": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "answers": { + "description": "Answers citing this domain — not citation entries.", + "type": "number" + }, + "domain": { + "type": "string" + }, + "ownership": { + "description": "\"yours\" | \"competitor\" | \"third_party\". Competitor rows are context, not targets.", + "type": "string" + }, + "platforms": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "domain", + "answers", + "platforms", + "ownership", + "url", + "title" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "summary": { + "type": "string" + }, + "top_competitor": { + "description": "The competitor appearing in place of the site, if any.", + "type": [ + "string", + "null" + ] + }, + "trend": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "change_30d": { + "anyOf": [ + { + "$ref": "#/properties/trend/anyOf/0/properties/change_7d/anyOf/0" + }, + { + "type": "null" + } + ] + }, + "change_7d": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "engine_changes": { + "items": { + "additionalProperties": true, + "properties": { + "delta": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + } + }, + "required": [ + "engine", + "from", + "to", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "from_score": { + "type": "number" + }, + "score_delta": { + "type": "number" + }, + "snapshots": { + "description": "Snapshots that fell inside this window.", + "type": "number" + }, + "to_score": { + "type": "number" + }, + "window_days": { + "type": "number" + } + }, + "required": [ + "window_days", + "from_score", + "to_score", + "score_delta", + "engine_changes", + "snapshots" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Null when fewer than two snapshots fall in the window." + }, + "includes_simulated": { + "description": "True if any analyzed snapshot was estimated rather than measured.", + "type": "boolean" + }, + "latest_captured_at": { + "type": "string" + }, + "snapshots_analyzed": { + "type": "number" + } + }, + "required": [ + "change_7d", + "change_30d", + "snapshots_analyzed", + "latest_captured_at", + "includes_simulated" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Pro only; null when unavailable — trend_note says why." + }, + "trend_note": { + "description": "Present exactly when trend is null: the reason.", + "type": "string" + } + }, + "required": [ + "score", + "by_engine", + "engine_status", + "appears_by_engine", + "top_competitor", + "summary", + "trend" + ], + "type": "object" +}
- Changed
get_benchmark1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "peer_median": { + "type": "number" + }, + "percentile": { + "description": "The domain's percentile within its industry/geo peer set, 0–100.", + "type": "number" + }, + "position_summary": { + "type": "string" + }, + "sample_size": { + "description": "How many peers the percentile and median are computed over.", + "type": "number" + } + }, + "required": [ + "percentile", + "peer_median", + "sample_size", + "position_summary" + ], + "type": "object" +}
- Changed
get_changes1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "competitor_changes": { + "items": {}, + "type": "array" + }, + "engine_changes": { + "items": { + "additionalProperties": true, + "properties": { + "delta": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + } + }, + "required": [ + "engine", + "from", + "to", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "new_issues": { + "items": {}, + "type": "array" + }, + "resolved_issues": { + "items": {}, + "type": "array" + }, + "score_delta": { + "type": "number" + } + }, + "required": [ + "score_delta", + "engine_changes", + "competitor_changes", + "new_issues", + "resolved_issues" + ], + "type": "object" +}
- Changed
get_gtm_plan1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "domain": { + "type": "string" + }, + "evidence_note": { + "description": "Additive, never an error: set when the plan had no citation evidence.", + "type": "string" + }, + "model": { + "type": "string" + }, + "plan": { + "additionalProperties": true, + "properties": { + "markdown": { + "type": "string" + }, + "phases": { + "description": "The same plan as `markdown`, cut into 30/60/90-day cards — a rendering, never extra content. An empty array means this plan was not written in card form: render `markdown` instead, and do not report it as a plan without actions. The key being absent means the plan came from a build that predates the cards, which is also not a claim about the plan.", + "items": { + "additionalProperties": true, + "properties": { + "actions": { + "description": "Empty for a phase the plan wrote as prose. That is a real plan with nothing cut into cards for this band, not a plan with nothing in it.", + "items": { + "additionalProperties": true, + "properties": { + "effort": { + "description": "The plan's own effort estimate, or null when it did not give one. Null means unknown — never render a substitute.", + "type": [ + "string", + "null" + ] + }, + "goal": { + "type": [ + "string", + "null" + ] + }, + "priority": { + "description": "Typically \"High\" or \"Medium\"; null when the plan gave none or gave one outside the two the engine keeps. Upstream text, so not an enum here.", + "type": [ + "string", + "null" + ] + }, + "steps": { + "description": "How to apply it, in order. May be empty.", + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "why": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "focus": { + "type": [ + "string", + "null" + ] + }, + "headline": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": "string" + }, + "phase": { + "description": "30, 60 or 90 — the day the band closes.", + "type": "number" + }, + "range": { + "description": "The band as the engine names it, e.g. \"Days 1–30\".", + "type": "string" + }, + "short": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "sections": { + "items": { + "additionalProperties": true, + "properties": { + "body_lines": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "markdown", + "sections" + ], + "type": "object" + }, + "sources_used": { + "items": { + "type": "string" + }, + "type": "array" + }, + "summary": { + "type": "string" + } + }, + "required": [ + "domain", + "plan", + "sources_used", + "model", + "summary" + ], + "type": "object" +}
- Changed
get_monitoring_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "limit": { + "type": "number" + }, + "remaining": { + "type": "number" + }, + "sites": { + "items": { + "additionalProperties": true, + "properties": { + "active": { + "type": "boolean" + }, + "cadence": { + "type": "string" + }, + "change": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "competitor_changes": { + "items": {}, + "type": "array" + }, + "engine_changes": { + "items": { + "additionalProperties": true, + "properties": { + "delta": { + "type": "number" + }, + "engine": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + } + }, + "required": [ + "engine", + "from", + "to", + "delta" + ], + "type": "object" + }, + "type": "array" + }, + "new_issues": { + "items": {}, + "type": "array" + }, + "resolved_issues": { + "items": {}, + "type": "array" + }, + "score_delta": { + "type": "number" + } + }, + "required": [ + "score_delta", + "engine_changes", + "competitor_changes", + "new_issues", + "resolved_issues" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Latest vs previous snapshot; null if fewer than two." + }, + "domain": { + "type": "string" + }, + "last_audited_at": { + "type": [ + "string", + "null" + ] + }, + "latest_score": { + "type": [ + "number", + "null" + ] + }, + "next_run_at": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": "string" + } + }, + "required": [ + "domain", + "latest_score", + "change", + "summary" + ], + "type": "object" + }, + "type": "array" + }, + "summary": { + "type": "string" + }, + "used": { + "type": "number" + } + }, + "required": [ + "limit", + "used", + "remaining", + "sites", + "summary" + ], + "type": "object" +}
- Changed
get_recommendations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "recommendations": { + "items": { + "additionalProperties": true, + "properties": { + "action": { + "type": "string" + }, + "effort": { + "type": "string" + }, + "expected_impact": { + "type": "string" + }, + "why": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "recommendations" + ], + "type": "object" +}
- Changed
get_report1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "badge_html": { + "type": "string" + }, + "report_url": { + "type": "string" + } + }, + "required": [ + "report_url", + "badge_html" + ], + "type": "object" +}
- Changed
get_sample_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "audit": { + "additionalProperties": true, + "description": "A real GET /api/audit payload, populated with sample data.", + "properties": { + "ai_visibility": {}, + "base_url": { + "type": "string" + }, + "results": { + "items": {}, + "type": "array" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "summary": {} + }, + "type": "object" + }, + "domain": { + "description": "The fixed sample domain. Never the caller's own.", + "type": "string" + }, + "is_sample": { + "const": true, + "description": "Always true. Never present this as a live result.", + "type": "boolean" + }, + "note": { + "type": "string" + }, + "price": { + "type": "string" + }, + "upgrade_url": { + "type": "string" + } + }, + "required": [ + "is_sample", + "domain", + "note", + "audit", + "price", + "upgrade_url" + ], + "type": "object" +}
- Changed
list_tracked_sites1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "limit": { + "type": "number" + }, + "remaining": { + "type": "number" + }, + "summary": { + "type": "string" + }, + "tracked": { + "items": { + "additionalProperties": true, + "properties": { + "active": { + "type": "boolean" + }, + "cadence": { + "type": "string" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "digest_enabled": { + "type": "boolean" + }, + "domain": { + "type": "string" + }, + "last_audited_at": { + "type": [ + "string", + "null" + ] + }, + "next_run_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "domain" + ], + "type": "object" + }, + "type": "array" + }, + "used": { + "type": "number" + } + }, + "required": [ + "limit", + "used", + "remaining", + "tracked", + "summary" + ], + "type": "object" +}
- Changed
run_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "name_warning": { + "description": "Set ONLY when the business name could not be verified, which puts the AI-visibility score in question.", + "type": "string" + }, + "report_url": { + "type": "string" + }, + "scores": { + "additionalProperties": true, + "properties": { + "ai_visibility": { + "type": [ + "number", + "null" + ] + }, + "performance": { + "type": [ + "number", + "null" + ] + }, + "security": { + "type": [ + "number", + "null" + ] + }, + "seo": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "ai_visibility", + "seo", + "security", + "performance" + ], + "type": "object" + }, + "top_issues": { + "items": { + "additionalProperties": true, + "properties": { + "details": { + "type": "string" + }, + "module": { + "type": "string" + }, + "name": { + "type": "string" + }, + "recommendation": { + "type": "string" + }, + "severity": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "severity" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "scores", + "top_issues", + "report_url" + ], + "type": "object" +}
- Changed
track_site1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "already_tracked": { + "type": "boolean" + }, + "cadence": { + "type": "string" + }, + "created": { + "description": "Present when starting: whether this call created a new tracking.", + "type": "boolean" + }, + "domain": { + "type": "string" + }, + "message": { + "type": "string" + }, + "removed": { + "description": "Present when stopping.", + "type": "boolean" + }, + "tracking": { + "description": "True after a start/confirm; false after a stop.", + "type": "boolean" + } + }, + "required": [ + "domain", + "tracking", + "message" + ], + "type": "object" +}
- Changed
untrack_site1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "domain": { + "type": "string" + }, + "limit": { + "type": "number" + }, + "message": { + "type": "string" + }, + "remaining": { + "type": "number" + }, + "removed": { + "type": "boolean" + }, + "tracking": { + "type": "boolean" + }, + "used": { + "type": "number" + } + }, + "required": [ + "domain", + "tracking", + "removed", + "message" + ], + "type": "object" +}
1 tool update
v1.0.20- Added
get_gtm_plan
3 tool updates
v1.0.15- Changed
get_ai_visibility2 fields changed- added
Input schema / properties / business_locationAdded value: +{ + "description": "Optional. The city the business trades in, e.g. \"Hilo, HI\". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one.", + "type": "string" +} - added
Input schema / properties / business_nameAdded value: +{ + "description": "Optional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known.", + "type": "string" +}
- Added
get_sample_audit - Changed
run_audit2 fields changed- added
Input schema / properties / business_locationAdded value: +{ + "description": "Optional. The city the business trades in, e.g. \"Hilo, HI\". Leave it out and the audit detects it; when nothing is detectable the questions widen to the country or drop the place entirely, which is right for a national or global business and wrong for a local one.", + "type": "string" +} - added
Input schema / properties / business_nameAdded value: +{ + "description": "Optional. The business's real name, if you know it. Leave it out and the audit detects the name from the site and flags it when unverified — a guessed name is scored as if confirmed, so supply one only when it is actually known.", + "type": "string" +}
13 tool updates
v1.0.6- First observed
check_upgrade_status - First observed
compare_competitors - First observed
generate_schema - First observed
get_ai_visibility - First observed
get_benchmark - First observed
get_changes - First observed
get_monitoring_status - First observed
get_recommendations - First observed
get_report - First observed
list_tracked_sites - First observed
run_audit - First observed
track_site - First observed
untrack_site
TDQS
Scored across 15 tools
Each tool has a clearly distinct purpose, from running an audit to generating schema or checking subscription status. Even potentially overlapping tools like get_changes and get_monitoring_status are differentiated by their descriptions (specific snapshot comparison vs. dashboard view), so an agent can reliably select the right one.
Naming is a mix of get_ (e.g., get_ai_visibility, get_report), action verbs (run_audit, track_site, untrack_site, compare_competitors, generate_schema, check_upgrade_status), and list_ (list_tracked_sites). While readable, there is no single consistent verb-noun pattern across the set, which could cause minor confusion about tool grouping.
With 15 tools, the server covers the full scope of website auditing, monitoring, and related actions without being overwhelming. Each tool serves a clear purpose in the domain, and the count falls within the ideal range for a specialized server.
The tool surface appears comprehensive for the domain: it includes audit execution, AI visibility checks, monitoring management, competitor comparison, benchmarking, recommendations, schema generation, reporting, a sample audit, and subscription status. No obvious critical operations are missing, and even start/stop tracking is handled via track_site/untrack_site.
Maintenance
Related MCP Connectors
- VibeSEOOAuthdev.vibeseo
SEO research, audits, backlinks, GSC, and content workflow tools for AI agents.
AEO audit: score any website 0-100 for AI visibility. Checks schema, meta, content, AI crawlers.
Scan any website's AI readiness: AI search visibility and AI agent usability. Free, no auth.
Audit any website for AI visibility: graded report, findings with fixes, AI crawler access check.
Related MCP Servers
AlicenseAqualityCmaintenanceLets any AI agent audit any website for SEO, GEO/AEO, and speed problems, reporting issues and recommendations without modifying the site.4MIT- AlicenseNot gradedqualityCmaintenanceEnables AI agents to perform instant SEO audits, check robots.txt, sitemaps, and AI crawler access for any URL without API keys.MIT
- AlicenseAqualityBmaintenanceProvides tools for AI agents to audit websites, including stack detection, DNS snapshots, and security checks.811 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables auditing AI search visibility: checks site readiness for AI crawlers and measures whether ChatGPT, Gemini, and Perplexity recommend your site, including verbatim answers and citation gap analysis.89 npm4AGPL 3.0