一个模型上下文协议(MCP)服务器,暴露了UniFi网络控制器API,使AI代理和应用程序能够以标准化的方式与UniFi网络基础设施进行交互。
当前稳定版本: v0.1.4
注意:v0.2.0 发布过早,不应使用。请使用 v0.1.4,它包含了相同的代码并具有正确的版本号。真正的 v0.2.0 版本计划于2025年第四季度发布,并将包括基于区域的防火墙、流量流监控和其他主要功能。详情见 DEVELOPMENT_PLAN.md。
confirm=True 标志dry_run=True 预览更改后再应用audit.log 以符合合规性# 如果尚未安装,请安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 克隆仓库
git clone https://github.com/enuno/unifi-mcp-server.git
cd unifi-mcp-server
# 创建虚拟环境并安装依赖项
uv venv
source .venv/bin/activate # 在 Windows 上:.venv\Scripts\activate
uv pip install -e ".[dev]"
# 克隆仓库
git clone https://github.com/enuno/unifi-mcp-server.git
cd unifi-mcp-server
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # 在 Windows 上:.venv\Scripts\activate
# 安装依赖项
pip install -e ".[dev]"
运行 UniFi MCP Server 并具有完整的监控功能的推荐方式:
# 1. 复制并配置环境变量
cp .env.docker.example .env
# 编辑 .env 文件,填写你的 UNIFI_API_KEY 和 AGNOST_ORG_ID
# 2. 启动所有服务(MCP Server + Redis + MCP Toolbox)
docker-compose up -d
# 3. 检查服务状态
docker-compose ps
# 4. 查看日志
docker-compose logs -f unifi-mcp
# 5. 访问 MCP Toolbox 仪表板
open http://localhost:8080
# 6. 停止所有服务
docker-compose down
包含的服务:
详见 MCP_TOOLBOX.md 获取详细的 Toolbox 文档。
对于独立的 Docker 使用(不与 MCP 客户端一起使用):
# 拉取镜像
docker pull ghcr.io/enuno/unifi-mcp-server:latest
# 在后台运行容器(云 API)
# 注意:-i 标志保持标准输入打开以供 STDIO 传输
docker run -i -d \
--name unifi-mcp \
-e UNIFI_API_KEY=your-api-key \
-e UNIFI_API_TYPE=cloud \
ghcr.io/enuno/unifi-mcp-server:latest
# 或者使用本地网关代理运行
docker run -i -d \
--name unifi-mcp \
-e UNIFI_API_KEY=your-api-key \
-e UNIFI_API_TYPE=local \
-e UNIFI_HOST=192.168.1.1 \
ghcr.io/enuno/unifi-mcp-server:latest
# 检查容器状态
docker ps --filter name=unifi-mcp
# 查看日志
docker logs unifi-mcp
# 停止并移除
docker rm -f unifi-mcp
注意:对于 MCP 客户端集成(如 Claude Desktop 等),请参阅下方的 使用 部分,以获得正确的配置,不使用 -d 标志。
.env 文件中在项目根目录创建一个 .env 文件:
# 必需:您的 UniFi API 密钥
UNIFI_API_KEY=your-api-key-here
# API 类型:cloud 或 local
UNIFI_API_TYPE=cloud
# 对于云 API(默认)
UNIFI_HOST=api.ui.com
UNIFI_PORT=443
UNIFI_VERIFY_SSL=true
# 对于本地网关代理,使用:
# UNIFI_API_TYPE=local
# UNIFI_HOST=192.168.1.1
# UNIFI_VERIFY_SSL=false
# 可选设置
UNIFI_SITE=default
# Redis 缓存(可选 - 提高性能)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
# REDIS_PASSWORD=your-password # 如果 Redis 需要身份验证
# Webhook 支持(可选 - 用于实时事件)
WEBHOOK_SECRET=your-webhook-secret-here
# 使用 agnost.ai 进行性能跟踪(可选 - 用于分析)
# 从 https://app.agnost.ai 获取您的组织 ID
# AGNOST_ENABLED=true
# AGNOST_ORG_ID=your-organization-id-here
# AGNOST_ENDPOINT=https://api.agnost.ai
# AGNOST_DISABLE_INPUT=false # 设置为 true 以禁用输入跟踪
# AGNOST_DISABLE_OUTPUT=false # 设置为 true 以禁用输出跟踪
详见 .env.example 获取所有可用选项。
# 开发模式,带有 MCP Inspector
uv run mcp dev src/main.py
# 生产模式
uv run python src/main.py
MCP Inspector 将在 http://localhost:5173 可用,用于交互式测试。
添加到您的 Claude Desktop 配置(macOS 上位于 ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"unifi": {
"command": "uv",
"args": [
"--directory",
"/path/to/unifi-mcp-server",
"run",
"mcp",
"run",
"src/main.py"
],
"env": {
"UNIFI_API_KEY": "your-api-key-here",
"UNIFI_API_TYPE": "cloud"
}
}
}
}
{
"mcpServers": {
"unifi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"UNIFI_API_KEY=your-api-key-here",
"-e",
"UNIFI_API_TYPE=cloud",
"ghcr.io/enuno/unifi-mcp-server:latest"
]
}
}
}
重要:在 MCP 客户端配置中不要使用 -d(分离模式)。MCP 客户端需要维持与容器的持久 stdin/stdout 连接。
from mcp import MCP
import asyncio
async def main():
mcp = MCP("unifi-mcp-server")
# 列出所有设备
devices = await mcp.call_tool("list_devices", {
"site_id": "default"
})
for device in devices:
print(f"{device['name']}: {device['status']}")
# 通过资源获取网络信息
networks = await mcp.read_resource("sites://default/networks")
print(f"网络数量: {len(networks)}")
# 创建带有 VLAN 隔离的访客 WiFi 网络
wifi = await mcp.call_tool("create_wlan", {
"site_id": "default",
"name": "访客 WiFi",
"security": "wpapsk",
"password": "GuestPass123!",
"is_guest": True,
"vlan_id": 100,
"confirm": True # 安全性所需
})
print(f"创建 WiFi: {wifi['name']}")
# 获取带宽使用最多的应用程序的 DPI 统计
top_apps = await mcp.call_tool("list_top_applications", {
"site_id": "default",
"limit": 5,
"time_range": "24h"
})
for app in top_apps:
gb = app['total_bytes'] / 1024**3
print(f"{app['application']}: {gb:.2f} GB")
# 创建基于区域的防火墙区域(UniFi Network 9.0+)
lan_zone = await mcp.call_tool("create_firewall_zone", {
"site_id": "default",
"name": "LAN",
"description": "可信本地网络",
"confirm": True
})
iot_zone = await mcp.call_tool("create_firewall_zone", {
"site_id": "default",
"name": "IoT",
"description": "物联网设备",
"confirm": True
})
# 设置区域到区域策略(LAN 可以访问 IoT,但 IoT 不能访问 LAN)
await mcp.call_tool("update_zbf_policy", {
"site_id": "default",
"source_zone_id": lan_zone["_id"],
"destination_zone_id": iot_zone["_id"],
"action": "accept",
"confirm": True
})
asyncio.run(main())
详见 API.md 获取完整的 API 文档,包括:
# 安装开发依赖项
uv pip install -e ".[dev]"
# 安装 pre-commit 钩子
pre-commit install
pre-commit install --hook-type commit-msg
# 运行所有测试
pytest tests/unit/
# 运行带有覆盖率报告的测试
pytest tests/unit/ --cov=src --cov-report=html --cov-report=term-missing
# 运行特定的测试文件
pytest tests/unit/test_zbf_tools.py -v
# 运行新 v0.2.0 特性的测试
pytest tests/unit/test_new_models.py tests/unit/test_zbf_tools.py tests/unit/test_traffic_flow_tools.py
# 仅运行单元测试(快速)
pytest -m unit
# 仅运行集成测试(需要 UniFi 控制器)
pytest -m integration
当前测试覆盖率:
注意:ZBF 单元测试验证工具逻辑,但 8 个工具由于缺少 API 端点而无法工作(已在 v10.0.156 中验证)
详见 TESTING_PLAN.md 获取全面的测试路线图。
# 格式化代码
black src/ tests/
isort src/ tests/
# 代码检查
ruff check src/ tests/ --fix
# 类型检查
mypy src/
# 运行所有 pre-commit 检查
pre-commit run --all-files
# 启动带有 inspector 的开发服务器
uv run mcp dev src/main.py
# 在浏览器中打开 http://localhost:5173
unifi-mcp-server/
├── .github/
│ └── workflows/ # CI/CD 管道(CI、安全、发布)
├── .claude/
│ └── commands/ # 开发自定义斜杠命令
├── src/
│ ├── main.py # MCP 服务器入口点(注册了 77 个工具)
│ ├── cache.py # Redis 缓存实现
│ ├── config/ # 配置管理
│ ├── api/ # 带有速率限制的 UniFi API 客户端
│ ├── models/ # Pydantic 数据模型
│ │ └── zbf.py # 基于区域的防火墙模型
│ ├── tools/ # MCP 工具定义
│ │ ├── clients.py # 客户端查询工具
│ │ ├── devices.py # 设备查询工具
│ │ ├── networks.py # 网络查询工具
│ │ ├── sites.py # 站点查询工具
│ │ ├── firewall.py # 防火墙管理(第 4 阶段)
│ │ ├── firewall_zones.py # 基于区域的防火墙区域管理(v0.1.4)
│ │ ├── zbf_matrix.py # 基于区域的防火墙策略矩阵(v0.1.4)
│ │ ├── network_config.py # 网络配置(第 4 阶段)
│