Skip to main content

yandex-mcp

Спрашивай свою аналитику словами. MCP-сервер к Яндекс Метрике, Вебмастеру, Директу и Вордстату: 15 инструментов, ноль зависимостей, токен лежит в хранилище ОС и не появляется ни в одном ответе.

Install in VS Code Install in Cursor License: MIT

> Как изменился трафик за последний месяц и откуда пришёл рост?
> По каким запросам мы на второй странице — там, где до топа осталось чуть-чуть?
> Сколько стоила заявка в Директе на прошлой неделе по каждой кампании?

Кому это

Кому Что закрывает
Маркетологу, аналитику Метрика: сводка, произвольный отчёт, сравнение периодов, цели, счётчики
SEO-специалисту Вебмастер: ИКС, страницы в поиске, поисковые запросы с позициями, динамика индексации, sitemap, переобход. Вордстат: частотности и что ищут вместе
PPC-специалисту Директ: кампании, остаток баллов API, отчёты Reports API v5 — расход, клики, CTR, средняя цена клика

Безопасность в трёх фразах

Сервер работает только на вашем компьютере: он ходит в API Яндекса напрямую, никаких посредников. Токен хранится в Keychain, GNOME Keyring или файле с правами 0600 — и не появляется ни в ответе инструмента, ни в тексте ошибки. Единственное необратимое действие — постановка страниц на переобход — требует явного confirm: true.

Установка

Claude Code — плагин, две команды

/plugin marketplace add nozikov/yandex-mcp
/plugin install yandex-mcp@nozikov

Плагин ставит сервер и скиллы разом, обновляется через /plugin update, а пути подставляет сам. Нужен только Python 3.8+, установка пакета не требуется.

Плагин Руками через claude mcp add
Установка две команды команда + указание путей
Скиллы в комплекте да нет
Пути подставляет ${CLAUDE_PLUGIN_ROOT} прописываете сами
Обновление /plugin update git pull и проверка путей

Любой MCP-клиент — из PyPI

uvx yandex-mcp              # запуск без установки
# или: pipx install yandex-mcp
claude mcp add yandex -s user -e YANDEX_MCP_DEFAULT_COUNTER=12345678 -- uvx yandex-mcp

Или вручную в конфиге клиента — см. .mcp.json.example:

{
  "mcpServers": {
    "yandex": {
      "command": "uvx",
      "args": ["yandex-mcp"],
      "env": { "YANDEX_MCP_DEFAULT_COUNTER": "12345678" }
    }
  }
}

YANDEX_MCP_DEFAULT_COUNTER опционален: без него counter_id придётся передавать в каждом вызове явно.

Вход

Терминал не нужен — просто попросите агента:

> Подключи Яндекс

Он вызовет yandex_login, покажет ссылку, вы подтвердите доступ в браузере и вернёте код в чат. Токен ляжет в хранилище ОС, перезапускать сервер не нужно.

Если предпочитаете терминал:

yandex-mcp setup     # регистрация приложения Яндекса, по шагам
yandex-mcp login     # вход в браузере
yandex-mcp status    # какие токены есть, где лежат, когда истекут
yandex-mcp logout    # удалить токены из хранилища

Приложение Яндекса

Яндекс выдаёт токен только зарегистрированному приложению, поэтому один раз нужно создать своё — это бесплатно и занимает пять минут. yandex-mcp setup открывает нужную страницу и проводит по шагам. Client secret не нужен: используется PKCE, где подлинность подтверждается тем, что только ваш процесс знает code_verifier.

При создании Яндекс спрашивает тип приложения — подходят оба, разница в способе входа:

Тип приложения Redirect URI Вход
«Для авторизации пользователей» задаёте сами: http://localhost:8765/callback login или yandex_login с mode: localhost
«Для доступа к API или отладки» зафиксирован на https://oauth.yandex.ru/verification_code login --manual или yandex_login (по умолчанию)

Права добавляются в разделе «Доступ к данным» по названию:

metrika:read
webmaster:hostinfo
webmaster:verify
direct:api           ← требует одобренной заявки в кабинете Директа, до 7 дней

Что именно доступно, решает панель Яндекса, а не настройки здесь. Вход за одну авторизацию просит все права сразу. Если direct:api ещё не одобрен, Яндекс отклонит авторизацию с ним — login заметит это, сам войдёт без Директа и скажет об этом. Метрика и Вебмастер заработают сразу, а когда заявку одобрят, тот же login подхватит Директ.

Если нужен least privilege — login --service metrika выдаст отдельный узкий токен только на неё; такой токен имеет приоритет над общим.

Инструменты

Инструмент Что делает
metrika_summary Сводка за период: визиты, посетители, отказы, длительность визита, глубина, достижения всех целей счётчика
metrika_report Произвольный отчёт Reporting API Метрики — любые метрики, измерения, фильтры
metrika_compare Сравнение метрик между двумя периодами (по умолчанию — с предыдущим такой же длины), опционально построчно по измерению
metrika_counters Список доступных счётчиков с сайтами и статусом
webmaster_summary ИКС, страниц в поиске, исключено, активные проблемы диагностики по всем подтверждённым сайтам
webmaster_queries Поисковые запросы: показы, клики, средняя позиция
webmaster_indexing Динамика количества страниц в поиске по датам
webmaster_sitemaps Sitemap-файлы, которые видит Яндекс: URL, число адресов, ошибки, дата обращения робота
webmaster_recrawl Постановка URL в очередь на переобход. Единственный мутирующий вызов, до 20 URL, требует confirm: true
direct_campaigns Список кампаний Директа и остаток баллов API
direct_report Отчёт Reports API v5 — расход, показы, клики, CTR по кампаниям, объявлениям, группам или поисковым запросам
wordstat_phrases Частотности Вордстата через Live v4 API Директа
yandex_login Шаг 1 входа: ссылка авторизации, терминал не нужен
yandex_submit_code Шаг 2 входа: обмен кода на токен
yandex_auth_status Что подключено, где лежат токены, когда истекают

Скиллы

Ставятся вместе с плагином, вызываются как обычные слэш-команды:

Скилл Что делает
/yandex-mcp:site-weekly Недельный отчёт по сайту: трафик, источники, поиск, реклама — и что с этим делать
/yandex-mcp:seo-opportunities Запросы на границе топа: где до первой страницы осталось чуть-чуть

Почему 15 инструментов, а не 130

Спецификация инструментов уходит в контекст модели при каждом запросе, пока сервер подключён. У нас это ≈1 800 токенов. У серверов со 130–150 инструментами — 40 000 и больше, причём 85% приходится на JSON-схемы параметров. Это постоянный налог на каждый диалог и лишний шум при выборе инструмента.

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

Где лежат токены

Хранилище выбирается автоматически, по убыванию защищённости:

Условие Хранилище
macOS Keychain (security)
Linux с libsecret Secret Service (secret-tool → GNOME Keyring, KWallet)
Windows, headless-сервер, Docker файл secrets.json с правами 0600 в конфиг-директории

Принудительно — переменной YANDEX_MCP_KEYSTORE=keychain|secret-tool|file.

Все записи лежат под префиксом yandex-mcp-, чтобы в глобальном пространстве имён Keychain ничего не пересекалось и logout не задел чужое:

yandex-mcp-token             общий токен единого входа
yandex-mcp-metrika-token     узкий токен одного сервиса
yandex-mcp-client-id         ID приложения Яндекса

Любой секрет можно прокинуть через окружение, минуя хранилище: yandex-mcp-metrika-tokenYANDEX_MCP_SECRET_METRIKA_TOKEN, общий токен → YANDEX_MCP_SECRET_TOKEN. Это основной способ для Docker и CI.

Переменные окружения

Переменная Зачем
YANDEX_MCP_DEFAULT_COUNTER ID счётчика Метрики по умолчанию
YANDEX_MCP_CLIENT_ID ID приложения Яндекса, если не хотите хранить его в хранилище
YANDEX_MCP_KEYSTORE keychain, secret-tool или file — форсировать хранилище
YANDEX_MCP_SECRET_* Прокинуть готовый секрет мимо хранилища (Docker, CI)
YANDEX_MCP_DIRECT_SANDBOX 1 — все вызовы Директа идут в песочницу, баллы API не тратятся
YANDEX_MCP_DIRECT_CLIENT_LOGIN Логин клиента для агентских аккаунтов
YANDEX_MCP_WORDSTAT_WAIT Сколько секунд ждать отчёт Вордстата в одном вызове, по умолчанию 170

Принципы

  • Токен не хранится в открытом виде там, где есть системное хранилище, и не появляется ни в одном ответе инструмента, ни в тексте ошибки — есть отдельный scrub(), вычищающий Bearer/OAuth-заголовки и Яндекс-токены (y0_..., y1_...) из любого текста. status печатает только sha256-отпечаток.
  • Почти всё — чтение. Единственный мутирующий вызов — webmaster_recrawl, ограниченный 20 URL за раз и требующий confirm: true: у Вебмастера квота 150 в сутки на весь сайт.
  • Данные из API считаются недоверенными. Поисковые фразы, UTM-метки и названия кампаний пишут посторонние люди; каждый ответ снабжается пометкой, что это данные для анализа, а не инструкции агенту.
  • Официальный MCP SDK не используется намеренно — он тянет httpx, pydantic, anyio и их транзитивные зависимости, а через этот процесс проходит OAuth-токен к вашей аналитике и рекламному кабинету. Меньше чужого кода в рантайме — меньше supply-chain поверхность.

Структура проекта

src/yandex_mcp/
  cli.py               # yandex-mcp: без аргументов сервер, с аргументами настройка
  server.py            # JSON-RPC поверх stdio
  registry.py          # реестр инструментов: сборка TOOLS/HANDLERS
  httpclient.py        # urllib-обёртка: заголовки, единая обработка ошибок
  scrub.py             # вычищение секретов из ответов и ошибок
  auth/
    store.py           # выбор хранилища: Keychain / secret-tool / файл 0600
    tokens.py          # токен сервиса, с фолбэком на общий
    flow.py            # PKCE-вход: begin/complete — тихие, save_tokens — терминальный
    callback.py        # приём redirect на localhost
  tools/               # по модулю на сервис: metrika, webmaster, direct, wordstat, auth
tests/
  conftest.py          # изолированное файловое хранилище вместо системного
  auth/ tools/         # структура повторяет исходники
.claude/skills/        # скиллы, которые ставятся вместе с плагином
.claude-plugin/        # манифесты плагина и маркетплейса Claude Code

Код лежит в src/, а не в корне: при таком раскладе import yandex_mcp берёт установленный пакет, а не случайно подхваченную рабочую директорию — иначе тесты могут проходить на коде, которого нет в собранном колесе.

Разработка

pip install -e ".[dev]"
pytest

Тесты не ходят в сеть и не трогают системное хранилище: сеть и Keychain подменяются через monkeypatch, секреты пишутся во временный файл. CI гоняет их на Linux, macOS и Windows.

Ограничения

  • direct_campaigns, direct_report и wordstat_phrases требуют одобренного доступа к API Директа — до одобрения Директ отвечает кодом ошибки 58.
  • wordstat_phrases: отчёт готовится у Яндекса около трёх минут. Если вызов вернул «ещё готовится» — повторите его с теми же фразами, готовый результат подхватится сразу.
  • direct_report при офлайн-обработке может готовиться минуты — тул сам ждёт, но упирается в квоту Директа: не больше 5 офлайн-отчётов в очереди на аккаунт.
  • webmaster_sitemaps отдаёт первые 100 sitemap хоста (без пагинации).
  • Ответ каждого инструмента обрезается до 20000 символов — для больших выгрузок сужайте период или limit.
  • Файловое хранилище (Windows, headless, Docker) держит токен в открытом виде под правами 0600 — уровень ~/.aws/credentials или SSH-ключа без пароля. На Windows права наследуются от профиля пользователя, chmod там условен.
  • На macOS запись в Keychain идёт через security add-generic-password -w <value>, то есть на время работы подпроцесса значение видно в ps — ограничение самого CLI. На Linux secret-tool читает значение из stdin, там этой проблемы нет.
  • Обновление токена (refresh) у Яндекса требует client_secret, которого у PKCE-приложения нет. Практического значения это не имеет: выданный так токен живёт около года, после чего достаточно повторить yandex-mcp login.

Лицензия

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yandex_mcp-2.1.0.tar.gz (44.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yandex_mcp-2.1.0-py3-none-any.whl (45.0 kB view details)

Uploaded Python 3

File details

Details for the file yandex_mcp-2.1.0.tar.gz.

File metadata

  • Download URL: yandex_mcp-2.1.0.tar.gz
  • Upload date:
  • Size: 44.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yandex_mcp-2.1.0.tar.gz
Algorithm Hash digest
SHA256 fcc8ea8433702ae11254c9336c607ea6317f3426f6b839e3d7a79e63a5ebc244
MD5 d469c8109f304b67a3ae4f4dc4f6ce36
BLAKE2b-256 1aad624f3ba6930b78d2476be9d421df41eb0b20ebd9e9818fb8217d2f447740

See more details on using hashes here.

Provenance

The following attestation bundles were made for yandex_mcp-2.1.0.tar.gz:

Publisher: publish.yml on nozikov/yandex-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yandex_mcp-2.1.0-py3-none-any.whl.

File metadata

  • Download URL: yandex_mcp-2.1.0-py3-none-any.whl
  • Upload date:
  • Size: 45.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for yandex_mcp-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b78a755fe5c39551b839a4dadc80c12d385ff5c69710f4a583f6a1312be44348
MD5 5eb9f0c9707703dd50204f2d1bc902db
BLAKE2b-256 fbdbcbcd5bf8c9d12b257c52b8147e9d24710f1c83858a52354913a7f8c91928

See more details on using hashes here.

Provenance

The following attestation bundles were made for yandex_mcp-2.1.0-py3-none-any.whl:

Publisher: publish.yml on nozikov/yandex-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page