pgmcp
pgmcp
pgmcp — это сервер операций/администрирования PostgreSQL только для чтения для Model Context Protocol, построенный на официальном modelcontextprotocol/go-sdk. Он отвечает на вопросы, которые DBA задаёт во время инцидента — какие операторы медленные, почему этот план медленный, какие индексы — мёртвый груз, за какими таблицами autovacuum отстал, кто кого блокирует, насколько отстаёт резервный сервер — и он доступен только для чтения по конструкции, а не по соглашению: выделенная роль базы данных без права записи, транзакция BEGIN READ ONLY с таймаутом оператора для каждого оператора и защита парсера SQL, которая отклоняет всё, что не является одним SELECT/EXPLAIN/SHOW, и каждую функцию, которая может изменить состояние внутри транзакции только для чтения. Протестировано на PostgreSQL 16; требуется версия 13 или новее.
Установка
Claude Desktop, в один клик: скачайте pgmcp_<version>.mcpb из Releases и откройте его. Claude Desktop запросит строку подключения к Postgres, сохранит её в связке ключей ОС и сам запустит встроенный бинарник — ничего на PATH, никаких файлов конфигурации для правки. Один пакет покрывает macOS (универсальный) и Windows (x64).
В противном случае скачайте бинарник для вашей платформы из Releases — darwin, linux и windows, amd64 и arm64, с контрольными суммами.
Или соберите из исходников с помощью Go CLI-инструмента go:
go install github.com/pascalallen/pgmcp/cmd/pgmcp@latestИли запустите выпущенный образ, который является distroless, без root-прав и мультиархитектурным:
docker run --rm -i -e PGMCP_DATABASE_URL='postgres://…' ghcr.io/pascalallen/pgmcppgmcp указан в реестре MCP как io.github.pascalallen/pgmcp.
Прежде чем направить его на что-либо, создайте роль только для чтения — см. Роль базы данных. Это слой, который остаётся надёжным, даже если в двух других есть ошибка.
Related MCP server: PostgreSQL MCP Server
Использование
Одна MCP-поверхность, два транспорта. Какой из них запускать — это конфигурация, а не другая сборка.
Claude Code, stdio — клиент запускает бинарник и общается через stdin/stdout:
claude mcp add pgmcp --transport stdio \
--env PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
-- pgmcpClaude Desktop, stdio — установите пакет .mcpb из Releases (см. Установка), или впишите то же самое в claude_desktop_config.json вручную:
{
"mcpServers": {
"pgmcp": {
"command": "pgmcp",
"env": {
"PGMCP_DATABASE_URL": "postgres://pgmcp:…@db.internal:5432/app?sslmode=require"
}
}
}
}HTTP — Streamable HTTP за статическим bearer-ключом, для общего развёртывания. pgmcp говорит на чистом HTTP и сам не завершает TLS; запускайте его на loopback за обратным прокси.
PGMCP_DATABASE_URL='postgres://pgmcp:…@db.internal:5432/app?sslmode=require' \
PGMCP_AUTH_MODE=static \
PGMCP_API_KEYS="$(openssl rand -hex 32)" \
pgmcp --transport http --listen 127.0.0.1:8080claude mcp add pgmcp --transport http https://pgmcp.example.com/mcp \
--header "Authorization: Bearer <key>"Завершение TLS, настройки прокси, необходимые потоковому транспорту, JWT-аутентификация против провайдера идентификации и подключение pgmcp как пользовательского коннектора claude.ai — всё это в docs/DEPLOYING.md.
Инструменты
Инструмент | Вопрос, на который он отвечает |
| Какие операторы медленные или дорогие на всём сервере? Ранжирует |
| Почему этот оператор медленный? Дерево плана, узлы, сжигающие больше всего собственного времени, предупреждения плана и стабильный |
| Какие индексы можно удалить, а какие не выполняют свою работу? Никогда не сканируемые, дублирующиеся, недействительные и раздутые индексы. |
| Где autovacuum отстаёт? Соотношение мёртвых кортежей, последний vacuum/analyze, последовательные и индексные сканирования и оценённое раздутие по таблицам. |
| Почему этот запрос завис? Текущий граф ожидания блокировок — кто заблокирован, кто их блокирует, и любой цикл, который является взаимоблокировкой. |
| Что сервер делает прямо сейчас, и насколько он близок к |
| Насколько отстаёт резервный сервер, и какой слот удерживает WAL? Роль primary/standby, отставание каждого резервного сервера в байтах и миллисекундах, слоты и текущая скорость WAL. |
| Настроен ли этот сервер разумно? |
| Всё, что не покрывают остальные восемь. Один |
Каждый инструмент аннотирован readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false и возвращает типизированную схему вывода.
query — единственный инструмент, который несёт свободный SQL, и он необязателен. --disable-query полностью убирает его из каталога — развёртывание, которому нужны только восемь диагностических инструментов, может работать вообще без какой-либо ad hoc SQL-поверхности. --query-schemas=public,app вместо этого ограничивает его именованными схемами — и ограничивает explain вместе с ним, поскольку analyze=true выполняет оператор; прочитайте, что это останавливает и что не останавливает, в docs/SECURITY.md.
Ресурсы и промпт
Ресурс | Содержимое |
| Снимок сервера, с которого начинать: версия, время работы, состояние восстановления, установленные расширения, размеры баз данных, коэффициент попадания в кэш и соединения относительно |
| Сырые строки |
Промпт | Аргументы | Назначение |
Блок аутентификации применяется только к HTTP-транспорту. Через stdio операционная система решает, кто является вызывающей стороной: родительский процесс, запустивший бинарный файл, и никто другой.
Модель безопасности
Только чтение, тремя независимыми способами. Выделенная роль без права записи (
pg_monitorплюсSELECT, и намеренно неpg_signal_backend);BEGIN READ ONLYсSET LOCAL statement_timeoutиlock_timeout = '2s'вокруг каждого оператора, выполняемого адаптером, всегда с откатом; и защита на уровне парсера, потому что только транзакции только для чтения недостаточно, чтобы остановитьpg_terminate_backend,pg_read_file,pg_sleepилиsetval.SQL-защита построена по принципу «сначала разрешённое». Один оператор верхнего уровня, и он должен быть
SELECT,EXPLAINилиSHOW; никаких вложенных операторов записи в дереве; никакого предложения блокировкиFOR UPDATE/FOR SHARE; никакогоSELECT INTO; и никаких вызовов запрещённых функций — доступ к файлам, управление резервным копированием и WAL, слоты репликации, advisory locks,dblink, изменение последовательностей, сброс статистики.Список разрешённых схем — это ограждение, а не граница.
--query-schemasсопоставляет схемы, определяющие ссылки на таблицы в разобранном операторе, без учёта регистра, и ограничивает оба инструмента, которые принимают SQL от вызывающей стороны —queryиexplain, так чтоexplainсanalyze=trueне может выполняться против схемы, которую вы исключили. Представление, функция, возвращающая набор строк, или функцияSECURITY DEFINERвнутри разрешённой схемы всё ещё может читать данные за её пределами. Границей являются привилегии базы данных; список разрешённого лишь сужает очевидный путь.Аутентифицировано, закрыто при сбое, через HTTP. Статические ключи сравниваются за постоянное время с каждым сохранённым хэшем без раннего выхода; JWT проверяются против набора JWK только с асимметричными алгоритмами (без
alg=none, без путаницы с HMAC) и обязательнымиiss,audиexp, и проверяющий не хранит ключи до получения JWKS, поэтому он начинает в закрытом состоянии, а не в открытом. Защищённые метаданные ресурса RFC 9728 сообщают, где получить токен. Сервер отказывается запускаться на адресе, отличном от loopback, при выключенной аутентификации.Ограничено. Ограничение скорости на каждого субъекта, таймаут на каждый вызов, таймаут оператора и таймаут блокировки внутри транзакции, ограничение на количество строк в инструменте
query, ограничение на структурированное содержимое результата и ограничение размера тела запроса в 1 МиБ.Ничего чувствительного не логируется. Вызов инструмента логирует его имя, длительность, результат и идентификатор пользователя вызывающей стороны — никогда аргументы, текст SQL, строки результата или текст ошибки. Ошибки разбора возвращаются фиксированной фразой, а не повторением оператора, а DSN удаляется из ошибок подключения.
Модель угроз, полный перечень уровней и ограничения, которые каждый из них не покрывает, находятся в docs/SECURITY.md.
Тестирование
Запустите набор тестов с детектором гонок и покрытием:
go test -race -cover ./...Интеграционные тесты требуют базу данных Postgres и пропускаются, когда PGMCP_TEST_DSN не задан. Чтобы запустить их против временной Postgres с предзагруженным pg_stat_statements:
docker run -d --rm --name pg -e POSTGRES_PASSWORD=postgres -p 5544:5432 postgres:16 \
-c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all
docker exec pg psql -U postgres -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements"
PGMCP_TEST_DSN="postgres://postgres:postgres@localhost:5544/postgres?sslmode=disable" go test -race -cover ./...Создайте и просмотрите профиль покрытия:
go test -covermode=count -coverprofile=coverage.out ./...
go tool cover -html=coverage.outПроверьте запущенный сервер через официальный набор соответствия MCP или протестируйте его с помощью Inspector:
npx -y @modelcontextprotocol/conformance server --url http://127.0.0.1:8080/mcp \
--expected-failures .github/conformance-expected-failures.yaml
npx @modelcontextprotocol/inspector --cli http://127.0.0.1:8080/mcp --transport http --method tools/listВклад
Приветствуются pull request'ы. Для значительных изменений, пожалуйста, сначала откройте issue, чтобы обсудить, что вы хотели бы изменить.
Пожалуйста, не забудьте обновить тесты по мере необходимости.
Лицензия
This server cannot be installed
Maintenance
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
- -licenseNot gradedqualityAmaintenanceA Model Context Protocol server that provides read-only access to PostgreSQL databases. This server enables LLMs to inspect database schemas and execute read-only queries.66,13689,405MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server providing LLMs read-only access to PostgreSQL databases for inspecting schemas and executing queries.66,13627MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that provides AI assistants with secure, read-only access to PostgreSQL databases while offering comprehensive tools for schema exploration, query validation, and performance optimization.MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server providing read-only access to PostgreSQL databases, enabling LLMs to inspect database schemas and execute read-only SQL queries.66,136MIT
Related MCP Connectors
Comprehensive PostgreSQL documentation and best practices, including ecosystem tools
MCP server for managing Prisma Postgres.
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/pascalallen/pgmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server