Skip to main content
Glama
BerkantACUN

pg-guard-mcp

by BerkantACUN

pg-guard-mcp

PyPI

PostgreSQL MCP-сервер, который обеспечивает доступ только на чтение на уровне протокола и привилегий, а не разбором строки запроса и надеждой на удачу.

Установка

pip install pg-guard-mcp
# or, without installing anything permanently:
uvx pg-guard-mcp

Related MCP server: MCP PostgreSQL Read-Only Server

Зачем это нужно

Официальный @modelcontextprotocol/server-postgres поставлялся с режимом только для чтения, который можно было обойти одним COMMIT;: он оборачивал запрос агента в BEGIN TRANSACTION READ ONLY и отправлял всё это одной строкой. Postgres в этом режиме принимает несколько операторов, разделённых точкой с запятой, поэтому SELECT 1; COMMIT; DROP SCHEMA public CASCADE; досрочно закрывал транзакцию только для чтения и выполнял DROP как обычную запись. Из-за этого пакет объявили устаревшим. (Разбор Datadog Security Labs)

pg-guard-mcp существует потому, что такой класс багов — «read-only», который обеспечивается только проверкой строки, — всё ещё распространён в экосистеме MCP. Он защищает на трёх независимых уровнях, поэтому ни одна отдельная ошибка не станет фатальной:

  1. Протокольный уровень (настоящая граница). Каждый запрос проходит через расширенный протокол запросов Postgres (Parse/Bind/Execute), но никогда — через простой протокол запросов. Расширенный протокол на структурном уровне не допускает более одного оператора в сообщении Parse — сам Postgres отвергает такой запрос ещё до выполнения нашего кода. Именно поэтому эксплойт Datadog здесь не сработает, какую бы строку ни отправили.

  2. Сессионный уровень. Каждое соединение на уровне сессии устанавливает default_transaction_read_only = on, поэтому даже запрос, который каким-то образом дошёл до базы как операция записи, будет отклонён Postgres.

  3. Уровень предварительной проверки. Ещё до отправки запрос проверяется на несколько операторов и ключевые слова управления транзакциями (COMMIT, ROLLBACK, BEGIN, SAVEPOINT, ...) и отклоняется с понятной ошибкой. Этот уровень существует для быстрого и явного отказа, а не как основная защита.

Кроме того, настоятельно рекомендуется подключаться к базе данных с ролью, у которой права на запись отозваны (REVOKE), и такая настройка проверяется при запуске — двойная страховка и на уровне привилегий.

Инструменты

Инструмент

Что делает

pg_run_query(sql)

Выполняет один оператор только для чтения и возвращает строки

pg_explain_query(sql)

Возвращает план запроса, не выполняя его

pg_list_tables(schema="public")

Перечисляет таблицы/представления в схеме

pg_describe_table(table_name, schema="public")

Перечисляет колонки таблицы

pg_check_privileges()

Сообщает о любых правах на запись, которые фактически есть у подключённой роли, — всегда должна возвращать пустой результат

Настройка

pip install pg-guard-mcp
export PG_GUARD_DSN="host=127.0.0.1 dbname=mydb user=myapp_readonly password=..."
pg-guard-mcp

Направьте ваш MCP-клиент на команду pg-guard-mcp (или uvx pg-guard-mcp, если не нужна постоянная установка), задав PG_GUARD_DSN в конфигурации его окружения.

Все поддерживаемые переменные окружения перечислены в .env.example, а рабочий пример настройки правильно ограниченной read-only роли — в scripts/setup_dev_db.sh (именно на этой настройке выполняются собственные тесты проекта).

Тестирование

pip install -e ".[dev]"
pytest tests/ -v

tests/test_safety.py написан на чистом Python и не требует базы данных. tests/test_db.py и tests/test_server.py запускаются против реального локального экземпляра PostgreSQL — включая ту самую полезную нагрузку эксплойта, из-за которой официальный Postgres MCP-сервер был объявлен устаревшим, — и автоматически пропускаются, если pgguard_test недоступна. Выполните scripts/setup_dev_db.sh один раз, чтобы создать её.

Статус

v0.1.0, опубликована на PyPI. 58 проходящих тестов (модульные + интеграция с живым Postgres, включая тот самый эксплойт, из-за которого официальный server-postgres признан устаревшим, прогнаны на свежей pip install опубликованного пакета).

Лицензия

MIT

Install Server
A
license - permissive license
A
quality
C
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.

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables read-only access to PostgreSQL databases with multi-tenant support, allowing users to query data, explore schemas, inspect table structures, and view function definitions across different tenant schemas safely.
    55
    1
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables secure read-only access to PostgreSQL databases through SELECT queries only, with tools for exploring schemas, listing tables, and executing common queries while preventing any data modification operations.
    505
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides secure, read-only access to PostgreSQL databases for schema inspection and data querying. It enables users to list tables, describe structures, and execute SELECT statements while strictly blocking destructive operations.
    11
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables safe interaction with PostgreSQL databases through read-only queries, schema exploration, and performance analysis.
    225
    MIT

View all related MCP servers

Related MCP Connectors

  • Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.

  • Comprehensive PostgreSQL documentation and best practices, including ecosystem tools

  • Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.

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/BerkantACUN/pg-guard-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server