UNPKG

@weppa-cloud/mcp-google-ads

Version:

Google Ads MCP server for growth marketing - campaign optimization, keyword research, and ROI tracking

93 lines 3.33 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js'; import { z } from 'zod'; import { GoogleAdsAuth } from './auth.js'; import { campaignTools } from './tools/campaigns.js'; import { keywordTools } from './tools/keywords.js'; import { performanceTools } from './tools/performance.js'; import { budgetTools } from './tools/budget.js'; const server = new Server({ name: '@weppa-cloud/mcp-google-ads', version: '1.0.0', }, { capabilities: { tools: {}, }, }); let auth; const requiredEnvVars = [ 'GOOGLE_ADS_CLIENT_ID', 'GOOGLE_ADS_DEVELOPER_TOKEN', 'GOOGLE_ADS_REFRESH_TOKEN', 'GOOGLE_ADS_CLIENT_SECRET', 'GOOGLE_ADS_CUSTOMER_ID' ]; const optionalEnvVars = [ 'GOOGLE_APPLICATION_CREDENTIALS', 'GOOGLE_ADS_LOGIN_CUSTOMER_ID' ]; function validateEnvironment() { const missing = requiredEnvVars.filter(v => !process.env[v]); if (missing.length > 0) { throw new Error(`Missing required environment variables: ${missing.join(', ')}\n` + 'Please ensure all Google Ads API credentials are configured.'); } } try { validateEnvironment(); auth = new GoogleAdsAuth({ clientId: process.env.GOOGLE_ADS_CLIENT_ID, clientSecret: process.env.GOOGLE_ADS_CLIENT_SECRET, refreshToken: process.env.GOOGLE_ADS_REFRESH_TOKEN, developerToken: process.env.GOOGLE_ADS_DEVELOPER_TOKEN, customerId: process.env.GOOGLE_ADS_CUSTOMER_ID, loginCustomerId: process.env.GOOGLE_ADS_LOGIN_CUSTOMER_ID, }); } catch (error) { console.error('Failed to initialize Google Ads authentication:', error); process.exit(1); } // Register all tools const allTools = [ ...campaignTools, ...keywordTools, ...performanceTools, ...budgetTools, ]; server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: allTools.map(tool => ({ name: tool.name, description: tool.description, inputSchema: tool.inputSchema, })), })); server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; const tool = allTools.find(t => t.name === name); if (!tool) { throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`); } try { const result = await tool.handler(args, auth); return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }; } catch (error) { if (error instanceof z.ZodError) { throw new McpError(ErrorCode.InvalidParams, `Invalid parameters: ${error.errors.map(e => `${e.path}: ${e.message}`).join(', ')}`); } throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`); } }); async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error('Google Ads MCP server running...'); } main().catch((error) => { console.error('Server failed to start:', error); process.exit(1); }); //# sourceMappingURL=index.js.map