apex-data-for-seo
Version:
A comprehensive MCP server for DataForSEO API
762 lines • 29.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.registerTools = registerTools;
// Try different import styles to be more resilient
let McpServer;
try {
// Try CommonJS style import first
const sdk = require('@modelcontextprotocol/sdk');
McpServer = sdk.McpServer;
}
catch (error) {
try {
// Fall back to ESM style
const sdk = require('@modelcontextprotocol/sdk/server/mcp');
McpServer = sdk.McpServer;
}
catch (e) {
console.error('Error importing MCP SDK:', e);
process.exit(1);
}
}
const zod_1 = require("zod");
/**
* Register all tools with the MCP server
*/
function registerTools(server, client) {
// =================== SERP API Tools ===================
// Google SERP Search Tool
server.tool("DataForSEO_GoogleSearch", {
keyword: zod_1.z.string().describe("Search keyword"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')"),
device: zod_1.z.enum(["desktop", "mobile", "tablet"]).optional().describe("Device type")
}, async (params) => {
try {
const response = await client.post("/serp/google/organic/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English",
device: params.device || "desktop"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Google Maps Search
server.tool("DataForSEO_GoogleMapsSearch", {
keyword: zod_1.z.string().describe("Search keyword for Google Maps"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/serp/google/maps/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google Maps Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Google News Search
server.tool("DataForSEO_GoogleNewsSearch", {
keyword: zod_1.z.string().describe("Search keyword for Google News"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/serp/google/news/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google News Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Bing Search
server.tool("DataForSEO_BingSearch", {
keyword: zod_1.z.string().describe("Search keyword for Bing"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/serp/bing/organic/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Bing Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Keywords Data API Tools ===================
// Keyword Data Tool
server.tool("DataForSEO_KeywordData", {
keyword: zod_1.z.string().describe("Keyword to analyze"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/keywords_data/google/search_volume/live", [{
keywords: [params.keyword],
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Keyword Data tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Keyword Ideas Tool
server.tool("DataForSEO_KeywordIdeas", {
seed_keywords: zod_1.z.array(zod_1.z.string()).describe("List of seed keywords"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/keywords_data/google/keywords_for_keywords/live", [{
keywords: params.seed_keywords,
location_name: params.location_name || "United States",
language_name: params.language_name || "English",
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Keyword Ideas tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Keywords For Site Tool
server.tool("DataForSEO_KeywordsForSite", {
target: zod_1.z.string().describe("Target website URL"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/keywords_data/google/keywords_for_site/live", [{
target: params.target,
location_name: params.location_name || "United States",
language_name: params.language_name || "English",
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Keywords For Site tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Domain Analytics API Tools ===================
// Domain Overview Tool
server.tool("DataForSEO_DomainOverview", {
domain: zod_1.z.string().describe("Domain to analyze (e.g., 'example.com')"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/domain_analytics/domain_overview/live", [{
target: params.domain,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Domain Overview tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Website Technologies Tool
server.tool("DataForSEO_WebsiteTechnologies", {
domain: zod_1.z.string().describe("Domain to analyze (e.g., 'example.com')")
}, async (params) => {
try {
const response = await client.post("/domain_analytics/technologies/live", [{
target: params.domain
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Website Technologies tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Backlinks API Tools ===================
// Backlinks Overview Tool
server.tool("DataForSEO_BacklinksOverview", {
target: zod_1.z.string().describe("Target URL or domain"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/backlinks/summary/live", [{
target: params.target,
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Backlinks Overview tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Backlinks List Tool
server.tool("DataForSEO_BacklinksList", {
target: zod_1.z.string().describe("Target URL or domain"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/backlinks/backlinks/live", [{
target: params.target,
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Backlinks List tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== On-Page API Tools ===================
// On-Page Analysis Tool
server.tool("DataForSEO_OnPageAnalysis", {
target: zod_1.z.string().describe("URL to analyze"),
max_crawl_pages: zod_1.z.number().optional().describe("Maximum number of pages to crawl"),
store_raw_html: zod_1.z.boolean().optional().describe("Whether to store raw HTML")
}, async (params) => {
try {
const response = await client.post("/on_page/task_post", [{
target: params.target,
max_crawl_pages: params.max_crawl_pages || 10,
store_raw_html: params.store_raw_html || false
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in On-Page Analysis tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Instant Page Analysis Tool
server.tool("DataForSEO_InstantPageAnalysis", {
url: zod_1.z.string().describe("URL to analyze"),
custom_js: zod_1.z.string().optional().describe("Custom JavaScript to execute on the page")
}, async (params) => {
try {
const response = await client.post("/on_page/instant_pages", [{
url: params.url,
custom_js: params.custom_js || ""
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Instant Page Analysis tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Merchant API Tools ===================
// Google Shopping Search Tool
server.tool("DataForSEO_GoogleShoppingSearch", {
keyword: zod_1.z.string().describe("Search keyword for Google Shopping"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/merchant/google/search/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google Shopping Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Amazon Product Search Tool
server.tool("DataForSEO_AmazonProductSearch", {
keyword: zod_1.z.string().describe("Search keyword for Amazon"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/merchant/amazon/search/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Amazon Product Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Content Analysis API Tools ===================
// Content Analysis Tool
server.tool("DataForSEO_ContentAnalysis", {
content: zod_1.z.string().describe("Text content to analyze"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/content_analysis/sentiment_analysis/live", [{
content: params.content,
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Content Analysis tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== App Data API Tools ===================
// App Store Search Tool
server.tool("DataForSEO_AppStoreSearch", {
keyword: zod_1.z.string().describe("Search keyword for App Store"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/app_data/apple/app_store/search/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in App Store Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Google Play Search Tool
server.tool("DataForSEO_GooglePlaySearch", {
keyword: zod_1.z.string().describe("Search keyword for Google Play"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/app_data/google/play/search/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google Play Search tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== Business Data API Tools ===================
// Google Business Info Tool
server.tool("DataForSEO_GoogleBusinessInfo", {
keyword: zod_1.z.string().describe("Business name or keyword"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/business_data/google/my_business_info/live", [{
keyword: params.keyword,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Google Business Info tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// =================== DataForSEO Labs API Tools ===================
// Domain Competitors Tool
server.tool("DataForSEO_DomainCompetitors", {
domain: zod_1.z.string().describe("Domain to analyze competitors for (e.g., 'example.com')"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/dataforseo_labs/domain_competitors/live", [{
target: params.domain,
location_name: params.location_name || "United States",
language_name: params.language_name || "English",
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Domain Competitors tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Domain Intersection Tool
server.tool("DataForSEO_DomainIntersection", {
domains: zod_1.z.array(zod_1.z.string()).min(2).describe("Array of domains to compare (min 2)"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')"),
limit: zod_1.z.number().optional().describe("Number of results to return")
}, async (params) => {
try {
const response = await client.post("/dataforseo_labs/domain_intersection/live", [{
targets: params.domains,
location_name: params.location_name || "United States",
language_name: params.language_name || "English",
limit: params.limit || 100
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Domain Intersection tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
// Keyword Difficulty Tool
server.tool("DataForSEO_KeywordDifficulty", {
keywords: zod_1.z.array(zod_1.z.string()).describe("Array of keywords to analyze"),
location_name: zod_1.z.string().optional().describe("Location name (e.g., 'United States')"),
language_name: zod_1.z.string().optional().describe("Language name (e.g., 'English')")
}, async (params) => {
try {
const response = await client.post("/dataforseo_labs/keyword_difficulty/live", [{
keywords: params.keywords,
location_name: params.location_name || "United States",
language_name: params.language_name || "English"
}]);
return {
content: [
{
type: "text",
text: JSON.stringify(response, null, 2)
}
]
};
}
catch (error) {
console.error("Error in Keyword Difficulty tool:", error);
return {
content: [
{
type: "text",
text: `Error: ${error instanceof Error ? error.message : String(error)}`
}
]
};
}
});
}
//# sourceMappingURL=tools.js.map