PostgreSQL MCP Server
PostgreSQL MCP Server
Сервер Model Context Protocol (MCP) промышленного уровня, позволяющий пользователям взаимодействовать с базами данных PostgreSQL на естественном языке. Сервер построен на базе FastMCP, преобразует вопросы на естественном языке в безопасные SQL-запросы, выполняет их и проверяет результаты. Некоторые справочные документы:
Исследование требований Python Postgres MCP : https://gemini.google.com/share/c87a73f0969b
План глубокого исследования SQLGlot : https://gemini.google.com/share/cc5e45c76c8f
Функциональные возможности
Естественный язык в SQL: использование GPT-5.2-mini для преобразования обычных вопросов на английском языке в оптимизированные запросы PostgreSQL
Безопасность прежде всего: принудительный режим «только чтение», блокировка опасных функций, защита от SQL-инъекций, контроль времени выполнения запросов
Проверка результатов: проверка результатов на основе ИИ с предоставлением оценки достоверности
Интеллектуальная схема: автоматическое кэширование схемы, механизм обновления на основе TTL
Готовность к эксплуатации: управление пулом соединений, автоматические выключатели (circuit breakers), ограничение частоты запросов (rate limiting), комплексный сбор метрик
Совместимость с MCP: поддержка Claude Desktop и любого клиента, совместимого с MCP
Related MCP server: PostgreSQL MCP Server
Быстрый старт
Предварительные требования
Python 3.14+
PostgreSQL 12+
API-ключ OpenAI (для GPT-5.2-mini)
Менеджер пакетов UV (рекомендуется) или pip
Установка
Использование UV (рекомендуется)
# 克隆仓库
git clone <repository-url>
cd pg-mcp
# 安装依赖
uv sync
# 复制环境配置模板
cp .env.example .env
# 编辑 .env 并配置参数
vi .envИспользование 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Конфигурация
Отредактируйте файл .env для настройки параметров:
# 数据库配置
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Полный список параметров конфигурации см. в .env.example.
Запуск сервера
Автономный режим
# 使用 UV
uv run python main.py
# 或使用 pip
python main.pyИнтеграция с Claude Desktop
Добавьте следующую конфигурацию в файл настроек MCP для 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"
}
}
}
}Подробные инструкции по настройке см. в разделе Конфигурация Claude Desktop.
Использование
Примеры запросов
После подключения через Claude Desktop или другой MCP-клиент вы можете задавать вопросы на естественном языке:
Простой запрос
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'Аналитический запрос
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'Режим «только SQL»
Вы также можете запросить только SQL без выполнения:
Generate SQL to find duplicate emails
Return Type: sql
→ Returns: SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1Типы возвращаемых данных
Сервер поддерживает два типа возвращаемых данных:
result(по умолчанию): выполнение запроса и возврат результатовsql: генерация и проверка SQL без выполнения
Формат ответа
Ответ при успешном запросе
{
"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
}Ответ в режиме «только SQL»
{
"success": true,
"generated_sql": "SELECT * FROM users WHERE created_at > CURRENT_DATE - INTERVAL '30 days'",
"confidence": 90,
"tokens_used": 156
}Ответ об ошибке
{
"success": false,
"error": {
"code": "SECURITY_VIOLATION",
"message": "Query contains blocked operation: DELETE",
"details": {
"blocked_operation": "DELETE"
}
}
}Архитектура
Основные компоненты
┌─────────────────────────────────────────────────────────────┐
│ 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) │
└──────────────┘Функции безопасности
Принудительный режим «только чтение»: по умолчанию разрешены только запросы SELECT
Блокировка опасных функций: черный список включает опасные функции PostgreSQL (pg_sleep, ввод-вывод файлов и т.д.)
Парсинг SQL: использование sqlglot для точной проверки структуры SQL
Защита от инъекций: параметризованные запросы и очистка входных данных
Ограничение ресурсов:
Ограничение количества строк (по умолчанию: 10 000)
Тайм-аут запроса (по умолчанию: 30 секунд)
Управление пулом соединений
Изоляция транзакций: все запросы выполняются в транзакциях «только чтение»
Функции отказоустойчивости
Автоматические выключатели: предотвращение каскадных сбоев API LLM
Ограничение частоты запросов: предотвращение исчерпания квот API
Логика повторных попыток: автоматический повтор при кратковременных сбоях с использованием экспоненциальной задержки
Пул соединений: эффективное повторное использование соединений с базой данных
Кэширование схемы: кэширование на основе TTL для уменьшения количества запросов к метаданным базы данных
Справочник конфигурации
Настройки базы данных
Переменная | Описание | Значение по умолчанию |
| Хост PostgreSQL |
|
| Порт PostgreSQL |
|
| Имя базы данных | Обязательно |
| Пользователь БД | Обязательно |
| Пароль БД | Обязательно |
| Мин. размер пула |
|
| Макс. размер пула |
|
| Тайм-аут запроса (сек) |
|
Настройки OpenAI
Переменная | Описание | Значение по умолчанию |
| API-ключ OpenAI | Обязательно |
| Используемая модель |
|
| Макс. токенов на запрос |
|
| Температура модели |
|
| Тайм-аут API (сек) |
|
Настройки безопасности
Переменная | Описание | Значение по умолчанию |
| Разрешить INSERT/UPDATE/DELETE |
|
| Черный список функций (через запятую) | См. .env.example |
| Макс. строк на запрос |
|
| Тайм-аут запроса (сек) |
|
Настройки кэширования
Переменная | Описание | Значение по умолчанию |
| Включить кэш схемы |
|
| TTL кэша схемы (сек) |
|
| Макс. кол-во схем в кэше |
|
Настройки отказоустойчивости
Переменная | Описание | Значение по умолчанию |
| Макс. кол-во повторов |
|
| Начальная задержка (сек) |
|
| Множитель экспоненциальной задержки |
|
| Сбоев до размыкания цепи |
|
| Тайм-аут размыкания (сек) |
|
Настройки наблюдаемости
Переменная | Описание | Значение по умолчанию |
| Включить метрики Prometheus |
|
| HTTP-порт метрик |
|
| Уровень логирования |
|
| Формат логов (json/text) |
|
Разработка
Настройка среды разработки
# 安装开发依赖
uv sync --all-extras
# 安装 pre-commit 钩子(可选)
pre-commit installЗапуск тестов
# 运行所有测试
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 # 标记为集成的测试Качество кода
# 类型检查
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 .Структура проекта
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 # 入口点Развертывание в Docker
Сборка образа
docker build -t pg-mcp:latest .Запуск контейнера
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 downПодробную конфигурацию см. в docker-compose.yml.
Мониторинг
Метрики
Сервер предоставляет метрики Prometheus на порту 9090 (настраивается):
curl http://localhost:9090/metricsДоступные метрики:
pg_mcp_queries_total- общее количество обработанных запросовpg_mcp_query_duration_seconds- гистограмма времени выполнения запросовpg_mcp_sql_generation_duration_seconds- время генерации SQLpg_mcp_sql_validation_failures_total- количество сбоев проверкиpg_mcp_database_errors_total- количество ошибок базы данныхpg_mcp_llm_tokens_used_total- общее количество использованных токенов LLM
Логи
Структурированные JSON-логи (или текстовый формат) выводятся в стандартный поток вывода:
{
"timestamp": "2025-12-20T10:30:00.123Z",
"level": "INFO",
"message": "Query executed successfully",
"database": "mydb",
"execution_time": 0.023,
"row_count": 42
}Устранение неполадок
Часто задаваемые вопросы
Отказ в соединении
Error: Connection to database failedРешение: убедитесь, что PostgreSQL запущен и учетные данные верны:
psql -h $DATABASE_HOST -U $DATABASE_USER -d $DATABASE_NAMEОшибка API OpenAI
Error: OpenAI API request failedРешение:
Проверьте, что API-ключ действителен и имеет средства
Проверьте сетевое соединение
Если запрос превышает время ожидания, проверьте настройку
OPENAI_TIMEOUT
Тайм-аут запроса
Error: Query execution timeout exceededРешение:
Увеличьте
SECURITY_MAX_EXECUTION_TIMEОптимизируйте базу данных (добавьте индексы, VACUUM)
Упростите запрос или добавьте условия фильтрации
Проблемы с кэшем схемы
Error: Schema not found in cacheРешение:
Перезапустите сервер для перезагрузки схемы
Убедитесь, что пользователь БД имеет права на чтение схемы
Проверьте, что
CACHE_ENABLEDустановлено вtrue
Режим отладки
Включение отладочных логов:
export OBSERVABILITY_LOG_LEVEL=DEBUG
uv run python main.pyКонфигурация Claude Desktop
Конфигурация macOS/Linux
Отредактируйте ~/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"
}
}
}
}Конфигурация Windows
Отредактируйте %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"
}
}
}
}Использование Python Virtualenv
Если вы не используете UV, настройте Python напрямую:
{
"mcpServers": {
"postgres": {
"command": "/absolute/path/to/pg-mcp/.venv/bin/python",
"args": ["main.py"],
"cwd": "/absolute/path/to/pg-mcp",
"env": {
"DATABASE_HOST": "localhost",
...
}
}
}
}Перезапуск Claude Desktop
После редактирования конфигурации:
Полностью закройте Claude Desktop
Перезапустите Claude Desktop
PostgreSQL MCP Server станет доступен
Вопросы безопасности
Развертывание в промышленной среде
Используйте пользователя БД с правами только на чтение: создайте выделенного пользователя PostgreSQL, имеющего только права 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;Защитите API-ключи: используйте переменные окружения или системы управления секретами, никогда не фиксируйте их в системе контроля версий
Сетевая изоляция: запускайте сервер в изолированной сети, ограничивая доступ к базе данных по IP
Мониторинг использования: включите метрики и настройте оповещения для аномальных паттернов
Ограничение частоты запросов: настройте соответствующие параметры для предотвращения злоупотреблений
Очистка логов: конфиденциальные данные автоматически фильтруются из логов
Лицензия
[Ваша информация о лицензии]
Вклад в проект
Вклад приветствуется! Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения руководств.
Поддержка
При возникновении вопросов:
GitHub Issues: [repository-url]/issues
Документация: см. каталог
specs/w5/для получения подробной проектной документации
Благодарности
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.-