Игорь Градов
Игорь Градов
7 мин
ai

Что такое ИИ-агент для аналитики: MCP-сервер сам строит отчёты Яндекс Метрики

Яндекс Метрика хранит ответы на вопросы о трафике, конверсиях и источниках, но чтобы их получить, нужно либо вручную строить отчёты в интерфейсе, либо писать запросы к API, помня десятки имён полей, лимиты и форматы, и теперь MCP-сервер позволяет поручить эту работу ИИ-агенту, который сам формирует запросы и возвращает готовый ответ.

Что такое ИИ-агент для аналитики: MCP-сервер сам строит отчёты Яндекс Метрики
Почему это важно

MCP-сервер для Яндекс Метрики решает проблему авторизации без клиентского секрета (через PKCE), что критично для CLI-инструментов, распространяемых через npm, и снимает необходимость вручную собирать запросы к Reporting API.

Если вы слышали про MCP, но не понимали, зачем он нужен на практике, этот разбор покажет конкретный сценарий: ИИ-агент (что такое ИИ-агент: программа, которая сама решает, какие действия выполнить для достижения цели, вызывая внешние инструменты без ручного управления) подключается к вашему счётчику Метрики и отвечает на вопросы об аналитике на человеческом языке. Код сервера открыт под лицензией MIT, написан на TypeScript. Ниже разбираю, что нужно для запуска, как устроена авторизация и на каких граблях API Метрики вы сэкономите время.

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

  • Счётчик Яндекс Метрики с данными (подойдёт любой, к которому у вас есть доступ)
  • Node.js установленный на машине (сервер запускается через npx)
  • MCP-совместимый клиент с LLM (большая языковая модель): Claude Desktop, Cursor или любой другой хост, поддерживающий MCP
  • Аккаунт Яндекс ID для OAuth-авторизации
  • Время: 15 минут на установку и первый запрос, ещё 10 минут на настройку под свои задачи

Как устроен MCP и почему инструментов всего пять?

MCP (Model Context Protocol, протокол контекста модели) описывает, как приложение с LLM общается с внешними серверами. Вместо того чтобы встраивать интеграции в каждый чат-клиент, вы запускаете отдельный процесс-сервер. Хост подключается к нему по стандартному транспорту (обычно stdio), получает список инструментов с JSON-схемами, а модель сама решает, какой инструмент вызвать и с какими аргументами.

Ключевое проектное решение автора сервера: инструментов мало, но каждый гибкий. Метрика поддерживает сотни комбинаций измерений и метрик. Заводить под каждую отдельный инструмент бессмысленно. Поэтому вместо набора кнопок получилось пять инструментов:

  • run_report гибкая обёртка над Reporting API: произвольные метрики, измерения, фильтры, сортировка
  • run_comparison сравнение двух периодов с абсолютной и процентной дельтой
  • run_drilldown проваливание по дереву измерения (ОС, затем версии ОС и так далее)
  • run_timeseries метрики, разложенные в динамику по времени
  • get_metadata обнаружение доступных счётчиков, целей и типовых полей, чтобы модель строила запрос по реальным именам, а не угадывала

Пошаговая инструкция

  1. Установите и запустите сервер одной командой:
npx yandex-metrica-mcp-server
  1. Пройдите авторизацию. При первом запуске сервер откроет в браузере страницу Яндекс ID. Подтвердите доступ, скопируйте код со страницы и вставьте в терминал. Публичный client_id уже вшит в пакет, отдельное OAuth-приложение регистрировать не нужно.

  2. Подключите сервер к MCP-клиенту. В настройках Claude Desktop или Cursor укажите путь к серверу как MCP-источник по транспорту stdio.

  3. Задайте вопрос на обычном языке. Например: «Откуда пришёл трафик за прошлую неделю и сколько визитов дошло до цели?» ИИ-агент сам выберет нужный инструмент (run_report или run_comparison), сформирует запрос к API Метрики и вернёт ответ.

  4. Для сравнения периодов используйте формулировку вроде: «Сравни источники трафика за эту и прошлую неделю.» Агент вызовет run_comparison и покажет дельту.

Авторизация без секрета: почему это работает?

Здесь начинается самая нетривиальная часть. Сервер устанавливается через npx и работает на машине пользователя. Встроить client_secret в npm-пакет нельзя: всё, что попадает в пакет, публично.

Решение: Authorization Code + PKCE (RFC 7636, стандарт для публичных клиентов). Клиент генерирует случайный code_verifier, отправляет на сервер авторизации его хеш (code_challenge), а при обмене кода на токен предъявляет исходный verifier. Секрет не нужен, подлинность подтверждается знанием verifier.

Генерация пары выглядит так:

import { createHash, randomBytes } from 'node:crypto'

function base64Url(buf: Buffer): string {
  return buf.toString('base64')
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '')
}

export function generatePkce() {
  const verifier = base64Url(randomBytes(48))
  const challenge = base64Url(
    createHash('sha256').update(verifier).digest()
  )
  return { verifier, challenge, method: 'S256' as const }
}

Обмен кода на токен отправляет секрет только если он есть:

const body = new URLSearchParams({
  grant_type: 'authorization_code',
  code,
  client_id: clientId,
  code_verifier: verifier,
  redirect_uri: 'https://oauth.yandex.com/verification_code',
})
if (clientSecret) body.set('client_secret', clientSecret)

const res = await fetch('https://oauth.yandex.com/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  body,
})

Токен кэшируется в файле с правами 0600 (читать может только владелец). Логин делается один раз.

Три грабли OAuth у Яндекса, которых нет в документации

Эти три проблемы автор обнаружил экспериментально, проверяя каждый шаг против oauth.yandex.com:

  • http:// редиректы запрещены. Стандартный для CLI приём: поднять локальный сервер на http://127.0.0.1:<port> и поймать редирект с кодом. Яндекс такие redirect_uri отклоняет. Поэтому используется out-of-band редирект: Яндекс показывает код на странице, пользователь копирует его в терминал.

  • Refresh-токен требует секрет. Обмен authorization code на токен по PKCE проходит без секрета, и Яндекс выдаёт токен, живущий около года. Но grant_type=refresh_token без client_secret Яндекс не принимает. Решение: раз токен живёт год, refresh публичному клиенту не нужен. По истечении пользователь просто логинится заново. Refresh включается только при подстановке собственного OAuth-приложения с секретом.

  • Заголовок авторизации не Bearer. На этом легко потерять час отладки. Подробности ниже в граблях API.

Пример: что ввели и что получили

Промпт (то есть текстовый запрос к модели) в Claude Desktop: «Покажи топ-5 источников трафика за последние 7 дней для моего счётчика и сколько визитов из каждого источника дошли до цели "Заказ".»

Агент вызвал get_metadata, получил ID счётчика и имя цели, затем вызвал run_report с параметрами: метрики ym:s:visits, ym:s:goalXXXreaches, измерение ym:s:lastTrafficSource, сортировка по визитам, лимит 5, даты за последнюю неделю. В ответ вернул таблицу с пятью строками: источник, визиты, достижения цели. Всё без единого ручного запроса к API.

Частые ошибки

Забыли про формат заголовка авторизации. Яндекс API Метрики ожидает не стандартный Bearer, а OAuth <token>. Если отправить Bearer, получите 401 и потеряете время на отладку.

Пытаетесь использовать http://localhost как redirect_uri. Яндекс его отклонит. Используйте out-of-band редирект через verification_code.

Путаете имена полей Метрики. Поля начинаются с ym:s: (визиты) или ym:pv: (просмотры). Без вызова get_metadata модель будет угадывать имена и ошибаться.

Ожидаете refresh-токен без секрета. Если вы не регистрировали собственное OAuth-приложение с client_secret, refresh не работает. Но токен живёт около года, и для CLI-инструмента это не проблема.

Что делать с этим прямо сейчас, по ролям

Автору на Дзене. Если вы ведёте канал и отслеживаете трафик из поиска, MCP-сервер позволяет задавать вопросы о Метрике голосом, без дашбордов. «Какие статьи привели больше всего визитов из органики за месяц?» Ответ придёт в чат, не нужно разбираться в интерфейсе Метрики.

Маркетологу. Сравнение периодов и воронки по целям через run_comparison экономит рутину построения отчётов. Но готовый инструмент пока требует установки Node.js и работы в терминале.

Разработчику, который пишет свой MCP-сервер. Разбор PKCE-авторизации через Яндекс ID без секрета, самый ценный кусок. Код открыт, лицензия MIT, и три описанные грабли OAuth сэкономят часы отладки.

Мнение редакции dzen.guru

Этот MCP-сервер показывает, как на практике работает связка «ИИ-агент плюс внешний API»: не абстрактная демонстрация, а рабочий инструмент для реальной аналитики. Решение с PKCE без секрета грамотное и по сути единственное правильное для CLI-инструментов, распространяемых через npm. Оговорка: инструмент требует базового владения терминалом. Для нетехнического пользователя барьер входа пока высок, и до «нажми кнопку, получи отчёт» ещё далеко. Но если вы хотя бы раз запускали команду в консоли, 15 минут хватит.

Для тех, кто раньше не сталкивался: что такое ИИ-агент в контексте аналитики? Это программа, которая получает ваш вопрос на обычном языке, сама решает, какие данные запросить и через какой API, выполняет запрос и возвращает ответ. Вы не пишете код запроса, не помните имена полей, не разбираетесь с форматами. MCP-сервер для Метрики делает именно это: превращает набор API-эндпоинтов в пять понятных инструментов, а модель выбирает нужный сама.

Если вы разрабатываете собственный MCP-сервер над любым другим HTTP API, паттерн тот же: мало гибких инструментов лучше, чем сотня кнопок, а PKCE решает проблему секрета для любого распространяемого CLI.

Попробуйте AI-инструменты для авторов Дзена

Разбираем нейросети, которые реально помогают вести канал: аналитика, тексты, автоматизация рутины.

Перейти на dzen.guru
Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

ai

Meta открыла нейросеть для программирования Muse Spark 1.1 через собственный API: доступ пока только в США

Meta запустила Muse Spark 1.1, нейросеть для программирования с улучшенным поиском багов и поддержкой мультиагентных систем (когда несколько ИИ-агентов…

5 мин
OpenAI два года скрывала от суда поиск по copyright-данным: найдено 78 млн диалогов
ai

OpenAI два года скрывала от суда поиск по copyright-данным: найдено 78 млн диалогов

OpenAI на протяжении двух лет утверждала в суде, что технически не способна искать по собственным обучающим данным (training data, массивы текстов, на которых…

5 мин
General Intuition привлекла $320 млн: робототехника и ИИ обойдутся без миллионов часов данных
ai

General Intuition привлекла $320 млн: робототехника и ИИ обойдутся без миллионов часов данных

Компания General Intuition привлекла 320 миллионов долларов на модель, обученную на видеоиграх, которая переносит навыки движения на реальных роботов после…

5 мин