#!/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 { DatabaseManager } from './databaseManager.js';
import { tools } from './tools.js';
import { handleToolCall } from './handlers.js';
const dbManager = new DatabaseManager();
const server = new Server(
{
name: 'multi-database-sql-server',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
);
// Handle tool listing
server.setRequestHandler(ListToolsRequestSchema, async () => {
return { tools };
});
// Handle tool calls
server.setRequestHandler(CallToolRequestSchema, async (request) => {
return await handleToolCall(request, dbManager);
});
// Start the server
async function main(): Promise<void> {
try {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Multi-Database SQL MCP Server running on stdio');
} catch (error) {
console.error('Failed to start server:', error);
process.exit(1);
}
}
// Handle graceful shutdown
const shutdown = async (): Promise<void> => {
console.error('Shutting down...');
// Close all database connections
const connections = dbManager.getConnectionInfo();
await Promise.all(
connections.map(conn => dbManager.disconnect(conn.id))
);
process.exit(0);
};
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
// Handle uncaught errors
process.on('uncaughtException', (error) => {
console.error('Uncaught Exception:', error);
shutdown();
});
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
shutdown();
});
main().catch((error) => {
console.error('Main function error:', error);
process.exit(1);
});