Подключаем Claude Code к базе данных: реальные запросы через MCP

Подключите PostgreSQL к Claude Code через MCP, настройте аккаунт только для чтения с контролем прав — Claude сам читает схемы, пишет запросы и анализирует данные.


После подключения базы данных Claude Code работает иначе. Не нужно копировать структуру таблиц в промпт и объяснять названия полей — Claude подключается напрямую, читает схему сам, пишет запросы и анализирует результаты.

В статье используется PostgreSQL как пример, и мы разбираем весь процесс от настройки до реального использования.

Какой MCP Server использовать

Официальный @modelcontextprotocol/server-postgres поддерживает:

  • Чтение схемы всех таблиц (имена полей, типы, ограничения)
  • Выполнение SQL-запросов и возврат результатов
  • Несколько схем

Только чтение. Этот Server предназначен исключительно для запросов — INSERT, UPDATE, DELETE не выполняет.

Установка

npm install -g @modelcontextprotocol/server-postgres

Настройка

Отредактируйте .claude/settings.json (уровень проекта):

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://readonly_user:password@localhost:5432/myapp_production"
      ]
    }
  }
}

Формат строки подключения: postgresql://USER:PASSWORD@HOST:PORT/DATABASE

Чтобы не хранить пароль в файле конфигурации, используйте переменную окружения:

{
  "mcpServers": {
    "db": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "DATABASE_URL": "postgresql://readonly_user:password@localhost:5432/myapp_production"
      }
    }
  }
}

Если .claude/settings.json коммитится в git, убедитесь, что пароль не хранится в открытом виде. Чувствительную конфигурацию кладите в .claude/settings.local.json и добавляйте его в .gitignore.

Сначала создайте аккаунт только для чтения

Не давайте Claude аккаунт с правами записи. Создайте пользователя только для чтения в PostgreSQL:

CREATE USER claude_readonly WITH PASSWORD 'your_password';
GRANT CONNECT ON DATABASE myapp_production TO claude_readonly;
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO claude_readonly;

Таблицы, которые не нужно показывать Claude (sessions, audit_logs), просто не включайте в права доступа или перенесите в отдельную схему.

Проверка подключения

Перезапустите Claude Code и спросите:

Выведи список всех таблиц в базе данных

Если Claude вернёт список таблиц вместо «у меня нет доступа к базе данных» — MCP работает.

Примеры реального использования

Сценарий 1: Понять структуру данных

Какая связь между таблицами users и orders?
Есть ли ограничения внешних ключей?

Сценарий 2: Анализ данных

Из пользователей, зарегистрировавшихся за последние 30 дней,
какой процент сделал хотя бы один заказ?
С разбивкой по каналу регистрации.

Сценарий 3: Отладка

Найди заказы со status = 'pending', созданные более 7 дней назад.
Сколько их и когда создан последний?

Сценарий 4: Помощь в разработке

Хочу добавить колонку last_login_at в таблицу users.
Напиши SQL миграции и проверь, хватает ли существующих индексов.

Контроль видимости для Claude

На уровне таблиц

GRANT SELECT ON TABLE users, orders, products TO claude_readonly;

Фильтрация чувствительных полей через view

CREATE VIEW users_safe AS
  SELECT id, email, created_at, plan, status FROM users;
GRANT SELECT ON users_safe TO claude_readonly;

Подключение к удалённой базе

Используйте SSH-туннель:

ssh -L 5433:localhost:5432 [email protected] -N

Затем в конфигурации укажите локальный порт.

Что меняется на практике

Самое заметное изменение: разговоры о данных больше не требуют предисловий. Не нужно объяснять схему и типы полей — просто говорите что нужно, Claude сам разберётся. Особенно полезно при отладке: вместо того чтобы самому делать запрос, копировать и вставлять результаты, вы описываете проблему — Claude запрашивает напрямую и выдаёт выводы.