Quick start
Get SEOLint running inside your AI client in three steps. The whole flow takes about two minutes.
Run the connect command
Run this in any terminal. No API key needed up front — the command opens your browser to sign in.
npx -y seolint-mcp connect claude-code
Replace claude-code with your client: claude-desktop, cursor, windsurf, or vscode.
Approve in your browser
A browser window opens to seolint.dev/cli-auth. Sign in if needed, then click Approve seolint-mcp on this device. The terminal automatically receives your API key and writes it to the right config file.
Restart your client and ask the agent
Quit and reopen your AI client (a Reload Window doesn't pick up the new MCP server). Then ask:
"What should I do next to improve the SEO on mysite.com?"
The agent will call next_action first, then scan_website if needed. From here, the agent decides which tools to call based on the task.
Installation
The connect command in Quick start handles install + auth in one go. If you prefer to set up the config file yourself, pick your AI client below and follow the manual setup.
Current host support
One command — adds the server, sets the env var, and writes the config for you.
claude mcp add seolint \ --env SEOLINT_API_KEY=<your_key> \ -- npx -y seolint-mcp
Restart Claude Code afterwards. Verify with `npx -y seolint-mcp doctor`.
Verify with doctor
npx -y seolint-mcp doctor to check the env var, API reachability, key validity, subscription, and quota in one shot.Authentication
The MCP server authenticates with a single API key per account, passed as the SEOLINT_API_KEY environment variable in your MCP client config. The same key works across every client, the REST API, and the CLI — scans are unified under one user, so memory is shared everywhere.
Use connect for the easy path
connect command in Quick start opens a browser, you click Approve, and your API key is written into your client config automatically. No copying, no JSON editing. Use that whenever possible — manual setup is documented below as a fallback.Environment variables
| Name | Type | Description |
|---|---|---|
SEOLINT_API_KEY | string | Your API key from seolint.dev/api. Required by every command. |
SEOLINT_API_URL | string | Override the API base URL. Defaults to https://seolint.dev. |
Rate limits
Limits are based on your plan's monthly scan quota. There's no per-second rate limit — scans naturally cap concurrent volume because each one takes 15–45 seconds.
| Plan | On-demand scans / month | Concurrent |
|---|---|---|
| Free preview | 1 | 1 |
| SEOLint / $79 | 100 | 5 |
| Custom | Negotiated | Negotiated |
Backoff guidance
HTTP 429 with a Retry-After header set to seconds remaining until next month. Well-behaved MCP clients respect this and surface the wait time to the user instead of retrying.MCP tools reference
The server registers the following 12 tools with your AI assistant. The agent decides which to call automatically based on your prompt — these descriptions are what the agent sees.
scan_websitecoreRun a full scan and label issues as NEW, PERSISTING or REGRESSED based on prior scans of the same URL. The single most important tool — does scanning, history diffing, and recurring tracking in one call.
Parameters
| Name | Type | Description |
|---|---|---|
url | string | Full URL to scan, e.g. https://example.com |
Returns
Markdown report with scan_id, issue counts, scan memory block, per-issue fix instructions.
next_actioncoreThe 'what should I do next' oracle. Returns ONE concrete next action grounded in scan history, memory, and site profile — including 'wait and re-scan in N days' when nothing needs doing right now.
Parameters
| Name | Type | Description |
|---|---|---|
url | string | URL to get a recommendation for |
Returns
Markdown card with the recommendation, reasoning, confidence level, and a Copy fix prompt action.
get_open_issuescoreReturn the unresolved issues for a URL based on the latest scan — without running a new scan. Use this for a flat actionable list.
Parameters
| Name | Type | Description |
|---|---|---|
url | string | URL whose open issues you want |
Returns
Markdown list of open issues plus any regressed-from-fixed.
get_site_statuscoreHigh-level memory picture: trend (improving / degrading / stable), recurring patterns, days since last scan, rescan recommendation. Use for 'how is this site doing?' questions.
Parameters
| Name | Type | Description |
|---|---|---|
url | string | URL to check |
Returns
Markdown summary with trend label and rescan recommendation.
get_site_intelligencecoreFull intelligence for a domain: ICP, sitemap structure and gaps, cross-page template issues, scan coverage. Call at the start of any SEO session to understand the site before diving into individual pages.
Parameters
| Name | Type | Description |
|---|---|---|
domain | string | Domain to analyze, e.g. example.com (no protocol) |
Returns
Markdown brief covering site profile, sitemap, cross-page patterns and coverage.
list_my_sitescoreList every URL you have scanned with the latest scan summary per site.
Parameters
No parameters.
Returns
Markdown table sorted by last-scanned, with rescan flags.
mark_issues_fixedcoreMark issues as fixed after the user confirms. If a previously fixed issue reappeared, the resurface count is incremented so the system learns it keeps recurring.
Parameters
| Name | Type | Description |
|---|---|---|
scan_id | string | Scan UUID containing the issues |
issue_ids | string[] | Issue IDs to mark fixed |
Returns
Confirmation message + which IDs had previously been fixed.
dismiss_issuescoreDismiss issues as false positives or intentional design choices. Dismissed issues are hidden from future scans and persist across runs.
Parameters
| Name | Type | Description |
|---|---|---|
scan_id | string | Scan UUID containing the issues |
issue_ids | string[] | Issue IDs to dismiss |
reason | string | Why these are being dismissed |
Returns
Confirmation message.
get_scanutilFetch a previous scan by ID. Useful when scan_website timed out and you want to retrieve the result later.
Parameters
| Name | Type | Description |
|---|---|---|
scanId | string | The scan UUID returned by scan_website |
Returns
Markdown report (or status string if still pending).
cancel_scanutilCancel a scan that is still pending. Escape hatch when scan_website is taking too long or the wrong URL was scanned.
Parameters
| Name | Type | Description |
|---|---|---|
scanId | string | The scan UUID to cancel |
Returns
Status message. No effect on scans already complete, errored or cancelled.
get_site_historyutilScan history plus resolved/dismissed/recurring state for a URL. Call this before starting any fix session.
Parameters
| Name | Type | Description |
|---|---|---|
url | string | URL whose history you want |
Returns
Markdown timeline with full issue lifecycle.
undismiss_issuesutilUn-dismiss previously dismissed issues so they appear as open again.
Parameters
| Name | Type | Description |
|---|---|---|
scan_id | string | Scan UUID (used to identify the URL) |
issue_ids | string[] | Issue IDs to un-dismiss |
Returns
Confirmation message.
CLI reference
The seolint-mcp npm package includes a CLI for setup, validation, and running the MCP server. Most users only need connect and doctor.
| Command | Description |
|---|---|
npx -y seolint-mcp connect [host] | Browser-based sign-in. Opens seolint.dev, you click Approve, the API key is written into the host's MCP config automatically. Recommended. |
npx -y seolint-mcp doctor | Validate your setup end-to-end: env var, API reachability, key validity, subscription, quota. Colored ✅/⚠️/❌ output. |
npx -y seolint-mcp init [host] | Write the MCP config file for [host] using SEOLINT_API_KEY from your shell. Merges with existing servers, backs up the original. |
npx -y seolint-mcp upgrade [host] | Re-run init for the host and report the installed package version. |
npx -y seolint-mcp | Default mode — runs as the MCP server over stdio. Used by your MCP client, not by you directly. |
npx -y seolint-mcp --version | Print the installed package version. |
Scan memory
Memory is what makes SEOLint different from a one-shot scanner. Every scan is compared against history, and every issue is annotated with one of three states.
NEW
First time we've seen this issue on this URL.
PERSISTING
Was in the previous scan, still not fixed.
REGRESSED
Was marked fixed before, came back.
When the agent calls mark_issues_fixed after applying a fix, SEOLint records the resolution. If the same issue ever resurfaces, the resurface count is incremented — over time the system learns which fixes are flaky and which stick. Use dismiss_issues with a reason to permanently silence false positives.
Troubleshooting
Common issues encountered when connecting the MCP server. When something feels wrong, run npx -y seolint-mcp doctor first — it covers 90% of setup problems.
"API key required" — but I set it
Tool calls return 401 Invalid API key
Scans are slow or hanging
HTTP 429 — Scan limit reached
doctor reports the API is unreachable
FAQ
How do I get an API key?
Where do I put SEOLINT_API_KEY?
Can I use SEOLint with multiple AI clients at once?
How does scan memory work across runs?

Ready to connect?
One command. Browser opens. You click Approve. Done.
npx -y seolint-mcp connect claude-code