关于 openwrt-mcp-server
这是一个基于 Rust 的 MCP 风格桥接服务,用于 OpenWrt 与 Linux 边缘设备,当前通过 HTTP 和 MQTT 提供单设备 JSON-RPC 控制接口。适合需要让 AI Agent 或编排系统远程管理路由器等设备的用户。项目规划中还包括可脱离 OpenWrt 运行的多设备车队服务,但目前尚未实现。
主要功能
- 01基于 HTTP 与 MQTT 的 JSON-RPC 2.0 接口
- 02通过 x-api-token 请求头进行令牌鉴权
- 03采集 ubus 及 Linux 回退的设备上下文
- 04允许列表内的命令执行与风险元数据
- 05device.describe 能力自省接口
- 06TOML 配置文件及启动时校验
适用场景
- 01为单台 OpenWrt 设备提供远程控制入口
- 02让 AI Agent 读取设备上下文与运行状态
- 03通过 MQTT 在边缘设备上执行允许列表内的命令
MCP 相关
该项目目前是 MCP 风格的 JSON-RPC 桥接,而非标准 MCP 服务;其规划中的 EdgePulse 集成与车队服务尚未实现。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
openwrt-mcp-server
openwrt-mcp-server 是一个基于 Rust 的 MCP 风格桥接程序,适用于 OpenWrt 和 Linux 边缘设备。目前,它通过 HTTP 和 MQTT 提供单设备 JSON-RPC 控制接口。长期目标是让 Rust 服务也能在 OpenWrt 之外作为独立的设备群 MCP 服务运行,通过 EdgePulse 和其他设备适配器管理多台 OpenWrt 设备。
当前部署模式:
- 用于单台设备的 OpenWrt 或 Linux 本地伴随进程。
- 面向 AI Agent 和编排系统的远程桥接端点。
- 未来的独立设备群服务,支持设备注册表、基于规则的访问控制和多租户隔离。
当前功能
- 使用
warp的 HTTP API。 - 使用
rumqttc的 MQTT 传输。 - JSON-RPC 2.0 请求和响应封装。
- 通过
x-api-token标头保护 HTTP 端点。 - TOML 配置及启动验证。
- 从 OpenWrt
ubus收集实际运行上下文;在 Linux 上则回退为从/proc、/sys和ip -j获取数据。 - 对受支持的设备操作执行允许列表中的命令。
device.describe能力内省,用于查看传输方式、命令、命令风险元数据和上下文收集器。- 轻量级命令和上下文注册表,作为未来模块的扩展点。
- 为服务、配置、HTTP 和 MQTT 事件生成结构化 JSON 日志。
schema/目录下提供命令和上下文载荷的 JSON Schema 文档。
项目结构
src/context/collector.rs:收集设备上下文。src/context/registry.rs:声明内置上下文收集器和扩展元数据。src/executor/command.rs:分发允许列表中的命令。src/executor/registry.rs:声明命令名称、必需参数和风险级别。src/http/routes.rs:提供经过身份验证的 HTTP JSON-RPC 端点。src/mqtt/handler.rs:处理 MQTT 订阅、分发和响应发布。src/config/mod.rs:加载并验证config.toml。src/logging.rs:输出精简的 JSON 日志记录。src/model/types.rs:定义共享的请求、结果和上下文类型。schema/:包含已记录载荷结构的 JSON Schema 文件。docs/edgepulse-integration-roadmap.md:介绍 EdgePulse、设备群、RBAC 和多租户计划。
构建和测试
cargo build --release
cargo test
部署到 OpenWrt 时,请使用 OpenWrt SDK 或适用于设备的 musl 目标进行交叉编译。
配置
config.toml 示例:
[mqtt]
broker = "mqtt://localhost:1883"
client_id = "openwrt-one"
username = "mcp-user"
password = "mcp-pass"
topic_prefix = "mcp/device/openwrt-one"
[http]
enable = true
listen_addr = "0.0.0.0"
port = 8080
token = "your-api-token"
当前验证会拒绝以下情况:
mqtt.broker、mqtt.client_id或mqtt.topic_prefix为空。- MQTT 主题前缀包含
+或#。 http.listen_addr无效。http.port = 0。- 启用 HTTP 时,
http.token为空。
HTTP API
所有 HTTP 端点都需要:
x-api-token: <configured token>
获取当前上下文:
curl -H 'x-api-token: change-me' \
http://127.0.0.1:8080/api/context
描述服务能力:
curl -H 'x-api-token: change-me' \
http://127.0.0.1:8080/api/describe
执行允许列表中的命令:
curl -H 'x-api-token: change-me' \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","method":"device.executeCommand","params":{"command":"get_context"},"id":"cmd-1"}' \
http://127.0.0.1:8080/api/cmd
支持的内置命令在 src/executor/registry.rs 中声明。
MQTT API
命令主题:
{topic_prefix}/cmd
响应主题:
{topic_prefix}/resp
能力请求示例:
{
"jsonrpc": "2.0",
"method": "device.describe",
"params": {},
"id": "describe-1"
}
命令请求示例:
{
"jsonrpc": "2.0",
"method": "device.executeCommand",
"params": {
"command": "restart_interface",
"args": {
"interface": "wan"
}
},
"id": "cmd-1"
}
Schema
Schema 文件记录了预期的载荷:
schema/command.schema.jsonschema/context.schema.json
目前,运行时验证通过类型化解析、命令允许列表、参数检查和配置验证实现。完整的 JSON Schema 验证计划作为未来的加固步骤实现。
EdgePulse 集成
openwrt-mcp-server 旨在与 ../edgepulse 集成,作为远程 MCP 桥接服务。EdgePulse 应继续作为 OpenWrt 本地的权威组件,负责遥测、策略、命名操作、审计日志和 AI Agent 对话状态。本 Rust 服务应将面向远程 HTTP/MQTT/MCP 的请求转换为 EdgePulse 本地 API 调用(如果可用)。
详细计划请参见 docs/edgepulse-integration-roadmap.md。
路线图
当前基线:
- 单设备 HTTP/MQTT JSON-RPC 桥接。
- OpenWrt/Linux 上下文收集。
- 命令和上下文注册表。
device.describe内省。- 结构化 JSON 日志。
- 配置验证。
- 架构文档。
近期加固:
- 运行时 JSON Schema 验证。
- 持久化审计日志,记录 HTTP/MQTT 请求和命令结果。
- 为
edgepulse-ctl接入 EdgePulse 客户端适配器,随后支持ubus或 Unix 套接字。 - 在可用时,用由 EdgePulse 策略控制的命名操作替代直接修改命令。
- 超越初始允许列表的命令沙箱。
- 用于测试和调试请求的 CLI 实用工具。
设备群方向:
- 在 OpenWrt 之外运行独立的 MCP 服务模式。
- 设备注册表和显式目标选择。
- 针对用户、服务账户、设备、方法和权限的基于规则的访问控制。
- 支持租户感知的配置、令牌、MQTT 路由、上下文缓存、策略和审计记录。
- 多租户设备群服务运行。
长期扩展:
- 用于仪表板和实时操作的 WebSocket 传输。
- 流式遥测指标端点。
- 针对低带宽 MQTT 的上下文增量压缩。
- 安全启动和系统完整性报告。
- 支持定期执行命令的调度程序。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。