postgres-mcp
postgres-mcp
Универсальный, повторно используемый MCP сервер для запросов только на чтение к любой базе данных Postgres через Claude (или любого MCP-совместимого клиента). Он не знает ни одной конкретной схемы — list_tables, describe_table и run_sql работают исключительно на основе information_schema и общей интроспекции jsonb, поэтому его можно направить на любую базу данных Postgres без изменения кода.
Security model
Два независимых уровня, эшелонированная защита:
Уровень БД: сервер подключается как роль, которой предоставлен только
SELECT, — то есть он не может записывать данные, даже если запрос попытается это сделать. Создайте эту роль с помощьюsetup_reader_role.sql.Уровень приложения:
run_sql()отклоняет всё, что не является обычнымSELECT(илиWITH ... SELECT), ограничивает результат 200 строками и устанавливает 5-секундный тайм-аут выполнения — всё это работает как быстрая проверка до обращения даже к базе данных.
Related MCP server: pg-mcp
Setup
Создайте роль только для чтения в целевой базе данных:
Откройте
setup_reader_role.sql, замените плейсхолдер пароля и<your_db_name>на реальные значения, затем выполните его один раз в вашей базе данных (например, черезpsqlили консоль SQL вашего провайдера БД).
Укажите строку подключения в файле
.envв этом каталоге:DATABASE_URL=postgresql://mcp_reader:yourpassword@host:5432/yourdb ANTHROPIC_API_KEY=sk-ant-...(
ANTHROPIC_API_KEYпотребуется только дляchat.py, а не для запуска MCP-сервера.)Установите зависимости:
pip install -r requirements.txt
Локальное тестирование
Сначала проверьте слой запросов напрямую, без участия MCP-клиента:
python chat.py "what tables do I have?"Затем протестируйте его как настоящий MCP-сервер с помощью Inspector:
fastmcp dev inspector mcp_server.pyЕсли у вас возникнут проблемы с инструментальным набором Node.js для Inspector (такое уже случалось), используйте запасной вариант: запустите сервер напрямую через HTTP и обращайтесь к нему с помощью Python-клиента FastMCP:
fastmcp run mcp_server.py --transport http --port 8000from fastmcp import Client
import asyncio
async def main():
async with Client("http://localhost:8000/mcp") as client:
print(await client.call_tool("list_tables", {}))
asyncio.run(main())Развертывание (Prefect Horizon)
Платформа размещения FastMCP сейчас называется Prefect Horizon (раньше это был «FastMCP Cloud» — брендинг уже менялся, поэтому перед этими шагами сверьте актуальное название и URL на gofastmcp.com/deployment, чтобы убедиться, что название снова не изменилось).
Отправьте репозиторий на GitHub — удаленный репозиторий должен существовать (если ещё нет, см. команды git в конце этого README).
Перейдите на сайт текущей платформы (на момент написания — horizon.prefect.io) и войдите через GitHub.
Подключите этот репозиторий.
Настройте развертывание:
Входная точка:
mcp_server.py:mcp— часть:mcp— это имя переменной, которой присваивается серверный объект в файле (см. строкуmcp = FastMCP(...)вmcp_server.py). Если вы переименуете эту переменную или перенесете файл, эту строку входной точки нужно будет изменить, чтобы она точно соответствовала новому имени и пути.Аутентификация: включите её. Интерактивные MCP-клиенты, такие как claude.ai и Claude Desktop, требуют настоящих конечных точек OAuth Discovery для подключения. Сервер без аутентификации не будет работать с такими клиентами, даже если при прямом тестировании с помощью обычного API-вызова или Python-клиента FastMCP всё работает корректно.
Переменные окружения: добавьте
DATABASE_URLв панель управления платформы. Это значение отдельная от локального файла.envэтого проекта и не читается оттуда — его необходимо ввести непосредственно в панели, чтобы развернутый сервер получил доступ к БД.
Разверните сервер и скопируйте полученный URL. Он будет выглядеть примерно так:
https://<name-вашего-сервера>.fastmcp.app/mcp(фактический домен может отличаться — используйте то, что вам показывает платформа).Прежде чем интегрировать его куда-либо ещё, протестируйте его встроенным инструментом Inspector/тестрования платформы. Сначала вызовите там
list_tables— ему не требуется аргументов, поэтому это самый быстрый способ убедиться, что развернутый сервер действительно может достичь вашу базу данных.
Подключение к claude.ai
Перейдите в claude.ai → Настройки → Подключения → Добавить собственный коннектор.
Вставьте URL развернутого сервера с предыдущего шага.
Пройдите шаги OAuth, который он вам предложит.
Начните новый диалог (не тот, который был начат до добавления коннектора) и включите коннектор в этом диалоге.
Проверьте его простым вопросом, например «какие таблицы у меня есть?»
Если позже вы add new tools and they don't appear, в настройках коннектора нажмите "Обновить инструменты", а не считайте, что что-то сломано — это известное поведение кэширования, а не ошибка.
Ограничения
Он действительно не привязан к схеме, но не это значит, что у него всех ограничений:
Привязано к Postgres. Он использует
jsonb_object_keys()и синтаксис каталогов Postgres (information_schemaи т. д.). Направить его на MySQL или SQLite потребовало бы реальных изменений кода вdb_tools.py, а не просто новой строки подключения.Отсутствие привязки к схеме ≠ нулевая настройка для каждой БД. Каждая новая целевая база данных по-прежнему требует использования собственной роли только для чтения (
setup_reader_role.sql) и собственного развертывания (или по крайней мере свойDATABASE_URL), чтобы они были на неё. Это не единый сервер, который прозрачно обслуживает несколько баз данных.
Настройка git
Если вы начинаете работать с этим кодом и у вас ещё нет истории git:
git init
git add .
git commit -m "Initial commit: generic read-only Postgres MCP server"
git branch -M main
git remote add origin <your-repo-url>
git push -u origin mainThis 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
- FlicenseNot gradedqualityDmaintenanceEnables interaction with PostgreSQL databases through MCP, allowing users to explore database structures, inspect table schemas, and execute read-only SQL queries.
- FlicenseNot gradedqualityDmaintenanceEnables natural language querying of PostgreSQL databases through the Model Context Protocol. It translates user questions into validated SQL, executes read-only queries safely, and returns results to MCP-compatible clients like Claude Desktop.
- AlicenseAqualityAmaintenanceQuery and manage PostgreSQL databases from Claude Code, Cursor, and any MCP client, with read-only by default and built-in schema introspection, EXPLAIN, and performance diagnostics.211,8093MIT
- AlicenseAqualityBmaintenanceExposes PostgreSQL query execution, EXPLAIN, and schema inspection tools to MCP-compatible clients like Claude Desktop.31MIT
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
MCP server for managing Prisma Postgres.
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/sajjad-hk/postgres-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server