MCP Remote MCP server for Cursor and Claude Code, on your existing API key → Read the docs
QuikSEO . com

CI/CD & preview gateway for technical SEO

SEO Audit Tool for Websites, Builds and AI Agents

QuikSEO tests staging branches and production URLs against your declarative site contract, groups every finding by URL pattern, and writes a remediation prompt your AI assistant can act on. Then it re-audits and shows the diff. Start with a free audit of any public page below.

PIPELINESAMPLE · example.com
[1] Fetching DOM (SafeFetch)pinned IP
[2] Evaluating quikseo.config.json8 assertions
[3] Aggregating templates4 groups
0 critical1 error0 warning3 review2 not_checked
85/100
Score · 100 − 15 (1 error)
Indexability Head order JSON-LD · review Canonical · fail
Try:

Free without an account: 10 single-page audits a month, each report with its own link. Create a free account to audit HTML and keep the history.

92documented rules, each counted in the score when it applies
5explicit rule states
2 MiBHTML limit, reported when exceeded

RUNS INSIDE

GitHub ActionsCloudflare PagesVercelCursorClaude CodeMCP clients

SAMPLE FEED

  • example.com /products/* · CTR-canonical-self resolved
  • docs.example /guides/* · heading level skipped open
  • shop.example build 7c1e0aa · CTR-url-no-trailing-slash new
  • blog.example /2026/* · title length review
  • outlet.example.com preview vs production · 0 new pass
  • agency.example robots.txt · 403 access blocked
  • partner-shop.example /cart · noindex expected pass
  • saas.example / · depends on JavaScript score null

01 — The core loop

Contract. Evidence. Prompt. Re-Audit.

URL or HTML → audit → findings with evidence → remediation prompt → change → re-audit → diff.

git:main (staging-preview) example.com · Astro · sample

Step 1 · Declare

A Site Contract, Checked Into the Repo

Declarative assertions only. No user code runs; selectors and patterns are checked for length when you save the contract. Hover an assertion to see what it enforces.

  • reported asCTR-<id>
  • affects scorenever
  • version hashstored with each audit
quikseo.config.json
1{2  "version": 1,3  "assertions": [4    { "id": "canonical-self", "type": "canonicalPolicy",5      "absolute": true, "selfReferencing": true, "severity": "error" },6    { "id": "url-no-trailing-slash", "type": "urlPolicy",7      "trailingSlash": "never", "severity": "warning" },8    { "id": "head-order", "type": "headOrder",9      "order": ["charset", "viewport", "title", "description", "canonical"], "severity": "warning" },10    { "id": "one-h1", "type": "required",11      "selector": "h1", "count": 1, "severity": "error" },12    { "id": "no-generator", "type": "forbidden",13      "selector": "meta[name=\"generator\"]", "severity": "info" },14    { "id": "no-faqpage", "type": "forbidden",15      "jsonLdType": "FAQPage", "severity": "warning" },16    { "id": "heading-case", "type": "headingCase",17      "style": "title", "levels": [1, 2, 3], "severity": "warning" },18    { "id": "title-no-suffix", "type": "titlePattern",19      "mustNotMatch": " [|-] [^|-]+$", "severity": "warning" }20  ]21}

02 — Rule states & score

“Couldn’t Check” Is Never “Passed.”

Every rule returns one of five states, with severity, the observed value, up to 2 KiB of evidence and its source. Counts by severity come before the score.

  • passThe rule ran and the page meets it.
  • failThe rule ran and the page doesn’t meet it. Lowers the score.
  • reviewFor the owner to confirm. Lowers the score until it passes.
  • not_applicableThe rule doesn’t apply to this page. Left out of the score.
  • not_checkedThe rule couldn’t run. Never reported as pass, so it lowers the score.

Score formula

round(pass ÷ (all − not_applicable) × 100)
pass countsfail againstreview againstnot_checked againstnot_applicable left out

Every applicable check weighs the same; severity orders the fixes. Site contract assertions stay outside the score.

100every applicable check passedNot “perfect SEO.”
nullpage depends on JavaScriptAlso on blocked access, incomplete HTML or a required rule that didn’t run.

03 — Architecture

Built Like a Linter, Not a Report.

Template grouping

One Prompt Per Root Cause, Not One Error Per URL

The pattern comes from your contract’s scopes or from the path segments that vary. A group is resolved only when every page in it passes on re-audit.

Preview vs production gate

Each path is audited on both origins. Results: new, resolved, still failing, not comparable. The Action can stop a deploy on new findings above your threshold.

Some checks haven’t completed yet
#482 · fix/canonical-self · sample
  • quikseo checkrunning…
  • site contractrunning…
  • new findingsrunning…
Merge blocked until checks pass

Closed-loop MCP server

Remote MCP over HTTP, authenticated with your existing API key. Same quota as the interface. Tools: audit_url, audit_html, get_fix_prompt, rescan, compare_urls and more.

~/.cursor/mcp.json
{
    "mcpServers": {
        "quikseo": {
            "url": "https://app.quikseo.com/mcp",
            "headers": {
                "Authorization": "Bearer <QUIKSEO_API_KEY>"
            }
        }
    }
}

Zero SEO folklore

Rules cite Google Search Central and W3C documentation, never subjective blog opinions. Editorial thresholds become review, not fail.

Common claimQuikSEO treats it as
Titles must stay under 60 charactersEditorial threshold → reviewtitle.length · S10
A missing canonical is an errorreview, not failcanonical.missing · S12
alt="" counts as missing alt textValid for decorative imagesimages.alt_missing · S23
Low word count hurts rankingsinfo, outside the scoreeditorial.word_count

04 — Inferred contract

Your Site Already Has a Contract. We Write It Down.

QuikSEO reads the pages you have already audited and proposes assertions from their dominant conventions: a convention followed by at least 80% of the pages that show it, never from fewer than 3 pages. The inference is statistical and deterministic. Each proposal shows how many pages follow it, with examples of deviations.

Nothing becomes a rule until you accept it.

proposed for example.com · 1,862 pages · sample0 of 5 accepted
urlPolicy: trailingSlash never
1,804 of 1,862 pages · 96.9%58 deviations, e.g. /blog/2024/
headOrder: charset → viewport → title → description → canonical
1,862 of 1,862 pages · 100.0%0 deviations
required: exactly one h1
1,790 of 1,862 pages · 96.1%72 deviations, e.g. /search
titlePattern: no brand suffix
1,711 of 1,862 pages · 91.9%151 deviations, e.g. /about
headingCase: title
1,508 of 1,862 pages · 81.0%354 deviations, e.g. /blog/*

05 — AI suggestions

AI Proposes. Rules Decide.

For titles, descriptions, alt text, headings and JSON-LD, the model proposes a concrete value. Before you see it, the suggestion runs through the same rules and your site contract. One that fails is never shown. After you apply it, a re-audit confirms the result.

  1. Findings stay deterministic. AI never decides pass or fail.
  2. Everything AI writes is labelled “AI suggestion”.
  3. The model gets selected, limited fields, never the full HTML.
  4. Each call uses one AI credit, capped per plan.
title · /products/linen-shirt · sampleAI suggestion

Candidate 2 of 2

“Linen Shirt in Natural White”

  • ✓Title present, one per pagetitle.missing
  • ✓Length 28 charstitle.length
  • ✓No brand suffixCTR-title-no-suffix

Shown as AI suggestion · re-audit after you apply it

06 — Regression attribution

Every New Issue Points to the Build That Introduced It.

Reports from the CLI and the Action carry the commit and branch. A post-deploy trigger re-audits monitored URLs right after you publish.

  1. e91b2c0mainclean
  2. 4d7a113mainclean
  3. a3f9e12feat/header-refreshintroduced
  4. b02c9femainstill failing
  5. c71d0b4fix/canonical-selfresolved
  6. f3e8a57mainclean

● CTR-canonical-self · first seen in a3f9e12 on feat/header-refresh · sample

07 — CLI & GitHub Action

Check the Build Before It Ships.

The CLI reads the HTML files in your build, maps them to URLs from --base-url and sends them in batches to the API. Rules live in one place, on the server. It needs an account and an API key, uses your units, and the HTML is evaluated and dropped.

~/example — zsh · sample
$ npx quikseo check ./dist --base-url https://example.comQuikSEO check of 1862 page(s) at a3f9e12 (feat/header-refresh)1420 failure(s), 1420 new, 1420 blocking (fail on new, threshold error) products/linen-shirt/index.html -> https://example.com/products/linen-shirt (score 100)  x [error] CTR-canonical-self NEW: The canonical does not point to the page itself.exit 1
0
nothing blocks
1
blocking findings
2
error
.github/workflows/seo.yml
name: seo-check
on: [pull_request]
jobs:
  quikseo:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm run build
      - uses: OWNER/REPOSITORY/packages/action@REF
        with:
          directory: dist
          base-url: https://example.com
          fail-on: new
          threshold: error
          baseline-branch: main
          api-key: ${{ secrets.QUIKSEO_API_KEY }}

08 — Portfolio

Many Sites, One Dashboard.

Each website keeps its own contract, schedule and alerts. The websites list shows the latest score of every site; the dashboard lists the regressions of the last seven days, the checks that failed and the next scheduled checks.

SiteLatest scoreOpen issuesRegressionsNext check
example.com 97 1 0 in 4h
blog.example.com 99 0 0 in 4h
docs.example.com 88 4 1 in 1d
outlet.example.com 94 2 0 in 2d
partner-shop.example 77 7 2 in 6d

Sample data.

Regression alert · docs.example.com

+ canonical.conflict on /guides/install

1 new issue

Alerted once, when it opens or comes back. A critical issue is alerted only after a confirmation re-audit, so a passing glitch never pages you.

09 — Remediation pack

The Whole Audit, as One File Your Assistant Can Work Through.

Export an audit or crawl as Markdown, in the report’s priority order: the failed checks first, then failed site contract assertions and the checks to review, each with evidence, the steps, a prompt and an acceptance condition. Commit it to the repo and work through it item by item. Generated from templates, without AI.

quikseo-remediation-example.com.md
# QuikSEO Remediation Pack: example.com

This pack lists 2 failed groups to fix and 2 outside the page score.

## Fix First: Failed Checks

### 1. Skipped Heading Level
- Pages: 38 of 120 audited pages matching `/blog/*`

## Failed Checks Outside the Page Score

### 3. Canonical Points to the Page Itself
- Pages: 1420 of 1862 audited pages matching `/products/*`

10 — SafeFetch

A Scanner That Is Safe to Point at and Polite to Be Crawled By.

SafeFetch is the only path from a user-supplied URL to a network request. Audits, free tools, sitemaps, crawls and notification webhooks all go through it.

  1. http and https only, on ports 80 and 443. Userinfo in the URL is rejected.
  2. DNS resolved first. Private, loopback, link-local and reserved IPs rejected, IPv4 and IPv6.
  3. Connection pinned to the validated IP, so there is no second lookup.
  4. Protocols restricted for requests and redirects.
  5. Redirects followed manually, at most 5, each hop validated.
  6. No cookies, and only allow-listed request headers are sent.
  7. 20 s per audit and 2 MiB of HTML. Exceeding it is reported, never a silent cut.
  8. The platform’s own origins are rejected.
safefetch.log · sample
GET http://169.254.169.254/latest/meta-data ✕ link-localGET http://localhost:8080/admin ✕ loopbackGET https://shop.example → 301 → http://10.0.0.4/ ✕ hop 2: privateGET https://user:pw@site.example ✕ userinfoGET https://site.example 403 · access blocked (not an SEO issue)GET https://example.com ✓ 200 · pinned to validated IP

Crawler politeness

QuikSEOBot/0.1 (+https://quikseo.com/docs/crawler)

  • 1 request in flight per host
  • ≥ 1 s between requests
  • robots.txt respected by crawls
  • crawl only on verified sites

11 — Comparison

Where QuikSEO Fits.

CapabilityQuikSEOWhere to find it
Declarative site contract✓ quikseo.config.jsonSite contract docs
Template grouping, one prompt per cause✓ audits and crawlsRule documentation
Hosted build check from CI✓ CLI + ActionGitHub Action docs
Preview vs production as a deploy gate✓ verified originsCLI docs
MCP server✓ remote, closed loopMCP server docs
AI suggestions verified by the rules✓ hidden when a check failsAI credits per plan

Only QuikSEO’s own capabilities are listed. We do not publish claims about other products.

Scope

What QuikSEO Doesn’t Do

  • Rank tracking
  • Backlink database
  • Keyword volumes
  • Article generation
  • JavaScript renderingJS-dependent pages get a prominent warning and a null score.
  • Automatic fixes in productionPrompts and suggestions only. You apply the change.

12 — Pricing

Pay for Pages Audited, From Any Source.

1 unit = 1 audited page, whether it comes from the interface, API, CLI, monitoring, a crawl or a comparison. MCP and API access are included in every account. Prices in USD.

Guest

No account

$0 /mo

Sites
0
Pages per crawl
—
Monitored URLs
0
Frequency
Manual
Audits / month
10
AI credits / month
—
Run a Free Audit

Free Account

$0 /mo

Sites
1
Pages per crawl
—
Monitored URLs
0
Frequency
Manual
Units / month
50
AI credits / month
10
Create Account

Starter

$14 /mo

Sites
3
Pages per crawl
50
Monitored URLs
30
Frequency
Weekly
Units / month
1,000
AI credits / month
100
Choose Starter

Agency

$89 /mo

Sites
50
Pages per crawl
500
Monitored URLs
500
Frequency
Daily
Units / month
30,000
AI credits / month
2,000
Choose Agency

A comparison audit costs 2 units per path, one for each origin. Compare every plan feature.

13 — FAQ

SEO Audit Tool FAQ

Is the SEO Audit Really Free?

Yes. Without an account you can audit single pages every month, up to the visitor limit, and share each report by its link. A free account adds monthly audits for one website, HTML audits and alerts; paid plans add crawls, scheduled monitoring and more websites.

Can It Check My Whole Website?

A single audit checks one page. To check a whole website, verify that you own it and start a crawl: QuikSEO follows its links and sitemap, audits pages up to the limit of your plan and reports site-wide problems such as duplicate titles, broken links and orphan pages. Crawls are part of the paid plans.

How Is This Different From an SEO Checker Score?

The score is not a black box: it is the share of applicable checks that passed, so 70 passed out of 81 applicable checks gives 86. Checks that do not apply are left out, the report shows the calculation, and every finding names its rule and its evidence.

Can I Run the Audit From an API?

Yes. With an account, the key on the API page of your account runs audits from the REST API, from the command line tool and from AI agents through the MCP server.

Does QuikSEO Render JavaScript?

No. Pages that depend on JavaScript get a prominent warning and a null score, so an empty shell is never reported as passing.

Is the HTML From My Build Stored?

No. The CLI sends the HTML of your build to the API in batches of up to 50 pages. It is evaluated and dropped; only the results are kept.

What Counts as a Unit?

One audited page, from any source: the interface, the API, the CLI, monitoring, a crawl or a comparison. A comparison audits each path on both origins, so it costs two units per path.

Can the MCP Server Change My Code?

No. Every tool reads or audits. Your assistant makes the change; QuikSEO re-audits it and returns what was resolved, what still fails and what is new.

Does AI Decide Whether a Rule Passes?

No. Findings are deterministic. AI suggestions are labelled, checked against the rules and your contract before they are shown, and confirmed by a re-audit after you apply them.

What Happens When a Site Blocks the Crawler?

An answer of 401, 403 or 429, or a bot challenge, is reported as access blocked, not as an SEO problem. QuikSEOBot identifies itself, and crawls respect robots.txt.

Make Technical SEO a Passing Test.

Create Free Account No credit card required
~/yoursite
$ npx quikseo check ./dist --base-url https://yoursite.com  Free account: 50 units / month
Free audit0%