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

npm version License: MIT

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/mesObté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:

  1. "Muéstrame el esquema y cómo se relacionan las tablas" — Devuelve estructuras de tablas, claves foráneas e identifica tablas huérfanas
  2. "¿Hay consultas lentas o índices faltantes?" — Clasifica las consultas lentas por tiempo de ejecución y sugiere índices a agregar
  3. "¿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 ANALYZE está restringido solo a consultas SELECT
  • Las sentencias DDL/DML se rechazan en modo ANALYZE
  • No se permiten consultas de modificación de datos

Contribuciones

  1. Clona el repositorio
  2. npm install
  3. npm run build — Compilación de TypeScript
  4. npm test — Ejecuta pruebas unitarias (vitest)
  5. 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_statements esté instalada y cargada.
  • performance_schema de MySQL: Las estadísticas de uso de índices y escaneos requieren que performance_schema esté 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 schema para 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_ROWS de MySQL en information_schema es 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_connections es solo para PostgreSQL/MySQL. No está disponible para bases de datos SQLite.
  • Análisis de vacuum: analyze_vacuum es solo para PostgreSQL. Para MySQL, usa OPTIMIZE TABLE o analyze_table_bloat.

Parte del MCP Java Backend Suite

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.