Give your coding agent an SEO memory

One endpoint, 18 tools. The server profiles the project, returns the tips that apply, orders them by expected impact, and tracks what you already applied. Deterministic: no AI runs inside the MCP — the catalog is precomputed at ingestion time.

Get an API key

Create a key from your dashboard after you get access — while sign-in and checkout are in pre-order, join the waitlist. Keys start with sk- and are shown once.

{
  "mcpServers": {
    "seo-mcp": {
      "url": "https://seo-mcp.io/mcp",
      "headers": { "Authorization": "Bearer sk-..." }
    }
  }
}

Claude Code

claude mcp add --transport http seo-mcp https://seo-mcp.io/mcp \
  --header "Authorization: Bearer sk-..."

Verify with claude mcp list.

Claude Desktop

Add to claude_desktop_config.json (Settings → Developer → Edit config):

{
  "mcpServers": {
    "seo-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://seo-mcp.io/mcp",
        "--header",
        "Authorization: Bearer sk-..."
      ]
    }
  }
}

Cursor

Add to .cursor/mcp.json (or global MCP settings):

{
  "mcpServers": {
    "seo-mcp": {
      "url": "https://seo-mcp.io/mcp",
      "headers": {
        "Authorization": "Bearer sk-..."
      }
    }
  }
}

Codex

Add to ~/.codex/config.toml:

[mcp_servers.seo-mcp]
command = "npx"
args = ["-y", "mcp-remote", "https://seo-mcp.io/mcp", "--header", "Authorization: Bearer sk-..."]

What the agent gets

start_seo_session
Entry point for every SEO request. Returns the workflow state for project_id: needs_profile (fresh project) or resumed (applied/verified counts).
profile_project
Deterministically normalise repo signals (package.json, framework configs, homepage HTML, robots.txt, CMS markers) into a project profile with missing fields.
analyze_project
Return published tips applicable to this project, ordered foundation → quick wins → growth. Safe tips only unless include_risky is true.
get_action_plan
Ordered plan with why it applies, concrete steps, verification checks, prerequisites and risk warnings.
get_tip
Fetch a tip by id or slug: brief, extended brief, prerequisites, how-to steps with verification, source, and the agent prompt.
get_tips_by_ids
Batch fetch up to 20 tips by id or slug.
search_tips
Full-text search (FTS5/BM25) over published tips with category/tag filters and a total count.
list_categories
Category tree with published tip counts.
list_tags
Tags with published tip counts, for filtering.
get_next_action
Return the highest-priority unfinished tip for the project (foundation blockers first).
mark_applied
Record progress for a project. Status: applied | skipped | not_applicable | in_progress.
verify_tip
Record that the tip's verification check passed, with the observed evidence. Increments the anonymous verification success rate.
get_progress
List recorded tips for a project with status, verification and evidence.
report
Deterministic session report for a project: profile summary, applied and verified tips, open next actions. Use it to close a session.
reset_progress
Delete all recorded progress for a project. Destructive; confirm with the user first.
whats_new
Tips published or updated since a timestamp (default: last 30 days).
audit_html
Run deterministic SEO checks against supplied HTML, files from the repo, or a public URL (SSRF-guarded fetch). Returns findings with evidence and the tip ids that fix them. No AI.
submit_feedback
Report a tip as outdated, wrong, or that it worked. The message reaches the editors.

Resources: seo-mcp://categories, seo-mcp://categories/{slug}, seo-mcp://tips/{id}, seo-mcp://guide, seo-mcp://projects/{id}/progress. Prompts: audit_plan, fix_issue, weekly_review, profile_project.

Sample session

Ask your agent: “Connect to seo-mcp and work on the SEO of this project.” A correct first exchange:

→ tools/call start_seo_session { "project_id": "riverstone-web" }
← {
    "state": "needs_profile",
    "project_id": "riverstone-web",
    "workflow": ["Inspect the repo read-only", "Call profile_project", "Work get_next_action"],
    "applied": 0,
    "verified": 0,
    "applied_count": 0,
    "next_step": "Inspect package.json and the routing/pages directory, then call profile_project."
  }

→ tools/call profile_project {
    "project_id": "riverstone-web",
    "site_type": "saas", "cms": [], "stack": ["nextjs"],
    "size": "small", "goals": ["organic-traffic"]
  }
← { "profile_id": "…", "next_step": "Call get_next_action." }

project_id is the repository name (package.json name or the git remote), so the plan resumes across chats. Calls that change state return a next_step; follow it instead of guessing the next tool.

Connector OAuth and redirects

claude.ai and Claude Desktop discover the authorization server from /.well-known/oauth-protected-resource, register a public client, and use PKCE. You approve the connection once on the consent page; the server issues a normal revocable key.

Tip slugs are stable. If an admin renames one, the old URL answers with a 301 to the new slug, and tag aliases (nextjs, next.js) resolve to the canonical tag page.

Limits and errors

600 requests/hour per key by default. Errors come back as JSON with a code (invalid_api_key, payment_required, rate_limited, not_found). 429 responses carry Retry-After and X-RateLimit-Remaining. Search pagination uses next_cursor.

Ready to connect?

Pre-order the MCP pass — $19 once — and the docs above become live setup.