TGViewer
Дима SQL-ит 🧑‍💻 (Аналитика данных, AI) Дима SQL-ит 🧑‍💻 (Аналитика данных, AI) @dima_sqlit · 2.22K subscribers
Post #184 1.63K
🤖 Что такое MCP сервер — как научить нейросеть писать SQL под ваши данные (часть 2):

В первой части разобрали что такое MCP и написали первый инструмент. Сегодня идем дальше — что делать, если запросы сложнее и нейросеть не знает как у вас организованы таблицы (их описание и как они могут соединяться между собой).

Проблема: модель не знает ваши таблицы 🎚

Фиксированный тул — например get_sales_by_region — работает хорошо для простых запросов. Но что если пользователь спросит: «Сравни выручку по регионам с прошлым кварталом с разбивкой по сегментам клиентов»?

Тут нужно несколько таблиц, JOIN и оконные функции. Заранее написать тул под каждый такой запрос — нереально (реально, конечно, но не логично мягко говоря).

Решение: дать модели два инструмента — получить схему и возможность выполнить любой запрос.

Как это устроено: 🎚

@mcp.tool()
def get_database_schema(domain: str = "all") -> str:
"""
Возвращает схему БД: таблицы, поля, типы данных и связи.
Вызывай ПЕРЕД тем как писать SQL-запрос.
domain: 'sales', 'customers', 'products' или 'all'
"""
if domain == "all":
files = ["sales.md", "customers.md", "products.md"]
else:
files = [f"{domain}.md"]

result = ""
for f in files:
with open(f"docs/{f}", "r") as file:
result += file.read() + "\n\n"
return result

@mcp.tool()
def execute_sql(query: str) -> list:
"""
Выполняет SELECT-запрос к базе данных.
Используй только после get_database_schema.
Только SELECT — никаких изменений данных.
"""
conn = sqlite3.connect("metrics.db")
cursor = conn.cursor()
cursor.execute(query)
result = cursor.fetchall()
conn.close()
return result


Модель сначала вызывает get_database_schema, читает описание таблиц и связей — потом сама пишет SQL и передает в execute_sql.

Как организовать файлы схемы: 🎚

Файлы лежат рядом с сервером в папке /docs. Внутри — описание таблиц, типы данных и как они связаны:
## Таблица orders
- order_id INT — первичный ключ
- customer_id INT — FK → customers.customer_id
- region VARCHAR — регион продажи
- revenue FLOAT — выручка
- created_at DATE — дата заказа

## Связи
orders.customer_id → customers.customer_id


Прочитав это, модель сама поймет как делать JOIN между таблицами — объяснять ничего не нужно.

Один MCP или несколько? 🎚

Один MCP-сервер = один проект. Не нужно плодить отдельный сервер под каждую таблицу. Все связанные таблицы и тулы живут в одном сервере. Если у вас две независимые системы — например аналитическая база и CRM — вот тогда имеет смысл делать два разных сервера. Здесь нет явного ответа, нужно подходить индивидуально к каждому проекту.

А если схема хранится в Confluence? 🎚

Рабочий вариант — тул делает запрос к Confluence API и достает описание нужной таблицы прямо оттуда:
@mcp.tool()
def get_table_docs(table_name: str) -> str:
"""
Достает описание таблицы из корпоративной документации.
Используй перед написанием SQL если нужны детали схемы.
"""
# запрос к Confluence API
response = requests.get(
f"{CONFLUENCE_URL}/rest/api/content",
params={"title": table_name, "expand": "body.storage"},
auth=(USER, TOKEN)
)
return response.json()["results"][0]["body"]["storage"]["value"]



🟢 Хотите еще про нейронки ?
🔥 Набираем 80 реакций на этот пост, чтобы подобные посты выходили чаще

Итог: 🤩

❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ Какие идеи для использования MCP есть у вас? Делись в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.


🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru


@dima_sqlit
  • 🔥 24
  • ❤‍🔥 4
  • 🐳 3
More from @dima_sqlit
  1. Sep 21, 2026ИИ сейчас развивается настолько быстро, что уследить за всем просто нереально: Каждый день…
  2. Sep 21, 2026🧠 Уровень абстракции — навык, который сэкономит вам годы учёбы: Когда я начинал изучать P…
  3. Sep 18, 2026🏦 Задача с собеса в Т-банк на SQL: вторая зарплата в отделе Условие: есть таблица сотрудн…
  4. Sep 16, 2026🏠 IT ипотека (Часть 3) — Как я сэкономил на ремонте: кэшбэк, промокоды и один неочевидный…
  5. Sep 7, 2026🍂 Осень — сезон найма: Каждый год одна и та же история — в сентябре рынок будто просыпает…
  6. Aug 24, 2026P-value простыми словами: Условие: подбросили монету 10 раз, выпало 9 орлов. Можно ли тепе…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →