Skip to main content
Glama
mcp-mysql-database

mcp-mysql-database

by Esaban17

mcp-mysql-database

Servidor MCP que conecta Claude con bases de datos MySQL locales. Pídele a Claude en lenguaje natural que cree bases de datos y tablas, inserte, consulte, actualice o borre registros, y elige a qué conexión (dev, test, …) apuntar. MySQL corre en contenedores Docker.

"Crea una base de datos tienda con una tabla productos (nombre, precio, stock) e inserta 3 productos de ejemplo." "Cámbiate a la conexión test y muéstrame los pedidos de mayo."

Claude traduce tu petición a llamadas a las herramientas de este servidor; el servidor construye el SQL de forma segura (identificadores validados, valores siempre parametrizados).

Inicio rápido

# 1. MySQL en Docker: dos instancias (dev en :3306, test en :3307)
cp .env.example .env            # opcional: cambia contraseñas/puertos
npm run db:up

# 2. Servidor MCP
npm install
npm run build

Conectarlo a Claude

Claude Code — este repo incluye .mcp.json; abre Claude Code en esta carpeta y aprueba el servidor mysql. O bien:

claude mcp add mysql -- node /ruta/absoluta/mcp-mysql-database/dist/index.js

Claude Desktop — en claude_desktop_config.json:

{
  "mcpServers": {
    "mysql": { "command": "node", "args": ["/ruta/absoluta/mcp-mysql-database/dist/index.js"] }
  }
}

Related MCP server: MCP MySQL Server

Conexiones

Sin configuración, el servidor usa las dos bases de docker-compose.yml (dev → 3306, test → 3307). Para definir las tuyas, copia connections.example.json a connections.json (ignorado por git) o apunta MYSQL_MCP_CONFIG a otro archivo:

{
  "default": "dev",
  "connections": {
    "dev":  { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "devpassword", "database": "appdb" },
    "prod": { "host": "db.ejemplo.com", "user": "lector", "passwordEnv": "MYSQL_PROD_PASSWORD", "readOnly": true }
  }
}
  • passwordEnv: lee la contraseña de una variable de entorno (mejor que escribirla en el archivo).

  • readOnly: true: la conexión rechaza cualquier escritura.

  • Alternativa mínima: variables MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE.

Herramientas

Grupo

Herramienta

Qué hace

Conexiones

list_connections, current_connection, select_connection, add_connection, remove_connection

Ver y cambiar la conexión activa; registrar conexiones temporales

Bases de datos

list_databases, create_database, use_database, drop_database

Gestionar bases y elegir la actual

Tablas

list_tables, describe_table, create_table, drop_table

Esquema (columnas, PK, índices, FK)

Registros

insert_records, select_records, update_records, delete_records

CRUD con filtros estructurados

SQL libre

run_query (solo lectura), execute_sql (escritura/DDL)

Joins, agregaciones, ALTER, etc.

Todas las herramientas de datos aceptan un database opcional para no depender de la base actual.

Seguridad

  • Identificadores (tabla, columna, …) validados con ^[A-Za-z0-9_$]{1,64}$ y entrecomillados; los valores van siempre como parámetros.

  • drop_database, drop_table y DROP/TRUNCATE vía execute_sql exigen confirm: true (Claude debe confirmarlo contigo).

  • update_records y delete_records exigen un where no vacío.

  • run_query solo admite SELECT/SHOW/DESCRIBE/EXPLAIN/WITH y corre en una transacción READ ONLY con ROLLBACK.

  • Una sola sentencia por llamada (sin multipleStatements); máximo 1000 filas por consulta.

  • Las credenciales de docker-compose.yml son solo para desarrollo local; los puertos se publican en el host, no los expongas a internet.

Desarrollo

npm run build      # compila TypeScript a dist/
npm test           # prueba e2e: lanza el servidor por stdio con un cliente MCP real
npm run db:down    # detiene los contenedores (los datos persisten en volúmenes)

npm test necesita MySQL en 3306 y 3307 (npm run db:up); si no están accesibles, las pruebas se omiten.

Available Tools

19 tools
add_connectionB

Registra una conexión nueva solo para esta sesión (no se guarda en disco). Opcionalmente la activa.

Inputs: host (required), name (required), user (required), ssl, +5 more.

create_databaseC

Crea una base de datos. Opcionalmente la selecciona como base actual.

Inputs: name (required), use, charset, collation, +1 more.

create_tableC

Crea una tabla a partir de una definición estructurada de columnas, índices y claves foráneas.

Inputs: table (required), columns (required), engine, indexes, +4 more.

current_connectionA
Read-only

Muestra la conexión activa, su base de datos actual y si es de solo lectura.

Inputs: no named parameters.

delete_recordsB
Destructive

Borra registros que cumplan where (obligatorio y no vacío).

Inputs: table (required), where (required), database.

describe_tableB
Read-only

Muestra columnas, índices y el CREATE TABLE de una tabla.

Inputs: table (required), database.

drop_databaseA
Destructive

ELIMINA una base de datos completa. Irreversible: requiere confirm=true; pide confirmación al usuario antes.

Inputs: name (required), confirm (required).

drop_tableA
Destructive

ELIMINA una tabla y sus datos. Irreversible: requiere confirm=true; pide confirmación al usuario antes.

Inputs: table (required), confirm (required), database.

execute_sqlA
Destructive

Ejecuta una sentencia SQL única que modifica datos o esquema (ALTER, UPDATE masivo, CREATE INDEX, etc.). DROP y TRUNCATE requieren confirm=true. No disponible en conexiones readOnly.

Inputs: sql (required), params, confirm, database.

insert_recordsC

Inserta uno o varios registros en una tabla (consulta parametrizada). Cada registro es un objeto columna -> valor.

Inputs: table (required), records (required), database, ignoreDuplicates.

list_connectionsA
Read-only

Lista las conexiones MySQL configuradas y cuál está activa.

Inputs: no named parameters.

list_databasesA
Read-only

Lista las bases de datos del servidor de la conexión activa.

Inputs: no named parameters.

list_tablesB
Read-only

Lista las tablas de la base de datos actual (o de database).

Inputs: database.

remove_connectionB
Destructive

Elimina una conexión registrada en esta sesión (no puede ser la activa).

Inputs: name (required).

run_queryA
Read-only

Ejecuta una consulta SQL de SOLO LECTURA (SELECT/SHOW/DESCRIBE/EXPLAIN/WITH) dentro de una transacción READ ONLY. Máx. 1000 filas devueltas. Usa ? y params para valores.

Inputs: sql (required), params, database.

select_connectionA

Cambia la conexión activa (p. ej. 'dev' o 'test'). Todas las demás herramientas usan la conexión activa. Verifica que el servidor responde.

Inputs: name (required).

select_recordsA
Read-only

Consulta registros de una tabla con filtros simples (igualdad / IN / IS NULL), orden y paginación. Para joins o agregaciones usa run_query.

Inputs: table (required), limit, where, offset, +3 more.

update_recordsC

Actualiza registros que cumplan where (obligatorio y no vacío).

Inputs: set (required), table (required), where (required), database.

use_databaseC

Selecciona la base de datos actual de la conexión activa.

Inputs: name (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 19 tools

    Disambiguation4/5

    Each tool targets a distinct resource/action, and descriptions explicitly redirect overlaps (select_records points to run_query for joins; execute_sql notes it handles mass UPDATE/DELETE that update_records/delete_records also do). The execute_sql vs update_records/delete_records boundary and select_records vs run_query boundary are the only mild overlaps, but descriptions disambiguate well.

    Naming Consistency4/5

    Nearly all tools follow a consistent snake_case verb_noun pattern (list_connections, create_database, drop_table, insert_records, run_query, execute_sql). The single deviation is current_connection, a noun-only name, which is a minor inconsistency in an otherwise predictable scheme.

    Tool Count4/5

    19 tools is on the heavier side but each maps to a genuine operation across the connection, database, table, and record layers. The count is justified by the broad scope rather than redundant tooling, though it sits at the upper borderline.

    Completeness5/5

    Full lifecycle coverage: connections (list/current/select/add/remove), databases (list/create/use/drop), tables (list/describe/create/drop), records (full insert/select/update/delete CRUD), plus read-only run_query and write execute_sql for anything else. Schema alteration and advanced queries are handled via execute_sql/run_query, leaving no dead ends.

    Maintenance

    ActivitySlowing
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude Desktop to interact with MySQL databases through secure query execution, schema discovery, and multi-database support with configurable read/write permissions and built-in SQL injection protection.
      81 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables natural language querying of MySQL databases via Claude Code, allowing SELECT queries, table listing, and schema inspection.
      896 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude to interact with a MySQL database by automatically discovering its schema and retrieving full table data for analysis.
      ISC