The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Xmlriver MCP listing page.
xmlriver-mcpMCP server for XMLRiver — Google/Yandex SERP parsing and Yandex Wordstat keyword frequency data via XML API.
mcp-name: io.github.artgas1/xmlriver-mcp
Gives Claude / Cursor / Windsurf direct access to:
First MCP for XMLRiver — fills a gap for Russian SEO research and Yandex-aware analysis. Pay-as-you-go (~25 ₽ / 1000 requests on Basic tariff).
Claude queries wordstat_query and parses real frequency data from Yandex. Same flow works for google_search, yandex_search, indexing checks, and account ops.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Add to project .mcp.json:
Edit ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
| Tool | What it does |
|---|---|
google_search | Parse Google SERP for a query — country, language, device, page, date filter, extra blocks (ads, FAQ, knowledge graph, AI Overview) |
yandex_search | Parse Yandex SERP — region, language, device, page, date filter, extra blocks |
yandex_search_api_v2 | Yandex Search API v2 (official) via XMLRiver — cleaner structured output |
wordstat_query | Yandex Wordstat keyword frequency + similar queries, or demand dynamics by month/week/day |
search_suggestions | Search-box autocomplete from Google or Yandex, 1–50 phrases per call. Surfaces long-tail phrasings that carry no Wordstat frequency at all |
google_maps_search | Google Maps places around a coordinate (zoom + coords required). ⚠️ See caveat below |
check_url_indexed | Check if URL is indexed in Google or Yandex |
get_balance | Current XMLRiver balance in rubles |
get_tariff | Current XMLRiver tariff name (Basic / Pro / Mega / Giga) |
get_tariff_expire | Tariff expiration date (for prepay tariffs) |
get_cost | Cost per 1000 requests for a given engine (google / yandex / yaxml / wordstat) |
All tools are read-only (annotated with readOnlyHint: true). No destructive operations.
⚠️ google_maps_search is unverified against a live response. Every setab=maps request
answered code 500 while it was written (2026-08-04), including a deliberately invalid one that
should have returned code 108 — plain Google and Yandex searches worked in the same minutes, so
the mode appears unavailable service-side. The request shape and response parsing follow the
documentation and are covered by unit tests; both still need a live check.
Deliberately not wrapped: raw=page (returns the full HTML page — bypasses parsing and
returns megabytes into the model's context) and the deferred-response mode (delayed / req_id)
— an MCP call is synchronous, so a request id the caller must poll for has nowhere useful to go.
user (numeric ID) and key (40-char hex) from the dashboardXMLRIVER_USER and XMLRIVER_KEY env vars in your MCP client configSecurity note: XMLRiver API is HTTP-only (not HTTPS). The key is rotatable from the dashboard if compromised.
| Tariff | Setup | Google / Yandex / Wordstat | Yandex Search API v2 |
|---|---|---|---|
| Basic | Pay-as-you-go | 25 ₽ / 1k | 25 ₽ / 1k |
| Pro | 5000 ₽/mo | 20 ₽ / 1k | 24 ₽ / 1k |
| Mega | 15000 ₽/mo | 15 ₽ / 1k | 23 ₽ / 1k |
| Giga | 50000 ₽/mo | 12 ₽ / 1k | 22 ₽ / 1k |
Use get_balance and get_cost to monitor spend before bulk operations.
yandex_search(query="...", region=213) for own/competitor rankingwordstat_query(query="купить iphone", history_period="monthly") for demand validation + seasonalitygoogle_search(additional_blocks="faqsnippet,knowledge_graph,zeroposition") to see what owns the answer boxsearch_suggestions(phrases=[...]) with a prefix sweep (seed + each letter of the alphabet) pulls phrasings Wordstat never reportscheck_url_indexed(url="https://your-site.com/new-page") after publishingregion/country for Yandex/Google to see geographic variancePRs welcome. Open an issue first for substantial changes.