
Yandex Metrika Mcp Server
io.github.artgas1Published by GitHub account artgas1v3.3.1Updated Oct 27, 2026
Полное покрытие API Яндекс Метрики: Stat, Management и Logs — 108 методов, 108 инструментов
Overview
Local MCP server exposing the Yandex Metrika API (Stat, Management, Logs) so an assistant can pull traffic reports and manage counters, goals and segments.
- What you can do
- Run Stat API reports: data, by-time, pivot and period comparisons with dimensions, metrics and dates.
- List and inspect counters, goals and segments, and read access grants, expenses and offline conversions.
- Create, update and delete counters, goals, segments, filters and grants when writes are enabled.
- Create, poll and download Logs API exports of raw visit data.
- List which tools are declared or hidden and how to widen the set.
- When to use it
- Useful when you work with Yandex Metrika analytics and want an assistant to query traffic reports or administer counters, goals and segments from a chat client instead of the web interface.
- Requirements
- Runs locally via npx (Node.js) or a local build; stdio by default, optional stateless HTTP via MCP_TRANSPORT, MCP_HOST and MCP_PORT. Requires a Yandex OAuth token with Metrika access in YANDEX_API_KEY, without which the server does not start. Network access to the Metrika API endpoint.
Installation
In SourceWeft
- Open Yandex Metrika Mcp Server in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Yandex Metrika MCP Server
MCP-сервер к API Яндекс Метрики. Покрыты все 108 методов; по умолчанию объявляются десять — те, которыми считают. Остальное включается одной переменной.
mcp-name: io.github.artgas1/yandex-metrika-mcp-server
[Вопрос «Откуда приходили люди за неделю и сколько дошло до цели?» и ответ таблицей: Поиск — 12 480 визитов, 386 целей, конверсия 3,1%; Реклама — 2 140 и 5,5%; прямые заходы — 1 905 и 2,3%; переходы по ссылкам — 640 и 1,9%. Числа иллюстративные.]Форк atomkraft/yandex-metrika-mcp (апстрим — Vadim Bezymianyi, MIT). С версии 2.0.0 инструменты не пишутся руками, а порождаются из спеки, собранной по официальной документации.
Покрытие
Имя инструмента — metrika_<ресурс>_<действие>, где ресурс взят из URL самого API без переименований.
Поэтому metrika_goal_list однозначно отображается в GET /management/v1/counter/{id}/goals
и в свою страницу документации.
Контракт
Сервер переписан из-за двух наблюдавшихся отказов: он отдавал не то, что просили, и молча подмешивал фильтр. Отсюда четыре правила, каждое закрыто тестом.
- Никакой молчаливой подмены. Что попросили — то и уходит в API. Сервер не досочиняет ни измерений, ни периода, ни фильтров.
- Всё, что сервер добавил от себя, видно в ответе. Ответ приходит как
{"_meta": {...}, "data": {...}}, где_meta.applied_by_serverперечисляет добавленное, а_meta.notes— принятые за вызывающего решения. - Отказ остаётся отказом. Ошибка API возвращается с
isError: trueи телом ответа Метрики. Повтор делается по статусу (429/500/502/503/504 и сетевые сбои), а не по подстроке в тексте; у 429 соблюдаетсяRetry-Afterс потолком 30 секунд. Число повторов всегда видно в_meta.retries. - Обрезание выдачи видно. В
_metaедутrows_returned,rows_totalиtruncated— Метрика режет ответ по умолчанию, и молчать об этом нельзя. Если сервер сам урезал ответ по потолку длины, это отдельно объявлено в_meta.truncated_by_serverс числом выброшенных строк. - Секреты не уезжают в ответ. У
metrika_measurement_deleteесть параметрtoken; в показанном_meta.request_urlего значение заменено наREDACTED. Сам OAuth-токен уходит только заголовком и в ответе не появляется никогда.
Фильтр роботов
В отчётах Stat API по умолчанию применяется собственный флаг робота Метрики, и только он:
Он объявлен: виден в схеме инструмента, отключается параметром human_traffic_only: false
и всегда перечислен в _meta.applied_by_server. Если в запросе есть метрики ym:ad: или
ym:ev:, фильтр не применяется (Метрика отвечает на такое сочетание 400) — и это попадает
в _meta.notes, а не остаётся молчаливым исключением.
Своё условие задаётся переменной METRIKA_TRAFFIC_FILTER — целиком, включая isRobot,
если он нужен:
Это образец формы, а не рекомендация. Какой рез верен — зависит от того, какие боты ходят именно к вам: отсечка по стране, по заголовку браузера или по подсети осмысленна только на своих данных. Копировать чужой список бессмысленно и опасно: он вырежет живой трафик.
Заданное своё условие сервер называет в stderr при старте — оно меняет числа в каждом отчёте, и молчать об этом нельзя.
Сравнение периодов: ответ, который выглядит валидным
У metrika_stat_comparison и metrika_stat_comparison_drilldown даты периодов
необязательны, и Метрика на их отсутствие не ругается. Она подставляет собственное окно
(последняя неделя) в оба набора и возвращает сравнение периода с самим собой:
Отказывать сервер не будет — запрос ушёл ровно тем, каким его собрали. Но такой ответ
приходит с пометкой в _meta.notes: и когда даты не заданы, и когда периоды совпали явно.
Как устроена спека
Публичного openapi.json у Метрики нет, но каждая страница метода сгенерирована из OpenAPI
движком Diplodoc и отдаётся как text/markdown. Семантика (тип, required, комбинатор,
ассертация) лежит в CSS-классах вида {.json-schema-property}, поэтому спека собирается
построчным сканером по классам, а не markdown-парсером.
spec/metrika-api.json коммитится — это состав API на момент сборки. Тест на дрейф сверяет
его с llms.txt: Яндекс добавил или удалил метод — тест краснеет.
Разбор привязан к версии генератора (Diplodoc Platform v5.57.3): вся семантика висит на его
классах, поэтому расхождение версии останавливает сборку спеки, а не молча портит её.
Запуск
По умолчанию объявляются десять инструментов из 108 — те, которыми считают. Управление счётчиками и целями, доступы и Logs API включаются переменной
METRIKA_PROFILE; подробности ниже, в разделе «Почему по умолчанию не всё».Спросить у самого сервера тоже можно: инструмент
metrika_catalog_listперечисляет, что объявлено, что скрыто и как это включить.
Токен — OAuth Яндекса, тот же, что используется для Директа и Вебмастера.
По умолчанию сервер сохраняет stdio-режим. Для одного локального процесса, к которому подключаются несколько MCP-клиентов, включите stateless Streamable HTTP:
Endpoint — http://127.0.0.1:13404/mcp. При loopback-привязке сервер также
проверяет Host, чтобы локальный endpoint нельзя было вызвать через DNS rebinding.
Подключение к клиенту
Из локальной сборки — то же самое, но "command": "node" и путь до build/index.js.
Мажор в строке запуска закреплён намеренно: смена мажорной версии меняет набор инструментов по умолчанию, и получать это молча при старте агента не нужно.
Переменные окружения
Как узнать, что скрыто, не открывая README
Инструмент metrika_catalog_list объявлен в любом профиле и отвечает из спеки, лежащей в
пакете, — ни токена, ни сети ему не нужно:
Он существует по простой причине: сервер, который что-то скрыл, обязан уметь сказать, что
именно и как это включить. instructions видит модель, но не человек — в интерфейс клиента
они не показываются; стартовую строку в stderr в обычной работе тоже никто не открывает. Без
этого инструмента узнать про остальные 98 можно было только придя сюда.
Список инструментов в ответе строится из того же отбора, по которому они регистрируются, — разойтись с реальностью ему негде, и это проверено тестом.
Почему по умолчанию не всё
[Список из 108 инструментов сервера: десять оставлены, 98 вычеркнуты. Манифест по умолчанию — 32 181 байт против 158 301 у полного каталога.]Описания объявленных инструментов лежат в контексте модели, когда клиент их загрузил. Это
цена сервера, которую платят за сам факт подключения, а не за вызовы. Замер tools/list
(09.09.2026):
Замер core — 14,5 тысячи до появления каталога и 14,8 после: сам инструмент стоит около
670 байт схемы, примерно 2% набора. Его ответ не входит в эту цену — он платится только при
вызове.
Байты точные, их воспроизведёт любой: сериализуй ответ tools/list и посчитай длину.
С токенами сложнее, и здесь стоит сказать прямо.
⚠️ Замер честный только у core — его дал /context клиента, который считает
собственным токенизатором. Две другие строки пересчитаны из байтов по калибровке
2,17 байта на токен, снятой с той же строки core.
Ходовая эвристика «4 символа на токен» здесь врёт почти вдвое: она выведена на
английском тексте, а описания у этого сервера русские, и кириллица в BPE токенизируется
примерно вдвое хуже латиницы. Первая редакция этой таблицы была построена именно на ней и
называла для core 7,9k вместо 14,5k. Если считаешь бюджет контекста для сервера с
не-английскими описаниями — считай токенизатором, а не делением на четыре.
Состав core выведен из замера реального использования, а не из вкуса: шесть отчётов Stat
плюс справочники, без которых отчёт не собрать (metrika_counter_list, metrika_counter_get,
metrika_goal_list, metrika_segment_list). Порог веса стоит тестом — манифест не может
подорожать молча. Порог в тесте стоит на байтах: они не зависят ни от токенизатора, ни
от языка описаний.
Безопасность
- Запись выключена по умолчанию, и меняющие инструменты не объявляются вовсе. Среди
методов четырнадцать
DELETEи пять удаляющихPOST(.../measurement/delete,.../expense/delete,.../logrequest/{id}/cleanи т. д.). Цена ошибочного вызова — удалённый счётчик или цель без возможности восстановить историю. Модель не может позвать то, чего не видит вtools/list; как включить — сказано вinstructionsсервера. - Аннотации проставлены на всех инструментах (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint). Клиент по ним отличает чтение от удаления: удаление под глаголомPOSTпомечено разрушающим,PUT— тоже, потому что заменяет сущность целиком. - Ответы Метрики — недоверенные данные. В отчётах лежат поисковые фразы, заголовки
страниц, реферера и значения UTM, то есть строки, которые пишут посетители сайта. Любой
может зайти на сайт по ссылке с текстом внутри и увидеть его в отчёте. У всех инструментов
openWorldHint: true, а в_meta.notesотчётов и выгрузок едет напоминание, что это данные, а не инструкции. - stdio остаётся транспортом по умолчанию. HTTP включается только явно через
MCP_TRANSPORT=http; безопасный дефолт слушает127.0.0.1и проверяетHost.
Политика приватности
Сервер не собирает, не хранит и никуда не передаёт данные о вас. Ни телеметрии, ни аналитики, ни обращений к серверам автора — их не существует: под этот пакет не поднято никакой инфраструктуры.
Единственный сетевой адресат — https://api-metrika.yandex.net. Токен читается из
YANDEX_API_KEY в память процесса и никуда не пишется: ни в файл, ни в stdout, ни в тело
ответа. Данные отчётов не кэшируются на диск и не переживают процесс.
Данные, которые вы запрашиваете, обрабатывает Яндекс как оператор Метрики — на это распространяется его политика, а не эта.
Полный текст: PRIVACY.md.
Установка одним файлом (MCPB)
Для Claude Desktop и других клиентов, понимающих MCP-бандлы, есть .mcpb-файл — он лежит в
релизах. Открываете файл, вводите
токен в окне установки — всё.
Бандл собирается из того же кода тем же тегом (npm run mcpb), а его манифест генерируется
из package.json и профиля — не пишется руками, поэтому разойтись с сервером ему негде; это
проверяется тестом.
⚠️ В бандле нельзя включить запись. Цена ошибочного вызова — удалённый счётчик или цель без возможности восстановить историю, и щёлкать таким переключателем в окне установки нечего. Нужна запись — ставьте пакет с npm и включайте её осознанно, переменной окружения.
Без MCP: скилл и командная строка
MCP подходит не всем и не всегда: клиент может не уметь MCP вовсе, а описания инструментов занимают контекст постоянно — они лежат в нём, пока сервер подключён, вызываешь ты их или нет.
Для этого случая тот же сервер умеет запускаться командой:
Поверх этого лежит скилл — папка с инструкцией для агента, которая ставится одной строкой:
Скилл не добавляет клиенту инструментов и ничего не держит в контексте: он читается только когда речь зашла о Метрике. Внутри — та же команда, справочник всех 108 методов и словарь измерений.
Где он работает. Установщик кладёт один экземпляр в .agents/skills/yandex-metrika/
и симлинкует его в папки конкретных агентов. Проверено запуском на двух:
Установщик заявляет ещё около двадцати агентов через тот же универсальный каталог (Amp, Cline, Antigravity, Augment и другие) — там мы не проверяли.
Почему это не вторая реализация. CLI не делает ни одного собственного запроса: он разбирает
аргументы и зовёт executeMethod — ту же функцию, что и MCP-инструменты. Отсюда одинаковые
гарантии: фильтр роботов в отчётах, потолок ответа с распиской об урезании, вычистка секретов
из показываемого URL, повтор по статусу. Разойтись им негде, потому что расходиться нечему.
Справочник методов внутри скилла генерируется из spec/metrika-api.json — той самой спеки,
которая обновляется из документации Яндекса ежедневно. Тест сверяет закоммиченный файл с тем,
что сгенерировалось бы сейчас, поэтому «скилл отстал от API» здесь красное, а не незаметное.
Два сознательных отличия команды от MCP:
Профиль существует, чтобы не платить контекстом за описания невызванных инструментов; у команды в терминале такой цены нет. Гейт записи — про другое: удалённую цель нечем восстановить, и послабление здесь было бы дырой в обход сервера.
Проверки
Не макет — запустите сами
[Запись прогона в терминале: запрос metrika_stat_data с измерением по источникам трафика и периодом в неделю, ответ с объявленным фильтром роботов и тремя строками отчёта.]Всё на записи приходит из ответа сервера по JSON-RPC: строка добавленного фильтра — из _meta.applied_by_server, строки отчёта — из тела ответа. Ни токена, ни сети: запросы уводятся на локальную заглушку, поэтому прогон повторяется где угодно, включая CI. Переснять запись — npm run demo:record.
Протокольные тесты поднимают сервер как подпроцесс и говорят с ним по JSON-RPC — тем же
способом, каким это делает клиент. Сеть при этом не нужна: METRIKA_API_BASE уводит запросы
на заглушку. Проверяется в том числе то, чего не видно изнутри: что в stdout не попадает
ничего, кроме JSON-RPC, что отказ API приезжает как isError, а не как успешный текст, и что
запись действительно заблокирована.
Чего в проверках НЕТ
Евала выбора инструмента. Это единственная проверка, которую не заменяют ни снапшот схемы, ни протокольный тест: описания могут быть синтаксически безупречны, а модель всё равно возьмёт не тот инструмент. Тесты этого не видят по построению — они зовут инструмент по имени, то есть выбор уже сделан за модель.
Здесь это осознанный пропуск, а не забытый пункт. Профиль по умолчанию — десять инструментов, из них шесть отчётов Stat различаются формой ответа, а не темой, и путать их модели особо не с чем. Евал становится нужен, когда поверхность по умолчанию расширяется или когда в неё попадают инструменты с пересекающимися описаниями, — тогда его надо писать до расширения, а не после.
Что изменилось в 2.0.0
Удалены 26 инструментов-обёрток над пресетами Stat API (get_visits, sources_summary,
get_page_performance и прочие). Они покрывали малую часть API, зашивали измерения и период
в код и не давали задать произвольный запрос. Их заменяют metrika_stat_*, принимающие
параметры Stat API как есть.
Появились методы, которых не было вовсе: список счётчиков, цели, сегменты, фильтры, разрешения, расходы, офлайн-конверсии и весь Logs API. Раньше идентификатор счётчика приходилось знать заранее — теперь его можно найти.
Что изменилось в 2.1.0
Сервер довели до состояния, в котором его не страшно оставить агенту.
- Аннотации на всех 108 инструментах. До этого клиент не отличал
metrika_counter_listотmetrika_counter_delete. - Запись выключена по умолчанию (
METRIKA_ALLOW_WRITES). - Найден и починен дефект разбора документации. Ассертации размечены строкой, где значение стоит после закрывающей скобки класса, — распознаватель свойств заякорен на конец строки и такие строки не матчил вовсе. В итоге до спеки не доезжало ни одного примера, значения по умолчанию или границы, а часть их падала в описание соседнего поля. Сейчас в спеке 288 примеров, 69 значений по умолчанию и 155 ограничений; ограничения переносятся в схему инструмента, примеры и значения по умолчанию — в описания параметров.
- Найдена и починена потеря обязательности. Параметры вида «один из N типов» (
goalу создания и правки цели,grantу выдачи доступа) собирались какz.unknown(), а он в zod необязателен, — обязательное поле уезжало клиенту как опциональное. Теперь это объединение реальных форм, и обязательность на месте. - Ссылки на сущности разворачиваются на один уровень: у 23 параметров тела вместо свободного объекта видны настоящие поля.
- Послабления на входе там, где они безвредны. Число строкой, булево словом, список через запятую в строке запроса — принимаются; в теле запроса, где важен точный JSON, не принимаются.
- Потолок длины ответа с объявленным урезанием: выгрузка Logs API бывает в сотни мегабайт.
- Вычистка секретов из показанного
request_url. - Повтор на 429 с соблюдением
Retry-After. - SDK обновлён до 1.30 — на 1.17 висели три опубликованных уязвимости, две высокие;
npm audit --audit-level=highтеперь часть CI. - Починена джоба дрейфа в CI. Она запускала тесты через
| teeбезpipefail, поэтому код возврата брался уteeи джоба оставалась зелёной при любом падении теста.
Source: README.md at commit 42e32fd
Tools
0Version history
1- v3.3.1LatestSep 16, 2026
Score
40% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Declare a license in the repository or the registry entry.