Skip to main content
Glama
cli.ts8.66 kB
#!/usr/bin/env node /** * db-mcp - Command Line Interface * * Entry point for running the db-mcp server from the command line. */ import { createServer, DEFAULT_CONFIG } from './server/McpServer.js'; import type { McpServerConfig, TransportType, DatabaseConfig } from './types/index.js'; /** * Parse command line arguments */ function parseArgs(): Partial<McpServerConfig> { const args = process.argv.slice(2); const config: Partial<McpServerConfig> = {}; const databases: DatabaseConfig[] = []; for (let i = 0; i < args.length; i++) { const arg = args[i]; if (arg === '--transport' || arg === '-t') { const value = args[++i]; if (value === 'stdio' || value === 'http' || value === 'sse') { config.transport = value as TransportType; } } else if (arg === '--port' || arg === '-p') { const portValue = args[++i]; if (portValue) { config.port = parseInt(portValue, 10); } } else if (arg === '--name') { const nameValue = args[++i]; if (nameValue) { config.name = nameValue; } } else if (arg === '--version') { const versionValue = args[++i]; if (versionValue) { config.version = versionValue; } } else if (arg === '--tool-filter') { const filterValue = args[++i]; if (filterValue) { config.toolFilter = filterValue; } } else if (arg === '--sqlite') { const dbPath = args[++i]; if (dbPath) { databases.push({ type: 'sqlite', connectionString: dbPath }); } } else if (arg === '--postgresql' || arg === '--postgres') { const connString = args[++i]; if (connString) { databases.push({ type: 'postgresql', connectionString: connString }); } } else if (arg === '--mysql') { const connString = args[++i]; if (connString) { databases.push({ type: 'mysql', connectionString: connString }); } } else if (arg === '--mongodb' || arg === '--mongo') { const connString = args[++i]; if (connString) { databases.push({ type: 'mongodb', connectionString: connString }); } } else if (arg === '--redis') { const connString = args[++i]; if (connString) { databases.push({ type: 'redis', connectionString: connString }); } } else if (arg === '--sqlserver' || arg === '--mssql') { const connString = args[++i]; if (connString) { databases.push({ type: 'sqlserver', connectionString: connString }); } } else if (arg === '--help' || arg === '-h') { printHelp(); process.exit(0); } } if (databases.length > 0) { config.databases = databases; } return config; } /** * Print help message */ function printHelp(): void { console.log(` db-mcp - Multi-database MCP Server Usage: db-mcp [options] Transport Options: --transport, -t <type> Transport type: stdio (default), http, sse --port, -p <port> HTTP port (default: 3000) Database Options: --sqlite <path> Add SQLite database --postgresql <uri> Add PostgreSQL database --mysql <uri> Add MySQL database --mongodb <uri> Add MongoDB database --redis <uri> Add Redis database --sqlserver <uri> Add SQL Server database Server Options: --name <name> Server name (default: db-mcp) --version <version> Server version (default: 0.1.0) --tool-filter <filter> Tool filter string (e.g., "-vector,-geo") Environment Variables: DB_MCP_TOOL_FILTER Tool filter string DATABASE_URI Default database connection string Examples: db-mcp --sqlite ./data.db db-mcp --postgresql postgres://user:pass@localhost/db db-mcp --transport http --port 3000 --sqlite ./data.db db-mcp --sqlite ./data.db --tool-filter "-vector,-stats" For more information, visit: https://github.com/neverinfamous/db-mcp `); } /** * Load configuration from environment variables */ function loadEnvConfig(): Partial<McpServerConfig> { const config: Partial<McpServerConfig> = {}; const databases: DatabaseConfig[] = []; // Tool filter from environment const toolFilter = process.env['DB_MCP_TOOL_FILTER'] ?? process.env['TOOL_FILTER']; if (toolFilter) { config.toolFilter = toolFilter; } // Default database from environment const databaseUri = process.env['DATABASE_URI']; if (databaseUri) { // Try to detect database type from URI if (databaseUri.startsWith('postgres://') || databaseUri.startsWith('postgresql://')) { databases.push({ type: 'postgresql', connectionString: databaseUri }); } else if (databaseUri.startsWith('mysql://')) { databases.push({ type: 'mysql', connectionString: databaseUri }); } else if (databaseUri.startsWith('mongodb://') || databaseUri.startsWith('mongodb+srv://')) { databases.push({ type: 'mongodb', connectionString: databaseUri }); } else if (databaseUri.startsWith('redis://') || databaseUri.startsWith('rediss://')) { databases.push({ type: 'redis', connectionString: databaseUri }); } else if (databaseUri.startsWith('sqlserver://') || databaseUri.startsWith('mssql://')) { databases.push({ type: 'sqlserver', connectionString: databaseUri }); } else { // Assume SQLite for file paths databases.push({ type: 'sqlite', connectionString: databaseUri }); } } // Individual database environment variables const sqliteUri = process.env['SQLITE_DATABASE'] ?? process.env['SQLITE_PATH']; if (sqliteUri) { databases.push({ type: 'sqlite', connectionString: sqliteUri }); } const postgresUri = process.env['POSTGRES_URI'] ?? process.env['POSTGRESQL_URI']; if (postgresUri) { databases.push({ type: 'postgresql', connectionString: postgresUri }); } const mysqlUri = process.env['MYSQL_URI']; if (mysqlUri) { databases.push({ type: 'mysql', connectionString: mysqlUri }); } const mongoUri = process.env['MONGODB_URI'] ?? process.env['MONGO_URI']; if (mongoUri) { databases.push({ type: 'mongodb', connectionString: mongoUri }); } const redisUri = process.env['REDIS_URI']; if (redisUri) { databases.push({ type: 'redis', connectionString: redisUri }); } if (databases.length > 0) { config.databases = databases; } return config; } /** * Main entry point */ async function main(): Promise<void> { try { // Load configuration from environment, then CLI (CLI overrides env) const envConfig = loadEnvConfig(); const cliConfig = parseArgs(); const config: McpServerConfig = { ...DEFAULT_CONFIG, ...envConfig, ...cliConfig, databases: [ ...(envConfig.databases ?? []), ...(cliConfig.databases ?? []) ] } as McpServerConfig; // Create server const server = createServer(config); // Handle shutdown signals process.on('SIGINT', () => { void server.shutdown().then(() => { process.exit(0); }); }); process.on('SIGTERM', () => { void server.shutdown().then(() => { process.exit(0); }); }); // TODO: Register database adapters based on config.databases // This will be implemented when individual adapters are created if (config.databases.length === 0) { console.error('Warning: No databases configured. Use --sqlite, --postgresql, etc. or set DATABASE_URI'); } // Start server await server.start(); } catch (error) { console.error('Fatal error:', error); process.exit(1); } } // Run main().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/neverinfamous/db-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server