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/для получения подробной проектной документации
Благодарности
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
- -license-quality-maintenanceEnables secure read-only interactions with PostgreSQL databases through natural language. Provides database inspection, table listing, and SQL query execution with built-in security validation.Last updated
- AlicenseAqualityAmaintenanceEnables read-only interaction with PostgreSQL databases through natural language queries, supporting dynamic connections and secure query validation.Last updated32112MIT
- Flicense-qualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases through natural language queries, schema inspection, and safe SQL execution.Last updated151
- Alicense-qualityDmaintenanceEnables natural language querying of PostgreSQL databases with intelligent SQL generation using LLMs.Last updated1Apache 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