MCP-серверы для PostgreSQL: обзор, настройка и безопасность

Обновлено:

У PostgreSQL богатые метаданные: системные каталоги, pg_stat_*, планы выполнения, расширения. MCP-сервер даёт AI-агенту доступ ко всему этому напрямую: агент сам смотрит схему, выполняет запросы, читает EXPLAIN и предлагает индексы. Ниже — какие MCP-серверы для PostgreSQL стоит рассмотреть, как их подключить и как не дать агенту навредить базе.

Экосистема MCP меняется быстро: названия пакетов, флаги и набор инструментов у серверов обновляются. Перед установкой сверяйтесь с README в репозитории.

Что MCP даёт разработчику PostgreSQL

Без MCP AI знает о вашей базе только то, что вы вставите в чат: DDL, вывод pg_stat_statements, EXPLAIN ANALYZE. Это долго и неполно.

С MCP агент может:

  • видеть реальную схему таблиц, индексов, представлений и функций;
  • выполнять SELECT-запросы для анализа данных;
  • читать метрики из pg_stat_*;
  • разбирать планы выполнения и предлагать оптимизации;
  • в зависимости от сервера и режима — создавать таблицы, индексы и применять миграции.

Обзор MCP-серверов для PostgreSQL

1. Postgres MCP Pro (Crystal DBA)

Репозиторий: github.com/crystaldba/postgres-mcp, Docker-образ: crystaldba/postgres-mcp.

Открытый сервер, ориентированный на анализ и настройку производительности, а не только на выполнение запросов.

Основные возможности:

  • рекомендации по индексам на основе нагрузки из pg_stat_statements;
  • получение и разбор планов выполнения;
  • проверки здоровья базы: vacuum, bloat, cache hit ratio, долгие транзакции и т. п.;
  • два режима доступа: restricted (только чтение, запросы в read-only транзакциях) и unrestricted.

Конфигурация для Claude Desktop:

{
  "mcpServers": {
    "postgres-pro": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "DATABASE_URI",
        "crystaldba/postgres-mcp",
        "--access-mode=restricted"
      ],
      "env": {
        "DATABASE_URI": "postgresql://mcp_reader:password@host.docker.internal:5432/mydb"
      }
    }
  }
}

Для production используйте restricted. Примеры запросов к агенту:

— Какие запросы занимают больше всего времени?
— Есть ли неиспользуемые индексы?
— Объясни, почему этот запрос медленный:
  SELECT * FROM orders o JOIN users u ON o.user_id = u.id
  WHERE o.created_at > NOW() - INTERVAL '7 days'
— Предложи индексы для таблицы orders.

2. pgEdge Postgres MCP Server

Компания pgEdge выпустила собственный MCP-сервер для PostgreSQL с открытым кодом. Он работает со стандартным PostgreSQL и с дистрибутивами pgEdge. Набор возможностей, формат конфигурации и поддерживаемые версии PostgreSQL смотрите в актуальном репозитории pgEdge на GitHub — проект молодой и меняется.

Имеет смысл, если вы уже используете pgEdge или вам нужна поддержка от вендора.

3. Supabase MCP Server

Пакет: @supabase/mcp-server-supabase, документация — в разделе MCP на supabase.com.

Если проект на Supabase, официальный сервер — очевидный выбор: он работает не только с базой, но и с платформой. Среди инструментов: просмотр таблиц и расширений, выполнение SQL, применение миграций, логи, рекомендации советников по безопасности и производительности, генерация TypeScript-типов, работа с Edge Functions. Есть флаг --read-only и привязка к одному проекту через --project-ref.

Подключение использует персональный токен доступа (Dashboard → Account → Access Tokens), а не service role key:

{
  "mcpServers": {
    "supabase": {
      "command": "npx",
      "args": [
        "-y",
        "@supabase/mcp-server-supabase@latest",
        "--read-only",
        "--project-ref=<project-ref>"
      ],
      "env": {
        "SUPABASE_ACCESS_TOKEN": "<personal-access-token>"
      }
    }
  }
}

Supabase также предлагает удалённый (hosted) MCP-сервер с авторизацией через браузер — проверьте актуальный способ подключения в документации.

Примеры запросов:

— Создай миграцию: таблица posts (id, title, content, author_id → users, published, created_at)
— Добавь RLS-политику: пользователь видит свои посты и все опубликованные
— Найди таблицы без включённого RLS

Если вы ищете замену Supabase с хостингом в России, посмотрите аналоги Supabase.

4. Референсный сервер @modelcontextprotocol/server-postgres

Ранее в репозитории modelcontextprotocol/servers был простой референсный сервер для PostgreSQL: список таблиц, схема и выполнение запросов в read-only транзакции. Сейчас он перенесён в архив и не поддерживается. Он встречается во множестве старых инструкций, но для новых проектов лучше выбрать поддерживаемый сервер из списка выше.

5. MCP Toolbox for Databases (Google)

Открытый проект Google (googleapis/genai-toolbox). Работает с Cloud SQL, AlloyDB и обычным PostgreSQL, а также с другими СУБД. Инструменты описываются в конфигурационном файле tools.yaml: вы сами задаёте, какие именно SQL-запросы может вызывать агент. Это удобно, когда нужно дать агенту ограниченный набор заранее одобренных операций вместо произвольного SQL.

Подходит командам в Google Cloud и тем, кому нужен строгий контроль над тем, что выполняет агент.

Сравнение

| Параметр | Postgres MCP Pro | Supabase MCP | MCP Toolbox | Референсный сервер | |---|---|---|---|---| | Анализ производительности | Да, основной фокус | Советники Supabase | Если описать инструменты | Нет | | Рекомендации по индексам | Да | Нет | Нет | Нет | | Read-only режим | --access-mode=restricted | --read-only | Определяется набором инструментов | Да | | Миграции и DDL | В unrestricted-режиме | Да | Если описать инструменты | Нет | | Привязка к платформе | Любой PostgreSQL | Только Supabase | Любой PostgreSQL, GCP | Любой PostgreSQL | | Статус | Поддерживается | Поддерживается | Поддерживается | В архиве |

Как выбрать

  • Оптимизация и работа DBA — Postgres MCP Pro.
  • Проект на Supabase — Supabase MCP.
  • Нужен фиксированный набор разрешённых запросов или GCP — MCP Toolbox for Databases.
  • Используете pgEdge — сервер pgEdge.

Пошаговая настройка Postgres MCP Pro

Шаг 1. Создайте read-only пользователя

CREATE ROLE mcp_reader WITH LOGIN PASSWORD 'secure-random-password';

GRANT CONNECT ON DATABASE mydb TO mcp_reader;
GRANT USAGE ON SCHEMA public TO mcp_reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_reader;

-- Доступ к системной статистике для анализа производительности
GRANT pg_monitor TO mcp_reader;

ALTER DEFAULT PRIVILEGES действует только на таблицы, которые в будущем создаст роль, выполнившая команду. Если миграции запускает другая роль, добавьте FOR ROLE <migration_role>.

Шаг 2. Проверьте подключение

docker pull crystaldba/postgres-mcp

docker run -it --rm \
  -e DATABASE_URI="postgresql://mcp_reader:secure-password@host.docker.internal:5432/mydb" \
  crystaldba/postgres-mcp \
  --access-mode=restricted

Шаг 3. Подключите MCP-клиент

Claude Desktop: файл ~/Library/Application Support/Claude/claude_desktop_config.json на macOS или %APPDATA%\Claude\claude_desktop_config.json на Windows. Конфигурация — как в примере выше.

Claude Code:

claude mcp add postgres-pro \
  -e DATABASE_URI="postgresql://mcp_reader:secure-password@host.docker.internal:5432/mydb" \
  -- docker run -i --rm -e DATABASE_URI crystaldba/postgres-mcp --access-mode=restricted

При запуске в Docker на macOS и Windows используйте host.docker.internal вместо localhost, чтобы достучаться до PostgreSQL на хост-машине. На Linux добавьте --add-host=host.docker.internal:host-gateway или используйте сеть Docker.

Шаг 4. Проверьте

Перезапустите клиент и попросите: «Покажи все таблицы в базе». Если агент вернул список — сервер работает.

Продвинутые сценарии

Аудит базы

— Какие роли имеют права superuser?
— Есть ли таблицы без первичных ключей?
— Какие индексы не используются (idx_scan = 0)?
— Какие запросы в среднем выполняются дольше секунды?

Производительность

— Какие таблицы требуют VACUUM? Оцени bloat.
— Есть ли дублирующиеся индексы?
— Какой cache hit ratio? Хватает ли shared_buffers?

Разработка

— Спроектируй таблицу аудита: кто, что, когда, откуда.
— Предложи индексы под фильтрацию по user_id, created_at и status.
— Как хранить дерево категорий: ltree, adjacency list или closure table?

Безопасность

Отдельный пользователь с минимальными правами обязателен. Никогда не подключайте MCP под postgres или другим суперпользователем.

CREATE ROLE mcp_ai WITH LOGIN PASSWORD 'long-random-password';
GRANT CONNECT ON DATABASE production TO mcp_ai;
GRANT USAGE ON SCHEMA public TO mcp_ai;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_ai;
GRANT pg_monitor TO mcp_ai;

-- Защита от тяжёлых запросов агента
ALTER ROLE mcp_ai SET statement_timeout = '30s';
ALTER ROLE mcp_ai SET default_transaction_read_only = on;

default_transaction_read_only — дополнительная страховка, но не замена правам: пользователь может переключить её в своей сессии. Основная защита — отсутствие прав на запись.

Подключайтесь по TLS, если база доступна по сети:

postgresql://mcp_ai:password@db.example.com:5432/mydb?sslmode=require

Не открывайте PostgreSQL в интернет ради MCP. Используйте VPN, приватную сеть или SSH-туннель:

ssh -N -L 5433:localhost:5432 user@db-server.example.com
# затем DATABASE_URI="postgresql://mcp_ai:password@localhost:5433/mydb"

Для агентов с правом записи держите включённым ручное подтверждение каждого вызова инструмента и не давайте им доступ к production без необходимости. Подробнее о рисках — в статье что делать, если ИИ стёр базу данных.

Резервное копирование PostgreSQL при работе с агентами

Даже read-only агент может предложить DROP или «исправляющую» миграцию, которую вы подтвердите не глядя. Поэтому перед тем как дать агенту права на запись, настройте регулярный pg_dump и проверьте восстановление.

Минимальный вариант — дамп в plain SQL перед рискованной сессией и по расписанию:

pg_dump --format=plain --no-owner "$DATABASE_URL" > /var/backups/mydb.sql

Расписание через cron, выгрузка в Yandex Object Storage или Selectel и ротация разобраны в статье бэкап PostgreSQL через pg_dump в S3.

dbsend не подключается к вашему серверу и не запускает pg_dump сам: вы делаете дамп на своей стороне, а CLI загружает его как новую версию:

dbsend backup /var/backups/mydb.sql -d "$DBSEND_DATABASE_ID" -e postgresql_dump -l before-agent-session

Для plain-дампов dbsend показывает схему, таблицы и число строк и сравнивает версии — видно, что изменилось после сессии с агентом. У dbsend есть и собственный MCP-сервер: агент может проверить статус бэкапов и найти нужную версию, а скачивание для восстановления требует явного подтверждения. Подробнее — на странице бэкапы через MCP и в статье бэкапы базы через MCP из Claude Code и Cursor.

Частые вопросы

Какой MCP-сервер для PostgreSQL выбрать?

Для анализа и оптимизации — Postgres MCP Pro. Для проектов на Supabase — Supabase MCP. Для строго ограниченного набора запросов и GCP — MCP Toolbox for Databases. Референсный сервер из modelcontextprotocol/servers в архиве, для новых проектов его лучше не брать.

Работает ли MCP с managed PostgreSQL (Yandex Cloud, Selectel, RDS, Cloud SQL)?

Да, MCP-серверы подключаются по обычной строке подключения. Нужно обеспечить сетевой доступ (лучше через приватную сеть или туннель) и TLS, а пользователю выдать только нужные права.

Как проверить, что MCP-сервер подключился?

Перезапустите клиент и попросите показать список таблиц. В Claude Code состояние серверов видно по команде /mcp. Логи Claude Desktop на macOS лежат в ~/Library/Logs/Claude/ (файлы mcp*.log).

Может ли агент через MCP изменить структуру таблиц?

Если у пользователя базы нет прав на DDL, а сервер запущен в read-only режиме, — нет. В unrestricted-режиме и с правами на запись — да. Для production используйте read-only, а запись разрешайте только в dev-окружении.

Работает ли Postgres MCP Pro с PostgreSQL в Docker?

Да. Если оба контейнера в одной Docker-сети, укажите имя сервиса PostgreSQL как хост. Если PostgreSQL в Docker с пробросом порта, а MCP-сервер тоже в контейнере, используйте host.docker.internal.

Поддерживаются ли pgvector и PostGIS?

MCP-серверы работают со всем, что доступно через SQL, поэтому запросы к pgvector и PostGIS агент может составлять и выполнять, зная схему. Специальных инструментов для этих расширений в перечисленных серверах, как правило, нет.