NetCraze-mcp
Manage and monitor a NetCraze router via MCP, with read-only diagnostics and safe-mode-gated writes for system, network, DNS, and static host changes.
Get router model, firmware, uptime, and system summary; reboot the router.
Inspect interfaces, connected clients, Wi-Fi associations, routes, WAN status/speed, and interface speed.
Set an interface up/down.
Manage domain lists: list/get/create/delete, set entries, add/remove domains.
Manage DNS routes: list/get, add, delete.
Manage static DNS hosts: list, add, delete.
Note: README documents many additional tools (static routes, components, USB/storage, shares, backup, WireGuard, IPsec, packet capture, diagnostics, raw RCI), but the provided server schema only exposes the subset above.
Write operations are blocked by default via NETCRAZE_SAFE_MODE=true unless disabled.
Allows managing NetCraze (a Keenetic-compatible) router via RCI HTTP API, providing tools for static DNS hosts, static IP routes, system info, reboots, interfaces, connected clients, WiFi associations, speeds, WAN status, domain lists, DNS routing, USB storage, SMB shares, printers, firmware/component management, and backup/export functionality.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@NetCraze-mcp list static hosts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
NetCraze-mcp
MCP-сервер для роутеров NetCraze — управление через Cursor и другие MCP-клиенты (RCI HTTP API).
Форк community-проекта Patr56/keenetic-mcp (MIT), адаптированный под NetCraze.
Инструменты
Static DNS hosts (NetCraze)
Инструмент | Описание |
| Список static hosts из |
| Добавить host и сохранить конфигурацию |
| Удалить host по имени и сохранить конфигурацию |
Static IP routes (NetCraze)
Инструмент | Описание |
| Список configured static routes ( |
| Добавить |
| Удалить по destination CIDR или index и save |
Компоненты, USB/хранилище, шары
Инструмент | Описание |
| NDMS-компоненты; |
| Версия прошивки, sandbox/channel, список установленных компонентов |
| Поставить компонент ( |
| Удалить компонент ( |
| Накопители из |
| Безопасно извлечь USB ( |
| SMB/CIFS-шары из |
| Создать/удалить SMB-шару и save |
| Принтеры из |
Remount USB после
unmount_usb— переподключением диска (отдельной RCI mount-команды нет).
Backup / export
Инструмент | Описание |
| Универсальная выгрузка системного файла ( |
| Экспорт набора системных файлов + metadata роутера (model/version/timestamp) |
Бинарник прошивки ~20–25 MB. По умолчанию в ответе только sha256/size; для файла укажите
save_path. Параметрsandboxдобавляет метаданные канала обновлений, но .bin — только текущая установленная прошивка.
WireGuard
Инструмент | Описание |
| Список |
| Детали одного интерфейса (без PrivateKey/PresharedKey) |
| Импорт из |
| up/down без удаления + save |
| Удалить интерфейс + save |
Пример:
add_wireguard_from_conf(
conf="<содержимое peer_xxx.conf>",
description="Cloudflare WARP",
enabled=true
)
→ { "id": "Wireguard3", "description": "Cloudflare WARP", "address": "10.13.14.2", ... }
add_dns_route(list_name="Gemini", interface="Wireguard3", auto=true, enabled=true)PrivateKey/PresharedKey никогда не возвращаются и маскируются в ошибках. Импорт идёт через
/rci/interface/wireguard/import(как UI «из файла»).
IPsec site-to-site (read-only)
Инструмент | Описание | RCI на NDMS 5.01 |
| Список S2S: id, enabled, connected/state, remote gateway, IKE version |
|
| Детали (ID, subnets, IKE/ESP, DPD, nailed-up, autoconnect, Phase1/2); PSK → только | те же |
| IKE/ESP/DH алгоритмы (aes-cbc-256, sha256, DH14/modp2048…) | UI static (live catalog на 5.01 нет) |
| SA: legacy | см. ответ |
| Dump ipsec + site-to-site + crypto_map без секретов |
|
| Dump crypto/sc crypto/ike без секретов |
|
На NDMS 5.01 путь
show/crypto/ipsec/saотсутствует (404); статус туннелей — вshow/crypto/map.
IPsec site-to-site WRITE (0.10.0)
Инструмент | Описание |
| Создать/обновить S2S (idempotent по |
| Clone профиля (PSK только в памяти); confirm=true |
| Rename без PSK в args (create+delete в памяти); confirm=true |
| Full-replace RMW; |
| Только |
| Flat |
Каноническая последовательность:
1) POST /rci/ [{"crypto":{"ipsec":{"site-to-site":{ "name":"…", …все поля + lifetimes… }}}}]
2) parse: crypto map <name> enable # или: no crypto map <name> enable
3) system.configuration.saveПример (NC → strongSwan IKEv2 PSK):
create_ipsec_s2s(
name="nc-office",
peer="45.89.63.73",
ike_psk="<PSK>",
local_id="office-nc1812",
remote_id="weaselcloud-ipsec",
local_networks="192.168.1.0/24",
remote_networks="1.1.1.1/32",
force_encaps=true,
enable=true,
save=true,
confirm=true
)Known limitations (NDMS 5.01):
Nested
site-to-site.{name}→not found— только flat с полемnamePartial
{"name","enable":true}в site-to-site JSON сбрасывает peer/autoconnect — запрещено в toolsshow/scдо save устаревший; verify сначалаshow/rcike-prfможет остаться""в RC;force-encapsможет отсутствовать в RC после set (для double-NAT смотриshow/crypto/map)crypto map X disableне существует → используемno crypto map X enablePSK никогда не возвращается (
has_pskonly); нуженconfirm=true+ writable (не safe-mode)
0.14.0 — multi-router, txn, CLI parse, policy/FQDN sync, granular WG
Инструмент | Описание |
| Снапшот redacted RC, diff, подсказки отката, явный save |
| baseline → parse (interface submode sessions) → verify; |
| Structured RCI MSS clamp ( |
| Whitelist parse / help без |
| Таблицы 4097+, fwmark, флаг ON_LINK_DEFAULT |
| FQDN→/32 с тегом |
| update |
| Пустые WG/ACL; handshake двух роутеров |
| Тело ACL + mutate через batch |
| security-level; UDP listen = unsupported + косвенные признаки |
| Ping с src_router; optional capture на dst |
Поведение write: все write-tools по умолчанию save=False. Сохранение — save_config(confirm=true) или save=true на операции.
Multi-router (один процесс):
export NETCRAZE_ROUTERS='{
"router.home": {"host":"192.168.10.1","user":"admin","password":"…",
"fallback_hosts":["10.211.114.1","https://xxx.keenetic.link"]},
"router.websun": {"host":"192.168.1.1","user":"admin","password":"…",
"fallback_hosts":["10.211.114.2"]}
}'Каждый tool принимает опциональный router="router.home". NETCRAZE_HOST может быть https://host:port; NETCRAZE_VERIFY_TLS=false при необходимости.
403 vs auth: GET /auth → 403 без X-NDM-Challenge = RCI_FORBIDDEN_BY_SECURITY_LEVEL (ACL/security-level интерфейса), не неверный пароль.
Known NDMS 5.1.6 limitations
FQDN → ZeroTier/VPN gateway ignored: dns-proxy route с
gatewayматериализуется как0.0.0.0/0 via 0.0.0.0 <iface>(ON_LINK_DEFAULT). Workaround:plan_fqdn_static_sync/32.?help не работает («no such command: ?») — используйтеcli_help(help <cmd>+ неполная команда).403 по ZeroTier при
security-level public/ без permit в_WEBADMIN_ZeroTier0.L7 с роутера (curl/tcp/exit-IP) — нет в RCI; tools честно
unsupported.UDP listen sockets — RCI не отдаёт;
check_udp_listen= unsupported + косвенные признаки.
VPN datapath diagnostics (0.13.0)
Инструмент | Статус на NDMS 5.01 |
| handshake age, rx/tx, endpoint, keepalive, peer_online |
| rx/tx/errors/drops + optional delta |
| domain-list → dns-proxy interface |
| LPM show/ip/route + dns hint |
| честная матрица / каталог RCI |
| фильтр NAT sessions / RO hotspot hosts |
| start→stop→summary→cleanup ( |
| unsupported (нет tools.curl/tcp) — явный ответ + fallbacks |
Packet capture / monitor (0.12.0)
Инструмент | Описание |
| monitor installed / available / running + rci_paths |
| инстансы по интерфейсу |
| install |
| create+filter+enable; |
|
|
| summary (pcap parse) или pcap на диск via |
| удалить instance |
NDMS: start=enable, stop=no enable; BPF в кавычках; pcap часто gzip.
IPsec runtime bring-up (0.11.0 / hotfix 0.11.1 / 0.11.2)
Инструмент | Описание |
| Read-only: enabled / ike_state / state / endpoints / map.connect |
| Read-only checklist + |
| Read-only фильтр |
| Read-only: установлен ли |
| Rename S2S без передачи PSK агенту (PSK только в памяти) |
| Clone с |
0.11.1: get_running_config_redacted redact’ит crypto ike key …; runtime endpoints одинаковы в diagnose/get; diagnose не врёт «IKE не стартовал», если charon CONNECTING.
0.15.2: CLI safety — deny-list no interface rollback; rollback_on_fail default false; interface submode sessions; set_interface_tcp_adjust_mss via RCI (incident: MSS clamp must not delete WG).
0.15.1: polish live acceptance — expected_dst_out=iface SNAT + gateway_configured; one matched policy[] table; batch expect=WAN→PASS/path=WAN + name; compact wireguard_counter_delta.
0.15.0: sc/rc honesty (source/dirty/applied_to/persisted); get_domain_list defaults to rc; diff_sc_rc; explain_policy_path / verify_flow_path / verify_flow_path_batch; domain_list_covers_ip + list_dns_route_metadata; WG AllowedIPs + add_wireguard_allowed_ips + wireguard_counter_delta; get_conntrack src+dst/path_class/watch; probe_tcp (ICMP+NAT only); suggest_telegram_cidrs; save_config post-check sc==rc.
0.14.0: multi-router + https/fallback; save=False default; snapshot/diff/rollback/apply_cli_batch; CLI parse/help; policy tables + ON_LINK_DEFAULT; FQDN→/32 sync; granular WireGuard; ACL/security; cross-router reachability.
0.13.1: get_conntrack(host/port/protocol) + RO get_hotspot; pip metadata synced.
0.13.0: VPN datapath explain/runtime/counters; L7 probes marked unsupported on NDMS.
0.12.0: packet capture lifecycle (monitor enable/no enable + /ci/temp pcap).
0.11.3: diagnose warnings согласованы с conntrack; clone/rename не шлют force-encaps если absent у source.
0.11.2: rename_ipsec / clone_ipsec / source_name; get_ike_conntrack; ike_phase=none при 0 up, 0 connecting; ike_prf="" omit; get_packet_capture_status.
Research (websun NC-1812, NDMS 5.01 + ipsec 6.0.1-6) — runtime initiate NOT FOUND:
Флаг / действие | Семантика |
| Config: map enabled. ≠ IKE_SA_INIT |
| Config: «enable autoconnection» (≈ autoconnect). ≠ initiate |
| «active renegotiation» — держать SA после установления, не первый bring-up |
UI Connect button | Нет — только toggle enable |
| Нет таких CLI |
Вывод (семантика B): после enable+autoconnect+nail-up ike_state может остаться UNDEFINED (UI NO_LINK) до interesting traffic на remote TS и/или пока peer сам не инициирует.
Поэтому connect_ipsec / disconnect_ipsec не публикуются (нет честного runtime endpoint).
Последовательность NC→strongSwan:
create_ipsec_s2s → set_ipsec_state(enable) → diagnose_ipsec_bringup
→ трафик LAN(local TS) → remote TS ИЛИ swanctl initiate на VPS
→ get_ipsec_runtime / show_ipsec_saRaw RCI + аудит (read-only, 0.9.0)
Инструмент | Описание |
| GET |
| То же + deny-list путей с секретами |
| WAN: IP/mask/gw/DNS/MTU/тип, |
| Public IP из NDNS/CrazeDNS или |
| Сеть/IP/status + peers (без tokens) |
| Единый список WG/OpenVPN/PPTP/L2TP/SSTP/IPsec/GRE/ZT… |
|
|
| DNS-routes + static routes + ip rule/policy |
| access-list + security-level |
| port forwards + UPnP + count conntrack (без полного dump) |
| фильтр live NAT (host/src/dst/port/protocol/path_class/only_unreplied/group_by/watch_seconds) |
| dns-proxy policy path (list hit → route → table → expected dst_out); не FIB-only |
| одна карточка: list + NAT + AllowedIPs + handshake + verdict A–G |
| batch regression (Claude/YouTube→WG0, ya.ru→WAN) |
| sc≠rc для domain-lists / dns-routes / WG AllowedIPs |
| CIDR/IP match + linked dns-route interface |
| таблица list_key/name/route/iface/counts/sc_dirty |
| additive merge AllowedIPs (reject 0.0.0.0/0) |
| snapshot → sleep → Δ rx/tx/handshake |
| ICMP+conntrack only (TCP connect unsupported on NDMS) |
| suggest-only CIDR из core.telegram.org (+ backup 95.161.64.0/20) |
| RO hotspot hosts (policy/access/wifi) |
| Диагностика с лимитами (ping count≤5; traceroute hops≤15) |
|
|
| auth/firmware/uptime/WAN + понятные ошибки (timeout/auth/HTTP) |
| Один NDMS-компонент: installed/version/deps |
WRITE только у существующих
set_*/add_*/delete_*/reboot/ components (и только вне safe-mode). Диагностические tools никогда не меняют конфиг.
Система, сеть, DNS-маршрутизация (upstream)
get_system_info, reboot, get_interfaces, get_interface, get_connected_clients, get_wifi_associations, get_speed, get_routes, get_wan_status, get_wan_speed, get_domain_lists, get_domain_list (default rc; saved=true → sc; always source/dirty), create_domain_list, delete_domain_list, set_domain_list, add_domains, remove_domains, get_dns_routes, add_dns_route, delete_dns_route, set_interface_state
Write-tools возвращают applied_to=rc, persisted, dirty — added/created только если rc реально изменился. save_config после save проверяет sc==rc.
Related MCP server: vyos-mcp
Установка
cd NetCraze-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Переменные окружения
Переменная | По умолчанию | Описание |
| — | IP роутера (обязательно) |
|
| Логин RCI |
| — | Пароль (обязательно) |
|
| Блокировать write-инструменты |
| — | Путь к файлу creds (для Cursor) |
Подключение в Cursor
1. Creds — секреты вне репозитория
По одному файлу creds на каждый роутер:
mkdir -p ~/.config/mcp-netcraze
chmod 700 ~/.config/mcp-netcraze
cp examples/creds.router.home.example ~/.config/mcp-netcraze/creds.router.home
cp examples/creds.router.work.example ~/.config/mcp-netcraze/creds.router.work
cp examples/run-mcp.sh ~/.config/mcp-netcraze/run-mcp.sh
chmod 600 ~/.config/mcp-netcraze/creds.router.*
chmod 700 ~/.config/mcp-netcraze/run-mcp.sh
# заполните NETCRAZE_HOST и NETCRAZE_PASS в каждом creds-файлеПароль только в creds.router.*, не в mcp.json.
2. Конфиг ~/.cursor/mcp.json
Вариант A (0.14.0) — один процесс, multi-router: задайте NETCRAZE_ROUTERS (JSON) и вызывайте tools с router="router.home" / router="router.websun".
Вариант B — два MCP-сервера (как раньше). В mcp.json только путь к creds:
{
"mcpServers": {
"router.home": {
"command": "$HOME/.config/mcp-netcraze/run-mcp.sh",
"env": {
"NETCRAZE_CREDS_FILE": "$HOME/.config/mcp-netcraze/creds.router.home"
}
},
"router.work": {
"command": "$HOME/.config/mcp-netcraze/run-mcp.sh",
"env": {
"NETCRAZE_CREDS_FILE": "$HOME/.config/mcp-netcraze/creds.router.work"
}
}
}
}run-mcp.sh читает NETCRAZE_CREDS_FILE и подгружает HOST/USER/PASS/Safe mode оттуда.
3. Проверка
Перезапуск Cursor (Cmd+Q)
Settings → Tools & MCPs →
router.homeиrouter.workзелёныеВ чате указывайте сервер явно:
«На router.home покажи static hosts»
«На router.work добавь host …»
Safe mode
NETCRAZE_SAFE_MODE=true(или не задано) → write-инструменты блокируютсяДля записи:
export NETCRAZE_SAFE_MODE="false"в нужном creds-файле
Разработка
netcraze_mcp/
client.py # NetCrazeClient, auth, RCI
config.py # safe_mode (по умолчанию true)
server.py # FastMCP init, main()
tools/
system.py # get_system_info, reboot
network.py # interfaces, clients, WAN, routes
dns_routes.py # domain lists, DNS routing
static_hosts.py # list/add/delete static hosts
static_routes.py # list/add/delete static IP routes
components.py # list_components, get_firmware_info
storage.py # list_usb_storage, list_shares, list_printers
backup.py # download_system_file, export_backup
wireguard.py # list/get/add_from_conf/set_state/delete WireGuard
ipsec.py # list/get/proposals/show_* IPsec S2S (read-only)
tests/
test_tools.pypytestНе удалось реализовать из‑за лимитов RCI (с доказательствами)
Запрос | Почему нельзя | Доказательство / обход |
HTTP/TCP/exit-IP/speed с роутера | Нет | Live: L7 tools → |
bare IP «куда уйдёт» через | FIB main table ≠ dns-proxy policy |
|
SSH/tcpdump на HAPP (.254) | MCP не читает SSH-ключи | Вне скоупа; host SSH вручную |
DNS cache inspect/flush | Часто 404 / нет стабильного RCI | Нереалистично на 5.1.6 |
| Синтаксис не документирован; | Только после |
Список listening UDP sockets | RCI не отдаёт сокеты |
|
Entware curl helper | Осознанный риск (shell на роутере) | Вне скоупа MCP |
Полный dump | Текстовый шум, огромный |
|
auto-apply Telegram CIDR | Только suggest |
|
CLI rollback | Удаляет весь интерфейс | Deny-list; |
Лицензия
MIT (на базе upstream Patr56/keenetic-mcp).
Available Tools
20 toolsadd_domainsD
Inputs: name (required), domains (required).
add_static_hostC
Add static DNS host and save configuration.
Inputs: ip (required), host (required).
create_domain_listD
Inputs: name (required), entries.
delete_domain_listD
Inputs: name (required).
delete_static_hostC
Delete static DNS host by name and save configuration.
Inputs: host (required).
get_connected_clientsD
Inputs: no named parameters. Returns: result
get_domain_listsD
Inputs: no named parameters. Returns: result
get_interfaceD
Inputs: name (required).
get_interfacesD
Inputs: no named parameters. Returns: result
get_routesD
Inputs: no named parameters. Returns: result
get_speedD
Inputs: interval.
get_system_infoA
Get router model, firmware version, uptime and system summary.
Inputs: no named parameters.
get_wan_speedD
Inputs: no named parameters. Returns: result
get_wan_statusD
Inputs: no named parameters.
get_wifi_associationsD
Inputs: no named parameters. Returns: result
list_static_hostsC
List static DNS hosts from show dns-proxy, filtered by private IP ranges.
Inputs: order, sort_by. Returns: result
rebootA
Reboot the router. The router will be unreachable for ~30–60 seconds.
Inputs: no named parameters.
remove_domainsD
Inputs: name (required), domains (required).
set_domain_listD
Inputs: name (required), entries (required).
set_interface_stateD
Inputs: up (required), name (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 20 tools
Tool names are somewhat distinct but many have empty descriptions, causing ambiguity between similar tools like get_interfaces vs get_interface, and the multiple domain list tools (get_domain_lists, set_domain_list, add_domains, etc.) are hard to differentiate without descriptions.
Most tools use snake_case verb_noun pattern, but verbs vary inconsistently (get, set, add, remove, create, delete, list, reboot) and 'reboot' lacks a noun. The mix of 'get' and 'list' prefixes adds inconsistency.
20 tools is a reasonable number for router management, covering system info, network interfaces, speed tests, DNS, and static hosts without being excessive. Slightly high but well-scoped.
Covers monitoring (system, interfaces, speed, routes) and DNS management (domain lists, static hosts), but lacks wireless configuration, firmware updates, or port forwarding tools, leaving notable gaps for full router management.
Maintenance
Related MCP Connectors
MCP server for tracking parcels using the NetCourier tracking service.
MCP server for network documentation, generated by doc2mcp.
MCP gateway and cloud hosting for MCP servers, agents and apps like RAG, managed from your agent.
Related MCP Servers
- AlicenseAqualityAmaintenanceProduction-grade MCP server for MikroTik RouterOS with secure AI-native network automation.133458 npm85MIT
- AlicenseAqualityDmaintenanceMCP server for managing VyOS routers via the VyOS HTTP API, allowing AI assistants to read config, set interfaces, firewall rules, VPNs, and more.172MIT
- FlicenseNot gradedqualityDmaintenanceMCP server with tools for managing routers, enabling network control through natural language.1-
- FlicenseNot gradedqualityDmaintenanceMCP server for MikroTik RouterOS with multi-router support, environment-based auto-load, split read/write architecture, and selectable runtime modes: readonly, safe-write, full.1-