MCP-PostgreSQL-Ops
MCP-PostgreSQL-Ops es un servidor MCP profesional para operaciones, monitoreo y gestión de bases de datos PostgreSQL. Compatible con PostgreSQL 12-17, ofrece análisis completo de bases de datos, monitoreo de rendimiento y recomendaciones inteligentes de mantenimiento mediante consultas en lenguaje natural.
Documentación
Servidor MCP para Operaciones y Monitoreo de PostgreSQL
Arquitectura e Internos (DeepWiki)
Resumen
MCP-PostgreSQL-Ops es un servidor MCP profesional para operaciones, monitoreo y gestión de bases de datos PostgreSQL. Soporta PostgreSQL 12-18 con análisis integral de bases de datos, monitoreo de rendimiento y recomendaciones inteligentes de mantenimiento mediante consultas en lenguaje natural. La mayoría de las funciones funcionan de forma independiente, pero las capacidades avanzadas de análisis de consultas se mejoran cuando las extensiones pg_stat_statements y (opcionalmente) pg_stat_monitor están instaladas.
Características
- ✅ Configuración Cero: Funciona con PostgreSQL 12-18 de fábrica con detección automática de versiones.
- ✅ Lenguaje Natural: Haga preguntas como "Muéstrame consultas lentas" o "Analiza la fragmentación de tablas".
- ✅ Seguro para Producción: Operaciones de solo lectura, compatible con RDS/Aurora con permisos de usuario regulares.
- ✅ Mejorado con Extensiones:
pg_stat_statementsypg_stat_monitoropcionales para análisis avanzados de consultas. - ✅ Monitoreo Integral de Bases de Datos: Análisis de rendimiento, detección de fragmentación y recomendaciones de mantenimiento.
- ✅ Análisis Inteligente de Consultas: Identificación de consultas lentas con integración de
pg_stat_statementsypg_stat_monitor. - ✅ Descubrimiento de Esquemas y Relaciones: Exploración de la estructura de la base de datos con mapeo detallado de relaciones.
- ✅ Inteligencia de VACUUM y Autovacuum: Monitoreo de mantenimiento en tiempo real y análisis de efectividad.
- ✅ Operaciones Multi-Base de Datos: Análisis y monitoreo fluido entre bases de datos.
- ✅ Listo para Empresas: Operaciones seguras de solo lectura con compatibilidad con RDS/Aurora.
- ✅ Amigable para Desarrolladores: Código base simple para fácil personalización y extensión de herramientas.
🔧 Capacidades Avanzadas
- Estadísticas de E/S conscientes de la versión (mejoradas en PostgreSQL 16+, columnas de bytes en PG 18+).
- Monitoreo de conexiones y bloqueos en tiempo real.
- Análisis de procesos en segundo plano y puntos de control.
- Estado de replicación y monitoreo de WAL.
- Análisis de capacidad y fragmentación de bases de datos.
- Catálogo de eventos de espera con descripciones (PG 17+).
- Monitoreo del resumidor de WAL para copias de seguridad incrementales (PG 17+).
- Monitoreo del subsistema de E/S asíncrono (PG 18+).
- Estadísticas de E/S y WAL por backend (PG 18+).
Ejemplos de Uso de Herramientas
📸 Más Ejemplos con Capturas de Pantalla →


⭐ Inicio Rápido (5 minutos)
Nota: El contenedor
postgresqlincluido endocker-compose.ymlestá destinado únicamente para pruebas de inicio rápido. Puede conectarse a su propia instancia de PostgreSQL ajustando las variables de entorno según sea necesario.
Si desea usar su propia instancia de PostgreSQL en lugar del contenedor de prueba integrado:
- Actualice la información de conexión de PostgreSQL de destino en su archivo
.env(consulte POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB).- En
docker-compose.yml, comente (deshabilite) los contenedorespostgresypostgres-init-extensionspara evitar iniciar la base de datos de prueba integrada.
Diagrama de Flujo del Inicio Rápido/Tutorial

1. Configuración del Entorno
Nota: Si bien los privilegios de superusuario brindan acceso a todas las bases de datos e información del sistema, el servidor MCP también funciona con permisos de usuario regular para tareas básicas de monitoreo.
git clone https://github.com/call518/MCP-PostgreSQL-Ops.git
cd MCP-PostgreSQL-Ops
### Check and modify .env file
cp .env.example .env
vim .env
### No need to modify defaults, but if using your own PostgreSQL server, edit below:
POSTGRES_HOST=host.docker.internal
POSTGRES_PORT=15432 # External port for host access (mapped to internal 5432)
POSTGRES_USER=postgres
POSTGRES_PASSWORD=changeme!@34
POSTGRES_DB=ecommerce # Default connection DB. Superusers can access all DBs.
Nota:
PGDATA=/data/dbestá preconfigurado para la imagen Docker de Percona PostgreSQL, que requiere esta ruta específica para permisos de escritura adecuados.
2. Iniciar Contenedores de Demostración
# Start all containers including built-in PostgreSQL for testing
docker-compose up -d
# Alternative: If using your own PostgreSQL instance
# Comment out postgres and postgres-init-extensions services in docker-compose.yml
# Then use the custom configuration:
# docker-compose -f docker-compose.custom-db.yml up -d
⏰ Espere la Configuración del Entorno: La configuración inicial del entorno toma unos minutos ya que los contenedores se inician en secuencia:
- El contenedor de PostgreSQL se inicia primero con la inicialización de la base de datos
- El contenedor de Extensiones de PostgreSQL instala extensiones y crea datos de prueba integrales (~83K registros)
- Los contenedores del Servidor MCP y del Proxy MCPO se inician después de que PostgreSQL esté listo
- El contenedor de OpenWebUI se inicia al final y puede tardar más tiempo en cargar la interfaz web
💡 Consejo: Espere 2-3 minutos después de ejecutar
docker-compose up -dantes de acceder a OpenWebUI para asegurarse de que todos los servicios estén completamente inicializados.
🔍 Verificar Estado de los Contenedores (Opcional):
# Monitor container startup progress
docker-compose logs -f
# Check if all containers are running
docker-compose ps
# Verify PostgreSQL is ready
docker-compose logs postgres | grep "ready to accept connections"
3. Acceso a OpenWebUI
- La lista de funciones de herramientas MCP proporcionadas por
swaggerse puede encontrar en la URL de Documentación de la API de MCPO.- ej.:
http://localhost:8003/docs
- ej.:
4. Registro de la Herramienta en OpenWebUI
📌 Nota: Las instrucciones de configuración de la interfaz web se basan en OpenWebUI v0.6.22. Las ubicaciones de los menús y la configuración pueden diferir en versiones más nuevas.
- Inicie sesión en OpenWebUI con una cuenta de administrador
- Vaya a "Configuración" → "Herramientas" desde el menú superior.
- Ingrese la dirección de la Herramienta
postgresql-ops(ej.,http://localhost:8003/postgresql-ops) para conectar las Herramientas MCP. - Configure Ollama u OpenAI.
5. ¡Completado!
¡Felicitaciones! Su servidor de operaciones MCP PostgreSQL está ahora listo para usar. Puede comenzar a explorar sus bases de datos con consultas en lenguaje natural.
🚀 Pruebe Estas Consultas de Ejemplo:
- "Muéstrame las conexiones activas actuales"
- "¿Cuáles son las consultas más lentas del sistema?"
- "Analiza la fragmentación de tablas en todas las bases de datos"
- "Muéstrame información del tamaño de la base de datos"
- "¿Qué tablas necesitan mantenimiento de VACUUM?"
📖 Próximos Pasos:
- Explore la sección de Consultas de Ejemplo a continuación para más ejemplos de consultas
- Consulte Ejemplos de Uso de Herramientas con Capturas de Pantalla para guías visuales
- Explore la Matriz de Compatibilidad de Herramientas para comprender las funciones disponibles
(NOTA) Resumen de Datos de Prueba de Muestra
El script create-test-data.sql es ejecutado por el contenedor postgres-init-extensions (definido en docker-compose.yml) en el primer inicio, generando automáticamente bases de datos de prueba integrales para probar las herramientas MCP:
| Base de Datos | Propósito | Esquema y Tablas | Escala |
|---|---|---|---|
| ecommerce | Sistema de comercio electrónico | public: categories, products, customers, orders, order_items | 10 categorías, 500 productos, 100 clientes, 200 pedidos, 400 artículos de pedido |
| analytics | Análisis e informes | public: page_views, sales_summary | 1,000 vistas de página, 30 resúmenes de ventas |
| inventory | Gestión de almacén | public: suppliers, inventory_items, purchase_orders | 10 proveedores, 100 artículos, 50 órdenes de compra |
| hr_system | Gestión de RR.HH. | public: departments, employees, payroll | 5 departamentos, 50 empleados, 150 registros de nómina |
Usuarios de prueba creados: app_readonly, app_readwrite, analytics_user, backup_user
Optimizado para pruebas: Fragmentación intencional de tablas, varios índices (usados/no usados), datos de series temporales, relaciones complejas
Matriz de Compatibilidad de Herramientas
Adaptación Automática: Todas las herramientas funcionan de forma transparente en las versiones compatibles: ¡no se necesita configuración!
🟢 Herramientas Independientes de Extensiones (No Se Requieren Extensiones)
| Nombre de la Herramienta | Extensiones Requeridas | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 | Vistas/Tablas del Sistema Utilizadas |
|---|---|---|---|---|---|---|---|---|---|
get_server_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | version(), pg_extension |
get_active_connections | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_activity |
get_postgresql_config | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_settings |
get_database_list | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database |
get_table_list | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.tables |
get_table_schema_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.*, pg_indexes |
get_database_schema_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_namespace, pg_class, pg_proc |
get_table_relationships | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | information_schema.* (restricciones) |
get_user_list | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_user, pg_roles |
get_index_usage_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_indexes |
get_database_size_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database_size() |
get_table_size_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_total_relation_size() |
get_vacuum_analyze_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ Mejorada | pg_stat_user_tables |
get_current_database_info | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_database, current_database() |
get_table_bloat_analysis | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_database_bloat_overview | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_autovacuum_status | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_autovacuum_activity | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_running_vacuum_operations | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_activity |
get_vacuum_effectiveness_analysis | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_user_tables |
get_lock_monitoring | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_locks, pg_stat_activity |
get_wal_status | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_current_wal_lsn() |
get_database_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ Mejorada | pg_stat_database |
get_table_io_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_statio_user_tables |
get_index_io_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_statio_user_indexes |
get_database_conflicts_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | pg_stat_database_conflicts |
🚀 Herramientas Conscientes de la Versión (Auto-Adaptables)
| Nombre de la Herramienta | Extensiones Requeridas | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 | Características Especiales |
|---|---|---|---|---|---|---|---|---|---|
get_io_stats | ❌ Ninguna | ✅ Básico | ✅ Básico | ✅ Básico | ✅ Básico | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | PG16+: soporte de pg_stat_io; PG18+: columnas de bytes |
get_bgwriter_stats | ❌ Ninguna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ Especial | ✅ Mejorado | PG17: Estadísticas de checkpointer separadas; PG18+: num_done, slru_written |
get_replication_status | ❌ Ninguna | ✅ Compatible | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | PG13+: wal_status, safe_wal_size; PG16+: receptor WAL mejorado; PG17+: invalidation_reason, inactive_since |
get_all_tables_stats | ❌ Ninguna | ✅ Compatible | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | PG13+: seguimiento de n_ins_since_vacuum para optimización del mantenimiento de vacuum |
get_user_functions_stats | ⚙️ Configuración Requerida | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | Requiere track_functions=pl |
get_wait_events | ❌ Ninguna | ✅ Respaldo | ✅ Respaldo | ✅ Respaldo | ✅ Respaldo | ✅ Respaldo | ✅ Nativo | ✅ Nativo | PG17+: catálogo pg_wait_events; PG12-16: respaldo a esperas actuales de pg_stat_activity |
get_wal_summarizer_status | ❌ Ninguna | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ | PG17+: monitoreo del resumidor de WAL para copias de seguridad incrementales |
get_async_io_status | ❌ Ninguna | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | PG18+: monitoreo del subsistema de E/S asíncrono pg_aios |
get_per_backend_io_stats | ❌ Ninguna | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | PG18+: estadísticas de E/S y WAL por backend |
🟡 Herramientas Dependientes de Extensiones (Se Requieren Extensiones)
| Nombre de la herramienta | Extensión requerida | PG 12 | PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 | Notas |
|---|---|---|---|---|---|---|---|---|---|
get_pg_stat_statements_top_queries | pg_stat_statements | ✅ Compatible | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | PG12: total_time → total_exec_time; PG13+: nativo total_exec_time; PG17+: stats_since |
get_pg_stat_monitor_recent_queries | pg_stat_monitor | ✅ Compatible | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | ✅ Mejorado | PG12: total_time → total_exec_time; PG13+: nativo total_exec_time |
🆕 Características específicas de la versión
PostgreSQL 17
pg_wait_eventsvista: Catálogo nativo de eventos de espera con descripciones (usado porget_wait_events)- Resumidor WAL: Monitoreo para soporte de copias de seguridad incrementales (usado por
get_wal_summarizer_status) - Mejoras en los slots de replicación: columnas
invalidation_reasonyinactive_since(usado porget_replication_status) pg_stat_statementsstats_since: Rastrear cuándo se restablecieron las estadísticas por última vez (usado porget_pg_stat_statements_top_queries)- Progreso de VACUUM: Seguimiento de vaciado de índices en vistas de progreso (mejora futura para
get_running_vacuum_operations)
PostgreSQL 18
pg_aiosvista: Monitoreo del subsistema de E/S asíncrona (usado porget_async_io_status)- Estadísticas de E/S por backend: Estadísticas de E/S y WAL por backend individual (usado por
get_per_backend_io_stats) - Columnas de tiempo de VACUUM/ANALYZE:
total_vacuum_time,total_autovacuum_time,total_analyze_time,total_autoanalyze_timetiempo acumulado (usado porget_vacuum_analyze_stats) - Columnas de bytes
pg_stat_io:read_bytes,write_bytes,extend_bytes(usado porget_io_stats) - Estadísticas de trabajadores paralelos:
parallel_workers_launched,parallel_workers_to_launch(usado porget_database_stats) - Mejoras en el checkpoint: columnas
num_done,slru_written(usado porget_bgwriter_stats)
Ejemplos de uso
Integración con Claude Desktop
(Recomendado) Añade a tu archivo de configuración de Claude Desktop:
{
"mcpServers": {
"mcp-postgresql-ops": {
"command": "uvx",
"args": ["--python", "3.12", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "15432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "changeme!@34",
"POSTGRES_DB": "ecommerce"
}
}
}
}
"Muestra todas las conexiones activas en un formato de tabla HTML claro y legible."

"Muestra todas las relaciones para la tabla de clientes en la base de datos de comercio electrónico como un diagrama de Mermaid."

Instalación
Desde PyPI (Recomendado)
# Install the package
pip install mcp-postgresql-ops
# Or with uv (faster)
uv add mcp-postgresql-ops
# Verify installation
mcp-postgresql-ops --help
Desde el código fuente
# Clone the repository
git clone https://github.com/call518/MCP-PostgreSQL-Ops.git
cd MCP-PostgreSQL-Ops
# Install with uv (recommended)
uv sync
uv run mcp-postgresql-ops --help
# Or with pip
pip install -e .
mcp-postgresql-ops --help
Configuración de MCP
Configuración de Claude Desktop
(Opcional) Ejecutar con código fuente local:
{
"mcpServers": {
"mcp-postgresql-ops": {
"command": "uv",
"args": ["run", "python", "-m", "mcp_postgresql_ops"],
"env": {
"POSTGRES_HOST": "127.0.0.1",
"POSTGRES_PORT": "15432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "changeme!@34",
"POSTGRES_DB": "ecommerce"
}
}
}
}
Ejecutar MCP-Server como independiente
Con PyPI y uvx (Recomendado)
# Stdio mode
uvx --python 3.12 mcp-postgresql-ops \
--type stdio
# HTTP mode
uvx --python 3.12 mcp-postgresql-ops
--type streamable-http \
--host 127.0.0.1 \
--port 8000 \
--log-level DEBUG
(Opción) Configurar múltiples instancias de PostgreSQL
{
"mcpServers": {
"Postgresql-A": {
"command": "uvx",
"args": ["--python", "3.12", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "a.foo.com",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "postgres",
"POSTGRES_DB": "postgres"
}
},
"Postgresql-B": {
"command": "uvx",
"args": ["--python", "3.12", "mcp-postgresql-ops"],
"env": {
"POSTGRES_HOST": "b.bar.com",
"POSTGRES_PORT": "5432",
"POSTGRES_USER": "postgres",
"POSTGRES_PASSWORD": "postgres",
"POSTGRES_DB": "postgres"
}
}
}
}
Con código fuente local
# Method 1: Module execution (for development, requires PYTHONPATH)
PYTHONPATH=/path/to/MCP-PostgreSQL-Ops/src
python -m mcp_postgresql_ops \
--type stdio
# Method 2: Direct script (after uv installation in project directory)
uv run mcp-postgresql-ops \
--type stdio
# Method 3: Installed package script (after pip/uv install)
mcp-postgresql-ops \
--type stdio
# HTTP mode examples:
# Development mode
PYTHONPATH=/path/to/MCP-PostgreSQL-Ops/src
python -m mcp_postgresql_ops \
--type streamable-http \
--host 127.0.0.1 \
--port 8000 \
--log-level DEBUG
# Production mode (after installation)
mcp-postgresql-ops \
--type streamable-http \
--host 127.0.0.1 \
--port 8000 \
--log-level DEBUG
Argumentos de CLI
--type: Tipo de transporte (stdioostreamable-http) - Predeterminado:stdio--host: Dirección del host para transporte HTTP - Predeterminado:127.0.0.1--port: Número de puerto para transporte HTTP - Predeterminado:8000--auth-enable: Habilitar autenticación con token Bearer para el modo streamable-http - Predeterminado:false--secret-key: Clave secreta para autenticación con token Bearer (requerida cuando la autenticación está habilitada)--log-level: Nivel de registro (DEBUG, INFO, WARNING, ERROR, CRITICAL) - Predeterminado:INFO
Variables de entorno
| Variable | Descripción | Predeterminado | Predeterminado del proyecto |
|---|---|---|---|
PYTHONPATH | Ruta de búsqueda de módulos de Python (solo necesario para modo de desarrollo) | - | /app/src |
MCP_LOG_LEVEL | Verbosidad del registro del servidor (DEBUG, INFO, WARNING, ERROR) | INFO | INFO |
FASTMCP_TYPE | Protocolo de transporte MCP (stdio para CLI, streamable-http para web) | stdio | streamable-http |
FASTMCP_HOST | Dirección de enlace del servidor HTTP (0.0.0.0 para todas las interfaces) | 127.0.0.1 | 0.0.0.0 |
FASTMCP_PORT | Puerto del servidor HTTP para comunicación MCP | 8000 | 8000 |
REMOTE_AUTH_ENABLE | Habilitar autenticación con token Bearer para modo streamable-http (Predeterminado: false si no está definido/nulo/vacío) | false | false |
REMOTE_SECRET_KEY | Clave secreta para autenticación con token Bearer (requerida cuando la autenticación está habilitada) | - | your-secret-key-here |
PGSQL_VERSION | Versión principal de PostgreSQL para selección de imagen Docker | 17 | 17 |
PGDATA | Directorio de datos de PostgreSQL dentro del contenedor Docker (No modificar) | /var/lib/postgresql/data | /data/db |
POSTGRES_HOST | Nombre de host o dirección IP del servidor PostgreSQL | 127.0.0.1 | host.docker.internal |
POSTGRES_PORT | Número de puerto del servidor PostgreSQL | 5432 | 15432 |
POSTGRES_USER | Nombre de usuario de conexión a PostgreSQL (necesita permisos de lectura) | postgres | postgres |
POSTGRES_PASSWORD | Contraseña del usuario de PostgreSQL (soporta caracteres especiales) | changeme!@34 | changeme!@34 |
POSTGRES_DB | Nombre de base de datos predeterminado para conexiones | testdb | ecommerce |
POSTGRES_MAX_CONNECTIONS | Parámetro de configuración max_connections de PostgreSQL | 200 | 200 |
DOCKER_EXTERNAL_PORT_OPENWEBUI | Mapeo de puerto del host para contenedor Open WebUI | 8080 | 3003 |
DOCKER_EXTERNAL_PORT_MCP_SERVER | Mapeo de puerto del host para contenedor del servidor MCP | 8080 | 18003 |
DOCKER_EXTERNAL_PORT_MCPO_PROXY | Mapeo de puerto del host para contenedor proxy MCPO | 8000 | 8003 |
DOCKER_INTERNAL_PORT_POSTGRESQL | Puerto interno del contenedor PostgreSQL | 5432 | 5432 |
Nota: POSTGRES_DB sirve como base de datos objetivo predeterminada para operaciones cuando no se especifica una base de datos específica. En entornos Docker, si se establece un nombre no predeterminado, esta base de datos se creará automáticamente durante el inicio inicial de PostgreSQL.
Configuración de puerto: El contenedor PostgreSQL integrado utiliza el mapeo de puertos 15432:5432 donde:
POSTGRES_PORT=15432: Puerto externo para acceso desde el host y conexiones del servidor MCPDOCKER_INTERNAL_PORT_POSTGRESQL=5432: Puerto interno del contenedor (predeterminado de PostgreSQL)- Cuando se utilizan servidores PostgreSQL externos, establece
POSTGRES_PORTpara que coincida con el puerto real de tu servidor
Requisitos previos
Extensiones PostgreSQL requeridas
Para más detalles, consulta la ## Matriz de compatibilidad de herramientas
Nota: La mayoría de las herramientas MCP funcionan sin extensiones de PostgreSQL. La sección a continuación. Algunas herramientas avanzadas de análisis de rendimiento requieren las siguientes extensiones:
-- Query performance statistics (required only for get_pg_stat_statements_top_queries)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Advanced monitoring (optional, used by get_pg_stat_monitor_recent_queries)
CREATE EXTENSION IF NOT EXISTS pg_stat_monitor;
Configuración rápida: Para instalaciones nuevas de PostgreSQL, añade a postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
Luego reinicia PostgreSQL y ejecuta los comandos CREATE EXTENSION anteriores.
pg_stat_statementses requerido solo para herramientas de análisis de consultas lentas.pg_stat_monitores opcional y se utiliza para monitoreo de consultas en tiempo real.- Todas las demás herramientas funcionan sin estas extensiones.
Requisitos mínimos
- PostgreSQL 12+ (probado con PostgreSQL 17 y 18)
- Python 3.12
- Acceso de red al servidor PostgreSQL
- Permisos de lectura en los catálogos del sistema
Configuración requerida de PostgreSQL
⚠️ Configuración de recopilación de estadísticas: Algunas herramientas MCP requieren parámetros de configuración específicos de PostgreSQL para recopilar estadísticas. Elige uno de los siguientes métodos de configuración:
Herramientas afectadas por esta configuración:
- get_user_functions_stats: Requiere
track_functions = plotrack_functions = all - get_table_io_stats y get_index_io_stats: Sincronización más precisa con
track_io_timing = on - get_database_stats: Sincronización de E/S mejorada con
track_io_timing = on
Verificación: Después de aplicar cualquier método, verifica la configuración:
SELECT name, setting, context FROM pg_settings WHERE name IN ('track_activities', 'track_counts', 'track_io_timing', 'track_functions') ORDER BY name;
name | setting | context
------------------+---------+-----------
track_activities | on | superuser
track_counts | on | superuser
track_functions | pl | superuser
track_io_timing | on | superuser
(4 rows)
Método 1: postgresql.conf (Recomendado para PostgreSQL autogestionado)
Añade lo siguiente a tu postgresql.conf:
# Basic statistics collection (usually enabled by default)
track_activities = on
track_counts = on
# Required for function statistics tools
track_functions = pl # Enables PL/pgSQL function statistics collection
# Optional but recommended for accurate I/O timing
track_io_timing = on # Enables I/O timing statistics collection
Luego reinicia el servidor PostgreSQL.
Método 2: Parámetros de inicio de PostgreSQL
Para Docker o inicio de PostgreSQL desde línea de comandos:
# Docker example
docker run -d \
-e POSTGRES_PASSWORD=mypassword \
postgres:17 \
-c track_activities=on \
-c track_counts=on \
-c track_functions=pl \
-c track_io_timing=on
# Direct postgres command
postgres -D /data \
-c track_activities=on \
-c track_counts=on \
-c track_functions=pl \
-c track_io_timing=on
Método 3: Configuración dinámica (AWS RDS, Azure, GCP, Servicios gestionados)
Para servicios PostgreSQL gestionados donde no puedes modificar postgresql.conf, usa comandos SQL para cambiar la configuración dinámicamente:
-- Enable basic statistics collection (usually enabled by default)
ALTER SYSTEM SET track_activities = 'on';
ALTER SYSTEM SET track_counts = 'on';
-- Enable function statistics collection (requires superuser privileges)
ALTER SYSTEM SET track_functions = 'pl';
-- Enable I/O timing statistics (optional but recommended)
ALTER SYSTEM SET track_io_timing = 'on';
-- Reload configuration without restart (run separately)
SELECT pg_reload_conf();
Alternativa para pruebas a nivel de sesión:
-- Set for current session only (temporary)
SET track_activities = 'on';
SET track_counts = 'on';
SET track_functions = 'pl';
SET track_io_timing = 'on';
Nota: Cuando uses herramientas de línea de comandos, ejecuta cada sentencia SQL por separado para evitar errores de bloqueo de transacción.
Compatibilidad con RDS/Aurora
- Este servidor es de solo lectura y funciona con roles regulares en RDS/Aurora. Para análisis avanzados, habilita pg_stat_statements; pg_stat_monitor no está disponible en motores gestionados.
- En RDS/Aurora, prefiere el Grupo de Parámetros de BD sobre ALTER SYSTEM para configuraciones persistentes.
-- Verify preload setting SHOW shared_preload_libraries; -- Enable extension in target DB CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- Recommended visibility for monitoring GRANT pg_read_all_stats TO <app_user>;
Ejemplos de consultas
🟢 Herramientas independientes de extensiones (Siempre disponibles)
- get_server_info
- "Mostrar la versión del servidor PostgreSQL y el estado de las extensiones."
- "Comprobar si pg_stat_statements está instalado."
- get_active_connections
- "Mostrar todas las conexiones activas."
- "Listar las sesiones actuales con base de datos y usuario."
- get_postgresql_config
- "Mostrar todos los parámetros de configuración de PostgreSQL."
- "Encontrar todos los ajustes de configuración relacionados con memoria."
- get_database_list
- "Listar todas las bases de datos y sus tamaños."
- "Mostrar la lista de bases de datos con información del propietario."
- get_table_list
- "Listar todas las tablas en la base de datos ecommerce."
- "Mostrar los tamaños de las tablas en el esquema public."
- get_table_schema_info
- "Mostrar información detallada del esquema para la tabla customers en la base de datos ecommerce."
- "Obtener detalles de columnas y restricciones para la tabla products en la base de datos ecommerce."
- "Analizar la estructura de la tabla con índices y claves foráneas para la tabla orders en el esquema sales de la base de datos ecommerce."
- "Mostrar una visión general del esquema para todas las tablas en el esquema public de la base de datos inventory."
- 📋 Características: Tipos de columna, restricciones, índices, claves foráneas, metadatos de tabla
- ⚠️ Requerido: El parámetro
database_namedebe especificarse
- get_database_schema_info
- "Mostrar todos los esquemas en la base de datos ecommerce con su contenido."
- "Obtener información detallada sobre el esquema sales en la base de datos ecommerce."
- "Analizar la estructura del esquema y los permisos para la base de datos inventory."
- "Mostrar una visión general del esquema con recuentos de tablas y tamaños para la base de datos hr_system."
- 📋 Características: Propietarios de esquemas, permisos, recuentos de objetos, tamaños, contenido
- ⚠️ Requerido: El parámetro
database_namedebe especificarse
- get_table_relationships
- "Mostrar todas las relaciones para la tabla customers en la base de datos ecommerce."
- "Analizar las relaciones de claves foráneas para la tabla orders en el esquema sales de la base de datos ecommerce."
- "Obtener una visión general de relaciones en toda la base de datos ecommerce."
- "Encontrar todas las tablas que referencian la tabla products en la base de datos ecommerce."
- "Mostrar relaciones entre esquemas en la base de datos inventory."
- 📋 Características: Relaciones de claves foráneas (entrantes/salientes), dependencias entre esquemas, detalles de restricciones
- ⚠️ Requerido: El parámetro
database_namedebe especificarse - 💡 Uso: Deje
table_namevacío para el análisis de relaciones en toda la base de datos
- get_user_list
- "Listar todos los usuarios de la base de datos y sus roles."
- "Mostrar los permisos de usuario para una base de datos específica."
- get_index_usage_stats
- "Analizar la eficiencia del uso de índices."
- "Encontrar índices no utilizados en la base de datos actual."
- get_database_size_info
- "Mostrar el análisis de capacidad de la base de datos."
- "Encontrar las bases de datos más grandes por tamaño."
- get_table_size_info
- "Mostrar el análisis de tamaño de tablas e índices."
- "Encontrar las tablas más grandes en un esquema específico."
- get_vacuum_analyze_stats
- "Mostrar operaciones recientes de VACUUM y ANALYZE."
- "Listar tablas que necesitan VACUUM."
- get_current_database_info
- "¿A qué base de datos estoy conectado?"
- "Mostrar información de la base de datos actual y detalles de conexión."
- "Mostrar codificación, collation y tamaño de la base de datos."
- 📋 Características: Nombre de la base de datos, codificación, collation, tamaño, límites de conexión
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- get_table_bloat_analysis
- "Analizar el bloat de tablas en la base de datos actual."
- "Mostrar proporciones de tuplas muertas y estimaciones de bloat para el patrón de la tabla user_logs."
- "Encontrar tablas con alto bloat que necesitan mantenimiento VACUUM."
- "Analizar bloat en un esquema específico con un mínimo de 100 tuplas muertas."
- 📋 Características: Proporciones de tuplas muertas, estimaciones de tamaño de bloat, recomendaciones de VACUUM, filtrado por patrón
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- 💡 Uso: Enfoque independiente de extensiones usando pg_stat_user_tables
- get_database_bloat_overview
- "Mostrar resumen de bloat en toda la base de datos por esquema."
- "Obtener una vista de alto nivel de la eficiencia de almacenamiento en todos los esquemas."
- "Identificar esquemas que requieren atención de mantenimiento."
- 📋 Características: Agregación a nivel de esquema, estimaciones totales de bloat, estado de mantenimiento
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- get_autovacuum_status
- "Comprobar la configuración de autovacuum y las condiciones de activación."
- "Mostrar tablas que necesitan atención inmediata de autovacuum."
- "Analizar los porcentajes de umbral de autovacuum para el esquema public."
- "Encontrar tablas que se acercan a los puntos de activación de autovacuum."
- 📋 Características: Análisis de umbrales de activación, clasificación de urgencia, estado de configuración
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- 💡 Uso: Monitoreo de autovacuum independiente de extensiones usando pg_stat_user_tables
- get_autovacuum_activity
- "Mostrar patrones de actividad de autovacuum de las últimas 48 horas."
- "Monitorear la frecuencia y el momento de ejecución de autovacuum."
- "Encontrar tablas con patrones irregulares de autovacuum."
- "Analizar el historial reciente de autovacuum y autoanalyze."
- 📋 Características: Patrones de actividad, frecuencia de ejecución, análisis de tiempos
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- 💡 Uso: Análisis histórico de patrones de autovacuum
- get_running_vacuum_operations
- "Mostrar operaciones VACUUM y ANALYZE actualmente en ejecución."
- "Monitorear operaciones de mantenimiento activas y su progreso."
- "Comprobar si alguna operación VACUUM está bloqueando consultas."
- "Encontrar operaciones de mantenimiento de larga duración."
- 📋 Características: Estado de operaciones en tiempo real, tiempo transcurrido, nivel de impacto, detalles del proceso
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- 💡 Uso: Monitoreo de mantenimiento en tiempo real usando pg_stat_activity
- get_vacuum_effectiveness_analysis
- "Analizar la efectividad de VACUUM y los patrones de mantenimiento."
- "Comparar la eficiencia de VACUUM manual vs autovacuum."
- "Encontrar tablas con patrones de mantenimiento subóptimos."
- "Comprobar la frecuencia de VACUUM frente a las proporciones de actividad de tablas."
- 📋 Características: Análisis de patrones de mantenimiento, evaluación de efectividad, proporciones DML-a-VACUUM
- 🔧 PostgreSQL 12-18: Totalmente compatible, no requiere extensiones
- 💡 Uso: Análisis estratégico de VACUUM usando estadísticas existentes
- get_lock_monitoring
- "Mostrar todos los bloqueos actuales y sesiones bloqueadas."
- "Mostrar solo sesiones bloqueadas con el filtro granted=false."
- "Monitorear bloqueos por usuario específico con filtro de nombre de usuario."
- "Comprobar bloqueos exclusivos con filtro de modo."
- get_wal_status
- "Mostrar el estado de WAL e información de archivado."
- "Monitorear la generación de WAL y la posición actual de LSN."
- get_replication_status
- "Comprobar conexiones de replicación y estado de retraso."
- "Monitorear slots de replicación y estado del receptor WAL."
- get_database_stats
- "Mostrar métricas completas de rendimiento de la base de datos."
- "Analizar proporciones de confirmación de transacciones y estadísticas de E/S."
- "Monitorear proporciones de aciertos de caché de búfer y uso de archivos temporales."
- get_bgwriter_stats
- "Analizar el rendimiento y la sincronización de checkpoints."
- "Mostrar el rendimiento de checkpoints."
- "Mostrar estadísticas de eficiencia del escritor en segundo plano."
- "Monitorear la asignación de búferes y los patrones de fsync."
- get_user_functions_stats
- "Analizar el rendimiento de funciones definidas por el usuario."
- "Mostrar recuentos de llamadas a funciones y tiempos de ejecución."
- "Identificar cuellos de botella de rendimiento en funciones personalizadas."
- ⚠️ Requiere:
track_functions = plen postgresql.conf
- get_table_io_stats
- "Analizar el rendimiento de E/S de tablas y las proporciones de aciertos de búfer."
- "Identificar tablas con mal rendimiento de caché de búfer."
- "Monitorear estadísticas de E/S de tablas TOAST."
- 💡 Mejorado con:
track_io_timing = onpara tiempos precisos
- get_index_io_stats
- "Mostrar el rendimiento de E/S de índices y la eficiencia de búfer."
- "Identificar índices que causan E/S de disco excesiva."
- "Monitorear patrones de amigabilidad de caché de índices."
- 💡 Mejorado con:
track_io_timing = onpara tiempos precisos
- get_database_conflicts_stats
- "Comprobar conflictos de replicación en servidores en espera."
- "Analizar tipos de conflicto y estadísticas de resolución."
- "Monitorear patrones de cancelación de consultas en servidores en espera."
- "Monitorear la generación de WAL y la posición actual de LSN."
- get_replication_status
- "Comprobar conexiones de replicación y estado de retraso."
- "Monitorear slots de replicación y estado del receptor WAL."
🚀 Herramientas Conscientes de Versión (Auto-Adaptables)
- get_io_stats (¡Nuevo!)
- "Mostrar estadísticas completas de E/S." (PostgreSQL 16+ proporciona desglose detallado)
- "Analizar estadísticas de E/S."
- "Analizar la eficiencia de la caché de búfer y los tiempos de E/S."
- "Monitorear patrones de E/S por tipo de backend y contexto."
- 📈 PG16+: pg_stat_io completo con tiempos, tipos de backend y contextos
- 📊 PG12-15: Recurso alternativo básico pg_statio_* con proporciones de aciertos de búfer
- get_bgwriter_stats (¡Mejorado!)
- "Mostrar el rendimiento del escritor en segundo plano y de checkpoints."
- 📈 PG17+: Estadísticas separadas de checkpointer y bgwriter mediante
pg_stat_checkpointer - 📊 PG12-16: Estadísticas combinadas de bgwriter (incluye datos de checkpointer)
- get_server_info (¡Mejorado!)
- "Mostrar la versión del servidor y las características de compatibilidad."
- "Comprobar la compatibilidad del servidor."
- "Comprobar qué herramientas MCP están disponibles en esta versión de PostgreSQL."
- "Muestra la matriz de disponibilidad de características y recomendaciones de actualización."
- get_all_tables_stats (¡Mejorado!)
- "Mostrar estadísticas completas para todas las tablas." (compatible con versiones PG12-18)
- "Incluir tablas del sistema con el parámetro include_system=true."
- "Analizar patrones de acceso a tablas y necesidades de mantenimiento."
- 📈 PG13+: Rastrea inserciones desde vacuum (
n_ins_since_vacuum) para una programación óptima de mantenimiento - 📊 PG12: Modo compatible con NULL para columnas no soportadas
- get_wait_events (¡Nuevo!)
- "Mostrar tipos de eventos de espera y descripciones."
- "¿Qué eventos de espera están disponibles en esta versión de PostgreSQL?"
- 📈 PG17+: Catálogo nativo
pg_wait_eventscon descripciones completas - 📊 PG12-16: Recurso alternativo a
pg_stat_activityesperas actuales agrupadas por tipo
- get_wal_summarizer_status (¡Nuevo! PG 17+)
- "Mostrar el estado del resumidor WAL para copias de seguridad incrementales."
- "Monitorear el progreso de resumen de WAL."
- 📈 PG17+: Monitoreo del resumidor WAL mediante
pg_get_wal_summarizer_state() - ❌ PG12-16: No disponible (devuelve mensaje informativo)
- get_async_io_status (¡Nuevo! PG 18+)
- "Mostrar el estado del subsistema de E/S asíncrona."
- "Monitorear pg_aios para operaciones de E/S asíncrona."
- 📈 PG18+: Vista
pg_aiospara monitoreo de E/S asíncrona - ❌ PG12-17: No disponible (devuelve mensaje informativo)
- get_per_backend_io_stats (¡Nuevo! PG 18+)
- "Mostrar estadísticas de E/S y WAL por backend."
- "Analizar patrones de E/S por proceso backend individual."
- 📈 PG18+: Estadísticas de E/S por backend con estadísticas WAL
- ❌ PG12-17: No disponible (devuelve mensaje informativo)
🟡 Herramientas Dependientes de Extensiones
- get_pg_stat_statements_top_queries (Requiere
pg_stat_statements)- "Mostrar las 10 consultas más lentas."
- "Analizar consultas lentas en la base de datos inventory."
- 📈 Compatible con versiones: PG12 usa el mapeo
total_time→total_exec_time; PG13+ usa columnas nativas - 💡 Multi-versión: Adapta automáticamente la estructura de consultas para compatibilidad con PostgreSQL 12-18
- get_pg_stat_monitor_recent_queries (Opcional, usa
pg_stat_monitor)- "Mostrar consultas recientes en tiempo real."
- "Monitorear la actividad de consultas de los últimos 5 minutos."
- 📈 Compatible con versiones: PG12 usa el mapeo
total_time→total_exec_time; PG13+ usa columnas nativas - 💡 Multi-versión: Adapta automáticamente la estructura de consultas para compatibilidad con PostgreSQL 12-18
💡 Consejo profesional: Todas las herramientas admiten operaciones multi-base de datos usando el parámetro database_name. Esto permite a los superusuarios de PostgreSQL analizar y monitorear múltiples bases de datos desde una única instancia del servidor MCP.
Solución de Problemas
Problemas de Conexión
- Verifique el estado del servidor PostgreSQL
- Verifique los parámetros de conexión en el archivo
.env - Asegure la conectividad de red
- Verifique los permisos de usuario
Errores de Extensión
- Ejecuta
get_server_infopara verificar el estado de la extensión - Instala las extensiones faltantes:
CREATE EXTENSION pg_stat_statements; CREATE EXTENSION pg_stat_monitor; - Reinicia PostgreSQL si es necesario
Problemas de Configuración
-
"No se encontraron datos" para estadísticas de funciones: Verifica la configuración de
track_functionsSHOW track_functions; -- Should be 'pl' or 'all'Solución rápida para servicios administrados (AWS RDS, etc.):
ALTER SYSTEM SET track_functions = 'pl'; SELECT pg_reload_conf(); -
Faltan datos de temporización de E/S: Habilita la recopilación de temporización
SHOW track_io_timing; -- Should be 'on'Solución rápida:
ALTER SYSTEM SET track_io_timing = 'on'; SELECT pg_reload_conf(); -
Aplica los cambios de configuración:
- Autogestionado: Agrega la configuración a
postgresql.confy reinicia el servidor - Servicios administrados: Usa
ALTER SYSTEM SET+SELECT pg_reload_conf() - Pruebas temporales: Usa
SET parameter = valuepara la sesión actual - Genera algo de actividad en la base de datos para poblar las estadísticas
- Autogestionado: Agrega la configuración a
Problemas de Rendimiento
- Usa los parámetros de
limitpara reducir el tamaño de los resultados - Ejecuta el monitoreo fuera de las horas pico
- Verifica la carga de la base de datos antes de ejecutar el análisis
Problemas de Compatibilidad de Versiones
Para más detalles, consulta la ## Matriz de Compatibilidad de Herramientas
-
Ejecuta primero la verificación de compatibilidad:
# "Use get_server_info to check version and available features" -
Comprendiendo la disponibilidad de funciones:
- PostgreSQL 18: Todas las funciones, incluyendo E/S asíncrona, temporización de VACUUM, estadísticas por backend
- PostgreSQL 17: Estadísticas separadas de checkpointer, eventos de espera, resumidor de WAL
- PostgreSQL 16: Vista pg_stat_io
- PostgreSQL 14+: Seguimiento de consultas paralelas
- PostgreSQL 12-13: Solo funcionalidad principal
-
Si una herramienta muestra "No disponible":
- La función requiere una versión más reciente de PostgreSQL
- La herramienta usará automáticamente la mejor alternativa disponible
- Considera actualizar PostgreSQL para un monitoreo mejorado
Desarrollo
Pruebas y Desarrollo
# Clone and setup for development
git clone https://github.com/call518/MCP-PostgreSQL-Ops.git
cd MCP-PostgreSQL-Ops
uv sync
# Test with MCP Inspector (loads .env automatically)
./run-mcp-inspector-local.sh
# Direct execution methods:
# 1. Using uv run (recommended for development)
uv run mcp-postgresql-ops --log-level DEBUG
# 2. Module execution (requires PYTHONPATH)
PYTHONPATH=src python -m mcp_postgresql_ops --log-level DEBUG
# 3. After installation
mcp-postgresql-ops --log-level DEBUG
# Test version compatibility (requires different PostgreSQL versions)
# Modify POSTGRES_HOST in .env to point to different versions
Ejecución de Pruebas
Hay dos conjuntos de pruebas disponibles:
| Conjunto | Archivo | Requiere Docker |
|---|---|---|
| Pruebas unitarias (lógica de compatibilidad de versiones) | tests/test_version_compat.py | No |
| Pruebas de integración (todas las herramientas × PG 12–18) | tests/test_tools_integration.py | Sí |
uv run pytest inicia automáticamente los contenedores de prueba de Docker (PG 12–18), espera a que se inicialicen por completo, ejecuta todas las pruebas y luego elimina todo.
# Run all tests (unit + integration) — Docker is managed automatically
uv run pytest -v
# Unit tests only (no Docker needed)
uv run pytest tests/test_version_compat.py -v
# Integration tests only
uv run pytest tests/test_tools_integration.py -v
Nota: Docker debe estar en ejecución. El stack de pruebas usa los puertos 5412–5418 (PG 12–18).
Pruebas de Compatibilidad de Versiones
El servidor MCP se adapta automáticamente a las versiones de PostgreSQL 12-18. Para probar entre versiones:
- Configura bases de datos de prueba: Diferentes versiones de PostgreSQL (12, 14, 15, 16, 17, 18)
- Ejecuta pruebas de compatibilidad: Apunta a cada versión y verifica el comportamiento de las herramientas
- Verifica la detección de funciones: Asegura la detección correcta de versiones y la disponibilidad de funciones
- Verifica el comportamiento de respaldo: Confirma la degradación gradual en versiones anteriores
Notas de Seguridad
- Todas las herramientas son de solo lectura - sin capacidades de modificación de datos
- La información sensible (contraseñas) está enmascarada en las salidas
- Sin ejecución directa de SQL - solo consultas predefinidas
- Sigue el principio de privilegio mínimo
Contribuciones
🤝 ¿Tienes ideas? ¿Encontraste errores? ¿Quieres agregar funciones interesantes?
¡Siempre estamos emocionados de dar la bienvenida a nuevos contribuyentes! Ya sea corregir un error tipográfico, agregar una nueva herramienta de monitoreo o mejorar la documentación - cada contribución hace que este proyecto sea mejor.
Formas de contribuir:
- 🐛 Reporta problemas o errores
- 💡 Sugiere nuevas funciones de monitoreo de PostgreSQL
- 📝 Mejora la documentación
- 🚀 Envía solicitudes de extracción
- ⭐ Marca el repositorio con una estrella si te resulta útil
Consejo profesional: El código base está diseñado para ser muy amigable para agregar nuevas herramientas. Revisa las funciones existentes de @mcp.tool() en mcp_main.py.
Documentación Swagger de MCPO
[URL de Swagger de MCPO] http://localhost:8003/postgresql-ops/docs

🔐 Seguridad y Autenticación
Autenticación con Token Bearer
Para el modo streamable-http, este servidor MCP admite autenticación con token Bearer para asegurar el acceso remoto. Esto es especialmente importante al ejecutar el servidor en entornos de producción.
Política predeterminada:
REMOTE_AUTH_ENABLEtiene como valor predeterminadofalsesi no está definido, es nulo o está vacío. Esto garantiza la compatibilidad hacia atrás y evita errores de inicio cuando la variable no está configurada.
Configuración
Habilitar autenticación:
# In .env file
REMOTE_AUTH_ENABLE=true
REMOTE_SECRET_KEY=my-test-secret-key-12345
O mediante CLI:
# Module method
python -m mcp_postgresql_ops --type streamable-http --auth-enable --secret-key my-test-secret-key-12345
# Script method
mcp-postgresql-ops --type streamable-http --auth-enable --secret-key my-test-secret-key-12345
Niveles de Seguridad
- Modo stdio (Predeterminado): Acceso solo local, no se necesita autenticación
- streamable-http + REMOTE_AUTH_ENABLE=false: Acceso remoto sin autenticación ⚠️ NO RECOMENDADO para producción
- streamable-http + REMOTE_AUTH_ENABLE=true: Acceso remoto con autenticación de token Bearer ✅ RECOMENDADO para producción
Configuración del Cliente
Cuando la autenticación está habilitada, los clientes MCP deben incluir el token Bearer en el encabezado de Authorization:
{
"mcpServers": {
"mcp-postgresql-ops": {
"type": "streamable-http",
"url": "http://your-server:8000/mcp",
"headers": {
"Authorization": "Bearer my-test-secret-key-12345"
}
}
}
}
Mejores Prácticas de Seguridad
- Habilita siempre la autenticación al usar el modo streamable-http en producción
- Usa claves secretas fuertes y generadas aleatoriamente (se recomiendan 32+ caracteres)
- Usa HTTPS cuando sea posible (configura un proxy inverso con SSL/TLS)
- Restringe el acceso a la red usando firewalls o políticas de red
- Rota las claves secretas regularmente para mayor seguridad
- Monitorea los registros de acceso para detectar intentos de acceso no autorizado
Manejo de Errores
Cuando la autenticación falla, el servidor devuelve:
- 401 No autorizado para tokens faltantes o inválidos
- Mensajes de error detallados en formato JSON para depuración
🚀 Agregar Herramientas Personalizadas
Este servidor MCP está diseñado para una fácil extensibilidad. Sigue estos 4 simples pasos para agregar tus propias herramientas personalizadas:
Guía Paso a Paso
1. Agrega Funciones Auxiliares (Opcional)
Agrega funciones de datos reutilizables a src/mcp_postgresql_ops/functions.py:
async def get_your_custom_data(target_database: str = None, limit: int = 20) -> List[Dict[str, Any]]:
"""Your custom data retrieval function."""
try:
# Example implementation - adapt to your PostgreSQL needs
query = """
SELECT
schemaname,
tablename,
attname as column_name,
n_distinct,
most_common_vals,
most_common_freqs
FROM pg_stats
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
ORDER BY schemaname, tablename, attname
LIMIT $1
"""
results = await execute_query(query, [limit], database=target_database)
return results
except Exception as e:
logger.error(f"Failed to get custom data: {e}")
raise
2. Crea Tu Herramienta MCP
Agrega tu función de herramienta a src/mcp_postgresql_ops/mcp_main.py:
@mcp.tool()
async def get_your_custom_analysis(limit: int = 50, database_name: Optional[str] = None) -> str:
"""
[Tool Purpose]: Brief description of what your tool does
[Exact Functionality]:
- Feature 1: Data aggregation and analysis
- Feature 2: Database monitoring and insights
- Feature 3: Performance metrics and reporting
[Required Use Cases]:
- When user asks "your specific analysis request"
- Your PostgreSQL-specific monitoring needs
Args:
limit: Maximum results (1-100)
database_name: Target database name (optional, uses default if not specified)
Returns:
Formatted analysis results
"""
try:
# Always validate input limits
limit = max(1, min(limit, 100))
# Get your custom data
results = await get_your_custom_data(target_database=database_name, limit=limit)
if not results:
return "No data found for custom analysis."
# Format and return results
return format_table_data(results, f"Custom Analysis Results (Top {len(results)})")
except Exception as e:
logger.error(f"Failed to get custom analysis: {e}")
return f"Error: {str(e)}"
3. Actualiza las Importaciones
Agrega tu función auxiliar a la sección de importaciones en src/mcp_postgresql_ops/mcp_main.py (alrededor de la línea 30):
from .functions import (
execute_query,
execute_single_query,
format_table_data,
format_bytes,
format_duration,
get_server_version,
check_extension_exists,
get_pg_stat_statements_data,
get_pg_stat_monitor_data,
sanitize_connection_info,
read_prompt_template,
parse_prompt_sections,
get_current_database_name,
POSTGRES_CONFIG,
get_your_custom_data, # Add your new function here
)
4. Actualiza la Plantilla de Prompt (Recomendado)
Agrega la descripción de tu herramienta a src/mcp_postgresql_ops/prompt_template.md para un mejor reconocimiento del lenguaje natural:
### **Your Custom Analysis Tool**
### X. **get_your_custom_analysis**
**Purpose**: Brief description of what your tool does
**Usage**: "Show me your custom analysis" or "Get custom analysis for database_name"
**Features**: Data aggregation, database monitoring, performance metrics
**Optional**: `database_name` parameter for specific database analysis
**Limit**: Results limited to 1-100 records for performance
5. Prueba Tu Herramienta
# Local testing with MCP Inspector
./run-mcp-inspector-local.sh
# Or test with Docker stack
docker-compose up -d
docker-compose logs -f mcp-server
# Test with natural language queries:
# "Show me your custom analysis"
# "Get custom analysis for ecommerce database"
# "Analyze custom data with limit 25"
Notas Importantes
- Soporte Multi-Base de Datos: Todas las herramientas admiten el parámetro opcional
database_namepara apuntar a bases de datos específicas - Validación de Entrada: Siempre valida los parámetros de
limitconmax(1, min(limit, 100)) - Manejo de Errores: Devuelve mensajes de error amigables en lugar de lanzar excepciones
- Registro: Usa
logger.error()para depuración mientras devuelves mensajes de error limpios a los usuarios - Compatibilidad con PostgreSQL: Tus consultas personalizadas deben funcionar en PostgreSQL 12-18
- Dependencias de Extensiones: Si tu herramienta requiere extensiones específicas, verifica la disponibilidad con
check_extension_exists()
Patrones Avanzados
Para consultas conscientes de la versión o funciones dependientes de extensiones, consulta herramientas existentes como get_pg_stat_statements_top_queries para ver patrones de referencia.
¡Eso es todo! Tu herramienta personalizada está lista para usarse con consultas en lenguaje natural a través de cualquier cliente MCP.
Licencia
Usa, modifica y distribuye libremente bajo la Licencia MIT.
⭐ Otros Proyectos
Otros servidores MCP del mismo autor: