mcp-unifi
mcp-unifi
一个用于自托管 UniFi 网关管理的 MCP 服务器。包含十五个工具,涵盖设备、网络/VLAN、WiFi SSID(完整 CRUD)、防火墙规则(完整 CRUD)、交换机端口配置文件、已连接客户端,以及一个 create_iot_network 一次性工具,该工具可在单次调用中配置隔离的 IoT 子网(VLAN、SSID 和防火墙拦截),并在部分失败时自动回滚。
基于 FastMCP 和 Streamable HTTP 传输构建。通过本地 API 密钥与 UCG-Fiber、UDM Pro 或任何其他 UniFi OS 网关通信。无需 Site Manager / 云账户。
每个工具都返回 JSON。错误以结构化的 {"error": "...", "stub_mode": bool} 对象形式返回,因此 MCP 循环永远不会因为网关故障而崩溃。
为什么选择它
目前大多数 UniFi 自动化意味着点击控制器 UI、编写脆弱的一次性脚本或引入沉重的社区 SDK。mcp-unifi 为任何支持 MCP 的客户端(Claude Code、Claude Desktop、自定义代理)提供了一个小巧、专注且类型良好的操作界面,用于你每周实际执行的操作:启动 IoT VLAN、添加防火墙规则、审计 SSID、列出已采用的设备。
复合工具 create_iot_network 将 15 步的 UI 工作流程简化为单次工具调用。
快速入门
拉取已发布的镜像并运行:
docker run --rm \
-p 3714:3714 \
-e STUB_MODE=true \
ghcr.io/pete-builds/mcp-unifi:0.2.0服务器默认在 存根模式 (stub mode) 下启动,该模式返回真实的模拟数据,无需 UniFi 硬件。将其注册到 Claude Code:
claude mcp add unifi --transport http --scope user --url http://localhost:3714/mcp然后让 Claude Code "列出我的 UniFi 设备",你应该会看到两个存根设备返回。
要与真实网关通信,请传入凭据并关闭存根模式:
docker run --rm \
-p 3714:3714 \
-e STUB_MODE=false \
-e UNIFI_HOST=192.168.1.1 \
-e UNIFI_API_KEY=<your-local-api-key> \
ghcr.io/pete-builds/mcp-unifi:0.2.0在网关的 设置 → 控制平面 → 集成 (Settings → Control Plane → Integrations) 下生成 API 密钥。
工具参考
工具 | 签名 | 功能 |
|
| 列出已采用的网关、AP 和交换机,包含状态、运行时间和各射频信息。 |
|
| 列出所有已配置的网络/VLAN(子网、DHCP 范围、VLAN ID)。 |
|
| 创建一个新的 VLAN 标记网络。 |
|
| 修补现有 VLAN 上的字段。 |
|
| 删除 VLAN。 |
|
| 列出所有 WiFi SSID。 |
|
| 创建绑定到特定 VLAN 的新 SSID。 |
|
| 修补现有 SSID 上的字段(名称、密码、hide_ssid 等)。 |
|
| 删除 WiFi SSID。 |
|
| 列出所有防火墙规则。 |
|
| 创建防火墙规则。 |
|
| 删除防火墙规则。 |
|
| 列出交换机端口配置文件(PoE 模式、原生 VLAN、转发)。 |
|
| 列出当前连接的无线和有线客户端(MAC、主机名、IP、信号/满意度、AP 或交换机端口、运行时间)。 |
|
| 一次性:VLAN + SSID + 隔离规则,失败时回滚。 |
每个工具都返回一个 JSON 字符串。错误以结构化的 {"error": "...", "stub_mode": bool} 对象返回,以便 Claude 可以渲染失败信息而不会导致 MCP 循环崩溃。
存根模式 vs 真实模式
模式 | 何时使用 | 行为 |
存根 ( | 开发、演示、在硬件到达前连接 Claude 流程 | 内存状态机,预置一个网关、一个 AP、一个网络、一个 SSID、一个防火墙规则、两个端口配置文件。创建/更新/删除在容器生命周期内持久化。重启后重置。 |
真实 ( | 使用 UCG-Fiber/UDM/其他 UniFi OS 网关的生产环境 | 使用本地 API 密钥通过 HTTPS 与网关通信。需要 |
切换模式是配置更改,而非代码更改。相同的十一个工具,相同的响应形状。
配置
所有配置均从环境变量(以及存在时的 .env 文件)读取。配置在启动时由 Pydantic 验证;无效值会快速失败并显示有用的消息。
变量 | 类型 | 默认值 | 必需 | 说明 |
| bool |
| 否 | 为 |
| string |
| 仅在真实模式 | 网关 IP 或主机名(无协议头)。 |
| int |
| 否 | 网关的 HTTPS 端口。 |
| string |
| 否 | 控制器站点标识符。 |
| string |
| 仅在真实模式 | 来自“设置 → 控制平面 → 集成”的本地 API 密钥。 |
| bool |
| 否 | 如果你在网关上安装了真实证书,请设为 |
| string |
| 否 | 必须包含字面量 |
| int (2-254) |
| 否 | IoT /24 内的第一个 DHCP 租约偏移量。 |
| int (2-254) |
| 否 | IoT /24 内的最后一个 DHCP 租约偏移量。 |
| string |
| 否 | 绑定地址。 |
| int |
| 否 | 监听端口。 |
| enum |
| 否 |
|
| enum |
| 否 | 生产环境用 |
完整示例位于 .env.example。
MCP 客户端设置
Claude Code
claude mcp add unifi --transport http --scope user --url http://<host>:3714/mcpClaude Desktop
将以下内容添加到你的 claude_desktop_config.json 中:
{
"mcpServers": {
"unifi": {
"transport": "streamable-http",
"url": "http://<host>:3714/mcp"
}
}
}通用配置
Streamable HTTP 位于 http://<host>:3714/mcp。任何支持 Streamable HTTP 传输(规范 2025-03-26+)的 MCP 客户端均可连接。
架构
+---------------------+ Streamable HTTP +---------------------+
| MCP Client | --------------------------> | mcp-unifi |
| (Claude Code, etc) | <-------------------------- | (FastMCP server) |
+---------------------+ +----------+----------+
|
| HTTPS + X-API-Key
v
+----------+----------+
| UniFi OS Gateway |
| /proxy/network/... |
+---------------------+该服务器是一个 轻量级异步代理:它将 MCP 工具调用转换为 UniFi 控制器 REST 调用,格式化响应并返回 JSON。它不存储状态,不调用任何云服务,也不验证传入的 MCP 连接(请在受信任的局域网内运行)。
安全说明
UNIFI_API_KEY仅存在于容器的环境变量中。它永远不会被记录,永远不会在 MCP 响应中回显,也不会被此服务器写入磁盘。WLAN 密码在每个工具响应输出时都会被清除(
[REDACTED]),即使在存根模式下也是如此。容器以 UID 1000 运行,无 shell,无主目录,具有 只读根文件系统 (
/tmp为tmpfs) 和no-new-privileges。基础镜像按摘要固定。Python 依赖项使用
pip --require-hashes从哈希锁定的requirements.lock安装。已发布的镜像为多架构 (amd64/arm64),具有构建来源证明,并通过
docker/build-push-action提供 SBOM。MCP 服务器本身 未经过身份验证。请将其放置在受信任的局域网边界、带有身份验证的反向代理或 Tailscale ACL 之后。
有关漏洞报告,请参阅 SECURITY.md。
开发
需要 Python 3.13+ 和 Docker。
# Clone + install dev deps
git clone https://github.com/pete-builds/mcp-unifi.git
cd mcp-unifi
python -m venv .venv && source .venv/bin/activate
pip install --require-hashes -r requirements-dev.lock
pip install -e . --no-deps
# Run the test suite (101 tests, ~95% coverage)
pytest
# Lint and format
ruff check src tests
ruff format src tests
# Type check (mypy strict)
mypy src/mcp_unifi
# Run the server locally in stub mode
python -m mcp_unifi.server
# Or build the image yourself instead of pulling from GHCR
cp docker-compose.example.yml docker-compose.yml
docker compose up --build测试
======================= 101 passed in 1.5s =======================
Name Stmts Miss Branch BrPart Cover
-----------------------------------------------------------------
src/mcp_unifi/__init__.py 2 0 0 0 100%
src/mcp_unifi/clients/__init__ 3 0 0 0 100%
src/mcp_unifi/clients/stubs.py 70 1 6 0 99%
src/mcp_unifi/clients/unifi.py 82 0 12 0 100%
src/mcp_unifi/config.py 38 1 8 0 98%
src/mcp_unifi/healthcheck.py 18 1 0 0 94%
src/mcp_unifi/logging_setup.py 33 1 12 2 93%
src/mcp_unifi/models.py 6 0 0 0 100%
src/mcp_unifi/server.py 232 15 70 5 92%
-----------------------------------------------------------------
TOTAL 484 19 108 7 95%CI 门禁要求 最低 80% 的覆盖率、ruff lint、ruff format、mypy strict,以及对任何 HIGH 或 CRITICAL 发现都会失败的 Trivy fs+image 扫描。
更新依赖
requirements.lock 和 requirements-dev.lock 文件是哈希锁定的。编辑 requirements.in(或 requirements-dev.in),然后重新生成:
uv pip compile requirements.in --output-file requirements.lock --generate-hashes --python-version 3.13
uv pip compile requirements-dev.in --output-file requirements-dev.lock --generate-hashes --python-version 3.13Dependabot 每周会为 requirements.in 级别的更新和 Docker 基础镜像摘要打开 PR。
致谢
UniFi 控制器端点路径参考了 sirkirby/unifi-mcp 项目。该仓库被用作 API 面的研究材料;未复制任何代码。此处的实现是一个独立的 FastMCP + httpx 构建,遵循经过验证的 Forge 模式。
许可证
MIT。
贡献
欢迎提交问题和拉取请求。在打开 PR 之前:
确保
ruff check,ruff format --check和mypy src/mcp_unifi清洁。添加或更新测试,保持覆盖率在 80% 或以上。
在本地运行
pytest并确认套件通过。在
[Unreleased]标题下更新CHANGELOG.md。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pete-builds/mcp-unifi'
If you have feedback or need assistance with the MCP directory API, please join our Discord server