MCP server for managing Tenda routers — devices, WiFi, parental controls, bandwidth
tenda-mcp-server
An MCP server for managing Tenda routers from any MCP-compatible client (Claude Desktop, Claude Code, etc.).
Talks to the router's web admin interface over HTTP — no firmware modification required. Tested against Tenda AC-series routers.
Features
- Devices — list connected devices, block/unblock by MAC or name, set per-device bandwidth limits
- WiFi — read settings, change SSID/password, hide/show SSID
- Parental controls — toggle per device, set allowed time schedule
- System — reboot, toggle remote web admin, view WAN/LAN/NAT settings
- Wireless repeating — read bridge config
Quickstart
You don't need to clone — npx will fetch and run the server straight from GitHub.
Claude Code (CLI)
claude mcp add tenda-router \
--env TENDA_ROUTER_IP=192.168.0.1 \
--env TENDA_ROUTER_PASSWORD=your-router-password \
-- npx -y github:manishv90/tenda-mcp-server
Claude Desktop
Add to claude_desktop_config.json (location: %APPDATA%\Claude\ on Windows, ~/Library/Application Support/Claude/ on macOS):
{
"mcpServers": {
"tenda-router": {
"command": "npx",
"args": ["-y", "github:manishv90/tenda-mcp-server"],
"env": {
"TENDA_ROUTER_IP": "192.168.0.1",
"TENDA_ROUTER_PASSWORD": "your-router-password"
}
}
}
}
Restart your client — the tools listed below will be available.
Local install (optional)
If you'd rather run from a local clone:
git clone https://github.com/manishv90/tenda-mcp-server.git
cd tenda-mcp-server
npm install
TENDA_ROUTER_PASSWORD=your-password node server.js
Then point your MCP client command at node and args at ["/absolute/path/to/server.js"].
Configuration
| Variable | Default | Description |
| --- | --- | --- |
| TENDA_ROUTER_IP | 192.168.0.1 | Router LAN IP |
| TENDA_ROUTER_PASSWORD | admin | Router admin password |
Find your router IP from your computer's gateway (ipconfig on Windows, route -n get default on macOS). The password is whatever you set during router setup — there's no factory default on modern Tenda firmware.
Tools
| Tool | Description |
| --- | --- |
| list_devices | List all connected devices |
| block_device / unblock_device | Block/unblock by MAC |
| block_by_name / unblock_by_name | Block/unblock by device name (partial match) |
| set_bandwidth_limit | Per-device upload/download caps |
| get_wifi_settings | Read WiFi config |
| set_wifi_password | Change WiFi password |
| set_wifi_ssid | Change WiFi network name |
| toggle_wifi | Hide/show SSID |
| get_parental_controls | Read parental control config |
| set_parental_control_device | Enable/disable parental controls per device |
| set_parental_schedule | Set allowed online time window |
| get_wan_info | WAN status |
| get_system_info | LAN, time, remote-web settings |
| set_remote_web_access | Toggle remote web management |
| reboot_router | Reboot the router |
| get_nat_settings | DMZ, port forwarding, UPnP, DDNS |
| get_wifi_relay | Wireless repeating config |
Requirements
- Node.js 18+ (uses top-level await and native fetch-era APIs)
- Network access to your router's web admin port (HTTP/80)
How it works
Tenda's web admin uses a simple challenge-based login: the client gets a random nonce from /goform/getstok, then posts MD5(base64(password) + nonce) to /login/Auth. The session cookie is reused for subsequent /goform/* GET/POST calls.
Some Tenda firmware returns HTTP responses with bare LF line endings, which Node's strict parser rejects — the server uses insecureHTTPParser: true to handle this.
Troubleshooting
Login failed — no cookie returned— wrongTENDA_ROUTER_PASSWORD, or your router is on a different IP. Try the password you use to log into the web admin.ECONNREFUSED/ETIMEDOUT—TENDA_ROUTER_IPis wrong, or you're not on the same network as the router. Confirm you can openhttp://<router-ip>in a browser.- Tool calls succeed but nothing changes — check
errCodein the response. Non-zero typically means the firmware rejected the request (e.g. an SSID with disallowed characters).
Compatibility
Built against a Tenda AC-series router. The endpoint paths (/goform/getQos, /goform/getWifi, etc.) are common across the AC line, but field names may differ on other models. PRs welcome.
License
MIT