termal.in

← Блог

Дайте Claude Code и Cursor запрашивать вашу базу данных (безопасно) — настройка MCP

· Termalin Team claude-codecursormcpdatabasetutorial

Агент, который может читать вашу базу данных, отвечает на вопросы, ради которых вы иначе открывали бы SQL-редактор. «Почему во вторник просели регистрации?» «Какие заказы висят в pending больше часа?» «Что вообще лежит в таблице events?» С возможностью делать запросы модель отвечает за секунды; без неё — гадает. Полезное здесь не SQL — и Claude Code, и Cursor пишут SQL нормально — а то, что агенту дают способ выполнить чтение, не вручая ему ваши учётные данные. Эта передача и есть всё трение, и именно её эта статья проходит по шагам для обоих инструментов.

Мы отдельно писали о том, почему вставить строку подключения к базе в агент — это ход, который не отыграть назад (на английском): учётные данные — это доступ на предъявителя, они умеют не только читать, но и писать и удалять, а раз пройдя через контекст модели, они уже не «расшарятся обратно». Там — модель безопасности; здесь мы принимаем её как решённую и доводим дело до настройки. Если коротко: клиент держит учётные данные, а агент получает ограниченную просьбу, по умолчанию только на чтение.

Что понадобится

  • Termalin — десктоп-приложение, тарифа Free достаточно. Это SSH-клиент и клиент баз данных со встроенным MCP-сервером; именно с этим локальным сервером будет разговаривать ваш агент.
  • Хотя бы одно сохранённое подключение к базе в клиенте баз данных Termalin — Postgres, MySQL, SQLite, SQL Server, ClickHouse, MongoDB, Redis и другие. Для первого запуска выберите что-нибудь малорисковое: реплику для аналитики, staging-базу, копию.
  • Claude Code или Cursor на той же машине, что и приложение. Инструменты для баз данных управляют работающим десктоп-приложением, поэтому агент и приложение делят одну машину.

Одно ожидание сразу: для Claude Code и Cursor доступ к базам идёт через локальный stdio-MCP-сервер, так что агент должен быть на той же машине, что и ваше разблокированное десктоп-приложение. (Есть и облачный путь — облачный MCP-сервер: termal.in/mcp с входом для claude.ai, ChatGPT, Claude Code и Cursor или termal.in/api/v1/mcp с API-ключом может запрашивать базы подключённого сервера без пароля, используя локальное доверие к базе на самом сервере, без запущенного десктоп-приложения. Для подключений, сохранённых в клиенте баз данных десктоп-приложения, нужен именно локальный сервер.)

Шаг 1 — включите доступ агента к данным

Это выключено по умолчанию, и намеренно. Откройте Настройки → Агент и включите «Let agents query your databases» («Разрешить агентам запрашивать ваши базы данных»). Подзаголовок проговаривает позицию: выключено по умолчанию и остаётся только для чтения, пока подключение не получит полный доступ. Пока вы его не щёлкнете, каждый инструмент для баз данных возвращает database access for agents is off — enable it in Settings → Agent, и точка.

Два умолчания стоит усвоить, прежде чем идти дальше:

  • Это второе отдельное согласие, поверх работающего приложения. Включение доступа агента к серверам не включает доступ к базам — это свой собственный переключатель. Ничего не открыто, пока вы не примете решение.
  • Каждое подключение для агента доступно только на чтение. Даже при включённом главном переключателе каждый запрос проверяется перед выполнением. Запись проходит, только если вы подняли политику агента для этого конкретного подключения до полного доступа — выбор на каждое подключение, а не глобальный. Пока оставьте только чтение.

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

Шаг 2 — зарегистрируйте локальный MCP-сервер

Claude Code — одна команда:

claude mcp add termalin -- <path>/termalin-mcp

Замените <path> на путь, где лежит бинарник termalin-mcp (приложение может подсказать его). Перезапустите Claude Code — и он подхватит инструменты.

Cursor — Cursor читает MCP-серверы из JSON-файла: .cursor/mcp.json в корне проекта только для этого проекта или ~/.cursor/mcp.json, чтобы сервер был доступен везде. Для локального stdio-сервера запись — это команда и её аргументы:

{
  "mcpServers": {
    "termalin": {
      "command": "<path>/termalin-mcp",
      "args": []
    }
  }
}

Глобальный файл — разумный выбор: доступ к базам не вопрос отдельного репозитория. Перезапустите Cursor (или перезагрузите список MCP в его настройках) и убедитесь, что сервер показан как запущенный. Это та же регистрация, что используют разбор Cursor SSH и разбор по Claude Code (на английском) — один сервер, и теперь он несёт инструменты для баз данных рядом с SSH-инструментами.

Шаг 3 — инструменты и реальная первая задача

С зарегистрированным сервером и включённым переключателем агент видит четыре инструмента для баз данных:

data_list     # your saved connections: id, name, engine, and whether the agent may write
data_tables   # tables / collections / measurements for a connection, with row counts
data_schema   # one table's columns: name, type, nullable, primary key
data_query    # run a query in the connection's own language; default cap 200 rows

Они повторяют то, как вы исследовали бы базу вручную: перечислить, что подключено, посмотреть таблицы, описать таблицу, выполнить запрос. data_query говорит на том же языке, что и подключение, — SQL для реляционных движков и ClickHouse, Cypher для Neo4j, команда Redis, collection {filter} для MongoDB — и возвращает строки до предела, который можно поднять на каждый вызов (maxRows), по умолчанию 200, чтобы агент случайно не затянул миллион строк к себе в контекст.

Теперь задайте ему вопрос, который и правда задали бы, а не демонстрационный запрос:

По дашборду во вторник просели регистрации. Используя базу аналитики, нужно выяснить, что произошло.

Смотрите, как агент прорабатывает инструменты по порядку:

  1. data_list — находит ваше подключение analytics, видит, что движок — Postgres, и отмечает, что для агента оно только на чтение.
  2. data_tables — перечисляет таблицы, замечает signups и signup_events и читает счётчики строк, чтобы понять, что стоит запрашивать.
  3. data_schema по signups — узнаёт столбцы (created_at, source, status, …) и теперь знает, как разрезать по дням и по источнику.
  4. data_query — выполняет что-то вроде SELECT date_trunc('day', created_at) AS day, source, count(*) FROM signups WHERE created_at >= now() - interval '10 days' GROUP BY 1, 2 ORDER BY 1 и читает строки обратно.

Строки рассказывают историю — может, один source во вторник ушёл в ноль (сломанная реферальная ссылка), может, итог держался, но подскочил status = 'failed' (сбой у провайдера). Так или иначе, агент составил запрос из реальной схемы, а не из догадки, и ни разу не держал в руках ничего, кроме возможности спросить. Если результат обрезается на пределе в 200 строк, он сообщает об этом и сужает запрос, а не пытается выжать больше.

Где проходят границы

Кратко, потому что статья о безопасности (на английском) разбирает это полностью, — но вот умолчания, на которые вы полагаетесь:

  • Только чтение по умолчанию. На движках семейства SQL проходят только читающие операторы — SELECT, SHOW, DESCRIBE, EXPLAIN, WITH, PRAGMA. В Redis — только читающие команды; в MongoDB агрегация с $out/$merge заблокирована; в Neo4j заблокированы CREATE/MERGE/DELETE/SET/DROP. Запутавшаяся или перехваченная модель получает чтение, а не DROP.
  • На каждое подключение, а не глобально. Ваша реплика аналитики — решение, отдельное от боевого мастера; подняв одно до полного доступа на запись, вы не трогаете другое.
  • Выключается одним переключателем, и учётные данные держит приложение — ничего ни разу не отдавалось, поэтому выключение не оставляет ни копий, ни пароля, который надо менять.

Для всего чувствительного делайте и то, и другое: направьте подключение на реплику для чтения или на роль БД с минимальными правами и оставьте агент на чтении. Заслон на стороне клиента ловит ошибки; права в базе задают потолок.

Заметки по конкретным инструментам

  • Cursor по умолчанию спрашивает перед каждым вызовом инструмента. Оставьте это для первых сессий — вы увидите каждый data_query до его выполнения и сможете прочитать SQL, который предлагает агент. Автоодобрение — удобство, которое стоит расширять по одному инструменту: data_list и data_schema безопасно пропускать первыми, а data_query дольше всех держать на ручном подтверждении.
  • Claude Code показывает каждый вызов инструмента прямо в строке вместе с аргументами, так что текст запроса оказывается в транскрипте до его выполнения. Вы читаете SQL агента, а не доверяете его пересказу, — и каждый вызов приписан агенту, так что в два часа ночи вы сможете отличить «это прочитал он» от «это прочитал я».

При чём здесь Termalin

Большинство гайдов «подключите агент к базе данных» заканчивается вставкой строки подключения в конфигурационный файл, что тихо выдаёт агенту ту же власть писать и удалять, что есть у вашего приложения. Клиент баз данных Termalin переворачивает это: приложение — хранитель, агент получает четыре ограниченных инструмента, работающих через открытое окно, и вся эта возможность доступна только на чтение, пока вы не решите иначе, и выключается одним переключателем. Это та же идея хранения, что мы применяем к доступу агентов по SSH (на английском) и к тому, что такое MCP-сервер на самом деле (на английском): база данных — просто та версия, где плохая запись измеряется в строках. Начните с одного подключения, держите его на чтении и спросите что-нибудь настоящее, прежде чем думать о расширении.


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

Попробуйте на одном хосте.

Termalin — быстрый SSH-клиент для вас и ваших агентов.

Бесплатный тариф · 14 дней Pro бесплатно · цены