Запись архива

Как настроить MCP-сервер под свою задачу: разбор на примере SQLite и Postgres

MCP — открытый протокол для подключения инструментов к LLM-агентам. Разбираем, как поднять свой сервер, какие подводные камни есть у SQLite и Postgres, и как не потерять контекст при длинных сессиях.

Схема подключения MCP-сервера к SQLite и PostgreSQL через Model Context Protocol
Схема подключения MCP-сервера к SQLite и PostgreSQL через Model Context Protocol
Hormozgantoday.jpg | by Hormozgantv | wikimedia_commons | CC BY-SA 4.0

MCP (Model Context Protocol) — это открытый протокол, который позволяет LLM-агентам подключать внешние инструменты: базы данных, файловую систему, HTTP-запросы, рантаймы кода. Anthropic выпустила спецификацию в конце 2024 года, и с тех пор её поддержали OpenAI, Google, JetBrains и Sourcegraph. Но главное — MCP уже работает в Claude Desktop и Claude Code, и его можно настроить под свою задачу за вечер.

В статье разбираем, как поднять MCP-сервер для SQLite и PostgreSQL, какие ограничения протокола стоит учитывать, и почему «просто подключить базу» не всегда означает «агент будет работать».

Что такое MCP и зачем он нужен

MCP — это транспорты, инструменты и ресурсы. Транспорт определяет, как агент общается с сервером: через стандартный ввод-вывод (stdio) или по HTTP с SSE. Инструменты — это функции, которые агент может вызвать: выполнить SQL-запрос, прочитать файл, отправить запрос к API. Ресурсы — это данные, которые сервер предоставляет агенту для контекста: схема таблицы, содержимое документа, лог.

Ключевая идея: агент не просто генерирует текст, а вызывает ваш код. Вы контролируете, какие операции разрешены, какие данные доступны, и как логируются вызовы. Это принципиально отличается от RAG, где модель получает куски текста и сама решает, что с ними делать. В MCP модель вызывает конкретную функцию с конкретными параметрами, и вы видите каждый вызов.

Поднимаем MCP-сервер для SQLite

SQLite — самый простой старт. Сервер из официального репозитория Model Context Protocol работает «из коробки» и требует только Node.js.

Установка:

bash
npm install -g @modelcontextprotocol/server-sqlite

Затем в конфигурации Claude Desktop (или любого другого MCP-клиента) добавляете:

json
{
«mcpServers»: {
«sqlite»: {
«command»: «mcp-server-sqlite»,
«args»: [«—db-path», «/path/to/your/database.db»]
}
}
}

После перезапуска Claude получает доступ к инструментам: `read_query`, `write_query`, `create_table`, `list_tables`, `describe_table`. Агент может выполнить SELECT, INSERT, UPDATE, DELETE, создать таблицу и прочитать её схему.

Практический пример. Вы просите агента: «Найди в базе все заказы за последнюю неделю и подсчитай средний чек». Агент выполняет:

`list_tables` — видит таблицу `orders`.

`describe_table` — узнаёт колонки `created_at`, `amount`.
3. `read_query` — выполняет `SELECT AVG(amount) FROM orders WHERE created_at > date(‘now’, ‘-7 days’)`.

Всё это происходит в одном диалоге, и вы видите каждый шаг. Если запрос неверный, агент может его исправить и выполнить снова.

Ограничения SQLite. Транзакции не поддерживаются: каждый `write_query` выполняется как отдельная операция. Если агент попытается сделать BEGIN, INSERT, COMMIT — сервер выполнит их как три отдельных запроса без гарантии атомарности. Для аналитики это не проблема, для записи данных — риск.

Поднимаем MCP-сервер для PostgreSQL

Postgres-сервер сложнее, но даёт больше контроля. Установка через pip:

bash
pip install mcp-server-postgres

Конфигурация:

json
{
«mcpServers»: {
«postgres»: {
«command»: «mcp-server-postgres»,
«args»: [«postgresql://user:password@localhost:5432/mydb»]
}
}
}

Сервер поддерживает те же инструменты, что и SQLite, но с одним важным отличием: он работает в режиме read-only по умолчанию. Чтобы разрешить запись, нужно передать флаг `—allow-write`.

Практический пример. Вы просите агента: «Покажи структуру базы и найди таблицы без индексов». Агент выполняет:

`list_tables` — получает список таблиц.

Для каждой таблицы вызывает `describe_table`.
3. Выполняет запрос к `pg_indexes` через `read_query`.
4. Возвращает результат: таблицы, у которых нет индексов.

С Postgres-сервером агент может работать с представлениями, схемами, функциями — всё, что доступно через SQL, становится доступно агенту. Но есть нюанс: длина контекста.

Проблема контекста: почему агент «забывает» схему

Когда агент работает с базой данных через MCP, каждый вызов `describe_table` возвращает схему таблицы. Если таблица большая (20+ колонок с типами, комментариями, ограничениями), ответ может занимать 2–5 тысяч токенов. После 5–10 таких вызовов контекст агента забивается схемами, и он начинает «забывать» предыдущие шаги.

Что делать. Ограничьте количество таблиц, которые агент может исследовать. В SQLite-сервере можно задать `—table-prefix`, чтобы агент видел только таблицы с определённым префиксом. В Postgres-сервере используйте отдельную схему и дайте агенту доступ только к ней.

Второй подход — дать агенту инструкцию в system prompt: «Не описывай таблицы, если они уже были описаны в этом диалоге». Это снижает нагрузку на контекст, но не гарантирует, что агент не сделает лишний вызов.

Лимиты и безопасность

MCP-сервер не защищает от некорректных запросов. Если агент выполнит `DROP TABLE` — данные удалятся. Для SQLite это необратимо (если нет бэкапа). Для Postgres read-only режим спасает, но не от тяжёлых SELECT, которые могут положить базу.

Рекомендации

  • Для продакшена Postgres всегда запускайте с read-only, если запись не нужна явно.
  • Для SQLite используйте отдельную копию базы, не основную.
  • Ограничьте время выполнения запроса через `statement_timeout` в Postgres.
  • Логируйте все вызовы MCP-сервера — это единственный способ аудита действий агента.

Что дальше

MCP — это не замена RAG и не магический коннектор. Это протокол, который даёт агенту доступ к вашим данным и коду, но не гарантирует корректности или безопасности. Если вы настраиваете MCP-сервер впервые, начните с SQLite на локальной тестовой базе. Проверьте, как агент выполняет запросы, как он реагирует на ошибки SQL, и сколько шагов он может сделать до потери контекста.

Postgres-сервер стоит поднимать, только когда вы понимаете, какие запросы будут выполняться, и готовы ограничить права и контекст. В следующей статье разберём, как комбинировать несколько MCP-серверов в одном агенте — файловая система, база данных и HTTP-запросы одновременно.

Источники