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.