SEO Research MCP
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 MCPanalyze backlinks for openai.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.
SEO Research MCP
Free SEO research tools for AI-powered IDEs
Features • Installation • IDE Setup • API Reference • Contributing • Credits
⚠️ Educational Use Only
This project is for educational and research purposes only.
This tool interfaces with third-party services (Ahrefs, CapSolver)
Users must comply with all applicable terms of service
The authors do not endorse any use that violates third-party ToS
Use responsibly and at your own risk
By using this software, you acknowledge that you understand and accept these terms.
Related MCP server: SEO Research MCP
🎯 What is this?
SEO Research MCP brings powerful SEO research capabilities directly into your AI coding assistant. Using the Model Context Protocol (MCP), it connects your IDE to Ahrefs' SEO data, allowing you to:
Research competitor backlinks while coding
Generate keyword ideas without leaving your editor
Analyze traffic patterns for any website
Check keyword difficulty before creating content
✨ Features
Feature | Description | Example Use |
🔗 Backlink Analysis | Domain rating, anchor text, edu/gov links | "Show me backlinks for competitor.com" |
🔑 Keyword Research | Generate ideas from seed keywords | "Find keywords related to 'python tutorial'" |
📊 Traffic Analysis | Monthly traffic, top pages, countries | "What's the traffic for example.com?" |
📈 Keyword Difficulty | KD score with full SERP breakdown | "How hard is 'best laptop 2025' to rank for?" |
📋 Prerequisites
Before you start, you'll need:
Python 3.10 or higher
python --version # Should be 3.10+CapSolver API Key (for CAPTCHA solving)
📦 Installation
Option 1: From PyPI (Recommended)
pip install seo-mcpOr using uv:
uv pip install seo-mcpOption 2: From Source
git clone https://github.com/egebese/seo-research-mcp.git
cd seo-research-mcp
pip install -e .🛠️ IDE Setup Guides
Choose your IDE and follow the setup instructions:
Step 1: Open Config File
Open Claude Desktop
Go to Settings → Developer → Edit Config
Step 2: Add Configuration
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"seo-research": {
"command": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Step 3: Restart & Verify
Restart Claude Desktop
Look for the hammer/tools icon in the bottom-right corner
📁 Config file locations:
OS | Path |
macOS |
|
Windows |
|
Option A: Quick Setup (CLI)
# Add the MCP server
claude mcp add seo-research --scope user -- uvx --python 3.10 seo-mcp
# Set your API key
export CAPSOLVER_API_KEY="YOUR_API_KEY_HERE"Option B: Config File
Add to ~/.claude.json:
{
"mcpServers": {
"seo-research": {
"command": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Verify Installation
claude mcp listGlobal Setup (All Projects)
Create ~/.cursor/mcp.json:
{
"mcpServers": {
"seo-research": {
"command": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Project Setup (Single Project)
Create .cursor/mcp.json in your project root with the same content.
Verify Installation
Go to File → Preferences → Cursor Settings
Select MCP in the sidebar
Check that
seo-researchappears under Available Tools
Step 1: Open Settings
Mac:
Cmd + Shift + P→ "Open Windsurf Settings"Windows/Linux:
Ctrl + Shift + P→ "Open Windsurf Settings"
Step 2: Add Configuration
Navigate to Cascade → MCP Servers → Edit raw mcp_config.json:
{
"mcpServers": {
"seo-research": {
"command": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}📁 Config location: ~/.codeium/windsurf/mcp_config.json
⚠️ Requires VS Code 1.102+ with GitHub Copilot
Setup
Create .vscode/mcp.json in your workspace:
{
"servers": {
"seo-research": {
"command": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Activate
Open the
.vscode/mcp.jsonfileClick the Start button that appears
In Chat view, click Tools to toggle MCP tools
Use
#tool_namein prompts to invoke tools
Setup
Add to your Zed settings.json:
{
"context_servers": {
"seo-research": {
"command": {
"path": "uvx",
"args": ["--python", "3.10", "seo-mcp"],
"env": {
"CAPSOLVER_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}
}Verify
Open Agent Panel settings
Check the indicator dot next to
seo-researchGreen dot = Server is active
📖 API Reference
get_backlinks_list(domain)
Get backlink data for any domain.
# Input
domain: str # e.g., "example.com"
# Output
{
"overview": {
"domainRating": 76,
"backlinks": 1500,
"refDomains": 300
},
"backlinks": [
{
"anchor": "Example link",
"domainRating": 76,
"title": "Page title",
"urlFrom": "https://source.com/page",
"urlTo": "https://example.com/page",
"edu": false,
"gov": false
}
]
}keyword_generator(keyword, country?, search_engine?)
Generate keyword ideas from a seed keyword.
# Input
keyword: str # Seed keyword
country: str # Default: "us"
search_engine: str # Default: "Google"
# Output
[
{
"keyword": "example keyword",
"volume": 1000,
"difficulty": 45
}
]get_traffic(domain_or_url, country?, mode?)
Estimate search traffic for a website.
# Input
domain_or_url: str # Domain or full URL
country: str # Default: "None" (all countries)
mode: str # "subdomains" | "exact"
# Output
{
"traffic": {
"trafficMonthlyAvg": 50000,
"costMontlyAvg": 25000
},
"top_pages": [...],
"top_countries": [...],
"top_keywords": [...]
}keyword_difficulty(keyword, country?)
Get keyword difficulty score with SERP analysis.
# Input
keyword: str # Keyword to analyze
country: str # Default: "us"
# Output
{
"difficulty": 45,
"serp": [...]
}⚙️ How It Works
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Your │ │ CapSolver │ │ Ahrefs │ │ Formatted │
│ AI IDE │────▶│ (CAPTCHA) │────▶│ API │────▶│ Results │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘Request → Your AI assistant calls an MCP tool
CAPTCHA → CapSolver handles Cloudflare verification
Data → Ahrefs API returns SEO data
Response → Formatted results appear in your IDE
🐛 Troubleshooting
Problem | Solution |
"CapSolver API key error" | Check |
Rate limiting | Wait a few minutes, reduce request frequency |
No results | Domain may not be indexed by Ahrefs |
Server not appearing | Restart your IDE after config changes |
Connection timeout | Check your internet connection |
🤝 Contributing
Contributions are welcome! Here's how you can help:
Ways to Contribute
🐛 Report Bugs - Found an issue? Open a bug report
💡 Suggest Features - Have an idea? Request a feature
📝 Improve Docs - Fix typos, clarify instructions, add examples
🔧 Submit Code - Bug fixes, new features, optimizations
Development Setup
# Clone the repo
git clone https://github.com/egebese/seo-research-mcp.git
cd seo-research-mcp
# Install dependencies
uv sync
# Run locally
python main.pyPull Request Process
Fork the repository
Create a feature branch (
git checkout -b feature/amazing-feature)Commit your changes (
git commit -m 'Add amazing feature')Push to your branch (
git push origin feature/amazing-feature)Open a Pull Request
Code Guidelines
Keep code simple and readable
Add comments for complex logic
Test your changes before submitting
Follow existing code style
📊 Star History
📄 License
This project is licensed under the MIT License with an educational use notice.
See LICENSE for full details.
🙏 Credits
This project is a fork of seo-mcp by @cnych.
Special thanks to the original author for creating this tool.
⭐ If this helps your SEO research, consider giving it a star! ⭐
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 provided, so description carries full burden. Discloses basic return structure but lacks details on rate limits, authentication, data freshness, or any side effects. For a read-only tool, minimal transparency.
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?
Very short description, front-loaded with the action. The docstring is somewhat redundant but not excessive. Could be slightly more structured, but overall efficient.
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?
Single parameter with straightforward functionality. Description covers input and basic output fields. However, lacks information on pagination, limits, data source, or error handling, leaving gaps for an agent.
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 has 0% description coverage for the 'domain' parameter. Description adds a brief explanation 'The domain to query', which provides minimal but necessary context beyond the schema's type-only definition.
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?
Description clearly states 'Get backlinks list for the specified domain', using a strong verb and specific resource. Sibling tools (get_traffic, keyword_difficulty, keyword_generator) cover different data, so this is well differentiated.
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. Does not mention any preconditions, limitations, or when to avoid using it. Only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trafficA
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?
With no annotations, description implies a read-only operation but does not disclose side effects, auth needs, or data freshness. 'Check the estimated search traffic' is clear but lacks depth on behavior beyond the parameter list.
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?
Very concise, front-loaded purpose, then parameter list. No extraneous text; every sentence adds value.
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?
Adequate for a simple tool with 3 params and no output schema, but fails to specify return data shape or error cases. Could be more complete with examples or output details.
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 coverage is 0%, so description compensates by explaining each parameter: domain_or_url, country (with default), and mode (with enum values). Adds useful context 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?
Clearly states the tool checks estimated search traffic for any website, which distinguishes it from siblings like get_backlinks_list and keyword_difficulty.
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. Does not mention contexts, exclusions, or scenarios where other tools are better suited.
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 full burden to disclose behavioral traits beyond the input schema. It only states the basic action (get difficulty) but does not mention what the output looks like, whether it is a number or label, or any constraints like rate limits or data freshness. This is insufficient for a tool without output schema.
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 sentence of 8 words, extremely concise and front-loaded with the verb and object. Every word adds value, and there is no unnecessary 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 simplicity (2 params, no output schema, no annotations), the description should compensate by explaining the difficulty metric, return format, or common use cases. It fails to do so, leaving the agent uncertain about what the response contains and how to interpret it.
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 input schema has two parameters (keyword, country) with zero description coverage. The description only mentions 'the specified keyword', adding minimal meaning for that parameter. It does not explain the 'country' parameter's purpose or default behavior, nor does it provide any additional context 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 states the verb 'Get' and the resource 'keyword difficulty', clearly indicating what the tool does. It differentiates from sibling tools like get_backlinks_list and get_traffic by focusing on difficulty. However, it does not specify what the difficulty metric represents (e.g., score range), which slightly reduces clarity.
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 the sibling tools (get_backlinks_list, get_traffic, keyword_generator). There is no mention of use cases, prerequisites, or alternatives, leaving the agent without context for selection.
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, and the description does not disclose any behavioral traits such as result format, limits, or side effects. It adds no value beyond the basic purpose.
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 sentence, making it concise, but it is underspecified to the point of being unhelpful. It is front-loaded but lacks necessary detail.
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?
With no output schema, no annotations, and three parameters undocumented, the description is severely incomplete. It does not convey return values, usage context, or parameter effects.
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 coverage is 0%, yet the description fails to explain the meaning or usage of any of the three parameters (keyword, country, search_engine). It does not compensate for the lack of schema 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 clearly states the verb 'get' and the resource 'keyword ideas', and the name 'keyword_generator' aligns. It distinguishes from sibling tools (get_backlinks_list, get_traffic, keyword_difficulty) which focus on other aspects.
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 vs alternatives, nor does it mention context or exclusions. It only states what it does, leaving the agent with no directional support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct SEO aspect: backlinks, traffic, keyword difficulty, and keyword generation. No overlap in functionality.
Two tools use 'get_' prefix (get_backlinks_list, get_traffic) while two use 'keyword_' prefix (keyword_difficulty, keyword_generator), creating an inconsistent pattern.
Four tools is a reasonable size for a focused SEO research server, covering core tasks without being bloated.
Covers backlinks, traffic, and keyword analysis but missing common SEO features like domain overview or competitor analysis, leaving minor gaps.
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.
Ahrefs: Ahrefs API: SEO powerhouse featuring keyword research, backlink analysis, and SERP tracking.
AI-powered SEO and marketing: keyword research, SERP analysis, and content optimization tools.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
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
- AlicenseBqualityCmaintenanceEnables AI coding assistants to perform SEO research tasks including backlink analysis, keyword research, traffic estimation, and keyword difficulty analysis using Ahrefs data directly within IDEs.4191MIT
- AlicenseNot gradedqualityFmaintenanceConnects AI assistants to SEO APIs for backlinks analysis, keyword research, and traffic analysis.1628MIT
- AlicenseAqualityDmaintenanceProvides AI agents with professional-grade SEO capabilities including on-page analysis, technical audits, PageSpeed insights, and Ahrefs data integration.13185MIT
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/iflow-mcp/egebese-seo-research-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server