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
Available Tools
1 tooladdA
Add two numbers
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Add two numbers' accurately and sufficiently communicates a pure arithmetic operation, with no indication of side effects or hidden behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four words long, contains zero filler, and conveys the complete operation. It is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-integer addition tool with an output schema and no siblings, this description is nearly complete. It could mention the return value or pure behavior explicitly, but the output schema and inherent simplicity reduce that need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that both parameters are numbers to be added, but it does not name them or describe each parameter individually. Since addition is commutative, the lack of role differentiation is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb ('add') and a clear resource ('two numbers'), making the tool's purpose immediately obvious. With no sibling tools, there is no ambiguity to resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: this tool is for summing two numbers. It does not explicitly discuss when not to use it, but with no sibling tools and only two integer parameters, the context is straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.2.1- First observed
add
TDQS
Scored across 1 tool
Only one tool exists, so no ambiguity between tools.
With a single tool, naming consistency is inherently maintained.
A single trivial arithmetic tool is extremely thin for a PostgreSQL MCP server, fitting the description of an extreme mismatch.
The server's name suggests database-related functionality, but the only tool adds two numbers, leaving the entire database surface missing.
Maintenance
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Deterministic safety, correctness & cost gate that vets Postgres SQL before your AI agent runs it.
Query Postgres, MySQL, SQL Server, Oracle, BigQuery, ClickHouse and Redshift from your AI client.
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
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.-
- AlicenseAqualityBmaintenanceEnables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.3134 npm2MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases through natural language queries, schema inspection, and safe SQL execution.6 npm1-
- FlicenseNot gradedqualityDmaintenanceConverts natural language to safe SQL queries for PostgreSQL databases with read-only access and multi-layer security validation. Provides tools for running validated SELECT queries, retrieving schema, and sampling table data.-