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.
Files changed (102) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +42 -189
  3. package/build/index.js +52 -56
  4. package/build/index.js.map +1 -1
  5. package/build/indexer.d.ts +25 -0
  6. package/build/indexer.js +114 -0
  7. package/build/indexer.js.map +1 -0
  8. package/build/prompts.js +91 -224
  9. package/build/prompts.js.map +1 -1
  10. package/knowledge/blockcheckw/commands.md +149 -0
  11. package/knowledge/blockcheckw/overview.md +46 -0
  12. package/knowledge/config/migration-v1-to-v2.md +168 -0
  13. package/knowledge/config/nfqws2-options.md +149 -0
  14. package/knowledge/config/zapret2-config.md +104 -0
  15. package/knowledge/platforms/supported.md +45 -0
  16. package/knowledge/strategies/dpi-types.md +79 -0
  17. package/knowledge/strategies/fake-packets.md +97 -0
  18. package/knowledge/strategies/http-specific.md +57 -0
  19. package/knowledge/strategies/orchestration.md +59 -0
  20. package/knowledge/strategies/tcp-segmentation.md +93 -0
  21. package/knowledge/strategies/telegram-bypass.md +157 -0
  22. package/knowledge/strategies/udp-quic.md +61 -0
  23. package/knowledge/troubleshooting/common-issues.md +125 -0
  24. package/knowledge/troubleshooting/openwrt-conflicts.md +217 -0
  25. package/knowledge/troubleshooting/quic-issues.md +180 -0
  26. package/knowledge/troubleshooting/smart-tv-youtube.md +147 -0
  27. package/knowledge/tspu/architecture.md +57 -0
  28. package/knowledge/tspu/blocking-methods.md +83 -0
  29. package/knowledge/tspu/dpi-engine.md +55 -0
  30. package/knowledge/tspu/two-stage-blocking.md +59 -0
  31. package/knowledge/workflows/find-strategy.md +83 -0
  32. package/knowledge/workflows/setup.md +111 -0
  33. package/package.json +3 -2
  34. package/build/executor/docker.d.ts +0 -7
  35. package/build/executor/docker.js +0 -22
  36. package/build/executor/docker.js.map +0 -1
  37. package/build/executor/factory.d.ts +0 -2
  38. package/build/executor/factory.js +0 -27
  39. package/build/executor/factory.js.map +0 -1
  40. package/build/executor/index.d.ts +0 -6
  41. package/build/executor/index.js +0 -5
  42. package/build/executor/index.js.map +0 -1
  43. package/build/executor/local.d.ts +0 -5
  44. package/build/executor/local.js +0 -17
  45. package/build/executor/local.js.map +0 -1
  46. package/build/executor/ssh.d.ts +0 -13
  47. package/build/executor/ssh.js +0 -33
  48. package/build/executor/ssh.js.map +0 -1
  49. package/build/executor/types.d.ts +0 -8
  50. package/build/executor/types.js +0 -2
  51. package/build/executor/types.js.map +0 -1
  52. package/build/executorInstance.d.ts +0 -3
  53. package/build/executorInstance.js +0 -11
  54. package/build/executorInstance.js.map +0 -1
  55. package/build/logStore.d.ts +0 -12
  56. package/build/logStore.js +0 -76
  57. package/build/logStore.js.map +0 -1
  58. package/build/resources.d.ts +0 -2
  59. package/build/resources.js +0 -41
  60. package/build/resources.js.map +0 -1
  61. package/build/tools/checkPrerequisites.d.ts +0 -19
  62. package/build/tools/checkPrerequisites.js +0 -118
  63. package/build/tools/checkPrerequisites.js.map +0 -1
  64. package/build/tools/configureDns.d.ts +0 -35
  65. package/build/tools/configureDns.js +0 -110
  66. package/build/tools/configureDns.js.map +0 -1
  67. package/build/tools/createSystemdService.d.ts +0 -27
  68. package/build/tools/createSystemdService.js +0 -75
  69. package/build/tools/createSystemdService.js.map +0 -1
  70. package/build/tools/detectSystem.d.ts +0 -19
  71. package/build/tools/detectSystem.js +0 -89
  72. package/build/tools/detectSystem.js.map +0 -1
  73. package/build/tools/getConfig.d.ts +0 -27
  74. package/build/tools/getConfig.js +0 -30
  75. package/build/tools/getConfig.js.map +0 -1
  76. package/build/tools/getStatus.d.ts +0 -19
  77. package/build/tools/getStatus.js +0 -42
  78. package/build/tools/getStatus.js.map +0 -1
  79. package/build/tools/installZapret.d.ts +0 -31
  80. package/build/tools/installZapret.js +0 -95
  81. package/build/tools/installZapret.js.map +0 -1
  82. package/build/tools/removeZapret.d.ts +0 -27
  83. package/build/tools/removeZapret.js +0 -112
  84. package/build/tools/removeZapret.js.map +0 -1
  85. package/build/tools/restartService.d.ts +0 -19
  86. package/build/tools/restartService.js +0 -24
  87. package/build/tools/restartService.js.map +0 -1
  88. package/build/tools/runBlockcheck.d.ts +0 -31
  89. package/build/tools/runBlockcheck.js +0 -78
  90. package/build/tools/runBlockcheck.js.map +0 -1
  91. package/build/tools/startService.d.ts +0 -19
  92. package/build/tools/startService.js +0 -24
  93. package/build/tools/startService.js.map +0 -1
  94. package/build/tools/stopService.d.ts +0 -19
  95. package/build/tools/stopService.js +0 -24
  96. package/build/tools/stopService.js.map +0 -1
  97. package/build/tools/updateConfig.d.ts +0 -31
  98. package/build/tools/updateConfig.js +0 -54
  99. package/build/tools/updateConfig.js.map +0 -1
  100. package/build/tools/verifyBypass.d.ts +0 -35
  101. package/build/tools/verifyBypass.js +0 -111
  102. 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-сервер для управления [zapret2](https://github.com/bol-van/zapret2) инструментом обработки сетевых пакетов. Позволяет AI-агентам автоматизировать установку, настройку и диагностику zapret2 через [Model Context Protocol](https://modelcontextprotocol.io/).
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
- zapret2 поддерживает Windows нативно через [zapret-win-bundle](https://github.com/bol-van/zapret-win-bundle), но архитектура (WinDivert, `.cmd`-скрипты, другие пути) полностью отличается от Linux. Наш MCP-сервер работает только с Linux/OpenWrt-окружениями. Подробнее: [docs/windows-support.md](docs/windows-support.md).
9
+ **Сервер не выполняет команды** он отдаёт документацию и экспертизу. Агент читает и действует сам.
17
10
 
18
- ## Установка
11
+ ## Что внутри
19
12
 
20
- ```bash
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
- ```bash
27
- npx zapret2-mcp
28
- ```
29
-
30
- ## Настройка MCP-клиента
31
-
32
- ### Claude Desktop
33
-
34
- Добавить в `~/.claude/claude_desktop_config.json`:
21
+ ## Установка
35
22
 
36
- ```json
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
- ### Claude Code
27
+ ## Подключение
52
28
 
53
- Добавить в `.mcp.json` в корне проекта или в `~/.claude/mcp.json` глобально:
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
- Выполнение команд через `bash -c` на той же машине, где запущен MCP-сервер. Для Linux-десктопов и WSL2.
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
- | `getConfig` | Чтение конфига zapret2 (целиком или по ключу) |
147
- | `updateConfig` | Обновление параметра конфига (key=value, снапшот сохраняется в resources) |
148
- | `configureDns` | Настройка DNS-резолвера (resolv.conf или systemd-resolved) |
50
+ | `query-zapret-knowledge` | Поиск по базе знаний. Параметры: `topic` (строка), `tokens` (лимит, опционально) |
149
51
 
150
- ### Установка и диагностика
151
-
152
- | Tool | Описание |
153
- |---|---|
154
- | `checkPrerequisites` | Проверка окружения: инструменты, ОС, init-система, NFQUEUE, сеть |
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
- MCP-промпты — пошаговые инструкции для типичных сценариев:
58
+ ### Prompts
168
59
 
169
60
  | Prompt | Описание |
170
61
  |---|---|
171
- | `setup-zapret` | Установка с нуля (универсальная) |
172
- | `setup-desktop` | Установка на Linux-десктоп с systemd, DNS и автозапуском |
173
- | `find-bypass-strategy` | Поиск рабочей сетевой стратегии через blockcheck |
62
+ | `setup-zapret` | Пошаговая установка zapret2 |
63
+ | `find-bypass-strategy` | Поиск рабочей стратегии через blockcheckw |
174
64
  | `troubleshoot` | Диагностика проблем |
175
- | `overview` | Справочник по всем tools, resources и workflows |
176
-
177
- ## MCP Resources
65
+ | `strategy-knowledge` | Полный справочник стратегий DPI bypass |
178
66
 
179
- Tools сохраняют вывод в файлы для персистентной истории. Агент может возвращаться к предыдущим результатам и сравнивать прогоны.
67
+ ## Пример использования
180
68
 
181
- - **URI:** `zapret2://logs/{type}/{timestamp}`
182
- - **Типы логов:** `blockcheck`, `service`, `config`
183
- - **Хранение:** `~/.zapret2-mcp/logs/`
69
+ > "Настрой zapret2 на моём роутере, найди рабочую стратегию для youtube.com"
184
70
 
185
- ## Сценарии использования
186
-
187
- ### Роутер (OpenWrt по SSH)
188
-
189
- ```
190
- detectSystem checkPrerequisites installZapret updateConfig(NFQWS2_ENABLE=1)
191
- startService verifyBypass
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/your-org/zapret2-mcp.git
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 # TypeScript → build/
222
- npm run dev # MCP Inspector
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 { createExecutor } from "./executor/index.js";
5
- import { initExecutor } from "./executorInstance.js";
6
- import { getStatusTool } from "./tools/getStatus.js";
7
- import { startServiceTool } from "./tools/startService.js";
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
- import { setOnLogSaved } from "./logStore.js";
23
- const executor = createExecutor();
24
- initExecutor(executor);
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.2.0",
14
+ version: "0.4.0",
28
15
  }, {
29
- instructions: `zapret2-mcp provides tools to install, configure, and diagnose zapret2 a network packet processing tool for OpenWrt routers and Linux desktops.
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
- Key workflows:
32
- 1. Fresh install (router): checkPrerequisites installZapret → updateConfig(NFQWS2_ENABLE=1) → startService → verifyBypass
33
- 2. Fresh install (desktop): detectSystem → checkPrerequisites → installZapret → configureDns → createSystemdService → updateConfig(NFQWS2_ENABLE=1) → startService → verifyBypass
34
- 3. Find bypass strategy: stopService runBlockcheck(domain) → read log resource → updateConfig(NFQWS2_OPT=...) → restartService → verifyBypass(domain)
35
- 4. Troubleshoot: detectSystem getStatus getConfig checkPrerequisites → verifyBypass(domain) → analyze
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
- Always start with detectSystem to determine the target environment (OS, init system, WAN interface).
38
- Use configureDns to set up a reliable DNS resolver.
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
- Service management (start/stop/restart) saves logs to resources. updateConfig saves a config snapshot before changes.
42
- runBlockcheck is a heavy operation (~5 min) that saves full output to resources for later analysis.
43
- Use listResources to browse historical logs at zapret2://logs/{type}/{timestamp}.
44
- Use getPrompt for step-by-step guidance: setup-zapret, setup-desktop, find-bypass-strategy, troubleshoot, overview.`,
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 (executor: ${executor.label})`);
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);
@@ -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;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAClC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;IACE,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;;;;;;;;;;;;;;;oHAekG;CACjH,CACF,CAAC;AAEF,MAAM,KAAK,GAAG;IACZ,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,kBAAkB;IAClB,aAAa;IACb,gBAAgB;IAChB,iBAAiB;IACjB,sBAAsB;IACtB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,wBAAwB;IACxB,gBAAgB;CACjB,CAAC;AAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;IACzB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,eAAe,CAAC,MAAM,CAAC,CAAC;AACxB,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAEtD,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,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;AAC5E,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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
+ }
@@ -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