
DataForSEO
STDIOMCP server for DataForSEO APIs to retrieve SEO data through a standardized interface.
MCP server for DataForSEO APIs to retrieve SEO data through a standardized interface.
Model Context Protocol (MCP) server implementation for DataForSEO, enabling ChatGPT or other agents to interact with selected DataForSEO APIs and obtain SEO data through a standardized interface. The server now includes optional tools that satisfy OpenAI's remote MCP requirements for search and document retrieval.
git clone https://github.com/dataforseo/mcp-server-typescript cd mcp-server-typescript
npm install
# Required export DATAFORSEO_USERNAME=your_username export DATAFORSEO_PASSWORD=your_password # Optional: specify which modules to enable (comma-separated) # If not set, all modules will be enabled export ENABLED_MODULES="SERP,KEYWORDS_DATA,ONPAGE,DATAFORSEO_LABS,BACKLINKS,BUSINESS_DATA,DOMAIN_ANALYTICS,OPENAI" # Optional: enable full API responses # If not set or set to false, the server will filter and transform API responses to a more concise format # If set to true, the server will return the full, unmodified API responses export DATAFORSEO_FULL_RESPONSE="false"
You can install the package globally:
npm install -g dataforseo-mcp-server
Or run it directly without installation:
npx dataforseo-mcp-server
Remember to set environment variables before running the command:
# Required environment variables export DATAFORSEO_USERNAME=your_username export DATAFORSEO_PASSWORD=your_password # Run with npx npx dataforseo-mcp-server
Build the project:
npm run build
Run the server:
# Start local server (direct MCP communication) npx dataforseo-mcp-server # Start HTTP server npx dataforseo-mcp-server http
The server runs on port 3000 by default and supports both Basic Authentication and environment variable-based authentication.
To start the HTTP server, run:
npm run http
Basic Authentication
Authorization: Basic <base64-encoded-credentials>
username:password
Environment Variables
export DATAFORSEO_USERNAME=your_username export DATAFORSEO_PASSWORD=your_password
The following modules are available to be enabled/disabled:
SERP
: real-time SERP data for Google, Bing, and Yahoo;KEYWORDS_DATA
: keyword research and clickstream data;ONPAGE
: crawl websites and webpages to obtain on-page SEO performance metrics;DATAFORSEO_LABS
: data on keywords, SERPs, and domains based on DataForSEO's databases and algorithms;BACKLINKS
: data on inbound links, referring domains and referring pages for any domain, subdomain, or webpage;BUSINESS_DATA
: based on business reviews and business information publicly shared on the following platforms: Google, Trustpilot, Tripadvisor;DOMAIN_ANALYTICS
: helps identify all possible technologies used for building websites and offers Whois data;OPENAI
: provides search
and fetch
tools compatible with ChatGPT connectors;Each module corresponds to a specific DataForSEO API:
SERP
module → SERP APIKEYWORDS_DATA
module → Keywords Data APIONPAGE
module → OnPage APIDATAFORSEO_LABS
module → DataForSEO Labs APIBACKLINKS
: module → Backlinks APIBUSINESS_DATA
: module → Business Data APIDOMAIN_ANALYTICS
: module → Domain Analytics APIYou can either:
Here's how to add a new tool to any new or pre-existing module:
// src/modules/your-module/tools/your-tool.tool.ts import { BaseTool } from '../../base.tool'; import { DataForSEOClient } from '../../../client/dataforseo.client'; import { z } from 'zod'; export class YourTool extends BaseTool { constructor(private client: DataForSEOClient) { super(client); // DataForSEO API returns extensive data with many fields, which can be overwhelming // for AI agents to process. We select only the most relevant fields to ensure // efficient and focused responses. this.fields = [ 'title', // Example: Include the title field 'description', // Example: Include the description field 'url', // Example: Include the URL field // Add more fields as needed ]; } getName() { return 'your-tool-name'; } getDescription() { return 'Description of what your tool does'; } getParams(): z.ZodRawShape { return { // Required parameters keyword: z.string().describe('The keyword to search for'), location: z.string().describe('Location in format "City,Region,Country" or just "Country"'), // Optional parameters fields: z.array(z.string()).optional().describe('Specific fields to return in the response. If not specified, all fields will be returned'), language: z.string().optional().describe('Language code (e.g., "en")'), }; } async handle(params: any) { try { // Make the API call const response = await this.client.makeRequest({ endpoint: '/v3/dataforseo_endpoint_path', method: 'POST', body: [{ // Your request parameters keyword: params.keyword, location: params.location, language: params.language, }], }); // Validate the response for errors this.validateResponse(response); //if the main data array is specified in tasks[0].result[:] field const result = this.handleDirectResult(response); //if main data array specified in tasks[0].result[0].items field const result = this.handleItemsResult(response); // Format and return the response return this.formatResponse(result); } catch (error) { // Handle and format any errors return this.formatErrorResponse(error); } } }
src/modules/
for your module:mkdir -p src/modules/your-module-name
// src/modules/your-module-name/your-module-name.module.ts import { BaseModule } from '../base.module'; import { DataForSEOClient } from '../../client/dataforseo.client'; import { YourTool } from './tools/your-tool.tool'; export class YourModuleNameModule extends BaseModule { constructor(private client: DataForSEOClient) { super(); } getTools() { return { 'your-tool-name': new YourTool(this.client), }; } }
src/config/modules.config.ts
:export const AVAILABLE_MODULES = [ 'SERP', 'KEYWORDS_DATA', 'ONPAGE', 'DATAFORSEO_LABS', 'YOUR_MODULE_NAME', 'OPENAI' // Built-in module providing search and fetch for ChatGPT ] as const;
src/index.ts
:if (isModuleEnabled('YOUR_MODULE_NAME', enabledModules)) { modules.push(new YourModuleNameModule(dataForSEOClient)); }
We're always looking to expand the capabilities of this MCP server. If you have specific DataForSEO endpoints or APIs you'd like to see supported, please:
Your feedback helps us prioritize which APIs to support next!
The OPENAI
module provides a search
tool and a fetch
tool that follow OpenAI's remote MCP server requirements. Enable the module by including OPENAI
in the ENABLED_MODULES
environment variable or leave the variable unset to enable all modules.
The search tool accepts a query
string and allows optional parameters to refine the request:
source
– serp
for live search engine results (default) or labs
to use DataForSEO Labs keyword ideassearch_engine
– one of google
, bing
, or yahoo
(used when source=serp
)language_code
– language code such as en
location_name
– full location name (default United States
)depth
– number of results to fetch from SERP (when source=serp
)limit
– number of keyword ideas to return (when source=labs
)It returns a list of results with id
, title
, text
, and url
. Use the fetch
tool with a returned id
to retrieve the full record for citation in ChatGPT.