Про протокол MCP (Model Context Protocol) сейчас говорят всё чаще. Этот протокол позволяет нейросетям общаться с внешним миром. С его помощью к LLM можно подключать любые источники данных или системы управления, и всё это через один универсальный стандарт. MCP часто сравнивают с USB - устройство одно, протокол один, а число сценариев применения практически бесконечно.

В статье расскажу про практический сценарий "как связать LLM и базу данных". Это может сделать любой на своём компьютере.

Протокол MCP придумали ребята из Anthropic. Далее будем использовать нейросети Claudе Sonnet и Claude Opus - это LLM от Anthropic.

Зачем это нужно? Такая связка позволит промтами вытаскивать инсайты из данных, создавать отчёты в PDF и строить интерактивные отчёты в HTML. Это работает на моём компьютере последние два месяца и результаты очень обнадёживающие.

Чтобы было интереснее, в качестве данных возьмём все вакансии Habr Career c описаниями. Данные - часть пет-проекта анализа зарплат VILKY. Данные нормализируются, валюты переводятся по курсу ЦБ и т.д. Делаем втроём: Саша, Никита, Рома. Есть публичный дашборд и канал с аналитикой и автоотчётами. Все ссылки платформ-агрегаторов сохраняются.

РАЗВОРАЧИВАЕМ БАЗУ ДАННЫХ И MCP-СЕРВЕР

Что надо, чтобы подключить базу данных к MCP-серверу:

  1. База данных. В нашем случае - PostgreSQL

  2. MCP-сервер

  3. Claude Desktop c Pro подпиской (20$)

В примере будем использовать Postgres MCP Pro - опенсорсный MCP сервер. У проекта есть страница Postgres MCP Pro на GitHub с подробными инструкциями по установке и настройке.

Будем устанавливать в докере - Option 1: Using Docker из инструкции

  1. скачиваем и устанавливаем Docker Deskop

  2. Выполняем во внутреннем терминале Docker:
    docker pull crystaldba/postgres-mcp

Docker Desktop подтянет образы из репозитория и развернёт контейнеры

Docker-compose.yml ниже запускает связку:

  • Postgres 15 (с пользователем user, паролем password, базой mydb),

  • MCP-сервер (образ postgres-mcp, работает на порту 8080 и использует конфиг ./config/mcp.yaml).

Всё вместе будет отображаться в Docker Desktop как одна группа mcp-server.

version: "3.9"

services:
  postgres:
    image: postgres:15
    container_name: postgres
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  mcp:
    image: postgres-mcp
    container_name: mcp
    ports:
      - "8080:8080"
    environment:
      - MCP_CONFIG=/config/mcp.yaml
    volumes:
      - ./config:/config
    depends_on:
      - postgres

volumes:
pgdata:


Конфигурационный файл для контейнера postgres-mcp mcp.yaml говорит MCP-серверу, как подключаться к Postgres и какие запросы разрешено выполнять. Здесь разрешены только SELECTы для безопасности.

listen_addr: "0.0.0.0:8080"
default_database:
  host: postgres
  port: 5432
  user: user
  password: password
  dbname: mydb
allowed_sql_patterns:
  - "(?i)^SELECT\\b"
log_level: info

В итоге, в Docker Desktop будет запущена группа контейнеров с образами postgres-mcp и postgres:

БАЗА ДАННЫХ И DBEAVER

После того как контейнер с PostgreSQL поднят, база данных у нас пустая. Чтобы с ней работать, будем использовать DBeaver - универсальный клиент для любых СУБД. Можете использовать другой.

  1. Откройте DBeaver и создайте новое подключение:
    Database → New Database Connection → PostgreSQL.

  2. В настройках подключения укажите:
    Host: localhost
    Port: 5432
    Database: mydb
    Username: user
    Password: password (или тот пароль, который вы указали в docker-compose.yml).

  3. Остальные параметры можно оставить по умолчанию.

Нажмите Test Connection. Если всё настроено верно, DBeaver подключится к PostgreSQL.

Теперь можно:

  • создавать таблицы (через запросы или мастера в DBeaver),

  • загружать данные из CSV/TSV/Excel,

  • выполнять SQL-запросы и проверять содержимое таблиц.

Внизу есть кнопка “Test Connection”. При нажатии на неё подключение должно пройти успешно, если все верно сделали.

НАПОЛНЕНИЕ ТАБЛИЦ

По умолчанию в PostgreSQL есть схема public. Можно или эту использовать или новую схему создать. В нашем случае будет использоваться схема sandbox.

В базе данных надо создать таблицу и записать туда данные. Для простоты в нашем случае сделаем только одну таблицу. Там будут все доступные данные с habr career - 120k+ вакансий.

Скрипт на питоне забирает данные из csv и записывает их в базу данных.

Так выглядят данные, к которым подключим Claude.

Дополнительно поля в конкретном случае не описываются - LLM понимает их по названиям.

ПОДКЛЮЧЕНИЕ CLAUDE К БАЗЕ ДАННЫХ

Важно: подключение MCP работает только с подпиской Claude Pro (20 $/мес).

  1. В Claude Desktop откройте меню:
    File → Settings → Local MCP Servers.

  2. Нажмите Edit Config. Откроется json-файл конфигурации.

  3. Добавьте туда описание MCP-сервера PostgreSQL:

У меня работает с таким конфигом для Винды.

%APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "postgres": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "DATABASE_URI=postgresql://user:password@host.docker.internal:5432/postgres",
        "crystaldba/postgres-mcp",
        "--access-mode=restricted"
      ]
    }
  }
}

При настройке MCP-сервера можно задать режим доступа:

  • restrictedread-only, то есть LLM сможет выполнять только SELECT-запросы (без INSERT/UPDATE/DELETE). Это самый безопасный вариант для аналитики и экспериментов.

  • full — полный доступ ко всем операциям (используется реже и только в тестовых окружениях).

В Claude Desktop после запуска сервера в разделе Local MCP Servers появится ваш источник.
Если всё настроено правильно, надпись running (синим цветом) будет означать успешное подключение LLM к базе данных.

ЗАПРОСЫ К БАЗЕ НА ЕСТЕСТВЕННОМ ЯЗЫКЕ

Теперь начинается самое интересное - мы можем общаться с данными.

Простые вещи вроде средней или максимальной зарплаты легко достаются обычным SQL-запросом. Но у нас под капотом - одна из самых мощных LLM, и это значит, что можно спрашивать задачи сложнее.

Например, если просто написать:

Найди вакансии гейминг-компаний и сделай сводную таблицу по средним и медианным зарплатам

Claude (без MCP) пойдёт в интернет и притащит ответы из случайных статей. Чтобы модель действительно обратилась к нашей базе, надо явно указать источник:

Подключись по MCP к базе данных (таблица sandbox.vacancies_habr) и найди вакансии гейминг-компаний,сделай сводную таблицу по средним и медианным зарплатам

После такого запроса Claude:

  1. Сгенерирует нужные SQL-запросы (например, отберёт компании с ключевыми словами game / gaming в названии описании).

  2. Выполнит их через MCP непосредственно в нашей базе.

  3. Автоматически обработает результат: посчитает медианы, средние, сделает группировки.

  4. Вернёт всё в удобном формате — это может быть:

    • таблица с цифрами,

    • график

    • PDF отчёт,

    • или даже полноценный интерактивный HTML-отчёт с фильтрами и визуализациями.

То есть мы фактически разговариваем с базой данных на обычном языке, а Claude берёт на себя всё от написания SQL до построения аналитики.

ПРАКТИЧЕСКИЕ ПРИМЕРЫ

ПРИМЕР 1. Сравнение зарплат в компаниях 

Первый пример как раз отчёт по геймигу и зарплатам.

Сначала Claude исследует базу, находит схемы и таблицы, запускает общие SQL запросы, и, с каждым следующим SQL запросом уменьшает выборку. Рассуждает и переписывает запросы. Названия полей специально не расшифровываются - они понятны LLM. В итоге формирует отчёт.

Промт:

Подключись к базе данных MCP и найди средние зарплаты по гейминговым компаниям. Всё сведи в таблице

Отчёт надо проверять обязательно. В этом конкретно не все компании из гейминга, и надо об этом сказать LLM. Желательно делать запрос точнее. Дальше можно промтами убирать или добавлять что-то в отчёт. Сохраняется в PDF.

ПРИМЕР 2. ПЕРСОНАЛИЗИРОВАННЫЙ АНАЛИТИЧЕСКИЙ ОТЧЁТ (ПОИСК ВАКАНСИЙ ПО РЕЗЮМЕ)

В этом примере мы прикладываем резюме кандидата или описание вакансии.
Далее в ход идёт большой промт (на скриншоте) в нём подробно прописано, что именно должно попасть в итоговый документ:

  • ключевые метрики и показатели,

  • сравнение с данными из базы,

  • визуализации и сводные таблицы,

  • текстовые инсайты и выводы.

Claude обрабатывает запрос и формирует развёрнутый отчёт объёмом около 10 страниц PDF. Причём он не ограничивается только локальной базой. Модель дополнительно обращается в интернет, анализирует свежие новости и тенденции рынка труда и учитывает их в итоговом отчёте.

В результате получается документ, который объединяет данные из нашей базы и актуальный внешний контекст - фактически, полноценное исследование в автоматическом режиме.

ПРИМЕР 3. СРАВНЕНИЕ СТАТИСТИКИ ЗАРПЛАТ ИЗ БАЗЫ ДАННЫХ И СТАТЬИ

Ещё один интересный сценарий работы с MCP - сравнение данных из разных источников.

Возьмём нашу базу вакансий с Habr Career и сопоставим её с результатами статьи «Анализ зарплат в IT», где использовались данные из калькулятора зарплат.

  • В базе у нас - реальные зарплатные вилки из опубликованных вакансий (120k+ записей).

  • В статье - данные специалистов, которые указывали свои доходы в калькуляторе.

Claude через MCP вытягивает статистику из таблицы sandbox.vacancies_habr и строит сводные таблицы: медианные и средние значения по ключевым ролям, уровням и регионам.
Дальше он берёт цифры из статьи, сопоставляет их и показывает различия.

В итоге получаем отчёт, который показывает:

  • насколько расходятся зарплаты “по вакансиям” и “по опросам”

  • где рынок завышает ожидания, а где компании недоплачивают;

  • какие профессии ближе всего к балансу между ожиданиями кандидатов и предложениями работодателей.

Документы, формируемые в процессе работы, Claude называет артефактами и сохраняет из отдельно. Они остаются в Claude Desktop. На скриншоте ниже - примеры более сложного анализа, чем в примерах.

ПЛЮСЫ И МИНУСЫ СВЯЗКИ LLM + БАЗА ДАННЫХ

Плюсы:

  1. С данными можно разговаривать обычным языком

  2. Подключить LLM к базе данных можно на обычном компьютере

  3. Один промт может генерировать до пары десятков запросов - это намного быстрее, чем писать руками

  4. Можно сразу получать отчёты и интерактивные HTML

Минусы:

  1. Анализ поверхностный в большинстве случаев

  2. Размер контекстного окна Claude небольшой

  3. Нужна подписка Pro и VPN из РФ

  4. Сложно сделать хороший интерактивный отчёт

  5. С графиками Claude пока слабо работает - есть проблемы

У Claude есть свои форматы отчётов. Качество этого должно увеличиваться с временем. Подобный подход, когда LLM работает поверх базы данных и превращает запросы на естественном языке в аналитику в бизнес-среде называют Generative BI. GenBI пушат гиганты: Snowflake, Microsoft, IBM, Amazon. Это будущее, без сомнения. Писал про это в статье на Хабр “Generative Business Intelligence. BI без дашбордов и аналитиков” и пишу у себя в TG канале

Примеры PDF отчётов от Claude по рынку труда IT отправляем периодически в канал с аналитикой VILKY.

Там можно найти:

Комментарии (0)


  1. levge
    17.09.2025 14:12

    Интересная идея, получаеться что если создать файл описания базы данных или использовать саму метадату базы данных, можно дать аналитику возможность строить запросы через Claude используя MCP. Я думал что надо возиться с RAG.


    1. alexandervarlamov Автор
      17.09.2025 14:12

      RAG нужен, когда модели не хватает контекста. А здесь - прямой доступ до БД, понятное название таблицы и полей в ней. LLM весь контекст собирает первыми запросами - читает схемы, смотрит названия полей, потом понимает как строить SQL для ответов на промт