Про протокол MCP (Model Context Protocol) сейчас говорят всё чаще. Этот протокол позволяет нейросетям общаться с внешним миром. С его помощью к LLM можно подключать любые источники данных или системы управления, и всё это через один универсальный стандарт. MCP часто сравнивают с USB - устройство одно, протокол один, а число сценариев применения практически бесконечно.
В статье расскажу про практический сценарий "как связать LLM и базу данных". Это может сделать любой на своём компьютере.
Протокол MCP придумали ребята из Anthropic. Далее будем использовать нейросети Claudе Sonnet и Claude Opus - это LLM от Anthropic.
Зачем это нужно? Такая связка позволит промтами вытаскивать инсайты из данных, создавать отчёты в PDF и строить интерактивные отчёты в HTML. Это работает на моём компьютере последние два месяца и результаты очень обнадёживающие.
Чтобы было интереснее, в качестве данных возьмём все вакансии Habr Career c описаниями. Данные - часть пет-проекта анализа зарплат VILKY. Данные нормализируются, валюты переводятся по курсу ЦБ и т.д. Делаем втроём: Саша, Никита, Рома. Есть публичный дашборд и канал с аналитикой и автоотчётами. Все ссылки платформ-агрегаторов сохраняются.
РАЗВОРАЧИВАЕМ БАЗУ ДАННЫХ И MCP-СЕРВЕР
Что надо, чтобы подключить базу данных к MCP-серверу:
База данных. В нашем случае - PostgreSQL
MCP-сервер
Claude Desktop c Pro подпиской (20$)
В примере будем использовать Postgres MCP Pro - опенсорсный MCP сервер. У проекта есть страница Postgres MCP Pro на GitHub с подробными инструкциями по установке и настройке.
Будем устанавливать в докере - Option 1: Using Docker из инструкции
скачиваем и устанавливаем Docker Deskop
Выполняем во внутреннем терминале 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 - универсальный клиент для любых СУБД. Можете использовать другой.
Откройте DBeaver и создайте новое подключение:
Database → New Database Connection → PostgreSQL.В настройках подключения укажите:
Host: localhost
Port: 5432
Database: mydb
Username: user
Password: password (или тот пароль, который вы указали в docker-compose.yml).Остальные параметры можно оставить по умолчанию.
Нажмите 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 $/мес).
В Claude Desktop откройте меню:
File → Settings → Local MCP Servers.Нажмите Edit Config. Откроется json-файл конфигурации.
Добавьте туда описание 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-сервера можно задать режим доступа:
restricted — read-only, то есть LLM сможет выполнять только SELECT-запросы (без INSERT/UPDATE/DELETE). Это самый безопасный вариант для аналитики и экспериментов.
full — полный доступ ко всем операциям (используется реже и только в тестовых окружениях).
В Claude Desktop после запуска сервера в разделе Local MCP Servers появится ваш источник.
Если всё настроено правильно, надпись running (синим цветом) будет означать успешное подключение LLM к базе данных.

ЗАПРОСЫ К БАЗЕ НА ЕСТЕСТВЕННОМ ЯЗЫКЕ
Теперь начинается самое интересное - мы можем общаться с данными.
Простые вещи вроде средней или максимальной зарплаты легко достаются обычным SQL-запросом. Но у нас под капотом - одна из самых мощных LLM, и это значит, что можно спрашивать задачи сложнее.
Например, если просто написать:
Найди вакансии гейминг-компаний и сделай сводную таблицу по средним и медианным зарплатам
Claude (без MCP) пойдёт в интернет и притащит ответы из случайных статей. Чтобы модель действительно обратилась к нашей базе, надо явно указать источник:
Подключись по MCP к базе данных (таблица sandbox.vacancies_habr) и найди вакансии гейминг-компаний,сделай сводную таблицу по средним и медианным зарплатам
После такого запроса Claude:
Сгенерирует нужные SQL-запросы (например, отберёт компании с ключевыми словами game / gaming в названии описании).
Выполнит их через MCP непосредственно в нашей базе.
Автоматически обработает результат: посчитает медианы, средние, сделает группировки.
-
Вернёт всё в удобном формате — это может быть:
таблица с цифрами,
график
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 + БАЗА ДАННЫХ
Плюсы:
С данными можно разговаривать обычным языком
Подключить LLM к базе данных можно на обычном компьютере
Один промт может генерировать до пары десятков запросов - это намного быстрее, чем писать руками
Можно сразу получать отчёты и интерактивные HTML
Минусы:
Анализ поверхностный в большинстве случаев
Размер контекстного окна Claude небольшой
Нужна подписка Pro и VPN из РФ
Сложно сделать хороший интерактивный отчёт
С графиками Claude пока слабо работает - есть проблемы
У Claude есть свои форматы отчётов. Качество этого должно увеличиваться с временем. Подобный подход, когда LLM работает поверх базы данных и превращает запросы на естественном языке в аналитику в бизнес-среде называют Generative BI. GenBI пушат гиганты: Snowflake, Microsoft, IBM, Amazon. Это будущее, без сомнения. Писал про это в статье на Хабр “Generative Business Intelligence. BI без дашбордов и аналитиков” и пишу у себя в TG канале.
Примеры PDF отчётов от Claude по рынку труда IT отправляем периодически в канал с аналитикой VILKY.
Там можно найти:
levge
Интересная идея, получаеться что если создать файл описания базы данных или использовать саму метадату базы данных, можно дать аналитику возможность строить запросы через Claude используя MCP. Я думал что надо возиться с RAG.
alexandervarlamov Автор
RAG нужен, когда модели не хватает контекста. А здесь - прямой доступ до БД, понятное название таблицы и полей в ней. LLM весь контекст собирает первыми запросами - читает схемы, смотрит названия полей, потом понимает как строить SQL для ответов на промт