AsusWRT MCP
Provides secure, SSH-based administration of ASUS AsusWRT and AsusWRT-Merlin routers, including read-only monitoring of network, wireless, clients, services, security, and VPN status, plus guarded mutations such as restarting services, toggling radios, managing port forwarding, DHCP reservations, and parental controls.
Enables monitoring of OpenVPN server status and toggling the OpenVPN server on or off on the router.
Allows monitoring of WireGuard client status and connecting, disconnecting, or restarting existing WireGuard client slots on the router.
ASUSWRT MCP
mcp-name: io.github.x1pher/asuswrt-mcp
A community-maintained independent downstream of teefloo/asuswrt-mcp for secure, controlled administration of AsusWRT and AsusWRT-Merlin routers over SSH. It is maintained as its own product and release line, while retaining clear upstream provenance. It is not affiliated with or endorsed by ASUS or the upstream project.
Why this downstream exists
The upstream baseline already provides a strong allowlisted SSH-based MCP surface. This independent downstream exists because broader day-to-day router observability and several ASUS-specific correctness fixes were needed without adding arbitrary SSH/NVRAM access or exposing sensitive router data. It follows its own roadmap, release verification, package identity, and safety boundary rather than using upstream as the active release line.
Compared with the pinned upstream baseline, the current candidate expands the surface from 47 to 68 tools while keeping mutations guarded:
19 additional read tools for firewall posture, per-radio Wi-Fi configuration and scheduling, DNS Filter/Privacy, QoS, AiProtection, AiMesh, VLAN/guest segmentation, Dual-WAN, WPS, Smart Connect/roaming, firmware-update status, VPN-client health, WAN watchdog, logging, traffic-monitoring posture and auxiliary-service posture.
Bounded WireGuard client management for connect, disconnect and restart of already-configured client slots only; profile creation/import/edit and credential exposure remain excluded.
Correctness fixes for ASUS SSH enable-state semantics, WireGuard-client detection and bulk NVRAM reads where empty values could otherwise corrupt the following key/value record.
Data minimization for sensitive families: status/count metadata is preferred over resolver values, VPN peer/endpoint data, client policy bodies, credentials or raw rule payloads.
Generic correctness fixes can be proposed upstream independently. This maintained downstream owns the broader opinionated capability and safety boundary described above. See UPSTREAM.md for the pinned provenance.
Related MCP server: router-mcp
Overview
The server gives MCP clients a typed interface to monitor and manage AsusWRT routers. It operates exclusively over SSH using allowlisted operations: no arbitrary command execution, no firmware modifications and no factory-reset capability.
Features
See the complete tool reference for every tool, access classification, inputs and mutation semantics.
Read-Only Monitoring (55 tools)
Category | Tools |
Identity & Health | Router model, firmware version, firmware update status, uptime, load, memory |
Network | LAN/WAN details, Dual-WAN status, VLAN/guest segmentation, DNS config, DNS Privacy/DNSSEC status, IPv6 status, routing table, QoS status, sanitized traffic-monitoring posture |
Clients | Connected clients, DHCP leases, ARP neighbors |
Wireless | Radio status, SSIDs, guest networks, WPS state, Smart Connect/roaming, advanced radio features, sanitized per-radio scheduling state, client counts per band, AiMesh status |
Services | Running processes, open ports, cron jobs, sanitized local/remote syslog posture, auxiliary FTP/media/WebDAV/cloud/modem/printer/legacy-VPN posture |
Storage | USB devices, mounts, partitions, filesystem usage |
Security | Firewall posture, port-trigger/DMZ/NAT-passthrough state, UPnP, DDNS, Samba status, conntrack usage, AiProtection status |
VPN | OpenVPN server, WireGuard, sanitized VPN client slot/profile counts and VPN Fusion policy counts |
Administration | Web admin ports, SSH/telnet access settings |
Diagnostics | SSH TCP/banner/auth diagnostics, config snapshot |
Mutation Tools (with safety guards)
All mutation tools require:
confirm: trueparameterASUSWRT_ALLOW_MUTATIONS=trueenvironment variableSupport for
dry_run: trueto preview changes
Tool | Description |
| Restart allowlisted services (httpd, firewall, wireless, dnsmasq, etc.) |
| Enable/disable DHCP server |
| Enable/disable UPnP |
| Enable/disable Wi-Fi radio bands |
| Enable/disable guest Wi-Fi |
| Toggle LAN access for guest Wi-Fi |
| List, add, remove, enable/disable port forwarding rules |
| Enable/disable OpenVPN server |
| Connect/disconnect/restart an already-configured WireGuard client slot |
| List, block, unblock, remove parental control rules |
| Toggle block-all mode |
| List, add, remove DHCP static reservations |
Safety Model
No arbitrary SSH: Only allowlisted commands are executed via NVRAM and service calls
No firmware operations: No flash, reset, or bootloader access
Secret redaction: Passwords and sensitive data are never exposed in tool responses
Dry-run support: Every mutation can be previewed before applying
Confirmation required: Mutations require explicit
confirm=TrueSSH-only transport: No exposure of the router's web API
Feedback and contributions
Use GitHub Issues for bug reports and feature requests after publication, and pull requests for proposed changes. See CONTRIBUTING.md. Security issues must follow SECURITY.md, and release changes are summarized in CHANGELOG.md.
Prerequisites
Python 3.11+
An AsusWRT or AsusWRT-Merlin router with SSH access enabled
The router SSH host key pre-verified in the local SSH
known_hostsstore; unknown host keys are rejectedNetwork connectivity from the MCP client to the router
Compatibility
The maintained repository verifier tests the complete source contract on Python 3.11 and Python 3.13. The accepted local runtime uses Python 3.12, so the current 3.11-3.13 interpreter range is exercised across verification and deployment.
The v0.2.0 pre-publication candidate was live-accepted against a stock ASUSWRT runtime that identifies itself as XT8PRO with firmware 388_24854-g9c246e8. The v0.2.1 candidate adds mandatory SSH host-key verification and must pass the same live acceptance before publication. The implementation also preserves upstream AsusWRT-Merlin compatibility assumptions where they remain valid, but this project does not claim that all ASUS router models or all AsusWRT/AsusWRT-Merlin firmware versions have been tested. Use the documented safety guards and validate behavior on other firmware families before relying on mutation tools.
Installation
1. Clone and setup
git clone https://github.com/X1pheR/asuswrt-mcp.git
cd asuswrt-mcp
# Create virtual environment
python -m venv .venv
# Activate (Linux/macOS)
source .venv/bin/activate
# Activate (Windows)
.venv\Scripts\activate
# Install dependencies
pip install -e .2. Configure environment
# Copy example configuration
cp .env.example .env
# Edit with your router credentials
# Use your favorite editor:
notepad .env # Windows
nano .env # Linux/macOS3. Configure .env
# Required: Router connection
ASUSWRT_HOST=192.168.1.1
ASUSWRT_SSH_USERNAME=admin
# Choose one SSH authentication method; key authentication is recommended.
ASUSWRT_SSH_KEY_FILE=~/.ssh/id_ed25519
# ASUSWRT_SSH_PASSWORD=your_password
# Optional: Enable mutations (disabled by default)
# ASUSWRT_ALLOW_MUTATIONS=true
# Optional: Connection settings
# ASUSWRT_SSH_PORT=22
# ASUSWRT_TIMEOUT_SECONDS=10Before starting the MCP server, verify the router's SSH host-key fingerprint through a trusted channel and add it to the account's normal SSH known_hosts store (for example by making one verified OpenSSH connection). The server never auto-accepts an unknown or changed host key.
Usage
Run the MCP server
# Standard stdio mode
python -m asuswrt_mcp.server
# Or use the entry point
asuswrt-mcpConfigure in Claude Desktop / Cursor
Add to your claude_desktop_config.json:
{
"mcpServers": {
"asuswrt-mcp": {
"command": "C:\\path\\to\\asuswrt-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "asuswrt_mcp.server"],
"env": {
"ASUSWRT_HOST": "192.168.1.1",
"ASUSWRT_SSH_USERNAME": "admin",
"ASUSWRT_SSH_PASSWORD": "your_password"
}
}
}
}Using with npx Inspector (development)
npx @modelcontextprotocol/inspector python -m asuswrt_mcp.serverDevelopment
Run the canonical local verification gate:
./scripts/verify.shThis runs the maintained compatibility tests, builds wheel/sdist artifacts and performs the HIGH/CRITICAL dependency, secret and misconfiguration scan. See CONTRIBUTING.md for development and safety requirements.
Project Structure
asuswrt-mcp/
├── src/asuswrt_mcp/
│ ├── server.py # FastMCP entrypoint & tool definitions
│ ├── service.py # Business logic & router operations
│ ├── config.py # Settings management
│ ├── clients/
│ │ └── ssh.py # SSH client wrapper
│ ├── nvram.py # NVRAM parsing utilities
│ ├── ssh_parsers.py # Output parsers for SSH commands
│ ├── security.py # Mutation guards & redaction
│ ├── validators.py # Input validation
│ ├── responses.py # Tool response formatting
│ ├── errors.py # Custom exceptions
│ └── serialization.py # Safe serialization
├── tests/ # Unit and release-contract tests
├── .env.example # Example configuration
├── docs/tools.md # Complete MCP tool reference
├── scripts/verify.sh # Canonical local verification gate
├── pyproject.toml # Project metadata
└── README.md # This fileLicense
MIT License - see LICENSE for details.
Acknowledgments
asusrouter for the underlying Python library
MCP for the protocol specification
AsusWRT-Merlin for the firmware
Available Tools
68 toolsasuswrt_admin_accessA
Inspect web, SSH, and telnet administrative access settings.
Inputs: no named parameters.
asuswrt_aimesh_statusA
Inspect AiMesh node counts and controller readiness without node identifiers.
Inputs: no named parameters.
asuswrt_aiprotection_statusA
Inspect AiProtection feature enablement and non-secret DPI signature versions.
Inputs: no named parameters.
asuswrt_arp_neighborsA
List ARP/IP neighbor entries known by the router.
Inputs: no named parameters.
asuswrt_auxiliary_services_statusB
Inspect auxiliary router service posture without credentials, paths, clients, or raw service configuration.
Inputs: no named parameters.
asuswrt_capabilitiesB
Return server capabilities, guardrails, and safe settings.
Inputs: no named parameters.
asuswrt_clientsB
List connected clients reported by the router.
Inputs: no named parameters.
asuswrt_config_snapshotA
Fetch a redacted read-only configuration snapshot.
Inputs: no named parameters.
asuswrt_conntrack_statusA
Inspect conntrack table usage and limits.
Inputs: no named parameters.
asuswrt_cron_jobsA
Inspect scheduled cron jobs reported by cru.
Inputs: no named parameters.
asuswrt_ddns_statusA
Inspect Dynamic DNS enablement and current provider settings.
Inputs: no named parameters.
asuswrt_dhcp_configA
Inspect DHCP server pool settings and static reservations.
Inputs: no named parameters.
asuswrt_dhcp_leasesB
List active DHCP leases from dnsmasq.
Inputs: no named parameters.
asuswrt_dhcp_reservationC
List, add, or remove DHCP static reservations via SSH NVRAM.
Inputs: action (required), ip, mac, name, +2 more.
asuswrt_dhcp_serverC
Enable or disable the DHCP server.
Inputs: enabled (required), confirm, dry_run.
asuswrt_dns_configA
Inspect WAN and LAN DNS settings reported by NVRAM.
Inputs: no named parameters.
asuswrt_dns_filter_statusB
Inspect DNS Filter/Director enablement and redacted configuration counts.
Inputs: no named parameters.
asuswrt_dns_privacy_statusB
Inspect DNS-over-TLS and DNSSEC posture using redacted rule counts only.
Inputs: no named parameters.
asuswrt_dual_wan_statusA
Inspect Dual-WAN selection and uplink health without WAN addresses or policy payloads.
Inputs: no named parameters.
asuswrt_firewall_statusB
Inspect firewall enablement and safe protection settings.
Inputs: no named parameters.
asuswrt_firmware_update_statusA
Inspect read-only firmware update status without checking, downloading, or flashing firmware.
Inputs: no named parameters.
asuswrt_guest_lan_accessC
Toggle LAN access for a guest Wi-Fi slot.
Inputs: band (required), slot (required), allow_lan (required), confirm, +1 more.
asuswrt_guest_networksB
List guest Wi-Fi networks and LAN-access state.
Inputs: no named parameters.
asuswrt_guest_wifiC
Enable or disable a guest Wi-Fi slot.
Inputs: band (required), slot (required), enabled (required), confirm, +1 more.
asuswrt_healthA
Fetch router identity and basic health data.
Inputs: no named parameters.
asuswrt_identityB
Fetch router model and firmware identity.
Inputs: no named parameters.
asuswrt_interface_statsA
Inspect per-interface RX/TX counters from /proc/net/dev.
Inputs: no named parameters.
asuswrt_ipv6_statusA
Inspect IPv6 service, prefix, and router address details.
Inputs: no named parameters.
asuswrt_kernel_modulesA
Inspect loaded kernel modules reported by lsmod.
Inputs: no named parameters.
asuswrt_lan_detailsA
Inspect LAN interface, addressing, and DHCP presence.
Inputs: no named parameters.
asuswrt_logging_statusB
Inspect local and remote syslog posture without log destinations, paths, or process command details.
Inputs: no named parameters.
asuswrt_mountsA
Inspect mounted filesystems and mount options.
Inputs: no named parameters.
asuswrt_network_overviewA
Fetch LAN, WAN, and routing overview details.
Inputs: no named parameters.
asuswrt_open_portsA
Inspect listening TCP/UDP sockets reported by netstat.
Inputs: no named parameters.
asuswrt_parental_accessC
List or manage AsusWRT parental access rules.
Inputs: action (required), mac, name, confirm, +1 more.
asuswrt_parental_block_allC
Toggle parental-control block-all mode.
Inputs: enabled (required), confirm, dry_run.
asuswrt_partitionsA
Inspect block-device partitions reported by the router kernel.
Inputs: no named parameters.
asuswrt_policy_routingB
Inspect policy-routing rules reported by ip rule.
Inputs: no named parameters.
asuswrt_port_forwardingC
List, enable/disable, add, or remove port forwarding rules.
Inputs: action (required), ip, name, port, +5 more.
asuswrt_qos_statusA
Inspect QoS enablement, configured mode, bandwidth, and redacted rule counts.
Inputs: no named parameters.
asuswrt_radioC
Enable or disable a main Wi-Fi radio band.
Inputs: band (required), enabled (required), confirm, dry_run.
asuswrt_remote_syslogB
Configure remote UDP syslog to one private IPv4 destination, or disable it, with confirmation and dry-run safeguards.
Inputs: enabled (required), port, confirm, dry_run, +1 more.
asuswrt_restart_serviceC
Restart an allowlisted AsusWRT service.
Inputs: service (required), confirm, dry_run.
asuswrt_route_tableA
Inspect the router IPv4 route table.
Inputs: no named parameters.
asuswrt_samba_statusA
Inspect Samba/SMB status and related processes.
Inputs: no named parameters.
asuswrt_service_processesA
List key allowlisted router processes and services.
Inputs: no named parameters.
asuswrt_smart_connect_roaming_statusB
Inspect Smart Connect and roaming state without steering policies or client data.
Inputs: no named parameters.
asuswrt_ssh_diagnosticsA
Diagnose SSH TCP reachability, banner exchange, and authentication.
Inputs: no named parameters.
asuswrt_storage_usageB
Inspect storage/filesystem usage reported by the router.
Inputs: no named parameters.
asuswrt_system_statsA
Fetch router uptime, load, and memory statistics.
Inputs: no named parameters.
asuswrt_time_syncA
Inspect timezone and NTP synchronization settings.
Inputs: no named parameters.
asuswrt_traffic_monitoring_statusB
Inspect sanitized traffic analyzer, web-history, and rstats/cstats posture without traffic or history records.
Inputs: no named parameters.
asuswrt_upnpC
Enable or disable UPnP.
Inputs: enabled (required), confirm, dry_run.
asuswrt_upnp_statusA
Inspect UPnP enablement and housekeeping settings.
Inputs: no named parameters.
asuswrt_usb_overviewA
Inspect USB/storage partitions, mounts, filesystems, and sanitized disk-monitor health without device paths or identifiers.
Inputs: no named parameters.
asuswrt_vlan_guest_statusB
Inspect VLAN and guest segmentation state using redacted counts only.
Inputs: no named parameters.
asuswrt_vpn_client_statusA
Inspect sanitized VPN client counts, WireGuard slot/runtime health, and VPN Fusion policy counts without credentials, endpoints, or peer details.
Inputs: no named parameters.
asuswrt_vpn_overviewB
Inspect configured VPN modes and related processes.
Inputs: no named parameters.
asuswrt_vpn_serverC
Enable or disable the OpenVPN server toggle.
Inputs: enabled (required), confirm, dry_run.
asuswrt_wan_detailsA
Inspect WAN protocol, IP, gateway, DNS, and interface details.
Inputs: no named parameters.
asuswrt_wan_watchdog_statusA
Inspect WAN watchdog and DNS-probe posture without returning probe targets or sensitive connectivity details.
Inputs: no named parameters.
asuswrt_web_adminB
Inspect web admin ports and related web processes.
Inputs: no named parameters.
asuswrt_wireguard_clientB
Connect, disconnect, or restart an already-configured WireGuard client slot with confirmation and dry-run safeguards.
Inputs: unit (required), action (required), confirm, dry_run.
asuswrt_wireless_advancedB
Inspect advanced per-radio Wi-Fi feature settings without credentials.
Inputs: no named parameters.
asuswrt_wireless_configA
Inspect per-radio Wi-Fi channel and security metadata without credentials.
Inputs: no named parameters.
asuswrt_wireless_overviewB
Inspect wireless radios, SSIDs, and connected band counts.
Inputs: no named parameters.
asuswrt_wireless_schedule_statusB
Inspect sanitized per-radio Wi-Fi scheduling state without raw v2 schedule payloads.
Inputs: no named parameters.
asuswrt_wps_statusA
Inspect WPS enablement and per-radio status without PIN material.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 68 tools
Each tool targets a distinct router subsystem or action, and descriptions clearly scope them (e.g., DNS config vs. DNS filter vs. DNS privacy). However, the sheer number of similar status tools (e.g., multiple wireless and VPN statuses) increases the chance of misselection for broad queries.
All tools use the `asuswrt_` prefix and snake_case consistently, with clear, descriptive suffixes. The pattern is predictable across both read-only inspection and write/toggle tools.
68 tools is far beyond the typical range for a cohesive MCP server. While the router domain is complex, many status tools could be consolidated into fewer parameterized calls, making the set unnecessarily heavy and harder to navigate.
The surface covers a wide range of router management areas—network, wireless, firewall, VPN, DHCP, DNS, storage, logging, and parental controls—with both read and write operations. Minor gaps exist (e.g., no firmware upgrade or full QoS rule management), but core workflows are well supported.
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for URnetwork VPN and Proxy
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Official remote MCP server bridge for Muumuu Domain.
MCP server for interacting with the Supabase platform
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables management of ASUS routers running Asuswrt-Merlin firmware via SSH/SCP. Supports system monitoring, device management, WiFi control, service restarts, NVRAM operations, file transfers, VPN management, and custom command execution.13MIT
- AlicenseAqualityDmaintenanceMCP server for monitoring and controlling WiFi routers (OpenWrt) via SSH, enabling device listing, status checks, WiFi configuration, rebooting, and more.717 npmMIT
- AlicenseNot gradedqualityDmaintenanceMCP server for full control of STB (Amlogic S9xx / Armbian) via SSH, enabling shell commands, file management, Docker operations, AdGuard Home configuration, and system monitoring.MIT
- AlicenseNot gradedqualityDmaintenanceSSH-based MCP server that enables remote execution of SSH commands, file transfers, and secure server management via the MCP protocol.ISC