xmlriver-mcp-toolkit 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. xmlriver_mcp_toolkit-0.1.0/.gitignore +9 -0
  2. xmlriver_mcp_toolkit-0.1.0/CHANGELOG.md +7 -0
  3. xmlriver_mcp_toolkit-0.1.0/CONTRIBUTING.md +5 -0
  4. xmlriver_mcp_toolkit-0.1.0/LICENSE +21 -0
  5. xmlriver_mcp_toolkit-0.1.0/PKG-INFO +232 -0
  6. xmlriver_mcp_toolkit-0.1.0/README.md +216 -0
  7. xmlriver_mcp_toolkit-0.1.0/README.ru.md +3 -0
  8. xmlriver_mcp_toolkit-0.1.0/SECURITY.md +7 -0
  9. xmlriver_mcp_toolkit-0.1.0/examples/positions.yaml +22 -0
  10. xmlriver_mcp_toolkit-0.1.0/pyproject.toml +49 -0
  11. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/__init__.py +3 -0
  12. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/batch.py +190 -0
  13. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/cli.py +117 -0
  14. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/client.py +278 -0
  15. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/config.py +46 -0
  16. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/csv_io.py +103 -0
  17. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/errors.py +29 -0
  18. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/models.py +100 -0
  19. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/parsers.py +112 -0
  20. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/regions.py +70 -0
  21. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/server.py +112 -0
  22. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/services.py +100 -0
  23. xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/storage.py +172 -0
  24. xmlriver_mcp_toolkit-0.1.0/tests/stdio_fixture.py +34 -0
  25. xmlriver_mcp_toolkit-0.1.0/tests/test_cancellation.py +76 -0
  26. xmlriver_mcp_toolkit-0.1.0/tests/test_core.py +290 -0
  27. xmlriver_mcp_toolkit-0.1.0/tests/test_logging.py +18 -0
  28. xmlriver_mcp_toolkit-0.1.0/tests/test_stdio.py +45 -0
  29. xmlriver_mcp_toolkit-0.1.0/uv.lock +1633 -0
@@ -0,0 +1,9 @@
1
+ .venv/
2
+ __pycache__/
3
+ .pytest_cache/
4
+ .mypy_cache/
5
+ .ruff_cache/
6
+ dist/
7
+ *.egg-info/
8
+ xmlriver-data/
9
+ .env
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 — 2026-11-08
4
+
5
+ - Independent async client, four MCP tools and CLI.
6
+ - Shared rate limiting, strict arguments, safe errors and bounded retries.
7
+ - Unified pagination, versioned cache, atomic storage and CSV backups.
@@ -0,0 +1,5 @@
1
+ # Contributing
2
+
3
+ Use Python 3.11+, `uv sync --locked`, then `uv run pytest`, `uv run ruff check .`,
4
+ `uv run mypy`, `uv build`. Mock paid endpoints in tests. Never commit real keys,
5
+ customer data or request URLs containing authentication. See SECURITY.md.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mikhail Bulgakov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,232 @@
1
+ Metadata-Version: 2.4
2
+ Name: xmlriver-mcp-toolkit
3
+ Version: 0.1.0
4
+ Summary: Independent XMLRiver MCP server, async client and SEO collection CLI
5
+ Project-URL: Repository, https://github.com/dietbear13/xmlriver_mcp
6
+ Author: Mikhail Bulgakov
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Requires-Python: >=3.11
10
+ Requires-Dist: filelock<4,>=3.25
11
+ Requires-Dist: httpx<0.29,>=0.28.1
12
+ Requires-Dist: mcp<2,>=1.27
13
+ Requires-Dist: pydantic<3,>=2.13
14
+ Requires-Dist: pyyaml<7,>=6
15
+ Description-Content-Type: text/markdown
16
+
17
+ # XMLRiver MCP Toolkit
18
+
19
+ **Поисковая выдача Google и Яндекса, частотность запросов Wordstat и проверка позиций сайта — прямо в вашем AI-помощнике.**
20
+
21
+ Подключите инструмент к Claude, Codex или Cursor и ставьте задачи обычным языком.
22
+ Помощник обратится к XMLRiver и вернёт данные: запросы, частотности, позиции и ссылки.
23
+ Для массового съёма позиций есть отдельные команды с сохранением результатов в файлы.
24
+
25
+ Это независимый проект, не официальный продукт XMLRiver. Для работы нужен собственный аккаунт XMLRiver.
26
+
27
+ <!-- mcp-name: io.github.dietbear13/xmlriver-mcp-toolkit -->
28
+
29
+ ## Что умеет
30
+
31
+ | Задача | Что получите |
32
+ |---|---|
33
+ | Подобрать запросы в Wordstat | Расширения исходной фразы с частотностью; по желанию — похожие запросы |
34
+ | Посмотреть динамику спроса | Данные Wordstat за выбранный период |
35
+ | Собрать выдачу | Ссылки и заголовки результатов Google или Яндекса для нужного региона и устройства |
36
+ | Найти сайт в выдаче | Все найденные вхождения домена и их позиции среди органических результатов |
37
+ | Снять позиции по списку фраз | Результаты, история прогонов и обновлённый CSV |
38
+ | Сравнить регионы | Выдача по каждой связке «фраза × регион × поисковик» и совпадения с ожидаемыми доменами |
39
+ | Проверить счёт | Баланс XMLRiver и стоимость запросов для Google и Яндекса |
40
+
41
+ ## Что нужно для начала
42
+
43
+ 1. Зарегистрируйтесь на [xmlriver.com](https://xmlriver.com/) и пополните баланс.
44
+ 2. Возьмите в кабинете XMLRiver свой **user** и **key**. Они есть в примере адреса API-запроса: `user=...` и `key=...`.
45
+ 3. Установите [uv](https://docs.astral.sh/uv/getting-started/installation/) — небольшую программу, которая скачает и запустит этот инструмент.
46
+ 4. Подключите сервер в своём AI-помощнике по инструкции ниже.
47
+
48
+ Ключи XMLRiver — личные. Не отправляйте их в чат и не выкладывайте в GitHub.
49
+
50
+ ## Подключение к Claude и Cursor
51
+
52
+ MCP — способ подключить внешний инструмент к AI-помощнику. После подключения помощник сможет сам запрашивать данные XMLRiver.
53
+
54
+ Откройте файл настроек MCP:
55
+
56
+ - **Claude Desktop:** Settings → Developer → Edit Config.
57
+ - **Claude Code:** файл `.mcp.json` в папке вашего проекта.
58
+ - **Cursor:** файл `.cursor/mcp.json` в папке проекта.
59
+
60
+ Добавьте запись ниже. Замените `ВАШ_USER` и `ВАШ_KEY` своими значениями из XMLRiver.
61
+ Если в файле уже есть другие серверы, добавьте только блок `xmlriver` внутрь существующего `mcpServers`.
62
+
63
+ ```json
64
+ {
65
+ "mcpServers": {
66
+ "xmlriver": {
67
+ "command": "uvx",
68
+ "args": ["--from", "xmlriver-mcp-toolkit==0.1.0", "xmlriver-mcp"],
69
+ "env": {
70
+ "XMLRIVER_USER": "ВАШ_USER",
71
+ "XMLRIVER_KEY": "ВАШ_KEY"
72
+ }
73
+ }
74
+ }
75
+ }
76
+ ```
77
+
78
+ Сохраните файл и перезапустите помощника. При первом запуске `uvx` скачает пакет.
79
+ Если помощник не находит `uvx`, укажите полный путь к нему в поле `command`.
80
+ В Windows узнать путь можно командой `where.exe uvx`.
81
+
82
+ ## Подключение к Codex
83
+
84
+ Добавьте в файл `~/.codex/config.toml` (в Windows — `%USERPROFILE%\.codex\config.toml`):
85
+
86
+ ```toml
87
+ [mcp_servers.xmlriver]
88
+ command = "uvx"
89
+ args = ["--from", "xmlriver-mcp-toolkit==0.1.0", "xmlriver-mcp"]
90
+
91
+ [mcp_servers.xmlriver.env]
92
+ XMLRIVER_USER = "ВАШ_USER"
93
+ XMLRIVER_KEY = "ВАШ_KEY"
94
+ ```
95
+
96
+ Замените значения ключей, сохраните файл и начните новую сессию Codex.
97
+
98
+ ## Что попросить у помощника
99
+
100
+ Начните с простого:
101
+
102
+ > Проверь баланс XMLRiver.
103
+
104
+ Затем попробуйте SEO-задачи:
105
+
106
+ > Через Wordstat подбери 50 расширений запроса «кофемашина для дома» по Москве. Оставь запросы с частотностью от 100. Похожие запросы не добавляй.
107
+
108
+ > Посмотри динамику спроса по запросу «купить велосипед» с 01.01.2026 по 31.03.2026.
109
+
110
+ > Собери первые три страницы выдачи Google по запросу «ремонт кофемашин» в Москве для мобильных устройств. Покажи ссылки и позиции example.org.
111
+
112
+ > Покажи выдачу Яндекса по запросу «доставка цветов» в Санкт-Петербурге. Регион 2, устройство — компьютер, одна страница.
113
+
114
+ Если помощник просит выбрать инструмент, используются четыре названия:
115
+ `get_balance`, `wordstat_top`, `wordstat_history`, `serp`.
116
+
117
+ ## Массовая проверка позиций
118
+
119
+ Для десятков и сотен запросов удобнее запускать сбор командой. Результат сохранится в файлы, и его можно будет перенести в исходную таблицу.
120
+
121
+ **1. Установите пакет:**
122
+
123
+ ```sh
124
+ uv tool install xmlriver-mcp-toolkit==0.1.0
125
+ ```
126
+
127
+ **2. Задайте ключи для текущего окна терминала.** В Windows PowerShell:
128
+
129
+ ```powershell
130
+ $env:XMLRIVER_USER = "ВАШ_USER"
131
+ $env:XMLRIVER_KEY = "ВАШ_KEY"
132
+ ```
133
+
134
+ В macOS или Linux:
135
+
136
+ ```sh
137
+ export XMLRIVER_USER="ВАШ_USER"
138
+ export XMLRIVER_KEY="ВАШ_KEY"
139
+ ```
140
+
141
+ **3. Подготовьте CSV с запросами.** Например, `keywords.csv`:
142
+
143
+ ```csv
144
+ phrase
145
+ кофемашина для дома
146
+ купить кофемашину
147
+ ремонт кофемашин
148
+ ```
149
+
150
+ **4. Рядом создайте файл `positions.yaml`:**
151
+
152
+ ```yaml
153
+ target_domain: example.org
154
+ include_subdomains: true
155
+ csv: keywords.csv
156
+ column: phrase
157
+ depth: 50
158
+ max_attempts: 100
159
+ engines:
160
+ - name: yandex
161
+ region: 213
162
+ device: mobile
163
+ - name: google
164
+ region: 1011969
165
+ device: mobile
166
+ ```
167
+
168
+ Замените `example.org` своим доменом. Здесь заданы Москва, мобильная выдача и пять страниц на запрос.
169
+ `include_subdomains: true` включает поддомены сайта.
170
+ `max_attempts: 100` ограничивает общее число HTTP-попыток, включая повторы после ошибок.
171
+
172
+ **5. Посмотрите объём задания без списаний:**
173
+
174
+ ```sh
175
+ xmlriver positions run --config positions.yaml --dry-run
176
+ ```
177
+
178
+ **6. Запустите сбор:**
179
+
180
+ ```sh
181
+ xmlriver positions run --config positions.yaml
182
+ ```
183
+
184
+ Рядом с конфигурацией появится папка `xmlriver-data` с результатами и историей.
185
+ Команда напечатает `run_id` — идентификатор прогона. Чтобы добавить позиции в CSV:
186
+
187
+ ```sh
188
+ xmlriver positions update-csv --config positions.yaml --run ВАШ_RUN_ID
189
+ ```
190
+
191
+ Исходные колонки и порядок строк сохраняются. Перед обновлением создаётся резервная копия.
192
+ Для Яндекса и Google записываются отдельные даты съёма.
193
+
194
+ ## Проверка по регионам
195
+
196
+ В [примере конфигурации](examples/positions.yaml) есть блок `regions`. Добавьте нужные города,
197
+ их ID в Яндексе и Google, а в `expected_hosts` — домены, которые ожидаете увидеть в выдаче.
198
+
199
+ ```sh
200
+ xmlriver regions validate --config positions.yaml
201
+ xmlriver regions run --config positions.yaml --dry-run
202
+ xmlriver regions run --config positions.yaml
203
+ ```
204
+
205
+ Google-регионы сверяются со справочником XMLRiver. Проверка Яндекс-региона делает запрос «погода»
206
+ и ищет признаки города в выдаче: это подсказка для проверки настройки, а не гарантия.
207
+ Чтобы заново скачать справочник Google, добавьте к `regions validate` параметр `--refresh`.
208
+
209
+ ## Расходы и особенности данных
210
+
211
+ - **Запросы оплачиваются с вашего баланса XMLRiver.** Сам пакет бесплатный.
212
+ - Одна страница выдачи — отдельный запрос к сервису. Больше страниц, фраз и регионов — больше запросов.
213
+ - Можно запросить от 1 до 10 страниц. Страница может содержать меньше 10 органических результатов, поэтому пять страниц не гарантируют 50 ссылок.
214
+ - Позиция — номер органического результата в полученной последовательности. Рекламные блоки в этот номер не входят.
215
+ - Повтор после сетевой ошибки тоже может привести к списанию. Счётчик попыток и оценка расходов не заменяют данные кабинета XMLRiver.
216
+ - Результаты массового съёма хранятся в кэше 24 часа. Повторный запуск с теми же параметрами использует их. Для нового съёма добавьте `--refresh`.
217
+ - `--dry-run` не обращается к API и ничего не записывает. Команды проверки баланса и регионов обращаются к сети.
218
+ - В Wordstat по умолчанию используются Москва и все устройства; в SERP — Москва и мобильные устройства.
219
+
220
+ Если в результате указана неизвестная стоимость (`null`), тариф не задан или не получен. Это не означает бесплатный сбор.
221
+
222
+ ## Если что-то не работает
223
+
224
+ - **Не удаётся запустить сервер:** проверьте установку `uv` и путь к `uvx`, затем перезапустите помощника.
225
+ - **Ошибка авторизации:** проверьте `XMLRIVER_USER` и `XMLRIVER_KEY` в настройках.
226
+ - **Недостаточно средств:** пополните баланс XMLRiver.
227
+ - **Неверный регион:** у Яндекса и Google разные справочники ID. [Справочник Google](https://xmlriver.com/files/geo.csv).
228
+ - **Не принимается период Wordstat:** даты должны быть в формате `дд.мм.гггг`; ограничения на длительность периода описаны в [документации XMLRiver](https://xmlriver.com/apiwordstatnew/apiwn-about/).
229
+
230
+ Сообщить об ошибке можно в [Issues](https://github.com/dietbear13/xmlriver_mcp/issues). Укажите команду и текст ошибки, удалив ключи и другие личные данные.
231
+
232
+ Лицензия [MIT](LICENSE). Для разработчиков: [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,216 @@
1
+ # XMLRiver MCP Toolkit
2
+
3
+ **Поисковая выдача Google и Яндекса, частотность запросов Wordstat и проверка позиций сайта — прямо в вашем AI-помощнике.**
4
+
5
+ Подключите инструмент к Claude, Codex или Cursor и ставьте задачи обычным языком.
6
+ Помощник обратится к XMLRiver и вернёт данные: запросы, частотности, позиции и ссылки.
7
+ Для массового съёма позиций есть отдельные команды с сохранением результатов в файлы.
8
+
9
+ Это независимый проект, не официальный продукт XMLRiver. Для работы нужен собственный аккаунт XMLRiver.
10
+
11
+ <!-- mcp-name: io.github.dietbear13/xmlriver-mcp-toolkit -->
12
+
13
+ ## Что умеет
14
+
15
+ | Задача | Что получите |
16
+ |---|---|
17
+ | Подобрать запросы в Wordstat | Расширения исходной фразы с частотностью; по желанию — похожие запросы |
18
+ | Посмотреть динамику спроса | Данные Wordstat за выбранный период |
19
+ | Собрать выдачу | Ссылки и заголовки результатов Google или Яндекса для нужного региона и устройства |
20
+ | Найти сайт в выдаче | Все найденные вхождения домена и их позиции среди органических результатов |
21
+ | Снять позиции по списку фраз | Результаты, история прогонов и обновлённый CSV |
22
+ | Сравнить регионы | Выдача по каждой связке «фраза × регион × поисковик» и совпадения с ожидаемыми доменами |
23
+ | Проверить счёт | Баланс XMLRiver и стоимость запросов для Google и Яндекса |
24
+
25
+ ## Что нужно для начала
26
+
27
+ 1. Зарегистрируйтесь на [xmlriver.com](https://xmlriver.com/) и пополните баланс.
28
+ 2. Возьмите в кабинете XMLRiver свой **user** и **key**. Они есть в примере адреса API-запроса: `user=...` и `key=...`.
29
+ 3. Установите [uv](https://docs.astral.sh/uv/getting-started/installation/) — небольшую программу, которая скачает и запустит этот инструмент.
30
+ 4. Подключите сервер в своём AI-помощнике по инструкции ниже.
31
+
32
+ Ключи XMLRiver — личные. Не отправляйте их в чат и не выкладывайте в GitHub.
33
+
34
+ ## Подключение к Claude и Cursor
35
+
36
+ MCP — способ подключить внешний инструмент к AI-помощнику. После подключения помощник сможет сам запрашивать данные XMLRiver.
37
+
38
+ Откройте файл настроек MCP:
39
+
40
+ - **Claude Desktop:** Settings → Developer → Edit Config.
41
+ - **Claude Code:** файл `.mcp.json` в папке вашего проекта.
42
+ - **Cursor:** файл `.cursor/mcp.json` в папке проекта.
43
+
44
+ Добавьте запись ниже. Замените `ВАШ_USER` и `ВАШ_KEY` своими значениями из XMLRiver.
45
+ Если в файле уже есть другие серверы, добавьте только блок `xmlriver` внутрь существующего `mcpServers`.
46
+
47
+ ```json
48
+ {
49
+ "mcpServers": {
50
+ "xmlriver": {
51
+ "command": "uvx",
52
+ "args": ["--from", "xmlriver-mcp-toolkit==0.1.0", "xmlriver-mcp"],
53
+ "env": {
54
+ "XMLRIVER_USER": "ВАШ_USER",
55
+ "XMLRIVER_KEY": "ВАШ_KEY"
56
+ }
57
+ }
58
+ }
59
+ }
60
+ ```
61
+
62
+ Сохраните файл и перезапустите помощника. При первом запуске `uvx` скачает пакет.
63
+ Если помощник не находит `uvx`, укажите полный путь к нему в поле `command`.
64
+ В Windows узнать путь можно командой `where.exe uvx`.
65
+
66
+ ## Подключение к Codex
67
+
68
+ Добавьте в файл `~/.codex/config.toml` (в Windows — `%USERPROFILE%\.codex\config.toml`):
69
+
70
+ ```toml
71
+ [mcp_servers.xmlriver]
72
+ command = "uvx"
73
+ args = ["--from", "xmlriver-mcp-toolkit==0.1.0", "xmlriver-mcp"]
74
+
75
+ [mcp_servers.xmlriver.env]
76
+ XMLRIVER_USER = "ВАШ_USER"
77
+ XMLRIVER_KEY = "ВАШ_KEY"
78
+ ```
79
+
80
+ Замените значения ключей, сохраните файл и начните новую сессию Codex.
81
+
82
+ ## Что попросить у помощника
83
+
84
+ Начните с простого:
85
+
86
+ > Проверь баланс XMLRiver.
87
+
88
+ Затем попробуйте SEO-задачи:
89
+
90
+ > Через Wordstat подбери 50 расширений запроса «кофемашина для дома» по Москве. Оставь запросы с частотностью от 100. Похожие запросы не добавляй.
91
+
92
+ > Посмотри динамику спроса по запросу «купить велосипед» с 01.01.2026 по 31.03.2026.
93
+
94
+ > Собери первые три страницы выдачи Google по запросу «ремонт кофемашин» в Москве для мобильных устройств. Покажи ссылки и позиции example.org.
95
+
96
+ > Покажи выдачу Яндекса по запросу «доставка цветов» в Санкт-Петербурге. Регион 2, устройство — компьютер, одна страница.
97
+
98
+ Если помощник просит выбрать инструмент, используются четыре названия:
99
+ `get_balance`, `wordstat_top`, `wordstat_history`, `serp`.
100
+
101
+ ## Массовая проверка позиций
102
+
103
+ Для десятков и сотен запросов удобнее запускать сбор командой. Результат сохранится в файлы, и его можно будет перенести в исходную таблицу.
104
+
105
+ **1. Установите пакет:**
106
+
107
+ ```sh
108
+ uv tool install xmlriver-mcp-toolkit==0.1.0
109
+ ```
110
+
111
+ **2. Задайте ключи для текущего окна терминала.** В Windows PowerShell:
112
+
113
+ ```powershell
114
+ $env:XMLRIVER_USER = "ВАШ_USER"
115
+ $env:XMLRIVER_KEY = "ВАШ_KEY"
116
+ ```
117
+
118
+ В macOS или Linux:
119
+
120
+ ```sh
121
+ export XMLRIVER_USER="ВАШ_USER"
122
+ export XMLRIVER_KEY="ВАШ_KEY"
123
+ ```
124
+
125
+ **3. Подготовьте CSV с запросами.** Например, `keywords.csv`:
126
+
127
+ ```csv
128
+ phrase
129
+ кофемашина для дома
130
+ купить кофемашину
131
+ ремонт кофемашин
132
+ ```
133
+
134
+ **4. Рядом создайте файл `positions.yaml`:**
135
+
136
+ ```yaml
137
+ target_domain: example.org
138
+ include_subdomains: true
139
+ csv: keywords.csv
140
+ column: phrase
141
+ depth: 50
142
+ max_attempts: 100
143
+ engines:
144
+ - name: yandex
145
+ region: 213
146
+ device: mobile
147
+ - name: google
148
+ region: 1011969
149
+ device: mobile
150
+ ```
151
+
152
+ Замените `example.org` своим доменом. Здесь заданы Москва, мобильная выдача и пять страниц на запрос.
153
+ `include_subdomains: true` включает поддомены сайта.
154
+ `max_attempts: 100` ограничивает общее число HTTP-попыток, включая повторы после ошибок.
155
+
156
+ **5. Посмотрите объём задания без списаний:**
157
+
158
+ ```sh
159
+ xmlriver positions run --config positions.yaml --dry-run
160
+ ```
161
+
162
+ **6. Запустите сбор:**
163
+
164
+ ```sh
165
+ xmlriver positions run --config positions.yaml
166
+ ```
167
+
168
+ Рядом с конфигурацией появится папка `xmlriver-data` с результатами и историей.
169
+ Команда напечатает `run_id` — идентификатор прогона. Чтобы добавить позиции в CSV:
170
+
171
+ ```sh
172
+ xmlriver positions update-csv --config positions.yaml --run ВАШ_RUN_ID
173
+ ```
174
+
175
+ Исходные колонки и порядок строк сохраняются. Перед обновлением создаётся резервная копия.
176
+ Для Яндекса и Google записываются отдельные даты съёма.
177
+
178
+ ## Проверка по регионам
179
+
180
+ В [примере конфигурации](examples/positions.yaml) есть блок `regions`. Добавьте нужные города,
181
+ их ID в Яндексе и Google, а в `expected_hosts` — домены, которые ожидаете увидеть в выдаче.
182
+
183
+ ```sh
184
+ xmlriver regions validate --config positions.yaml
185
+ xmlriver regions run --config positions.yaml --dry-run
186
+ xmlriver regions run --config positions.yaml
187
+ ```
188
+
189
+ Google-регионы сверяются со справочником XMLRiver. Проверка Яндекс-региона делает запрос «погода»
190
+ и ищет признаки города в выдаче: это подсказка для проверки настройки, а не гарантия.
191
+ Чтобы заново скачать справочник Google, добавьте к `regions validate` параметр `--refresh`.
192
+
193
+ ## Расходы и особенности данных
194
+
195
+ - **Запросы оплачиваются с вашего баланса XMLRiver.** Сам пакет бесплатный.
196
+ - Одна страница выдачи — отдельный запрос к сервису. Больше страниц, фраз и регионов — больше запросов.
197
+ - Можно запросить от 1 до 10 страниц. Страница может содержать меньше 10 органических результатов, поэтому пять страниц не гарантируют 50 ссылок.
198
+ - Позиция — номер органического результата в полученной последовательности. Рекламные блоки в этот номер не входят.
199
+ - Повтор после сетевой ошибки тоже может привести к списанию. Счётчик попыток и оценка расходов не заменяют данные кабинета XMLRiver.
200
+ - Результаты массового съёма хранятся в кэше 24 часа. Повторный запуск с теми же параметрами использует их. Для нового съёма добавьте `--refresh`.
201
+ - `--dry-run` не обращается к API и ничего не записывает. Команды проверки баланса и регионов обращаются к сети.
202
+ - В Wordstat по умолчанию используются Москва и все устройства; в SERP — Москва и мобильные устройства.
203
+
204
+ Если в результате указана неизвестная стоимость (`null`), тариф не задан или не получен. Это не означает бесплатный сбор.
205
+
206
+ ## Если что-то не работает
207
+
208
+ - **Не удаётся запустить сервер:** проверьте установку `uv` и путь к `uvx`, затем перезапустите помощника.
209
+ - **Ошибка авторизации:** проверьте `XMLRIVER_USER` и `XMLRIVER_KEY` в настройках.
210
+ - **Недостаточно средств:** пополните баланс XMLRiver.
211
+ - **Неверный регион:** у Яндекса и Google разные справочники ID. [Справочник Google](https://xmlriver.com/files/geo.csv).
212
+ - **Не принимается период Wordstat:** даты должны быть в формате `дд.мм.гггг`; ограничения на длительность периода описаны в [документации XMLRiver](https://xmlriver.com/apiwordstatnew/apiwn-about/).
213
+
214
+ Сообщить об ошибке можно в [Issues](https://github.com/dietbear13/xmlriver_mcp/issues). Укажите команду и текст ошибки, удалив ключи и другие личные данные.
215
+
216
+ Лицензия [MIT](LICENSE). Для разработчиков: [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,3 @@
1
+ # XMLRiver MCP Toolkit
2
+
3
+ Полная инструкция на русском находится в [README.md](README.md).
@@ -0,0 +1,7 @@
1
+ # Security
2
+
3
+ Report security issues privately through GitHub's private vulnerability reporting
4
+ when enabled. Do not post credentials in public issues. Rotate exposed keys at
5
+ XMLRiver immediately. The toolkit sends credentials directly to XMLRiver over HTTPS
6
+ and does not operate a remote credential store. Debug logging in applications
7
+ embedding HTTPX must redact authenticated URLs.
@@ -0,0 +1,22 @@
1
+ target_domain: example.org
2
+ include_subdomains: true
3
+ depth: 50
4
+ phrases: [coffee, tea]
5
+ column: phrase
6
+ engines:
7
+ - name: yandex
8
+ region: 213
9
+ device: mobile
10
+ - name: google
11
+ region: 1011969
12
+ device: mobile
13
+ regions:
14
+ - name: Moscow
15
+ yandex: 213
16
+ google: 1011969
17
+ hints: [Москва, Москве]
18
+ expected_hosts: [example.org]
19
+ max_attempts: 100
20
+ cache_ttl_hours: 24
21
+ # Optional approximate prices; absent means unknown, never free.
22
+ costs_per_1000: {}
@@ -0,0 +1,49 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27,<2"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "xmlriver-mcp-toolkit"
7
+ version = "0.1.0"
8
+ description = "Independent XMLRiver MCP server, async client and SEO collection CLI"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [{name = "Mikhail Bulgakov"}]
13
+ dependencies = ["mcp>=1.27,<2", "httpx>=0.28.1,<0.29", "pydantic>=2.13,<3", "PyYAML>=6,<7", "filelock>=3.25,<4"]
14
+
15
+ [project.urls]
16
+ Repository = "https://github.com/dietbear13/xmlriver_mcp"
17
+
18
+ [project.scripts]
19
+ xmlriver-mcp = "xmlriver_mcp.server:main"
20
+ xmlriver-mcp-toolkit = "xmlriver_mcp.server:main"
21
+ xmlriver = "xmlriver_mcp.cli:main"
22
+
23
+ [dependency-groups]
24
+ dev = ["pytest>=9,<10", "pytest-asyncio>=1,<2", "ruff>=0.15,<1", "mypy>=1.19,<2", "types-PyYAML>=6,<7", "build>=1,<2", "twine>=6,<7"]
25
+
26
+ [tool.hatch.build.targets.wheel]
27
+ packages = ["src/xmlriver_mcp"]
28
+ core-metadata-version = "2.4"
29
+
30
+ [tool.hatch.build.targets.sdist]
31
+ core-metadata-version = "2.4"
32
+ include = ["src", "tests", "pyproject.toml", "README*", "LICENSE", "CHANGELOG.md", "CONTRIBUTING.md", "SECURITY.md", "examples", "uv.lock"]
33
+
34
+ [tool.pytest.ini_options]
35
+ asyncio_mode = "auto"
36
+ asyncio_default_fixture_loop_scope = "function"
37
+ testpaths = ["tests"]
38
+
39
+ [tool.ruff]
40
+ target-version = "py311"
41
+ line-length = 100
42
+
43
+ [tool.ruff.lint]
44
+ select = ["E4", "E7", "E9", "F", "I"]
45
+
46
+ [tool.mypy]
47
+ python_version = "3.11"
48
+ check_untyped_defs = true
49
+ files = ["src"]
@@ -0,0 +1,3 @@
1
+ """Independent XMLRiver client and MCP server."""
2
+
3
+ __version__ = "0.1.0"