import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { setupApiClient } from "./api/client.js";
import { registerSerpTools } from "./api/serp/index.js";
import { registerKeywordsTools } from "./api/keywords/index.js";
import { registerLabsTools } from "./api/labs/index.js";
import { registerBacklinksTools } from "./api/backlinks/index.js";
import { registerOnPageTools } from "./api/onpage/index.js";
import { registerDomainAnalyticsTools } from "./api/domain-analytics/index.js";
import { registerContentAnalysisTools } from "./api/content-analysis/index.js";
import { registerContentGenerationTools } from "./api/content-generation/index.js";
import { registerMerchantTools } from "./api/merchant/index.js";
import { registerAppDataTools } from "./api/app-data/index.js";
import { registerBusinessDataTools } from "./api/business-data/index.js";
import { registerLocalFalconTools } from "./api/localfalcon/index.js";
import { registerAiOptimizationTools } from "./api/ai-optimization/index.js";
async function main() {
// Get authentication credentials from environment variables
const dataForSeoLogin = process.env.DATAFORSEO_LOGIN;
const dataForSeoPassword = process.env.DATAFORSEO_PASSWORD;
if (!dataForSeoLogin || !dataForSeoPassword) {
console.error("Error: DataForSEO API credentials not provided");
console.error("Please set DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD environment variables");
process.exit(1);
}
// Setup API client
const apiClient = setupApiClient(dataForSeoLogin, dataForSeoPassword);
// Create an MCP server
const server = new McpServer({
name: "SEO Tools MCP Server",
version: "1.0.0",
});
// Parse enabled modules from environment variable
// Format: ENABLED_MODULES="SERP,BUSINESS_DATA,LABS" (comma-separated)
// If not set, all modules are enabled
const enabledModulesEnv = process.env.ENABLED_MODULES;
const enabledModules = enabledModulesEnv
? new Set(enabledModulesEnv.split(',').map(m => m.trim().toUpperCase()))
: null; // null means all enabled
const isEnabled = (module: string) => !enabledModules || enabledModules.has(module);
// Register tools for each DataForSEO API category (conditionally)
if (isEnabled('SERP')) registerSerpTools(server, apiClient);
if (isEnabled('KEYWORDS_DATA')) registerKeywordsTools(server, apiClient);
if (isEnabled('LABS') || isEnabled('DATAFORSEO_LABS')) registerLabsTools(server, apiClient);
if (isEnabled('BACKLINKS')) registerBacklinksTools(server, apiClient);
if (isEnabled('ONPAGE')) registerOnPageTools(server, apiClient);
if (isEnabled('DOMAIN_ANALYTICS')) registerDomainAnalyticsTools(server, apiClient);
if (isEnabled('CONTENT_ANALYSIS')) registerContentAnalysisTools(server, apiClient);
if (isEnabled('CONTENT_GENERATION')) registerContentGenerationTools(server, apiClient);
if (isEnabled('MERCHANT')) registerMerchantTools(server, apiClient);
if (isEnabled('APP_DATA')) registerAppDataTools(server, apiClient);
if (isEnabled('BUSINESS_DATA')) registerBusinessDataTools(server, apiClient);
if (isEnabled('AI_OPTIMIZATION')) registerAiOptimizationTools(server, apiClient);
console.error(`Enabled modules: ${enabledModules ? Array.from(enabledModules).join(', ') : 'ALL'}`);
// Register third-party API tools
// Local Falcon API (optional integration)
const localFalconApiKey = process.env.LOCALFALCON_API_KEY;
if (localFalconApiKey) {
console.error("Local Falcon API key found - registering Local Falcon tools");
registerLocalFalconTools(server, {
apiKey: localFalconApiKey,
baseUrl: process.env.LOCALFALCON_API_URL // Optional, uses default if not provided
});
} else {
console.error("Local Falcon API key not found - skipping Local Falcon integration");
console.error("To enable, set the LOCALFALCON_API_KEY environment variable");
}
// Add more third-party API integrations here
// Example:
// if (process.env.ANOTHER_SEO_TOOL_API_KEY) {
// registerAnotherSeoToolTools(server, { apiKey: process.env.ANOTHER_SEO_TOOL_API_KEY });
// }
// Start receiving messages on stdin and sending messages on stdout
const transport = new StdioServerTransport();
console.error("SEO Tools MCP Server starting...");
await server.connect(transport);
console.error("SEO Tools MCP Server connected");
}
main().catch((error) => {
console.error("Error in SEO Tools MCP Server:", error);
process.exit(1);
});