Skip to main content
Glama
thhart

database-mcp

by thhart

database-mcp

SQL MCP сервер для баз данных с настоящей постраничной выдачей результатов на стороне сервера — функция, которой нет ни у одного устоявшегося MCP сервера для баз данных (DBHub ограничивает количество строк, Google's MCP Toolbox возвращает всё, mcp-alchemy обрезает на 4000 символов).

Эталонная реализация для PostgreSQL.

Зачем

Каждый существующий SQL MCP сервер либо обрезает большие результаты, либо сбрасывает их целиком в контекст модели. Спецификация MCP поддерживает пагинацию только для операций list (tools/list), но не для результатов инструментов. database-mcp закрывает этот пробел:

  • Запрос выполняется один раз как серверный курсор PostgreSQL (DECLARE/FETCH FORWARD) внутри удерживаемой транзакции.

  • Каждый fetch(cursor) продолжает ровно с того места, где закончилась последняя страница — без повторного выполнения, без повторного сканирования OFFSET, а снимок MVCC сохраняет результат стабильным даже при конкурентных записях.

  • Страницы ограничены количеством строк (page_size) и размером в байтах (max_page_bytes); слишком большие ячейки обрезаются с явным маркером.

  • Удерживаемые курсоры ограничены: максимум N одновременных (вытеснение LRU), вытеснение по TTL простоя, плюс idle_in_transaction_session_timeout как серверная страховка. Исчерпанные курсоры закрываются автоматически.

Related MCP server: pgsql-mcp

Профили подключения — управляются ИИ в рантайме

Подключения — это именованные профили, сохраняемые в ~/.config/database-mcp/profiles.json (chmod 600). ИИ может добавлять, изменять, тестировать и удалять их на лету через инструменты — без перезапуска сервера:

  • profile_add(name, dsn, allow_writes=false, description, make_default, test=true)

  • profile_remove(name) · profile_test(name) · profiles()

  • каждый инструмент запроса принимает необязательный параметр profile; при его отсутствии используется профиль по умолчанию.

Профили по умолчанию доступны только для чтения (сессионный default_transaction_read_only); запись требует явного профиля с allow_writes=true.

SSH-мост

Профиль может получить доступ к базе данных, доступной только через SSH (классическая схема «Postgres слушает localhost на удалённом хосте»):

profile_add(name="prod", dsn="postgresql://app@dbhost:5432/app",
            ssh_host="dbhost")
  • Туннель — это подпроцесс системного ssh (-N -L, BatchMode, keepalives) — ваш ~/.ssh/config, ключи и агент применяются без изменений. Аутентификация должна работать без интерактивного ввода.

  • ssh_remote_host/ssh_remote_port по умолчанию соответствуют хосту/порту DSN, видимому с SSH-хоста; если хост DSN совпадает с SSH-хостом, по умолчанию используется 127.0.0.1 (обычный случай).

  • Туннели запускаются лениво, проверяются на каждом использовании и автоматически пересоздаются. Если туннель умирает во время пагинации, его курсоры инвалидируются с понятной ошибкой, а следующий запрос переподключается.

  • Мультиплексирование (ControlMaster) явно отключено для туннельных соединений, чтобы время жизни туннеля точно совпадало с временем жизни подпроцесса.

Инструменты

Инструмент

Назначение

query

Выполнить SQL, получить первую страницу + cursor, если есть ещё строки

fetch

Следующая страница из удерживаемого курсора — без повторного выполнения

close

Закрыть один/все курсоры досрочно

tables

Список таблиц/представлений с оценкой строк и размерами

describe

Колонки, ограничения, индексы одной таблицы

explain

План запроса (опционально analyze)

overview

Ориентационная карточка: все таблицы + оценка строк + имена колонок одним вызовом

search_objects

Поиск таблиц/колонок/функций по имени или комментарию

profile

Статистика колонок из pg_stats — распределения без сканирования

relations

Внешние ключи таблицы, в обе стороны

join_path

Кратчайший путь по внешним ключам между двумя таблицами как готовая цепочка JOIN

count

Мгновенная оценка планировщика (опционально where), exact=true для реального count(*)

sample

Действительно случайные строки через TABLESAMPLE (без смещения LIMIT)

profiles / profile_add / profile_remove / profile_test

Управление подключениями в рантайме

status

Профили, пулы, открытые курсоры, лимиты

Результаты — компактный JSON: колонки один раз, строки как массивы — примерно вдвое меньше токенов, чем формат «строка-словарь», который используют другие серверы. query также возвращает estimated_rows (оценка планировщика через EXPLAIN), чтобы модель знала, с чем она работает при пагинации.

Установка и запуск

uv pip install -e .
database-mcp --dsn postgresql://user@host:5432/db      # registers profile "default"
database-mcp                                           # start empty, add profiles at runtime

Регистрация в Claude Code:

claude mcp add database -- database-mcp --dsn postgresql://user@host:5432/db

Опции: --profiles FILE, --allow-writes, --page-size 50, --max-page-size 500, --max-page-bytes 32000, --max-cell 400, --cursor-ttl 300, --max-cursors 4, --statement-timeout 30, --keepalive 120, --connect-timeout 5. Переменные окружения: DATABASE_MCP_DSN / DATABASE_URL, DATABASE_MCP_PROFILES.

Обработка устаревших соединений

Мёртвые соединения обнаруживаются быстро на каждом уровне, а не зависают:

  • SSH-туннели: ServerAliveInterval = --keepalive (по умолчанию 2 мин) с ServerAliveCountMax=1 — один пропущенный пробный пакет завершает процесс туннеля, который менеджер движка обнаруживает при следующем использовании и лениво пересоздаёт.

  • Соединения с БД: TCP keepalives (keepalives_idle = --keepalive, пробы каждые 10 с, 3 пропуска) ловят мёртвых пиров за ~30 с — включая закреплённые курсорные соединения вне пула.

  • Проверка при выдаче из пула: каждое выдаваемое соединение проверяется дешёвым round-trip; устаревшее отбрасывается и прозрачно заменяется — вызывающий никогда не видит ошибку. Простаивающие соединения в пуле перерабатываются через --keepalive секунд; попытки подключения завершаются ошибкой через --connect-timeout (по умолчанию 5 с) вместо стандартных ~2 мин TCP.

Тесты

uv pip install -e '.[dev]'
pytest            # needs a local PostgreSQL (DBMCP_TEST_DSN to override)

Лицензия

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
    B
    quality
    D
    maintenance
    Enables comprehensive PostgreSQL database management including index tuning, query plan analysis, health monitoring, schema-aware SQL generation, and safe SQL execution with configurable access control for both development and production environments.
    9
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables interaction with PostgreSQL databases through comprehensive database management tools including index tuning, query execution plans, health checks, schema intelligence, and safe SQL execution with configurable read-only mode for production use.
    35
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables querying PostgreSQL databases via MCP, with multi-database routing, credential isolation, and truncated results plus full CSV export.

View all related MCP servers

Related MCP Connectors

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

  • Connect to PlanetScale databases, branches, schema, query insights, and execute SQL

  • Comprehensive PostgreSQL documentation and best practices, including ecosystem tools

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/thhart/database-mcp'

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