PostgreSQL MCP Server
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:
Investigación de requisitos de Python Postgres MCP : https://gemini.google.com/share/c87a73f0969b
Esquema de investigación profunda de SQLGlot : https://gemini.google.com/share/cc5e45c76c8f
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 .envUsando 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 .envConfiguració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=30Para 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.pyIntegració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(*) > 1Tipos 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
Ejecución forzada de solo lectura: Por defecto, solo permite consultas SELECT.
Bloqueo de funciones peligrosas: La lista negra incluye funciones peligrosas de PostgreSQL (pg_sleep, E/S de archivos, etc.).
Análisis SQL: Utiliza sqlglot para una validación precisa de la estructura SQL.
Protección contra inyección: Consultas parametrizadas y limpieza de entradas.
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
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 |
| Host de PostgreSQL |
|
| Puerto de PostgreSQL |
|
| Nombre de la base de datos | Requerido |
| Usuario de la base de datos | Requerido |
| Contraseña de la base de datos | Requerido |
| Conexiones mínimas en el pool |
|
| Conexiones máximas en el pool |
|
| Tiempo de espera de consulta (seg) |
|
Ajustes de OpenAI
Variable | Descripción | Valor predeterminado |
| Clave de API de OpenAI | Requerido |
| Modelo utilizado |
|
| Máximo de tokens por solicitud |
|
| Temperatura del modelo |
|
| Tiempo de espera de API (seg) |
|
Ajustes de seguridad
Variable | Descripción | Valor predeterminado |
| Permitir INSERT/UPDATE/DELETE |
|
| Lista negra de funciones separada por comas | Ver .env.example |
| Máximo de filas por consulta |
|
| Tiempo de espera de consulta (seg) |
|
Ajustes de caché
Variable | Descripción | Valor predeterminado |
| Habilitar caché de esquema |
|
| TTL de caché de esquema (seg) |
|
| Número máximo de esquemas en caché |
|
Ajustes de resiliencia
Variable | Descripción | Valor predeterminado |
| Máximo de reintentos |
|
| Retraso inicial de reintento (seg) |
|
| Factor de retroceso exponencial |
|
| Fallos antes de abrir el disyuntor |
|
| Tiempo de espera del disyuntor (seg) |
|
Ajustes de observabilidad
Variable | Descripción | Valor predeterminado |
| Habilitar métricas de Prometheus |
|
| Puerto HTTP de métricas |
|
| Nivel de registro |
|
| Formato de registro (json/text) |
|
Desarrollo
Configuración del entorno de desarrollo
# 安装开发依赖
uv sync --all-extras
# 安装 pre-commit 钩子(可选)
pre-commit installEjecució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:latestDocker Compose
# 启动所有服务(PostgreSQL + pg-mcp)
docker-compose up -d
# 查看日志
docker-compose logs -f pg-mcp
# 停止服务
docker-compose downConsulte 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/metricsMétricas disponibles:
pg_mcp_queries_total- Número total de consultas procesadaspg_mcp_query_duration_seconds- Histograma de tiempo de ejecución de consultaspg_mcp_sql_generation_duration_seconds- Tiempo de generación de SQLpg_mcp_sql_validation_failures_total- Número de fallos de validaciónpg_mcp_database_errors_total- Número de errores de base de datospg_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 failedSolución: Verifique que PostgreSQL esté ejecutándose y que las credenciales sean correctas:
psql -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAMEError de API de OpenAI
Error: OpenAI API request failedSolución:
Compruebe que la clave de API sea válida y tenga saldo.
Verifique la conexión de red.
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 exceededSolución:
Aumente
SECURITY_MAX_EXECUTION_TIME.Optimice la base de datos (añada índices, VACUUM).
Simplifique la consulta o añada condiciones de filtrado.
Problemas con la caché de esquema
Error: Schema not found in cacheSolución:
Reinicie el servidor para recargar el esquema.
Verifique que el usuario de la base de datos tenga permisos de lectura de esquema.
Compruebe si
CACHE_ENABLEDestá configurado comotrue.
Modo de depuración
Habilitar registros de depuración:
export OBSERVABILITY_LOG_LEVEL=DEBUG
uv run python main.pyConfiguració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:
Cierre completamente Claude Desktop.
Reinicie Claude Desktop.
El servidor MCP de PostgreSQL estará disponible.
Consideraciones de seguridad
Despliegue en producción
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;Proteja la clave de API: Utilice variables de entorno o sistemas de gestión de secretos; nunca las envíe al control de versiones.
Aislamiento de red: Ejecute el servidor en una red aislada, limitando el acceso a la base de datos por IP.
Monitoree el uso: Habilite métricas y configure alertas para patrones inusuales.
Limitación de tasa: Configure parámetros de limitación de tasa adecuados para evitar abusos.
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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
- addB
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables secure read-only interactions with PostgreSQL databases through natural language. Provides database inspection, table listing, and SQL query execution with built-in security validation.
- AlicenseAqualityAmaintenanceEnables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.31952MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases through natural language queries, schema inspection, and safe SQL execution.91
- AlicenseNot gradedqualityDmaintenanceEnables natural language querying of PostgreSQL databases with intelligent SQL generation using LLMs.1Apache 2.0
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
Comprehensive PostgreSQL documentation and best practices, including ecosystem tools
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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