SiteVerdict
OfficialIntegrates with Google services for marketing and compliance audits: uses the Google Maps API for local business data, provides Google Ads Transparency checks, and audits Google Consent Mode v2, GA4/GTM tags, and Google AI Overviews readiness.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
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 |
| Runs every check below in parallel, then returns an overall score, an executive summary and one prioritised fix list |
| 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 |
| 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 |
| WCAG 2.2 A/AA/AAA (axe-core), mapped to success criteria and to the European Accessibility Act / EN 301 549 |
| MX, SPF, DKIM, DMARC, BIMI, MTA-STS, DNSSEC, CAA, TLS expiry, spoofing risk and Gmail/Yahoo bulk-sender gaps |
| 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 |
| 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 withmaxCostUsd).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/mcpClaude 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/mcpOr 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/mcpChatGPT 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/siteverdictRemote / 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-listToolset | Tools |
| 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 |
| seo_rank_check, search_traffic_diagnose, google_ads_transparency, reviews_monitor |
| find_local_businesses, company_registry_lookup, sec_filing_watch, sec_full_text_search, find_public_tenders, detect_tech_stack |
| sanctions_screen, validate_vat_or_company_number, extract_pdf_invoice, company_registry_lookup |
| flight_fare_scan, flight_fare_estimate, flight_deal_alerts, check_flight_compensation, visa_entry_check |
| uk_property_data |
Some data tools can use your own third-party keys:
stdio:
SITEVERDICT_SECRET_<NAME>env varsHTTP:
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 |
| — | Your Apify token (stdio mode) |
|
|
|
|
| Spend cap per Actor run |
|
| How long a call waits before returning |
|
| Tool calls per minute per client |
|
| Concurrent Actor runs per client |
| from | Apify account that owns the Actors |
|
| Override individual Actor IDs |
|
| Resolve hostnames and reject private addresses (SSRF guard) |
|
| HTTP mode |
| 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.comin anAuthorizationheader. 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 sourceTo 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 toolsaudit_accessibility_wcagAudit accessibility (WCAG 2.2 / European Accessibility Act)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected. | |
| maxPages | No | Pages to crawl on the same host. | |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| wcagLevel | No | Conformance level to test against (AA is the legal baseline in most regions). | AA |
| maxCostUsd | No | Spend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2). | |
| includeBestPractices | No | Also report axe "best-practice" rules that are not strict WCAG failures. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
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.
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.
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.
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.
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.
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.
audit_tracking_consentAudit tracking & cookie consent (GDPR / Consent Mode v2)ARead-onlyInspect
Loads the site in a real browser three ways (no click, Reject, Accept all) and reports which tags fire before consent or after Reject, tracking cookies set without consent, Google Consent Mode v2 signals, broken GA4/GTM tags, duplicate page_views and missing conversions. Returns a score, prioritised plain-English fixes and a link to the full HTML report. Use for GDPR/UK GDPR/PECR/ePrivacy cookie compliance and "why is my analytics data wrong" questions. Runs on the caller's own Apify account (APIFY_TOKEN) and is billed by Apify pay-per-event; nothing is charged by this server.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected. | |
| locale | No | Browser language, e.g. en-GB, de-DE, fr-FR (banners are often localised). | en-GB |
| scanMode | No | "full" = 3 visits (no click / Reject / Accept all). "quick" = 1 visit, cheaper: tag inventory, pre-consent tracking and broken tags only. | full |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| maxCostUsd | No | Spend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2). | |
| timezoneId | No | IANA time zone, e.g. Europe/London, Europe/Berlin, America/New_York. | Europe/London |
| internalPages | No | Extra internal pages to check per scenario (0 = home page only). |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses that the scan runs in a real browser, uses three consent scenarios, returns a score/fixes/report link, requires the caller's APIFY_TOKEN, and is billed by Apify pay-per-event with no charge from this server. This adds important operational and cost context not captured by annotations alone.
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 behavior and then supplies outputs, use cases, and billing context without filler. Despite being information-dense, every sentence contributes to selecting or correctly invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations and an output schema available, the description covers purpose, use cases, external account requirements, and billing well. The main remaining gap is that async behavior and retrieval via get_audit_results are documented in the waitSecs schema field rather than the description, but the definition is still largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters in detail. The description reinforces the three-visit scenario behind full scan mode, but it does not add parameter-level meaning beyond the schema, such as guidance on maxCostUsd, waitSecs, locale, or internalPages.
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 loads a site in a real browser three ways and audits consent/tracking behavior. It distinguishes itself from generic website-audit siblings by naming concrete outputs such as pre-consent tags, cookies, Consent Mode v2 signals, GA4/GTM issues, duplicate page_views, and missing conversions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says to use this for GDPR/UK GDPR/PECR/ePrivacy cookie compliance and for questions about why analytics data is wrong. It does not explicitly compare against siblings like full_website_audit or check_ai_search_readiness, so there is no when-not/alternatives guidance, but the intended context is clear.
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)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected. | |
| maxPages | No | Pages to sample for content/structured-data checks. | |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| maxCostUsd | No | Spend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2). |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
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.
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.
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.
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.
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.
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)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Domain name, e.g. "example.com" (a URL or email address is accepted and reduced to its domain). | |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| maxCostUsd | No | Spend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2). | |
| dkimSelectors | No | Optional DKIM selectors to test (e.g. "google", "selector1"). Common selectors are tried automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
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.
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.
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.
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.
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.
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 stackARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "browser" renders in headless Chrome (more tags, costs more). Prefer http. | http |
| urls | Yes | Domains or URLs, e.g. ["example.com", "https://shop.example.co.uk"] | |
| checkDns | No | Look up MX/NS/SPF/DMARC records to detect the email and DNS providers. | |
| checkTls | No | Read the TLS certificate issuer and expiry date. | |
| matchAll | No | onlySitesUsing must ALL match (default: any). | |
| extraPaths | No | Extra paths per site, e.g. ["/pricing", "/cart"] | |
| minConfidence | No | Drop detections below this confidence (0-100). | |
| onlyCategories | No | Keep only these categories, e.g. ["Booking & scheduling"] | |
| onlySitesUsing | No | Keep only sites using these technologies, e.g. ["Shopify"] | |
| includeEvidence | No | Include evidence strings (more tokens). | |
| excludeSitesUsing | No | Drop sites using these, e.g. ["Klaviyo"] |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| tool | Yes | |
| items | Yes | Result records (trimmed for context). Records often carry a recordType discriminator. |
| notes | Yes | |
| dryRun | Yes | true = built-in SAMPLE data from this server, NOT a real lookup |
| status | Yes | "running" = still working; call get_run_results with run.runId later |
| summary | Yes | |
| truncated | Yes | true = more records exist than are included here (see datasetUrl) |
| datasetUrl | No | |
| disclaimer | No | |
| itemsTotal | Yes | |
| sampleData | Yes | true = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real |
TDQS
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.
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.
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.
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.
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.
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 citationsARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "urls" fetches the given pages; "sitemap" or "crawl" reads several pages of one site. | urls |
| urls | Yes | Page URLs (or site / sitemap URLs for mode sitemap/crawl). | |
| chunk | No | Return heading-aware chunks for long pages (for RAG). | |
| maxDepth | No | How many links deep to follow in crawl mode. | |
| maxPages | No | Cap for sitemap/crawl modes. | |
| chunkSize | No | Target chunk size in tokens when chunk is true. | |
| rendering | No | "http" is fastest; use "auto" only if a page comes back nearly empty. | http |
| chunkOverlap | No | Tokens of overlap between chunks. | |
| excludeGlobs | No | URL patterns to skip, e.g. "/blog/tag/**". | |
| includeGlobs | No | e.g. ["/docs/**"] | |
| includeLinks | No | Keep hyperlinks in the Markdown (false = fewer tokens). | |
| includeImages | No | Keep image links in the Markdown. | |
| contentSelector | No | Optional CSS selector to force the content region. | |
| maxCharsPerPage | No | Server-side truncation of markdown per page; truncatedForAgent=true when cut. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| tool | Yes | |
| items | Yes | Result records (trimmed for context). Records often carry a recordType discriminator. |
| notes | Yes | |
| dryRun | Yes | true = built-in SAMPLE data from this server, NOT a real lookup |
| status | Yes | "running" = still working; call get_run_results with run.runId later |
| summary | Yes | |
| truncated | Yes | true = more records exist than are included here (see datasetUrl) |
| datasetUrl | No | |
| disclaimer | No | |
| itemsTotal | Yes | |
| sampleData | Yes | true = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real |
TDQS
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.
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.
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.
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.
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.
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 planARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected. | |
| checks | No | Which checks to run (default: all five). domain_email uses the URL's domain. | |
| device | No | Emulated device for the speed and UX checks; Google ranks on mobile. | mobile |
| maxPages | No | Pages per crawler-based check (keeps cost and time down). | |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| maxCostUsd | No | Total spend cap across all runs on YOUR Apify account (split evenly per check). Default: $2 per check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| grade | Yes | |
| domain | Yes | |
| dryRun | Yes | |
| target | Yes | |
| fixPlan | Yes | |
| sections | Yes | |
| overallScore | Yes | |
| totalCostUsd | No | |
| severityCounts | Yes | |
| executiveSummary | Yes |
TDQS
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.
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.
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.
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.
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.
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 runARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| check | Yes | Which check the run belongs to (for parsing the results). | |
| runId | Yes | run.runId from an earlier result |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
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.
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.
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.
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.
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.
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 runARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | Which tool produced the run | |
| runId | Yes | run.runId from an earlier result |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| tool | Yes | |
| items | Yes | Result records (trimmed for context). Records often carry a recordType discriminator. |
| notes | Yes | |
| dryRun | Yes | true = built-in SAMPLE data from this server, NOT a real lookup |
| status | Yes | "running" = still working; call get_run_results with run.runId later |
| summary | Yes | |
| truncated | Yes | true = more records exist than are included here (see datasetUrl) |
| datasetUrl | No | |
| disclaimer | No | |
| itemsTotal | Yes | |
| sampleData | Yes | true = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "http" is fast and cheap; "browser" renders JavaScript and enables visual diffs (costs 3x). | http |
| urls | Yes | Pages to check, e.g. ["https://shop.example/pricing"] | |
| keywords | No | Words or phrases to watch; reported when they appear or disappear. | |
| monitors | No | Optional per-URL settings that override the global ones. | |
| seoChecks | No | Flag SEO-critical changes: title, meta description, canonical, H1, noindex. | |
| visualDiff | No | Compare screenshots pixel by pixel (browser mode only). | |
| trackPrices | No | Detect and compare prices on the page. | |
| checkSitemap | No | Also compare the site's sitemap.xml. | |
| contentXPath | No | XPath of the region to compare | |
| resetBaseline | No | Discard the saved snapshot and start a new baseline. | |
| checkRobotsTxt | No | Also compare the site's robots.txt. | |
| ignorePatterns | No | Regexes masked before comparing | |
| keywordAlertOn | No | Alert when watched keywords appear, disappear, or both. | both |
| stateStoreName | No | Your snapshot namespace (e.g. a project name); reuse it to compare with earlier calls. | default |
| contentSelector | No | CSS selector of the region to compare | |
| excludeSelectors | No | CSS selectors to ignore when comparing (e.g. ads, timestamps, carousels). | |
| minChangePercent | No | Ignore text changes smaller than this percentage of the content. | |
| visualThresholdPercent | No | Minimum percentage of changed pixels that counts as a visual change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| tool | Yes | |
| items | Yes | Result records (trimmed for context). Records often carry a recordType discriminator. |
| notes | Yes | |
| dryRun | Yes | true = built-in SAMPLE data from this server, NOT a real lookup |
| status | Yes | "running" = still working; call get_run_results with run.runId later |
| summary | Yes | |
| truncated | Yes | true = more records exist than are included here (see datasetUrl) |
| datasetUrl | No | |
| disclaimer | No | |
| itemsTotal | Yes | |
| sampleData | Yes | true = the Actor returned fictional sample rows (e.g. no credentials configured); never present as real |
TDQS
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.
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.
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.
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.
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.
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 slownessARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public website URL, e.g. "https://example.com" (https:// is added if missing). Private/internal addresses are rejected. | |
| device | No | Emulated device; Google ranks on mobile. | mobile |
| currency | No | ISO currency code for money figures. | USD |
| maxPages | No | Pages to test (home page + discovered key pages). | |
| waitSecs | No | How long to wait for results before returning status "running" with a runId (the scan keeps going; use get_audit_results). Default 240. | |
| maxCostUsd | No | Spend cap for this run on YOUR Apify account (forwarded to Apify as maxTotalChargeUsd). Default from server config ($2). | |
| monthlyVisitors | No | Optional, for the revenue-loss estimate. | |
| averageOrderValue | No | Optional average order / lead value, for the revenue estimate. | |
| conversionRatePct | No | Optional current conversion rate in %, for the revenue estimate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| run | Yes | |
| check | Yes | |
| grade | Yes | |
| score | Yes | |
| dryRun | Yes | true = sample data from the built-in mock, NOT a real scan |
| status | Yes | "running" = the Actor is still working; call get_audit_results with run.runId later |
| target | Yes | |
| metrics | Yes | |
| summary | Yes | |
| findings | Yes | |
| reportUrl | No | Full report (HTML/JSON) in the Apify key-value store |
| datasetUrl | No | |
| findingsTotal | Yes | |
| severityCounts | Yes |
TDQS
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.
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.
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.
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.
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.
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.
11 tool updates
v0.2.1- First observed
audit_accessibility_wcag - First observed
audit_tracking_consent - First observed
check_ai_search_readiness - First observed
check_domain_email_health - First observed
detect_tech_stack - First observed
fetch_clean_markdown - First observed
full_website_audit - First observed
get_audit_results - First observed
get_run_results - First observed
monitor_website_changes - First observed
scan_speed_and_revenue
TDQS
Scored across 11 tools
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.
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.
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.
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
Related MCP Connectors
AI website growth audits: SEO, performance, AI readiness (GEO), conversion, a11y, security.
AI website audit: security, SEO, performance, UX and accessibility checks with actionable fixes.
Audit any website for AI visibility: graded report, findings with fixes, AI crawler access check.
Website intelligence audits for AI agents: free preview plus x402-paid Agent Readiness scoring
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceProvides 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.-

Seonix SEO MCPofficial
AlicenseAqualityCmaintenanceLets any AI agent audit any website for SEO, GEO/AEO, and speed problems, reporting issues and recommendations without modifying the site.4MIT- FlicenseNot gradedqualityCmaintenanceAudits any website for SEO issues, providing scored health checks, schema validation, and performance analysis through AI assistants.-
- AlicenseNot gradedqualityBmaintenanceRuns AI visibility (GEO/AEO) audits on websites, checking AI crawler access, schema markup, llms.txt, and content signals, with optional full PDF report.MIT