MCP DB Analyzer
Servidor MCP de análisis multibase de datos (PostgreSQL, MySQL, SQLite). Inspecciona esquemas, detecta problemas de índices, analiza la hinchazón de tablas y explica planes de consulta para una optimización práctica de bases de datos.
Documentación
MCP DB Analyzer
Un servidor de Model Context Protocol (MCP) que brinda a los asistentes de IA visibilidad profunda en tus bases de datos. Inspecciona esquemas, detecta problemas de índices, analiza la fragmentación/crecimiento de tablas y explica planes de consulta, para que tu IA pueda darte consejos accionables de optimización de bases de datos en lugar de sugerencias genéricas.
Soporta PostgreSQL, MySQL y SQLite.
¿Por qué esta herramienta?
Existen docenas de servidores MCP de bases de datos; la mayoría son puertas de enlace CRUD (ejecutan consultas, listan tablas). Esta herramienta analiza tu base de datos: problemas de esquema, índices faltantes, tablas infladas, consultas lentas, salud de vacuum.
Otros servidores MCP analíticos (CrystalDBA, pg-dash, MCP-PostgreSQL-Ops) solo cubren PostgreSQL. MCP DB Analyzer es el único servidor MCP analítico que soporta PostgreSQL, MySQL y SQLite en una sola instalación de npx — sin Python, sin Go, sin Docker.
Características
- 9 herramientas MCP para análisis integral de bases de datos
- Soporte PostgreSQL + MySQL + SQLite mediante la bandera
--driver - Solo lectura por diseño — todas las consultas están envueltas en transacciones READ ONLY
- Salida en Markdown optimizada para consumo por LLM
- Cero configuración — solo establece
DATABASE_URL
Nivel Pro
Genera informes de diagnóstico exportables (HTML + PDF) con una clave de licencia Pro.
- Informe completo de análisis de volcado de hilos JVM con recomendaciones accionables
- Exportación a PDF para compartir con tu equipo
- Soporte prioritario
$9.00/mes — Obtén la Licencia Pro
La clave de licencia Pro activa la herramienta MCP generate_report en mcp-jvm-diagnostics.
Instalación
npx mcp-db-analyzer
O instala globalmente:
npm install -g mcp-db-analyzer
Configuración
Establece la variable de entorno DATABASE_URL:
export DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
O usa variables PG individuales: PGHOST, PGPORT, PGDATABASE, PGUSER, PGPASSWORD.
MySQL
Establece DATABASE_URL con una cadena de conexión MySQL y pasa --driver mysql:
export DATABASE_URL="mysql://user:password@localhost:3306/mydb"
mcp-db-analyzer --driver mysql
O usa variables MySQL individuales: MYSQL_HOST, MYSQL_PORT, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD.
También puedes establecer DB_DRIVER=mysql como variable de entorno en lugar de pasar la bandera.
SQLite
Pasa una ruta de archivo mediante DATABASE_URL y usa --driver sqlite:
export DATABASE_URL="/path/to/database.db"
mcp-db-analyzer --driver sqlite
Claude Desktop (PostgreSQL)
Agrega a ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"db-analyzer": {
"command": "npx",
"args": ["-y", "mcp-db-analyzer"],
"env": {
"DATABASE_URL": "postgresql://user:password@localhost:5432/mydb"
}
}
}
}
Claude Desktop (MySQL)
{
"mcpServers": {
"db-analyzer": {
"command": "npx",
"args": ["-y", "mcp-db-analyzer", "--driver", "mysql"],
"env": {
"DATABASE_URL": "mysql://user:password@localhost:3306/mydb"
}
}
}
}
Claude Desktop (SQLite)
{
"mcpServers": {
"db-analyzer": {
"command": "npx",
"args": ["-y", "mcp-db-analyzer", "--driver", "sqlite"],
"env": {
"DATABASE_URL": "/path/to/database.db"
}
}
}
}
Demostración rápida
Una vez configurado, prueba estos mensajes en Claude:
- "Muéstrame el esquema y cómo se relacionan las tablas" — Devuelve estructuras de tablas, claves foráneas e identifica tablas huérfanas
- "¿Hay consultas lentas o índices faltantes?" — Clasifica las consultas lentas por tiempo de ejecución y sugiere índices a agregar
- "¿Cuántas conexiones están activas? ¿Hay consultas bloqueadas?" — Muestra la utilización del pool de conexiones, sesiones inactivas en transacción y consultas bloqueadas
Herramientas
inspect_schema
Lista todas las tablas con conteos de filas y tamaños, o profundiza en las columnas, tipos, restricciones y claves foráneas de una tabla específica.
Parámetros:
table(opcional) — Nombre de la tabla a inspeccionar. Omítelo para listar todas las tablas.schema(predeterminado:"public") — Esquema de la base de datos.
> inspect_schema
## Tables in schema 'public'
| Table | Rows (est.) | Total Size |
|-------------|-------------|------------|
| users | 12,450 | 3.2 MB |
| orders | 89,100 | 18.4 MB |
| order_items | 245,000 | 12.1 MB |
> inspect_schema table="users"
## Table: public.users
- **Rows (est.)**: 12,450
- **Total size**: 3.2 MB
### Columns
| # | Column | Type | Nullable | Default |
|---|--------|---------------|----------|---------|
| 1 | id | integer | NO | nextval |
| 2 | email | varchar(255) | NO | - |
| 3 | name | varchar(100) | YES | - |
analyze_indexes
Encuentra índices no utilizados que desperdician espacio en disco e índices faltantes que causan escaneos secuenciales lentos. También detecta claves foráneas sin indexar.
Parámetros:
schema(predeterminado:"public") — Esquema de la base de datos.mode("usage"|"missing"|"all", predeterminado:"all") — Modo de análisis.
> analyze_indexes
### Unused Indexes (2 found)
| Table | Index | Size | Definition |
|-------|--------------------|--------|-------------------------------|
| users | idx_users_legacy | 1.2 MB | CREATE INDEX ... (old_col) |
### Unindexed Foreign Keys (1 found)
| Table | Column | FK → | Constraint |
|-------------|---------|--------|-------------------|
| order_items | user_id | users | fk_items_user_id |
explain_query
Ejecuta EXPLAIN en una consulta SQL y obtén un plan de ejecución formateado con estimaciones de costo, tipos de nodo y advertencias de optimización. Opcionalmente, ejecuta EXPLAIN ANALYZE para tiempos reales (solo consultas SELECT).
Parámetros:
sql— La consulta SQL a explicar.analyze(predeterminado:false) — Ejecutar EXPLAIN ANALYZE (ejecuta la consulta; solo SELECT).
> explain_query sql="SELECT * FROM orders WHERE status = 'pending'"
## Query Plan Analysis
- **Estimated Total Cost**: 1234.56
- **Estimated Rows**: 500
### Plan Tree
→ Seq Scan on orders (cost=0..1234.56 rows=500)
Filter: (status = 'pending')
### Potential Issues
- **Sequential Scan** on `orders` (~500 rows). Consider adding an index.
analyze_table_bloat
Analiza el crecimiento de tablas verificando proporciones de tuplas muertas, historial de vacuum y tamaños de tablas. Recomienda VACUUM ANALYZE para tablas con más del 10% de tuplas muertas.
Parámetros:
schema(predeterminado:"public") — Esquema de la base de datos.
> analyze_table_bloat
### Tables Needing VACUUM (1 found)
| Table | Live Tuples | Dead Tuples | Bloat % | Size | Last Vacuum |
|-----------|-------------|-------------|---------|-------|-------------|
| audit_log | 8,000 | 2,000 | 20.0% | 10 MB | Never |
### Recommended Actions
VACUUM ANALYZE public.audit_log;
suggest_missing_indexes
Encuentra tablas con altos conteos de escaneos secuenciales y uso de índice cero, cruzando referencias con índices no utilizados que desperdician espacio. Proporciona recomendaciones accionables de CREATE INDEX y DROP INDEX.
Parámetros:
schema(predeterminado:"public") — Esquema de la base de datos.
> suggest_missing_indexes
### Tables Missing Indexes (1 found)
| Table | Seq Scans | Index Scans | Rows | Size |
|--------|-----------|-------------|--------|-------|
| events | 5,000 | 0 | 50,000 | 25 MB |
### Unused Indexes (1 found)
| Table | Index | Size | Definition |
|-------|------------------|------|----------------------------------|
| users | idx_users_legacy | 8 kB | CREATE INDEX ... (legacy_col) |
DROP INDEX public.idx_users_legacy;
analyze_slow_queries
Encuentra las consultas más lentas usando pg_stat_statements (PostgreSQL) o performance_schema (MySQL). Muestra tiempos de ejecución, conteos de llamadas e identifica candidatos de optimización.
Parámetros:
schema(predeterminado:"public") — Esquema de la base de datos.limit(predeterminado:10) — Número de consultas lentas a devolver.
> analyze_slow_queries
## Slow Query Analysis (by avg execution time)
| # | Avg Time | Total Time | Calls | Avg Rows | Query |
|---|----------|------------|-------|----------|-------|
| 1 | 150.0ms | 750000ms | 5000 | 5 | `SELECT * FROM orders WHERE status = $1` |
| 2 | 200.0ms | 40000ms | 200 | 2 | `SELECT u.* FROM users u JOIN orders o...` |
### Recommendations
- **2 high-impact queries** — called >100 times with >100ms avg
- **2 queries returning few rows but slow** — likely missing indexes
analyze_connections
Analiza las conexiones activas de la base de datos. Detecta sesiones inactivas en transacción, consultas de larga duración, contención de bloqueos y utilización del pool de conexiones. Solo PostgreSQL y MySQL.
> analyze_connections
## Connection Analysis (PostgreSQL)
### Connection States
| State | Count |
|-------|-------|
| active | 3 |
| idle | 12 |
| idle in transaction | 2 |
| **Total** | **17** |
**Max connections**: 100
**Utilization**: 17.0%
### Idle-in-Transaction Connections
| PID | User | Duration | Query |
|------|------|----------|-------|
| 1234 | app | 00:05:30 | UPDATE orders SET status = $1 |
analyze_table_relationships
Analiza las relaciones de claves foráneas entre tablas. Construye un grafo de dependencias que muestra la conectividad de entidades, tablas huérfanas (sin FKs), cadenas de borrado en cascada y entidades centrales.
Parámetros:
schema(predeterminado:"public") — Esquema de la base de datos.
> analyze_table_relationships
## Table Relationships
**Tables**: 5
**Foreign Keys**: 4
### Entity Connectivity
| Table | Incoming FKs | Outgoing FKs | Total |
|-------|-------------|-------------|-------|
| users **hub** | 5 | 0 | 5 |
| orders | 1 | 2 | 3 |
### Orphan Tables (no FK relationships)
- `audit_log`
### Cascading Delete Chains
- **users** → cascades to: orders, addresses
- **orders** → further cascades to: order_items
analyze_vacuum
Analiza el estado de mantenimiento VACUUM de PostgreSQL. Verifica proporciones de tuplas muertas, antigüedad del vacuum, configuración de autovacuum e identifica tablas que necesitan VACUUM manual. Solo PostgreSQL.
> analyze_vacuum
Detecta:
- Tablas con altas proporciones de tuplas muertas (>10% advertencia, >20% crítico)
- Tablas nunca vaciadas o analizadas
- Autovacuum deshabilitado globalmente
- Problemas de configuración de autovacuum
La salida incluye:
- Hallazgos agrupados por severidad (CRÍTICO / ADVERTENCIA / INFO)
- Tablas que necesitan VACUUM con porcentajes de tuplas muertas
- Historial completo de vacuum por tabla
- Configuración de autovacuum
Seguridad
- Todas las consultas están envueltas en transacciones READ ONLY por defecto
EXPLAIN ANALYZEestá restringido solo a consultasSELECT- Las sentencias DDL/DML se rechazan en modo ANALYZE
- No se permiten consultas de modificación de datos
Contribuciones
- Clona el repositorio
npm installnpm run build— Compilación de TypeScriptnpm test— Ejecuta pruebas unitarias (vitest)npm run dev— Modo de observación para desarrollo
Limitaciones y problemas conocidos
- Solo lectura: Todas las consultas usan conexiones de solo lectura. No se pueden modificar datos ni esquemas.
- pg_stat_statements requerido: El análisis de consultas lentas en PostgreSQL requiere que la extensión
pg_stat_statementsesté instalada y cargada. - performance_schema de MySQL: Las estadísticas de uso de índices y escaneos requieren que
performance_schemaesté habilitado (desactivado por defecto en algunas instalaciones de MySQL). - SQLite: No hay estadísticas de uso de índices disponibles (SQLite no rastrea esto). El análisis de escaneos secuenciales y la detección de consultas lentas no son compatibles con SQLite.
- Bases de datos grandes: La inspección de esquemas en bases de datos con más de 500 tablas puede producir una salida muy larga. Usa el parámetro
schemapara limitar el alcance. - Parametrización de nombres de tablas: Las sentencias PRAGMA de SQLite usan interpolación de cadenas para nombres de tablas (SQLite no admite PRAGMAs parametrizados). Los nombres de tablas provienen de la tabla del sistema
sqlite_master. - Consultas entre bases de datos: No se pueden analizar consultas que abarquen múltiples bases de datos o que usen enlaces de bases de datos.
- Conteos de filas estimados:
TABLE_ROWSde MySQL eninformation_schemaes una estimación, no exacta. - Alcance del esquema: Todas las herramientas usan por defecto el esquema
public. Los esquemas no públicos requieren especificación explícita. El análisis de múltiples esquemas requiere ejecutar las herramientas por esquema por separado. - Análisis de conexiones:
analyze_connectionses solo para PostgreSQL/MySQL. No está disponible para bases de datos SQLite. - Análisis de vacuum:
analyze_vacuumes solo para PostgreSQL. Para MySQL, usaOPTIMIZE TABLEoanalyze_table_bloat.
Parte del MCP Java Backend Suite
- mcp-spring-boot-actuator — Análisis de salud, métricas y beans de Spring Boot
- mcp-jvm-diagnostics — Análisis de volcados de hilos y registros GC
- mcp-redis-diagnostics — Diagnósticos de memoria, slowlog y clientes de Redis
- mcp-migration-advisor — Análisis de riesgo de migraciones Flyway/Liquibase
Licencia
MIT
Fin de vida útil: 2026-05-10.
Este servidor MCP ya no se mantiene ni se distribuye. La Corporación
ha cambiado a los actores del marketplace de Apify. Consulta
irrationalways en Apify y
irrcorp/bzp-poland-tenders para el trabajo actual de la Corporación.
El paquete npm ha sido despublicado. El repositorio está archivado solo como referencia histórica.