Postgres MCP Pro

MCP MCP Servers Open Source

Продвинутый MCP-сервер для PostgreSQL: индексные рекомендации, анализ query plans, health check, connection pool tuning — AI-DBA для вашей БД.

v0.1
v0.3.0
16.05.2025 current
Добавлен 03.07.2026 · Обновлён 03.07.2026 · MCP Servers
Установка
Требуется строка подключения PostgreSQL.

# Claude Desktop — claude_desktop_config.json:
{
  "mcpServers": {
    "postgres": {
      "command": "uvx",
      "args": ["postgres-mcp", "--access-mode=unrestricted"],
      "env": { "DATABASE_URI": "postgresql://user:pass@localhost:5432/mydb" }
    }
  }
}

# Claude Code (CLI):
claude mcp add postgres -e DATABASE_URI=postgresql://user:pass@localhost/mydb -- uvx postgres-mcp --access-mode=unrestricted

# OpenCode — ~/.config/opencode/opencode.json:
{
  "mcp": {
    "postgres": {
      "type": "local",
      "command": ["uvx", "postgres-mcp", "--access-mode=unrestricted"],
      "environment": { "DATABASE_URI": "postgresql://user:pass@localhost/mydb" }
    }
  }
}
переведено ИИ

Логотип Postgres MCP Pro

Лицензия: MIT PyPI - Версия Discord Подписчики в Twitter Контрибьюторы

Сервер MCP для Postgres с настройкой индексов, планами выполнения, проверками здоровья и безопасным выполнением SQL.

ОбзорДемоБыстрый стартТехнические заметкиAPI MCPСвязанные проектыЧасто задаваемые вопросы

Обзор

Postgres MCP Pro — это сервер протокола контекста модели (Model Context Protocol, MCP) с открытым исходным кодом, созданный для поддержки вас и ваших ИИ-агентов на всём этапе процесса разработки — от начального кодирования, через тестирование и развёртывание, до настройки и обслуживания в продакшене.

Postgres MCP Pro делает гораздо больше, чем просто оборачивает подключение к базе данных.

Возможности включают:

  • 🔍 Здоровье базы данных — анализ здоровья индексов, использования соединений, буферного кэша, состояния вакуума, ограничений последовательностей, задержки репликации и многого другого.
  • ⚡ Настройка индексов — исследование тысяч возможных индексов для поиска оптимального решения для вашей рабочей нагрузки с использованием надёжных промышленных алгоритмов.
  • 📈 Планы запросов — проверка и оптимизация производительности путём анализа планов EXPLAIN и моделирования влияния гипотетических индексов.
  • 🧠 Интеллектуальная схема — генерация SQL с учётом контекста на основе подробного понимания схемы базы данных.
  • 🛡️ Безопасное выполнение SQL — настраиваемый контроль доступа, включая поддержку режима только для чтения и безопасного разбора SQL, что позволяет использовать его как в разработке, так и в продакшене.

Postgres MCP Pro поддерживает как стандартный ввод-вывод (stdio), так и события серверного уведомления (SSE) для гибкости в различных средах.

Для дополнительной информации о причинах создания Postgres MCP Pro см. нашу статью-анонс в блоге.

Демо

От непригодного к молниеносно быстрому - Задача: Мы сгенерировали приложение для фильмов с помощью ИИ-ассистента, но код ORM SQLAlchemy работал мучительно медленно. - Решение: Используя Postgres MCP Pro с Cursor, мы исправили проблемы производительности за считанные минуты.

Что мы сделали: - 🚀 Исправили производительность — включая запросы ORM, индексирование и кэширование. - 🛠️ Исправили сломанную страницу — путём предложения агенту исследовать данные, исправить запросы и добавить связанный контент. - 🧹 Улучшили топ-фильмы — путём исследования данных и исправления запроса ORM для отображения более релевантных результатов.

Посмотрите видео ниже или прочитайте пошаговое описание.

https://github.com/user-attachments/assets/24e05745-65e9-4998-b877-a368f1eadc13

Быстрый старт

Предварительные требования

Перед началом работы убедитесь, что у вас есть: 1. Учётные данные для доступа к базе данных. 2. Docker или Python 3.12 или выше.

Учётные данные для доступа

Вы можете проверить, что ваши учетные данные для доступа действительны, используя psql или графический инструмент, такой как pgAdmin.

Docker или Python

Выбор между Docker и Python остается за вами. Как правило, мы рекомендуем Docker, так как пользователи Python могут столкнуться с большим количеством проблем, специфичных для среды. Однако часто имеет смысл использовать тот метод, с которым вы наиболее знакомы.

Установка

Выберите один из следующих способов для установки Postgres MCP Pro:

Вариант 1: Использование Docker

Загрузите Docker-образ сервера MCP Postgres MCP Pro. Этот образ содержит все необходимые зависимости, обеспечивая надёжный способ запуска Postgres MCP Pro в различных средах.

docker pull crystaldba/postgres-mcp

Вариант 2: Использование Python

Если у вас установлен pipx, вы можете установить Postgres MCP Pro с помощью:

pipx install postgres-mcp

В противном случае установите Postgres MCP Pro с помощью uv:

uv pip install postgres-mcp

Если вам нужно установить uv, см. инструкции по установке uv.

Настройка вашего ИИ-ассистента

Мы предоставляем полные инструкции по настройке Postgres MCP Pro с Claude Desktop. Многие клиенты MCP имеют похожие файлы конфигурации, и вы можете адаптировать эти шаги для работы с клиентом по вашему выбору.

Настройка Claude Desktop

Вам нужно будет отредактировать файл конфигурации Claude Desktop, чтобы добавить Postgres MCP Pro. Расположение этого файла зависит от вашей операционной системы: - MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json - Windows: %APPDATA%/Claude/claude_desktop_config.json

Вы также можете использовать пункт меню Settings в Claude Desktop для поиска файла конфигурации.

Теперь вы будете редактировать секцию mcpServers файла конфигурации.

Если вы используете Docker
{
  "mcpServers": {
    "postgres": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "DATABASE_URI",
        "crystaldba/postgres-mcp",
        "--access-mode=unrestricted"
      ],
      "env": {
        "DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
      }
    }
  }
}

Docker-образ Postgres MCP Pro автоматически переназначит имя хоста localhost для работы изнутри контейнера.

  • MacOS/Windows: Автоматически использует host.docker.internal
  • Linux: Автоматически использует 172.17.0.1 или соответствующий адрес хоста
Если вы используете uvx
{
  "mcpServers": {
    "postgres": {
      "command": "uvx",
      "args": [
        "postgres-mcp",
        "--access-mode=unrestricted"
      ],
      "env": {
        "DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
      }
    }
  }
}
Если вы используете pipx
{
  "mcpServers": {
    "postgres": {
      "command": "postgres-mcp",
      "args": [
        "--access-mode=unrestricted"
      ],
      "env": {
        "DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
      }
    }
  }
}
Если вы используете uv
{
  "mcpServers": {
    "postgres": {
      "command": "uv",
      "args": [
        "run",
        "postgres-mcp",
        "--access-mode=unrestricted"
      ],
      "env": {
        "DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
      }
    }
  }
}
URI подключения

Замените postgresql://... на ваш URI подключения к базе данных Postgres.

Режим доступа

Postgres MCP Pro поддерживает несколько режимов доступа, чтобы дать вам контроль над операциями, которые ИИ-агент может выполнять с базой данных: - Без ограничений (Unrestricted): Разрешает полный доступ на чтение/запись для изменения данных и схемы. Подходит для сред разработки. - Ограниченный (Restricted): Ограничивает операции транзакциями только для чтения и накладывает ограничения на использование ресурсов (в настоящее время только время выполнения). Подходит для продакшен-сред.

Для использования ограниченного режима замените --access-mode=unrestricted на --access-mode=restricted в примерах конфигурации выше.

Другие клиенты MCP

Многие клиенты MCP имеют файлы конфигурации, похожие на Claude Desktop, и вы можете адаптировать приведенные выше примеры для работы с клиентом по вашему выбору.

  • Если вы используете Cursor, вы можете перейти через Command Palette в Cursor Settings, затем открыть вкладку MCP для доступа к файлу конфигурации.
  • Если вы используете Windsurf, вы можете перейти через Command Palette на Открыть страницу настроек Windsurf для доступа к файлу конфигурации.
  • Если вы используете Goose, запустите goose configure, затем выберите Add Extension.
  • Если вы используете Qodo Gen, откройте панель Chat, нажмите Подключить больше инструментов, нажмите + Добавить новый MCP, затем добавьте новую конфигурацию.

Транспорт SSE

Postgres MCP Pro поддерживает транспорт SSE, который позволяет нескольким клиентам MCP использовать один сервер, возможно, удалённый сервер. Для использования транспорта SSE необходимо запустить сервер с опцией --transport=sse.

Например, с помощью Docker run:

docker run -p 8000:8000 \
  -e DATABASE_URI=postgresql://username:password@localhost:5432/dbname \
  crystaldba/postgres-mcp --access-mode=unrestricted --transport=sse

Затем обновите конфигурацию клиента MCP для вызова сервера MCP. Например, в mcp.json Cursor или cline_mcp_settings.json Cline вы можете разместить:

{
    "mcpServers": {
        "postgres": {
            "type": "sse",
            "url": "http://localhost:8000/sse"
        }
    }
}

Для Windsurf формат в mcp_config.json немного отличается:

{
    "mcpServers": {
        "postgres": {
            "type": "sse",
            "serverUrl": "http://localhost:8000/sse"
        }
    }
}

Установка расширения Postgres (необязательно)

Для включения настройки индексов и всестороннего анализа производительности необходимо загрузить расширения pg_stat_statements и hypopg в вашей базе данных.

  • Расширение pg_stat_statements позволяет Postgres MCP Pro анализировать статистику выполнения запросов. Например, это позволяет понять, какие запросы выполняются медленно или потребляют значительные ресурсы.
  • Расширение hypopg позволяет Postgres MCP Pro имитировать поведение планировщика запросов PostgreSQL после добавления индексов.

Установка расширений на AWS RDS, Azure SQL или Google Cloud SQL

Если ваша база данных PostgreSQL работает в управляемом сервисе облачного провайдера, расширения pg_stat_statements и hypopg уже должны быть доступны в системе. В этом случае вы можете просто выполнить команды CREATE EXTENSION с использованием роли с достаточными привилегиями:

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS hypopg;

Установка расширений на самостоятельно управляемом PostgreSQL

Если вы управляете собственной установкой PostgreSQL, возможно, потребуется дополнительная работа. Перед загрузкой расширения pg_stat_statements необходимо убедиться, что оно указано в shared_preload_libraries в файле конфигурации PostgreSQL. Расширение hypopg также может требовать дополнительной установки на уровне системы (например, через менеджер пакетов), поскольку оно не всегда поставляется вместе с PostgreSQL.

Примеры использования

Получение обзора состояния базы данных

Вопрос:

Проверьте состояние моей базы данных и выявите любые проблемы.

Анализ медленных запросов

Вопрос:

Какие самые медленные запросы в моей базе данных? И как я могу их ускорить?

Получение рекомендаций по ускорению

Вопрос:

Моё приложение работает медленно. Как я могу его ускорить?

Генерация рекомендаций по индексам

Вопрос:

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

Оптимизация конкретного запроса

Вопрос:

Помогите мне оптимизировать этот запрос: SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id WHERE orders.created_at > '2023-01-01';

API сервера MCP

Стандарт MCP определяет различные типы конечных точек: инструменты, ресурсы, подсказки и другие.

Postgres MCP Pro предоставляет функциональность исключительно через инструменты MCP. Мы выбрали такой подход, потому что экосистема клиентов MCP широко поддерживает инструменты MCP. Это контрастирует с подходом других серверов MCP для PostgreSQL, включая эталонный сервер MCP PostgreSQL, которые используют ресурсы MCP для предоставления информации о схеме.

Инструменты Postgres MCP Pro:

Название инструмента Описание
list_schemas Выводит все схемы баз данных, доступные в экземпляре PostgreSQL.
list_objects Выводит объекты баз данных (таблицы, представления, последовательности, расширения) в указанной схеме.
get_object_details Предоставляет информацию о конкретном объекте базы данных, например, о столбцах, ограничениях и индексах таблицы.
execute_sql Выполняет SQL-запросы к базе данных с ограничениями только для чтения при подключении в ограниченном режиме.
explain_query Получает план выполнения SQL-запроса, описывающий, как PostgreSQL будет его обрабатывать, и показывающий модель стоимости планировщика запросов. Может вызываться с гипотетическими индексами для имитации поведения после добавления индексов.
get_top_queries Выводит самые медленные SQL-запросы на основе общего времени выполнения с использованием данных pg_stat_statements.
analyze_workload_indexes Анализирует нагрузку на базу данных для выявления ресурсоёмких запросов, затем рекомендует оптимальные индексы для них.
analyze_query_indexes Анализирует список конкретных SQL-запросов (до 10) и рекомендует оптимальные индексы для них.
analyze_db_health Выполняет всестороннюю проверку состояния, включая: коэффициент попаданий в буферный кэш, состояние подключений, проверку ограничений, состояние индексов (дублирующиеся/неиспользуемые/недействительные), пределы последовательностей и состояние VACUUM.

Связанные проекты

Серверы MCP для PostgreSQL - Query MCP. Сервер MCP для Supabase PostgreSQL с трёхуровневой архитектурой безопасности и поддержкой API управления Supabase. - PG-MCP. Сервер MCP для PostgreSQL с гибкими параметрами подключения, планами выполнения, контекстом расширений и многим другим. - Эталонный сервер MCP PostgreSQL. Простая реализация сервера MCP, предоставляющая информацию о схеме как ресурсы MCP и выполняющая запросы только для чтения. - Supabase Postgres MCP Server. Этот сервер MCP предоставляет функции управления Supabase и активно поддерживается сообществом Supabase. - Nile MCP Server. Сервер MCP, предоставляющий доступ к API управления для мультитенантного сервиса PostgreSQL от Nile. - Neon MCP Server. Сервер MCP, предоставляющий доступ к API управления для серверлесс-сервиса PostgreSQL от Neon. - Wren MCP Server. Предоставляет семантический движок для бизнес-аналитики PostgreSQL и других баз данных.

Инструменты DBA (включая коммерческие предложения) - Aiven Database Optimizer. Инструмент, обеспечивающий всесторонний анализ нагрузки на базу данных, оптимизацию запросов и другие улучшения производительности. - dba.ai. ИИ-помощник для администрирования баз данных, интегрирующийся с GitHub для решения проблем с кодом. - pgAnalyze. Комплексная платформа мониторинга и аналитики для выявления узких мест производительности, оптимизации запросов и оповещений в реальном времени. - Postgres.ai. Интерактивный чат, объединяющий обширную базу знаний PostgreSQL и GPT-4. - Xata Agent. Источниковый ИИ-агент, который автоматически отслеживает состояние базы данных, диагностирует проблемы и предоставляет рекомендации с использованием логических рассуждений и сценариев на основе LLM.

Утилиты для PostgreSQL - Dexter. Инструмент для генерации и тестирования гипотетических индексов в PostgreSQL. - PgHero. Панель мониторинга производительности PostgreSQL с рекомендациями. Postgres MCP Pro включает проверки состояния из PgHero. - PgTune. Эвристики для настройки конфигурации PostgreSQL.

Часто задаваемые вопросы

Чем Postgres MCP Pro отличается от других MCP-серверов для Postgres? Существует множество MCP-серверов, позволяющих ИИ-агенту выполнять запросы к базе данных Postgres. Postgres MCP Pro тоже это умеет, но также добавляет инструменты для понимания и улучшения производительности вашей базы данных Postgres. Например, он реализует вариант Anytime Algorithm of Database Tuning Advisor для Microsoft SQL Server — современного промышленно-значимого алгоритма для автоматической настройки индексов.

Postgres MCP Pro Другие MCP-серверы для Postgres
✅ Детерминированные проверки состояния базы данных ❌ Невоспроизводимые генерируемые LLM запросы для проверки состояния
✅ Принципиальные стратегии поиска индексов ❌ Генеративные ИИ-догадки по улучшению индексации
✅ Анализ рабочей нагрузки для выявления основных проблем ❌ Непоследовательный анализ проблем
✅ Симуляция улучшений производительности ❌ Попробуйте сами и посмотрите, работает ли это

Postgres MCP Pro дополняет генеративный ИИ, добавляя детерминированные инструменты и классические алгоритмы оптимизации. Такое сочетание является одновременно надежным и гибким.

Зачем нужны инструменты MCP, если LLM умеет рассуждать, генерировать SQL и т.д.? LLM бесценны для задач, связанных с неоднозначностью, рассуждениями или естественным языком. Однако по сравнению с процедурным кодом они могут быть медленными, дорогими, недетерминированными и иногда выдавать ненадежные результаты. В случае настройки баз данных у нас есть хорошо зарекомендовавшие себя алгоритмы, разработанные на протяжении десятилетий и доказавшие свою эффективность. Postgres MCP Pro позволяет объединить лучшее из двух миров, сочетая LLM с классическими алгоритмами оптимизации и другими процедурными инструментами.

Как вы тестируете Postgres MCP Pro? Тестирование критически важно для обеспечения надежности и точности Postgres MCP Pro. Мы создаем набор сгенерированных ИИ контрпродуктивных рабочих нагрузок, предназначенных для проверки Postgres MCP Pro и гарантии его работоспособности в широком спектре сценариев.

Какие версии Postgres поддерживаются? Наши тесты в настоящее время сосредоточены на Postgres 15, 16 и 17. Мы планируем поддерживать версии Postgres от 13 до 17.

Кто создал этот проект? Этот проект создан и поддерживается Crystal DBA.

Дорожная карта

Определится

Вы и ваши потребности — ключевой движок того, что мы создаем. Расскажите нам, что вы хотите видеть, открыв задачу или запрос на слияние. Вы также можете связаться с нами в Discord.

Технические примечания

Этот раздел включает общий обзор технических соображений, повлиявших на дизайн Postgres MCP Pro.

Настройка индексов

Разработчики знают, что отсутствие индексов — одна из наиболее распространенных причин проблем с производительностью базы данных. Индексы предоставляют методы доступа, позволяющие Postgres быстро находить данные, необходимые для выполнения запроса. Когда таблицы малы, индексы почти не влияют на производительность, но по мере роста объема данных разница в алгоритмической сложности между полным перебором таблицы и поиском по индексу становится значительной (обычно O(n) против O(log n), potentially больше, если задействованы соединения нескольких таблиц).

Процесс генерации предложений по индексам в Postgres MCP Pro состоит из нескольких этапов:

  1. Определение SQL-запросов, требующих оптимизации. Если известен конкретный проблемный SQL-запрос, его можно предоставить. Postgres MCP Pro также может проанализировать нагрузку для выявления целей для настройки индексов. Для этого используется расширение pg_stat_statements, которое записывает время выполнения и потребление ресурсов каждого запроса.

    Запрос является кандидатом на настройку индексов, если он является основным потребителем ресурсов — либо при каждом выполнении, либо в совокупности. В настоящее время в качестве показателя совокупного потребления ресурсов используется время выполнения, однако также может быть целесообразно анализировать конкретные ресурсы, например, количество обработанных блоков или количество блоков, считанных с диска. Инструмент analyze_query_workload фокусируется на медленных запросах, используя среднее время выполнения с порогами для количества выполнений и среднего времени выполнения. Агенты также могут вызвать get_top_queries, который принимает параметр для сравнения среднего и общего времени выполнения, а затем передать эти запросы в analyze_query_indexes для получения рекомендаций по индексам.

    Усложненные системы настройки индексов используют «сжатие нагрузки» для формирования репрезентативного подмножества запросов, отражающего характеристики общей нагрузки, что упрощает задачу для последующих алгоритмов. Postgres MCP Pro выполняет ограниченную форму сжатия нагрузки путем нормализации запросов, так что запросы, сгенерированные из одного шаблона, считаются одним. Каждому запросу присваивается равный вес — это упрощение работает, когда выгоды от индексирования велики.

  2. Генерация кандидатных индексов После получения списка SQL-запросов, которые мы хотим улучшить с помощью индексов, мы генерируем список индексов, которые можно было бы добавить. Для этого мы разбираем SQL и определяем все столбцы, используемые в фильтрах, соединениях, группировках или сортировках.

    Чтобы сгенерировать все возможные индексы, необходимо рассмотреть комбинации этих столбцов, поскольку Postgres поддерживает составные индексы. В текущей реализации для каждого возможного составного индекса включается только одна перестановка, выбираемая случайным образом. Это упрощение применяется для сокращения пространства поиска, поскольку перестановки часто имеют эквивалентную производительность. Однако мы надеемся улучшить этот подход в будущем.

  3. Поиск оптимальной конфигурации индексов. Наша цель — найти комбинацию индексов, оптимально уравновешивающую преимущества производительности с затратами на хранение и поддержку этих индексов. Улучшение производительности оценивается с использованием возможностей «что будет, если?», предоставляемой расширением hypopg. Это имитирует, как оптимизатор запросов Postgres будет выполнять запрос после добавления индексов, и от/reporting changes based on the actual Postgres cost model.

    Одна из проблем заключается в том, что генерация планов запросов обычно требует знания конкретных значений параметров, используемых в запросе. Нормализация запросов, необходимая для сокращения рассматриваемых запросов, удаляет константы параметров. Значения параметров, предоставленные через привязанные переменные, также нам недоступны.

    Для решения этой проблемы мы генерируем реалистичные константы, которые можем предоставить в качестве параметров, используя выборку из статистики таблиц. В версии 16 Postgres добавил функционал универсального плана EXPLAIN, но он имеет ограничения, например, в отношении операторов LIKE, которых нет в нашей реализации.

    Стратегия поиска критически важна, поскольку оценка всех возможных комбинаций индексов осуществима только в простых ситуациях. Именно это наиболее отличает различные подходы к индексированию. Адаптируя подход алгоритма Anytime от Microsoft, мы используем жадную стратегию поиска, то есть сначала ищем лучшее решение с одним индексом, затем ищем лучший индекс для добавления к нему для создания решения с двумя индексами. Наш поиск завершается, когда исчерпывается выделенное время или когда раунд exploration не приводит к улучшениям выше минимального порога в 10%.

  4. Анализ затрат и выгод. Когда предлагаются две альтернативы индексирования — одна обеспечивает лучшую производительность, а другая требует больше места — как мы решаем, какую выбрать? Традиционно консультанты по индексации запрашивают бюджет хранения и оптимизируют производительность относительно этого бюджета. Мы также учитываем бюджет хранения, но выполняем анализ затрат и выгод на протяжении всего процесса оптимизации.

    Мы формулируем это как задачу выбора точки на фронт Парето — множестве вариантов выбора, для которых улучшение одной характеристики неизбежно ухудшает другую. В идеальном мире мы могли бы оценить стоимость хранения и выгоду от улучшенной производительности в денежном выражении. Однако существует более простой и практичный подход: рассматривать изменения в относительных терминах. Большинство согласятся, что улучшение производительности в 100 раз стоит затрат, даже если стоимость хранения увеличится в 2 раза. В нашей реализации используется настраиваемый параметр для установки этого порога. По умолчанию требуется, чтобы изменение логарифма (по основанию 10) улучшения производительности было в 2 раза больше разницы логарифмов стоимости пространства. Это позволяет максимально увеличивать объем хранилища в 10 раз при улучшении производительности в 100 раз.

Наша реализация наиболее тесно связана с алгоритмом Anytime, используемым в Microsoft SQL Server. По сравнению с Dexter, инструментом автоматического индексирования для Postgres, мы ищем в большем пространстве и используем другие эвристики. Это позволяет нам генерировать лучшие решения ценой более длительного времени выполнения.

Также мы показываем работу, выполненную на каждом раунде поиска, включая сравнение планов запросов до и после добавления каждого индекса. Это предоставляет LLM дополнительный контекст, который может использоваться при формировании ответа с рекомендациями по индексированию.

Экспериментальная функция: настройка индексов с помощью LLM

Postgres MCP Pro включает экспериментальную функцию настройки индексов на основе Optimization by LLM. Вместо использования эвристик для исследования возможных конфигураций индексов мы предоставляем LLM схему базы данных и планы запросов с просьбой предложить конфигурации индексов. Затем мы используем hypopg для прогнозирования производительности с предложенными индексами, после чего передаем эти результаты обратно в LLM для генерации нового набора предложений. Этот процесс повторяется до тех пор, пока несколько раундов итераций не перестанут давать улучшения.

Оптимизация индексов с помощью LLM имеет преимущества, когда пространство поиска индексов велико или когда необходимо рассматривать индексы со многими столбцами. Как и традиционные подходы на основе поиска, он полагается на точность прогнозов производительности hypopg.

Для выполнения оптимизации индексов с помощью LLM необходимо предоставить ключ API OpenAI, установив переменную окружения OPENAI_API_KEY.

Здоровье базы данных

Проверки состояния базы данных выявляют возможности для оптимизации и потребности в обслуживании до того, как они приведут к критическим проблемам. В текущем релизе Postgres MCP Pro адаптирует проверки состояния базы данных напрямую из проекта PgHero. Мы работаем над полной валидацией этих проверок и в будущем можем расширить их набор.

  • Здоровье индексов. Поиск неиспользуемых, дублирующих и раздутых индексов. Раздутые индексы неэффективно используют страницы базы данных. Автоматическая очистка (autovacuum) Postgres удаляет записи индексов, ссылающиеся на мертвые кортежи, и помечает их как доступные для повторного использования. Однако она не уплотняет страницы индексов, и в конечном итоге страницы индексов могут содержать лишь небольшое количество ссылок на активные кортежи.
  • Коэффициент попаданий в буферный кэш. Измеряет долю операций чтения из базы данных, обслуживаемых из буферного кэша, а не с диска. Низкий коэффициент попаданий в буферный кэш требует расследования, так как это часто указывает на неоптимальное использование ресурсов и приводит к снижению производительности приложения.
  • Здоровье соединений. Проверка количества соединений с базой данных и отчёт об их использовании. Основной риск — исчерпание лимита соединений, но большое количество заблокированных или неактивных соединений также может указывать на проблемы.
  • Здоровье очистки (Vacuum). Очистка важна по многим причинам. Одна из ключевых — предотвращение циклического переполнения идентификатора транзакции (transaction id wraparound), которое может привести к тому, что база данных прекратит прием записей. Механизм многоверсионного управления конкурентным доступом (MVCC) Postgres требует уникального идентификатора транзакции для каждой транзакции. Однако, поскольку Postgres использует 32-битное целое число со знаком для идентификаторов транзакций, ему приходится повторно использовать идентификаторы транзакций после достижения предела в 2 миллиарда транзакций. Для этого он «замораживает» идентификаторы транзакций прошлых транзакций, устанавливая их все в специальное значение, указывающее на далёкое прошлое. Когда записи впервые попадают на диск, они записываются с видимостью для диапазона идентификаторов транзакций. Перед повторным использованием этих идентификаторов транзакций Postgres должен обновить любые записи на диске, «заморозив» их, чтобы удалить ссылки на идентификаторы транзакций, которые будут повторно использоваться. Эта проверка ищет таблицы, требующие очистки для предотвращения циклического переполнения идентификатора транзакции.
  • Здоровье репликации. Проверка состояния репликации путем мониторинга задержки между основным сервером и репликами, проверки статуса репликации и отслеживания использования слотов репликации.
  • Здоровье ограничений. В нормальной работе Postgres отклоняет любые транзакции, которые могут привести к нарушению ограничения. Однако невалидные ограничения могут возникнуть после загрузки данных или в сценариях восстановления. Эта проверка ищет любые невалидные ограничения.
  • Здоровье последовательностей. Поиск последовательностей (sequences), которые находятся в риске превышения своего максимального значения.

Клиентская библиотека Postgres

Postgres MCP Pro использует psycopg3 для подключения к Postgres с использованием асинхронного ввода-вывода. Внутри psycopg3 использует библиотеку libpq для подключения к Postgres, обеспечивая доступ ко всем функциям Postgres и поддерживаемую сообществом Postgres базовую реализацию.

Некоторые другие MCP-серверы на базе Python используют asyncpg, что может упростить установку за счет устранения зависимости от libpq. Asyncpg, вероятно, также быстрее, чем psycopg3, но мы этого не проверяли самостоятельно. Более ранние бенчмарки сообщали о большей разнице в производительности, что свидетельствует о том, что более новый psycopg3 сократил этот разрыв по мере своего совершенствования.

Взвесив эти факторы, мы выбрали psycopg3 вместо asyncpg. Мы открыты к пересмотру этого решения в будущем.

Конфигурация подключения

Как и в эталонном PostgreSQL MCP-сервере, Postgres MCP Pro принимает информацию для подключения к Postgres при запуске. Это удобно для пользователей, которые всегда подключаются к одной и той же базе данных, но может быть неудобно, когда пользователи переключаются между базами данных.

Альтернативный подход, используемый в PG-MCP, заключается в предоставлении данных для подключения через вызовы инструментов MCP в момент использования. Это удобнее для пользователей, которые переключаются между базами данных, и позволяет одному MCP-серверу одновременно поддерживать нескольких конечных пользователей.

Должен существовать лучший подход, чем любой из этих. Оба имеют уязвимости в области безопасности — немногие MCP-клиенты безопасно хранят конфигурацию MCP-сервера (примером может служить Goose), а учетные данные, предоставляемые через инструменты MCP, передаются через LLM и хранятся в истории чата. У обоих также есть проблемы с удобством использования в некоторых сценариях.

Информация о схеме

Цель инструмента предоставления информации о схеме — дать вызывающему ИИ-агенту информацию, необходимую для генерации корректного и производительного SQL. Например, предположим, что пользователь спрашивает: «Сколько вылетов из Сан-Франциско в Париж состоялось за прошедший год?» ИИ-агенту нужно найти таблицу, хранящую информацию о рейсах, столбцы с местом отправления и назначения, а, возможно, и таблицу, сопоставляющую коды аэропортов с их местоположениями.

Зачем предоставлять инструменты для получения информации о схеме, если LLM обычно способны генерировать SQL для получения этой информации из Postgres напрямую?

Наш опыт использования Claude показывает, что вызываемый LLM очень хорошо генерирует SQL для исследования схемы Postgres путем запросов к системному каталогу Postgres и схеме информации (стандартизированному ANSI представлению метаданных базы данных). Однако мы не знаем, делают ли это другие LLM с такой же надежностью и способностью.

Было бы лучше предоставлять информацию о схеме с использованием ресурсов MCP, а не инструментов MCP?

Эталонный PostgreSQL MCP-сервер использует ресурсы для предоставления информации о схеме, а не инструменты. Навигация по ресурсам аналогична навигации по файловой системе, поэтому этот подход во многом является естественным. Однако поддержка ресурсов менее распространена, чем поддержка инструментов, в экосистеме MCP-клиентов (см. примеры клиентов). Кроме того, хотя стандарт MCP утверждает, что к ресурсам могут обращаться как ИИ-агенты, так и конечные пользователи-люди, некоторые клиенты поддерживают только навигацию по дереву ресурсов для людей.

Защищённое выполнение SQL

Искусственный интеллект усиливает давние проблемы защиты баз данных от целого ряда угроз — от простых ошибок до изощрённых атак со стороны злоумышленников. Независимо от того, является ли угроза случайной или намеренной, применяется аналогичная модель безопасности, цели которой делятся на три категории: конфиденциальность, целостность и доступность. Хорошо знакомое противоречие между удобством и безопасностью здесь также явно выражено.

Режим защищённого выполнения SQL в Postgres MCP Pro сфокусирован на целостности. В контексте MCP нас в первую очередь беспокоит нанесение ущерба SQL-запросами, сгенерированными LLM — например, непреднамеренное изменение или удаление данных, либо другие действия, которые могут обойти процесс управления изменениями в организации.

Простейший способ обеспечить целостность — убедиться, что весь SQL, выполняемый по отношению к базе данных, является только для чтения. Один из способов сделать это — создать пользователя базы данных с правами доступа только для чтения. Хотя это хороший подход, на практике многие находят его громоздким. Postgres не предоставляет способа перевести соединение или сессию в режим только для чтения, поэтому Postgres MCP Pro использует более сложный подход для обеспечения выполнения SQL только для чтения поверх соединения для чтения и записи.

Postgres MCP предоставляет режим транзакции только для чтения, который запрещает модификацию данных и схем. Подобно эталонному MCP-серверу PostgreSQL, мы используем транзакции только для чтения для обеспечения защищённого выполнения SQL.

Чтобы сделать этот механизм надёжным, нам необходимо убедиться, что SQL каким-либо образом не обходит режим транзакции только для чтения — например, путём выполнения оператора COMMIT или ROLLBACK с последующим началом новой транзакции.

Например, LLM может обойти режим транзакции только для чтения, выполнив оператор ROLLBACK, а затем начав новую транзакцию. Например:

ROLLBACK; DROP TABLE users;

Чтобы предотвратить подобные случаи, мы парсим SQL перед выполнением с помощью библиотеки pglast. Мы отклоняем любой SQL, содержащий операторы commit или rollback. К счастью, популярные языки хранимых процедур Postgres, включая PL/pgSQL и PL/Python, не допускают использования операторов COMMIT или ROLLBACK. Если в вашей базе данных включены небезопасные языки хранимых процедур, наши средства защиты от записи могут быть обойдены.

В настоящее время Postgres MCP Pro предоставляет два уровня защиты базы данных — по одному на каждом крайнем спектра удобства/безопасности. - «Без ограничений» обеспечивает максимальную гибкость. Он подходит для сред разработки, где скорость и гибкость имеют первостепенное значение и где нет необходимости защищать ценные или конфиденциальные данные. - «С ограничениями» обеспечивает баланс между гибкостью и безопасностью. Он подходит для рабочих сред, где база данных подвержена воздействию недоверенных пользователей и где важно защищать ценные или конфиденциальные данные.

Режим без ограничений соответствует подходу автоматического режима запуска Cursor, при котором AI-агент работает с минимальным контролем или подтверждением со стороны человека. Мы ожидаем, что автоматический режим будет развёрнут в средах разработки, где последствия ошибок невелики, где базы данных не содержат ценных или конфиденциальных данных и где их можно пересоздать или восстановить из резервных копий при необходимости.

Режим с ограничениями был разработан консервативно, с уклоном в сторону безопасности, даже если это может быть неудобно. Режим с ограничениями ограничен операциями только для чтения, а время выполнения запросов ограничивается для предотвращения влияния длительных запросов на производительность системы. В будущем мы можем добавить меры для обеспечения безопасности использования режима с ограничениями в рабочих базах данных.

Разработка Postgres MCP Pro

Инструкции ниже предназначены для разработчиков, желающих работать над Postgres MCP Pro, или для пользователей, которые предпочитают устанавливать Postgres MCP Pro из исходного кода.

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

  1. Установка uv:

bash curl -sSL https://astral.sh/uv/install.sh | sh

  1. Клонирование репозитория:

bash git clone https://github.com/crystaldba/postgres-mcp.git cd postgres-mcp

  1. Установка зависимостей:

bash uv pip install -e . uv sync

  1. Запуск сервера: bash uv run postgres-mcp "postgres://user:password@localhost:5432/dbname"
Комментарии
Войдите, чтобы оставить комментарий