server.ts•3.23 kB
#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import { comprehensiveReviewTool, handleComprehensiveReview } from './tools/comprehensive-review.js';
import { targetedAnalysisTool, handleTargetedAnalysis } from './tools/targeted-analysis.js';
const SERVER_NAME = 'gemini-cli-mcp';
const SERVER_VERSION = '1.0.0';
class GeminiMCPServer {
private server: Server;
constructor() {
this.server = new Server(
{
name: SERVER_NAME,
version: SERVER_VERSION,
},
{
capabilities: {
tools: {},
},
}
);
this.setupToolHandlers();
this.setupErrorHandling();
}
private setupToolHandlers(): void {
// List available tools
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
comprehensiveReviewTool,
targetedAnalysisTool,
],
};
});
// Handle tool calls
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
switch (name) {
case 'gemini_comprehensive_review':
return await handleComprehensiveReview(args);
case 'gemini_targeted_analysis':
return await handleTargetedAnalysis(args);
default:
throw new Error(`Unknown tool: ${name}`);
}
} catch (error) {
console.error(`Error handling tool ${name}:`, error);
return {
content: [
{
type: 'text',
text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,
},
],
isError: true,
};
}
});
}
private setupErrorHandling(): void {
this.server.onerror = (error) => {
console.error('[MCP Error]', error);
};
process.on('SIGINT', async () => {
console.log('\nShutting down Gemini MCP server...');
await this.server.close();
process.exit(0);
});
}
async run(): Promise<void> {
const transport = new StdioServerTransport();
await this.server.connect(transport);
console.error(`Gemini CLI MCP server running on stdio`);
console.error(`Server: ${SERVER_NAME} v${SERVER_VERSION}`);
console.error('Available tools:');
console.error('- gemini_comprehensive_review: Full codebase analysis');
console.error('- gemini_targeted_analysis: Focused component analysis');
}
}
// Main execution
async function main(): void {
const server = new GeminiMCPServer();
await server.run();
}
// Handle uncaught errors
process.on('uncaughtException', (error) => {
console.error('Uncaught exception:', error);
process.exit(1);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled rejection at:', promise, 'reason:', reason);
process.exit(1);
});
// Run the server
main().catch((error) => {
console.error('Failed to start server:', error);
process.exit(1);
});