Skip to main content
Glama
lastfore

PostgreSQL MCP Server

by lastfore

Servidor MCP de PostgreSQL

Un servidor de Model Context Protocol (MCP) de nivel de producción que permite a los usuarios interactuar con bases de datos PostgreSQL mediante lenguaje natural. Este servidor está construido sobre FastMCP, convierte preguntas en lenguaje natural en consultas SQL seguras, ejecuta las consultas y valida los resultados. Algunos documentos de referencia:

Características

  • Lenguaje natural a SQL: Utiliza GPT-5.2-mini para convertir preguntas comunes en inglés en consultas PostgreSQL optimizadas.

  • Seguridad ante todo: Ejecución forzada de solo lectura, bloqueo de funciones peligrosas, protección contra inyección SQL y control de tiempo de espera de consultas.

  • Validación de resultados: Validación de resultados basada en IA, proporcionando una puntuación de confianza.

  • Esquema inteligente: Caché de esquema automático, mecanismo de actualización basado en TTL.

  • Listo para producción: Gestión de grupos de conexiones (pool), disyuntores (circuit breakers), limitación de tasa y recopilación integral de métricas.

  • Compatible con MCP: Soporta Claude Desktop y cualquier cliente compatible con MCP.

Related MCP server: PostgreSQL MCP Server

Inicio rápido

Requisitos previos

  • Python 3.14+

  • PostgreSQL 12+

  • Clave de API de OpenAI (para GPT-5.2-mini)

  • Gestor de paquetes UV (recomendado) o pip

Instalación

Usando UV (recomendado)

# 克隆仓库
git clone <repository-url>
cd pg-mcp

# 安装依赖
uv sync

# 复制环境配置模板
cp .env.example .env

# 编辑 .env 并配置参数
vi .env

Usando pip

# 克隆仓库
git clone <repository-url>
cd pg-mcp

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Windows 系统: .venv\Scripts\activate

# 安装依赖
pip install -e .

# 复制环境配置模板
cp .env.example .env

# 编辑 .env 并配置参数
vi .env

Configuración

Edite el archivo .env para configurar sus ajustes:

# 数据库配置
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_NAME=your_database
DATABASE_USER=your_user
DATABASE_PASSWORD=your_password

# OpenAI 配置
OPENAI_API_KEY=sk-your-api-key-here
OPENAI_MODEL=gpt-5.2-mini

# 安全设置(可选,显示默认值)
SECURITY_ALLOW_WRITE_OPERATIONS=false
SECURITY_MAX_ROWS=10000
SECURITY_MAX_EXECUTION_TIME=30

Para conocer las opciones de configuración completas, consulte .env.example.

Ejecución del servidor

Modo independiente

# 使用 UV
uv run python main.py

# 或使用 pip
python main.py

Integración con Claude Desktop

Agregue la siguiente configuración al archivo de configuración de MCP de Claude Desktop:

macOS/Linux: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_NAME": "your_database",
        "DATABASE_USER": "your_user",
        "DATABASE_PASSWORD": "your_password",
        "OPENAI_API_KEY": "sk-your-api-key-here"
      }
    }
  }
}

Para obtener instrucciones de configuración detalladas, consulte Configuración de Claude Desktop.

Uso

Consultas de ejemplo

Después de conectarse a través de Claude Desktop u otro cliente MCP, puede hacer preguntas en lenguaje natural:

Consulta simple

How many tables are in the database?
→ SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public'

Show me all users
→ SELECT * FROM users LIMIT 10000

What are the column names in the products table?
→ SELECT column_name, data_type FROM information_schema.columns
  WHERE table_name = 'products'

Consulta de análisis

What are the top 10 products by sales?
→ SELECT product_name, SUM(quantity * price) as total_sales
  FROM orders
  GROUP BY product_name
  ORDER BY total_sales DESC
  LIMIT 10

How many users registered in the last 30 days?
→ SELECT COUNT(*) FROM users
  WHERE created_at > CURRENT_DATE - INTERVAL '30 days'

Modo solo SQL

También puede solicitar solo SQL sin ejecutarlo:

Generate SQL to find duplicate emails
Return Type: sql
→ Returns: SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1

Tipos de retorno

El servidor admite dos tipos de retorno:

  • result (predeterminado): Ejecuta la consulta y devuelve los resultados.

  • sql: Genera y valida el SQL, pero no lo ejecuta.

Formato de respuesta

Respuesta de consulta exitosa

{
  "success": true,
  "generated_sql": "SELECT COUNT(*) FROM users",
  "data": {
    "columns": ["count"],
    "rows": [[1523]],
    "row_count": 1,
    "execution_time": 0.023
  },
  "confidence": 95,
  "tokens_used": 234
}

Respuesta solo SQL

{
  "success": true,
  "generated_sql": "SELECT * FROM users WHERE created_at > CURRENT_DATE - INTERVAL '30 days'",
  "confidence": 90,
  "tokens_used": 156
}

Respuesta de error

{
  "success": false,
  "error": {
    "code": "SECURITY_VIOLATION",
    "message": "Query contains blocked operation: DELETE",
    "details": {
      "blocked_operation": "DELETE"
    }
  }
}

Arquitectura

Componentes principales

┌─────────────────────────────────────────────────────────────┐
│                      MCP Server (FastMCP)                   │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    Query Orchestrator                       │
│  - Coordinates all components                               │
│  - Manages retry logic                                      │
│  - Handles error recovery                                   │
└─────────────────────────────────────────────────────────────┘
           │                  │                  │
           ▼                  ▼                  ▼
    ┌───────────┐     ┌────────────┐     ┌──────────────┐
    │   SQL     │     │    SQL     │     │     SQL      │
    │ Generator │────▶│ Validator  │────▶│  Executor    │
    │ (LLM)     │     │ (Security) │     │ (Database)   │
    └───────────┘     └────────────┘     └──────────────┘
           │                                      │
           ▼                                      ▼
    ┌───────────┐                          ┌──────────────┐
    │  Schema   │                          │   Result     │
    │  Cache    │                          │  Validator   │
    └───────────┘                          │  (LLM)       │
                                           └──────────────┘

Características de seguridad

  1. Ejecución forzada de solo lectura: Por defecto, solo permite consultas SELECT.

  2. Bloqueo de funciones peligrosas: La lista negra incluye funciones peligrosas de PostgreSQL (pg_sleep, E/S de archivos, etc.).

  3. Análisis SQL: Utiliza sqlglot para una validación precisa de la estructura SQL.

  4. Protección contra inyección: Consultas parametrizadas y limpieza de entradas.

  5. Límites de recursos:

    • Límite de filas (predeterminado: 10,000)

    • Tiempo de espera de consulta (predeterminado: 30 segundos)

    • Gestión de grupos de conexiones

  6. Aislamiento de transacciones: Todas las consultas se ejecutan en transacciones de solo lectura.

Características de resiliencia

  • Disyuntor: Evita fallos en cascada de la API de LLM.

  • Limitación de tasa: Evita el agotamiento de la cuota de API.

  • Lógica de reintento: Reintento automático de fallos transitorios, utilizando retroceso exponencial.

  • Grupos de conexiones: Reutilización eficiente de conexiones de base de datos.

  • Caché de esquema: La caché basada en TTL reduce las consultas de metadatos de la base de datos.

Referencia de configuración

Ajustes de base de datos

Variable

Descripción

Valor predeterminado

DATABASE_HOST

Host de PostgreSQL

localhost

DATABASE_PORT

Puerto de PostgreSQL

5432

DATABASE_NAME

Nombre de la base de datos

Requerido

DATABASE_USER

Usuario de la base de datos

Requerido

DATABASE_PASSWORD

Contraseña de la base de datos

Requerido

DATABASE_MIN_POOL_SIZE

Conexiones mínimas en el pool

5

DATABASE_MAX_POOL_SIZE

Conexiones máximas en el pool

20

DATABASE_COMMAND_TIMEOUT

Tiempo de espera de consulta (seg)

30

Ajustes de OpenAI

Variable

Descripción

Valor predeterminado

OPENAI_API_KEY

Clave de API de OpenAI

Requerido

OPENAI_MODEL

Modelo utilizado

gpt-5.2-mini

OPENAI_MAX_TOKENS

Máximo de tokens por solicitud

32000

OPENAI_TEMPERATURE

Temperatura del modelo

0.0

OPENAI_TIMEOUT

Tiempo de espera de API (seg)

30

Ajustes de seguridad

Variable

Descripción

Valor predeterminado

SECURITY_ALLOW_WRITE_OPERATIONS

Permitir INSERT/UPDATE/DELETE

false

SECURITY_BLOCKED_FUNCTIONS

Lista negra de funciones separada por comas

Ver .env.example

SECURITY_MAX_ROWS

Máximo de filas por consulta

10000

SECURITY_MAX_EXECUTION_TIME

Tiempo de espera de consulta (seg)

30

Ajustes de caché

Variable

Descripción

Valor predeterminado

CACHE_ENABLED

Habilitar caché de esquema

true

CACHE_SCHEMA_TTL

TTL de caché de esquema (seg)

3600

CACHE_MAX_SIZE

Número máximo de esquemas en caché

100

Ajustes de resiliencia

Variable

Descripción

Valor predeterminado

RESILIENCE_MAX_RETRIES

Máximo de reintentos

3

RESILIENCE_RETRY_DELAY

Retraso inicial de reintento (seg)

1.0

RESILIENCE_BACKOFF_FACTOR

Factor de retroceso exponencial

2.0

RESILIENCE_CIRCUIT_BREAKER_THRESHOLD

Fallos antes de abrir el disyuntor

5

RESILIENCE_CIRCUIT_BREAKER_TIMEOUT

Tiempo de espera del disyuntor (seg)

60

Ajustes de observabilidad

Variable

Descripción

Valor predeterminado

OBSERVABILITY_METRICS_ENABLED

Habilitar métricas de Prometheus

true

OBSERVABILITY_METRICS_PORT

Puerto HTTP de métricas

9090

OBSERVABILITY_LOG_LEVEL

Nivel de registro

INFO

OBSERVABILITY_LOG_FORMAT

Formato de registro (json/text)

json

Desarrollo

Configuración del entorno de desarrollo

# 安装开发依赖
uv sync --all-extras

# 安装 pre-commit 钩子(可选)
pre-commit install

Ejecución de pruebas

# 运行所有测试
uv run pytest

# 运行并生成覆盖率报告
uv run pytest --cov=src --cov-report=html

# 运行特定测试类别
uv run pytest tests/unit/          # 仅单元测试
uv run pytest tests/integration/   # 集成测试
uv run pytest tests/e2e/           # 端到端测试
uv run pytest -m integration       # 标记为集成的测试

Calidad del código

# 类型检查
uv run mypy src

# Lint 和格式化
uv run ruff check --fix .
uv run ruff format .

# 运行所有质量检查
uv run pytest --cov=src --cov-fail-under=80
uv run mypy src
uv run ruff check .

Estructura del proyecto

pg-mcp/
├── src/pg_mcp/
│   ├── cache/              # Schema 缓存
│   ├── config/             # 配置管理
│   ├── db/                 # 数据库连接池
│   ├── models/             # 数据模型
│   ├── observability/      # 日志、指标、追踪
│   ├── prompts/            # LLM Prompt 模板
│   ├── resilience/         # 熔断器、限流器
│   ├── services/           # 核心业务逻辑
│   │   ├── orchestrator.py      # 查询协调
│   │   ├── sql_generator.py     # 基于 LLM 的 SQL 生成
│   │   ├── sql_validator.py     # 安全验证
│   │   ├── sql_executor.py      # 查询执行
│   │   └── result_validator.py  # 结果验证
│   └── server.py           # FastMCP 服务器
├── tests/
│   ├── unit/               # 单元测试
│   ├── integration/        # 集成测试
│   └── e2e/                # 端到端测试
├── fixtures/               # 测试数据库 fixture
├── .env.example            # 环境模板
├── pyproject.toml          # 项目配置
└── main.py                 # 入口点

Despliegue en Docker

Construir imagen

docker build -t pg-mcp:latest .

Ejecutar contenedor

docker run -d \
  --name pg-mcp \
  -e DATABASE_HOST=your-db-host \
  -e DATABASE_NAME=your-db \
  -e DATABASE_USER=your-user \
  -e DATABASE_PASSWORD=your-password \
  -e OPENAI_API_KEY=sk-your-key \
  -p 9090:9090 \
  pg-mcp:latest

Docker Compose

# 启动所有服务(PostgreSQL + pg-mcp)
docker-compose up -d

# 查看日志
docker-compose logs -f pg-mcp

# 停止服务
docker-compose down

Consulte docker-compose.yml para una configuración detallada.

Monitoreo

Métricas

El servidor expone métricas de Prometheus en el puerto 9090 (configurable):

curl http://localhost:9090/metrics

Métricas disponibles:

  • pg_mcp_queries_total - Número total de consultas procesadas

  • pg_mcp_query_duration_seconds - Histograma de tiempo de ejecución de consultas

  • pg_mcp_sql_generation_duration_seconds - Tiempo de generación de SQL

  • pg_mcp_sql_validation_failures_total - Número de fallos de validación

  • pg_mcp_database_errors_total - Número de errores de base de datos

  • pg_mcp_llm_tokens_used_total - Uso total de tokens de LLM

Registros (Logs)

Registros JSON estructurados (o formato de texto) enviados a la salida estándar:

{
  "timestamp": "2025-12-20T10:30:00.123Z",
  "level": "INFO",
  "message": "Query executed successfully",
  "database": "mydb",
  "execution_time": 0.023,
  "row_count": 42
}

Solución de problemas

Preguntas frecuentes

Conexión rechazada

Error: Connection to database failed

Solución: Verifique que PostgreSQL esté ejecutándose y que las credenciales sean correctas:

psql -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAME

Error de API de OpenAI

Error: OpenAI API request failed

Solución:

  1. Compruebe que la clave de API sea válida y tenga saldo.

  2. Verifique la conexión de red.

  3. Si la solicitud agota el tiempo de espera, verifique la configuración de OPENAI_TIMEOUT.

Tiempo de espera de consulta agotado

Error: Query execution timeout exceeded

Solución:

  1. Aumente SECURITY_MAX_EXECUTION_TIME.

  2. Optimice la base de datos (añada índices, VACUUM).

  3. Simplifique la consulta o añada condiciones de filtrado.

Problemas con la caché de esquema

Error: Schema not found in cache

Solución:

  1. Reinicie el servidor para recargar el esquema.

  2. Verifique que el usuario de la base de datos tenga permisos de lectura de esquema.

  3. Compruebe si CACHE_ENABLED está configurado como true.

Modo de depuración

Habilitar registros de depuración:

export OBSERVABILITY_LOG_LEVEL=DEBUG
uv run python main.py

Configuración de Claude Desktop

Configuración en macOS/Linux

Edite ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/yourname/projects/pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_PORT": "5432",
        "DATABASE_NAME": "mydb",
        "DATABASE_USER": "postgres",
        "DATABASE_PASSWORD": "your-password",
        "OPENAI_API_KEY": "sk-your-api-key-here",
        "OPENAI_MODEL": "gpt-5.2-mini",
        "SECURITY_MAX_ROWS": "10000",
        "CACHE_ENABLED": "true",
        "OBSERVABILITY_LOG_LEVEL": "INFO"
      }
    }
  }
}

Configuración en Windows

Edite %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "--directory",
        "C:\\Users\\YourName\\projects\\pg-mcp",
        "run",
        "python",
        "main.py"
      ],
      "env": {
        "DATABASE_HOST": "localhost",
        "DATABASE_NAME": "mydb",
        "DATABASE_USER": "postgres",
        "DATABASE_PASSWORD": "your-password",
        "OPENAI_API_KEY": "sk-your-api-key-here"
      }
    }
  }
}

Uso de Python Virtualenv

Si no utiliza UV, configure Python directamente:

{
  "mcpServers": {
    "postgres": {
      "command": "/absolute/path/to/pg-mcp/.venv/bin/python",
      "args": ["main.py"],
      "cwd": "/absolute/path/to/pg-mcp",
      "env": {
        "DATABASE_HOST": "localhost",
        ...
      }
    }
  }
}

Reiniciar Claude Desktop

Después de editar la configuración:

  1. Cierre completamente Claude Desktop.

  2. Reinicie Claude Desktop.

  3. El servidor MCP de PostgreSQL estará disponible.

Consideraciones de seguridad

Despliegue en producción

  1. Utilice un usuario de base de datos de solo lectura: Cree un usuario de PostgreSQL dedicado con permisos solo de SELECT:

CREATE USER pg_mcp_readonly WITH PASSWORD 'secure-password';
GRANT CONNECT ON DATABASE your_database TO pg_mcp_readonly;
GRANT USAGE ON SCHEMA public TO pg_mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO pg_mcp_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO pg_mcp_readonly;
  1. Proteja la clave de API: Utilice variables de entorno o sistemas de gestión de secretos; nunca las envíe al control de versiones.

  2. Aislamiento de red: Ejecute el servidor en una red aislada, limitando el acceso a la base de datos por IP.

  3. Monitoree el uso: Habilite métricas y configure alertas para patrones inusuales.

  4. Limitación de tasa: Configure parámetros de limitación de tasa adecuados para evitar abusos.

  5. Limpieza de registros: Los datos sensibles se filtran automáticamente de los registros.

Licencia

[Su información de licencia]

Contribución

¡Las contribuciones son bienvenidas! Consulte CONTRIBUTING.md para conocer las directrices.

Soporte

Para preguntas y dudas:

  • GitHub Issues: [repository-url]/issues

  • Documentación: Consulte el directorio specs/w5/ para obtener documentos de diseño detallados.

Agradecimientos

Install Server
F
license - not found
B
quality
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Tools

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables secure read-only interactions with PostgreSQL databases through natural language. Provides database inspection, table listing, and SQL query execution with built-in security validation.
  • A
    license
    A
    quality
    A
    maintenance
    Enables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.
    3
    195
    2
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/lastfore/pg-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server