SEOAST documentation

MCP server

SEOAST speaks the Model Context Protocol, so an AI agent can audit a page the same way a person would through the web app — same checks, same scoring, same quota. Point your client at the endpoint below, send your API key as a header, and the 11 tools documented on this page appear.

Endpoint
https://seoast.ai/api/mcp
Transport
Streamable HTTP
Auth header
x-api-key

Authentication

Every tool call is authenticated and metered — including list_checks — with one exception: search_policy reads a static registry, needs no key and spends no quota. Send your key in the x-api-key header:

header
x-api-key: seoast_sk_1a2b3c4d_YOUR_KEY_SECRET

Authorization: Bearer <key> is accepted as an alternative, for clients whose config only exposes a bearer field. If you send both, they must carry the same key — a disagreement between the two headers is rejected rather than resolved by precedence.

A call carrying no key at all falls back to the anonymous tier, metered per client address at 10 requests a day. A call carrying an unrecognised, malformed or revoked key is refused outright rather than quietly downgraded — presenting a credential that does not resolve is an error, not the absence of one. The tool result says which of those happened.

Claude Code

Add the server once from the terminal:

terminal
claude mcp add seoast https://seoast.ai/api/mcp \
  --transport http \
  --header "x-api-key: seoast_sk_1a2b3c4d_YOUR_KEY_SECRET"

Or commit it to the project so the whole team picks it up, by writing .mcp.json at the repository root:

.mcp.json
{
  "mcpServers": {
    "seoast": {
      "type": "http",
      "url": "https://seoast.ai/api/mcp",
      "headers": {
        "x-api-key": "seoast_sk_1a2b3c4d_YOUR_KEY_SECRET"
      }
    }
  }
}

Confirm the connection with /mcp inside Claude Code. The server reports itself as seoast with 11 tools.

Cursor

Add the server to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json inside a single project:

~/.cursor/mcp.json
{
  "mcpServers": {
    "seoast": {
      "url": "https://seoast.ai/api/mcp",
      "headers": {
        "x-api-key": "seoast_sk_1a2b3c4d_YOUR_KEY_SECRET"
      }
    }
  }
}

Cursor picks the file up on save; the server appears under Settings → MCP, where the tools can be toggled individually.

Tools

audit_url

input: { url }

Runs the full on-page audit against one URL. The page is fetched server-side over HTTP or HTTPS, redirects are followed, and the server-rendered HTML is scored. Client-side rendered content is not executed, and private, loopback and cloud-metadata addresses are refused.

  • url (string, required) — The page to audit. A bare host such as example.com/pricing is treated as https.

Quota: one request per call. Makes an outbound request to the URL you pass.

Returns: A readable report — score out of 100, band, fetch summary, remaining quota, then every failing and warning check with what was measured and the specific fix — followed by a compact JSON block of the same findings for programmatic use.

list_checks

input: no arguments

Returns the catalogue: every check id, what it measures, its weight, and how the score and band are derived. Useful for explaining a report, or for deciding whether SEOAST answers a question before spending an audit on it.

Quota: one request per call. Makes no outbound request.

Returns: The catalogue as readable text, the quota line, plus the same catalogue as JSON.

site_audit

input: { url, location? }

Runs the local-business audit against one page: LocalBusiness schema, name, address and phone, location in the title and H1, opening hours, geo coordinates, a maps link and linked profiles, all read from the HTML the server returned. It does not query Google or crawl the rest of the site.

  • url (string, required) — The business website page to audit. A bare host is treated as https.
  • location (string, optional) — City or region for the location checks, for example "Austin, TX".

Quota: one request per call. Makes an outbound request to the URL you pass.

Returns: A readable report of the local checks with the measurement and fix for each one that does not pass, followed by a compact JSON block of the same findings.

site_scan

input: { url, maxPages? }

Crawls the site from the given URL, following internal links and the XML sitemap and respecting robots.txt, and runs the full page audit on every page it reaches. Then reports what only a whole-site view shows: broken internal links, sitemap URLs that error, redirect or are noindex, orphan pages, click depth, duplicate titles and H1s, thin pages, and page checks that repeat across a template.

  • url (string, required) — The site to scan, usually its homepage. A bare host is treated as https.
  • maxPages (integer, optional) — Upper bound on pages requested. Clamped to the page limit for your key tier.

Quota: one request per call. Makes an outbound request to the URL you pass.

Returns: A readable report of site-wide issues with example URLs and the checks repeated across pages, grouped by template, followed by a JSON digest of the same data.

list_site_audit_checks

input: no arguments

Returns the catalogue for the local-business audit: each check, what it measures, its weight and how the score is derived.

Quota: one request per call. Makes no outbound request.

Returns: The catalogue as readable text, the quota line, plus the same catalogue as JSON.

remediation_plan

input: { url, repository? }

Audits one URL, then turns the measured findings into a plan: the evidence, the affected path, the desired state, a fix class (AUTO-SAFE, REVIEW-REQUIRED or HUMAN-ONLY), the policy basis with its source, and tests and acceptance criteria. Written to be handed to a coding agent.

  • url (string, required) — The page to audit and plan fixes for.
  • repository (string, optional) — The repository that serves this URL, for example github.com/org/repo. Up to 300 characters.

Quota: one request per call. Makes an outbound request to the URL you pass.

Returns: An implementation prompt for an AI builder, an executive remediation plan, and a JSON block with the site search manifest, the indexation decision, the profile score and the policy rules cited.

publish_gate

input: { html, url, targetKeyword?, author?, datePublished?, dateModified?, ymyl?, corpus?, batch? }

Judges a draft before it is published: keyword stuffing, near-duplicates of the pages you supply, scaled or doorway patterns across a batch, unsourced statistics, author and date integrity, structured-data accuracy, hidden text, link schemes, images and directives. It reads only what you send; the server makes no outbound request.

  • html (string, required) — The draft, as HTML. Up to 1,000,000 characters.
  • url (string (URL), required) — Where the draft will be published.
  • targetKeyword (string, optional) — The phrase the draft is written for.
  • author (string, optional) — The named author.
  • datePublished (string, optional) — Publication date.
  • dateModified (string, optional) — Last-modified date.
  • ymyl ("high" | "medium" | "low", optional) — How sensitive the topic is (health, money, safety).
  • corpus (array of { url, text }, optional) — Existing pages to compare against for near-duplicates. Up to 200.
  • batch (array of { url, text }, optional) — Other drafts in the same batch, to detect scaled or doorway patterns. Up to 200.

Quota: one request per call. Makes no outbound request.

Returns: A verdict of BLOCK, REVIEW or PASS with the word count and every gate that raised a concern, the quota line, and the full gate report as JSON.

create_monitored_site

input: { domain, label?, features? }

Register a new site for real-time monitoring. Returns the site ID and embed code. The snippet monitors SEO health continuously: checks schema presence, measures Core Web Vitals, detects when critical elements are removed, and triggers instant alerts. Requires a paid plan.

  • domain (string, required) — Domain to monitor (e.g., example.com).
  • label (string, optional) — Human-readable label for this site.
  • features ({ healthCheck, coreWebVitals, autoFix, changeDetection }, optional) — Features to enable (all boolean, all default to true except autoFix).

Quota: one request per call. Makes no outbound request.

Returns: Site ID, domain, label, enabled features, and the complete embed code for <head>.

list_monitored_sites

input: no arguments

List all sites registered for real-time monitoring. Shows which sites have the SEOAST snippet embedded, when they last reported events, and what features are enabled.

Quota: one request per call. Makes no outbound request.

Returns: A list of monitored sites with their IDs, domains, labels, features, active status, and last seen timestamps.

get_site_events

input: { siteId, type?, url?, limit? }

Get recent events from a monitored site: health checks, Core Web Vitals, schema changes, and alerts. Shows what the snippet is reporting in real-time. Optionally filter by event type or URL.

  • siteId (string, required) — Site ID to get events for.
  • type ("health_check" | "core_web_vitals" | "schema_change" | "error" | "heartbeat", optional) — Filter by event type.
  • url (string, optional) — Filter by page URL.
  • limit (number, optional) — Maximum events to return (1-100, default: 20).

Quota: one request per call. Makes no outbound request.

Returns: Recent events with timestamps, URLs, types, and data payloads.

search_policy

input: { category?, claimClass? }

Reads the versioned Search Policy Registry: Google requirements and best practices quoted from Google documentation with retrieval dates, and SEOAST heuristics labelled as heuristics.

  • category (string, optional) — Only rules in this category.
  • claimClass ("google_requirement" | "google_best_practice" | "seoast_heuristic" | "observed_correlation" | "experimental_hypothesis", optional) — Only rules of this class.

Quota: none. No key is needed. Makes no outbound request.

Returns: The registry version and one line per matching rule, with its class, quote and source where it has one.

Quota

Each metered tool call spends one request from the presented key's daily allowance, which resets at 00:00 UTC. Anonymous callers are metered against a hash of the client address the platform reports; where the platform reports none, the call is refused rather than served unmetered. An audit whose target host is unreachable still spends the request — the crawl was attempted, and metering after the fact would let the crawler be used for free.

TierRequests per UTC day
anonymous (no key)10
free100
pro2,000
scale20,000

A successful result from audit_url, site_audit, list_checks, list_site_audit_checks or publish_gate carries the quota line — used, remaining, and the reset timestamp — so an agent can pace itself without a second call.

What gets checked

audit_url runs 28 checks against the server-rendered HTML of the URL you pass; site_audit runs 10 local-business checks against the same kind of response. Each one returns pass, warn, fail, or not measurable; a check that could not be measured is excluded from the score rather than counted as a zero, so the number always reads as a percentage of what was actually assessable.

  • http_status — HTTP status
  • redirect_chain — Redirect chain
  • transport_security — HTTPS
  • x_robots_tag — X-Robots-Tag header
  • robots_txt — robots.txt
  • robots_meta — Robots meta directives
  • canonical — Canonical URL
  • sitemap — XML sitemap
  • title — Title tag
  • meta_description — Meta description
  • open_graph — Open Graph tags
  • twitter_card — X (Twitter) card
  • heading_hierarchy — Heading hierarchy
  • h1_title_alignment — H1 and title alignment
  • content_readability — Content depth and readability
  • render_dependency — Server-rendered content
  • internal_linking — Internal linking
  • image_alt — Image alt text
  • image_dimensions — Image dimensions (layout shift)
  • structured_data — Structured data (JSON-LD)
  • html_lang — HTML lang attribute
  • viewport — Viewport meta tag
  • llms_txt — llms.txt (non-Google AI crawlers, not scored)
  • qa_content — Question-and-answer extractability
  • business_identity — Business identity
  • business_contact — Business contact details (NAP)
  • gbp_match — Google Business Profile match
  • professional_credentials — Professional license and credentials

Call list_checks for the full description of each one, including the thresholds it uses and its weight in the score, and list_site_audit_checks for the local-business set.

Verify the connection

A plain HTTP request is enough to confirm the endpoint and the key before wiring up a client. This lists the tools without spending quota, because tools/list is a protocol call rather than a tool call:

terminal
curl -sS https://seoast.ai/api/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "x-api-key: seoast_sk_1a2b3c4d_YOUR_KEY_SECRET" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'