Просто спроси, что происходит
Просто спроси, что происходит

Когда начали активно обсуждать MCP, это не выглядело как что-то неожиданное — мониторинг уже подошёл к точке, где идея «просто спросить систему» из эксперимента превратилась в логичное продолжение.

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

В итоге картина складывается, только путь к ней довольно механический.

Мы попробовали собрать такую схему через MCP — как наиболее понятный способ дать модели доступ к данным. Не вспоминать, где лежит нужная метрика, не писать запросы, а задать вопрос и получить ответ.

И опять, в моменте кажется, что действительно разобрались: root cause найден, причина понятна — задача закрыта.

Но система сложная, здесь важно не путать «разобрались с инцидентом» и «разобрались с его последствиями». Потому что за первым слоем вопросов — «что произошло» и «почему это произошло» — стоит другой, на который проще найти причину, чем ответ:

  • что будет дальше,

  • насколько это системная проблема,

  • где ещё может «стрельнуть»,

  • и как это всё влияет на бизнес.

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

Как это вообще работает

MCP — это протокол прикладного уровня, построенный поверх JSON-RPC 2.0. Его задача — стандартизировать обмен контекстом между ИИ-моделью (Хост) и источниками данных (Сервер). Тут нужно понимать, что это не REST и не gRPC, а типизированный обмен между LLM-хостами и источниками данных.

Архитектура строится вокруг трёх ключевых ролей:

  1. MCP Хост — приложение, которое управляет жизненным циклом подключений к серверам и встраивает в себя LLM. Пользователь работает именно с хостом: это может быть VS Code, Claude Desktop или специализированный чат-бот.

  2. MCP Клиент — «прослойка» внутри хоста. Она держит соединение 1:1 с сервером.

  3. MCP Сервер — легковесная программа, которая предоставляет специфичную логику через внешний интерфейс. Она подключается к вашей БД, API

Три примитива MCP:

  • Tools (Инструменты) — управляются моделью. Модель сама решает вызвать функцию (например, get_problems), чтобы получить данные. Это основное, что используется в APM: серверу нужно описать свои инструменты так, чтобы модель могла корректно сопоставить их с задачами мониторинга.

  • Resources (Ресурсы) — управляются приложением. Это данные, доступные приложению, которое само решает, когда и какие из них передать модели для контекста — в отличие от Tools, здесь выбор делает не модель.

  • Prompts (Промпты) — управляются пользователем. Шаблоны запросов (например, «Проанализируй эти метрики»).

Если отвлечься от терминологии, MCP делает довольно конкретную вещь: даёт модели доступ к API через описанные инструменты. Модель видит, какие у неё есть «ручки», и сама решает, какую из них дёрнуть.

Данные есть. Значит, мы всё контролируем
Данные есть. Значит, мы всё контролируем

В теории всё вполне аккуратно. Есть модель, есть набор инструментов, которые она может вызывать, есть сервер, который ходит в API. Модель получает вопрос, выбирает инструмент, забирает данные и формирует ответ. По описанию процесс выглядит почти линейным, без сюрпризов.

Что происходит, когда пробуешь на практике

Давайте предположим разные варианты, где необходимо облегчить взаимодействие пользователя с данными:

  • Небольшой опыт работы с системой мониторинга, нет уверенного понимания интерфейса, к тому же нет времени с этим разбираться. В этом случае MCP-сервер выступает в роли мостика между мониторингом и языковыми моделями: превращает запрос с человеческого языка в технический согласно спецификации REST API, а затем, получив в ответ JSON, трансформирует его обратно в человеческий язык.

  • Сложный запрос к мониторингу, который требует времени, чтобы найти необходимые данные, сопоставить их и сделать анализ. Например: «Какие проблемы за последнюю неделю оказали влияние на SLO по доступности и какой прогноз на следующую неделю?». Здесь MCP так же переводит запрос в технический язык, получает набор JSON-ов, передаёт данные в ИИ для анализа и прогноза — и выдаёт готовый ответ.

Когда пробуешь это на простых сценариях, ощущение действительно приятное. Если не очень хорошо знаешь систему мониторинга, то возможность не вспоминать названия метрик экономит время. В каком-то смысле модель берёт на себя ту часть работы, которая раньше требовала «памяти о системе».

Но это ощущение держится недолго.

Как только запрос становится чуть менее очевидным, появляется неопределённость. Модель сама решает, что именно вызвать и в каком порядке, и это решение не фиксировано. Иногда она идёт коротким путём, иногда делает лишние шаги, или просто выбирает не тот инструмент. Это не выглядит как ошибка в привычном смысле — скорее, как особенность поведения, с которой приходится жить.

Ещё заметнее становится на этапе интерпретации. Даже если данные пришли корректные, дальше модель должна объяснить, что они значат. И вот оно, пространство для расхождений, потому что причинно-следственные связи модель строит не всегда так, как ожидаешь.

Со временем начинаешь обращать внимание на вещи, которые в начале просто не видны. Например, на задержки. Пока запрос один — всё быстро. Как только модель начинает делать несколько вызовов подряд, цепочка удлиняется: сначала она думает, потом идёт в MCP, потом в API, потом обратно, потом снова «думает». Плюс стоимость, которая растёт вместе с количеством вызовов.

Отдельная тема — доступ к данным. В какой-то момент становится важно не только то, что модель может спросить, но и то, что ей вообще разрешено. Здесь она уже не просто интерфейс, а полноценный участник системы, который может дёргать API, а это требует более аккуратной настройки.

И, пожалуй, самое приземлённое наблюдение: MCP никак не улучшает сам API. Если API мониторинга запутанный или плохо структурирован, модель будет спотыкаться точно так же, как и человек. Иногда даже чаще, потому что у неё нет «интуиции» — она опирается только на описание инструментов.

Как реализовано у нас

Стоит сразу разделить два разных применения ИИ в продукте, чтобы не путать одно с другим.

У нас, в Ключ-АСТРОМ, уже есть ИИ, но с совершенно другим назначением. Основная цель — объединить данные с инфраструктуры, трейсы, логи, события k8s, пользовательский опыт, чтобы оценить влияние инцидентов на окружение и конечных пользователей и найти первопричину происходящего. То есть здесь речь об анализе причинно-следственных связей при помощи ИИ.

Теперь же ИИ-агент (Copilot, Claude Desktop или бот) сам подключается к APM через MCP-сервер и отдаёт команды: «Найди мне проблему за последний час» или «Посчитай p99 latency для сервиса payment».

В нашей системе MCP-сервер реализован как отдельный сервис, который проксирует вызовы к REST API и добавляет слой интерпретации для LLM.

1. Архитектура подключения

MCP-сервер устанавливается на отдельную машину рядом с кластером Ключ-АСТРОМ. Чтобы его запустить, нужно сделать пару настроек — подключить MCP к мониторингу и наладить связь с LLM.

Тут сделаю замечание. Часто метрики мониторинга считаются чувствительными, не всегда использование внешней LLM допустимо. Для этого мы реализовали возможность подключения как к внешним, так и к локальным LLM.

Сам MCP-сервер настроен на работу с мониторингом.

2. Какие данные получает ИИ?

Через MCP-сервер ИИ получает доступ к следующим возможностям Ключ-АСТРОМ:

  • Проблемы: сведения обо всех обнаруженных проблемах с описанием влияния и корневой причиной.

  • Логи: глубокий поиск по логам, собранных агентами мониторинга.

  • Метрики: метрики инфраструктуры, процессов (например, Garbage Collector).

  • Сущности: информация о сервисах, хостах, процессах.

  • Пользовательский опыт: сведения о действиях пользователей в веб- или мобильном приложении, Apdex, Web Vitals метрики и другое.

  • Безопасность: уязвимости и угрозы.

3. Пример выполнения запроса

Разберем сценарий: «Покажи мне топ-3 сервиса с самой высокой задержкой»

MCP Ключ-АСТРОМ
MCP Ключ-АСТРОМ

Вот что происходит под капотом:

  1. Хост (Copilot) отправляет промпт LLM.

  2. LLM анализирует список доступных Tools от MCP-сервера. Она видит инструменты, например query_metrics или get_entities, и решает, что для ответа нужно сначала найти сервисы (Entities), а потом вытянуть их метрики.

  3. MCP-клиент → MCP-сервер: LLM возвращает структурированный JSON-RPC запрос tools/call с аргументами (например, entitySelector=type("SERVICE")).

  4. MCP-сервер (Ключ-АСТРОМ) принимает запрос, аутентифицируется с помощью токена и делает прямое API-обращение к эндпоинту /api/v2/metrics/query

  5. Response: MCP-сервер получает сырой JSON от Ключ-АСТРОМ, отдаёт его обратно клиенту, тот передаёт LLM, и LLM генерирует ответ на естественном языке.

Ложка дёгтя в бочке мёда

Обсудим не только плюсы этого подхода, но и к чему нужно быть готовым.

С самим MCP всё довольно понятно: задача простая — настроить его на правильные вызовы к системе мониторинга. А вот по взаимодействию с LLM, вопросы появляются регулярно.

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

Галлюцинации метрик

LLM — всё-таки в первую очередь лингвистическая модель, а не калькулятор распределённых систем.

Например, MCP корректно передаёт значения метрик, но LLM начинает их «интерпретировать». Она может увидеть p95 задержки в 1500 мс и сказать «Всё в порядке, это допустимо», хотя SLA — 200 мс.

Тут важно понимать, что есть прямая зависимость от промпта, а самое главное — от того, сколько токенов выделено модели на то, чтобы развернуть рассуждение. Если включить режим экономии и существенно ограничить контекстное окно или длину ответа, модели буквально не хватает места, чтобы аккуратно сопоставить цифру с порогом, и она склоняется к короткому, уверенному, но поверхностному выводу — то есть начинает фантазировать.

Грубо говоря, чем меньше у LLM «воздуха» в виде токенов, чтобы рассуждать пошагово, тем выше риск, что она срежет путь и выдаст готовый ответ без промежуточных сопоставлений.

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

Логические разрывы: встречали ситуации, когда LLM часто путает Latency с Duration, путает клиентские (4xx) с серверными (5xx) ошибками. MCP-сервер отдает сырые поля, а модель склеивает их неверно, давая убедительный, но математически неверный вывод. Но хорошо, что такое поведение скорее редкость чем обыденность.

LLM может допридумывать синтаксис запросов в API

API системы мониторинга может иметь сложные вложенные фильтры (AND/OR/NOT), но LLM через MCP может генерировать невалидный JSON-запрос для API и приведёт к тому, что MCP-сервер возвращает ошибку «400 Bad Request». Но LLM, вместо того чтобы признать косяк, начинает галлюцинировать причину: «Ошибка доступа, проверьте права» (хотя проблема в синтаксисе) или «Данных нет, потому что сервер недоступен» (хотя данные есть, просто фильтр некорректный).

Чтобы LLM дала адекватный ответ, ей нужен адекватный точный промт. Если запрос «Почему все тормозит?» — MCP дернет 5 разных эндпоинтов (метрики CPU, GC, Response time, Network time). LLM захлебнётся в разнородных данных и выдаст кашу. Но если сформулировать промт корректно, например: «Покажи корневые причины проблем, которые возникли в проде на системе А за вчера», то тут запрос понятен и какие нужно вызвать тоже. 

Цена вопроса: SLO и инциденты

Возвращаясь к вопросам, с которых начали — насколько это системная проблема и как это влияет на бизнес — вот как они выглядят не в виде абстрактного списка, а в виде конкретных рабочих сценариев.

Например, довольно типичная работа с SLO.

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

В классическом подходе аналитика будет ручной: собрать данные, сопоставить их и сделать вывод.

С MCP можно задать вопрос напрямую: «Проанализируй динамику SLO за последнюю неделю и оцени риск выхода за порог». И получить сразу интерпретацию:

  • что показатели действительно снижаются,

  • что текущая динамика ведёт к нарушению порога,

  • и когда это может произойти.

То есть система сразу работает на уровне вывода, а не на уровне данных.

Другой сценарий — уже не про метрики, а про конкретные процессы, где лучше всего видно бизнес-влияние.

Допустим, вы ИТ-директор, вас не устраивает время решения критических инцидентов. При этом до конца непонятно, где именно узкое место: мониторинг не находит проблему или команда долго реагирует.

Обычно такой анализ занимает время: нужно собрать инциденты, посмотреть таймлайны, сопоставить данные.

10 дашбордов, 50 алертов — ничего непонятно
10 дашбордов, 50 алертов — ничего непонятно

С MCP можно задать вопрос: «Какие критические инциденты были за последние 8 недель и сколько времени заняло их устранение?»

И получить ответ, где уже видно:

  • когда инцидент был обнаружен,

  • сколько пользователей пострадало,

  • в чём была причина,

  • и сколько времени заняло восстановление.

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

На этом месте легко сделать неправильный вывод, что MCP — это просто умный чат над мониторингом. Но это не совсем так.

Чат здесь — только точка входа. Основная работа происходит внутри: сбор данных, сопоставление, учёт зависимостей, построение выводов. Если убрать интерфейс, сама логика не исчезнет.

Что в итоге

Развитие систем-помощников на базе языковых моделей продолжает активно развиваться и применяется в совершенно разных отраслях. Сегодня мы рассмотрели, как этот процесс добрался до связки LLM-MCP-Мониторинг.

Из пользы можно выделить главное: он снижает порог входа в работу с APM-мониторингом и сокращает время на получение нужных сведений — человеку не нужно помнить синтаксис запросов, чтобы получить ответ. Особенно ощутимо это в стрессовых ситуациях, когда инцидент требуется разобрать как можно быстрее.

Просто спроси, что происходит
Просто спроси, что происходит

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

Но если смотреть на это шире, что и показывают оба сценария выше, — MCP не сводится к удобному способу задать вопрос мониторингу. Это инфраструктура, которая меняет сам подход к работе с системой: не вытаскивать метрики по одной, а сразу получать вывод с учётом зависимостей.

Посмотреть наш продукт на сайте: MCP-сервер Ключ-АСТРОМ