Игорь Градов
Игорь Градов
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 AI убрала слово «обучение» из условий, но юристы нашли лазейку для парсинга

Почему это важно Meta убрала из пользовательских условий слово «обучение», но юристы указывают: оставшаяся формулировка «разработка бизнес-продуктов»…

4 мин
Что такое окно контекста в нейросети и как не терять решения в длинных проектах
ai

Что такое окно контекста в нейросети и как не терять решения в длинных проектах

Если вы месяцами ведёте блог или проект вместе с ChatGPT и при этом каждый новый чат начинается с нуля, значит, нейросеть потеряла контекст, и эта инструкция…

6 мин
Morse AI: один разработчик переписал приложение с нуля, добавив 37 азбук и 60 языков
ai

Morse AI: один разработчик переписал приложение с нуля, добавив 37 азбук и 60 языков

Morse AI — это приложение для изучения и работы с азбукой Морзе, которое автор полностью переписал с нуля при помощи ИИ, добавив 37 национальных азбук, перевод…

5 мин