@coretext-ai/qa-google-contacts-a58500d5-8331-4ce9-a140-d204a9fae815
Version:
MCP server with google-contacts integration
102 lines • 4.27 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 { config } from 'dotenv';
import { loadConfig, validateConfig } from './config.js';
import { LogShipper } from './services/log-shipper.js';
import { Logger } from './services/logger.js';
// Load environment variables
config();
// Import tools from each template
import { GoogleContactsTools } from './tools/google-contacts-tools.js';
import { GoogleContactsClient } from './clients/google-contacts-client.js';
class GoogleContactsMcpServerServer {
constructor() {
// Initialize logging first
this.initializeLogging();
this.server = new Server({
name: 'google-contacts-mcp-server',
version: '1.0.0',
}, {
capabilities: {
tools: {},
},
});
// Initialize template clients and tools
// OAuth client - no constructor arguments needed
this.googleContactsClient = new GoogleContactsClient();
this.googleContactsTools = new GoogleContactsTools(this.googleContactsClient);
this.setupHandlers();
}
initializeLogging() {
const config = loadConfig();
const validation = validateConfig(config);
if (!validation.isValid) {
console.error('Configuration validation failed:', validation.errors);
process.exit(1);
}
this.logShipper = new LogShipper(config.logShipping);
this.logger = new Logger({
logLevel: config.logShipping.logLevel,
component: 'server',
enableConsole: true,
enableShipping: config.logShipping.enabled,
serverName: 'google-contacts-mcp-server',
logShipper: this.logShipper
});
this.logger.info('SERVER_INIT', 'MCP server initializing', {
serverName: 'google-contacts-mcp-server',
logShippingEnabled: config.logShipping.enabled,
logLevel: config.logShipping.logLevel
});
}
setupHandlers() {
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
const tools = [];
// Add google-contacts tools
tools.push(...this.googleContactsTools.getToolDefinitions());
return { tools };
});
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
// Handle google-contacts tools
if (this.googleContactsTools.canHandle(name)) {
return await this.googleContactsTools.executeTool(name, args);
}
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
catch (error) {
if (error instanceof McpError) {
throw error;
}
throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
}
});
}
async run() {
const transport = new StdioServerTransport();
await this.server.connect(transport);
this.logger.info('SERVER_START', 'MCP server started successfully', {
serverName: 'google-contacts-mcp-server',
transport: 'stdio'
});
console.error('google-contacts-mcp-server MCP server running on stdio');
// Handle graceful shutdown for log shipping
const shutdown = async () => {
this.logger.info('SERVER_SHUTDOWN', 'MCP server shutting down', {
serverName: 'google-contacts-mcp-server'
});
if (this.logShipper) {
await this.logShipper.shutdown();
}
process.exit(0);
};
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
}
}
const server = new GoogleContactsMcpServerServer();
server.run().catch(console.error);
//# sourceMappingURL=index.js.map