MCP server for managing Keenetic routers (devices/DHCP/WAN) via the RCI JSON API — read tools plus guarded, opt-in write tools.
Server has 10 tools with clear verb-noun naming (list_*, set_*, pin_*, find_*, wan_*, rename_*, remove_*, reboot). Descriptions are present and moderately detailed (50-200 chars typical), explaining WHAT each tool does and key parameters. Input schemas are visible with type declarations and parameter descriptions. However, output schemas are NOT documented, LLMs cannot predict return structure. Error handling is minimal; no recovery guidance or actionable error messages. Write tools lack confirmation/dry-run patterns despite destructive risk (reboot, remove_static_lease). Parameter descriptions could be more precise on constraints (e.g., MAC format, IP range validation). No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification in the code.
Find an available IP in the LAN subnet (not in use by active leases or static reservations).
List active devices connected to the router (DHCP lease table): ip, mac, name, remaining lease time.
List port forwarding rules (UPnP + manual).
List static DHCP reservations — the 'ip dhcp host' lines in running-config.
Convert an active device's CURRENT IP into a static reservation in one step (no need to know the MAC). identifier: the device's IP, MAC, or a name fragment — looked up in the active DHCP lease table. ip: optional — pass a different IP to pin to. If empty, the device's current IP is used. Examples: pin_device("192.168.1.66") · pin_device("Raspberry Pi") · pin_device("PS5", "192.168.1.154")
Output schemas not documented. LLMs cannot predict return structure (fields, types, pagination). Forces agents to guess what data is available after each call.
Destructive tools (reboot, remove_static_lease) lack confirmation/dry-run pattern. No recovery guidance in error messages. Agents can trigger irreversible actions without safeguards.
Tool annotations missing. Code stratifies tools as READ_ONLY, WRITE, DESTRUCTIVE but does not expose readOnlyHint/destructiveHint in schema. LLMs cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Reboot the router.
Remove a static DHCP reservation by MAC address.
Rename a device in the web UI (set its 'known-host' display name). identifier: IP, MAC, or name fragment of the device to rename.
Assign a fixed IP to a MAC address (DHCP reservation) + save config. mac: aa:bb:cc:dd:ee:ff · ip: 192.168.1.x · name: optional dhcp-host label. NOTE: to change a device's DISPLAY name (web UI) use rename_device — this 'name' is only the internal label of the dhcp-host entry and does NOT set the known-host display name.
Show WAN interface status: IP, gateway, DNS, connection state, uptime.
Parameter constraints not formally declared. MAC format, IP range, and identifier matching rules documented in prose but not in schema enums/patterns. LLMs cannot validate before calling.
Error handling minimal. No recovery guidance (e.g., 'Try search_devices() first'). No categorization of retryable vs fatal errors. Stack traces or raw API errors would confuse LLMs.