#!/usr/bin/env node
/**
* MCP Server Template - Entry Point
*
* This file is the CLI entry point for the MCP server.
* It initializes observability, database, tools, and starts the server.
*
* IMPORTANT: instrumentation.ts must be imported first for proper tracing.
*/
// Initialize observability FIRST (before any other imports)
import './instrumentation.js';
import { createServer, runStdioServer, setupGracefulShutdown } from './server.js';
import { initDatabase, closeDatabase, saveDatabase } from './db/index.js';
import { getToolRegistry } from './tools/registry.js';
import { createLogger } from './shared/logger.js';
import { getConfig, validateConfig } from './config/index.js';
import { shutdownObservability } from './instrumentation.js';
// Import example tools (remove/replace with your own)
import { registerExampleTools } from './tools/examples.js';
const logger = createLogger('main');
/**
* Main entry point
*/
async function main(): Promise<void> {
try {
// Validate configuration
const configValidation = validateConfig();
if (!configValidation.valid) {
logger.critical('Invalid configuration', { errors: configValidation.errors });
process.exit(1);
}
const config = getConfig();
logger.info('Starting MCP server', {
name: config.serverName,
version: config.serverVersion,
});
// Initialize database
await initDatabase();
logger.info('Database initialized');
// Register tools
const registry = getToolRegistry();
registerExampleTools(registry);
logger.info('Tools registered', { count: registry.size });
// Create and configure server
const server = createServer();
// Setup graceful shutdown
const cleanup = async (): Promise<void> => {
saveDatabase();
closeDatabase();
await shutdownObservability();
};
setupGracefulShutdown(server, cleanup);
// Start server based on transport mode
const transport = process.env['MCP_SERVER_TRANSPORT'] ?? 'stdio';
if (transport === 'http') {
// HTTP transport (for cloud deployment)
const { createHttpTransport, startSessionCleanup } = await import('./transport/index.js');
const app = createHttpTransport({
requireAuth: !config.debugMode,
});
const port = parseInt(process.env['MCP_SERVER_PORT'] ?? '3000', 10);
const host = process.env['MCP_SERVER_HOST'] ?? '127.0.0.1';
// Start session cleanup
startSessionCleanup();
app.listen(port, host, () => {
logger.info('HTTP server started', { host, port });
console.error(`MCP server listening on http://${host}:${port}`);
});
} else {
// Stdio transport (default, for Claude Desktop)
await runStdioServer(server);
}
} catch (error) {
logger.critical('Failed to start server', {
error: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined,
});
process.exit(1);
}
}
// Run main
void main();