Skip to main content
Glama
LucasSiqueiraSurreco

Database Bridge MCP Server

index.ts5.36 kB
import * as dotenv from "dotenv"; import { SchemaPermissions } from "../types/index.js"; import { parseSchemaPermissions } from "../utils/index.js"; import type { DatabaseType } from "../db/adapters/types.js"; export const MCP_VERSION = "2.0.2"; // @INFO: Load environment variables from .env file dotenv.config(); // @INFO: Database type configuration export const DB_TYPE = (process.env.DB_TYPE || "mysql") as DatabaseType; // @INFO: Read-only mode configuration (double protection: app + database) export const DB_READ_ONLY_MODE = process.env.DB_READ_ONLY_MODE === "true"; // @INFO: Update the environment setup to ensure database is correctly set if (process.env.NODE_ENV === "test" && !process.env.MYSQL_DB) { process.env.MYSQL_DB = "mcp_test_db"; // @INFO: Ensure we have a database name for tests } // Write operation flags (global defaults) export const ALLOW_INSERT_OPERATION = process.env.ALLOW_INSERT_OPERATION === "true"; export const ALLOW_UPDATE_OPERATION = process.env.ALLOW_UPDATE_OPERATION === "true"; export const ALLOW_DELETE_OPERATION = process.env.ALLOW_DELETE_OPERATION === "true"; export const ALLOW_DDL_OPERATION = process.env.ALLOW_DDL_OPERATION === "true"; // Transaction mode control export const MYSQL_DISABLE_READ_ONLY_TRANSACTIONS = process.env.MYSQL_DISABLE_READ_ONLY_TRANSACTIONS === "true"; // Schema-specific permissions export const SCHEMA_INSERT_PERMISSIONS: SchemaPermissions = parseSchemaPermissions(process.env.SCHEMA_INSERT_PERMISSIONS); export const SCHEMA_UPDATE_PERMISSIONS: SchemaPermissions = parseSchemaPermissions(process.env.SCHEMA_UPDATE_PERMISSIONS); export const SCHEMA_DELETE_PERMISSIONS: SchemaPermissions = parseSchemaPermissions(process.env.SCHEMA_DELETE_PERMISSIONS); export const SCHEMA_DDL_PERMISSIONS: SchemaPermissions = parseSchemaPermissions( process.env.SCHEMA_DDL_PERMISSIONS, ); // Remote MCP configuration export const IS_REMOTE_MCP = process.env.IS_REMOTE_MCP === "true"; export const REMOTE_SECRET_KEY = process.env.REMOTE_SECRET_KEY || ""; export const PORT = process.env.PORT || 3000; // Check if we're in multi-DB mode (no specific DB set) export const isMultiDbMode = (() => { // Para MySQL/PostgreSQL, multi-DB é quando não há database definido if (DB_TYPE === "mysql" || DB_TYPE === "postgresql") { const dbVar = DB_TYPE === "mysql" ? process.env.MYSQL_DB : process.env.POSTGRESQL_DB; return !dbVar || dbVar.trim() === ""; } // SQLite sempre tem um database (arquivo ou :memory:) return false; })(); // Database connection configuration helper function getConnectionConfig() { const baseConfig = { user: process.env.DB_USER || process.env.MYSQL_USER || "root", password: process.env.DB_PASS ?? process.env.MYSQL_PASS ?? "", connectionLimit: Number(process.env.DB_CONNECTION_LIMIT || "10"), }; // SSL configuration (para clouds AWS RDS, GCP Cloud SQL, Azure Database) const sslConfig = process.env.DB_SSL === "true" ? { ssl: { rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED !== "false", ...(process.env.DB_SSL_CA ? { ca: process.env.DB_SSL_CA } : {}), ...(process.env.DB_SSL_CERT ? { cert: process.env.DB_SSL_CERT } : {}), ...(process.env.DB_SSL_KEY ? { key: process.env.DB_SSL_KEY } : {}), }, } : {}; // Configuração específica por tipo de banco if (DB_TYPE === "mysql") { return { ...baseConfig, ...(process.env.MYSQL_SOCKET_PATH ? { socketPath: process.env.MYSQL_SOCKET_PATH } : { host: process.env.DB_HOST || process.env.MYSQL_HOST || "127.0.0.1", port: Number(process.env.DB_PORT || process.env.MYSQL_PORT || "3306"), }), database: process.env.DB_NAME || process.env.MYSQL_DB || undefined, ...sslConfig, }; } if (DB_TYPE === "postgresql") { return { ...baseConfig, host: process.env.DB_HOST || process.env.POSTGRESQL_HOST || "127.0.0.1", port: Number(process.env.DB_PORT || process.env.POSTGRESQL_PORT || "5432"), database: process.env.DB_NAME || process.env.POSTGRESQL_DB || undefined, ...sslConfig, }; } if (DB_TYPE === "sqlite") { return { ...baseConfig, database: process.env.DB_NAME || process.env.SQLITE_DB || ":memory:", }; } return baseConfig; } export const mcpConfig = { server: { name: "mcp-db-bridge", version: MCP_VERSION, connectionTypes: ["stdio", "streamableHttp"], }, database: getConnectionConfig(), // Mantém mysql para backward compatibility (deprecated) mysql: { ...(process.env.MYSQL_SOCKET_PATH ? { socketPath: process.env.MYSQL_SOCKET_PATH } : { host: process.env.MYSQL_HOST || "127.0.0.1", port: Number(process.env.MYSQL_PORT || "3306"), }), user: process.env.MYSQL_USER || "root", password: process.env.MYSQL_PASS ?? "", database: process.env.MYSQL_DB || undefined, connectionLimit: 10, authPlugins: { mysql_clear_password: () => () => Buffer.from(process.env.MYSQL_PASS || ""), }, ...(process.env.MYSQL_SSL === "true" ? { ssl: { rejectUnauthorized: process.env.MYSQL_SSL_REJECT_UNAUTHORIZED === "true", }, } : {}), }, paths: { schema: "schema", }, };

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/LucasSiqueiraSurreco/mcp-db-bridge'

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