db-readonly-mcp
db-readonly-mcp
Сервер MCP, который даёт ИИ-ассистенту (Claude Code, Claude Desktop или любому другому MCP-клиенту) защищённый, только для чтения доступ к базе данных Postgres. Можно спросить что-то вроде «покажи всех мерчантов, созданных вчера» — и ассистент напишет SQL и выполнит его через этот сервер, который гарантирует, что запрос сможет только читать данные.
Только Postgres — другие базы данных не поддерживаются.
Зачем это существует
Предоставление ассистенту прямого доступа к вашей базе данных действительно полезно для отладки, исследования данных и ответов на вопросы вида «сколько X» без необходимости писать скрипт каждый раз. Риск очевиден: LLM может галлюцинировать или быть спровоцирован на написание деструктивного запроса. Этот сервер существует, чтобы свести этот риск почти к нулю, используя несколько независимых уровней защиты, а не полагаясь на какой-то один.
Related MCP server: Postgres Scout MCP
Модель безопасности
Многоуровневая, в порядке степени доверия к каждому уровню:
Роль БД — подключение использует выделенную роль Postgres с грантами только на
SELECT. Это настоящая граница: даже если все остальные уровни будут обойдены, роль не сможет писать.Валидация запросов — отклоняется всё, что не является одиночным оператором
SELECT/WITH ... SELECT(никаких операторов, разделённых точкой с запятой, никаких ключевых слов DDL/DML).Принудительный
LIMIT— каждый запрос оборачивается вSELECT * FROM (...) LIMIT N, с ограничением сверхуMAX_LIMITнезависимо от того, что запрошено.statement_timeout— запросы прерываются послеSTATEMENT_TIMEOUT_MS.Журнал запуска — при старте в stderr выводится подключённая база данных/пользователь, чтобы было очевидно, к какой БД вы подключены, до выполнения любого запроса.
Направляйте этот сервер только на dev/test/staging базу данных — никогда на production. Уровни 2–5 — это эшелонированная защита; уровень 1 (роль БД) — единственный уровень, которому действительно стоит доверять, и даже ему не стоит доверять прод-данные.
Требования
Node.js >= 20
База данных Postgres, в которой вы можете создать роль
MCP-клиент (например, Claude Code, Claude Desktop или любой другой клиент, поддерживающий MCP-серверы через stdio)
Установка
1. Клонирование и установка
git clone https://github.com/david-mogbeyi/db-readonly-mcp.git
cd db-readonly-mcp
npm install2. Создание роли только для чтения
Выполните это для вашей целевой базы данных Postgres — замените имя роли, пароль,
имя базы данных и схему/владельца, если ваше приложение использует что-то кроме public:
CREATE ROLE myapp_readonly WITH LOGIN PASSWORD '<choose-a-password>';
GRANT CONNECT ON DATABASE myapp TO myapp_readonly;
GRANT USAGE ON SCHEMA public TO myapp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myapp_readonly;
-- Keeps future tables (new migrations) readable automatically, without
-- re-running this grant every time the schema changes.
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO myapp_readonly;Если ваша схема не public или у вас несколько схем, повторите строки
GRANT USAGE/GRANT SELECT/ALTER DEFAULT PRIVILEGES для каждой из них. Этот сервер
в настоящее время запрашивает только схему public для list_tables/describe_table, но
query_readonly может обращаться к любой схеме, к которой роли предоставлен доступ.
3. Настройка
cp .env.example .envОтредактируйте .env и задайте DATABASE_URL — строку подключения роли только для чтения:
DATABASE_URL=postgresql://myapp_readonly:<password>@localhost:5432/myappОстальные переменные см. в разделе Конфигурация ниже.
4. Сборка
npm run buildЭто компилирует src/ в dist/ через tsc. Повторно запускайте после получения изменений или
правки исходного кода.
Регистрация в MCP-клиенте
Claude Code
В проекте, из которого вы хотите выполнять запросы, добавьте .mcp.json (или отредактируйте
существующий):
{
"mcpServers": {
"db-readonly": {
"command": "node",
"args": ["/absolute/path/to/db-readonly-mcp/dist/index.js"],
"env": {
"DATABASE_URL": "postgresql://myapp_readonly:<password>@localhost:5432/myapp"
}
}
}
}Замените /absolute/path/to/db-readonly-mcp на путь, куда вы клонировали этот репозиторий.
Перезапустите Claude Code (или переподключите MCP-серверы), чтобы изменения вступили в силу.
Также можно зарегистрировать его глобально, а не для конкретного проекта — см. документацию
Claude Code MCP по claude mcp add и
вариантам области действия.
Claude Desktop / другие MCP-клиенты
Любой клиент, поддерживающий MCP-серверы через stdio, может использовать это так же: укажите
ему node /absolute/path/to/db-readonly-mcp/dist/index.js с DATABASE_URL (и
при необходимости остальными переменными окружения ниже), заданными в его окружении. См.
документацию вашего клиента о том, где находится конфигурация MCP-сервера — для Claude Desktop
это claude_desktop_config.json с той же структурой command/args/env, что и выше.
Конфигурация
Вся конфигурация задаётся через переменные окружения (в .env для локальных запусков или в
блоке env конфигурации вашего MCP-клиента).
Переменная | Обязательная | По умолчанию | Описание |
| Да | — | Строка подключения Postgres для роли только для чтения. |
| Нет | 100 | Лимит строк, применяемый, когда запрос не указывает свой. |
| Нет | 1000 | Жёсткий потолок возвращаемых строк независимо от запрошенного. |
| Нет | 5000 | Postgres |
Инструменты
Сервер предоставляет ассистенту три инструмента:
list_tables
Выводит список таблиц в схеме public. Без аргументов.
→ [
{ "table_name": "merchants" },
{ "table_name": "orders" },
...
]describe_table(table)
Колонки, типы, допустимость NULL и значения по умолчанию для таблицы в схеме public.
{ "table": "merchants" }
→ [
{ "column_name": "id", "data_type": "uuid", "is_nullable": "NO", "column_default": "gen_random_uuid()" },
{ "column_name": "created_at", "data_type": "timestamp with time zone", "is_nullable": "NO", "column_default": "now()" },
...
]query_readonly(sql, limit?)
Выполняет один защищённый оператор SELECT (или WITH ... SELECT). limit необязателен
и ограничивается сверху MAX_LIMIT, даже если передано большее значение.
{ "sql": "SELECT id, name, created_at FROM merchants WHERE created_at > now() - interval '1 day'" }
→ { "rowCount": 3, "rows": [ { "id": "...", "name": "...", "created_at": "..." }, ... ] }Всё, что не является одиночным оператором SELECT/WITH — несколько операторов, DDL,
DML, SET и т. д. — отклоняется до обращения к базе данных, с объяснением причины.
Локальная разработка
npm run dev # runs src/index.ts directly via tsx, loads .env via Node's --env-fileСтруктура проекта
src/
index.ts # MCP server setup and tool definitions
sqlGuard.ts # query validation (layer 2 of the safety model)
db.ts # Postgres pool setup (statement_timeout, pool size)
config.ts # env var loading/validationУстранение неполадок
«DATABASE_URL environment variable is required» —
.envотсутствует или не загружается; убедитесь, что он существует (изcp .env.example .env) и что блокenvвашего MCP-клиента илиnpm run dev/npm startего подхватывает.Сервер при запуске логирует не ту базу данных/пользователя — проверьте
DATABASE_URL; журнал запуска (connected as "..." to database "...") выводится именно для того, чтобы это было легко заметить до выполнения любого запроса.«Query rejected: ...» — запрос либо не был одиночным оператором
SELECT/WITH, либо содержал запрещённое ключевое слово. Это уровень 2 модели безопасности работает как задумано, а не ошибка.Запрос зависает, затем завершается ошибкой — скорее всего, сработал
STATEMENT_TIMEOUT_MS; увеличьте его в.env, если вашей нагрузке действительно нужно больше времени, или оптимизируйте запрос.
Участие в разработке
Приветствуются issues и pull request'ы. Это намеренно небольшой, проверяемый инструмент — цель в том, чтобы модель безопасности оставалась достаточно простой для полного прочтения, а не превращалась в универсальный конструктор запросов.
Лицензия
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
- FlicenseAqualityDmaintenanceEnables AI assistants to interact with PostgreSQL databases using natural language queries, providing secure read-only access to database schemas and SQL translation capabilities.67
- AlicenseNot gradedqualityDmaintenanceEnables 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.90Apache 2.0
- AlicenseNot gradedqualityNot gradedmaintenanceProvides AI assistants with safe, controlled access to PostgreSQL databases with read-only defaults, granular permissions, query safety features, and schema introspection capabilities.1
- FlicenseAqualityCmaintenanceEnables read-only exploration of a Postgres database using natural language, with multiple safety layers to prevent any modifications.5
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
Deterministic validation for AI-generated artifacts: JSON Schema, OpenAPI response, SQL syntax.
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/david-mogbeyi/db-readonly-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server