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.
- xmlriver_mcp_toolkit-0.1.0/.gitignore +9 -0
- xmlriver_mcp_toolkit-0.1.0/CHANGELOG.md +7 -0
- xmlriver_mcp_toolkit-0.1.0/CONTRIBUTING.md +5 -0
- xmlriver_mcp_toolkit-0.1.0/LICENSE +21 -0
- xmlriver_mcp_toolkit-0.1.0/PKG-INFO +232 -0
- xmlriver_mcp_toolkit-0.1.0/README.md +216 -0
- xmlriver_mcp_toolkit-0.1.0/README.ru.md +3 -0
- xmlriver_mcp_toolkit-0.1.0/SECURITY.md +7 -0
- xmlriver_mcp_toolkit-0.1.0/examples/positions.yaml +22 -0
- xmlriver_mcp_toolkit-0.1.0/pyproject.toml +49 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/__init__.py +3 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/batch.py +190 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/cli.py +117 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/client.py +278 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/config.py +46 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/csv_io.py +103 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/errors.py +29 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/models.py +100 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/parsers.py +112 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/regions.py +70 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/server.py +112 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/services.py +100 -0
- xmlriver_mcp_toolkit-0.1.0/src/xmlriver_mcp/storage.py +172 -0
- xmlriver_mcp_toolkit-0.1.0/tests/stdio_fixture.py +34 -0
- xmlriver_mcp_toolkit-0.1.0/tests/test_cancellation.py +76 -0
- xmlriver_mcp_toolkit-0.1.0/tests/test_core.py +290 -0
- xmlriver_mcp_toolkit-0.1.0/tests/test_logging.py +18 -0
- xmlriver_mcp_toolkit-0.1.0/tests/test_stdio.py +45 -0
- xmlriver_mcp_toolkit-0.1.0/uv.lock +1633 -0
|
@@ -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,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"]
|