Skip to main content
Glama
lastfore

PostgreSQL MCP Server

by lastfore

PostgreSQL MCP Server

Сервер Model Context Protocol (MCP) промышленного уровня, позволяющий пользователям взаимодействовать с базами данных PostgreSQL на естественном языке. Сервер построен на базе FastMCP, преобразует вопросы на естественном языке в безопасные SQL-запросы, выполняет их и проверяет результаты. Некоторые справочные документы:

Функциональные возможности

  • Естественный язык в 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)       │
                                           └──────────────┘

Функции безопасности

  1. Принудительный режим «только чтение»: по умолчанию разрешены только запросы SELECT

  2. Блокировка опасных функций: черный список включает опасные функции PostgreSQL (pg_sleep, ввод-вывод файлов и т.д.)

  3. Парсинг SQL: использование sqlglot для точной проверки структуры SQL

  4. Защита от инъекций: параметризованные запросы и очистка входных данных

  5. Ограничение ресурсов:

    • Ограничение количества строк (по умолчанию: 10 000)

    • Тайм-аут запроса (по умолчанию: 30 секунд)

    • Управление пулом соединений

  6. Изоляция транзакций: все запросы выполняются в транзакциях «только чтение»

Функции отказоустойчивости

  • Автоматические выключатели: предотвращение каскадных сбоев API LLM

  • Ограничение частоты запросов: предотвращение исчерпания квот API

  • Логика повторных попыток: автоматический повтор при кратковременных сбоях с использованием экспоненциальной задержки

  • Пул соединений: эффективное повторное использование соединений с базой данных

  • Кэширование схемы: кэширование на основе TTL для уменьшения количества запросов к метаданным базы данных

Справочник конфигурации

Настройки базы данных

Переменная

Описание

Значение по умолчанию

DATABASE_HOST

Хост PostgreSQL

localhost

DATABASE_PORT

Порт PostgreSQL

5432

DATABASE_NAME

Имя базы данных

Обязательно

DATABASE_USER

Пользователь БД

Обязательно

DATABASE_PASSWORD

Пароль БД

Обязательно

DATABASE_MIN_POOL_SIZE

Мин. размер пула

5

DATABASE_MAX_POOL_SIZE

Макс. размер пула

20

DATABASE_COMMAND_TIMEOUT

Тайм-аут запроса (сек)

30

Настройки OpenAI

Переменная

Описание

Значение по умолчанию

OPENAI_API_KEY

API-ключ OpenAI

Обязательно

OPENAI_MODEL

Используемая модель

gpt-5.2-mini

OPENAI_MAX_TOKENS

Макс. токенов на запрос

32000

OPENAI_TEMPERATURE

Температура модели

0.0

OPENAI_TIMEOUT

Тайм-аут API (сек)

30

Настройки безопасности

Переменная

Описание

Значение по умолчанию

SECURITY_ALLOW_WRITE_OPERATIONS

Разрешить INSERT/UPDATE/DELETE

false

SECURITY_BLOCKED_FUNCTIONS

Черный список функций (через запятую)

См. .env.example

SECURITY_MAX_ROWS

Макс. строк на запрос

10000

SECURITY_MAX_EXECUTION_TIME

Тайм-аут запроса (сек)

30

Настройки кэширования

Переменная

Описание

Значение по умолчанию

CACHE_ENABLED

Включить кэш схемы

true

CACHE_SCHEMA_TTL

TTL кэша схемы (сек)

3600

CACHE_MAX_SIZE

Макс. кол-во схем в кэше

100

Настройки отказоустойчивости

Переменная

Описание

Значение по умолчанию

RESILIENCE_MAX_RETRIES

Макс. кол-во повторов

3

RESILIENCE_RETRY_DELAY

Начальная задержка (сек)

1.0

RESILIENCE_BACKOFF_FACTOR

Множитель экспоненциальной задержки

2.0

RESILIENCE_CIRCUIT_BREAKER_THRESHOLD

Сбоев до размыкания цепи

5

RESILIENCE_CIRCUIT_BREAKER_TIMEOUT

Тайм-аут размыкания (сек)

60

Настройки наблюдаемости

Переменная

Описание

Значение по умолчанию

OBSERVABILITY_METRICS_ENABLED

Включить метрики Prometheus

true

OBSERVABILITY_METRICS_PORT

HTTP-порт метрик

9090

OBSERVABILITY_LOG_LEVEL

Уровень логирования

INFO

OBSERVABILITY_LOG_FORMAT

Формат логов (json/text)

json

Разработка

Настройка среды разработки

# 安装开发依赖
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:latest

Docker 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 - время генерации SQL

  • pg_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

Решение:

  1. Проверьте, что API-ключ действителен и имеет средства

  2. Проверьте сетевое соединение

  3. Если запрос превышает время ожидания, проверьте настройку OPENAI_TIMEOUT

Тайм-аут запроса

Error: Query execution timeout exceeded

Решение:

  1. Увеличьте SECURITY_MAX_EXECUTION_TIME

  2. Оптимизируйте базу данных (добавьте индексы, VACUUM)

  3. Упростите запрос или добавьте условия фильтрации

Проблемы с кэшем схемы

Error: Schema not found in cache

Решение:

  1. Перезапустите сервер для перезагрузки схемы

  2. Убедитесь, что пользователь БД имеет права на чтение схемы

  3. Проверьте, что 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

После редактирования конфигурации:

  1. Полностью закройте Claude Desktop

  2. Перезапустите Claude Desktop

  3. PostgreSQL MCP Server станет доступен

Вопросы безопасности

Развертывание в промышленной среде

  1. Используйте пользователя БД с правами только на чтение: создайте выделенного пользователя 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;
  1. Защитите API-ключи: используйте переменные окружения или системы управления секретами, никогда не фиксируйте их в системе контроля версий

  2. Сетевая изоляция: запускайте сервер в изолированной сети, ограничивая доступ к базе данных по IP

  3. Мониторинг использования: включите метрики и настройте оповещения для аномальных паттернов

  4. Ограничение частоты запросов: настройте соответствующие параметры для предотвращения злоупотреблений

  5. Очистка логов: конфиденциальные данные автоматически фильтруются из логов

Лицензия

[Ваша информация о лицензии]

Вклад в проект

Вклад приветствуется! Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения руководств.

Поддержка

При возникновении вопросов:

  • GitHub Issues: [repository-url]/issues

  • Документация: см. каталог specs/w5/ для получения подробной проектной документации

Благодарности

  • Построено на базе FastMCP

  • Парсинг SQL предоставлен sqlglot

  • Драйвер базы данных: asyncpg

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

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