zapret2-mcp 0.3.5 → 0.6.0
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.
- package/CHANGELOG.md +75 -0
- package/README.md +42 -189
- package/build/index.js +52 -56
- package/build/index.js.map +1 -1
- package/build/indexer.d.ts +25 -0
- package/build/indexer.js +114 -0
- package/build/indexer.js.map +1 -0
- package/build/prompts.js +91 -224
- package/build/prompts.js.map +1 -1
- package/knowledge/blockcheckw/commands.md +149 -0
- package/knowledge/blockcheckw/overview.md +46 -0
- package/knowledge/config/migration-v1-to-v2.md +168 -0
- package/knowledge/config/nfqws2-options.md +149 -0
- package/knowledge/config/zapret2-config.md +104 -0
- package/knowledge/platforms/supported.md +45 -0
- package/knowledge/strategies/dpi-types.md +79 -0
- package/knowledge/strategies/fake-packets.md +97 -0
- package/knowledge/strategies/http-specific.md +57 -0
- package/knowledge/strategies/orchestration.md +59 -0
- package/knowledge/strategies/tcp-segmentation.md +93 -0
- package/knowledge/strategies/telegram-bypass.md +157 -0
- package/knowledge/strategies/udp-quic.md +61 -0
- package/knowledge/troubleshooting/common-issues.md +125 -0
- package/knowledge/troubleshooting/openwrt-conflicts.md +217 -0
- package/knowledge/troubleshooting/quic-issues.md +180 -0
- package/knowledge/troubleshooting/smart-tv-youtube.md +147 -0
- package/knowledge/tspu/architecture.md +57 -0
- package/knowledge/tspu/blocking-methods.md +83 -0
- package/knowledge/tspu/dpi-engine.md +55 -0
- package/knowledge/tspu/two-stage-blocking.md +59 -0
- package/knowledge/workflows/find-strategy.md +83 -0
- package/knowledge/workflows/setup.md +111 -0
- package/package.json +3 -2
- package/build/executor/docker.d.ts +0 -7
- package/build/executor/docker.js +0 -22
- package/build/executor/docker.js.map +0 -1
- package/build/executor/factory.d.ts +0 -2
- package/build/executor/factory.js +0 -27
- package/build/executor/factory.js.map +0 -1
- package/build/executor/index.d.ts +0 -6
- package/build/executor/index.js +0 -5
- package/build/executor/index.js.map +0 -1
- package/build/executor/local.d.ts +0 -5
- package/build/executor/local.js +0 -17
- package/build/executor/local.js.map +0 -1
- package/build/executor/ssh.d.ts +0 -13
- package/build/executor/ssh.js +0 -33
- package/build/executor/ssh.js.map +0 -1
- package/build/executor/types.d.ts +0 -8
- package/build/executor/types.js +0 -2
- package/build/executor/types.js.map +0 -1
- package/build/executorInstance.d.ts +0 -3
- package/build/executorInstance.js +0 -11
- package/build/executorInstance.js.map +0 -1
- package/build/logStore.d.ts +0 -12
- package/build/logStore.js +0 -76
- package/build/logStore.js.map +0 -1
- package/build/resources.d.ts +0 -2
- package/build/resources.js +0 -41
- package/build/resources.js.map +0 -1
- package/build/tools/checkPrerequisites.d.ts +0 -19
- package/build/tools/checkPrerequisites.js +0 -118
- package/build/tools/checkPrerequisites.js.map +0 -1
- package/build/tools/configureDns.d.ts +0 -35
- package/build/tools/configureDns.js +0 -110
- package/build/tools/configureDns.js.map +0 -1
- package/build/tools/createSystemdService.d.ts +0 -27
- package/build/tools/createSystemdService.js +0 -75
- package/build/tools/createSystemdService.js.map +0 -1
- package/build/tools/detectSystem.d.ts +0 -19
- package/build/tools/detectSystem.js +0 -89
- package/build/tools/detectSystem.js.map +0 -1
- package/build/tools/getConfig.d.ts +0 -27
- package/build/tools/getConfig.js +0 -30
- package/build/tools/getConfig.js.map +0 -1
- package/build/tools/getStatus.d.ts +0 -19
- package/build/tools/getStatus.js +0 -42
- package/build/tools/getStatus.js.map +0 -1
- package/build/tools/installZapret.d.ts +0 -31
- package/build/tools/installZapret.js +0 -95
- package/build/tools/installZapret.js.map +0 -1
- package/build/tools/removeZapret.d.ts +0 -27
- package/build/tools/removeZapret.js +0 -112
- package/build/tools/removeZapret.js.map +0 -1
- package/build/tools/restartService.d.ts +0 -19
- package/build/tools/restartService.js +0 -24
- package/build/tools/restartService.js.map +0 -1
- package/build/tools/runBlockcheck.d.ts +0 -31
- package/build/tools/runBlockcheck.js +0 -78
- package/build/tools/runBlockcheck.js.map +0 -1
- package/build/tools/startService.d.ts +0 -19
- package/build/tools/startService.js +0 -24
- package/build/tools/startService.js.map +0 -1
- package/build/tools/stopService.d.ts +0 -19
- package/build/tools/stopService.js +0 -24
- package/build/tools/stopService.js.map +0 -1
- package/build/tools/updateConfig.d.ts +0 -31
- package/build/tools/updateConfig.js +0 -54
- package/build/tools/updateConfig.js.map +0 -1
- package/build/tools/verifyBypass.d.ts +0 -35
- package/build/tools/verifyBypass.js +0 -111
- package/build/tools/verifyBypass.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,80 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.6.0](https://github.com/rcd27/zapret2-mcp/compare/v0.5.2...v0.6.0) (2026-03-28)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* **contract:** пересмотрен подход к составлению статей
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **contract:** пересмотрен подход к составлению статей ([30ae044](https://github.com/rcd27/zapret2-mcp/commit/30ae0446f70a826f72c03f1294faec0bb795af63))
|
|
13
|
+
* **knowledge:** возможности с MTProto ([b5c4cb1](https://github.com/rcd27/zapret2-mcp/commit/b5c4cb190bdebef89719d4432be54165c3d44d50))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* **ci-cd:** trusted publishing ([d782a13](https://github.com/rcd27/zapret2-mcp/commit/d782a13e9624c43a02f2e7f65e0469d6c0b02a7a))
|
|
19
|
+
* **ci-cd:** выпелен environment из релиза ([a165212](https://github.com/rcd27/zapret2-mcp/commit/a165212d70bcb52fd140f89d413273ff8463281c))
|
|
20
|
+
* **knowledge:** шапка для статей ([fba333c](https://github.com/rcd27/zapret2-mcp/commit/fba333c14dcf53a80d7b3077c5b5263263a298a7))
|
|
21
|
+
|
|
22
|
+
## [0.5.2](https://github.com/rcd27/zapret2-mcp/compare/v0.5.1...v0.5.2) (2026-03-28)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
* **knowledge:** добавлены доки про ТСПУ ([23f6b12](https://github.com/rcd27/zapret2-mcp/commit/23f6b12cd560f70ad529e0d4bfe150cfe8b0033b))
|
|
28
|
+
* **knowledge:** конфликты на OpenWRT ([20df465](https://github.com/rcd27/zapret2-mcp/commit/20df4651cbc310bb57ba5528a826d12d676a21c6))
|
|
29
|
+
* **knowledge:** миграции стратегий V1 -> V2 ([b9da20f](https://github.com/rcd27/zapret2-mcp/commit/b9da20f8da675da536555d9efa6bd5122032f03c))
|
|
30
|
+
* **knowledge:** проблемы с QUICK ([b41ed68](https://github.com/rcd27/zapret2-mcp/commit/b41ed68db85fa1700502e172f5bc7b5e2440f1fc))
|
|
31
|
+
* **knowledge:** статья про смарт-тв ([a04cb01](https://github.com/rcd27/zapret2-mcp/commit/a04cb01b5f92dba14e7da3b69674b41bc5f7c67e))
|
|
32
|
+
|
|
33
|
+
## [0.5.1](https://github.com/rcd27/zapret2-mcp/compare/v0.5.0...v0.5.1) (2026-03-28)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
### Bug Fixes
|
|
37
|
+
|
|
38
|
+
* **docs:** исправлен полностью устаревший README.md ([8f94e86](https://github.com/rcd27/zapret2-mcp/commit/8f94e86531802db7b9a05225ebe4b1d88a05b072))
|
|
39
|
+
|
|
40
|
+
## [0.5.0](https://github.com/rcd27/zapret2-mcp/compare/v0.4.0...v0.5.0) (2026-03-28)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
### ⚠ BREAKING CHANGES
|
|
44
|
+
|
|
45
|
+
* **pivot:** CI/CD для автоматического версионирования и деплоя в NPM
|
|
46
|
+
* **pivot:** переход в парадигму knowledge-base
|
|
47
|
+
|
|
48
|
+
### Features
|
|
49
|
+
|
|
50
|
+
* add removeZapret2 tool with unit tests ([b75a26e](https://github.com/rcd27/zapret2-mcp/commit/b75a26e6c2e97205764c4b729acf5362b6b6c8b6))
|
|
51
|
+
* add runDpiDetector tool for DPI blocking diagnosis ([76a24c7](https://github.com/rcd27/zapret2-mcp/commit/76a24c77510790ad7adadbd08ea4ca4a911e3fea))
|
|
52
|
+
* **pivot:** CI/CD для автоматического версионирования и деплоя в NPM ([326bf6c](https://github.com/rcd27/zapret2-mcp/commit/326bf6c97c616ada5278e6ae14c220a378126c15))
|
|
53
|
+
* **pivot:** переход в парадигму knowledge-base ([1d53b78](https://github.com/rcd27/zapret2-mcp/commit/1d53b7842f781f0075e2682d1e97148619de986b))
|
|
54
|
+
* **prompts:** add strategy-knowledge prompt ([ef01999](https://github.com/rcd27/zapret2-mcp/commit/ef0199970504599163a3730f597c1bb203facb9a))
|
|
55
|
+
* **verifyBypass:** add interface param, routeTo/wanInterface fields, fix bypassConfirmed logic ([4f44a18](https://github.com/rcd27/zapret2-mcp/commit/4f44a18666026ea5aaa3e4c35bad51c20d587993))
|
|
56
|
+
* zapret2-mcp v0.3.0 ([9ee87f9](https://github.com/rcd27/zapret2-mcp/commit/9ee87f99338f7c028dd80b661029bf01a2d44d06))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
### Bug Fixes
|
|
60
|
+
|
|
61
|
+
* critical workflow bugs from user-story testing (v0.3.1) ([a370abc](https://github.com/rcd27/zapret2-mcp/commit/a370abc22c7365efc9f908b29e4ad8c52383ad33))
|
|
62
|
+
* installZapret clone permissions and runBlockcheck stdin format ([ba09230](https://github.com/rcd27/zapret2-mcp/commit/ba09230a7d2f539f8ae3802987b203a26cf952c7))
|
|
63
|
+
* **local:** sudo for `local` installation ([7e75130](https://github.com/rcd27/zapret2-mcp/commit/7e7513049fc520623346d0b33cbdd5db3e8e204d))
|
|
64
|
+
* resolve 10 bugs found during full-cycle reinstall testing (v0.3.3) ([f891829](https://github.com/rcd27/zapret2-mcp/commit/f891829b36c4a4d2cdcbfdb966dd25cbae1df77f))
|
|
65
|
+
|
|
66
|
+
## [0.3.6] - 2026-03-04
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
- **`runDpiDetector` tool** — запуск Docker-образа `dpi-detector` для диагностики типов DPI-блокировок (TLS SNI, TCP throttling, UDP/QUIC). Тяжёлая операция (~3 мин), полный лог сохраняется в resources. Используется перед `runBlockcheck` для понимания характера блокировки.
|
|
70
|
+
- **Unit-тесты `runDpiDetector`** — 8 тестов: docker flags, log URI, defaults, валидация параметров, пустой вывод, partial output на ошибке, fallback на LocalExecutor из Docker-режима, обработка exec failure.
|
|
71
|
+
- **Новый тип логов `dpi-detector`** — сохранение в `~/.zapret2-mcp/logs/dpi-detector/`, доступ через `zapret2://logs/dpi-detector/{timestamp}`.
|
|
72
|
+
- **Workflow #5 DPI diagnosis** — `runDpiDetector → analyze → runBlockcheck → updateConfig → restartService → verifyBypass`.
|
|
73
|
+
|
|
74
|
+
### Changed
|
|
75
|
+
- **Промпт `troubleshoot`** — добавлен опциональный шаг 6: запуск `runDpiDetector` для диагностики типов блокировок.
|
|
76
|
+
- **Промпт `overview`** — обновлён: 15 tools, добавлен `runDpiDetector` в секцию инструментов и workflow #5.
|
|
77
|
+
|
|
3
78
|
## [0.3.5] - 2026-02-19
|
|
4
79
|
|
|
5
80
|
### Added
|
package/README.md
CHANGED
|
@@ -1,238 +1,91 @@
|
|
|
1
1
|
# zapret2-mcp
|
|
2
2
|
|
|
3
|
-
MCP-сервер для
|
|
3
|
+
Knowledge MCP-сервер для [zapret2](https://github.com/bol-van/zapret2) и [blockcheckw](https://github.com/rcd27/blockcheckw). Подключи к AI-агенту — он получит экспертные знания по обходу DPI-блокировок и сможет настроить всё сам.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Зачем
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|---|---|---|
|
|
9
|
-
| OpenWrt (роутер) | Полная поддержка | `ssh` |
|
|
10
|
-
| Linux (десктоп/сервер) | Полная поддержка | `local` |
|
|
11
|
-
| Docker (разработка/тестирование) | Полная поддержка | `docker` |
|
|
12
|
-
| macOS | Не поддерживается | — |
|
|
13
|
-
| Windows (нативно) | Не поддерживается | — |
|
|
14
|
-
| Windows (WSL2) | Работает через `local` | `local` |
|
|
7
|
+
AI-агент (Claude, Cursor, etc.) умеет выполнять команды в терминале. Но он **не знает** как работает zapret2, какие стратегии бывают, как их подбирать и что делать если не работает. Этот MCP-сервер даёт агенту эти знания.
|
|
15
8
|
|
|
16
|
-
|
|
9
|
+
**Сервер не выполняет команды** — он отдаёт документацию и экспертизу. Агент читает и действует сам.
|
|
17
10
|
|
|
18
|
-
##
|
|
11
|
+
## Что внутри
|
|
19
12
|
|
|
20
|
-
|
|
21
|
-
npm install -g zapret2-mcp
|
|
22
|
-
```
|
|
13
|
+
**14 статей** в базе знаний:
|
|
23
14
|
|
|
24
|
-
|
|
15
|
+
- Стратегии DPI bypass: split2, disorder2, fake, fooling, QUIC, оркестрация
|
|
16
|
+
- Справочник параметров nfqws2 и конфига zapret2
|
|
17
|
+
- Команды [blockcheckw](https://github.com/rcd27/blockcheckw) для параллельного сканирования стратегий
|
|
18
|
+
- Пошаговые workflow-ы установки и диагностики
|
|
19
|
+
- Типичные проблемы и решения
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
npx zapret2-mcp
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Настройка MCP-клиента
|
|
31
|
-
|
|
32
|
-
### Claude Desktop
|
|
33
|
-
|
|
34
|
-
Добавить в `~/.claude/claude_desktop_config.json`:
|
|
21
|
+
## Установка
|
|
35
22
|
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
"mcpServers": {
|
|
39
|
-
"zapret2": {
|
|
40
|
-
"command": "npx",
|
|
41
|
-
"args": ["zapret2-mcp"],
|
|
42
|
-
"env": {
|
|
43
|
-
"ZAPRET2_MODE": "ssh",
|
|
44
|
-
"ZAPRET2_SSH_HOST": "192.168.1.1"
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g zapret2-mcp
|
|
49
25
|
```
|
|
50
26
|
|
|
51
|
-
|
|
27
|
+
## Подключение
|
|
52
28
|
|
|
53
|
-
|
|
29
|
+
### Claude Desktop / Claude Code
|
|
54
30
|
|
|
55
31
|
```json
|
|
56
32
|
{
|
|
57
33
|
"mcpServers": {
|
|
58
34
|
"zapret2": {
|
|
59
35
|
"command": "npx",
|
|
60
|
-
"args": ["zapret2-mcp"]
|
|
61
|
-
"env": {
|
|
62
|
-
"ZAPRET2_MODE": "ssh",
|
|
63
|
-
"ZAPRET2_SSH_HOST": "192.168.1.1"
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Cursor
|
|
71
|
-
|
|
72
|
-
Добавить в настройки MCP:
|
|
73
|
-
|
|
74
|
-
```json
|
|
75
|
-
{
|
|
76
|
-
"zapret2": {
|
|
77
|
-
"command": "npx",
|
|
78
|
-
"args": ["zapret2-mcp"],
|
|
79
|
-
"env": {
|
|
80
|
-
"ZAPRET2_MODE": "docker"
|
|
36
|
+
"args": ["zapret2-mcp"]
|
|
81
37
|
}
|
|
82
38
|
}
|
|
83
39
|
}
|
|
84
40
|
```
|
|
85
41
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
Сервер выполняет команды на целевой машине через один из трёх транспортов.
|
|
89
|
-
|
|
90
|
-
### `ssh` — удалённый роутер (продакшн)
|
|
91
|
-
|
|
92
|
-
Подключение по SSH к OpenWrt-роутеру. Основной режим для реального использования.
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{ "ZAPRET2_MODE": "ssh", "ZAPRET2_SSH_HOST": "192.168.1.1" }
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### `local` — локальная машина
|
|
42
|
+
Никаких переменных окружения не нужно — сервер только отдаёт знания.
|
|
99
43
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
```json
|
|
103
|
-
{ "ZAPRET2_MODE": "local" }
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### `docker` — контейнер (по умолчанию)
|
|
107
|
-
|
|
108
|
-
Выполнение через `docker exec` в контейнере с OpenWrt. Для разработки и тестирования.
|
|
109
|
-
|
|
110
|
-
```json
|
|
111
|
-
{ "ZAPRET2_MODE": "docker" }
|
|
112
|
-
```
|
|
44
|
+
## MCP API
|
|
113
45
|
|
|
114
|
-
###
|
|
115
|
-
|
|
116
|
-
| Переменная | По умолчанию | Описание |
|
|
117
|
-
|---|---|---|
|
|
118
|
-
| `ZAPRET2_MODE` | `docker` | Транспорт: `local`, `docker`, `ssh` |
|
|
119
|
-
| `ZAPRET2_CONTAINER_NAME` | `zapret2-openwrt` | Имя контейнера (режим docker) |
|
|
120
|
-
| `ZAPRET2_SSH_HOST` | — (обязательно для ssh) | SSH-хост |
|
|
121
|
-
| `ZAPRET2_SSH_USER` | `root` | SSH-пользователь |
|
|
122
|
-
| `ZAPRET2_SSH_KEY` | — (опционально) | Путь к SSH-ключу |
|
|
123
|
-
| `ZAPRET2_SSH_PORT` | `22` | SSH-порт |
|
|
124
|
-
|
|
125
|
-
## Tools (13)
|
|
126
|
-
|
|
127
|
-
### Определение системы
|
|
128
|
-
|
|
129
|
-
| Tool | Описание |
|
|
130
|
-
|---|---|
|
|
131
|
-
| `detectSystem` | Определение окружения: ОС, архитектура, init-система, WAN-интерфейс, DNS, NFQUEUE, контейнер |
|
|
132
|
-
|
|
133
|
-
### Управление сервисом
|
|
134
|
-
|
|
135
|
-
| Tool | Описание |
|
|
136
|
-
|---|---|
|
|
137
|
-
| `getStatus` | Статус сервиса: запущен ли, PID, количество nftables-правил, флаг enabled |
|
|
138
|
-
| `startService` | Запуск zapret2 (логи сохраняются в resources) |
|
|
139
|
-
| `stopService` | Остановка zapret2 (логи сохраняются в resources) |
|
|
140
|
-
| `restartService` | Перезапуск zapret2 (логи сохраняются в resources) |
|
|
141
|
-
|
|
142
|
-
### Конфигурация
|
|
46
|
+
### Tool
|
|
143
47
|
|
|
144
48
|
| Tool | Описание |
|
|
145
49
|
|---|---|
|
|
146
|
-
| `
|
|
147
|
-
| `updateConfig` | Обновление параметра конфига (key=value, снапшот сохраняется в resources) |
|
|
148
|
-
| `configureDns` | Настройка DNS-резолвера (resolv.conf или systemd-resolved) |
|
|
50
|
+
| `query-zapret-knowledge` | Поиск по базе знаний. Параметры: `topic` (строка), `tokens` (лимит, опционально) |
|
|
149
51
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
| `installZapret` | Полная установка: клонирование, скачивание бинарников, базовый конфиг |
|
|
156
|
-
| `runBlockcheck` | Запуск blockcheck2.sh для поиска рабочих сетевых стратегий (~5 мин, лог в resources) |
|
|
157
|
-
| `verifyBypass` | Проверка сетевой связности: DNS, HTTP, статус nfqws2 |
|
|
158
|
-
|
|
159
|
-
### Интеграция с десктопом
|
|
160
|
-
|
|
161
|
-
| Tool | Описание |
|
|
162
|
-
|---|---|
|
|
163
|
-
| `createSystemdService` | Создание systemd unit для автозапуска zapret2 на Linux-десктопе |
|
|
164
|
-
|
|
165
|
-
## Prompts (5)
|
|
52
|
+
```
|
|
53
|
+
query-zapret-knowledge({ topic: "split2 strategy" })
|
|
54
|
+
query-zapret-knowledge({ topic: "blockcheckw scan", tokens: 2000 })
|
|
55
|
+
query-zapret-knowledge({ topic: "troubleshooting dns" })
|
|
56
|
+
```
|
|
166
57
|
|
|
167
|
-
|
|
58
|
+
### Prompts
|
|
168
59
|
|
|
169
60
|
| Prompt | Описание |
|
|
170
61
|
|---|---|
|
|
171
|
-
| `setup-zapret` |
|
|
172
|
-
| `
|
|
173
|
-
| `find-bypass-strategy` | Поиск рабочей сетевой стратегии через blockcheck |
|
|
62
|
+
| `setup-zapret` | Пошаговая установка zapret2 |
|
|
63
|
+
| `find-bypass-strategy` | Поиск рабочей стратегии через blockcheckw |
|
|
174
64
|
| `troubleshoot` | Диагностика проблем |
|
|
175
|
-
| `
|
|
176
|
-
|
|
177
|
-
## MCP Resources
|
|
65
|
+
| `strategy-knowledge` | Полный справочник стратегий DPI bypass |
|
|
178
66
|
|
|
179
|
-
|
|
67
|
+
## Пример использования
|
|
180
68
|
|
|
181
|
-
|
|
182
|
-
- **Типы логов:** `blockcheck`, `service`, `config`
|
|
183
|
-
- **Хранение:** `~/.zapret2-mcp/logs/`
|
|
69
|
+
> "Настрой zapret2 на моём роутере, найди рабочую стратегию для youtube.com"
|
|
184
70
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Linux-десктоп
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
detectSystem → checkPrerequisites → installZapret → configureDns
|
|
198
|
-
→ createSystemdService → updateConfig(NFQWS2_ENABLE=1) → startService → verifyBypass
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### Поиск сетевой стратегии
|
|
202
|
-
|
|
203
|
-
```
|
|
204
|
-
stopService → runBlockcheck(domain) → прочитать лог resource
|
|
205
|
-
→ updateConfig(NFQWS2_OPT=...) → restartService → verifyBypass(domain)
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
### Диагностика
|
|
209
|
-
|
|
210
|
-
```
|
|
211
|
-
detectSystem → getStatus → getConfig → checkPrerequisites → verifyBypass(domain)
|
|
212
|
-
→ анализ результатов
|
|
213
|
-
```
|
|
71
|
+
Агент:
|
|
72
|
+
1. Вызывает `query-zapret-knowledge({ topic: "setup installation" })` — получает инструкции
|
|
73
|
+
2. Выполняет команды установки в терминале
|
|
74
|
+
3. Вызывает `query-zapret-knowledge({ topic: "blockcheckw scan" })` — узнаёт как искать стратегии
|
|
75
|
+
4. Запускает `blockcheckw scan -d youtube.com`
|
|
76
|
+
5. Вызывает `query-zapret-knowledge({ topic: "strategy selection criteria" })` — понимает как выбрать лучшую
|
|
77
|
+
6. Применяет стратегию в конфиг, запускает сервис
|
|
214
78
|
|
|
215
79
|
## Разработка
|
|
216
80
|
|
|
217
81
|
```bash
|
|
218
|
-
git clone https://github.com/
|
|
82
|
+
git clone --recurse-submodules https://github.com/rcd27/zapret2-mcp.git
|
|
219
83
|
cd zapret2-mcp
|
|
220
84
|
npm install
|
|
221
|
-
npm run build
|
|
222
|
-
npm
|
|
223
|
-
npm test # Unit-тесты (vitest)
|
|
224
|
-
npm run test:integration # Интеграционные тесты (требуется Docker)
|
|
85
|
+
npm run build
|
|
86
|
+
npm test
|
|
225
87
|
```
|
|
226
88
|
|
|
227
|
-
### Docker-окружение для разработки
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
cd docker
|
|
231
|
-
docker compose build && docker compose up -d
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
Контейнер `zapret2-openwrt`: OpenWrt SNAPSHOT, `privileged: true`, `network_mode: host`.
|
|
235
|
-
|
|
236
89
|
## Лицензия
|
|
237
90
|
|
|
238
91
|
MIT
|
package/build/index.js
CHANGED
|
@@ -1,74 +1,70 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { stopServiceTool } from "./tools/stopService.js";
|
|
9
|
-
import { restartServiceTool } from "./tools/restartService.js";
|
|
10
|
-
import { getConfigTool } from "./tools/getConfig.js";
|
|
11
|
-
import { updateConfigTool } from "./tools/updateConfig.js";
|
|
12
|
-
import { runBlockcheckTool } from "./tools/runBlockcheck.js";
|
|
13
|
-
import { checkPrerequisitesTool } from "./tools/checkPrerequisites.js";
|
|
14
|
-
import { installZapretTool } from "./tools/installZapret.js";
|
|
15
|
-
import { verifyBypassTool } from "./tools/verifyBypass.js";
|
|
16
|
-
import { detectSystemTool } from "./tools/detectSystem.js";
|
|
17
|
-
import { configureDnsTool } from "./tools/configureDns.js";
|
|
18
|
-
import { createSystemdServiceTool } from "./tools/createSystemdService.js";
|
|
19
|
-
import { removeZapretTool } from "./tools/removeZapret.js";
|
|
20
|
-
import { registerResources } from "./resources.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { resolve, dirname } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { KnowledgeIndex } from "./indexer.js";
|
|
21
8
|
import { registerPrompts } from "./prompts.js";
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
9
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
const knowledgeDir = resolve(__dirname, "..", "knowledge");
|
|
11
|
+
const index = new KnowledgeIndex(knowledgeDir);
|
|
25
12
|
const server = new McpServer({
|
|
26
13
|
name: "zapret2-mcp",
|
|
27
|
-
version: "0.
|
|
14
|
+
version: "0.4.0",
|
|
28
15
|
}, {
|
|
29
|
-
instructions: `zapret2-mcp
|
|
16
|
+
instructions: `zapret2-mcp is a knowledge server for zapret2 (DPI bypass tool by bol-van) and blockcheckw (fast strategy scanner by rcd27).
|
|
30
17
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
18
|
+
It provides contextual documentation and expert knowledge about:
|
|
19
|
+
- DPI bypass strategies (split2, disorder2, fake, fooling, etc.)
|
|
20
|
+
- zapret2 configuration and service management
|
|
21
|
+
- blockcheckw commands for parallel strategy discovery
|
|
22
|
+
- Installation workflows for Linux desktops, servers, and OpenWrt routers
|
|
23
|
+
- Troubleshooting common issues
|
|
36
24
|
|
|
37
|
-
|
|
38
|
-
Use
|
|
39
|
-
Use createSystemdService on systemd-based Linux desktops for service autostart.
|
|
25
|
+
Use the query-zapret-knowledge tool to search the knowledge base.
|
|
26
|
+
Use getPrompt for guided workflows: setup-zapret, find-bypass-strategy, troubleshoot, strategy-knowledge.
|
|
40
27
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
28
|
+
This server does NOT execute commands — it provides knowledge and guidance. The consuming agent executes commands directly.`,
|
|
29
|
+
});
|
|
30
|
+
server.tool("query-zapret-knowledge", "Search zapret2 and blockcheckw knowledge base by topic. Returns relevant documentation, strategy guides, configuration references, and troubleshooting information.", {
|
|
31
|
+
topic: z.string().describe("What to search for (e.g. 'split2 strategy', 'blockcheckw scan', 'troubleshooting dns', 'config nfqws2_opt')"),
|
|
32
|
+
tokens: z.number().optional().describe("Maximum approximate token count for the response (default: no limit)"),
|
|
33
|
+
}, async (args) => {
|
|
34
|
+
const results = index.query(args.topic, args.tokens);
|
|
35
|
+
if (results.length === 0) {
|
|
36
|
+
return {
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: "text",
|
|
40
|
+
text: `No results found for "${args.topic}". Try broader keywords like: strategies, config, blockcheckw, troubleshooting, setup, platforms.`,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const sections = results.map((entry) => {
|
|
46
|
+
const versionInfo = [
|
|
47
|
+
entry.zapret2Version && `zapret2: ${entry.zapret2Version}`,
|
|
48
|
+
entry.blockcheckwVersion && `blockcheckw: ${entry.blockcheckwVersion}`,
|
|
49
|
+
]
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
.join(", ");
|
|
52
|
+
return `## ${entry.title}${versionInfo ? `\n_Version: ${versionInfo}_` : ""}\n\n${entry.content}`;
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
content: [
|
|
56
|
+
{
|
|
57
|
+
type: "text",
|
|
58
|
+
text: sections.join("\n\n---\n\n"),
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
45
62
|
});
|
|
46
|
-
const tools = [
|
|
47
|
-
getStatusTool,
|
|
48
|
-
startServiceTool,
|
|
49
|
-
stopServiceTool,
|
|
50
|
-
restartServiceTool,
|
|
51
|
-
getConfigTool,
|
|
52
|
-
updateConfigTool,
|
|
53
|
-
runBlockcheckTool,
|
|
54
|
-
checkPrerequisitesTool,
|
|
55
|
-
installZapretTool,
|
|
56
|
-
verifyBypassTool,
|
|
57
|
-
detectSystemTool,
|
|
58
|
-
configureDnsTool,
|
|
59
|
-
createSystemdServiceTool,
|
|
60
|
-
removeZapretTool,
|
|
61
|
-
];
|
|
62
|
-
for (const tool of tools) {
|
|
63
|
-
server.tool(tool.name, tool.description, tool.schema.shape, tool.handler);
|
|
64
|
-
}
|
|
65
|
-
registerResources(server);
|
|
66
63
|
registerPrompts(server);
|
|
67
|
-
setOnLogSaved(() => server.sendResourceListChanged());
|
|
68
64
|
async function main() {
|
|
69
65
|
const transport = new StdioServerTransport();
|
|
70
66
|
await server.connect(transport);
|
|
71
|
-
console.error(`zapret2-mcp server started (
|
|
67
|
+
console.error(`zapret2-mcp knowledge server started (${index.all().length} knowledge entries indexed)`);
|
|
72
68
|
}
|
|
73
69
|
main().catch((error) => {
|
|
74
70
|
console.error("Fatal error:", error);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE3D,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,YAAY,CAAC,CAAC;AAE/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;;;;;;;;;;;;4HAY0G;CACzH,CACF,CAAC;AAEF,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,qKAAqK,EACrK;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6GAA6G,CAAC;IACzI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;CAC/G,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,yBAAyB,IAAI,CAAC,KAAK,mGAAmG;iBAC7I;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,MAAM,WAAW,GAAG;YAClB,KAAK,CAAC,cAAc,IAAI,YAAY,KAAK,CAAC,cAAc,EAAE;YAC1D,KAAK,CAAC,kBAAkB,IAAI,gBAAgB,KAAK,CAAC,kBAAkB,EAAE;SACvE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,MAAM,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;aACnC;SACF;KACF,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,CAAC,MAAM,CAAC,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,6BAA6B,CAAC,CAAC;AAC1G,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface KnowledgeEntry {
|
|
2
|
+
/** Relative path from knowledge root */
|
|
3
|
+
path: string;
|
|
4
|
+
/** Title from frontmatter */
|
|
5
|
+
title: string;
|
|
6
|
+
/** Tags from frontmatter */
|
|
7
|
+
tags: string[];
|
|
8
|
+
/** Full markdown content (without frontmatter) */
|
|
9
|
+
content: string;
|
|
10
|
+
/** zapret2 version from frontmatter */
|
|
11
|
+
zapret2Version?: string;
|
|
12
|
+
/** blockcheckw version from frontmatter */
|
|
13
|
+
blockcheckwVersion?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class KnowledgeIndex {
|
|
16
|
+
private knowledgeDir;
|
|
17
|
+
private entries;
|
|
18
|
+
constructor(knowledgeDir: string);
|
|
19
|
+
rebuild(): void;
|
|
20
|
+
/** Keyword-based search. Returns entries ranked by relevance. */
|
|
21
|
+
query(topic: string, maxTokens?: number): KnowledgeEntry[];
|
|
22
|
+
/** Get all entries (for listing) */
|
|
23
|
+
all(): KnowledgeEntry[];
|
|
24
|
+
private tokenize;
|
|
25
|
+
}
|
package/build/indexer.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync } from "fs";
|
|
2
|
+
import { join, relative } from "path";
|
|
3
|
+
function parseFrontmatter(raw) {
|
|
4
|
+
const match = raw.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
5
|
+
if (!match)
|
|
6
|
+
return { meta: {}, content: raw };
|
|
7
|
+
const meta = {};
|
|
8
|
+
for (const line of match[1].split("\n")) {
|
|
9
|
+
const idx = line.indexOf(":");
|
|
10
|
+
if (idx > 0) {
|
|
11
|
+
meta[line.slice(0, idx).trim()] = line.slice(idx + 1).trim();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return { meta, content: match[2] };
|
|
15
|
+
}
|
|
16
|
+
function collectMarkdownFiles(dir) {
|
|
17
|
+
const files = [];
|
|
18
|
+
for (const entry of readdirSync(dir)) {
|
|
19
|
+
const full = join(dir, entry);
|
|
20
|
+
const stat = statSync(full);
|
|
21
|
+
if (stat.isDirectory()) {
|
|
22
|
+
files.push(...collectMarkdownFiles(full));
|
|
23
|
+
}
|
|
24
|
+
else if (entry.endsWith(".md")) {
|
|
25
|
+
files.push(full);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return files;
|
|
29
|
+
}
|
|
30
|
+
export class KnowledgeIndex {
|
|
31
|
+
knowledgeDir;
|
|
32
|
+
entries = [];
|
|
33
|
+
constructor(knowledgeDir) {
|
|
34
|
+
this.knowledgeDir = knowledgeDir;
|
|
35
|
+
this.rebuild();
|
|
36
|
+
}
|
|
37
|
+
rebuild() {
|
|
38
|
+
this.entries = [];
|
|
39
|
+
const files = collectMarkdownFiles(this.knowledgeDir);
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const raw = readFileSync(file, "utf-8");
|
|
42
|
+
const { meta, content } = parseFrontmatter(raw);
|
|
43
|
+
this.entries.push({
|
|
44
|
+
path: relative(this.knowledgeDir, file),
|
|
45
|
+
title: meta.title ?? file,
|
|
46
|
+
tags: (meta.tags ?? "").split(",").map((t) => t.trim()).filter(Boolean),
|
|
47
|
+
content: content.trim(),
|
|
48
|
+
zapret2Version: meta["zapret2-version"],
|
|
49
|
+
blockcheckwVersion: meta["blockcheckw-version"],
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Keyword-based search. Returns entries ranked by relevance. */
|
|
54
|
+
query(topic, maxTokens) {
|
|
55
|
+
const keywords = this.tokenize(topic);
|
|
56
|
+
if (keywords.length === 0)
|
|
57
|
+
return this.entries;
|
|
58
|
+
const scored = [];
|
|
59
|
+
for (const entry of this.entries) {
|
|
60
|
+
let score = 0;
|
|
61
|
+
for (const keyword of keywords) {
|
|
62
|
+
const kw = keyword.toLowerCase();
|
|
63
|
+
// Title match (highest weight)
|
|
64
|
+
if (entry.title.toLowerCase().includes(kw))
|
|
65
|
+
score += 10;
|
|
66
|
+
// Tag exact match (high weight)
|
|
67
|
+
if (entry.tags.some((t) => t.toLowerCase() === kw))
|
|
68
|
+
score += 8;
|
|
69
|
+
// Tag partial match
|
|
70
|
+
if (entry.tags.some((t) => t.toLowerCase().includes(kw)))
|
|
71
|
+
score += 4;
|
|
72
|
+
// Content match (count occurrences, capped)
|
|
73
|
+
const contentLower = entry.content.toLowerCase();
|
|
74
|
+
let idx = 0;
|
|
75
|
+
let count = 0;
|
|
76
|
+
while ((idx = contentLower.indexOf(kw, idx)) !== -1) {
|
|
77
|
+
count++;
|
|
78
|
+
idx += kw.length;
|
|
79
|
+
}
|
|
80
|
+
score += Math.min(count, 5) * 2;
|
|
81
|
+
}
|
|
82
|
+
if (score > 0) {
|
|
83
|
+
scored.push({ entry, score });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
scored.sort((a, b) => b.score - a.score);
|
|
87
|
+
if (!maxTokens)
|
|
88
|
+
return scored.map((s) => s.entry);
|
|
89
|
+
// Approximate token limit (1 token ≈ 4 chars)
|
|
90
|
+
const charLimit = maxTokens * 4;
|
|
91
|
+
let totalChars = 0;
|
|
92
|
+
const result = [];
|
|
93
|
+
for (const { entry } of scored) {
|
|
94
|
+
const entryChars = entry.title.length + entry.content.length + 50;
|
|
95
|
+
if (totalChars + entryChars > charLimit && result.length > 0)
|
|
96
|
+
break;
|
|
97
|
+
result.push(entry);
|
|
98
|
+
totalChars += entryChars;
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
/** Get all entries (for listing) */
|
|
103
|
+
all() {
|
|
104
|
+
return this.entries;
|
|
105
|
+
}
|
|
106
|
+
tokenize(text) {
|
|
107
|
+
return text
|
|
108
|
+
.toLowerCase()
|
|
109
|
+
.replace(/[^\p{L}\p{N}\s_-]/gu, " ")
|
|
110
|
+
.split(/\s+/)
|
|
111
|
+
.filter((w) => w.length >= 2);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=indexer.js.map
|