Skip to main content
Glama
Postgres MCP Pro

Postgres MCP Pro

by sparta2025

📘 Postgres MCP Pro — сервер MCP для PostgreSQL

Лицензия: MIT Версия PyPI Discord Twitter Follow Contributors


🔎 Обзор

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

🙌 Основано на crystaldba/postgres-mcp (MIT, © 2025 Crystal Corp / Johann Schleier-Smith). Форк развивается и поддерживается sparta2025 — автономный MCP-сервер, Gradio-оболочка, LLM-чат с tool-calling, сертификаты шифрования.

📚 Полная документация: docs/DOCUMENTATION.md — развёртывание (Docker/облако), Gradio-оболочка, подключение клиентов (stdio/SSE), все инструменты и переменные окружения.

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

  • Анализ состояния БД: индекс, буферный кэш, autovacuum, последовательности, репликация и др.

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

  • Планы выполнения: EXPLAIN и симуляция с гипотетическими индексами.

  • Интеллект схемы: генерация SQL с учётом структуры базы.

  • Безопасное выполнение SQL: поддержка режима только для чтения и защита в продакшне.

Поддерживает транспорты: stdio и SSE.

Запуск проекта и причины его создания


Related MCP server: Postgres Scout MCP

📺 Демонстрация

От медленного к молниеносному AI сгенерировал приложение на SQLAlchemy ORM — но оно было слишком медленным. Postgres MCP Pro с Cursor решил проблему за считанные минуты.

  • 🚀 Оптимизация ORM-запросов, индексации и кэширования

  • 🛠️ Исправление сломанной страницы

  • 🧠 Улучшение вывода "топ-фильмов" путём анализа данных и корректировки запросов

👉 Подробнее: movie-app.md


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

Требования:

  1. Доступ к вашей базе данных PostgreSQL

  2. Docker или Python 3.12+

Удостоверьтесь в доступе:

Пример — подключение через psql или pgAdmin

💡 Для запуска через docker compose заранее создайте пустые файлы хранилищ подключений (иначе Docker смонтирует каталоги вместо файлов):

touch connections.json llm_connections.json

Установка

🐳 Docker

docker pull crystaldba/postgres-mcp

🐍 Python (через pipx)

pipx install postgres-mcp-pro

или через uv:

uv pip install postgres-mcp-pro

Консольная команда после установки — postgres-mcp (автономный MCP-сервер, stdio по умолчанию; --transport sse для SSE).


⚙️ Настройка AI-ассистента (на примере Claude Desktop)

Откройте конфигурационный файл:

  • MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%/Claude/claude_desktop_config.json

Пример конфигурации:

Через 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"
      }
    }
  }
}

Через 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"
      }
    }
  }
}

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

  • --access-mode=unrestricted: полный доступ (dev)

  • --access-mode=restricted: только чтение (prod)

⚠️ Флаг --access-mode поддерживает только легаси-сервер (python -m postgres_mcp.server). Автономный MCP-сервер (postgres_mcp.autonomous.mcp_server) всегда выполняет переданный SQL; разграничение делайте на стороне пользователя БД.


🔄 SSE Transport

Чтобы использовать SSE:

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

Пример для Cursor:

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

🧩 Установка расширений (опционально)

Нужно для:

  • pg_stat_statements — для анализа запросов

  • hypopg — симуляция индексов

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

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

  • Проверка БД: "Check the health of my database..."

  • Медленные запросы: "What are the slowest queries..."

  • Рекомендации: "How can I make it faster?"

  • Индексы: "Suggest indexes to improve performance"

  • Оптимизация запроса: "Help me optimize this query: SELECT ..."


📡 MCP API (интерфейс)

Автономный сервер (postgres_mcp.autonomous.mcp_server) предоставляет 15 MCP tools:

Tool

Назначение

list_schemas

Список схем БД

list_objects

Список таблиц, представлений и т.п.

get_object_details

Подробности по объекту

execute_sql

Выполнение SQL

explain_query

EXPLAIN план запроса

analyze_db_health

Здоровье БД по множеству метрик

get_top_queries

Самые медленные запросы (pg_stat_statements)

analyze_index_performance

Анализ использования индексов

get_active_queries

Выполняющиеся запросы

get_table_sizes

Размеры таблиц/индексов

get_database_locks

Текущие блокировки

format_sql_query

Форматирование SQL (sqlparse)

get_database_info

Версия, размер БД, расширения, uptime

manage_encryption_key

Управление Fernet-сертификатами

list_tools

Список всех инструментов сервера


📌 Отличия от других MCP-серверов

Postgres MCP Pro

Другие MCP-серверы

✅ Проверки здоровья с гарантией

❌ Генерация LLM

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

❌ Гипотетические советы

✅ Симуляции EXPLAIN

❌ "Попробуй сам"

✅ Детальный workload-анализ

❌ Нет анализа запросов


🧠 Почему нужны инструменты MCP?

LLM отлично справляется с генерацией SQL, но медленно, дорого и непредсказуемо. Оптимизация БД давно решается алгоритмами. MCP Pro сочетает лучшее от LLM и классических алгоритмов.


🛠️ Технические заметки (ключевые моменты)

  • Индексы: использование pg_stat_statements, генерация кандидатов, анализ через hypopg

  • LLM-оптимизация: экспериментальная, с использованием OpenAI API (OPENAI_API_KEY)

  • Здоровье БД: адаптация проверок из PgHero

  • Библиотека подключения: psycopg3 с libpq

  • Безопасность SQL: чтение, защита от ROLLBACK; DROP ...

  • Интеграция со схемой: передаёт схему агенту через инструменты, а не ресурсы

  • Конфигурация соединений: через переменные среды

  • Dev-сборка: uv, pip, запуск с локальной БД

Available Tools

15 tools
analyze_db_healthB

Database health overview.

Args:
    health_type: Принимается для совместимости со старой схемой
        инструмента, но пока не используется — отчёт всегда
        включает все проверки (default: "all").
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: health_type, database_url.

analyze_index_performanceA

Analyze index usage and find unused/duplicate indexes.

Args:
    schema_name: Schema to analyze (default: "public").
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: schema_name, database_url.

execute_sqlB

Execute a SQL query.

Args:
    sql: SQL statement to execute.
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: sql (required), database_url.

explain_queryA

Get query execution plan.

Args:
    sql: SQL statement to explain.
    analyze: If true, actually executes the query for real timing data
        (default: value of EXPLAIN_ANALYZE in .env, normally false).
        WARNING: true really runs the query, including any
        INSERT/UPDATE/DELETE it contains — use with care.
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: sql (required), analyze, database_url.

format_sql_queryB

Format/beautify a SQL query for readability.

Args:
    sql: Raw SQL text to format.

Inputs: sql (required).

get_active_queriesA

List currently running queries and their duration.

Args:
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: database_url.

get_database_infoA

Get general database information: version, size, extensions, server settings.

Args:
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: database_url.

get_database_locksA

Show current database locks and blocking queries.

Args:
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: database_url.

get_object_detailsA

Get columns of a table or view.

Args:
    schema_name: Schema containing the object.
    object_name: Table or view name.
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: object_name (required), schema_name (required), database_url.

get_table_sizesB

Show table sizes including indexes and total.

Args:
    schema_name: Schema to analyze (default: "public").
    sort_by: Sort order — "total", "table", or "indexes" (default: "total").
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: sort_by, schema_name, database_url.

get_top_queriesA

Top queries by resource usage (requires pg_stat_statements extension).

Args:
    limit: How many queries to return (optional, defaults to
        TOP_QUERIES_DEFAULT_LIMIT from .env).
    sort_by: Принимается для совместимости со старой схемой
        инструмента, но пока не используется — сортировка всегда
        по total_exec_time (default: "resources").
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: limit, sort_by, database_url.

list_objectsA

List tables/views/sequences in a schema.

Args:
    schema_name: Name of the schema to list objects from.
    object_type: One of "table", "view", "sequence" (default: "table").
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: schema_name (required), object_type, database_url.

list_schemasA

List all schemas in the database.

Args:
    database_url: Database URL (optional, uses DATABASE_URL from .env if omitted).

Inputs: database_url.

list_toolsA

List all available MCP tools of this server with their descriptions.

Returns a JSON array with one entry per tool: name, description and
inputSchema (parameters). Does NOT require a database connection —
useful for discovering capabilities at runtime.

Returns:
    JSON string: [{"name": ..., "description": ..., "parameters": ...}, ...]

Inputs: no named parameters.

manage_encryption_keyA

Manage the Data Encryption Certificate (Fernet key) for stored secrets.

Args:
    action: One of:
        - "status"   (default) — list all certs with metadata, no changes.
        - "generate" — create a new cert, set as active. ttl_days applies.
        - "rotate"   — create a new cert (version+1), set as active,
                       previous one becomes ROTATING (decrypt still works
                       in grace period).
        - "rekey"    — re-encrypt connections.json and llm_connections.json
                       with the new active cert (run after rotation).
        - "revoke"   — mark cert by `kid` as REVOKED (compromised).
                       Decrypt NO longer works for it.
        - "validate" — same as status, but also tries to decrypt a known
                       secret (currently no-op placeholder, returns status).
    ttl_days: Certificate lifetime for generate/rotate (default 90).
    subject: Subject CN for new certs (default "postgres-mcp secrets").
    use_passphrase: If true, new cert will be passphrase-protected
        (raw key encrypted with PBKDF2(passphrase)). Passphrase is read
        from env CERT_PASSPHRASE.
    kid: For action="revoke" — which certificate to revoke.
    reason: Free-text reason recorded in audit log and cert notes.

Returns:
    JSON with details of the operation. For "status" — list of certs.
    For generate/rotate — new cert metadata. For revoke — boolean.
    For rekey — statistics {scanned, rekeyed, skipped, errors}.

Examples:
    # See current state
    action="status"
    # Create a new cert (auto-active)
    action="generate" ttl_days=90
    # Rotate (new active, old → ROTATING for grace period)
    action="rotate"
    # Re-encrypt connections files with new cert
    action="rekey"
    # Revoke a compromised cert
    action="revoke" kid="dec-abc123..." reason="leaked on GitHub"

Inputs: kid, action, reason, subject, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 15 tools

    Disambiguation4/5

    Most tools target clearly distinct concerns: schema listing, object details, SQL execution, explain plans, active queries, locks, sizes, and index analysis. The main potential confusion is between analyze_db_health and get_database_info, which both provide broad database-level overviews and could lead an agent to pick the wrong one.

    Naming Consistency5/5

    All tool names follow a consistent lowercase verb_noun pattern (list_schemas, get_object_details, execute_sql, analyze_index_performance, etc.). The naming convention is uniform and predictable, making it easy to infer what each tool does.

    Tool Count4/5

    15 tools is at the upper end of the ideal range but still reasonable for a Postgres server covering introspection, SQL execution, performance analysis, and health checks. The inclusion of manage_encryption_key and list_tools adds some scope beyond the core database domain, making the set feel slightly over-packed.

    Completeness4/5

    The tool surface covers schema discovery, object details, arbitrary SQL execution, query explanation, performance diagnostics, active queries, locks, table sizes, and database info. Notable gaps include no query cancellation/termination, no vacuum/analyze maintenance tool, and no explicit database-level listing, though execute_sql can work around some of these.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to safely explore, analyze, and maintain PostgreSQL databases with read-only mode by default, SQL injection prevention, query performance analysis, and optional write operations.
      87 npm
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to interact with PostgreSQL databases through schema intelligence, query execution, and DBA tooling including index analysis and health monitoring. Features configurable access levels and audit logging for secure database operations.
      432 npm
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to safely interact with PostgreSQL databases, perform queries, inspect schemas, and analyze query performance.
      2
      ISC