Skip to main content
Glama
antohins

seo-tools-mcp

by antohins

seo-tools-mcp

CI License: MIT GitHub MCP Registry

Русский | English

Восемь универсальных stdio MCP-серверов для SEO: доступ к SERP, Wordstat, Google Search Console, Google Analytics 4, Яндекс.Вебмастеру, Яндекс.Метрике и self-hosted A-Parser прямо из Claude Code (и любого MCP-клиента). Все инструменты read-only — ничего не публикуют и не меняют в твоих аккаунтах, вывод — строгий JSON. Машиночитаемо это заявлено аннотацией readOnlyHint; её намеренно нет у двадцати инструментов, каждый вызов которых тратит платный ресурс (запрос к XMLStock/XMLRiver, прокси-трафик A-Parser) — иначе клиент счёл бы их безобидными и перестал спрашивать подтверждение перед прогоном по большому пулу. К конкретному сайту не привязаны: дефолты (свойство GSC, свойство GA4, хост Вебмастера, счётчик Метрики) настраиваются на лету.

🛰 Эти серверы мы используем в продакшене в PBN Workers — инфраструктура поискового топа: семантика, PBN и сателлиты, автоматизация SEO. Нужен стабильный органический трафик — приходите.

Сервер

Рабочие инструменты

Авторизация

xmlstock

xmlstock_serp, xmlstock_images, xmlstock_news, xmlstock_video, xmlstock_wordstat, xmlstock_wordstat_dynamics, xmlstock_wordstat_regions, xmlstock_wordstat_regions_tree, xmlstock_balance

API-ключ

xmlriver

xmlriver_serp, xmlriver_images, xmlriver_news, xmlriver_maps, xmlriver_check_index, xmlriver_suggest, xmlriver_related_questions, xmlriver_balance

API-ключ

wordstat

wordstat_frequency, wordstat_dynamics, wordstat_regions, wordstat_regions_tree

Api-Key Yandex Cloud

gsc

gsc_query, gsc_inspect_url, gsc_list_sites, gsc_get_site, gsc_list_sitemaps, gsc_get_sitemap

OAuth (все свойства аккаунта) / service account

ga4

ga4_list_properties, ga4_property_details, ga4_metadata, ga4_check_compatibility, ga4_report, ga4_bytime, ga4_traffic_sources, ga4_geo, ga4_devices, ga4_top_pages, ga4_events, ga4_funnel, ga4_annotations, ga4_realtime

OAuth (все свойства аккаунта) / service account

ywm

ywm_hosts, ywm_summary, ywm_search_queries, ywm_queries_history, ywm_recommended_queries, ywm_popular, ywm_indexing_history, ywm_sqi_history, ywm_external_links, ywm_broken_links, ywm_diagnostics, ywm_important_urls, ywm_sitemaps

OAuth (авто-refresh)

metrika

metrika_report, metrika_bytime, metrika_counters, metrika_goals, metrika_traffic_sources, metrika_geo, metrika_devices, metrika_landing_behavior, metrika_search_phrases, metrika_top_landings

OAuth (авто-refresh)

aparser

aparser_ping, aparser_status, aparser_proxies, aparser_parsers, aparser_parser_fields, aparser_get_preset, aparser_serp_google, aparser_serp_yandex, aparser_suggest, aparser_request, aparser_bulk_request

self-hosted A-Parser (URL + пароль API)

Где опубликовано: npm (восемь пакетов), официальный MCP Registry, GitHub MCP Registry (все восемь серверов), маркетплейс плагинов Claude Code (см. ниже) и .mcpb-бандлы в релизах.

У каждого сервера дополнительно есть auth-инструменты <server>_auth_status и <server>_set_credentials (см. Интерактивная авторизация).

Инструменты по сервисам

xmlstock — SERP Google/Яндекс

  • xmlstock_serp — веб-выдача Google/Яндекса (органика + подсветки + SERP-фичи): регион, устройство, safe search, сортировка (Яндекс), период, рекламные блоки; третий движок yandex_xml — официальный Яндекс XML (groupby до 100 за 1 запрос, hlword на любых устройствах, статистика found/found-docs; тариф от 24 ₽/1000)

  • xmlstock_images — поиск картинок Google (url страницы + url изображения + заголовок)

  • xmlstock_news — новости Google (заголовок, источник, дата, сниппет)

  • xmlstock_video — видео Google (url, заголовок, превью, хост, канал, длительность)

  • xmlstock_wordstat — Яндекс Wordstat: топ + похожие запросы с частотностью (можно по региону), операторы Wordstat

  • xmlstock_wordstat_dynamics — динамика частотности по времени (день/неделя/месяц)

  • xmlstock_wordstat_regions — спрос по регионам (count, share, affinity index + имена регионов)

  • xmlstock_wordstat_regions_tree — дерево регионов Wordstat (id + имя + путь)

  • xmlstock_balance — баланс аккаунта / проверка ключа (бесплатно)

Wordstat через XMLStock — тем же ключом XMLSTOCK_*, что и SERP; не нужен Yandex Cloud (в отличие от отдельного сервера wordstat).

xmlriver — SERP Google/Яндекс + проверка индексации

  • xmlriver_serp — органика Google/Яндекса (глубина добирается пагинацией: каждые 10 позиций = 1 платный запрос), флаг наличия AI Overview; опция includeAIOverview — полный текст Обзора от ИИ + цитируемые ссылки (платный ai=1, только Google); includeAdditional — доп. SERP-блоки Google из <addresults> (knowledge_graph, localresultsplace, rs и др.; наполнение зависит от платных опций кабинета XMLRiver, непришедшие блоки — в additional.unavailable); гео-таргетинг Google — location (город → loc, «Moscow»/«1011969») и country (ISO/числовой id, автовыводится из города); device — desktop/mobile/tablet, os (ios/android) отправляется только при device=mobile

  • xmlriver_images — картинки Google (страница + url картинки + заголовок + источник + размеры); гео — location/country

  • xmlriver_news — новости Google (заголовок, источник, дата, сниппет), фильтр по времени; гео — location/country

  • xmlriver_maps — поиск заведений по Google Maps (setab=maps, обязательные zoom 1–15 и coords «широта,долгота», count 5–50): название, рейтинг, адрес, телефон, сервисы, координаты, place_id, число отзывов. ВАЖНО: формат по доке, лайвом не подтверждён (на тестовом аккаунте эндпоинт устойчиво отвечает кодом 500 — вероятно, нужна платная опция кабинета)

  • xmlriver_check_index — проверка индексации URL в Google/Яндексе (inindex)

  • xmlriver_suggest — поисковые подсказки Google (до 50 фраз за вызов, платно за каждую фразу); гео подсказок — location/country

  • xmlriver_related_questions — блок «Вопросы по теме» / People Also Ask Google (вопросы всегда; ответы — только при включённой платной опции «Related Questions с ответами» в кабинете)

  • xmlriver_balance — баланс аккаунта / проверка ключа (бесплатно)

wordstat — частотности Яндекса

  • wordstat_frequency — широкая и точная частотность, уточняющие запросы (related) и ассоциации

  • wordstat_dynamics — частотность по времени (день/неделя/месяц)

  • wordstat_regions — распределение по регионам с индексом аффинити и именами регионов

  • wordstat_regions_tree — полное дерево регионов Вордстата (id + имя)

gsc — Google Search Console

  • gsc_query — Search Analytics (клики/показы/CTR/позиция), авто-пагинация, dataState final/all, произвольные фильтры измерений (filters, AND-семантика) и aggregationType (auto/byProperty/byPage)

  • gsc_inspect_url — URL Inspection: статус индексации, покрытие, canonical, последний обход, mobile usability, rich results

  • gsc_list_sites — свойства, доступные авторизации

  • gsc_get_site — уровень доступа к свойству

  • gsc_list_sitemaps — отправленные sitemap со статусом

  • gsc_get_sitemap — детали одного sitemap

Даты Search Analytics — по Pacific Time (не МСК); история ~16 месяцев; финальные данные отстают на ~2-3 дня (свежие — dataState=all); ctr в ответе — доля 0..1.

ga4 — Google Analytics 4

  • ga4_list_properties — свойства GA4, доступные авторизации (отсюда берётся propertyId — это не Measurement ID G-XXXXXXX)

  • ga4_metadata — какие измерения и метрики доступны в ЭТОМ свойстве, включая кастомные (customEvent:…); поиск подстрокой, blockedReasons (по такой метрике отчёт вернёт нули) и type (целое/дробное для metricFilters)

  • ga4_check_compatibility — совместима ли связка измерений/метрик в этом свойстве, без тяжёлого отчёта; при несовместимости — какие поля убрать

  • ga4_report — произвольный отчёт: любые измерения × метрики, фильтры по измерениям, сортировка (полный Data API runReport)

  • ga4_bytime — динамика метрик по времени (день/час/неделя/месяц)

  • ga4_traffic_sources — источники трафика: группа каналов, source/medium, кампания; organicOnly — только органика

  • ga4_geo — страна/регион/город

  • ga4_devices — тип устройства/ОС/браузер

  • ga4_top_pages — топ страниц по pagePath, странице входа или заголовку; фильтры organicOnly и pathContains

  • ga4_events — события по eventName; keyEventsOnly — только ключевые события (бывшие конверсии)

  • ga4_realtime — отчёт в реальном времени (последние 30 минут)

  • ga4_funnel — воронка (runFunnelReport): сколько дошло до каждого шага и где отвалились; шаг = событие и/или условия по измерениям, разбивка по измерению. Внутри шагов действует схема Exploration API (pagePath там недоступен), корзина квоты отдельная и запрос дороже обычного отчёта

  • ga4_annotations — аннотации свойства: пометки на датах, включая созданные самой GA4 (systemGenerated) — частое объяснение необъяснимого скачка в динамике

  • ga4_property_details — карточка свойства: таймзона отчётов, валюта, уровень сервиса (STANDARD/360) и потоки данных с их Measurement ID G-XXXXXXX

Во всех отчётных инструментах есть includeQuota — сколько «токенов» Data API съел запрос и сколько осталось на час/сутки.

Единицы и даты: bounceRate/engagementRate GA4 отдаёт долей 0..1 (не процентами); даты считаются в таймзоне свойства — принимаются YYYY-MM-DD и ключевые слова GA4 (today, yesterday, 28daysAgo), фактическая таймзона возвращается в ответе. В ответах есть totalRows/truncated, а thresholded: true означает, что часть данных скрыта порогом конфиденциальности GA4.

ywm — Яндекс.Вебмастер

  • ywm_hosts — id пользователя + подтверждённые сайты

  • ywm_summary — ИКС, страниц в поиске, исключено, проблемы сайта по важности

  • ywm_search_queries — аналитика запросов по URL (~2 недели по умолчанию; переопределяется dateFrom/dateTo)

  • ywm_queries_history — суммарные показы/клики/позиции по времени

  • ywm_recommended_queries — приближённые рекомендованные запросы (спрос + недобор кликов)

  • ywm_popular — популярные запросы хоста

  • ywm_indexing_history — страниц в поиске по времени

  • ywm_sqi_history — ИКС по времени

  • ywm_external_links — выборка внешних ссылок + общее число

  • ywm_broken_links — битые внутренние/внешние ссылки

  • ywm_diagnostics — проблемы сайта

  • ywm_important_urls — отслеживаемые URL со статусом индексации/поиска

  • ywm_sitemaps — sitemap со статусом

metrika — Яндекс.Метрика

  • metrika_report — произвольный отчёт: любые dimensions × metrics, фильтры, сортировка (полный Stat API)

  • metrika_bytime — метрики по времени (день/неделя/месяц/час)

  • metrika_traffic_sources — визиты/пользователи/отказы по источникам трафика

  • metrika_geo — визиты по стране/региону/городу

  • metrika_devices — визиты по устройству/ОС/браузеру

  • metrika_goals — список целей (конверсий)

  • metrika_counters — доступные счётчики

  • metrika_landing_behavior — поведение на посадочных + достижения целей

  • metrika_search_phrases — поисковые фразы (органика)

  • metrika_top_landings — топ органических посадочных

aparser — мост к self-hosted A-Parser

  • aparser_ping — проверка связи с инстансом и пароля API

  • aparser_status — вердикт готовности: версия, установленные парсеры, очередь, живые прокси

  • aparser_proxies — живые прокси инстанса (можно по пачкам proxy checkers; креды прокси не выводятся)

  • aparser_parsers — парсеры, установленные на инстансе

  • aparser_parser_fields — поля результата, которые умеет вернуть парсер (flat + arrays)

  • aparser_get_preset — опции config-пресета парсера (чувствительные значения маскируются)

  • aparser_serp_google — органика Google (парсер SE::Google); прокси по умолчанию + preflight живых прокси

  • aparser_serp_yandex — органика Яндекса (SE::Yandex); регион через lr

  • aparser_suggest — поисковые подсказки Google/Яндекса

  • aparser_request — универсальный синхронный запрос к любому парсеру (oneRequest)

  • aparser_bulk_request — пакетный запрос: один парсер, много запросов в N потоков (bulkRequest)

Нужен свой запущенный инстанс A-Parser (лицензия + сервер): мост им управляет, но не хостит и не проксирует его. Прокси и прокси-чекеры (пачки) настраиваются один раз в GUI A-Parser — мост их читает, проверяет (preflight) и выбирает (checkers), но не создаёт. v1 синхронный и read-only: очередь задач и большие асинхронные выгрузки не подключены.

Related MCP server: gsc-mcp-connector

Быстрый старт

Вариант 1 — в один клик для Claude Desktop (.mcpb)

Самый простой способ, ничего ставить руками не нужно: скачай нужный .mcpb со страницы релиза и открой двойным кликом — Claude Desktop поставит сервер сам и спросит ключи в диалоге установки.

  • Серверы с API-ключом (xmlstock, xmlriver, wordstat, aparser) — ключи вводятся прямо в установщике.

  • Серверы на OAuth (gsc, ga4, ywm, metrika) ничего не спрашивают: авторизация проходит в чате (<server>_oauth_start<server>_oauth_finish).

Бандлы самодостаточны (~0.2 МБ, зависимости внутри), Node.js 20+ нужен только для варианта с npx. Собрать самому: pnpm build:mcpb.

Вариант 2 — плагин для Claude Code (маркетплейс)

Аналог .mcpb, но для Claude Code: сервер, ключи и подсказки ставятся одной командой, ключи спрашиваются диалогом, секреты уходят в системное хранилище, а не в открытый файл.

claude plugin marketplace add antohins/seo-tools-mcp

Дальше — только те источники, которые нужны; каждый плагин тянет ровно один сервер:

claude plugin install xmlstock@seo-tools-mcp
claude plugin install gsc@seo-tools-mcp
claude plugin install ga4@seo-tools-mcp

Доступны xmlstock, xmlriver, wordstat, gsc, ga4, ywm, metrika, aparser — и seo-tools, который ставит все восемь сразу. Бандл удобен, но это ~100 инструментов в каждой сессии: если работаешь только с Вебмастером и Метрикой, ставь два плагина, а не бандл.

Ключи можно ввести сразу (--config KEY=VALUE) или потом через /plugin configure <плагин>@seo-tools-mcp:

claude plugin install xmlstock@seo-tools-mcp --config XMLSTOCK_USER=12345 --config XMLSTOCK_KEY=...

Поля, помеченные как секретные (API-ключи, OAuth-секреты), Claude Code кладёт в системное хранилище; в settings.json они не попадают. Плагины на OAuth (gsc, ga4, ywm, metrika) при установке спрашивают только client_id/secret — сам вход проходит в чате через <сервер>_oauth_start<сервер>_oauth_finish.

Вместе с сервером плагин приносит навыки — процедурные инструкции по своему источнику: как не сжечь баланс на снятии позиций, почему freq_broad завышает трафик в разы, отчего GA4 молча отдаёт нули, чем усреднённая позиция GSC отличается от снятой из выдачи. В контексте они всегда занимают ~110 токенов на навык и разворачиваются, только когда действительно нужны.

Вариант 3 — через npx (без клонирования)

Каждый сервер — самодостаточный npm-пакет seo-tools-mcp-<сервер>; ставится одной командой:

claude mcp add xmlstock --scope user -- npx -y seo-tools-mcp-xmlstock
claude mcp add xmlriver --scope user -- npx -y seo-tools-mcp-xmlriver
claude mcp add wordstat --scope user -- npx -y seo-tools-mcp-wordstat
claude mcp add gsc      --scope user -- npx -y seo-tools-mcp-gsc
claude mcp add ga4      --scope user -- npx -y seo-tools-mcp-ga4
claude mcp add ywm      --scope user -- npx -y seo-tools-mcp-ywm
claude mcp add metrika  --scope user -- npx -y seo-tools-mcp-metrika
claude mcp add aparser  --scope user -- npx -y seo-tools-mcp-aparser

Нужен только один сервер?

Серверы не связаны между собой: возьмите один пакет и игнорируйте остальные. Каждый самодостаточен — общий код @seo-tools/shared вшит в сборку, так что лишних зависимостей и «хвоста» монорепы не тянется. Достаточно установить нужный пакет с npm — там уже всё из коробки (npx -y скачает и запустит его сам):

Пакет (npm)

Сервер

seo-tools-mcp-xmlstock

SERP Google/Яндекс + Wordstat

seo-tools-mcp-xmlriver

SERP Google/Яндекс + проверка индексации

seo-tools-mcp-wordstat

частотности Яндекса (Yandex Cloud)

seo-tools-mcp-gsc

Google Search Console

seo-tools-mcp-ga4

Google Analytics 4

seo-tools-mcp-ywm

Яндекс.Вебмастер

seo-tools-mcp-metrika

Яндекс.Метрика

seo-tools-mcp-aparser

мост к self-hosted A-Parser

# добавить один сервер в Claude Code
claude mcp add xmlstock --scope user -- npx -y seo-tools-mcp-xmlstock

# или запустить напрямую (ключи через env)
XMLSTOCK_USER=... XMLSTOCK_KEY=... npx -y seo-tools-mcp-xmlstock

В любом MCP-клиенте (Claude Desktop, Cursor…) — прописывается один блок в mcpServers:

{
  "mcpServers": {
    "xmlstock": {
      "command": "npx",
      "args": ["-y", "seo-tools-mcp-xmlstock"],
      "env": { "XMLSTOCK_USER": "...", "XMLSTOCK_KEY": "..." }
    }
  }
}

Прямая установка одного пакета по GitHub-ссылке (npm i github:antohins/seo-tools-mcp) не поддерживается: это pnpm-монорепа, отдельный подпакет так не ставится. Для установки из исходников — вариант Б ниже (клонировать + собрать). Готовые пакеты живут на npm.

Вариант 4 — из исходников

git clone https://github.com/antohins/seo-tools-mcp.git && cd seo-tools-mcp
pnpm install && pnpm build
ROOT=$(pwd)
for s in xmlstock xmlriver wordstat gsc ga4 ywm metrika aparser; do
  claude mcp add "$s" --scope user -- node "$ROOT/servers/$s/dist/index.js"
done

Дальше (любой вариант) — прямо в диалоге Claude Code: «настрой доступ к xmlstock» → агент вызовет xmlstock_auth_status, подскажет, какие ключи нужны и где их взять, примет их через xmlstock_set_credentials и сохранит. После этого спрашивайте данные обычным языком: «сними топ-10 Яндекса по запросу X», «частотность фраз …», «клики/показы из GSC за месяц». Ключи и OAuth настраиваются один раз (см. Получение доступов).

Интерактивная авторизация (в любой сессии)

У каждого сервера есть auth-инструменты — ключи можно выдавать прямо в диалоге, без правки файлов и перезапуска:

  • <server>_auth_status — вызывается в начале работы: показывает, какие ключи заданы (маскированно), каких не хватает и как их получить (шаги регистрации).

  • <server>_set_credentials — сохраняет переданные значения в ~/.config/seo-tools-mcp/.env (права 600) и применяет сразу.

  • gsc_save_sa_json — принимает содержимое JSON-ключа сервис-аккаунта, кладёт его в конфиг-директорию и возвращает email, который нужно добавить в GSC.

  • ywm_oauth_start / metrika_oauth_start → ссылка авторизации Яндекса; пользователь открывает, разрешает, копирует код → *_oauth_finish обменивает код на access+refresh токены. Дальше токен обновляется автоматически при протухании (code flow, не implicit).

Типовой сценарий новой сессии: «настрой доступ к xmlstock» → агент вызывает xmlstock_auth_status → просит недостающие ключи → xmlstock_set_credentials → работает.

⚠ Ключи, переданные через чат, проходят через контекст модели. Для максимальной гигиены можно по-прежнему вписать их в ~/.config/seo-tools-mcp/.env руками — серверы подхватят файл сами.

Мультиаккаунт

Клиентские сайты раскиданы по разным аккаунтам Google/Яндекса — поддерживаются именованные профили:

  • Каждый рабочий инструмент принимает опциональный параметр account («clientX», «agency»...). Без него используется основной профиль — обратная совместимость полная.

  • Ключи профиля хранятся в том же конфиге с суффиксом: GSC_REFRESH_TOKEN__clientX, YANDEX_OAUTH_TOKEN__clientX, XMLSTOCK_KEY__clientX

  • Добавление профиля: gsc_oauth_start(account="clientX") → пользователь авторизуется под другим Google-аккаунтом → gsc_oauth_finish(account="clientX"). Аналогично ywm_oauth_start/finish(account=...) для Яндекса; API-ключи — <server>_set_credentials(account="clientX", ...).

  • OAuth-приложения общие: один Google-client и одно Яндекс-приложение обслуживают все профили (клиент создаётся один раз, авторизаций — сколько угодно). Per-account хранятся только токены; refresh обновляет токен своего профиля.

  • Резолв строгий: account="clientX" без настроенных ключей → ошибка со списком настроенных профилей (никаких тихих фолбэков в чужой аккаунт). Дефолты (GSC_SITE_URL__clientX, YWM_HOST_ID__clientX, METRIKA_COUNTER_ID__clientX) — тоже per-account.

  • <server>_auth_status показывает все профили и их ключи (маскированно).

  • Альтернатива для жёсткой изоляции: отдельный env-файл через SEO_TOOLS_MCP_ENV (при заданном пути домашний конфиг НЕ читается).

Установка

cd seo-tools-mcp
pnpm install
pnpm build

Секреты

Единый env-файл: ~/.config/seo-tools-mcp/.env (права 600). Все серверы читают его при старте, а *_set_credentials/*_oauth_finish пишут в него сами — ручная правка не обязательна. Шаблон — .env.example. Переменные из окружения процесса имеют приоритет над файлом. Альтернативный путь к файлу — SEO_TOOLS_MCP_ENV (так один хост может держать несколько независимых профилей: разные claude mcp add с разным SEO_TOOLS_MCP_ENV).

Регистрация в Claude Code

ROOT=/path/to/seo-tools-mcp
claude mcp add xmlstock --scope user -- node $ROOT/servers/xmlstock/dist/index.js
claude mcp add wordstat --scope user -- node $ROOT/servers/wordstat/dist/index.js
claude mcp add gsc      --scope user -- node $ROOT/servers/gsc/dist/index.js
claude mcp add ga4      --scope user -- node $ROOT/servers/ga4/dist/index.js
claude mcp add ywm      --scope user -- node $ROOT/servers/ywm/dist/index.js
claude mcp add metrika  --scope user -- node $ROOT/servers/metrika/dist/index.js

--scope user — доступно во всех сессиях/проектах. Для шаринга на команду — --scope project (создаст .mcp.json в репозитории; секреты подставлять только через ${VAR}).

Получение доступов (по сервису)

Всё из этого раздела продублировано в ответах <server>_auth_status — агент сам подскажет шаги. Ниже — для чтения человеком.

XMLStock (приоритет 1) — SERP Google + Яндекс

  1. Регистрация: https://xmlstock.com → личный кабинет, пополнить баланс (Google XML и Яндекс Live — от 12 ₽/1000 запросов).

  2. Взять ID пользователя и API-ключ → XMLSTOCK_USER, XMLSTOCK_KEY (или через xmlstock_set_credentials).

  3. Проверка: xmlstock_balance.

Нюансы (выяснено на живых ответах):

  • подсветки выдачи (text_bolds) — параметр hlword=1, тег <hlword> вложенным XML (парсится через stopNodes, соседние слова склеиваются во фразы); PAA и related searches — related=1 (PAA только у Google);

  • mobile-выдача не отдаёт hlword/PAA/related — мобильный слепок только позиции+сниппеты, подсветки снимать с desktop;

  • страницы с 0 у обоих движков; органики на странице бывает <10 — сервер сам добирает страницей (+1 платный запрос);

  • lr принимает id регионов Яндекса для обоих движков (XMLStock маппит на Google сам);

  • ошибки HTTP 200 + <error code>: 20–25/101/110/111/500 ретраятся, 55 — rate-limit с паузой, 15 = пустая выдача (деньги списаны), 31/42 — фатальные (авторизация);

  • Wordstat у XMLStock НЕТ — частотности через отдельный сервер (официальный API Вордстата Яндекса).

Wordstat (приоритет 1) — частотности Яндекса

Официальный Wordstat API v2 (в составе Yandex Cloud Search API) — бесплатный, без заявок и OAuth. Один раз в https://console.yandex.cloud:

  1. Создать каталог (folder) или взять существующий → его ID в WORDSTAT_FOLDER_ID.

  2. Создать сервисный аккаунт с ролью search-api.webSearch.user.

  3. Выпустить для него API-ключ с областью действия yc.search-api.executeWORDSTAT_API_KEY.

  4. Проверка: wordstat_frequency по любой фразе.

Нюансы: точная частотность = операторы "!слово !слово" (поддерживаются в topRequests/regions; в dynamics — только при period=daily); данные topRequests — за последние 30 дней; count приходит строками (парсится); квоты 10 rps / 100 запросов в час (429 ретраится, но для массового съёма закладывать троттлинг); associations максимум 20.

Google Search Console (приоритет 1)

Два пути; рекомендуемый — OAuth: токен наследует доступ твоего Google-аккаунта и видит все его свойства GSC разом (включая будущие), добавлять пользователя в каждое свойство не нужно.

Путь A — OAuth (один раз):

  1. https://console.cloud.google.com → проект → APIs & Services → Library → включить Google Search Console API.

  2. OAuth consent screen: тип External; себя — в Test users. (Для refresh-токена дольше 7 дней — нажать Publish app; предупреждение «unverified» при авторизации — норма для личного использования.)

  3. Credentials → Create credentials → OAuth client ID → Desktop app → взять client ID + secret.

  4. В чате: gsc_oauth_start (передать clientId+secret) → открыть ссылку → разрешить → браузер редиректнется на localhost:8585, код подхватится автоматически → gsc_oauth_finish.

  5. Проверка: gsc_list_sites — покажет все свойства аккаунта.

Путь B — сервис-аккаунт (для headless-кронов): IAM → Service Accounts → JSON-ключ → gsc_save_sa_json (или путь в GSC_SA_JSON) → добавить email аккаунта в каждое нужное свойство GSC (Настройки → Пользователи и права, «Полный»).

Если заданы оба — приоритет у OAuth.

Google Analytics 4 (приоритет 1)

Авторизация та же, что у GSC, и OAuth-приложение общее (GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET переиспользуются). Но scope у GA4 свой, поэтому нужна отдельная авторизация — один раз.

  1. В том же проекте console.cloud.google.com → APIs & Services → Library → включить Google Analytics Data API и Google Analytics Admin API.

  2. В чате: ga4_oauth_start (если client ID/secret уже сохранены для GSC — без аргументов) → открыть ссылку → разрешить → браузер редиректнется на localhost:8586 (порт отличается от GSC, чтобы серверы не конфликтовали), код подхватится автоматически → ga4_oauth_finish.

  3. Проверка: ga4_list_properties — покажет все свойства аккаунта и их propertyId.

  4. Удобно сохранить свойство по умолчанию: ga4_set_credentialsGA4_PROPERTY_ID (числовой id из п. 3), иначе передавать propertyId в каждом вызове.

Путь B — сервис-аккаунт: JSON-ключ → ga4_save_sa_json → добавить email аккаунта в свойство GA4 (Администратор → Управление доступом к ресурсу, роль «Просмотр»).

Яндекс OAuth (Вебмастер + Метрика — одно приложение, один токен)

  1. Один раз: https://oauth.yandex.ru/client/new → «Веб-сервисы», Redirect URI: https://oauth.yandex.ru/verification_code. Права (scope): Яндекс.Вебмастер — «Получение информации о сайтах» (webmaster:hostinfo) + «Управление сайтами» (webmaster:verify); Яндекс.Метрика — «Получение статистики» (metrika:read). Взять ClientID и Client secret.

  2. Дальше — интерактивно в чате: ywm_oauth_start (передать ClientID + secret, сохранятся) → открыть ссылку под аккаунтом-владельцем сайта/счётчика → скопировать код → ywm_oauth_finish. Получатся access+refresh токены, общие для ywm и metrika; обновляются автоматически.

  3. Дефолты: YWM_HOST_ID (список — ywm_hosts), METRIKA_COUNTER_ID (список — metrika_counters) — задать через *_set_credentials, либо передавать в каждом вызове.

  4. Ручная альтернатива: получить токен implicit-flow (response_type=token) и сохранить в YANDEX_OAUTH_TOKEN — но без refresh он протухнет (Вебмастер ~6 мес, Метрика ~1 год).

Ограничения API Яндекса (не баги серверов): фильтр по URL в Вебмастере есть только в query-analytics (данные ~2 недели); эндпоинта «рекомендованные запросы» в API v4 нет — ywm_recommended_queries аппроксимирует через спрос (DEMAND) + недобор кликов; поисковые фразы в Метрике в основном «Не определено» (шифрование).

A-Parser (self-hosted) — SERP и сотни парсеров через свою коробку

  1. Свой запущенный инстанс A-Parser (лицензия + сервер) — мост им управляет, но не хостит и не проксирует его.

  2. В A-Parser: Settings → API — включить API-сервер, запомнить порт (обычно 9091) и пароль.

  3. APARSER_URL = http://<IP-инстанса>:<порт>/API (обязательно с путём /API), APARSER_PASSWORD = пароль оттуда же → aparser_set_credentials.

  4. Проверка: aparser_ping, затем aparser_status (готовность инстанса + живые прокси).

Нюансы: прокси и прокси-чекеры (пачки) настраиваются один раз в GUI — без живых прокси Google/Яндекс быстро банят, поэтому serp/suggest-инструменты делают preflight и предупреждают (use_proxy=false — на свой риск); пресеты и пачки по умолчанию задаются env (APARSER_GOOGLE_PRESET, APARSER_YANDEX_PRESET, APARSER_PROXY_CHECKERS, APARSER_USE_PROXY); v1 синхронный и read-only — очередь задач и мутирующие методы API не подключены.

Формат дат и регионы

Даты — YYYY-MM-DD (МСК). Регионы: имя из встроенного списка частых регионов («Москва», «спб», «Казахстан»…) или числовой id региона Яндекса (213, 225…) — числовой id работает всегда. Несколько регионов через запятую поддерживает только сервер wordstat; SERP-инструменты xmlstock_*/xmlriver_* принимают ОДИН регион. Полный справочник id — инструмент wordstat_regions_tree.

Где и как использовать

Серверы — обычные stdio-процессы без привязки к машине. Четыре сценария:

1. Claude Code, локально

Зарегистрировать через claude mcp add --scope user (блок «Регистрация в Claude Code» выше) — доступно во всех проектах и сессиях.

2. Claude Code, другая машина

git clone https://github.com/antohins/seo-tools-mcp.git && cd seo-tools-mcp
pnpm install && pnpm build
# зарегистрировать серверы (блок «Регистрация в Claude Code» выше)
# ключи: скопировать ~/.config/seo-tools-mcp/.env со старой машины (chmod 600)
# ЛИБО выдать в диалоге через <server>_auth_status → <server>_set_credentials

3. Claude Desktop (локально)

В claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/):

{
  "mcpServers": {
    "xmlstock": { "command": "node", "args": ["/ABS/PATH/seo-tools-mcp/servers/xmlstock/dist/index.js"] },
    "wordstat": { "command": "node", "args": ["/ABS/PATH/seo-tools-mcp/servers/wordstat/dist/index.js"] }
  }
}

Ключи подхватятся из ~/.config/seo-tools-mcp/.env автоматически.

4. Удалённо: claude.ai / Claude Code с любого места

claude.ai (web/mobile) умеет только remote MCP (Streamable HTTP по публичному HTTPS). Наши stdio-серверы выносятся на VPS через мост supergateway:

# на сервере: клонировать/собрать как в сценарии 2, ключи в ~/.config/seo-tools-mcp/.env
npx -y supergateway --stateful --outputTransport streamableHttp --port 8801 \
  --stdio "node /opt/seo-tools-mcp/servers/xmlstock/dist/index.js"   # и так для каждого сервера, порты 8801–8805

Дальше nginx: TLS + proxy_pass на 127.0.0.1:880X под секретным путём (например /mcp-<длинный-случайный-токен>/xmlstock/) — supergateway слушать только на localhost. Подключение:

  • Claude Code: claude mcp add --transport http xmlstock https://host/<секретный-путь>/xmlstock/mcp

  • claude.ai: Settings → Connectors → Add custom connector → тот же URL.

⚠ Секретный путь — минимальный гейт (custom connectors claude.ai не передают произвольные заголовки авторизации). За эндпоинтом — все ключи сервисов, поэтому: только HTTPS, длинный токен в пути, отдельный access-лог.

Альтернатива для Claude Code без HTTP-моста — stdio через ssh:

claude mcp add xmlstock --scope user -- ssh root@SERVER node /opt/seo-tools-mcp/servers/xmlstock/dist/index.js

Разработка

pnpm build        # собрать все воркспейсы
pnpm typecheck    # только типы
pnpm test         # юнит-тесты (vitest, без сети)
pnpm test:live    # лайв-смоук по реальным API (нужны креды в конфиге; free-эндпоинты)
node servers/xmlstock/dist/index.js   # ручной запуск (stdio)

Юнит-тесты покрывают чистую логику: маскирование секретов, классификацию OAuth-ошибок, пагинацию Метрики/GSC (дедуп, truncated), фильтры, парсер SERP, регионы. Лайв-смоук поднимает каждый сервер и дёргает бесплатный инструмент (xmlstock_balance, xmlriver_balance, wordstat_frequency, gsc_list_sites, ywm_hosts, metrika_counters, aparser_ping) — проверка авторизации end-to-end.

Общий код (shared/): HTTP-клиент с ретраями на 429/5xx (3 попытки, экспоненциальный backoff, Retry-After), загрузчик env + персистентный конфиг, фабрика auth-инструментов, Яндекс-OAuth с авто-refresh, JSON-хелперы MCP, счётчик расхода платных вызовов. XMLStock дополнительно ретраит свои «временные» коды из тела XML, код 15 («ничего не найдено») трактуется как пустая выдача.

Сборка серверов — tsup: shared/ вбивается в единый dist/index.js каждого сервера (рантайм-зависимости остаются external), поэтому npm-пакет самодостаточен.

Публикация в npm (мейнтейнерам)

Каждый сервер публикуется как отдельный пакет seo-tools-mcp-<сервер>; shared/ приватный и в npm не уходит (вбит в серверы). Версии всех серверов держим синхронно.

npm login
pnpm -r build                 # shared (tsc) → серверы (tsup-бандл)
pnpm -r publish --access public   # публикует 8 серверов; private-пакеты (shared, корень) пропускаются

pnpm publish сам подставляет реальные версии вместо workspace:* и не даст опубликовать при грязном рабочем дереве.

Бамп версии — только через корневой package.json: правишь версию там и запускаешь pnpm version:sync, который разносит её по всем 42 местам (package.json и server.json каждого сервера, литерал в new McpServer({ version }), манифесты плагинов). pnpm -r exec npm version patch для этого НЕ годится: он обновит только пакеты серверов, остальное останется на старой версии, и pnpm version:check в CI упадёт. Проверить без записи — pnpm version:check.

Контрибьютинг

PR приветствуются — см. CONTRIBUTING.md. История изменений — CHANGELOG.md. Уязвимости — приватно через Security Advisories (детали — SECURITY.md).

Лицензия

MIT © antohins

Available Tools

11 tools
xmlstock_auth_statusXMLStock: auth statusA
Read-only

Статус авторизации xmlstock: какие ключи заданы (маскированно), каких не хватает, как их получить. ВЫЗЫВАТЬ ПЕРВЫМ в начале работы с xmlstock. Если чего-то нет — запросить значения у пользователя и сохранить через xmlstock_set_credentials.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals a safe, non-mutating operation, and the description adds useful behavioral context by specifying that keys are shown masked, missing keys are identified, and instructions for obtaining them are provided. No contradictions are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and every phrase is useful: it states the purpose, the masked output, what to do when missing values are found, and names the companion tool. The front-loaded call-first instruction is prominent without excess wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only status tool with no output schema, the description covers what it does, when to call it, what gaps it reveals, and how to remediate them. No critical information is missing for an agent to correctly select and invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the description correctly focuses on the output and usage rather than input semantics. The baseline for a zero-parameter tool is 4, and the description satisfies this by explaining what the tool reports.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as reporting XMLStock authorization status: which keys are set (masked), which are missing, and how to obtain them. This clearly distinguishes it from sibling tools like xmlstock_set_credentials, which performs the credential-saving action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs the agent to call this tool first at the start of working with XMLStock, and prescribes the next step if credentials are missing: request values from the user and save them via xmlstock_set_credentials. This is direct, actionable usage guidance with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_balanceXMLStock: balanceA
Read-only

Баланс и дневной расход аккаунта XMLStock (бесплатный сервисный вызов). Заодно проверка ключей.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only; the description adds useful behavioral context: the call is free, it also validates keys, and it covers daily expense. This goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences deliver the core purpose and a bonus behavior with no filler. The main output ('balance and daily expense') is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter, read-only tool with no output schema, the description adequately states the return scope and side purpose. A note about the exact response format or fields would improve completeness, but the tool is simple enough that nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'account', is fully documented in the input schema, including the multi-account hint and empty-meaning-main behavior. The description adds no parameter-specific detail, but with 100% schema coverage, the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (XMLStock account), the data returned (balance and daily expense), and a distinguishing side purpose (key verification). It is immediately separable from sibling search and auth tools by its core function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: when an account balance, daily expense, or key validity is needed. However, it does not explicitly differentiate it from xmlstock_auth_status, which likely overlaps with the 'key check' purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_imagesXMLStock: imagesA

Поиск по картинкам Google через XMLStock (ПЛАТНО за запрос). Возвращает { position, url (страница-источник), imageUrl (сама картинка), title }. truncated: true = выдача кончилась раньше запрошенного depth.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoСколько результатов собрать (пагинация, каждая страница — платный запрос)
queryYes
deviceNodesktop
regionNo«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на GoogleМосква
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной
safeSearchNoБезопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=offmoderate
searchDomainNoДоменная зона Google (ru/com/de...), по умолчанию ru

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral context beyond the annotations: calls are paid ('ПЛАТНО за запрос') and the `truncated: true` field indicates when results end earlier than the requested depth. It does not contradict the `readOnlyHint:false` annotation because the paid nature of the call can be considered a consequential side effect even though the operation searches.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact sentences: the first states the purpose and cost, the second describes the return shape and truncation flag. Every clause earns its place, and key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly documents the return fields and truncation behavior. The schema covers defaults, enums, and cost implications per page. The definition is slightly incomplete around authentication prerequisites and error behavior, but the account parameter hints at *_auth_status, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents most parameters well, with 71% coverage including depth, region, safeSearch, searchDomain, and account. The free-text description adds little parameter-level meaning beyond what the schema provides, and parameters like query and device remain only implicitly understood.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Поиск по картинкам Google через XMLStock' (Google image search via XMLStock). This clearly distinguishes the tool from siblings like xmlstock_news, xmlstock_video, and xmlstock_serp without needing to inspect their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use case through the phrase 'поиск по картинкам' but does not explicitly state when to choose it over alternatives or when not to use it. The paid-per-request warning is useful context, but no exclusions or sibling comparisons are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_newsXMLStock: newsA

Поиск по новостям Google через XMLStock (ПЛАТНО за запрос). Возвращает { position, url, title, source (издание), date (часто относительная), snippet }. truncated: true = выдача кончилась раньше запрошенного depth.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoСколько результатов собрать (пагинация, каждая страница — платный запрос)
queryYes
deviceNodesktop
regionNo«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на GoogleМосква
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной
safeSearchNoБезопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=offmoderate
searchDomainNoДоменная зона Google (ru/com/de...), по умолчанию ru

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description warns that every request is paid, enumerates the exact return shape, and explains the meaning of 'truncated: true'. These are operationally important behavioral details that annotations alone do not provide. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, information-dense sentences: the first establishes purpose, cost, and return fields; the second defines the truncation flag. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid news-search tool with no output schema, the description is largely complete: it states cost, output format, and truncation behavior, while the schema documents most parameters. It does not explicitly state authentication prerequisites, but the account parameter's reference to '*_auth_status' and the sibling auth tools supply that context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description itself adds no parameter-level explanation, but the input schema already covers 71% of parameters with meaningful descriptions (depth, region, safeSearch, searchDomain, account). The coverage gap for query and device is minor and largely inferable, so the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Поиск по новостям Google' / search Google News) and clearly identifies XMLStock as the execution channel. This distinguishes it from sibling tools like xmlstock_serp, xmlstock_images, and xmlstock_video by targeting the news vertical.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied by 'news' — an agent can infer this tool is for Google News results — but there is no explicit guidance about when to prefer it over xmlstock_serp or when it should not be used. The cost warning and return-format hints provide supporting context but not decision rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_serpXMLStock: serpA

Слепок выдачи Google/Yandex через XMLStock (ПЛАТНО за запрос). Возвращает { found, truncated (true = выдача кончилась раньше запрошенного depth), count, results: [{ position, url, title, snippet, text_bolds (подсветки hlword) }], serp_features: { featured_snippet, paa (только Google), related, sitelinks_top1, packs } }. Пустая выдача (код 15) ТАРИФИЦИРУЕТСЯ и помечается { results: [], empty: true, note }. depth>10 добирается пагинацией (каждая страница — отдельный платный запрос; у yandex_xml — до 100/страница). region: ОДИН регион (название или числовой id Яндекса) — работает для ВСЕХ движков. ОГРАНИЧЕНИЕ ИСТОЧНИКА: device=mobile отдаёт только позиции и сниппеты — без hlword/PAA/related; подсветки и SERP-фичи снимать с desktop. engine=yandex_xml — ОФИЦИАЛЬНЫЙ Яндекс XML (легальный API, тариф дороже: от 24 ₽/1000): groupby до 100 работает — до 100 результатов за ОДИН платный запрос (depth до 1000), hlword-подсветки на любых устройствах, статистика «найдено»: found (по запросу), found_docs (документов), found_human (строкой); в results доп. поля id/modtime/saved_copy_url/is_local. Отличие от yandex (live): SERP-фичей/packs нет — чистая органика; device/searchDomain/lang/l10n/period/exactQuery/includeAds/includeSimilar не применимы; safeSearch маппится в filter (strict/moderate/none).

ParametersJSON Schema
NameRequiredDescriptionDefault
l10nNoYandex: язык уведомлений
langNoGoogle hl (язык интерфейса), Yandex lang
depthNoСколько органических позиций собрать: google/yandex — до 30 (10/страница), yandex_xml — до 1000 (100/страница)
queryYes
deviceNodesktop
engineNogoogle
periodNoGoogle tbs (qdr:m, qdr:y...) / Yandex within (77=сутки, 1=2 недели, 2=месяц)
regionNo«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на GoogleМосква
sortbyNoYandex/yandex_xml: сортировка выдачи (rlv / tm — по дате)relevance
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной
exactQueryNoНе исправлять запрос (nfpr=1 / noreask=1)
includeAdsNoДобавить рекламные блоки (ads=1): реклама включается в ответ API и отражается строками в packs, отдельной секции нет
safeSearchNoБезопасный поиск: Google — moderate = дефолт Google (размытие, параметр в API НЕ шлётся), strict = фильтр (safe=on), off = выкл (safe=off); Yandex и yandex_xml — семейный фильтр filter (moderate/strict/none)moderate
maxpassagesNoYandex/yandex_xml: сколько пассажей-сниппетов на документ (1–5)
searchDomainNoДоменная зона: google — ru/com/de..., yandex — ru/by/kz/com.tr (по умолчанию ru)
includeSimilarNoGoogle: показать скрытые похожие результаты (filter=0)
excludeAggregatorsNoИсключить домены-агрегаторы из органики (список — XMLSTOCK_EXCLUDE_DOMAINS, дефолт: avito/cian/domclick/yandex/m2/youla)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behaviors beyond annotations: every request is billed, pagination creates additional paid requests, empty results still cost money, mobile responses omit hlword/PAA/related, and yandex_xml returns different stats and fields. No statement contradicts the annotations; readOnlyHint=false is consistent with paid side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with purpose, billing, and response shape. Some paid-request warnings are repeated, and the single-block format could benefit from headings or bullet separation, but every section serves a functional purpose and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 17 parameters, the description carries the full burden of explaining return values and constraints. It covers found/truncated/count/results/serp_features, empty-result behavior, engine-specific output fields, pagination, and source limitations. This is complete enough for reliable invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is high at 82%, the description adds substantial parameter-level meaning: depth pagination behavior, region working across all engines, mobile-specific restrictions, non-applicable parameters for yandex_xml, and safeSearch-to-filter mapping. This goes well beyond what the JSON schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a snapshot of Google/Yandex SERP via XMLStock and immediately distinguishes it from image/news/video siblings by describing organic results and serp_features. It also explicitly names engine variants and their semantic differences. This is a specific verb-resource pairing that an agent can act on without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong selection guidance between engine values, especially yandex_xml versus yandex (live), listing non-applicable parameters and safeSearch mapping. It does not explicitly tell the agent when to choose this tool over sibling tools like xmlstock_images or xmlstock_news, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_set_credentialsXMLStock: set credentialsA

Сохранить ключи xmlstock в /root/.config/seo-tools-mcp/.env (права 600) и применить сразу, без перезапуска сервера. Передавать только обновляемые поля. account — сохранить в именованный профиль (мультиаккаунт). Значения даёт пользователь; в ответе они маскируются.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoИмя аккаунта-профиля (мультиаккаунт): ключи сохранятся с суффиксом __<account>
XMLSTOCK_KEYNoAPI-ключ XMLStock (личный кабинет xmlstock.com)
XMLSTOCK_USERNoID пользователя XMLStock (личный кабинет xmlstock.com)
XMLSTOCK_EXCLUDE_DOMAINSNoДомены-агрегаторы для excludeAggregators, через запятую

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint=false annotation by disclosing the exact file path, the 600 permission mode, live application without restart, multi-account suffix behavior, and response masking. This gives an agent a precise model of the side effects without needing to inspect the environment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences carry the core action, side effects, usage rule, and response behavior with no filler. Critical information is front-loaded at the beginning, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an optional-parameter mutation tool with no output schema, the description covers persistence location, permissions, activation behavior, updates-only guidance, multi-account handling, and output masking. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are already documented. The description adds value by clarifying update semantics ('only fields to update'), the account profile suffix behavior, and that user-supplied values are masked in responses, which the schema does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Сохранить ключи xmlstock в /root/.config/seo-tools-mcp/.env (права 600)' and adds the immediate-apply behavior. It clearly identifies this as the credentials-setting tool among siblings that are all data/query tools, so there is no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance: 'Передавать только обновляемые поля' and explains the account parameter's role in multi-account profiles. It does not explicitly say when to prefer this over alternatives, but no sibling performs credential writing, so the usage context is already unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_videoXMLStock: videoA

Поиск по видео Google через XMLStock (ПЛАТНО за запрос). Возвращает { position, url, title, thumbnail, host (YouTube...), channel, duration, snippet }. truncated: true = выдача кончилась раньше запрошенного depth.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoСколько результатов собрать (пагинация, каждая страница — платный запрос)
queryYes
deviceNodesktop
regionNo«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на GoogleМосква
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной
safeSearchNoБезопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=offmoderate
searchDomainNoДоменная зона Google (ru/com/de...), по умолчанию ru

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the sparse annotations, the description discloses the paid-per-request nature, explains the truncated flag's meaning, and specifies the returned object shape. This is valuable behavioral context that annotations cannot convey, and nothing in the description contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences front-load purpose and cost, list only relevant output fields, and define an important edge case. Every sentence carries useful information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by listing the return fields and explaining truncated behavior, while the schema covers parameters well. It does not explicitly state credential prerequisites, but the sibling *_auth_status/set_credentials tools and the paid-request warning provide enough operational context for an agent to proceed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71%, and the description does not add substantial parameter-level meaning beyond mentioning 'requested depth' indirectly through truncated. Most parameter semantics (depth pagination, region mapping, safeSearch behavior) are already well documented in the input schema, so the description adds little beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific action and resource: 'Поиск по видео Google через XMLStock', clearly distinguishing this video-search tool from siblings like xmlstock_serp, xmlstock_images, and xmlstock_news. It also enumerates the exact return fields, making the tool's function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly signals a critical cost condition ('ПЛАТНО за запрос') and explains truncated=true, helping an agent interpret when results are incomplete. It does not explicitly name sibling alternatives or provide when-to-use vs. when-not-to-use guidance, but the video-specific focus supplies enough contextual direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_wordstatXMLStock: wordstatA

Частотность и топ запросов Яндекс Wordstat через XMLStock (ПЛАТНО за запрос, ~19₽/1K). Возвращает { totalCount, results: [{ phrase, count }] (топ по фразе), associations: [{ phrase, count }] (похожие) }. Операторы Wordstat в query: "…" (точная), ! (форма слова), + (стоп-слово), - (минус), [ ] (порядок), | (или).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
regionNoРегион: «Москва»/«спб»/213 — id/название Яндекса; без него — вся Россия
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are present (readOnlyHint: false, openWorldHint: true), so the description's burden is lower. The description adds key behavioral context: it is a paid service (~19₽/1K) and provides the exact return shape, including both 'results' (top phrases) and 'associations' (similar phrases). This goes beyond what annotations convey. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet information-dense. It front-loads the cost warning, then the return structure, then the operator syntax — all in three sentences. No filler; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid tool with no output schema, the description covers the essential behavioral details: cost, return format, and query language. It does not mention error handling, rate limits, or authentication requirements, but the sibling *_auth_status and set_credentials tools cover auth. Given the openWorldHint and annotations, the description is quite complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the query parameter lacks a description in the schema. The description compensates by explaining Wordstat operators ("...", !, +, -, [ ], |) in the query. Region and account are already described in the schema, so this is a strong contribution. The description makes the query parameter's syntax clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: returning Yandex Wordstat frequency and top queries via XMLStock. It specifies the return structure ({ totalCount, results, associations }) and even lists supported Wordstat operators. This distinguishes it from sibling tools like xmlstock_wordstat_dynamics (trends over time) and xmlstock_wordstat_regions (geographic data).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use this tool — when you need wordstat frequency and top queries — and includes a cost warning ('ПЛАТНО за запрос'). However, it does not explicitly exclude alternatives like dynamics or regions, nor does it mention when NOT to use it (e.g., for trends use wordstat_dynamics). The 'when' is implied but alternatives are not named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_wordstat_dynamicsXMLStock: wordstat dynamicsA

Динамика частотности фразы по времени (Яндекс Wordstat через XMLStock, ПЛАТНО за запрос). period: day/week/month. from/to — YYYY-MM-DD (для month период автоматически растягивается на целые месяцы). Возвращает [{ date, count, share }].

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesКонец периода, YYYY-MM-DD
fromYesНачало периода, YYYY-MM-DD
queryYes
periodNomonth
regionNoРегион: «Москва»/«спб»/213 — id/название Яндекса; без него — вся Россия
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable context beyond annotations: it states the operation is paid per request, explains that month periods automatically stretch to whole months, and describes the return shape. It does not mention auth prerequisites, rate limits, or error behavior, but the annotations already provide a partial safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences cover purpose, cost, period options, date constraints, automatic month stretching, and the return format without filler. The information is logically ordered and every clause contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid time-series query with no output schema, the description provides sufficient operational detail: period values, date format, and the returned object shape. It omits explicit instructions about credentials and the meaning of share, but those are partially covered by the account parameter referencing *_auth_status.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description adds some meaning for period behavior and output format. However, it largely repeats the date format and enum values already present in the schema, leaves the query parameter implicit, and does not explain count/share semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose: it returns wordstat frequency dynamics over time, distinguishing it from a static wordstat lookup. It names the resource and data source explicitly, though it does not reference sibling tools by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains parameter mechanics, such as period values and date ranges, but does not say when to use this tool instead of xmlstock_wordstat or other siblings. No alternatives or exclusions are mentioned, leaving the choice to the agent's inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_wordstat_regionsXMLStock: wordstat regionsA

Распределение спроса по регионам для фразы (Яндекс Wordstat через XMLStock, ПЛАТНО — дороже топа/динамики). Возвращает [{ regionId, name, count, share, affinityIndex }]; имена регионов подставляются из дерева (кэш 24ч). ВНИМАНИЕ: при холодном кэше дерева (первый вызов за 24ч) делается дополнительный ПЛАТНЫЙ запрос regionsTree.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide little behavioral detail. The description adds critical non-obvious information: the call is PAID and more expensive than top/dynamics, and a cold 24h cache triggers an additional PAID regionsTree request. This is exactly the kind of side-effect disclosure an agent needs, and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: core purpose first, return shape second, and a clearly labeled warning about the additional paid request last. Every sentence contributes operational value with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description appropriately includes the return record shape. It also covers caching and cost behavior, which are essential for safe invocation. The main gaps are the lack of an explicit authentication prerequisite and no edge-case details such as empty results, but the schema and sibling tools partially cover these.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only says 'query' has minLength 1, so the description adds the key meaning: query is the phrase whose regional demand is returned. The account parameter is already described in the schema. Together they cover both parameters reasonably well, though query syntax and formatting are not detailed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb-resource pair: returns regional demand distribution for a phrase via Yandex Wordstat/XMLStock. The exact returned record shape is listed, and the region focus clearly distinguishes this from siblings like wordstat_dynamics or wordstat_regions_tree.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'для фразы' implies the tool is used for per-phrase regional breakdowns, and the cost warning is useful context. However, it does not explicitly state when to choose this over xmlstock_wordstat or wordstat_regions_tree, nor does it mention alternatives by name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

xmlstock_wordstat_regions_treeXMLStock: wordstat regions treeA

Дерево регионов Яндекс Wordstat через XMLStock (id + имя + путь) — id для параметра region в других запросах. ПЛАТНО за запрос.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoАккаунт-профиль (мультиаккаунт, см. *_auth_status); пусто = основной

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description adds the important behavioral fact that the request is paid ('ПЛАТНО за запрос') and specifies the returned payload (id + name + path). It does not describe authentication requirements or side effects, but the annotations already cover the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence with the key facts front-loaded: what the tree is, what fields it returns, why it matters, and that it is paid. Every clause contributes information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple parameterless-by-default retrieval tool, the description covers output fields, the region-ID use case, and cost. It does not explicitly state that credentials or authentication are required, but the sibling auth/set_credentials tools and the XMLStock context make this an acceptable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers the only parameter (account) fully with its own description, so the baseline applies. The tool description adds no detail about the account field, but none is needed because the schema already explains the multi-account behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource: the Yandex Wordstat regions tree returned through XMLStock, with id, name, and path fields. It also states its purpose as supplying region IDs for other requests. However, it does not explicitly contrast this tool with the sibling xmlstock_wordstat_regions, so differentiation is left to the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'id для параметра region в других запросах' gives a clear use case: fetch the tree to obtain region IDs for subsequent queries. It does not state when not to use it or name alternatives such as xmlstock_wordstat_regions, so the guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev1.5.1
    • Changedxmlstock_serp6 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Сколько органических позиций собрать"New value: +"Сколько органических позиций собрать: google/yandex — до 30 (10/страница), yandex_xml — до 1000 (100/страница)"
      • changedInput schema / properties / depth / maximum
        Previous value: -30New value: +1000
      • changedInput schema / properties / engine / enum
        Previous value: -[
        -  "google",
        -  "yandex"
        -]New value: +[
        +  "google",
        +  "yandex",
        +  "yandex_xml"
        +]
      • changedInput schema / properties / maxpassages / description
        Previous value: -"Yandex: сколько пассажей-сниппетов на документ (1–5)"New value: +"Yandex/yandex_xml: сколько пассажей-сниппетов на документ (1–5)"
      • changedInput schema / properties / safeSearch / description
        Previous value: -"Безопасный поиск: Google — moderate = дефолт Google (размытие, параметр в API НЕ шлётся), strict = фильтр (safe=on), off = выкл (safe=off); Yandex filter (moderate/strict/none)"New value: +"Безопасный поиск: Google — moderate = дефолт Google (размытие, параметр в API НЕ шлётся), strict = фильтр (safe=on), off = выкл (safe=off); Yandex и yandex_xml — семейный фильтр filter (moderate/strict/none)"
      • changedInput schema / properties / sortby / description
        Previous value: -"Yandex: сортировка выдачи (rlv / tm — по дате)"New value: +"Yandex/yandex_xml: сортировка выдачи (rlv / tm — по дате)"
  2. 5 tool updatesv1.4.0
    • Changedxmlstock_images3 fields changed
      • changedInput schema / properties / region / description
        Previous value: -"«Москва»/«Россия»/213/225 — id Яндекса, XMLStock маппит на Google"New value: +"«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на Google"
      • changedInput schema / properties / safeSearch / description
        Previous value: -"Безопасный поиск (safe: размытие/фильтр/выкл)"New value: +"Безопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=off"
      • addedInput schema / properties / searchDomain / pattern
        Added value: +"^[a-z]{2,3}(\\.[a-z]{2,3})?$"
    • Changedxmlstock_news3 fields changed
      • changedInput schema / properties / region / description
        Previous value: -"«Москва»/«Россия»/213/225 — id Яндекса, XMLStock маппит на Google"New value: +"«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на Google"
      • changedInput schema / properties / safeSearch / description
        Previous value: -"Безопасный поиск (safe: размытие/фильтр/выкл)"New value: +"Безопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=off"
      • addedInput schema / properties / searchDomain / pattern
        Added value: +"^[a-z]{2,3}(\\.[a-z]{2,3})?$"
    • Changedxmlstock_serp8 fields changed
      • changedInput schema / properties / includeAds / description
        Previous value: -"Добавить рекламные блоки (ads=1)"New value: +"Добавить рекламные блоки (ads=1): реклама включается в ответ API и отражается строками в packs, отдельной секции нет"
      • changedInput schema / properties / includeSimilar / description
        Previous value: -"Google: показать скрытые похожие результаты (filter=1)"New value: +"Google: показать скрытые похожие результаты (filter=0)"
      • changedInput schema / properties / l10n / description
        Previous value: -"Yandex: язык уведомлений (ru/uk/be/kk/tr/en)"New value: +"Yandex: язык уведомлений"
      • addedInput schema / properties / l10n / enum
        Added value: +[
        +  "ru",
        +  "uk",
        +  "be",
        +  "kk",
        +  "tr",
        +  "en"
        +]
      • addedInput schema / properties / lang / pattern
        Added value: +"^[a-z]{2}(-[a-zA-Z]{2,4})?$"
      • changedInput schema / properties / region / description
        Previous value: -"«Москва»/«Россия»/213/225 — id Яндекса, XMLStock маппит и на Google"New value: +"«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на Google"
      • changedInput schema / properties / safeSearch / description
        Previous value: -"Безопасный поиск: Google safe (moderate=размытие/strict=фильтр/off), Yandex filter (moderate/strict/none)"New value: +"Безопасный поиск: Google — moderate = дефолт Google (размытие, параметр в API НЕ шлётся), strict = фильтр (safe=on), off = выкл (safe=off); Yandex filter (moderate/strict/none)"
      • addedInput schema / properties / searchDomain / pattern
        Added value: +"^[a-z]{2,3}(\\.[a-z]{2,3})?$"
    • Changedxmlstock_video3 fields changed
      • changedInput schema / properties / region / description
        Previous value: -"«Москва»/«Россия»/213/225 — id Яндекса, XMLStock маппит на Google"New value: +"«Москва»/«Россия»/213/225 — ОДИН регион (название или id Яндекса), XMLStock маппит и на Google"
      • changedInput schema / properties / safeSearch / description
        Previous value: -"Безопасный поиск (safe: размытие/фильтр/выкл)"New value: +"Безопасный поиск: moderate = дефолт Google (размытие, в API НЕ шлётся), strict = safe=on, off = safe=off"
      • addedInput schema / properties / searchDomain / pattern
        Added value: +"^[a-z]{2,3}(\\.[a-z]{2,3})?$"
    • Changedxmlstock_wordstat_dynamics2 fields changed
      • addedInput schema / properties / from / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • addedInput schema / properties / to / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
  3. 4 tool updatesv1.3.0
    • Addedxmlstock_wordstat
    • Addedxmlstock_wordstat_dynamics
    • Addedxmlstock_wordstat_regions
    • Addedxmlstock_wordstat_regions_tree
  4. 7 tool updatesv1.2.0
    • First observedxmlstock_auth_status
    • First observedxmlstock_balance
    • First observedxmlstock_images
    • First observedxmlstock_news
    • First observedxmlstock_serp
    • First observedxmlstock_set_credentials
    • First observedxmlstock_video

TDQS

A4.1/5.0

Scored across 11 tools

Disambiguation4/5

Tools are generally distinct: search types, wordstat variants, and auth/balance are clearly separated. However, xmlstock_wordstat_regions and xmlstock_wordstat_regions_tree share a very similar prefix and could cause initial confusion, though their descriptions resolve the ambiguity.

Naming Consistency4/5

All tools share the xmlstock_ prefix and use snake_case, which is consistent. Some names are nouns (xmlstock_serp, xmlstock_images) while others use verbs (xmlstock_set_credentials), creating a minor stylistic deviation but no major inconsistency.

Tool Count5/5

11 tools is well within the ideal range and each tool covers a meaningful XMLStock feature: auth, credentials, balance, SERP, three vertical searches, and a complete Wordstat suite. No tool feels redundant or unnecessary.

Completeness5/5

The tool surface fully covers the XMLStock SEO API scope: setup and validation, balance monitoring, web/image/news/video search, and wordstat frequency, dynamics, regional distribution, and region tree. No critical workflow dead ends are apparent.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for querying Google Search Console data — search analytics, URL inspection, sitemap monitoring, and more — read-only tools for any MCP-compatible AI client.
    7
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Self-hosted MCP server that exposes Google Search Console tools (list sites, query analytics, inspect URL, list sitemaps) via natural language to AI assistants like ChatGPT and Claude.
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Local-first MCP server for Yandex Webmaster that exposes tools for SEO operations including search query analytics, sitemap management, indexing history, recrawl quota, and diagnostics.
    15
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Google Search Console for Claude, Cursor & any MCP client — one sign-in, 30 seconds, no Google Cloud project. Six read-only tools (search analytics incl. Google Discover, period comparison with computed deltas, batch URL inspection, sitemaps) plus five built-in SEO analyses as slash-commands. Tokens stay on your machine. MIT.
    6
    41 npm
    7
    MIT