dataforseo-mcp-server
Version:
A Model Context Protocol (MCP) server for the DataForSEO API, enabling modular and extensible integration of DataForSEO endpoints with support for both HTTP and SSE transports.
56 lines (55 loc) • 2.15 kB
JavaScript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { DataForSEOClient } from './client/dataforseo.client.js';
import { EnabledModulesSchema } from './config/modules.config.js';
import { z } from 'zod';
import { ModuleLoaderService } from "./utils/module-loader.js";
import { initializeFieldConfiguration } from './config/field-configuration.js';
import { name, version } from './utils/version.js';
// Initialize field configuration if provided
initializeFieldConfiguration();
console.error('Starting DataForSEO MCP Server...');
console.error(`Server name: ${name}, version: ${version}`);
// Create server instance
const server = new McpServer({
name,
version,
});
// Initialize DataForSEO client
const dataForSEOConfig = {
username: process.env.DATAFORSEO_USERNAME || "",
password: process.env.DATAFORSEO_PASSWORD || "",
};
const dataForSEOClient = new DataForSEOClient(dataForSEOConfig);
console.error('DataForSEO client initialized');
// Parse enabled modules from environment
const enabledModules = EnabledModulesSchema.parse(process.env.ENABLED_MODULES);
// Initialize modules
const modules = ModuleLoaderService.loadModules(dataForSEOClient, enabledModules);
console.error('Modules initialized');
// Register tools from modules
function registerModuleTools() {
modules.forEach(module => {
const tools = module.getTools();
Object.entries(tools).forEach(([name, tool]) => {
const typedTool = tool;
const schema = z.object(typedTool.params);
server.tool(name, typedTool.description, schema.shape, typedTool.handler);
});
});
}
// Register all tools
registerModuleTools();
console.error('Tools registered');
// Start the server
async function main() {
const transport = new StdioServerTransport();
console.error('Starting server');
await server.connect(transport);
console.error("DataForSEO MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});