MySQL
Integración de base de datos MySQL con controles de acceso configurables e inspección de esquemas.
Documentación
Servidor MCP de MySQL
Una implementación del Protocolo de Contexto de Modelo (MCP) que permite la interacción segura con bases de datos MySQL. Este componente de servidor facilita la comunicación entre aplicaciones de IA (hosts/clientes) y bases de datos MySQL, haciendo la exploración y el análisis de bases de datos más seguros y estructurados a través de una interfaz controlada.
Nota: El Servidor MCP de MySQL admite tanto el modo de entrada/salida estándar (STDIO) como el modo de transporte HTTP Streamable (SSE). El modo SSE se recomienda para implementaciones remotas o autoalojadas.
Opciones de implementación
- Alojado — Fronteir AI ejecuta el servidor por ti; no se requiere configuración local.
- Local — Smithery instala y ejecuta el servidor en tu propia máquina.
Características
- Listar tablas MySQL disponibles como recursos
- Leer el contenido de las tablas
- Ejecutar consultas SQL con manejo adecuado de errores
- Modo multi-base de datos (Opcional
MYSQL_DATABASE) - Soporte de transporte SSE/HTTP (
MCP_TRANSPORT=sse) - Soporte de túneles SSH
- Información completa del esquema
- Muestreo de datos de tablas
- Acceso seguro a la base de datos mediante variables de entorno
- Registro (logging) completo
Instalación
Instalación manual
pip install mysql-mcp-server
Instalación mediante Smithery
Para instalar el Servidor MCP de MySQL para Claude Desktop automáticamente mediante Smithery:
npx -y @smithery/cli install designcomputer/mysql-mcp-server --client claude
Instalación mediante la CLI de Claude Code
claude mcp add --transport stdio designcomputer-mysql_mcp_server uvx mysql_mcp_server
Instalación mediante la CLI de Autohand Code
autohand mcp add mysql env MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_USER=your_username MYSQL_PASSWORD=your_password MYSQL_DATABASE=your_database uvx mysql_mcp_server
Agrega --scope project después de mcp add para mantener el registro en el espacio de trabajo actual. Consulta Autohand Code para obtener detalles actuales de la CLI.
Configuración
Establece las siguientes variables de entorno:
MYSQL_HOST=localhost # Database host
MYSQL_PORT=3306 # Optional: Database port (defaults to 3306 if not specified)
MYSQL_USER=your_username
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=your_database # Optional: Omit for multi-database mode
# Advanced Configuration
MYSQL_SSL_MODE=DISABLED # DISABLED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY
MYSQL_CONNECT_TIMEOUT=10 # Timeout in seconds
# Connection behaviour (Optional)
MYSQL_SQL_MODE=TRADITIONAL # SQL mode applied to the connection (default: TRADITIONAL)
# Compatibility (Optional)
MYSQL_CHARSET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
MYSQL_AUTH_PLUGIN= # e.g., mysql_native_password for older MySQL versions
MYSQL_USE_PURE=false # Force the pure-Python connector (default: false)
MYSQL_RAISE_ON_WARNINGS=false # Raise on SQL warnings (default: false)
# SSE Transport (Optional)
MCP_TRANSPORT=stdio # stdio or sse
MCP_SSE_HOST=0.0.0.0 # Listen on all interfaces (required for Docker/hosting)
PORT=8000 # HTTP port (fallback for MCP_SSE_PORT)
MCP_SSE_ALLOWED_HOSTS= # Comma-separated allowed Host headers (default: localhost:{port},127.0.0.1:{port})
# SSH Tunneling (Optional)
MYSQL_SSH_ENABLE=false # Set to true to enable
MYSQL_SSH_HOST= # SSH jump host
MYSQL_SSH_PORT=22 # SSH port
MYSQL_SSH_USER= # SSH username
MYSQL_SSH_KEY_PATH= # Path to SSH private key
MYSQL_SSH_REMOTE_HOST=localhost # Host from the perspective of the jump host
MYSQL_SSH_REMOTE_PORT=3306
MYSQL_LOCAL_PORT=3330
Carga del archivo .env
Al iniciar, el servidor carga automáticamente un archivo .env mediante python-dotenv, por lo que para uso local simplemente puedes:
cp .env.example .env # then edit with your credentials
El archivo se lee desde el directorio de trabajo del proceso (y directorios padre), lo que funciona cuando ejecutas el servidor tú mismo desde la carpeta del proyecto.
⚠️ Claude Code / Claude Desktop: estos hosts inician el servidor desde su propio directorio de trabajo, por lo que el
.envdel proyecto no se encontrará y verásMissing required database configuration. Coloca tus valores deMYSQL_*en el bloqueenvde la configuración MCP (que se muestra en la sección de Uso a continuación) en lugar de depender de.env.
Modo multi-base de datos
Cuando MYSQL_DATABASE no está configurado, el servidor opera en modo multi-base de datos:
list_resourcesdevuelve todas las bases de datos de usuario (las bases de datos del sistema se filtran)- Usa nombres de tabla completamente calificados como
mydb.mytableen consultas SQL - Nota: Solo se admiten sentencias SQL individuales. No se admiten consultas de múltiples sentencias (por ejemplo,
USE db; SELECT ...).
Herramientas disponibles
execute_sql
Ejecuta cualquier consulta SQL estándar.
- Argumentos:
query(cadena) - Características: Admite
SELECT,SHOW,DESCRIBEy DML (INSERT,UPDATE,DELETE). Las operaciones DML se marcan con una advertencia de destructividad. - Limitación: Solo sentencias individuales. No se admiten consultas de múltiples sentencias.
- Entre bases de datos: Usa la notación
database.tablepara consultar cualquier base de datos independientemente de la configuración deMYSQL_DATABASE.
get_schema_info
Proporciona metadatos detallados sobre las estructuras de la base de datos.
- Argumentos:
table_name(cadena opcional) - Salida: Nombres de columnas, tipos, nulabilidad, valores predeterminados y comentarios.
- Entre bases de datos: Pasa
database.tablepara consultar una tabla fuera deMYSQL_DATABASE; los nombres simples usan la base de datos configurada. - Reglas de identificadores: Los nombres deben contener solo caracteres alfanuméricos, guiones bajos y
$(se permiten puntos como separador entre nombres de base de datos y tabla).
get_table_sample
Obtiene una muestra representativa de datos.
- Argumentos:
table_name(cadena),limit(entero opcional, máximo 20) - Caso de uso: Comprender rápidamente los formatos y el contenido de los datos sin recuperar conjuntos de resultados grandes.
- Entre bases de datos: Pasa
database.tablepara muestrear una tabla fuera deMYSQL_DATABASE; los nombres simples usan la base de datos configurada. - Reglas de identificadores: Los nombres deben contener solo caracteres alfanuméricos, guiones bajos y
$(se permiten puntos como separador entre nombres de base de datos y tabla).
Prompts disponibles
Además de las herramientas, el servidor expone prompts MCP — flujos de trabajo guiados de múltiples pasos que un cliente puede lanzar bajo demanda. En Claude Code aparecen como comandos de barra (/mcp__<server>__<prompt>); en Claude Desktop aparecen en el menú de prompts (+).
| Prompt | Argumentos | Descripción |
|---|---|---|
explore_database | (ninguno) | Explorar sistemáticamente la base de datos: descubrir tablas disponibles, inspeccionar sus esquemas, muestrear los datos y resumir lo que hay. |
analyze_table | table_name (obligatorio) | Análisis profundo de una tabla específica: recuperar su esquema, muestrear sus datos y sugerir consultas útiles. Acepta la notación database.table para búsquedas entre bases de datos. |
Ejemplo (Claude Code):
/mcp__mysql__explore_database
/mcp__mysql__analyze_table customers
Ambos prompts orquestan las herramientas existentes get_schema_info y get_table_sample; explore_database también utiliza el listado de recursos para enumerar tablas.
Uso
Con Claude Desktop
Agrega esto a tu claude_desktop_config.json:
{
"mcpServers": {
"mysql": {
"command": "uv",
"args": [
"--directory",
"path/to/mysql_mcp_server",
"run",
"mysql_mcp_server"
],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "your_username",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}
Para ejemplos más detallados y orientación específica para agentes, consulta MCP_USECASES.md.
Con Visual Studio Code
Agrega esto a tu mcp.json:
{
"mcpServers": {
"mysql": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"mysql-mcp-server",
"mysql_mcp_server"
],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "your_username",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DATABASE": "your_database"
}
}
}
}
Nota: Será necesario instalar uv para que esto funcione
Depuración con MCP Inspector
Aunque el Servidor MCP de MySQL no está diseñado para ejecutarse de forma independiente o directamente desde la línea de comandos con Python, puedes usar MCP Inspector para depurarlo.
MCP Inspector proporciona una forma conveniente de probar y depurar tu implementación MCP:
# Install dependencies
pip install -r requirements.txt
# Use the MCP Inspector for debugging (do not run directly with Python)
El Servidor MCP de MySQL está diseñado para integrarse con aplicaciones de IA como Claude Desktop y no debe ejecutarse directamente como un programa Python independiente.
Desarrollo
# Clone the repository
git clone https://github.com/designcomputer/mysql_mcp_server.git
cd mysql_mcp_server
# Create virtual environment
python -m venv venv
source venv/bin/activate # or `venv\Scripts\activate` on Windows
# Install development dependencies
pip install -r requirements-dev.txt
# Copy the example config and edit with your credentials
cp .env.example .env
# Edit .env with your MySQL connection details
# Run tests
pytest
Consideraciones de seguridad
-
Validación de identificadores: Los nombres de tablas y bases de datos pasados a
get_schema_infoyget_table_samplese validan contra una lista blanca estricta (solo alfanuméricos, guiones bajos y$; se permite un solo punto como separador dedatabase.table). Otros caracteres especiales se rechazan para prevenir la inyección SQL. -
Acceso cifrado: Soporte completo para SSL/TLS y túneles SSH para conexiones remotas seguras.
-
Privacidad de registros: Las contraseñas y claves privadas SSH se enmascaran automáticamente en los registros del servidor.
-
Mínimo privilegio: Usa siempre un usuario MySQL dedicado con los permisos mínimos requeridos.
-
El transporte SSE no tiene autenticación incorporada. El servidor SSE se vincula a
0.0.0.0de forma predeterminada y acepta conexiones sin credenciales. Si lo expones más allá de localhost, colócalo detrás de un proxy inverso (nginx, Caddy, Traefik) que aplique autenticación. Ejemplo con nginx y autenticación básica HTTP:location /sse { auth_basic "MCP"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_buffering off; } location /messages/ { auth_basic "MCP"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; }Establece
MCP_SSE_HOST=127.0.0.1para que el servidor solo escuche en loopback y el proxy sea el único punto de entrada público. EstableceMCP_SSE_ALLOWED_HOSTSal nombre de host público al que tu proxy reenvía (por ejemplo,MCP_SSE_ALLOWED_HOSTS=myserver.example.com:443).
Consulta SECURITY.md para obtener una guía completa sobre cómo asegurar tu implementación.
Mejores prácticas de seguridad
Esta implementación MCP requiere acceso a la base de datos para funcionar. Por seguridad:
- Crea un usuario MySQL dedicado con permisos mínimos
- Nunca uses credenciales de root ni cuentas administrativas
- Restringe el acceso a la base de datos solo a las operaciones necesarias
- Habilita el registro con fines de auditoría
- Revisiones de seguridad periódicas del acceso a la base de datos
Consulta la Guía de configuración de seguridad de MySQL para obtener instrucciones detalladas sobre:
- Crear un usuario MySQL restringido
- Establecer permisos apropiados
- Monitorear el acceso a la base de datos
- Mejores prácticas de seguridad
⚠️ IMPORTANTE: Sigue siempre el principio de mínimo privilegio al configurar el acceso a la base de datos.
Licencia
Licencia MIT: consulta el archivo LICENSE para obtener detalles.
Contribuciones
- Haz un fork del repositorio
- Crea tu rama de características (
git checkout -b feature/amazing-feature) - Realiza tus cambios (
git commit -m 'Add some amazing feature') - Envía los cambios a la rama (
git push origin feature/amazing-feature) - Abre una Solicitud de Extracción (Pull Request)