用于通过 SSH/SCP 管理运行 Asuswrt-Merlin 固件的 ASUS 路由器的 Model Context Protocol (MCP) 服务器。
Docker 容器现在以非特权用户(mcpuser)运行,以增强安全性。
从 v1.0.0 升级到 v3.x 时,您必须在 MCP 配置中进行两项更改:
| 组件 | v1.0.0(已弃用) | v3.x(当前) |
|---|---|---|
| 容器用户 | root | mcpuser(UID 1000) |
| 卷挂载 | ~/.ssh:/root/.ssh:ro | ~/.ssh:/home/mcpuser/.ssh:ro |
| SSH 密钥路径 | /root/.ssh/id_rsa | /home/mcpuser/.ssh/id_rsa |
所需更改:
更新卷挂载 在 Docker 参数中:
"-v", "~/.ssh:/home/mcpuser/.ssh:ro" // 更改自 /root/.ssh
更新环境变量:
"ROUTER_KEY_FILE": "/home/mcpuser/.ssh/id_rsa" // 更改自 /root/.ssh/id_rsa
完整的 MCP 配置示例:
{
"mcpServers": {
"asus-router": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/home/yourusername/.ssh:/home/mcpuser/.ssh:ro",
"-e", "ROUTER_HOST=192.168.1.1",
"-e", "ROUTER_USER=admin",
"-e", "ROUTER_KEY_FILE=/home/mcpuser/.ssh/id_rsa",
"kcsoukup/asus-merlin-mcp:latest"
]
}
}
}
安全优势:
此 MCP 服务器提供了 8 类别中的 47 个工具,用于全面管理路由器:
对于每个工具的详细示例提示,请参阅 TOOLS_PROMPTS.md
启用路由器上的 SSH:
(推荐)设置 SSH 密钥认证:
# 在您的 Debian 工作站上
ssh-keygen -t rsa -b 4096
# 将您的公钥复制到路由器
ssh-copy-id admin@192.168.1.1
# 或者通过 Web 界面手动添加:
# 管理 > 系统 > SSH 认证密钥
# 如果尚未安装,请安装 Python 3.11+
sudo apt update
sudo apt install python3 python3-pip python3-venv
# 可选:安装 Docker 以进行容器化部署
sudo apt install docker.io docker-compose
克隆或创建项目目录:
mkdir asus-merlin-mcp
cd asus-merlin-mcp
保存 MCP 服务器代码为 asus_merlin_mcp.py
创建虚拟环境并安装依赖项:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
配置路由器连接:
cp .env.example .env
nano .env # 使用您的路由器详细信息编辑
测试连接:
# 导出环境变量
export $(cat .env | xargs)
# 运行服务器(它将通过标准 I/O 连接)
python asus_merlin_mcp.py
# 拉取预构建的镜像(使用 :latest 获取最新版本或特定版本标签)
docker pull kcsoukup/asus-merlin-mcp:latest
可用版本: v1.0.0, v3.0, latest
构建 Docker 镜像:
docker build -t asus-merlin-mcp .
编辑 docker-compose.yml 文件,填写您的路由器凭据
# 可选 -- 凭据通过 Claude 或其他聊天机器人中的 MCP 配置传递给容器。
使用 Docker Compose 运行:
docker-compose up -d
配置位置取决于您使用的 Claude 安装方式:
MCP 服务器会在您的项目路径下的 ~/.claude.json 中自动配置:
配置文件: ~/.claude.json
{
"installMethod": "native",
"projects": {
"/path/to/asus-merlin-mcp": {
"mcpServers": {
"asus-router": {
"command": "/path/to/asus-merlin-mcp/venv/bin/python",
"args": ["/path/to/asus-merlin-mcp/asus_merlin_mcp.py"],
"env": {
"ROUTER_HOST": "192.168.1.1",
"ROUTER_PORT": "22",
"ROUTER_USER": "admin",
"ROUTER_KEY_FILE": "/home/yourusername/.ssh/id_rsa"
}
}
}
}
}
}
{
"installMethod": "native",
"projects": {
"/path/to/asus-merlin-mcp": {
"mcpServers": {
"asus-router": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/home/yourusername/.ssh:/home/mcpuser/.ssh:ro",
"-e", "ROUTER_HOST=192.168.1.1",
"-e", "ROUTER_PORT=22",
"-e", "ROUTER_USER=admin",
"-e", "ROUTER_KEY_FILE=/home/mcpuser/.ssh/id_rsa",
"kcsoukup/asus-merlin-mcp:latest"
]
}
}
}
}
}
配置文件: ~/.claude/settings.json
{
"mcpServers": {
"asus-router": {
"command": "/path/to/asus-merlin-mcp/venv/bin/python",
"args": ["/path/to/asus-merlin-mcp/asus_merlin_mcp.py"],
"env": {
"ROUTER_HOST": "192.168.1.1",
"ROUTER_PORT": "22",
"ROUTER_USER": "admin",
"ROUTER_KEY_FILE": "/home/yourusername/.ssh/id_rsa"
}
}
}
}
{
"mcpServers": {
"asus-router": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/home/yourusername/.ssh:/home/mcpuser/.ssh:ro",
"-e", "ROUTER_HOST=192.168.1.1",
"-e", "ROUTER_PORT=22",
"-e", "ROUTER_USER=admin",
"-e", "ROUTER_KEY_FILE=/home/mcpuser/.ssh/id_rsa",
"kcsoukup/asus-merlin-mcp:latest"
]
}
}
}
配置文件位置:
~/.config/Claude/claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"asus-router": {
"command": "/path/to/asus-merlin-mcp/venv/bin/python",
"args": ["/path/to/asus-merlin-mcp/asus_merlin_mcp.py"],
"env": {
"ROUTER_HOST": "192.168.1.1",
"ROUTER_PORT": "22",
"ROUTER_USER": "admin",
"ROUTER_KEY_FILE": "/home/yourusername/.ssh/id_rsa"
}
}
}
}
{
"mcpServers": {
"asus-router": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/home/yourusername/.ssh:/home/mcpuser/.ssh:ro",
"-e", "ROUTER_HOST=192.168.1.1",
"-e", "ROUTER_PORT=22",
"-e", "ROUTER_USER=admin",
"-e", "ROUTER_KEY_FILE=/home/mcpuser/.ssh/id_rsa",
"kcsoukup/asus-merlin-mcp:latest"
]
}
}
}
重要说明:
/home/yourusername 替换为您实际的主目录路径(例如,/home/triskull)${HOME} 或 ~,它们不会展开在 Claude Desktop 中配置后,您可以与您的路由器交互:
示例提示:
对于每个工具的详细示例提示,请参阅 TOOLS_PROMPTS.md
| 工具 | 描述 |
|---|---|
get_router_info | 系统信息(运行时间、内存、固件) |
get_connected_devices | 列出 DHCP 客户端 |
get_all_network_devices | 全面的设备列表(DHCP + 静态 + ARP) |
get_wifi_status | 所有无线电的 WiFi 状态 |
restart_service | 重启特定服务 |
reboot_router | 重启路由器(需要确认) |
get_vpn_status | 检查 VPN 客户端/服务器状态 |
list_processes | 显示正在运行的进程 |
get_nvram_variable | 读取 NVRAM 变量 |
set_nvram_variable | 写入 NVRAM 变量 |
execute_command | 运行自定义 SSH 命令 |
read_file | 从路由器读取文件 |
upload_file | 上传文件(MD5 校验) |
download_file | 下载文件(MD5 校验) |
| 工具 | 描述 |
|---|---|
add_mac_filter | 将设备添加到 MAC 过滤器(白名单/黑名单) |
remove_mac_filter | 从 MAC 过滤器中移除设备 |
list_mac_filters | 显示当前的 MAC 过滤器 |
| 工具 | 描述 |
|---|---|
add_dhcp_reservation | 为 MAC 地址保留 IP(静态租约) |
remove_dhcp_reservation | 移除 DHCP 预留 |
list_dhcp_reservations | 显示所有 DHCP 预留 |
| 工具 | 描述 |
|---|---|
block_device_internet | 阻止/解除设备的互联网访问(家长控制) |
list_blocked_devices | 显示被阻止的设备 |
| 工具 | 描述 |
|---|---|
add_vpn_routing_policy | 将设备路由到 VPN 客户端 |
remove_vpn_routing_policy | 从 VPN 路由中移除设备 |
list_vpn_policies | 显示所有 VPN 路由策略 |
| 工具 | 描述 |
|---|---|
get_vpn_server_status | 显示 VPN 服务器状态和连接的客户端 |
get_vpn_server_users | 列出授权的 VPN 服务器用户 |
wireless - WiFi 服务wan - WAN 连接httpd - Web 界面vpnclient1 - VPN 客户端 1vpnclient2 - VPN 客户端 2dnsmasq - DNS/DHCP 服务器# 手动测试 SSH 连接
ssh admin@192.168.1.1
# 检查路由器是否启用了 SSH
# 通过 Web 界面:管理 > 系统 > 启用 SSH
# 确保 SSH 密钥可读
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# 验证密钥已添加到路由器
ssh admin@192.168.1.1 "cat /tmp/home/root/.ssh/authorized_keys"
# 确保虚拟环境已激活
source venv/bin/activate
# 重新安装依赖项
pip install -r requirements.txt --force-reinstall
如果您看到类似以下错误:
Error: error creating named volume "${HOME}/.keys":
error running volume create option: names must match [a-zA-Z0-9][a-zA-Z0-9_.-]*: invalid argument
原因: JSON 配置文件不扩展如 ${HOME} 或 ~ 这样的 shell 变量。
解决方案: 在配置中替换 ${HOME} 为您的实际主目录路径:
// 错误 - 不会工作:
"-v", "${HOME}/.ssh:/home/mcpuser/.ssh:ro"
// 正确 - 使用绝对路径:
"-v", "/home/triskull/.ssh:/home/mcpuser/.ssh:ro"
要找到您的主目录:
echo $HOME
# 输出:/home/triskull