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 工作流程简化为单次工具调用。
Related MCP server: UniFi MCP
快速入门
拉取已发布的镜像并运行:
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 deployed
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for URnetwork VPN and Proxy
A MCP server built for developers enabling Git based project management with project and personal…
- ArcjetOAuthcom.arcjet
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for UniFi Network Controller that provides full API coverage for managing APs, clients, WLANs, firewall rules, VLANs, port forwards, and more.51-
- AlicenseBqualityCmaintenanceAn MCP server that enables AI assistants to manage UniFi network infrastructure, including cloud management, local network devices, and Protect cameras, through natural language.62MIT
- AlicenseNot gradedqualityDmaintenanceA safety-first MCP server for managing UniFi networks, exposing 17 tools for telemetry, diagnostics, and guarded mutations with dry-run previews and confirm requirements.14MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for UniFi Network Controller enabling AI assistants to manage UniFi infrastructure via natural language. It supports firewall rules, IPv6, and uses lazy/eager tool modes to minimize context usage.6Mozilla Public 2.0