mcp-postgres
Provides read-only access to PostgreSQL databases, allowing schema introspection and SELECT queries while blocking write operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-postgreslist tables in the public schema"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-postgres
Хотите просто подключить сервер в Claude? → CLAUDE_SETUP.md — пошаговая инструкция (Claude Code и Claude Desktop, со скриншотами). Дальше в этом файле — про то, как устроен сам проект.
Read-only MCP-сервер для PostgreSQL на Python.
Даёт LLM-клиенту (Claude Code, Claude Desktop, любой MCP-совместимый клиент) доступ
к базе только на чтение: интроспекция схемы и SELECT-запросы. Любые изменяющие
операции — INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, TRUNCATE, GRANT,
COPY, CALL и т.д. — отклоняются.
Сервер доменно-нейтральный: он ничего не знает о бизнес-логике конкретной базы, только механика доступа, защита и аудит.
Какой транспорт когда запускать
stdio | http | |
Кто запускает процесс | MCP-клиент сам стартует сервер как дочерний процесс | вы: |
Где лежат креды к БД | в | в |
Защита доступа | не нужна (процесс локальный) | bearer-токен |
Когда выбирать | персональный доступ аналитика к своей БД | общий сервис на команду / общая сервисная роль |
Related MCP server: tusk-mcp
Три уровня защиты от записи
Валидатор SQL (sql_guard.py) — разбирает запрос в AST (
sqlglot, диалект postgres) и пропускает толькоSELECT/WITH ... SELECT/VALUES.Сессия Postgres (db.py) — соединение открывается с
default_transaction_read_only=on. Даже если валидатор пропустит запись, её отклонит сам Postgres.Права роли БД — главный рубеж: отдельная роль с
GRANT SELECT. Сервер не имеет инструмента смены кредов — какие права у роли, такие и у клиента.
Инструменты
Инструмент | Назначение |
| К чему подключены, какая роль, какие лимиты и гарантии read-only |
| Схемы, доступные роли, с числом объектов |
| Таблицы и представления: тип, размер, оценка строк, комментарий |
| Колонки, типы, NOT NULL, DEFAULT, комментарии, ограничения, индексы |
| Индексы с определением, размером и статистикой использования |
| Размеры, live/dead tuples, последний vacuum/analyze |
| План выполнения ( |
| Выполнение читающего запроса. Параметры: |
Запуск: stdio (локально)
Нужен Python 3.11+. Устанавливать пакет не надо — только зависимости:
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txtВ mcp.json клиента (полный пример — examples/mcp.json):
{
"mcpServers": {
"postgres": {
"command": "/путь/к/репозиторию/.venv/bin/python",
"args": ["/путь/к/репозиторию/run_server.py"],
"env": {
"PG_HOST": "db.example.com",
"PG_PORT": "5432",
"PG_DATABASE": "analytics",
"PG_USER": "mcp_readonly",
"PG_PASSWORD": "СЮДА_ПАРОЛЬ",
"PG_SSLMODE": "require"
}
}
}
}Запуск: http (Docker)
cp .env.example .env # заполнить креды и MCP_HTTP_AUTH_TOKEN
docker compose up -d --build
curl -s localhost:8000/healthВ mcp.json клиента:
{
"mcpServers": {
"postgres": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp",
"headers": { "Authorization": "Bearer СЮДА_ТОКЕН" }
}
}
}Логи — docker compose logs -f, остановить — docker compose down.
На Linux каталог
./logsмонтируется внутрь контейнера: он должен быть доступен на запись пользователюuid 10001, иначе сервер откажется стартовать (chown 10001 logsилиchmod 777 logs).
Локальный Postgres для разработки
Нужен только для быстрой проверки, что сервер вообще работает — не для прод-данных:
docker compose -f docker-compose.postgres.yml up -dПоднимает голый postgres:15 с суперпользователем postgres/postgres. Оба
compose-файла используют общую сеть mcp-net, поэтому в .env сервера достаточно
PG_HOST=postgres. Данные лежат в ./data (в git не попадают), down их не трогает.
Read-only роль под реальный доступ создаётся отдельно, вручную — см. SQL в разделе «Три уровня защиты» выше.
Конфигурация
Всё задаётся переменными окружения (в mcp.json → env или в .env для Docker).
Полный список с комментариями — в .env.example.
Подключение: PG_DSN (или DATABASE_URL) либо по частям — PG_HOST, PG_PORT,
PG_DATABASE, PG_USER, PG_PASSWORD, PG_SSLMODE.
Транспорт: MCP_TRANSPORT = stdio | http, MCP_HTTP_HOST, MCP_HTTP_PORT,
MCP_HTTP_PATH, MCP_HTTP_AUTH_TOKEN.
Лимиты на запрос: MCP_MAX_ROWS (1000), MCP_MAX_RESULT_BYTES (1 000 000),
MCP_MAX_SQL_LENGTH (20 000), PG_STATEMENT_TIMEOUT_MS (30 000), MCP_ALLOWED_SCHEMAS,
MCP_ALLOW_EXPLAIN_ANALYZE (по умолчанию false).
Логи и аудит: LOG_LEVEL, LOG_FORMAT (text | json), LOG_FILE, LOG_SQL, AUDIT_FILE.
Логи и аудит
Два независимых потока.
Логи работы сервера — старт, подключение к БД, ошибки, отказы авторизации. Всегда идут
в stderr (и опционально в LOG_FILE): stdout занят JSON-RPC.
Журнал аудита — по одному JSONL-событию на каждый вызов инструмента: кто, что и когда
делал (tool, status, db_user/db_name, sql, row_count и т.д.), но без данных
результата — только их объём. Пишется в AUDIT_FILE (по умолчанию ./logs/audit.jsonl);
если файл недоступен на запись, сервер не стартует.
Тесты
Автотестами покрыт SQL-валидатор — та часть, где ошибка стоит дороже всего:
python -m pytest -q # именно `python -m`, из корня репозиторияОстальное проверяется вручную из MCP-клиента: connection_info → list_tables
→ describe_table → query.
Ограничения
Одна база на процесс. Смена подключения на лету не предусмотрена намеренно: креды = identity, и менять их должен конфиг, а не модель.
paramsработает с плейсхолдерами%s(psycopg), не$1.Курсоры/стриминг больших выборок не поддерживаются: ответ всегда ограничен
MCP_MAX_ROWSиMCP_MAX_RESULT_BYTES.
This server cannot be deployed
Maintenance
Related MCP Connectors
- dataOAuthco.thinair
Read-only PostgreSQL, MySQL, SQL Server access via MCP — 24 dialect-aware hosted tools.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query your Postgres from ChatGPT or Claude without exposing the database or handing over credentials. Run npx boltschema connect next to your database and it dials out over HTTPS — no inbound firewall rule, no open port, works with localhost and VPC-private databases. Read-only is enforced by a SQL guard, a Postgres READ ONLY transaction, and a scoped role generated for you.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server allowing AI assistants like Claude to execute read-only SQL queries against AWS PostgreSQL databases, enabling data retrieval while preventing database modifications.-
- AlicenseNot gradedqualityCmaintenanceA read-only PostgreSQL MCP server that enables AI agents to perform schema introspection and execute SELECT-only queries. It supports secure database connections through SSL and SSH tunnels while offering a structure-only mode to restrict query access.10MIT
- AlicenseNot gradedqualityDmaintenanceRead-only PostgreSQL MCP server that enables running SELECT queries, listing tables and schemas, and describing columns, with built-in protection against writes and malicious SQL attacks.300MIT
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server for PostgreSQL, enabling schema discovery, table metadata, and safe SELECT queries via READ ONLY transactions.25MIT