Skip to main content
Glama

SiteVerdict — Website Audit Tools (MCP server)

Website audit tools for AI agents. Ask Claude, ChatGPT, Cursor or any MCP client to "audit my website and tell me what to fix first". It runs real browser-based checks and returns a ranked fix plan:

Tool

What it checks

full_website_audit

Runs every check below in parallel, then returns an overall score, an executive summary and one prioritised fix list

audit_tracking_consent

Cookie consent and GDPR / UK GDPR / PECR: tags that fire before consent or after "Reject", tracking cookies, Google Consent Mode v2, broken GA4/GTM tags, duplicate page_views

scan_speed_and_revenue

Core Web Vitals (LCP, INP, CLS, TTFB), page weight and bottlenecks, plus an estimate of revenue lost to slow pages if you give traffic and order value

audit_accessibility_wcag

WCAG 2.2 A/AA/AAA (axe-core), mapped to success criteria and to the European Accessibility Act / EN 301 549

check_domain_email_health

MX, SPF, DKIM, DMARC, BIMI, MTA-STS, DNSSEC, CAA, TLS expiry, spoofing risk and Gmail/Yahoo bulk-sender gaps

check_ai_search_readiness

Can ChatGPT, Perplexity and Google AI Overviews read and cite you? Covers robots.txt AI bots, llms.txt, schema.org, rendering, canonical tags and sitemap

get_audit_results

Collects the results of a long scan that was still running, at no extra cost

Prompts: website_fix_plan, cookie_consent_check, prelaunch_check. Resources: siteverdict://checks, siteverdict://guide/scoring.

How billing works

Each check is an Apify Actor. The server runs it on your own Apify account using your APIFY_TOKEN, and Apify bills you directly at its pay-per-event price. This server has no payments, no accounts and no stored data.

  • Every run has a spend cap (maxTotalChargeUsd, default $2, configurable per call with maxCostUsd).

  • If you cancel a tool call, the Apify run is aborted, so you stop paying.

  • You can see run costs in your Apify console.

Get a token at https://console.apify.com/settings/integrations. To try the tools without a token, set SITEVERDICT_DRY_RUN=1. Every result is then built-in sample data and is clearly labelled.

Related MCP server: Seonix SEO MCP

Install

Requires Node.js 20+. Replace apify_api_xxx with your token.

Claude Code

claude mcp add --env APIFY_TOKEN=apify_api_xxx --transport stdio siteverdict -- npx -y @siteverdict/mcp

Claude Desktop

Go to Settings → Developer → Edit Config (claude_desktop_config.json):

{
  "mcpServers": {
    "siteverdict": {
      "command": "npx",
      "args": ["-y", "@siteverdict/mcp"],
      "env": { "APIFY_TOKEN": "apify_api_xxx" }
    }
  }
}

You can also install the one-click .mcpb bundle from the Releases page. Claude Desktop asks for your token and stores it securely.

Cursor

Add this to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "siteverdict": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@siteverdict/mcp"],
      "env": { "APIFY_TOKEN": "${env:APIFY_TOKEN}" }
    }
  }
}

VS Code (GitHub Copilot agent mode)

Add this to .vscode/mcp.json. VS Code prompts for the token once and stores it encrypted:

{
  "inputs": [
    { "type": "promptString", "id": "apify-token", "description": "Apify API token", "password": true }
  ],
  "servers": {
    "siteverdict": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@siteverdict/mcp"],
      "env": { "APIFY_TOKEN": "${input:apify-token}" }
    }
  }
}

Or run: code --add-mcp '{"name":"siteverdict","command":"npx","args":["-y","@siteverdict/mcp"],"env":{"APIFY_TOKEN":"${input:apify-token}"}}'

Windsurf / Devin Desktop

Add this to ~/.codeium/windsurf/mcp_config.json. Newer builds use ~/.config/devin/mcp_config.json, or %APPDATA%\devin\mcp_config.json on Windows:

{
  "mcpServers": {
    "siteverdict": {
      "command": "npx",
      "args": ["-y", "@siteverdict/mcp"],
      "env": { "APIFY_TOKEN": "${env:APIFY_TOKEN}" }
    }
  }
}

Cline

Install from the Cline MCP Marketplace once the listing is live, or add this to cline_mcp_settings.json:

{
  "mcpServers": {
    "siteverdict": {
      "command": "npx",
      "args": ["-y", "@siteverdict/mcp"],
      "env": { "APIFY_TOKEN": "apify_api_xxx" },
      "disabled": false,
      "autoApprove": []
    }
  }
}

OpenAI Codex CLI

codex mcp add siteverdict --env APIFY_TOKEN=apify_api_xxx -- npx -y @siteverdict/mcp

Or add this to ~/.codex/config.toml:

[mcp_servers.siteverdict]
command = "npx"
args = ["-y", "@siteverdict/mcp"]
tool_timeout_sec = 600

[mcp_servers.siteverdict.env]
APIFY_TOKEN = "apify_api_xxx"

Scans can take a few minutes, so raise tool_timeout_sec from its default of 60.

Gemini CLI

gemini mcp add -e APIFY_TOKEN=apify_api_xxx siteverdict npx -y @siteverdict/mcp

ChatGPT and Claude (remote connector with OAuth)

These clients need a remote HTTPS URL. The server ships remote mode with OAuth 2.1: CIMD/DCR client registration, PKCE, and a sign-in page where you paste your own Apify token. It also has a ChatGPT/MCP Apps score-card UI. Once the owner deploys it, add https://mcp.webrevenuescan.com/mcp as a custom connector, or /mcp/<toolsets> such as /mcp/web+compliance. Design and deploy steps: docs/REMOTE.md. Not deployed yet.

Docker

docker run -i --rm -e APIFY_TOKEN=apify_api_xxx mcp/siteverdict

Remote / Streamable HTTP (self-hosted)

SITEVERDICT_HTTP_HOST=127.0.0.1 SITEVERDICT_HTTP_PORT=3333 npx -y @siteverdict/mcp --http
# endpoint: http://127.0.0.1:3333/mcp   health: /healthz
# each user sends their own token:  X-Apify-Token: apify_api_xxx   (or Authorization: Bearer apify_api_xxx)
claude mcp add --transport http siteverdict http://127.0.0.1:3333/mcp --header "X-Apify-Token: apify_api_xxx"

The server binds to localhost by default and validates Host and Origin. To serve it publicly, put it behind TLS and set SITEVERDICT_ALLOWED_HOSTS and SITEVERDICT_ALLOWED_ORIGINS.

Toolsets (keep the tool list small)

The default is web: the 7 audit tools plus detect_tech_stack, monitor_website_changes, fetch_clean_markdown and get_run_results. To add more groups:

npx -y @siteverdict/mcp --toolsets web,compliance        # or SITEVERDICT_TOOLSETS=all
npx -y @siteverdict/mcp --tools sanctions_screen,uk_property_data   # explicit allow-list

Toolset

Tools

web

full_website_audit, audit_tracking_consent, scan_speed_and_revenue, audit_accessibility_wcag, check_domain_email_health, check_ai_search_readiness, get_audit_results, detect_tech_stack, monitor_website_changes, fetch_clean_markdown

marketing

seo_rank_check, search_traffic_diagnose, google_ads_transparency, reviews_monitor

leads

find_local_businesses, company_registry_lookup, sec_filing_watch, sec_full_text_search, find_public_tenders, detect_tech_stack

compliance

sanctions_screen, validate_vat_or_company_number, extract_pdf_invoice, company_registry_lookup

travel

flight_fare_scan, flight_fare_estimate, flight_deal_alerts, check_flight_compensation, visa_entry_check

property

uk_property_data

Some data tools can use your own third-party keys:

  • stdio: SITEVERDICT_SECRET_<NAME> env vars

  • HTTP: X-SiteVerdict-Secret-<Name> headers

Examples are COMPANIES_HOUSE_API_KEY, HMRC_CLIENT_ID, GOOGLE_MAPS_API_KEY, SERPAPI_API_KEY and EPC_API_TOKEN. The siteverdict://tools resource lists them all. Keys are never tool arguments and never appear in results. Without them, the tool uses the Actor's clearly labelled sample mode or format-only checks.

Full generated table: marketplace/tools.md.

Example prompts

  • "Audit https://example.com and give me a fix plan for this week."

  • "Is my cookie banner on example.co.uk GDPR-compliant? Does anything track before consent?"

  • "How much revenue is my slow mobile site losing? I get 40k visits a month, a 2% conversion rate and a £70 average order."

  • "Check example.com against WCAG 2.2 AA and tell me what the European Accessibility Act means for us."

  • "Can people spoof email from our domain? Check SPF, DKIM and DMARC for example.com."

  • "Will ChatGPT and Perplexity cite our site? Check AI-search readiness."

Configuration

Variable

Default

Purpose

APIFY_TOKEN

—

Your Apify token (stdio mode)

SITEVERDICT_DRY_RUN

0

1 returns sample data with no Apify calls

SITEVERDICT_DEFAULT_MAX_CHARGE_USD

2

Spend cap per Actor run

SITEVERDICT_DEFAULT_WAIT_SECS / SITEVERDICT_MAX_WAIT_SECS

240 / 900

How long a call waits before returning running plus a runId

SITEVERDICT_RATE_LIMIT_PER_MINUTE

20

Tool calls per minute per client

SITEVERDICT_MAX_CONCURRENT_RUNS

6

Concurrent Actor runs per client

SITEVERDICT_APIFY_USERNAME

from brand.json

Apify account that owns the Actors

SITEVERDICT_ACTOR_TRACKING_CONSENT, ..._SPEED_REVENUE, ..._ACCESSIBILITY, ..._DOMAIN_EMAIL, ..._AI_SEARCH

<username>/siteverdict-…

Override individual Actor IDs

SITEVERDICT_DNS_CHECK

1

Resolve hostnames and reject private addresses (SSRF guard)

SITEVERDICT_HTTP_HOST / _PORT / _PATH

127.0.0.1 / 3333 / /mcp

HTTP mode

SITEVERDICT_ALLOWED_HOSTS / _ORIGINS

localhost

Comma lists for public HTTP deployments

Safety

  • Read-only. No tool changes your site. Every tool is annotated readOnlyHint: true, destructiveHint: false, openWorldHint: true.

  • Public targets only. Private, loopback, link-local, CGNAT, cloud-metadata and reserved IPs, internal hostnames, non-http(s) schemes, credentials in URLs and odd ports are all rejected. Hostnames that resolve to private addresses are rejected too.

  • Tokens stay with Apify. Tokens are sent only to api.apify.com in an Authorization header. They are never logged and never placed in URLs.

  • Limits. Calls are rate-limited and concurrent runs are capped per client. Every run has a spend cap. Cancelling a call aborts its run.

Development

npm install
npm run typecheck && npm run lint && npm test   # unit + integration tests (mocked Apify, no network)
npm run smoke                                   # builds, then drives dist/cli.js over real stdio
npm run inspector                               # MCP Inspector UI against the dry-run server
SITEVERDICT_DRY_RUN=1 npm run dev               # stdio from source

To rename the brand, edit brand.json and run npm run brand:sync.

Built on the official MCP TypeScript SDK v2 (@modelcontextprotocol/server). It serves both the 2026-07-28 protocol and 2025-era clients.

Privacy & terms

See PRIVACY.md and TERMS.md. Both are drafts until reviewed. Support: GitHub issues.

Available Tools

11 tools
audit_accessibility_wcagAudit accessibility (WCAG 2.2 / European Accessibility Act)A
Read-only
Inspect

Crawls pages in a real browser and runs axe-core WCAG 2.2 checks (A/AA/AAA), mapping issues to WCAG success criteria and EN 301 549 / European Accessibility Act duties. Returns a score, issue counts by impact, the affected pages and concrete code-level fixes, plus a full-report link. Automated testing finds a subset of WCAG issues; it does not replace a manual audit. Runs on the caller's own Apify account (APIFY_TOKEN) and is billed by Apify pay-per-event; nothing is charged by this server.

NameRequiredDescriptionDefault
urlYesPublic website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected.
maxPagesNoPages to crawl on the same host.
waitSecsNoHow long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240.
wcagLevelNoConformance level to test against (AA is the legal baseline in most regions).AA
maxCostUsdNoSpend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2).
includeBestPracticesNoAlso report axe "best-practice" rules that are not strict WCAG failures.

Output Schema

NameRequiredDescription
runYes
checkYes
gradeYes
scoreYes
dryRunYestrue = sample data from the built-in mock, NOT a real scan
statusYes"running" = the Actor is still working; call get_audit_results with run.runId later
targetYes
metricsYes
summaryYes
findingsYes
reportUrlNoFull report (HTML/JSON) in the Apify key-value store
datasetUrlNo
findingsTotalYes
severityCountsYes

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/non-destructive/non-idempotent, and the description layers substantial additional context on top: execution happens in a real headless browser, results can come back asynchronously as 'running' with a runId, and there is a billing/auth model (caller's own APIFY_TOKEN, Apify pay-per-event, nothing charged by this server). It also discloses the tool's accuracy limitation, which an agent needs in order to interpret results responsibly.

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

Conciseness5/5

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

Four sentences, front-loaded with the action and then descending into output, limitations, and billing/auth. Each sentence carries distinct, non-redundant information and nothing repeats the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return fields, and it still summarizes them (score, impact counts, pages, code-level fixes, report link). Combined with disclosed auth/billing, async behavior, and scope limits, an agent has everything needed to call this correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including the enum on wcagLevel and the spend cap is already documented in structured form. The description adds no parameter-level detail beyond the schema (e.g. it never explains maxPages or maxCostUsd trade-offs), so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Crawls pages in a real browser and runs axe-core WCAG 2.2 checks'), names the conformance standards (WCAG 2.2 A/AA/AAA, EN 301 549, EAA) and what it returns. This is clearly distinguishable from siblings like full_website_audit or scan_speed_and_revenue, which address different audit dimensions.

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

Usage Guidelines3/5

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

The use context (accessibility/legal compliance auditing) is implied strongly, and there is a useful caveat that automated testing covers only a subset of WCAG issues and does not replace a manual audit. However, no sibling alternatives are named and no explicit when-to-use/when-not routing is given, e.g. versus full_website_audit or when to follow up with get_audit_results (only the schema hints at that).

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

check_ai_search_readinessCheck AI-search readiness (ChatGPT, Perplexity, Google AI Overviews)A
Read-only
Inspect

Checks whether AI assistants and AI search engines can find, read and cite the site: robots.txt rules for GPTBot/ClaudeBot/PerplexityBot/Google-Extended, llms.txt, structured data (schema.org), server-rendered content, meta/canonical tags and sitemap. Returns a readiness score and prioritised fixes. Runs on the caller's own Apify account (APIFY_TOKEN) and is billed by Apify pay-per-event; nothing is charged by this server.

NameRequiredDescriptionDefault
urlYesPublic website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected.
maxPagesNoPages to sample for content/structured-data checks.
waitSecsNoHow long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240.
maxCostUsdNoSpend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2).

Output Schema

NameRequiredDescription
runYes
checkYes
gradeYes
scoreYes
dryRunYestrue = sample data from the built-in mock, NOT a real scan
statusYes"running" = the Actor is still working; call get_audit_results with run.runId later
targetYes
metricsYes
summaryYes
findingsYes
reportUrlNoFull report (HTML/JSON) in the Apify key-value store
datasetUrlNo
findingsTotalYes
severityCountsYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover read-only/destructive/open-world, and the description adds genuinely new operational context: execution happens on the caller's own Apify account via APIFY_TOKEN, billing is pay-per-event through Apify, and the server itself charges nothing. It also discloses the async escape hatch (status 'running' plus a runId) rather than failing, which an agent must plan for.

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

Conciseness5/5

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

Two sentences, both dense with information: the first front-loads scope, the second front-loads the cost/ownership model and the async fallback. No restatement of the title and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be spelled out, yet the description still summarizes them (readiness score plus prioritised fixes). Combined with billing, auth source, timeout behavior, and the follow-up tool reference, nothing essential for a correct first call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters — including the maxCostUsd spend cap and waitSecs timeout behavior — are already documented in the schema. The description adds billing framing but no parameter-level semantics beyond what the schema provides, so the baseline applies.

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

Purpose5/5

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

States a specific verb ('Checks whether AI assistants and AI search engines can find, read and cite') plus the exact artifacts inspected (robots.txt for GPTBot/ClaudeBot/PerplexityBot/Google-Extended, llms.txt, schema.org, sitemap). This is clearly distinguishable from siblings like audit_accessibility_wcag or scan_speed_and_revenue without opening any schema.

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

Usage Guidelines4/5

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

The listed checks establish the use case clearly and the description routes the agent to get_audit_results when the wait window expires ('the scan keeps going; use get_audit_results'). It does not, however, say when to prefer this over overlapping siblings such as full_website_audit, so there is no explicit when-not guidance.

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

check_domain_email_healthCheck domain & email health (SPF, DKIM, DMARC, TLS, DNS)A
Read-only
Inspect

Checks a domain's email authentication and deliverability setup (MX, SPF, DKIM, DMARC policy, BIMI, MTA-STS/TLS-RPT), DNS hygiene (DNSSEC, CAA, nameservers) and HTTPS/TLS certificate expiry. Flags spoofing risk and Gmail/Yahoo bulk-sender requirement gaps with exact DNS records to add. Runs on the caller's own Apify account (APIFY_TOKEN) and is billed by Apify pay-per-event; nothing is charged by this server.

NameRequiredDescriptionDefault
domainYesDomain name, e.g. "example.com" (a URL or email address is accepted and reduced to its domain).
waitSecsNoHow long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240.
maxCostUsdNoSpend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2).
dkimSelectorsNoOptional DKIM selectors to test (e.g. "google", "selector1"). Common selectors are tried automatically.

Output Schema

NameRequiredDescription
runYes
checkYes
gradeYes
scoreYes
dryRunYestrue = sample data from the built-in mock, NOT a real scan
statusYes"running" = the Actor is still working; call get_audit_results with run.runId later
targetYes
metricsYes
summaryYes
findingsYes
reportUrlNoFull report (HTML/JSON) in the Apify key-value store
datasetUrlNo
findingsTotalYes
severityCountsYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish read-only, non-destructive, open-world behavior, but the description adds important operational context: it runs on the caller's own Apify account via APIFY_TOKEN and incurs Apify pay-per-event billing. It also explains that the tool returns actionable findings with exact DNS records to add, going 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.

Conciseness5/5

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

The definition is front-loaded with what is checked, followed by outcome value and billing/auth context. Every sentence contributes distinct information, and the parenthetical lists are dense but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, existing output schema, and annotations, the description covers the remaining gaps an agent needs: domain scope, billing/auth implications, and the actionable spoofing/bulk-sender findings. Return-value and async wait behavior are handled by the schema and output schema rather than needing repetition here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all four parameters are already well documented in the input schema, including examples and constraints. The description adds no parameter-specific syntax or format details beyond what the schema provides, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource: checking a domain's email authentication, deliverability, DNS hygiene, and TLS setup. It enumerates the exact checks (MX, SPF, DKIM, DMARC, BIMI, MTA-STS/TLS-RPT, DNSSEC, CAA, nameservers), making it clearly distinct from sibling website-audit tools.

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

Usage Guidelines3/5

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

The description implies when the tool is useful by naming spoofing risk and Gmail/Yahoo bulk-sender gaps, but it does not explicitly say when to use this versus siblings such as full_website_audit or scan_speed_and_revenue. There are no exclusions or explicit alternative-routing instructions.

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

detect_tech_stackDetect website technology stackA
Read-only
Inspect

Detects the technology stack of one or many websites from public signals: homepage HTML, script/stylesheet URLs, HTTP headers, cookie names, public DNS (MX, SPF, DMARC, NS, CNAME), TLS issuer and robots.txt. Returns per site the technologies found (category, confidence 0-100, version, evidence) plus convenience fields cms, ecommerce, analytics, advertising, hosting, cdn, emailProviders and dnsProvider. Covers 1,000+ technologies (CMS, ecommerce and Shopify apps, analytics, tag managers, ad pixels, consent tools, CRM, chat, payments, CDN, hosting, email providers). Filters build lists such as "Shopify stores not using Klaviyo" (onlySitesUsing / excludeSitesUsing). mode "http" (default) is fast and cheap; "browser" also catches tags injected by tag managers. Respects robots.txt and never bypasses bot protection: blocked sites return status "blocked" and are not charged. It analyses only the sites you pass; it cannot list every site using a technology. Runs an Apify Actor on the caller's own Apify account (billed by Apify pay-per-event, capped per run).

NameRequiredDescriptionDefault
modeNo"browser" renders in headless Chrome (more tags, costs more). Prefer http.http
urlsYesDomains or URLs, e.g. ["example.com", "https://shop.example.co.uk"]
checkDnsNoLook up MX/NS/SPF/DMARC records to detect the email and DNS providers.
checkTlsNoRead the TLS certificate issuer and expiry date.
matchAllNoonlySitesUsing must ALL match (default: any).
extraPathsNoExtra paths per site, e.g. ["/pricing", "/cart"]
minConfidenceNoDrop detections below this confidence (0-100).
onlyCategoriesNoKeep only these categories, e.g. ["Booking & scheduling"]
onlySitesUsingNoKeep only sites using these technologies, e.g. ["Shopify"]
includeEvidenceNoInclude evidence strings (more tokens).
excludeSitesUsingNoDrop sites using these, e.g. ["Klaviyo"]

Output Schema

NameRequiredDescription
runYes
toolYes
itemsYesResult records (trimmed for context). Records often carry a recordType discriminator.
notesYes
dryRunYestrue = built-in SAMPLE data from this server, NOT a real lookup
statusYes"running" = still working; call get_run_results with run.runId later
summaryYes
truncatedYestrue = more records exist than are included here (see datasetUrl)
datasetUrlNo
disclaimerNo
itemsTotalYes
sampleDataYestrue = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real

TDQS

A4.6/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, it discloses cost behavior (Apify pay-per-event, capped per run), that blocked sites are not charged, that robots.txt is respected and bot protection is never bypassed, and that includeEvidence costs tokens. Those are exactly the operational facts an agent needs before spending money on a run.

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

Conciseness4/5

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

The capability statement is front-loaded and the paragraph is dense with operational facts rather than filler. The middle sentence enumerating output convenience fields is somewhat list-heavy, but it is scoped to a single paragraph and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, open-world, billed scrapter-style tool, the description covers inputs, output shape (even though an output schema exists), cost, rate/blocking behavior, and the hard capability limit. An agent has everything needed to decide and call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns a bump by explaining how onlySitesUsing/excludeSitesUsing combine to build filtered lists and by framing mode as a coverage-vs-cost choice. It still doesn't add syntax or interaction detail for checkDns/checkTls/minConfidence beyond what the schema states.

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

Purpose5/5

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

Opens with a specific verb+resource ('Detects the technology stack of one or many websites') and immediately enumerates the exact signals used: homepage HTML, script/stylesheet URLs, headers, cookies, DNS records, TLS issuer, robots.txt. This is clearly distinguishable from siblings like check_domain_email_health or audit_tracking_consent, which cover narrower slices.

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

Usage Guidelines4/5

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

Gives concrete when-to-use guidance for the mode tradeoff ('http' fast/cheap vs 'browser' catches tag-manager-injected tags) and a when-not statement: 'It analyses only the sites you pass; it cannot list every site using a technology.' It also shows a real filtering workflow ("Shopify stores not using Klaviyo"). It does not name any sibling tool as an alternative, which keeps it short of a 5.

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

fetch_clean_markdownFetch web pages as clean Markdown with citationsA
Read-only
Inspect

Fetches public web pages and returns their main content as clean Markdown (no menus, ads, cookie banners or footers), plus title, author, published/modified dates, language, canonical URL, a heading outline and a ready-made citation. Tables stay Markdown tables; code blocks keep their language. Use it to read, quote or summarise a page or load documentation; cite citation.url. chunk:true returns heading-aware chunks for long pages; mode "sitemap"/"crawl" (with maxPages, includeGlobs like "/docs/**") reads several pages of one site; rendering "auto" only if a page comes back nearly empty. Respects publishers: obeys robots.txt, never bypasses paywalls, logins, CAPTCHAs or bot protection, honours noai/TDM opt-outs — such pages return status "blocked"/"paywalled" with a reason and NO content; do not retry them by other means. Runs an Apify Actor on the caller's own Apify account (billed by Apify pay-per-event, capped per run).

NameRequiredDescriptionDefault
modeNo"urls" fetches the given pages; "sitemap" or "crawl" reads several pages of one site.urls
urlsYesPage URLs (or site / sitemap URLs for mode sitemap/crawl).
chunkNoReturn heading-aware chunks for long pages (for RAG).
maxDepthNoHow many links deep to follow in crawl mode.
maxPagesNoCap for sitemap/crawl modes.
chunkSizeNoTarget chunk size in tokens when chunk is true.
renderingNo"http" is fastest; use "auto" only if a page comes back nearly empty.http
chunkOverlapNoTokens of overlap between chunks.
excludeGlobsNoURL patterns to skip, e.g. "/blog/tag/**".
includeGlobsNoe.g. ["/docs/**"]
includeLinksNoKeep hyperlinks in the Markdown (false = fewer tokens).
includeImagesNoKeep image links in the Markdown.
contentSelectorNoOptional CSS selector to force the content region.
maxCharsPerPageNoServer-side truncation of markdown per page; truncatedForAgent=true when cut.

Output Schema

NameRequiredDescription
runYes
toolYes
itemsYesResult records (trimmed for context). Records often carry a recordType discriminator.
notesYes
dryRunYestrue = built-in SAMPLE data from this server, NOT a real lookup
statusYes"running" = still working; call get_run_results with run.runId later
summaryYes
truncatedYestrue = more records exist than are included here (see datasetUrl)
datasetUrlNo
disclaimerNo
itemsTotalYes
sampleDataYestrue = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover safety profile (readOnly, openWorld, non-idempotent, non-destructive); the description adds the behavior an agent actually needs: robots.txt obedience, no paywall/login/CAPTCHA bypass, noai/TDM opt-outs, terminal statuses 'blocked'/'paywalled' with a reason and no content, truncation via maxCharsPerPage, and billing on the caller's own Apify account capped per run.

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

Conciseness4/5

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

Front-loaded with the output contract, then mode/billing/policy clauses in a logical order, with no filler sentences. It is a single dense paragraph, so the policy, mode, and billing concerns run together without visual separation; light grouping would improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema, the description still summarizes the return shape and flags the two terminal statuses, which is the information an agent needs to branch on. Combined with per-mode guidance and billing/rate constraints, nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above baseline by explaining cross-parameter intent — why to use chunk:true, how mode 'sitemap'/'crawl' interacts with maxPages and includeGlobs, and the trigger condition for rendering 'auto' — rather than restating field docs. It does not cover chunkSize/chunkOverlap/maxDepth/maxCharsPerPage semantics, which remain schema-only.

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

Purpose5/5

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

States a specific verb and resource ('Fetches public web pages and returns their main content as clean Markdown') plus the exact payload produced (title, author, dates, outline, citation). No sibling tool does page fetching, so the distinction is inherent, and the boilerplate-stripping scope is unambiguous.

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

Usage Guidelines5/5

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

Names concrete use cases ('read, quote or summarise a page or load documentation') and gives conditional guidance for each mode: chunk:true for long pages, sitemap/crawl for multi-page sites, rendering 'auto' only if a page comes back nearly empty. It also states an explicit stop condition — blocked/paywalled pages must not be retried by other means.

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

full_website_auditFull website audit with prioritised fix planA
Read-only
Inspect

Runs the tracking & consent, speed & revenue, accessibility (WCAG 2.2), domain/email health and AI-search readiness checks IN PARALLEL on one website, then merges them into an overall score, an executive summary and a single fix list ranked by severity, legal/revenue impact and effort. Best first call for "audit my website" or "what should I fix first". Partial results are returned if one check fails. Starts one Apify run per check on the caller's Apify account (pay-per-event).

NameRequiredDescriptionDefault
urlYesPublic website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected.
checksNoWhich checks to run (default: all five). domain_email uses the URL's domain.
deviceNoEmulated device for the speed and UX checks; Google ranks on mobile.mobile
maxPagesNoPages per crawler-based check (keeps cost and time down).
waitSecsNoHow long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240.
maxCostUsdNoTotal spend cap across all runs on YOUR Apify account (split evenly per check). Default: $2 per check.

Output Schema

NameRequiredDescription
gradeYes
domainYes
dryRunYes
targetYes
fixPlanYes
sectionsYes
overallScoreYes
totalCostUsdNo
severityCountsYes
executiveSummaryYes

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that checks run in parallel, that partial results are returned if one check fails, that it starts one Apify run per check on the caller's own Apify account (pay-per-event), and that the scan keeps running when waitSecs expires. These are the operational facts an agent needs before spending money or deciding to poll.

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

Conciseness5/5

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

Three sentences, front-loaded with what it does, then the routing hint, then failure-mode and billing behavior. No filler and no repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema covers return shape, and the description supplies the remaining essentials: auth/billing model (caller's Apify account, pay-per-event), partial-failure semantics, and the async handoff to get_audit_results. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (url, checks, device, maxPages, waitSecs, maxCostUsd) is already documented in the schema, including defaults, enums and caps. The description adds only indirect context about the cost cap being spread across runs per check; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb+resource (runs five named audit checks in parallel on one website) plus the merged output: overall score, executive summary, severity-ranked fix list. This clearly distinguishes it from the sibling single-check tools (audit_tracking_consent, scan_speed_and_revenue, etc.) and from get_audit_results.

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

Usage Guidelines4/5

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

Explicitly routes the agent: 'Best first call for "audit my website" or "what should I fix first"', and points to get_audit_results when waitSecs elapses with status 'running'. It doesn't state when to prefer the individual sibling checks instead of this aggregate, which is the only missing piece.

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

get_audit_resultsGet results of an earlier audit runA
Read-onlyIdempotent
Inspect

Fetches the status and results of an audit run that was still "running" when its tool returned (or any earlier run), by Apify runId. Does not start a new scan and costs nothing extra.

NameRequiredDescriptionDefault
checkYesWhich check the run belongs to (for parsing the results).
runIdYesrun.runId from an earlier result

Output Schema

NameRequiredDescription
runYes
checkYes
gradeYes
scoreYes
dryRunYestrue = sample data from the built-in mock, NOT a real scan
statusYes"running" = the Actor is still working; call get_audit_results with run.runId later
targetYes
metricsYes
summaryYes
findingsYes
reportUrlNoFull report (HTML/JSON) in the Apify key-value store
datasetUrlNo
findingsTotalYes
severityCountsYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is settled. The description adds context beyond them: no new scan is started and there is no additional cost. Return shape is covered by the output schema, so nothing further is owed there.

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

Conciseness5/5

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

Two sentences, no filler. The core action and the runId key lead, with the 'does not start a new scan' caveat placed where it prevents misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and rich annotations, the description need only cover scope and cost, which it does. The one hole is the near-duplicate sibling get_run_results, which an agent could easily pick instead.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already explains that runId comes from an earlier result and that check selects the result parser. The description adds essentially no parameter detail beyond that, so the baseline 3 applies.

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

Purpose4/5

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

The description uses a specific verb and resource ('Fetches the status and results of an audit run') and pins the lookup key to runId. It also rules out starting a new scan, which separates it from the audit_* / scan_* siblings. It does not distinguish itself from get_run_results, the closest sibling.

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

Usage Guidelines4/5

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

It gives a concrete trigger: use when a run was still 'running' when its launching tool returned, or for any earlier run. The negative case ('Does not start a new scan') is stated outright. It omits any routing guidance versus get_run_results.

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

get_run_resultsGet results of an earlier data-tool runA
Read-onlyIdempotent
Inspect

Fetches the status and results of a run that was still "running" when a SiteVerdict data tool returned (by runId and tool name). Does not start a new run and costs nothing extra.

NameRequiredDescriptionDefault
toolYesWhich tool produced the run
runIdYesrun.runId from an earlier result

Output Schema

NameRequiredDescription
runYes
toolYes
itemsYesResult records (trimmed for context). Records often carry a recordType discriminator.
notesYes
dryRunYestrue = built-in SAMPLE data from this server, NOT a real lookup
statusYes"running" = still working; call get_run_results with run.runId later
summaryYes
truncatedYestrue = more records exist than are included here (see datasetUrl)
datasetUrlNo
disclaimerNo
itemsTotalYes
sampleDataYestrue = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds genuinely non-obvious context: it does not initiate work and incurs no additional cost, which matters for agent retry/polling decisions. It omits what happens if the run is still incomplete at fetch time and any rate-limit guidance.

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

Conciseness5/5

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

A single compact sentence pair that front-loads the core action and follows with the cost/scope reassurance. No filler, nothing redundant with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description covers the trigger, scope, and cost profile for a 2-parameter read tool. The one gap is behavior when the run has not finished yet — retry/polling expectations — which an agent polling this tool would want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with both parameters documented and the tool enum fully specified. The description only restates 'by runId and tool name', adding no format, sourcing, or enum semantics beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (fetches) and resource (status and results of a run), plus the precise scope: runs that were still 'running' when a data tool returned. This clearly separates it from the run-producing siblings like detect_tech_stack and monitor_website_changes, which the description implicitly contrasts by naming the runId/tool pair.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition — use it when a data tool returned with a still-'running' status — and a clear negative boundary: it does not start a new run. It stops short of naming the sibling tools that would start a run or giving polling cadence, but the when/when-not framing is solid.

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

monitor_website_changesCheck website uptime and changes since last checkAInspect

Checks web pages for uptime and for changes since the last check. Per URL: up/down/blocked status, HTTP status, response time, TTFB, redirect chain, DNS result and TLS days-to-expiry; for pages checked before, a change verdict (baseline | no-change | changed) with a plain-English summary and a unified diffExcerpt. Detects text changes in the whole page or a CSS/XPath region, price changes, list items added/removed, keywords appearing/disappearing, SEO-critical changes (title, meta description, canonical, H1, noindex appearing), robots.txt/sitemap changes and, in browser mode, screenshot pixel differences. The FIRST call for a URL returns changeStatus "baseline": reuse the same stateStoreName on later calls to compare. Saves a private snapshot in the caller's Apify storage (nothing on the target site changes). Dates, times, UUIDs and copyright years are ignored by default; add ignorePatterns/excludeSelectors for false changes. Respects robots.txt; blocked pages are not charged. Browser mode costs 3x an HTTP check. Runs an Apify Actor on the caller's own Apify account (billed by Apify pay-per-event, capped per run).

NameRequiredDescriptionDefault
modeNo"http" is fast and cheap; "browser" renders JavaScript and enables visual diffs (costs 3x).http
urlsYesPages to check, e.g. ["https://shop.example/pricing"]
keywordsNoWords or phrases to watch; reported when they appear or disappear.
monitorsNoOptional per-URL settings that override the global ones.
seoChecksNoFlag SEO-critical changes: title, meta description, canonical, H1, noindex.
visualDiffNoCompare screenshots pixel by pixel (browser mode only).
trackPricesNoDetect and compare prices on the page.
checkSitemapNoAlso compare the site's sitemap.xml.
contentXPathNoXPath of the region to compare
resetBaselineNoDiscard the saved snapshot and start a new baseline.
checkRobotsTxtNoAlso compare the site's robots.txt.
ignorePatternsNoRegexes masked before comparing
keywordAlertOnNoAlert when watched keywords appear, disappear, or both.both
stateStoreNameNoYour snapshot namespace (e.g. a project name); reuse it to compare with earlier calls.default
contentSelectorNoCSS selector of the region to compare
excludeSelectorsNoCSS selectors to ignore when comparing (e.g. ads, timestamps, carousels).
minChangePercentNoIgnore text changes smaller than this percentage of the content.
visualThresholdPercentNoMinimum percentage of changed pixels that counts as a visual change.

Output Schema

NameRequiredDescription
runYes
toolYes
itemsYesResult records (trimmed for context). Records often carry a recordType discriminator.
notesYes
dryRunYestrue = built-in SAMPLE data from this server, NOT a real lookup
statusYes"running" = still working; call get_run_results with run.runId later
summaryYes
truncatedYestrue = more records exist than are included here (see datasetUrl)
datasetUrlNo
disclaimerNo
itemsTotalYes
sampleDataYestrue = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real

TDQS

A4.6/5.0
Behavior5/5

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

Given readOnlyHint=false and idempotentHint=false, the description explains exactly why: it writes a private snapshot to the caller's Apify storage ('nothing on the target site changes'), runs on the caller's own Apify account with pay-per-event billing capped per run, and non-idempotency comes from baseline/diff semantics. It additionally discloses that blocked pages are not charged and that dates/UUIDs/copyright years are ignored by default to suppress false positives.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, then output shape, then the baseline/state workflow, then constraints and billing. The single-dense-paragraph format and the mid-sentence catalog of detection types partly duplicate schema descriptions, which costs a point but does not bury the critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite 18 parameters, an output schema, and stateful cross-call behavior, an agent has everything needed to call it correctly: required urls, baseline semantics, state reuse, cost multiplier, false-positive mitigations, and billing model. Return fields are covered by the output schema, and the description's summary of them is a bonus rather than a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already carries the per-parameter text. The description still adds workflow-level meaning the schema cannot: stateStoreName must be reused across calls for comparisons, mode costs 3x in browser, and ignorePatterns/excludeSelectors exist specifically to suppress false changes. Some enumeration (prices, keywords, seoChecks, sitemap) largely restates schema properties, so it is not a full 5.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Checks web pages for uptime and for changes since the last check,' which cleanly separates it from siblings like full_website_audit (one-off audits) and fetch_clean_markdown (content retrieval). The enumerations that follow (uptime, diff, price/keyword/SEO change detection) confirm the scope without ambiguity.

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

Usage Guidelines4/5

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

Explains the stateful workflow explicitly: the first call returns 'baseline' and later calls must reuse the same stateStoreName, and resetBaseline discards the snapshot. It also flags cost tradeoffs (browser mode 3x) and robots.txt blocking. It stops short of naming sibling tools or stating when not to use this versus a full audit, so not a 5.

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

scan_speed_and_revenueScan page speed & estimate revenue lost to slownessA
Read-only
Inspect

Measures Core Web Vitals (LCP, INP, CLS, TTFB) and page weight on key pages, finds the biggest speed bottlenecks (images, render-blocking scripts, third-party tags) and, if you give traffic and order value, estimates monthly revenue lost to slow pages. Returns a score, metrics, prioritised fixes and a full-report link. Runs on the caller's own Apify account (APIFY_TOKEN) and is billed by Apify pay-per-event; nothing is charged by this server.

NameRequiredDescriptionDefault
urlYesPublic website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected.
deviceNoEmulated device; Google ranks on mobile.mobile
currencyNoISO currency code for money figures.USD
maxPagesNoPages to test (home page + discovered key pages).
waitSecsNoHow long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240.
maxCostUsdNoSpend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2).
monthlyVisitorsNoOptional, for the revenue-loss estimate.
averageOrderValueNoOptional average order / lead value, for the revenue estimate.
conversionRatePctNoOptional current conversion rate in %, for the revenue estimate.

Output Schema

NameRequiredDescription
runYes
checkYes
gradeYes
scoreYes
dryRunYestrue = sample data from the built-in mock, NOT a real scan
statusYes"running" = the Actor is still working; call get_audit_results with run.runId later
targetYes
metricsYes
summaryYes
findingsYes
reportUrlNoFull report (HTML/JSON) in the Apify key-value store
datasetUrlNo
findingsTotalYes
severityCountsYes

TDQS

A4/5.0
Behavior5/5

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

Annotations already declare readOnly/openWorld/non-idempotent/non-destructive, and the description adds genuinely non-redundant context: it runs on the caller's own Apify account via APIFY_TOKEN, is billed pay-per-event by Apify with nothing charged by this server, and returns a score, metrics, prioritised fixes and a full-report link. That cost and auth disclosure is exactly the kind of behavior an agent can't get from the structured fields.

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

Conciseness4/5

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

Three sentences, front-loaded with what is measured, then the conditional revenue feature, then the operational/cost caveat. Dense but every clause carries weight; the enumeration of metrics and bottleneck types is slightly list-heavy but justified by the tool's scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 9 parameters, an output schema and annotations present, the description covers the remaining gaps an agent needs: billing/account model, auth token requirement, the conditional revenue-estimate inputs, and a summary of return contents. Nothing material for correct invocation appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema itself documents url, device, currency, maxPages, waitSecs, maxCostUsd and the three revenue inputs. The description only loosely links monthlyVisitors/averageOrderValue (and implicitly conversionRatePct) to the revenue estimate, adding little beyond what the schema already states — baseline 3.

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

Purpose4/5

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

The description names the specific resource and metrics (Core Web Vitals — LCP, INP, CLS, TTFB — page weight, bottleneck categories) and the revenue-loss estimate, which clearly separates it from sibling audits like audit_accessibility_wcag, audit_tracking_consent and detect_tech_stack. It stops short of naming any sibling explicitly, so 4 rather than 5.

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

Usage Guidelines3/5

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

It explains the conditional enrichment path ('if you give traffic and order value, estimates monthly revenue lost'), which is genuine usage guidance, and the schema covers the async 'running'/runId fallback to get_audit_results. But there is no explicit statement of when to pick this over full_website_audit or the other audit siblings, so an agent must infer the choice from scope alone.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.2.1
    • First observedaudit_accessibility_wcag
    • First observedaudit_tracking_consent
    • First observedcheck_ai_search_readiness
    • First observedcheck_domain_email_health
    • First observeddetect_tech_stack
    • First observedfetch_clean_markdown
    • First observedfull_website_audit
    • First observedget_audit_results
    • First observedget_run_results
    • First observedmonitor_website_changes
    • First observedscan_speed_and_revenue

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation4/5

The audit tools target clearly distinct concerns (consent, speed, accessibility, email/DNS, AI search, tech stack, monitoring, content extraction), and full_website_audit is explicitly positioned as an aggregate. The main ambiguity is between get_audit_results and get_run_results, which both fetch async Apify run status/results and may be confused.

Naming Consistency4/5

Most tool names use snake_case verb_noun patterns (audit_..., check_..., detect_..., monitor_..., fetch_...). The main deviation is full_website_audit, which is a noun phrase rather than a verb-led action name, and there are some verb synonyms (audit/check/scan) that are still readable.

Tool Count5/5

Eleven tools are well-scoped for a multi-audit website analysis server. Each tool maps to a meaningful capability, with only minor redundancy in the two result-fetching tools.

Completeness4/5

The surface covers a broad website-audit lifecycle: consent/tracking, performance, accessibility, domain/email health, AI-search readiness, tech detection, change monitoring, and content extraction, with async result retrieval. Minor gaps remain around a dedicated general SEO/content audit or broken-link checker, though related checks are partially covered elsewhere.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Provides comprehensive website auditing for SEO, performance, accessibility, and security using AI-powered analysis. It enables users to generate detailed audit reports and actionable improvement suggestions for any given URL.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Lets any AI agent audit any website for SEO, GEO/AEO, and speed problems, reporting issues and recommendations without modifying the site.
    4
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Runs AI visibility (GEO/AEO) audits on websites, checking AI crawler access, schema markup, llms.txt, and content signals, with optional full PDF report.
    MIT