@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
JavaScript
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