SEO Research MCP
This server enables AI assistants to perform practical SEO research through the following capabilities:
Backlink Analysis: Retrieve backlinks for a domain (with title, URL, domain rating), get a full domain overview (rating, total backlinks, referring domains), and compare SEO metrics across 2–5 domains.
Keyword Research: Generate keyword and question ideas from a seed keyword (filterable by country and search engine), check keyword difficulty scores, and get SERP snapshots.
AI Search Queries: Generate AI-powered query ideas based on a keyword and specific search intents (informational, commercial, transactional, navigational).
Traffic Estimation: Estimate organic search traffic for a domain or URL, including historical data, top pages, top countries, and associated keywords.
Backlink Opportunities: Identify backlink sources used by competitors that are missing from a target domain's profile.
SEO Content Briefs: Create AI-assisted content briefs combining keyword difficulty, SERP analysis, AI search queries, and recommended content angles.
Provides SEO research capabilities including keyword difficulty analysis, keyword generation, traffic estimation, and backlink analysis using data from search engines.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SEO Research MCPwhat are the backlinks for competitor.com?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DataSEO MCP
Give your AI assistant real SEO data. DataSEO MCP is a Model Context Protocol server that lets Claude, Cursor, and other MCP clients pull backlinks, keyword difficulty, traffic estimates, and keyword ideas from Ahrefs' free tools — plus optional AI query planning — just by asking in plain English.
No dashboards, no CSV exports. Ask "who links to suparank.io?" and get an answer inside your chat.
For educational and research use. It automates third-party services (Ahrefs, CapSolver, Anti-Captcha, OpenRouter). You are responsible for complying with their terms of service.
What you can ask
Talk to it in natural language — the assistant picks the right tool.
Ask something like… | Tool it uses | You get |
"Who links to suparank.io?" |
| Domain rating, referring domains, top backlink rows |
"Give me keyword ideas for AI SEO tools" |
| Keyword and question ideas |
"How much organic traffic does suparank.io get?" |
| Monthly traffic, top pages, countries, keywords |
"How hard is it to rank for 'AI SEO tools'?" |
| KD score + the live SERP |
"Generate AI search queries for 'AI SEO audit'" |
| Queries grouped by search intent |
"Give me an SEO overview of suparank.io" |
| Backlink + traffic summary in one call |
"Compare suparank.io with its competitors" |
| 2–5 domains side by side |
"Find backlink gaps for suparank.io" |
| Sources linking to competitors but not you |
"Write a content brief for 'AI SEO audit'" |
| SERP data + AI-assisted content angles |
Maintained by Ege Bese. Built for the AI SEO and rank-tracking workflows behind Suparank.
Related MCP server: SE Ranking MCP Server
Quick start
Run it with no install using uv:
export CAPSOLVER_API_KEY="your-capsolver-key"
uvx --python 3.10 dataseo-mcpThat's enough to use every SEO tool. See MCP Setup to wire it into your assistant.
For local development:
git clone https://github.com/egebese/dataseo-mcp.git
cd dataseo-mcp
uv sync
uv run dataseo-mcpThe legacy seo-mcp command still works as an alias.
Configuration
One CAPTCHA provider is required — it's how the Ahrefs-backed tools clear the Turnstile challenge:
export CAPSOLVER_API_KEY="your-capsolver-key"
# or
export ANTICAPTCHA_API_KEY="your-anticaptcha-key"If both are set, CapSolver is tried first and Anti-Captcha is the fallback.
AI tools are optional. ai_search_queries and seo_content_brief need
OpenRouter; without it, the other tools still work and AI output is marked
unavailable:
export OPENROUTER_API_KEY="your-openrouter-key"
export OPENROUTER_MODEL="openai/gpt-4o-mini" # optionalRuntime overrides:
Variable | Default | Purpose |
|
| Signature cache location |
|
| HTTP timeout in seconds |
|
| CAPTCHA polling cap |
|
| OpenAI-compatible AI endpoint |
MCP Setup
Claude Code:
claude mcp add dataseo --scope user -- uvx --python 3.10 dataseo-mcpClaude Desktop / Cursor (claude_desktop_config.json or equivalent):
{
"mcpServers": {
"dataseo": {
"command": "uvx",
"args": ["--python", "3.10", "dataseo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_CAPSOLVER_KEY",
"OPENROUTER_API_KEY": "YOUR_OPENROUTER_KEY"
}
}
}
}VS Code (.vscode/mcp.json):
{
"servers": {
"dataseo": {
"command": "uvx",
"args": ["--python", "3.10", "dataseo-mcp"],
"env": { "CAPSOLVER_API_KEY": "YOUR_CAPSOLVER_KEY" }
}
}
}Add OPENROUTER_API_KEY only if you want the AI tools.
API Reference
get_backlinks_list(domain)
{
"overview": { "domainRating": 76, "backlinks": 1500, "refdomains": 300 },
"backlinks": [
{
"anchor": "Suparank",
"domainRating": 71,
"title": "The best AI SEO tools",
"urlFrom": "https://source.example/best-seo-tools",
"urlTo": "https://suparank.io/",
"edu": false,
"gov": false
}
]
}keyword_generator(keyword, country="us", search_engine="Google")
Keyword and question ideas in the label / value shape. Volume and difficulty
come back as Ahrefs' bucketed estimates.
get_traffic(domain_or_url, country="None", mode="subdomains")
Traffic history, traffic summary, and top pages / countries / keywords. Both
costMonthlyAvg and the legacy costMontlyAvg spelling are included.
keyword_difficulty(keyword, country="us")
A keyword difficulty score plus the organic SERP rows with available metrics.
ai_search_queries(keyword, count=10, model="openai/gpt-4o-mini", language="en")
{
"keyword": "ai seo audit",
"queries": [
{ "query": "what is an AI SEO audit", "intent": "informational" },
{ "query": "best AI SEO audit tools", "intent": "commercial" }
],
"model_used": "openai/gpt-4o-mini",
"total_queries": 2
}count is 1–50. Intents are informational, commercial, transactional,
navigational.
Composite tools
domain_overview(domain, country="None")— backlink overview + traffic summary for one domain.compare_domains(domains, country="None")— 2–5 unique domains side by side.backlink_opportunities(domain, competitors)— competitor backlink sources missing from the target's sample.seo_content_brief(keyword, country="us", count=12, model, language)— keyword difficulty, SERP rows, AI queries, and recommended content angles in one call.
How it works
server.py stays thin; the work is split into focused modules:
services.py— tool orchestration and public return shapes.schemas.py— Pydantic validation and normalization.captcha.py— CapSolver / Anti-Captcha fallback with bounded polling.backlinks.py,keywords.py,traffic.py— Ahrefs endpoint adapters.ai.py— OpenRouter query generation.cache.py— JSON signature cache (default~/.cache/dataseo-mcp).
Every external HTTP boundary is mocked in tests.
Development
uv sync
uv run pytest -q
uv run ruff check .
uv run python -m compileall -q src
uv run python -c "from seo_mcp.server import main"Troubleshooting
Problem | Fix |
No CAPTCHA provider configured | Set |
CAPTCHA solving failed | Check provider balance, key validity, and rate limits |
AI tool returns a missing-key error | Set |
Empty SEO response | The domain or keyword may not be indexed upstream |
| Use |
License
MIT with an educational-use notice. Original fork attribution is preserved in LICENSE.
Available Tools
4 toolsget_backlinks_listB
Get backlinks list for the specified domain
Args:
domain (str): The domain to query
Returns:
List of backlinks for the domain, containing title, URL, domain rating, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states it 'Get[s] backlinks list' which implies a read operation, but doesn't disclose behavioral traits like authentication needs, rate limits, pagination, or what happens if the domain is invalid. The return format is briefly mentioned but lacks detail on structure or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Appropriately sized with three sentences: purpose, args, and returns. Front-loaded with the core purpose. No wasted words, though the structure is basic. Could be slightly more polished but earns its place efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 parameter with 0% schema coverage and no output schema, the description provides minimal but adequate context: purpose, parameter semantics, and a vague return outline. However, it lacks details on behavioral aspects (e.g., errors, limits) and output structure, making it incomplete for optimal agent use. Scores as minimum viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by specifying 'domain (str): The domain to query', clarifying the parameter's purpose beyond the schema's basic type. With only 1 parameter, this is sufficient to reach a baseline near 4, though it could elaborate on format (e.g., 'example.com').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get backlinks list for the specified domain' - a specific verb ('Get') and resource ('backlinks list') with the target ('domain'). It doesn't explicitly distinguish from sibling tools like 'get_traffic' or 'keyword_difficulty', but the purpose is unambiguous. Not a tautology since it elaborates beyond the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'get_traffic' or 'keyword_generator'. The description implies usage for retrieving backlink data, but lacks explicit context, prerequisites, or exclusions. Minimal implied usage from the purpose statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trafficB
Check the estimated search traffic for any website.
Args:
domain_or_url (str): The domain or URL to query
country (str): The country to query, default is "None"
mode (["subdomains", "exact"]): The mode to use for the query
Returns:
Traffic data for the specified domain or URL
| Name | Required | Description | Default |
|---|---|---|---|
| domain_or_url | Yes | ||
| country | No | None | |
| mode | No | subdomains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool checks 'estimated search traffic', implying a read-only operation, but doesn't cover critical aspects like rate limits, authentication needs, data freshness, or error handling. This is a significant gap for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with a clear purpose statement followed by parameter and return explanations. Every sentence adds value without redundancy, making it easy to parse and front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no output schema, no annotations), the description is adequate but incomplete. It covers the purpose and parameters well but lacks behavioral details and usage guidelines, leaving gaps in overall context for effective tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context beyond the input schema, which has 0% description coverage. It explains that 'domain_or_url' is for querying, 'country' defaults to 'None', and 'mode' has options 'subdomains' or 'exact'. This compensates well for the schema's lack of descriptions, though it doesn't detail the implications of mode choices.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Check the estimated search traffic for any website.' It specifies the verb ('Check') and resource ('search traffic'), though it doesn't explicitly differentiate from sibling tools like 'get_backlinks_list' or 'keyword_difficulty', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_backlinks_list' or 'keyword_generator'. It lacks context on prerequisites, typical use cases, or exclusions, leaving the agent without clear usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_difficultyC
Get keyword difficulty for the specified keyword
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| country | No | us |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure but only states the basic action without details on rate limits, authentication needs, data sources, or return format (e.g., numerical score, categorical rating). This is inadequate for a tool with potential complexity in keyword analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words, making it appropriately concise. However, it's overly brief to the point of under-specification, which slightly detracts from its effectiveness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, output schema, and low schema coverage, the description is incomplete. It doesn't cover parameter details, behavioral traits, or output expectations, making it insufficient for an AI agent to reliably use this tool in context with its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate but only implies the 'keyword' parameter without explaining its format or constraints. The 'country' parameter is not mentioned at all, leaving both parameters poorly documented. The description adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get keyword difficulty for the specified keyword' clearly states the tool's function (retrieving difficulty metrics for keywords) but lacks specificity about what 'difficulty' entails (e.g., SEO competition, search volume complexity) and doesn't differentiate from sibling tools like 'keyword_generator' or 'get_traffic'. It's a vague purpose that could be more precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'keyword_generator' for generating keywords or 'get_traffic' for traffic data. There's no mention of prerequisites, ideal contexts, or exclusions, leaving the agent without usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keyword_generatorC
Get keyword ideas for the specified keyword
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| country | No | us | |
| search_engine | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. However, it only states what the tool does without revealing any behavioral traits such as rate limits, authentication needs, data sources, or output format. This leaves critical operational details unspecified, making it inadequate for informed tool selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, consisting of a single sentence that directly states the tool's function. There is no wasted verbiage or unnecessary elaboration, making it efficient and easy to parse. However, this conciseness comes at the cost of completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a keyword generation tool with three parameters, no annotations, and no output schema, the description is incomplete. It lacks details on behavior, parameter usage, output expectations, and differentiation from siblings. This inadequacy could hinder effective tool invocation by an AI agent, as key contextual information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions 'specified keyword' but does not explain the semantics of any parameters beyond what the input schema provides. With 0% schema description coverage and three parameters (keyword, country, search_engine), the description fails to add meaning, such as the purpose of country codes or supported search engines. It does not compensate for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool's purpose ('Get keyword ideas for the specified keyword'), which is clear but vague. It specifies the verb ('Get') and resource ('keyword ideas'), but does not distinguish it from sibling tools like 'keyword_difficulty' or explain what 'keyword ideas' entails (e.g., related terms, search volume). This makes it minimally adequate but lacking specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention sibling tools like 'keyword_difficulty' or 'get_traffic', nor does it specify contexts or exclusions (e.g., for SEO research vs. content planning). Without such information, users must infer usage, leading to potential misapplication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: get_backlinks_list retrieves backlink data, get_traffic provides traffic estimates, keyword_difficulty assesses keyword competitiveness, and keyword_generator suggests related keywords. There is no overlap in functionality, making tool selection unambiguous.
All tools follow a consistent verb_noun pattern with snake_case: get_backlinks_list, get_traffic, keyword_difficulty, keyword_generator. The naming is predictable and readable, with no deviations in style or convention.
With 4 tools, the count is reasonable for an SEO research server, covering key areas like backlinks, traffic, and keywords. It is slightly lean but not insufficient, as these tools address core SEO analysis needs without being overwhelming.
The toolset covers essential SEO research functions but has notable gaps. For example, there are no tools for competitor analysis, content suggestions, or SERP features, which are common in SEO workflows. Agents can perform basic research but may lack comprehensive coverage for advanced tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
SEO research, audits, backlinks, GSC, and content workflow tools for AI agents.
Real SEO data for AI assistants: page audits, Keyword Planner volumes, Search Console history.
Ahrefs: Ahrefs API: SEO powerhouse featuring keyword research, backlink analysis, and SERP tracking.
Open-source SEO manager for coding agents: keyword research, content PRs, rank + Search Console.
Related MCP Servers
- -licenseCqualityNot gradedmaintenanceEnables AI assistants to access comprehensive SEO data through DataForSEO APIs, including SERP results, keyword research, backlink analysis, on-page metrics, and domain analytics. Supports real-time search engine data from Google, Bing, and Yahoo with customizable filtering and multiple deployment options.36
- AlicenseCqualityDmaintenanceConnects AI assistants to SE Ranking's SEO and project management APIs to enable natural language queries for keyword research, backlink analysis, and technical audits. It supports comprehensive tasks including competitive analysis, domain traffic tracking, and AI search visibility monitoring.100Apache 2.0
- AlicenseBqualityDmaintenanceEnables AI-powered IDEs to perform SEO research including backlink analysis, keyword generation, traffic estimation, and keyword difficulty using Ahrefs data and CapSolver for CAPTCHA solving.4MIT
- AlicenseNot gradedqualityFmaintenanceConnects AI assistants to SEO APIs for backlinks analysis, keyword research, and traffic analysis.1628MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/egebese/dataseo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server