Database
Servidor MCP de base de datos para MySQL, MariaDB, PostgreSQL y SQLite
Documentación
Database MCP
Un servidor MCP de un solo binario para bases de datos SQL. Conecta tu asistente de IA a MySQL/MariaDB, PostgreSQL o SQLite sin dependencias de ejecución.
Sitio web · Documentación · Lanzamientos

Características ✨
- Multi-base de datos — MySQL/MariaDB, PostgreSQL y SQLite desde un solo binario
- Herramientas MCP — descubrimiento de esquemas (
listDatabases,listTables,listViews,listTriggers,listFunctions,listProcedures,listMaterializedViews), acceso a datos (readQuery,writeQuery), DDL (createDatabase,dropDatabase,dropTable) yexplainQuery. El modo de solo lectura oculta las herramientas de escritura (writeQuery,createDatabase,dropDatabase,dropTable). Consulta Herramientas MCP para conocer la disponibilidad por backend. - Un solo binario — ~7 MB, sin necesidad de Python/Node/Docker
- Múltiples transportes — stdio (para Claude Desktop, Cursor) y HTTP (para remoto/multicliente)
- Configuración en dos capas — banderas de CLI > variables de entorno, con valores predeterminados sensatos por backend
Instalación 📦
macOS, Linux, WSL:
curl -fsSL https://dbmcp.haymon.ai/install.sh | bash
Windows PowerShell:
irm https://dbmcp.haymon.ai/install.ps1 | iex
Windows CMD:
curl -fsSL https://dbmcp.haymon.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
Consulta la documentación de instalación para Docker, Cargo y otros métodos.
Inicio rápido 🚀
Usando .mcp.json (recomendado)
Añade un archivo .mcp.json a la raíz de tu proyecto. Los clientes MCP leen este archivo y configuran el servidor automáticamente.
Transporte stdio — el cliente inicia y gestiona el proceso del servidor:
{
"mcpServers": {
"dbmcp": {
"command": "dbmcp",
"args": ["stdio"],
"env": {
"DB_BACKEND": "mysql",
"DB_HOST": "127.0.0.1",
"DB_PORT": "3306",
"DB_USER": "root",
"DB_PASSWORD": "secret",
"DB_NAME": "mydb"
}
}
}
}
Transporte HTTP — tú inicias el servidor y el cliente se conecta a él:
# Start the server first
dbmcp http --db-backend mysql --db-user root --db-name mydb --port 9001
{
"mcpServers": {
"dbmcp": {
"type": "http",
"url": "http://127.0.0.1:9001/mcp"
}
}
}
Nota: El campo
"type": "http"es obligatorio para el transporte HTTP. Sin él, clientes como Claude Code rechazarán la configuración.
Usando banderas de CLI
# MySQL/MariaDB
dbmcp stdio --db-backend mysql --db-host localhost --db-user root --db-name mydb
# PostgreSQL
dbmcp stdio --db-backend postgres --db-host localhost --db-user postgres --db-name mydb
# SQLite
dbmcp stdio --db-backend sqlite --db-name ./data.db
# HTTP transport
dbmcp http --db-backend mysql --db-user root --db-name mydb --host 0.0.0.0 --port 9001
Usando variables de entorno
DB_BACKEND=mysql DB_USER=root DB_NAME=mydb dbmcp stdio
Configuración ⚙️
La configuración se carga con una precedencia clara:
Banderas de CLI > variables de entorno > valores predeterminados
Las variables de entorno normalmente las establece tu cliente MCP (mediante env o envFile en la configuración del servidor).
Subcomandos
| Subcomando | Descripción |
|---|---|
stdio | Ejecutar en modo stdio |
http | Ejecutar en modo HTTP/SSE |
version | Mostrar información de versión y salir |
Se requiere un subcomando: ejecutar dbmcp sin subcomando muestra la ayuda de uso y sale con un estado distinto de cero.
Opciones de base de datos (compartidas entre subcomandos)
| Bandera | Variable de entorno | Predeterminado | Descripción |
|---|---|---|---|
--db-backend | DB_BACKEND | (obligatorio) | mysql, mariadb, postgres o sqlite |
--db-host | DB_HOST | localhost | Host de la base de datos |
--db-port | DB_PORT | predeterminado del backend | 3306 (MySQL/MariaDB), 5432 (PostgreSQL) |
--db-user | DB_USER | predeterminado del backend | root (MySQL/MariaDB), postgres (PostgreSQL) |
--db-password | DB_PASSWORD | (vacío) | Contraseña de la base de datos |
--db-name | DB_NAME | (vacío) | Nombre de la base de datos o ruta del archivo SQLite |
--db-charset | DB_CHARSET | Conjunto de caracteres (solo MySQL/MariaDB) |
Opciones SSL/TLS
| Bandera | Variable de entorno | Predeterminado | Descripción |
|---|---|---|---|
--db-ssl | DB_SSL | false | Habilitar SSL |
--db-ssl-ca | DB_SSL_CA | Ruta del certificado CA | |
--db-ssl-cert | DB_SSL_CERT | Ruta del certificado de cliente | |
--db-ssl-key | DB_SSL_KEY | Ruta de la clave de cliente | |
--db-ssl-verify-cert | DB_SSL_VERIFY_CERT | true | Verificar el certificado del servidor |
Opciones del servidor
| Bandera | Variable de entorno | Predeterminado | Descripción |
|---|---|---|---|
--db-read-only | DB_READ_ONLY | true | Bloquear consultas de escritura |
--db-max-pool-size | DB_MAX_POOL_SIZE | 5 | Tamaño máximo del grupo de conexiones (mín.: 1) |
--db-connection-timeout | DB_CONNECTION_TIMEOUT | (sin definir) | Tiempo de espera de conexión en segundos (mín.: 1) |
--db-query-timeout | DB_QUERY_TIMEOUT | 30 | Tiempo de espera de ejecución de consultas en segundos |
--db-page-size | DB_PAGE_SIZE | 100 | Máximo de elementos por respuesta de herramienta paginada (rango 1–500) |
Opciones de registro
| Bandera | Variable de entorno | Predeterminado | Descripción |
|---|---|---|---|
--log-level | LOG_LEVEL | info | Nivel de registro (trace/debug/info/warn/error) |
Opciones solo HTTP (disponibles únicamente con el subcomando http)
| Bandera | Predeterminado | Descripción |
|---|---|---|
--host | 127.0.0.1 | Host de enlace |
--port | 9001 | Puerto de enlace |
--allowed-origins | variantes de localhost | Orígenes de navegador permitidos (separados por comas). Controla tanto la preflight CORS como el rechazo de Origin en el servidor. |
--allowed-hosts | localhost,127.0.0.1,::1 | Cabeceras Host de confianza (separadas por comas). Se aplican en el servidor; se respeta :authority de HTTP/2. |
Herramientas MCP 🧩
listDatabases
Lista las bases de datos accesibles, paginadas mediante cursor / nextCursor. Consulta Paginación por cursor para conocer los detalles de iteración. No disponible para SQLite.
listTables
Lista las tablas de una base de datos, paginadas mediante cursor / nextCursor. Consulta Paginación por cursor para conocer los detalles de iteración.
Parámetros: database (usa la base de datos activa por defecto; SQLite no tiene parámetro database), cursor, search, detailed.
search es un patrón LIKE/ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines: pasa users% para coincidir con nombres que empiecen por users, o %order% para coincidencias de subcadena. Una palabra sin comodines solo coincide con un nombre de tabla exacto.
detailed (predeterminado: false) cambia la forma de la respuesta:
- Breve (predeterminado) —
tableses un array JSON ordenado de cadenas con nombres de tabla simples. - Detallado (
detailed: true) —tableses un objeto JSON con clave por nombre de tabla; cada valor incluyeschema,kind,owner,comment,columns[],constraints[],indexes[]ytriggers[]de la tabla. Una sola llamada devuelve tanto la lista de tablas como los metadatos por tabla.
listViews
Lista las vistas de una base de datos, paginadas mediante cursor / nextCursor. Disponible en MySQL/MariaDB, PostgreSQL (esquema public) y SQLite. Parámetros: database (usa la base de datos activa por defecto; SQLite no tiene parámetro database), cursor, search, detailed. SQLite solo devuelve la forma breve: search y detailed no se aceptan allí.
search es un patrón LIKE/ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines. El valor de search debe permanecer idéntico entre llamadas paginadas para la continuidad del cursor.
detailed (predeterminado: false) cambia la forma de la respuesta:
- Breve (predeterminado) —
viewses un array JSON ordenado de cadenas con nombres de vista simples. Los nombres de vista son únicos por esquema, por lo que no aparecen duplicados. - Detallado (
detailed: true) —viewses un objeto JSON con clave por nombre de vista simple; cada valor incluye la carga de metadatos específica del backend. PostgreSQL exponeschema,owner,description,definition. MySQL/MariaDB exponeschema,definer,security,checkOption,updatable,characterSetClient,collationConnection,definition. Consulta la referencia delistViewspara conocer las columnas de origen, los conjuntos de valores enumerados y las omisiones intencionadas por backend.
Consulta Paginación por cursor para conocer los detalles de iteración.
listTriggers
Lista los disparadores definidos por el usuario en las tablas, paginados mediante cursor / nextCursor. Se excluyen los disparadores internos de restricciones y claves foráneas. Disponible en MySQL/MariaDB, PostgreSQL (esquema public) y SQLite. Parámetros: database (usa la base de datos activa por defecto; SQLite no tiene parámetro database), cursor, search, detailed.
search es un patrón LIKE/ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines. El valor de search debe permanecer idéntico entre llamadas paginadas para la continuidad del cursor.
detailed (predeterminado: false) cambia la forma de la respuesta:
- Breve (predeterminado) —
triggerses un array JSON ordenado de cadenas con nombres de disparador simples. - Detallado (
detailed: true) —triggerses un objeto JSON con clave por nombre de disparador; cada valor incluye la carga de metadatos específica del backend (momento, eventos, definición y extras específicos del backend comostatus/functionNamede PostgreSQL o los campos de contexto de sesión de MySQL/MariaDB). Consulta la referencia delistTriggerspara ver la lista completa de campos por backend.
Consulta Paginación por cursor para conocer los detalles de iteración.
listFunctions
Lista las funciones SQL definidas por el usuario, paginadas mediante cursor / nextCursor. PostgreSQL excluye agregados, funciones de ventana y procedimientos; MySQL/MariaDB excluye UDF cargables (mysql.func). Disponible en MySQL/MariaDB y PostgreSQL (esquema public). No disponible para SQLite. Parámetros: database (usa la base de datos activa por defecto), cursor, search, detailed.
search es un patrón LIKE/ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines. El valor de search debe permanecer idéntico entre llamadas paginadas para la continuidad del cursor.
detailed (predeterminado: false) cambia la forma de la respuesta:
- Breve (predeterminado) —
functionses un array JSON ordenado de cadenas con nombres de función simples. Las sobrecargas de PostgreSQL aparecen una vez por sobrecarga (se esperan cadenas de nombre duplicadas). - Detallado (
detailed: true) —functionses un objeto JSON con clave por firma de función; cada valor incluye la carga de metadatos específica del backend (lenguaje, argumentos, tipo de retorno, definición y extras específicos del backend comovolatility/strict/parallelSafetyde PostgreSQL o los campos de contexto de sesión de MySQL/MariaDB). Las claves de PostgreSQL sonname(arguments)(las sobrecargas desambiguan); las claves de MySQL/MariaDB son nombres simples (sin sobrecarga). Consulta la referencia delistFunctionspara ver la lista completa de campos por backend.
Consulta Paginación por cursor para conocer los detalles de iteración.
listProcedures
Lista los procedimientos almacenados definidos por el usuario, paginados mediante cursor / nextCursor. Disponible en MySQL/MariaDB y PostgreSQL (esquema public, PostgreSQL 11+). No disponible para SQLite. Parámetros: database (usa la base de datos activa por defecto), cursor, search, detailed.
search es un patrón LIKE/ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines. El valor de search debe permanecer idéntico entre llamadas paginadas para la continuidad del cursor.
detailed (predeterminado: false) cambia la forma de la respuesta:
- Breve (por defecto) —
procedureses un arreglo JSON ordenado de cadenas de nombres de procedimientos simples. Las sobrecargas de PostgreSQL aparecen una vez por sobrecarga (se esperan cadenas de nombres duplicadas). - Detallado (
detailed: true) —procedureses un objeto JSON con claves por firma de procedimiento; cada valor lleva la carga útil de metadatos por backend (lenguaje, argumentos, seguridad, definición y extras específicos del backend comoownerde PostgreSQL o campos dedeterministic/sqlDataAccess/contexto de sesión de MySQL/MariaDB). Las claves de PostgreSQL sonname(arguments)(las sobrecargas desambiguan; los procedimientos sin argumentos se clavean comoname()); las claves de MySQL/MariaDB son nombres simples (sin sobrecarga). Consulte la referencia delistProcedurespara la lista completa de campos por backend.
Ver Paginación por cursor para detalles de iteración.
listMaterializedViews
Lista las vistas materializadas en el esquema public, paginadas mediante cursor / nextCursor. Solo PostgreSQL — no disponible para MySQL/MariaDB o SQLite. Parámetros: database (por defecto, la base de datos activa), cursor, search, detailed.
search es un patrón ILIKE opcional que no distingue entre mayúsculas y minúsculas, con % (cualquier secuencia) y _ (un solo carácter) como comodines. Los metacaracteres SQL (', ;, --) se vinculan como valores de parámetros y nunca se interpolan. El valor de search debe permanecer idéntico entre llamadas paginadas para la continuidad del cursor.
detailed (por defecto false) cambia la forma de la respuesta:
- Breve (por defecto) —
materializedViewses un arreglo JSON ordenado de cadenas de nombres de vistas materializadas simples. Los nombres de vistas materializadas son únicos por esquema, por lo que no aparecen duplicados. - Detallado (
detailed: true) —materializedViewses un objeto JSON con claves por nombre de vista materializada simple; cada valor llevaschema,owner,description(onullcuando no hayCOMMENT ON MATERIALIZED VIEW),definition(el cuerpo SELECT textual depg_matviews.definition),populated(falsepara vistas materializadas creadasWITH NO DATAy nunca actualizadas), yindexed(truecuando existe al menos un índice;REFRESH MATERIALIZED VIEW CONCURRENTLYademás requiere un índice único). El modo detallado omite deliberadamente los metadatos de columnas,tablespace, los parámetros de almacenamiento y la detección de índices únicos — recuperables mediantedefinition,listTables(detailed=true)oreadQuerycontrapg_indexes. Consulte la referencia delistMaterializedViewspara las columnas de origen y la semántica operativa.
Ver Paginación por cursor para detalles de iteración.
readQuery
Ejecuta una consulta SQL de solo lectura (SELECT, SHOW, DESCRIBE, USE, EXPLAIN). Siempre aplica validación SQL como defensa en profundidad. Parámetros: query, database, cursor. Los resultados de SELECT se paginan mediante cursor / nextCursor; SHOW, DESCRIBE, USE y EXPLAIN devuelven una sola página e ignoran cursor. Ver Paginación por cursor para detalles de iteración.
writeQuery
Ejecuta una consulta SQL de escritura (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP). Solo disponible cuando el modo de solo lectura está deshabilitado. Parámetros: query, database.
createDatabase
Crea una base de datos si no existe. Solo disponible cuando el modo de solo lectura está deshabilitado. No disponible para SQLite. Parámetros: database.
dropDatabase
Elimina una base de datos existente. Se niega a eliminar la base de datos actualmente conectada. Solo disponible cuando el modo de solo lectura está deshabilitado. No disponible para SQLite. Parámetros: database.
dropTable
Elimina una tabla de una base de datos. Si la tabla tiene dependientes de clave externa, el error de la base de datos se muestra al usuario. En PostgreSQL, un parámetro cascade está disponible para forzar la eliminación con CASCADE. Solo disponible cuando el modo de solo lectura está deshabilitado. Parámetros: database, table, cascade (solo PostgreSQL).
explainQuery
Devuelve el plan de ejecución para una consulta SQL. Admite un parámetro opcional analyze para estadísticas de ejecución reales (PostgreSQL y MySQL/MariaDB). En modo de solo lectura, EXPLAIN ANALYZE solo se permite para sentencias de solo lectura, ya que realmente ejecuta la consulta. SQLite usa EXPLAIN QUERY PLAN (sin soporte para ANALYZE). Siempre disponible independientemente del modo de solo lectura. Parámetros: query, database, analyze (solo PostgreSQL/MySQL).
Security 🔒
- Modo de solo lectura (por defecto) — las herramientas de escritura están ocultas para el asistente de IA;
readQueryaplica validación SQL basada en AST - Aplicación de una sola sentencia — la inyección de múltiples sentencias se bloquea a nivel de análisis sintáctico
- Bloqueo de funciones peligrosas —
LOAD_FILE(),INTO OUTFILE,INTO DUMPFILEdetectados en el AST - Validación de identificadores — los nombres de bases de datos/tablas se validan contra caracteres de control y cadenas vacías
- Listas permitidas de origen y host — rechazo del lado del servidor (403) más preflight CORS; configurable para transporte HTTP
- SSL/TLS — configurado mediante variables individuales
DB_SSL_* - Redacción de PII (opt-in, desactivado por defecto) — cuando está habilitado, la salida de la herramienta de consulta pasa por un redactor basado en regex que reescribe los tramos de PII detectados en 46 tipos de entidades integrados que abarcan siete categorías: personal (correo electrónico), financiero (tarjetas, IBAN, cuentas bancarias del Reino Unido, códigos de clasificación y de ruta ABA de EE. UU., CVV), identificaciones gubernamentales (SSN, ITIN, EIN, pasaportes del Reino Unido/EE. UU., NHS, NINO, SIN, IVA), contacto (teléfono), red (IP, URL, MAC), identidad digital (claves API, JWT, claves privadas PEM, hashes de contraseñas) y billeteras criptográficas. Alternar:
--pii/PII_ENABLE. Operador:--pii-operator/PII_OPERATOR— uno dereplace(por defecto, marcadores de posición conscientes de entidad como<EMAIL_ADDRESS>),mask(*que preserva la longitud),redact(eliminar),hash(hex SHA-256). Subconjunto opcional mediante--pii-categories/PII_CATEGORIES(separados por comas, p. ej.financial,government); si no se establece, se habilitan todos los integrados. Alcance: solo cargas útiles de salida de la herramienta de consulta. Consulte Configuración de PII para la superficie completa. - Redacción ML/NER (opt-in en tiempo de ejecución, desactivado por defecto) — agrega detección de
PERSON,LOCATION,ORGANIZATION,NATIONALITY_RELIGION_POLITICSyFACILITYque el regex no puede capturar, habilitada mediante la alternancia--pii-ner/PII_NER_ENABLEmás un directorio de modelo proporcionado por el usuario. Qué entidades se producen depende de las etiquetas del modelo (los modelos CoNLL dan persona/ubicación/organización; los modelos de clase OntoNotes agregan NRP e instalación). La inferencia usa ONNX Runtime (el directorio del modelo contieneconfig.json,tokenizer.json,model.onnx; recomendado: eldslim/bert-base-NERcon licencia MIT exportado a ONNX, cuantificado int8 para velocidad). Cierre seguro: un modelo que no se puede cargar aborta el inicio y un error de inferencia falla la solicitud — nunca una alternativa silenciosa. Respeta--pii-categories. Inglés para v1. - Redacción de credenciales — la contraseña de la base de datos nunca se muestra en registros ni salida de depuración
Testing 🧪
# Unit tests
cargo test --workspace --lib --bins
# Integration tests (requires Docker)
./tests/run.sh
# Filter by engine
./tests/run.sh --filter mariadb
./tests/run.sh --filter mysql
./tests/run.sh --filter postgres
./tests/run.sh --filter sqlite
# With MCP Inspector
npx @modelcontextprotocol/inspector ./target/release/dbmcp stdio
# HTTP mode testing
curl -X POST http://localhost:9001/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0.1"}}}'
Project Structure 🗂️
Este es un espacio de trabajo de Cargo con los siguientes crates:
| Crate | Ruta | Descripción |
|---|---|---|
dbmcp | . (raíz) | Binario principal — CLI, transportes, backends de base de datos |
dbmcp-sql | crates/backend/ | Tipos de error compartidos, validación y utilidades de identificadores |
dbmcp-config | crates/config/ | Estructuras de configuración y mapeo de argumentos CLI |
dbmcp-server | crates/server/ | Implementaciones de herramientas MCP compartidas e información del servidor |
dbmcp-mysql | crates/mysql/ | Manejador y operaciones del backend MySQL/MariaDB |
dbmcp-postgres | crates/postgres/ | Manejador y operaciones del backend PostgreSQL |
dbmcp-sqlite | crates/sqlite/ | Manejador y operaciones del backend SQLite |
sqlx-json | crates/sqlx-json/ | Conversión de filas a JSON segura de tipos para sqlx (trait RowExt) |
Development 🧰
cargo build # Development build
cargo build --release # Release build (~7 MB)
cargo test # Run tests
cargo clippy --workspace --tests -- -D warnings # Lint
cargo fmt # Format
cargo doc --no-deps # Build documentation
License 📄
Este proyecto está licenciado bajo la Licencia MIT — consulte el archivo LICENSE para más detalles.