DataForSEO MCP Server
Provides Amazon product search and keyword research through DataForSEO Labs.
Enables App Store search and keyword data via DataForSEO Labs.
Provides Baidu SERP analysis and search results.
Provides comprehensive Google Search data including SERPs, keyword research, domain analytics, and more.
Provides Google Ads keyword search volume and competition data.
Returns Google Maps local search results and business information.
Enables Google Play app search and keyword data through DataForSEO Labs.
Retrieves Google Lighthouse performance scores and audits for web pages.
Provides Naver SERP analysis and search results.
Provides YouTube SERP analysis and video keyword data.
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., "@DataForSEO MCP ServerCheck the SERP for 'best coffee grinders' in the US."
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.
DataForSEO MCP Server
A production-ready remote MCP server that exposes the DataForSEO API v3 to Claude over the Streamable HTTP transport, designed to run on Railway.
It gives Claude access to essentially the whole DataForSEO surface — SERP, DataForSEO Labs, Keywords Data, Backlinks, OnPage, Business Data, Content Analysis, Merchant, App Data, Domain Analytics, Content Generation and AI Optimization — through 51 tools rather than several hundred, with cost controls, response normalisation and a strictly bounded generic request layer.
Endpoint:
POST https://<your-app>.up.railway.app/mcpTransport: Streamable HTTP (
@modelcontextprotocol/sdk1.30, stateless by default)Stack: Node 20+, TypeScript, Express 5, Zod 4
Contents
Related MCP server: oncrawl-mcp-server
Architecture
src/
server.ts entry point: listen, graceful shutdown
app.ts Express app: /, /health, /mcp, limits, error handling
config.ts env parsing; the only place credentials live
mcp/
server.ts McpServer factory + model-facing instructions
transport.ts Streamable HTTP wiring, auth gate, origin gate, sessions
context.ts ToolContext (config, client, metadata, result builder)
tools/ tool definitions, one module per domain
discovery.ts keywords.ts domain.ts serp.ts backlinks.ts
onpage.ts business.ts content.ts account.ts generic.ts helpers.ts
dataforseo/
client.ts the single outbound HTTP path (auth, retries, logging)
auth.ts HTTP Basic header construction, forbidden headers
endpoints.ts family registry, allow-list, endpoint catalog, metadata sources
errors.ts DataForSEO status-code model → typed errors
types.ts response envelope types
services/ per-family request building + normalisation
serp.ts labs.ts keywords.ts backlinks.ts onpage.ts business.ts
content.ts account.ts generic.ts metadata.ts types.ts
normalizers/ DataForSEO response → concise SEO objects
serp.ts keywords.ts labs.ts backlinks.ts onpage.ts business.ts content.ts common.ts
schemas/common.ts shared Zod fields, filter/sort validation, target normalisation
utils/ logger (redacting), redaction, TTL cache, semaphore, result builder
tests/ vitest suite; all DataForSEO calls are mocked
scripts/
verify-mcp.mjs local Streamable HTTP + tools/list verification
smoke.mjs MANUAL smoke test against real DataForSEO credentialsData flows in one direction: tool → service → client → DataForSEO, and back client → normaliser → result builder → tool. Only dataforseo/client.ts performs network I/O, and every request it makes passes validateEndpointPath() first.
Tool layers
Layer 1 — discovery. dataforseo_capabilities, dataforseo_locations, dataforseo_languages, dataforseo_endpoint_info. These let Claude learn what exists, resolve identifiers and confirm a path before spending money. dataforseo_capabilities and dataforseo_endpoint_info make no DataForSEO call at all.
Layer 2 — curated tools. 46 tools covering the common SEO workflows with strict Zod schemas, friendly parameters, resolved locations/languages and normalised output.
Layer 3 — the generic request. dataforseo_request reaches any documented endpoint under an allowed /v3/<family>/ prefix. New DataForSEO endpoints are usable the day they ship, without changing this server.
Available tools
Tool | What it does | DataForSEO endpoint |
| Families, coverage, limits, workflow hints | (local) |
| Search location codes by name |
|
| Search language codes |
|
| Explain/validate an endpoint, live vs async | (local) |
| Balance, limits, prices |
|
| Volume, CPC, competition, difficulty, intent |
|
| Long-tail keywords containing a seed |
|
| "Searches related to" expansion (depth 0–4) |
|
| Category-based keyword ideas |
|
| Informational/commercial/etc. classification |
|
| Monthly history per keyword |
|
| Google Ads / Bing Ads volumes |
|
| Keywords a competitor has and you don't |
|
| Organic/paid metrics for a domain |
|
| Every keyword a domain ranks for |
|
| Keywords for one URL |
|
| Organic competitors |
|
| Keywords two domains share |
|
| Keywords where pages rank together |
|
| Best pages of a domain |
|
| Domains ranking for a keyword set |
|
| Traffic for up to 1000 targets |
|
| Live SERP, 7 engines, many search types |
|
| Where a domain/URL ranks for a keyword |
|
| Google Maps / Local Finder results |
|
| Queue a SERP task (cheaper) |
|
| Collect a SERP task |
|
| List finished SERP tasks |
|
| Backlink profile summary |
|
| Individual backlinks |
|
| Referring domains |
|
| Anchor text distribution |
|
| Shared-referrer competitors |
|
| Monthly link history |
|
| Bulk rank/backlinks/spam/refdomains |
|
| Start a crawl (async) |
|
| Crawl progress / finished crawls |
|
| Site-level technical SEO results |
|
| Crawled pages + per-page checks |
|
| Duplicate tags/content, non-indexable, redirects, links |
|
| Images/scripts/stylesheets |
|
| Analyse one URL immediately |
|
| Lighthouse scores |
|
| Stop a running crawl |
|
| Search local business listings |
|
| Google Business Profile (async) |
|
| Google reviews (async) |
|
| Brand/keyword citations |
|
| Mention volume aggregation |
|
| Sentiment of mentions |
|
| Any allowed | (generic) |
API family coverage
Family | Coverage | Notes |
SERP | Direct + generic | Google (organic, maps, local finder, news, images, jobs, events, shopping, autocomplete, ai_mode…), Bing, Yahoo, YouTube, Baidu, Naver, Seznam. Live and task-based flows are first class. Less common Google verticals (finance, ads_search, dataset_search, screenshot, search-by-image) go through |
DataForSEO Labs | Direct + generic | 13 dedicated tools. |
Keywords Data | Direct + generic |
|
Backlinks | Direct + generic | 7 tools cover the common profile work; |
OnPage | Direct + generic | Full async crawl lifecycle, pages, resources, links, duplicates, non-indexable, redirects, instant pages, Lighthouse. |
Business Data | Direct + generic | Listings search, Business Profile, reviews. Q&A, hotel searches/info, Trustpilot, Tripadvisor, social media via |
Content Analysis | Direct + generic | Search, summary, sentiment directly; rating distribution, phrase/category trends via |
Merchant | Generic | Google Shopping and Amazon products/ASIN/sellers. |
App Data | Generic | Google Play and App Store searches, info, listings, reviews. |
Domain Analytics | Generic | Technology detection and Whois with filters. |
Content Generation | Generic | Generate, paraphrase, grammar check, meta tags, text summary. |
AI Optimization | Generic | LLM responses/scrapers (ChatGPT, Claude, Gemini, Perplexity), LLM mentions, AI keyword volume. |
Appendix | Direct + generic |
|
Not reachable through this server: DataForSEO features that are not v3 REST endpoints — the client dashboards, webhook delivery to this server (you can still set postback_url / pingback_url on a task, but nothing here receives them), and any endpoint outside the thirteen /v3/ families above.
Local development
npm install
cp .env.example .env # fill in DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD
npm run dev # tsx watch on http://localhost:3000
npm run typecheck
npm test # mocked, no network, no cost
npm run build && npm run verify:mcp # boots the built server and drives real MCP callsPoint any MCP client at http://localhost:3000/mcp, or use the MCP Inspector:
npx @modelcontextprotocol/inspectorEnvironment variables
Required:
Variable | Purpose |
| DataForSEO API login (server-side only) |
| DataForSEO API password (server-side only) |
| HTTP port — Railway injects this automatically |
Optional:
Variable | Default | Purpose |
|
| Route everything to |
|
| Override; must be an https |
|
| Per-request timeout (max 180000) |
|
| Retries for transient failures (never for |
|
| Max in-flight DataForSEO requests |
| (unset) | Comma-separated bearer tokens required on |
|
|
|
|
| Stateful mode only: reap sessions idle this long |
| (unset) | Comma-separated allowed |
| (unset) | Public base URL, echoed on |
|
| Default rows per tool call |
|
| Absolute row ceiling |
|
| Character budget per tool response |
|
| Max keywords/targets per batched call |
|
| Rate limit on this server |
|
| JSON body limit on |
|
| Locations/languages cache TTL (6h) |
|
|
|
|
| Express |
.env.example contains names only — never commit real values.
Railway deployment
Push this repository to GitHub and create a Railway project from it.
Railway detects Node via Nixpacks;
railway.jsonpins the commands:build:
npm ci && npm run buildstart:
npm run starthealthcheck:
/health
Set variables in the Railway service:
DATAFORSEO_LOGIN,DATAFORSEO_PASSWORD(required)optionally
MCP_AUTH_TOKEN,PUBLIC_URL,LOG_LEVEL, limit overridesdo not set
PORTmanually; Railway provides it
Deploy, then check
https://<app>.up.railway.app/health.
Notes: /health returns 503 while credentials are missing, so a misconfigured deploy fails its healthcheck by design. trust proxy is on for Railway's proxy. SIGTERM triggers graceful shutdown (open MCP sessions closed, then the HTTP server). Nothing is written to disk — state is in memory only, so replicas and restarts are safe (stateless session mode is the default for exactly this reason). Docker is not required.
Connecting Claude
Claude.ai / Claude Desktop → Settings → Connectors → Add custom connector:
URL:
https://<your-app>.up.railway.app/mcpIf
MCP_AUTH_TOKENis set, supply the token as a bearer token in the connector's authentication settings.
Claude Code:
claude mcp add --transport http dataforseo https://<your-app>.up.railway.app/mcp \
--header "Authorization: Bearer <token>"Ask Claude to call dataforseo_capabilities first — it returns the map of families, tools and limits.
DataForSEO authentication
DataForSEO uses HTTP Basic auth. This server:
builds the
Authorization: Basic base64(login:password)header indataforseo/auth.tsattaches it inside
DataForSeoClient.send()immediately beforefetchnever places it on any object that is logged or serialised
never returns login, password, encoded credentials or authorization headers to the MCP client —
account_statusdeliberately omits the accountlogin, and/healthreports only whether credentials are configured
Tool callers cannot supply headers at all, and dataforseo_request rejects bodies containing login, password, authorization, headers, credentials or api_key at any depth.
Asynchronous DataForSEO jobs
Task-based DataForSEO endpoints are exposed honestly — no request is ever held open waiting for a long job.
Workflow | Start | Poll / collect |
SERP tasks |
|
|
Site crawls |
|
|
Business Profile / reviews |
| same tool with |
Anything else |
|
|
While DataForSEO is still working (status codes 40601/40602) the collect tools return ready: false with a note, rather than an error or a hanging request.
Cost controls
DataForSEO is usage-priced, so the defaults are deliberately conservative:
default
limitis 50 rows (MAX_RESULT_ITEMS), hard-capped at 1000keyword/target batches are capped at
MAX_BATCH_ITEMS(100) with an explicit error rather than silent truncationcrawls default to
max_crawl_pages: 100; SERP depth defaults to 100 elementsnothing recursively pages:
next_offsetis returned and Claude must ask for the next pageno tool fans out into multiple DataForSEO calls; bulk endpoints are preferred and documented in the tool descriptions
task_postis never retried, so a task cannot be created (and billed) twiceconcurrency is bounded by a semaphore (
DATAFORSEO_MAX_CONCURRENCY)every response preserves DataForSEO's own accounting:
"usage": { "dataforseo_cost": 0.0123, "tasks_count": 1, "result_count": 100, "duration_ms": 812 }Every outbound call is logged as one structured line (dataforseo_request) with endpoint, method, status, duration, cost and result counts — and never any credential.
Response modes and pagination
Every list-returning tool accepts:
response_mode:summary(headline fields) ·standard(default; the useful SEO fields) ·full(raw DataForSEO fields, still subject toMAX_RESPONSE_CHARS)limit/offset, withpagination.next_offsetreturned when a full page came back
If a response would still exceed the character budget, rows are dropped from the end and an output_truncated block explains exactly what was omitted and how to narrow the request.
Locations, languages, filters and sorting
Pass natural values — "United Kingdom", "London,England,United Kingdom", "Marbella, Andalusia, Spain", "English", "Spanish" — and they are resolved against the correct per-family DataForSEO metadata list (SERP, Labs and Keywords Data use different location code sets). Numeric location codes and ISO language codes are accepted verbatim and skip the lookup entirely. Ambiguous names produce an error listing the candidates; metadata lists are cached in memory for METADATA_CACHE_TTL_MS.
DataForSEO's filtering power is preserved, not removed: filters accepts documented expressions such as
[["keyword_data.keyword_info.search_volume", ">", 1000], "and", ["keyword_data.keyword_info.cpc", "<", 5]]Field paths, operators, value types and nesting depth are validated before the request is sent. order_by accepts up to 3 rules of the form "field,asc" / "field,desc".
The generic request layer
{
"endpoint": "/v3/domain_analytics/technologies/domain_technologies/live",
"method": "POST",
"body": { "target": "example.com" },
"response_mode": "standard",
"item_limit": 50
}Guarantees enforced by validateEndpointPath() and services/generic.ts:
the host is always the configured DataForSEO base URL; callers supply a path, never a URL
the path must start with
/v3/and sit under one of the thirteen allowed familiesabsolute URLs, protocol-relative paths,
.., query strings, fragments,@, backslashes, whitespace and control characters are rejectedonly
GETandPOSTare possibleno header input is accepted, so authentication cannot be injected or overridden
credential-shaped body keys are rejected at any depth
bodies are capped at 128 KB and 100 task objects
It is an escape hatch for DataForSEO, not an HTTP proxy.
Security model
Credentials stay in
config.credentialsand theAuthorizationheader; they are registered with the redaction layer so any accidental appearance in logs or tool output is masked.MCP authentication is optional and pluggable: set
MCP_AUTH_TOKENfor bearer auth (constant-time comparison, multiple tokens for rotation). The gate is one middleware inmcp/transport.ts, so OAuth can replace it without touching the DataForSEO integration./healthstays open for platform probes.Origin validation (
MCP_ALLOWED_ORIGINS) protects browser-originated callers against DNS rebinding; requests with noOrigin(Claude, curl) are unaffected.Rate limiting on
/mcpviaexpress-rate-limit, plus a JSON body size limit.Error sanitisation: DataForSEO and internal errors become structured payloads (
kind,message,hint,retryable); stack traces never reach the client.No filesystem persistence, no
eval, no dynamic endpoint construction from caller input beyond the validated path.
Adding a new high-level wrapper
Add the endpoint to
ENDPOINT_CATALOGinsrc/dataforseo/endpoints.ts(this powers discovery).Add a normaliser in
src/normalizers/<family>.tsusingbyMode()sosummary/standard/fullall behave.Add a service function in
src/services/<family>.tsthat builds the task object, callsctx.client.post(...)and returns{ data, meta: metaFrom(response), notes?, pagination? }.Register the tool in
src/mcp/tools/<family>.tswithdefineTool()and a strict Zod schema (reuseschemas/common.tsfields).Add tests: schema rejection, a mocked happy path, and the normaliser.
Until a wrapper exists, the endpoint is already usable through dataforseo_request.
Testing
npm test # 109 tests: credentials, allow-list, error parsing, location/language
# resolution, generic-request protection, normalisers, tool schemas, HTTP
npm run verify:mcp # Streamable HTTP initialize + tools/list against the built server
npm run smoke # MANUAL only — real credentials; defaults to the sandboxThe automated suite mocks every DataForSEO call and never makes a paid request. scripts/smoke.mjs is the only script that talks to DataForSEO; it uses the sandbox unless you pass --production, and only makes a billed call with --production --paid.
Sandbox mode
DataForSEO offers a free sandbox at https://sandbox.dataforseo.com that mirrors the production response structure with dummy data. Set DATAFORSEO_SANDBOX=true to route every call there — useful for development and for verifying a deployment without spending credits. Responses are tagged with "sandbox": true so Claude knows the data is not real. Production behaviour is unchanged when the flag is unset.
Built against DataForSEO API v3 documentation and the Model Context Protocol specification as published in August 2026.
This server cannot be installed
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 Servers
AlicenseBqualityBmaintenanceA Model Context Protocol server that enables Claude to interact with DataForSEO APIs, allowing access to SEO data including SERPs, keyword research, on-page metrics, and domain analytics.174,882238Apache 2.0- Alicense-qualityFmaintenanceMCP server that exposes OnCrawl's API for use with Claude Code and Claude Desktop. Enables Claude to perform deep technical SEO analysis by querying crawl data, Google Search Console metrics, and crawl-over-crawl comparisons.2MIT
- Alicense-qualityAmaintenanceProduction-grade MCP server for Microsoft Advertising (Bing Ads) API. Enables Claude to manage Bing/Microsoft Ads accounts with full campaign, ad group, keyword, and performance analysis capabilities.1484MIT
- Alicense-qualityDmaintenanceA Model Context Protocol (MCP) server that provides comprehensive SEO analysis tools with actionable fix instructions for AI assistants like Claude Code and Claude Desktop.MIT
Related MCP Connectors
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
Live SEO workflow tools for Claude Code, Codex, and AI agents.
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
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/administrator-prog/data-for-seo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server