import dotenv from 'dotenv';
import { z } from 'zod';
// Load environment variables
dotenv.config();
// Database connection configuration schema
const DatabaseConfigSchema = z.object({
host: z.string().default('localhost'),
port: z.number().default(3306),
user: z.string().default('root'),
password: z.string().optional(),
database: z.string().optional(), // Optional for multi-DB mode
socketPath: z.string().optional(), // For Unix socket connections
});
// Server configuration schema
const ServerConfigSchema = z.object({
allowWrite: z.boolean().default(false),
allowInsert: z.boolean().default(false),
allowUpdate: z.boolean().default(false),
allowDelete: z.boolean().default(false),
allowDDL: z.boolean().default(false),
poolSize: z.number().default(10),
queryTimeout: z.number().default(30000),
enableLogging: z.boolean().default(false),
});
// Parse environment variables
const dbConfig = DatabaseConfigSchema.parse({
host: process.env.MYSQL_HOST,
port: process.env.MYSQL_PORT ? parseInt(process.env.MYSQL_PORT) : undefined,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE,
socketPath: process.env.MYSQL_SOCKET_PATH,
});
const serverConfig = ServerConfigSchema.parse({
allowWrite: process.env.ALLOW_WRITE === 'true',
allowInsert: process.env.ALLOW_INSERT === 'true',
allowUpdate: process.env.ALLOW_UPDATE === 'true',
allowDelete: process.env.ALLOW_DELETE === 'true',
allowDDL: process.env.ALLOW_DDL === 'true',
poolSize: process.env.POOL_SIZE ? parseInt(process.env.POOL_SIZE) : undefined,
queryTimeout: process.env.QUERY_TIMEOUT ? parseInt(process.env.QUERY_TIMEOUT) : undefined,
enableLogging: process.env.ENABLE_LOGGING === 'true',
});
// Multi-database mode check
export const isMultiDbMode = !dbConfig.database || dbConfig.database.trim() === '';
// Export configurations
export const config = {
database: dbConfig,
server: serverConfig,
version: '1.0.0',
name: 'mcp-mysql-server',
} as const;
// Export types
export type DatabaseConfig = z.infer<typeof DatabaseConfigSchema>;
export type ServerConfig = z.infer<typeof ServerConfigSchema>;