Developer docs

MCP server

Connect agents to the CertScore.ai MCP server for website compliance review workflows using scan, status, finding, explanation, and latest-domain tools.

CertScore.ai outputs are automated public-web observations for review. They are not legal advice, certification, or a compliance determination.

Start here

Which route should I choose?

Start anonymously in one minute. Upgrade only when you need more scans, production or team access, backend automation, history, or advanced tools.

Recommended for first-time users

Light MCP — no authentication

No account, API key, bearer token, browser login, or OAuth. Scan public websites with the three core tools and a limited daily quota.

Start with Light MCP

For production and higher volume

Authenticated MCP

Hosted MCP — OAuth is the managed remote route. Local MCP — scoped API key is the stdio and backend route.

Set up Authenticated MCP

Compare routes

Authentication is visible before setup

RouteSetup methodAuthenticationAccountQuotaAvailable toolsIntended userWebsite / access limitsUpgrade path
Light MCP — no authenticationOne Codex command or remote Streamable HTTP URLNoneNot requiredUp to 50 new scans per UTC day across Light and 5 per rolling 10 minutes; eligible reuse is freecertscore_scan_site, certscore_get_scan_status, certscore_get_scan_bundleFirst-time users, testing, and discoveryPublic HTTP or HTTPS websites; core tools onlyAuthenticate for volume, history, teams, or advanced tools
Hosted MCP — OAuthConnect the hosted endpoint from an OAuth-capable clientOAuth authorization code with PKCERequiredHigher-volume allowance based on accessCore plus approved history and diagnostic toolsProduction, teams, and managed remote clientsScopes control read and scan creation; creation may require supportRequest more scopes or volume from support
Local MCP — scoped API keyInstall and run the local stdio serverScoped API key in the client environmentRequiredHigher-volume allowance based on key accessTools permitted by the key scopesBackend, local, and controlled automationProtect and rotate keys; scan creation is support-gatedRequest more scopes, tools, or volume

Read protection

MCP scan-resource limits

Completed scan and domain resources use weighted, rolling limits. These protections apply in addition to account, API-key, and scan-creation quotas. Policy version 2026-08-14.

Terminal-read scopeRolling 10 minutesRolling 24 hours
Caller + scan/resource120 units1200 units
Scan/resource across callers4000 units
Caller across scans/resources480 units

Read weights

  • Ordinary scan, finding, inventory, or domain read: 1 unit.
  • Evidence, full report, diagnostics, export, or composite bundle: 4 units.
  • That permits 30 direct heavy reads per caller and resource in 10 minutes, and 300 in a rolling 24 hours.

Status polling

  • Caller + scan: 120 units per rolling 10 minutes.
  • Scan across callers: 10000 units per rolling 10 minutes.
  • Caller across scans: 600 units per rolling 10 minutes.

HTTP 429 and MCP rate-limit errors include Retry-After when a retry time is available, plus machine-readable policy version, profile, scope, window, limit, usage, and requested-unit fields. Wait for that delay. Poll only active status resources and stop polling when a scan becomes terminal.

Hosted MCP applies the policy before composite tool fan-out, so an over-limit bundle is rejected before it starts its internal API reads. Local MCP receives the same protection from the underlying CertScore API.

Beginner workflow

Light MCP — no authentication

First-time agents should use the Light endpoint. It uses Streamable HTTP and requires no signup, API key, bearer token, browser login, or OAuth, and exposes exactly certscore_scan_site,certscore_get_scan_status, andcertscore_get_scan_bundle.

Light:
https://mcp.certscore.ai/mcp/light

Transport: Streamable HTTP
Authentication: None
Tools: certscore_scan_site, certscore_get_scan_status, certscore_get_scan_bundle

Codex setup

codex mcp add certscore --url https://mcp.certscore.ai/mcp/light

Light allows up to 50 genuinely new scans per UTC day across the public Light surface and 5 per rolling 10 minutes. Reused eligible results do not consume quota.

First run

Paste one prompt

Scan https://ergoveritas.com/.well-known/certscore-canary/sentinels/broad-baseline.html. If certscore_scan_site returns a queued, running, or finalizing result, retain the returned scanId and poll certscore_get_scan_status using scanId only. If certscore_scan_site returns a retryable error without a scanId, wait for retryAfterSeconds and retry certscore_scan_site; do not call certscore_get_scan_status until a scanId exists. Once the scan reaches a terminal status, call certscore_get_scan_bundle with detail=findings and maxBytes=8000. Summarize whether the result was new or reused, the score, risk level, findings, evidence links, coverage limitations, and report URL. Explain truncation or omitted sections when present. Treat results as automated public-web observations, not legal conclusions, certifications, or compliance determinations.

ErgoVeritas provides stable, owned canary pages suited to demonstrating the complete scan, status, and bundle flow. The canary intentionally contains test signals, so its findings are useful for exercising the API rather than evaluating a production site.

CertScore results are automated observations from a public-web scan. No-go, not-observed, and limited-coverage results are not proof of compliance, absence of risk, or legal status. Review the retained evidence and applicable context before relying on a finding.

Light workflow

The canonical three-tool sequence

  1. Call certscore_scan_site with a public URL.
  2. If a retryable error has no scanId, wait retryAfterSeconds and retry certscore_scan_site.
  3. If the result is queued, running, or finalizing, retain scanId.
  4. Poll certscore_get_scan_status using scanId only. Never poll until scanId exists.
  5. Stop polling at a terminal status, then call certscore_get_scan_bundle.
  6. Use detail=findings for a compact finding review.
  7. Use detail=evidence for evidence digests and references.
  8. If truncated, follow recommendedNextAction or increase maxBytes.
  9. Summarize findings together with coverage limitations and the report URL.
certscore_scan_site
→ retry certscore_scan_site if a retryable error has no scanId
→ certscore_get_scan_status with scanId if still running
→ certscore_get_scan_bundle after terminal status
Recommended bundle budgets:
summary   maxBytes=5000
findings  maxBytes=8000
evidence  maxBytes=8000
full      maxBytes=12000 or higher

A 5,000-byte response may intentionally omit optional sections while preserving a compact finding or evidence reference when available. Inspect actualBytes, truncated, omittedSections,nextRecommendedMaxBytes, and returned report or evidence content URLs.

Call certscore_get_scan_status only after certscore_scan_site returns a scanId. A retryable response without one must return to certscore_scan_site.

CertScore results are automated observations from a public-web scan. No-go, not-observed, and limited-coverage results are not proof of compliance, absence of risk, or legal status. Review the retained evidence and applicable context before relying on a finding.

Verify

Confirm the Light connection

List the available CertScore tools and confirm that certscore_scan_site, certscore_get_scan_status, and certscore_get_scan_bundle are available. Then scan https://ergoveritas.com/.well-known/certscore-canary/sentinels/broad-baseline.html and report whether the result was new or reused.

Success means the tool list contains exactly the three Light tools, no authorization page appears, andcertscore_scan_site returns a stable scanId plus an explicit new-or-reused decision. An eligible reused result reports that quota was not consumed.

Troubleshooting

Light MCP — no authentication recovery

OAuth appeared unexpectedly

Remove the connection and add the exact Light endpoint https://mcp.certscore.ai/mcp/light. Do not configure a token.

No scanId was returned

Retry certscore_scan_site only when the error says retryable: true. Never poll status without scanId.

Rate limited

Wait for retryAfterSeconds or stop. Eligible recent-result reuse does not consume quota.

Result was reused

Report it as reused. The eligible prior result was returned and quota was not consumed.

Bundle was truncated

Follow nextRecommendedMaxBytes, increase maxBytes, or open a returned report or evidence URL.

Coverage was limited

completed_limited, no-go, and not-observed are automated observations, not proof of compliance.

Light-to-Authenticated migration

Upgrade when Light becomes a constraint

Upgrade when you need a dedicated higher-volume allowance, production or team access, backend automation, scan history, advanced diagnostic tools, or support-managed scopes.

What changes

Use the full endpoint and authenticate with hosted OAuth or a local scoped API key. Quota and tool availability follow the granted access.

What stays compatible

Core identifiers and canonical response fields—including scanId, status, score, risk, coverage, and timestamps—remain compatible.

Need more scans or advanced tools? Upgrade to Authenticated MCP.

Authenticated remote setup

Hosted MCP — OAuth

Use this route for an OAuth-capable remote MCP client in production or team workflows. A CertScore account is required. The authorization flow grants only the approved scopes.

MCP endpoint:
https://mcp.certscore.ai/mcp

Protected-resource metadata:
https://mcp.certscore.ai/.well-known/oauth-protected-resource/mcp

Authorization-server metadata:
https://certscore.ai/.well-known/oauth-authorization-server

Read access requests the OAuth scopes scan:read andmcp. Scan creation additionally requires the support-gatedscan:create scope.

Authenticated local setup

Local MCP — scoped API key

Use this route for local stdio clients, backend automation, or environments where you manage credentials directly. A CertScore account and a scoped key are required.

brew tap ergoveritas1-alt/certscore https://github.com/ergoveritas1-alt/certscore.ai
brew install --cask certscore-mcp

The cask installs a persistent local MCP command for users who prefer Homebrew-managed tools.

Local MCP access

Local MCP — scoped API key permissions

The local stdio MCP server works with a self-serve cs_ro_ key carrying pulse:read and mcp. Sign in, verify your email, then request the key from /api/v2/keys/request. Stdio tools that create scans require pulse:scan; hosted OAuth usesscan:create. Both remain support-gated at [email protected].

Self-serve read-only MCP key:
1. Sign in at https://certscore.ai/login and verify your email.
2. POST https://certscore.ai/api/v2/keys/request from the signed-in browser session.
3. Use the returned cs_ro_ key as CERTSCORE_API_KEY.

Local verification

Local MCP — scoped API key doctor check

certscore-mcp --version
certscore-mcp --help
CERTSCORE_API_KEY=<token> certscore-mcp doctor
CERTSCORE_API_KEY=<token> certscore-mcp doctor --check-auth

The doctor command checks the installed binary, Node.js runtime compatibility, the configured CertScore.ai base URL, API v2 health, and API key presence without printing the token. Add --check-auth to validate the credential against the API without creating a scan or inspecting raw scanner artifacts.

Local verification

Local MCP — scoped API key release checksum

curl -LO https://github.com/ergoveritas1-alt/certscore.ai/releases/download/certscore-mcp-v{version}/certscore-mcp-v{version}.tar.gz
curl -LO https://github.com/ergoveritas1-alt/certscore.ai/releases/download/certscore-mcp-v{version}/SHA256SUMS
sha256sum --check SHA256SUMS

Release tarballs are built on Linux by GitHub Actions. The published SHA256SUMS file should match the cask checksum.

Local client configuration

Local MCP — scoped API key installed command

{
  "mcpServers": {
    "certscore": {
      "command": "certscore-mcp",
      "env": {
        "CERTSCORE_API_KEY": "<token>",
        "CERTSCORE_BASE_URL": "https://certscore.ai"
      }
    }
  }
}

The server runs over stdio and reads the API key from the MCP client environment. Keep the token scoped and rotate it if it is shared outside your workspace.

Local client configuration

Local MCP — scoped API key stdio config

{
  "mcpServers": {
    "certscore": {
      "command": "certscore-mcp",
      "env": {
        "CERTSCORE_API_KEY": "<token>",
        "CERTSCORE_BASE_URL": "https://certscore.ai"
      }
    }
  }
}

Advanced local troubleshooting

Local MCP — scoped API key checks

  • If the command is not found, reinstall the cask or check that Homebrew's bin directory is on PATH.
  • If Node.js is not found, make sure the MCP client inherits a PATH containing Node.js and Homebrew's bin directory.
  • If the API key is missing, set CERTSCORE_API_KEY in the MCP client environment and rerun doctor --check-auth.
  • If a token is rejected, run doctor --check-auth before rotating the key or requesting a scoped API/MCP key from [email protected].
  • If API health is unreachable, check CERTSCORE_BASE_URL and verify that https://certscore.ai/api/v2/health loads.
  • If Homebrew uses stale metadata, run brew update and reinstall the cask.
  • If an old release is cached, run brew reinstall --cask certscore-mcp after updating the tap.

Advanced local development

Local MCP — scoped API key repo setup

CERTSCORE_API_KEY=<token> pnpm mcp:certscore

Advanced local clients

Local MCP — scoped API key Claude Desktop config

{
  "mcpServers": {
    "certscore": {
      "command": "certscore-mcp",
      "env": {
        "CERTSCORE_API_KEY": "<token>",
        "CERTSCORE_BASE_URL": "https://certscore.ai"
      }
    }
  }
}

Advanced local clients

Local MCP — scoped API key contributor config

{
  "mcpServers": {
    "certscore": {
      "command": "pnpm",
      "args": ["mcp:certscore"],
      "cwd": "/path/to/WC01",
      "env": {
        "CERTSCORE_API_KEY": "<token>",
        "CERTSCORE_BASE_URL": "https://certscore.ai"
      }
    }
  }
}

Tools

Agent-facing tool surface

Several tools return or reference Pulse, CertScore.ai's compact public report projection for agents. See What is Pulse? for how it relates to scan resources and findings.

certscore_scan_site

Use CertScore.ai to scan a public website for observable privacy and consent signals, including pre-consent cookies and browser storage, third-party trackers, consent-banner and CMP behavior, TLS/transport security, privacy-policy disclosures, GDPR/ePrivacy transparency findings, and applicable CCPA/CPRA review signals. Starts or reuses a public-web scan and waits up to 45 seconds by default. If status is queued, running, or finalizing, retain scanId and poll certscore_get_scan_status using only that scanId. Stop polling at completed, completed_limited, failed, expired, or rate_limited. For usable completion, call certscore_get_scan_bundle. No-go and limited coverage are observations, never proof of compliance.

certscore_get_scan

Retrieve the API v2 public-safe scan resource, including completed-limited no-go disposition, reason-specific guidance, and timing when available.

certscore_get_scan_status

Poll with only the stable scanId returned by certscore_scan_site. Active responses include phase, heartbeat, estimated progress, stalled state, retry delay, and canonical scan provenance when available. Terminal responses include the CertScore score, risk, coverage, execution region (scanFrom), timestamps, report URL, and an explicit next action. For a reused or retrieved existing scan, use only persisted scanFrom and timestamps; never infer its original region from the current request, the user's location, or a default. Report unavailable provenance as unavailable. Stop polling at any terminal status.

certscore_get_report

Focused follow-up: retrieve a bounded Pulse report with high-signal TextContent and typed structuredContent, including customer-safe no-go messaging. For broad privacy questions, use certscore_get_scan_bundle first because it combines canonical findings, limitations, and pre-consent rows without redundant calls.

certscore_get_evidence

Focused follow-up: retrieve a bounded public-safe evidence packet with a concise TextContent digest and typed structuredContent. For broad privacy questions, use certscore_get_scan_bundle first. Excludes raw cookie values, raw bodies, sensitive payloads, full DOM, and unredacted query values.

certscore_get_scan_bundle

Call after completed or completed_limited status. Every usable completed bundle returns a self-contained concise TextContent digest plus matching structuredContent, including canonical execution region (scanFrom) and timestamps when available. For a reused or retrieved existing scan, use only persisted scanFrom and timestamps; never infer its original region from the current request, the user's location, or a default, and report unavailable provenance as unavailable. The default summary includes the canonical report overview, up to five compact public-safe projected findings across the scan's observed domains, and bounded row-level pre-consent cookie/tracker evidence; detail=findings increases the default finding allowance, evidence adds bounded evidence digests and references, and full adds all available bounded sections. Every response declares finding and evidence total/returned/truncated counts, byte-budget metadata, omittedSections, retrieval URLs, and nextRecommendedMaxBytes when truncated. Enumerate only returned observations and projected findings. Treat criticality, priority, and confidence as CertScore metadata; regulatory review lenses are non-determinative CertScore review context, not legal severity, legal exposure, or a compliance determination. Missing consent-action evidence does not establish Accept, Reject, or Decline behavior. Do not extrapolate observed embeds, vendors, or requests into unobserved cookies, fingerprinting, tracking, or processing. The CertScore score covers observable scan signals only; do not infer unobserved technologies or legal compliance status, and never interpret no-go, not-observed, or limited coverage as proof of compliance.

certscore_export_findings

Return structured findings plus completed-limited no-go disposition and guidance for downstream review or ticketing workflows.

certscore_list_findings

Focused follow-up: list bounded API v2 public-safe findings already projected by the canonical pipeline, with matching high-signal TextContent and typed structuredContent. For broad privacy questions, use certscore_get_scan_bundle first.

certscore_get_pre_consent_cookies_trackers

Focused follow-up: retrieve bounded row-level public-safe pre-consent cookie/tracker evidence with matching TextContent and typed structuredContent. For a new broad request such as checking a site for pre-consent tracking, use certscore_scan_site then certscore_get_scan_bundle first.

certscore_explain_finding

Explain one projected finding with public evidence, caveats, reviewer next steps, and reason-specific no-go context when applicable.

certscore_get_latest_domain_scan

Retrieve the latest eligible API v2 public-safe scan for a domain.

certscore_get_latest_domain_pre_consent_cookies_trackers

Focused follow-up: retrieve bounded row-level public-safe pre-consent cookie/tracker evidence from the latest eligible scan for a domain, with matching TextContent and typed structuredContent. For a broad current-site review, use certscore_scan_site then certscore_get_scan_bundle first.

Timing

Scan timing fields

API v2 MCP tools return startedAt, completedAt, and scanTimeSeconds when CertScore.ai has enough timing evidence. Treat scanTimeSeconds: null as unavailable rather than zero.

const scan = await certscore_get_scan({ scanId });
const status = await certscore_get_scan_status({ scanId });

// scan.scanTimeSeconds and status.scanTimeSeconds are numbers or null.

Completed with limited coverage

No-go results remain structured

Scan, status, report, export, and explanation tools preservecompleted_limited,resultDisposition: no_go, the stable reason code, customer-safe copy, target-site versus scanner-limitation attribution, retry guidance, and a bounded evidence excerpt when retained.

Developer reference

Non-MCP integration options

The beginner MCP path ends above. Use these separate developer sections only when you are building a direct HTTP or TypeScript integration.

IntegrationAccessBest for
REST APILanguage-neutral HTTP resourcesBackend jobs, webhooks, and language-neutral integrations
TypeScript SDKTyped resource clients and polling helpersTyped Node.js and TypeScript applications

Workflow

Recommended agent sequence

1. certscore_scan_site with a public URL; it waits up to 45 seconds by default.
2. certscore_get_scan_status only when certscore_scan_site returns a non-terminal result containing scanId; poll with scanId only.
3. certscore_get_scan_bundle for canonical status, findings, bounded evidence, and pre-consent inventory.
4. certscore_get_report, certscore_get_evidence, certscore_list_findings, or cookie inventory only when a dedicated view is needed.
5. certscore_explain_finding for evidence summaries and caveats.
6. certscore_get_latest_domain_scan or certscore_get_latest_domain_pre_consent_cookies_trackers when the user asks for latest-domain data.

certscore_scan_site reports whether it reused a result, the freshness decision, whether anonymous quota was consumed, the remaining daily allowance, its UTC reset time, and the recommended next tool.

{
  "executionMode": "reused_scan",
  "reused": true,
  "reusedScanAgeSeconds": 90,
  "freshnessDecision": "reused_existing_scan",
  "quotaConsumed": false,
  "anonymousQuotaLimit": 20,
  "anonymousQuotaRemaining": 7,
  "anonymousQuotaResetAt": "2026-07-16T00:00:00.000Z",
  "upgradeSupportEmail": "[email protected]",
  "upgradeMessage": "For a higher-volume allowance, contact [email protected].",
  "recommendedNextTool": "certscore_get_scan_bundle"
}
certscore_get_pre_consent_cookies_trackers({
  scanId: "00000000-0000-4000-8000-000000000123"
})

certscore_get_latest_domain_pre_consent_cookies_trackers({
  domain: "ergoveritas.com",
  scanFrom: "eu_ie"
})

MCP tools return compact public-safe JSON. They must not infer raw-signal findings or convert automated review signals into legal conclusions. CertScore.ai outputs are automated public-web observations for review. They are not legal advice, certification, or a compliance determination. Group Cookies & Trackers rows by vendor, purpose, and host when the user wants a short review handoff.

Developer support

Need an API key, endpoint, SDK helper, MCP tool, or docs fix?

Contact [email protected] for preview API keys, feature requests, broken examples, schema questions, integration issues, or missing API coverage. Include the route, SDK method, MCP tool, scan ID, requested scopes, expected volume, or page URL when useful.