OpenSEO MCP

Live

OAUTH 2.1

SEO AUDITS

Marketing

OpenSEO MCP gives your agent SEO audits, rank tracking, keyword and SERP research, local business data, and Google Analytics and Search Console reports per project.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
OpenSEO MCP
agent · Acme Q3
Run
Show the top issues from my latest site audit of acme.com.
S
openseomcp_get_audit_issues
96ms
SEO agent
Your latest audit flagged 14 issues. The top three: 22 pages missing meta descriptions, 9 broken internal links, and 4 redirect chains, each with a how-to-fix step.
Sources: latest site audit, 186 pages crawled
openseomcp
14 issues
18:29
Message Claude...

Tools your SEO audit agent reaches for on OpenSEO, scoped per user.

CALL ANY TOOL
46 tools for SEO audits and research: run site audits, track rankings, research keywords and SERPs, check backlinks and local listings, and read GA4 and Search Console data.
openseomcp_add_rank_tracking_keywords
Add rank tracking keywords
Add keywords to an existing rank tracker. The mutation itself uses no credits and does not start a check or fetch metrics, but scheduled trackers will spend credits on future recurring checks. For a scheduled tracker, call estimate_rank_tracker_cost with additionalKeywordCount, show the recurring estimate and live-fallback caveat to the user, and pass the approved nominal per-check estimate as maxEstimatedScheduledCheckCredits. This approval is not a runtime spending cap: rejected, failed, or timed-out queued tasks may use additional separately billed live fallback. Existing and repeated keywords are skipped, and `added` is the number actually inserted.
Parameters
Name
Type
Required
Description
keywords
array
Required
Keywords to track. Existing and repeated keywords are skipped.
projectId
string
Required
Required. The OpenSEO project ID to scope this call to. Get one from list_projects.
trackerId
string
Required
Rank tracker ID from get_rank_tracker.
matchCase
boolean
Optional
Track the keywords exactly as typed instead of lowercasing them. Defaults to false. Use for brand names where Google's results differ by capitalization; a cased keyword is tracked and billed separately from its lowercase form. Default: `false`.
maxEstimatedScheduledCheckCredits
integer
Optional
Nominal queued credits per scheduled check that the user approved after seeing estimate_rank_tracker_cost with additionalKeywordCount. Required for scheduled trackers. This is an estimate approval, not a runtime cap; live fallback may add separately billed credits.
openseomcp_create_project
Create project
openseomcp_estimate_rank_tracker_cost
Estimate rank tracker cost
openseomcp_find_serp_competitors
Find serp competitors
openseomcp_get_audit_issues
Get audit issues
openseomcp_get_audit_pages
Get audit pages
openseomcp_get_backlinks_overview
Get backlinks overview
openseomcp_get_backlinks_profile
Get backlinks profile
openseomcp_get_business_reviews
Get business reviews
openseomcp_get_domain_keyword_suggestions
Get domain keyword suggestions
openseomcp_get_domain_overview
Get domain overview
openseomcp_get_google_analytics_ecommerce_performance
Get google analytics ecommerce performance
openseomcp_get_google_analytics_key_events
Get google analytics key events
openseomcp_get_google_analytics_organic_landing_pages
Get google analytics organic landing pages
openseomcp_get_google_analytics_page_performance
Get google analytics page performance
openseomcp_get_google_analytics_site_search
Search get google analytics site
openseomcp_get_google_business_questions
Get google business questions
openseomcp_get_keyword_metrics
Get keyword metrics
openseomcp_get_local_serp_results
Get local serp results
openseomcp_get_rank_tracker
Get rank tracker
openseomcp_get_ranked_keywords
Get ranked keywords
openseomcp_get_search_opportunities
Get search opportunities
openseomcp_list_business_categories
List business categories
openseomcp_list_projects
List projects
openseomcp_remove_rank_tracking_keywords
Remove rank tracking keywords
openseomcp_research_keywords
Research keywords
openseomcp_run_rank_tracker
Run rank tracker
openseomcp_save_keywords
Save keywords
openseomcp_search_local_businesses
Search local businesses
openseomcp_update_project_context
Update project context

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// OpenSEO MCP tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openseomcp"], toolNames: [
    "openseomcp_run_site_audit",
    "openseomcp_get_audit_issues",
    "openseomcp_get_search_opportunities"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Show the top issues from my latest site audit" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openseomcp"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Show the top issues from my latest site audit" }],
  tools,
});

// Execute the tool call with the user's vaulted OpenSEO token
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openseomcp"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Show the top issues from my latest site audit" }],
  tools,
});

// Tool call runs with the user's vaulted OpenSEO token
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["openseomcp"] }, pageSize: 100,
});

const agent = new Agent({
  name: "seo_agent",
  model: "gemini-2.5-pro",
  instruction: "OpenSEO MCP tools scoped to this user",
  tools,
});

await agent.run("Show the top issues from my latest site audit");
Try these prompts
Copy any prompt into your agent. Each maps directly to a OpenSEO MCP tool. Click to copy, paste into your agent, done.
Site audits
Copy the prompt
Copied
Start a site audit of acme.com and tell me when it finishes.
Copy the prompt
Copied
List the highest-priority issues from my latest audit with fixes.
Copy the prompt
Copied
Which audited pages are not indexable, and why?
Rankings and keywords
Copy the prompt
Copied
Estimate the cost of a weekly rank tracker for these 50 keywords.
Copy the prompt
Copied
Research keyword volume and difficulty for "payroll software" and "hr software".
Copy the prompt
Copied
Find pages ranking in positions 4 to 20 that are worth improving.
Analytics and local
Copy the prompt
Copied
Is organic traffic up or down versus the previous 28 days?
Copy the prompt
Copied
Inspect these 5 URLs in Search Console and tell me which are indexed.
Copy the prompt
Copied
Show reviews for our Google Business Profile that have no owner reply.
SEE HOW AUTH WORKS
Each user signs in to OpenSEO once; Scalekit stores and refreshes their tokens. Tokens stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
OpenSEO MCP
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
OpenSEO MCP
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
OpenSEO MCP
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
OpenSEO MCP
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other marketing and analytics connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
GTM and RevOps Teams
Deal intelligence agent
Pulls recent Gong calls, scores deal risk with an LLM, cross-references the record in Attio, and DMs each owner their at-risk deals in Slack. Every read is scoped to that rep's own access.
Test other agents
See the same per-user auth pattern across other marketing and analytics connectors.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
SALES
Deal intelligence agent
Score Gong call risk with an LLM, cross-reference the Attio record, and DM each owner their at-risk deals in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared OpenSEO token looks fine in a demo. In production every audit, rank check, and keyword pull looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
OpenSEO today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access OpenSEO as the user or as a shared key?
As the user. Each user signs in to OpenSEO once, and Scalekit stores and refreshes their tokens. Audit logs attribute every audit and rank check to that user, not a shared service account.
Where is the OpenSEO OAuth token stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Refresh is automatic. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in OpenSEO?
Yes. Filter by tool name in listScopedTools to expose only what you want. Scalekit also enforces scope checks before every API call.
What happens when a user revokes OpenSEO access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which OpenSEO tools spend credits?
Tools that read OpenSEO state, such as projects, saved keywords, audit results, rank tracker results, and the Google Analytics and Search Console reports, use no credits. Tools that pull SERP, keyword, backlink, and local business data charge credits, and a live rank check needs an approved credit ceiling from estimate_rank_tracker_cost first.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""openseomcp"": {
""url"": ""https://mcp.scalekit.com/openseomcp"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.openseomcp]
url = ""https://mcp.scalekit.com/openseomcp""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""openseomcp"": {
""url"": ""https://mcp.scalekit.com/openseomcp"",
""type"": ""http""
}
}
}