@coretext-ai/custom-test-google-contacts-a58500d5-8331-4ce9-a140-d204a9fae815
Version:
MCP server with google-contacts integration
127 lines • 5.62 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';
// Import unified OAuth clients for special cases
import { GoogleOAuthClient } from './oauth/google-oauth-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 OAuth clients first
this.googleOAuthClient = new GoogleOAuthClient();
// Initialize template clients and tools
// Google service - use unified GoogleOAuthClient
this.googleContactsClient = new GoogleContactsClient({
authToken: process.env.GOOGLE_OAUTH_CREDENTIALS,
gOOGLEOAUTHCREDENTIALS: process.env.GOOGLE_OAUTH_CREDENTIALS,
oauth: {
"provider": "google",
"scopes": [
"https://www.googleapis.com/auth/contacts",
"https://www.googleapis.com/auth/contacts.readonly",
"https://www.googleapis.com/auth/contacts.other.readonly",
"https://www.googleapis.com/auth/directory.readonly",
"https://www.googleapis.com/auth/user.addresses.read",
"https://www.googleapis.com/auth/user.emails.read",
"https://www.googleapis.com/auth/user.phonenumbers.read",
"https://www.googleapis.com/auth/userinfo.profile"
],
"credentialFileEnv": "GOOGLE_OAUTH_CREDENTIALS",
"redirectUri": "http://localhost:3000/oauth/callback/google",
"tokenStoragePath": "~/.mcp/google-tokens/"
},
logger: this.logger,
oauthClient: this.googleOAuthClient
});
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