Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Safe-by-default UniFi MCP: Network + Protect + Access, multi-site, dry-run, audit log.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
STUB_MODE, UNIFI_HOST, UNIFI_API_KEY, UNIFI_SITE, UNIFI_VERIFY_SSL, MCP_UNIFI_CONTROLLERS_FILE, MCP_UNIFI_MODULES_ENABLED, UNIFI_ACCESS_HOST, UNIFI_ACCESS_API_KEY, UNIFI_ACCESS_PORT, MCP_UNIFI_AUDIT_SINK, MCP_UNIFI_AUDIT_PATH标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"unifi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"STUB_MODE",
"-e",
"UNIFI_HOST",
"-e",
"UNIFI_API_KEY",
"-e",
"UNIFI_SITE",
"-e",
"UNIFI_VERIFY_SSL",
"-e",
"MCP_UNIFI_CONTROLLERS_FILE",
"-e",
"MCP_UNIFI_MODULES_ENABLED",
"-e",
"UNIFI_ACCESS_HOST",
"-e",
"UNIFI_ACCESS_API_KEY",
"-e",
"UNIFI_ACCESS_PORT",
"-e",
"MCP_UNIFI_AUDIT_SINK",
"-e",
"MCP_UNIFI_AUDIT_PATH",
"ghcr.io/pete-builds/mcp-unifi:0.27.0"
],
"env": {
"STUB_MODE": "your-value",
"UNIFI_HOST": "your-value",
"UNIFI_API_KEY": "your-value",
"UNIFI_SITE": "your-value",
"UNIFI_VERIFY_SSL": "your-value",
"MCP_UNIFI_CONTROLLERS_FILE": "your-value",
"MCP_UNIFI_MODULES_ENABLED": "your-value",
"UNIFI_ACCESS_HOST": "your-value",
"UNIFI_ACCESS_API_KEY": "your-value",
"UNIFI_ACCESS_PORT": "your-value",
"MCP_UNIFI_AUDIT_SINK": "your-value",
"MCP_UNIFI_AUDIT_PATH": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add unifi --env STUB_MODE=your-value --env UNIFI_HOST=your-value --env UNIFI_API_KEY=your-value --env UNIFI_SITE=your-value --env UNIFI_VERIFY_SSL=your-value --env MCP_UNIFI_CONTROLLERS_FILE=your-value --env MCP_UNIFI_MODULES_ENABLED=your-value --env UNIFI_ACCESS_HOST=your-value --env UNIFI_ACCESS_API_KEY=your-value --env UNIFI_ACCESS_PORT=your-value --env MCP_UNIFI_AUDIT_SINK=your-value --env MCP_UNIFI_AUDIT_PATH=your-value -- docker run -i --rm -e STUB_MODE -e UNIFI_HOST -e UNIFI_API_KEY -e UNIFI_SITE -e UNIFI_VERIFY_SSL -e MCP_UNIFI_CONTROLLERS_FILE -e MCP_UNIFI_MODULES_ENABLED -e UNIFI_ACCESS_HOST -e UNIFI_ACCESS_API_KEY -e UNIFI_ACCESS_PORT -e MCP_UNIFI_AUDIT_SINK -e MCP_UNIFI_AUDIT_PATH ghcr.io/pete-builds/mcp-unifi:0.27.0运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"unifi": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"STUB_MODE",
"-e",
"UNIFI_HOST",
"-e",
"UNIFI_API_KEY",
"-e",
"UNIFI_SITE",
"-e",
"UNIFI_VERIFY_SSL",
"-e",
"MCP_UNIFI_CONTROLLERS_FILE",
"-e",
"MCP_UNIFI_MODULES_ENABLED",
"-e",
"UNIFI_ACCESS_HOST",
"-e",
"UNIFI_ACCESS_API_KEY",
"-e",
"UNIFI_ACCESS_PORT",
"-e",
"MCP_UNIFI_AUDIT_SINK",
"-e",
"MCP_UNIFI_AUDIT_PATH",
"ghcr.io/pete-builds/mcp-unifi:0.27.0"
],
"env": {
"STUB_MODE": "your-value",
"UNIFI_HOST": "your-value",
"UNIFI_API_KEY": "your-value",
"UNIFI_SITE": "your-value",
"UNIFI_VERIFY_SSL": "your-value",
"MCP_UNIFI_CONTROLLERS_FILE": "your-value",
"MCP_UNIFI_MODULES_ENABLED": "your-value",
"UNIFI_ACCESS_HOST": "your-value",
"UNIFI_ACCESS_API_KEY": "your-value",
"UNIFI_ACCESS_PORT": "your-value",
"MCP_UNIFI_AUDIT_SINK": "your-value",
"MCP_UNIFI_AUDIT_PATH": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"unifi": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"STUB_MODE",
"-e",
"UNIFI_HOST",
"-e",
"UNIFI_API_KEY",
"-e",
"UNIFI_SITE",
"-e",
"UNIFI_VERIFY_SSL",
"-e",
"MCP_UNIFI_CONTROLLERS_FILE",
"-e",
"MCP_UNIFI_MODULES_ENABLED",
"-e",
"UNIFI_ACCESS_HOST",
"-e",
"UNIFI_ACCESS_API_KEY",
"-e",
"UNIFI_ACCESS_PORT",
"-e",
"MCP_UNIFI_AUDIT_SINK",
"-e",
"MCP_UNIFI_AUDIT_PATH",
"ghcr.io/pete-builds/mcp-unifi:0.27.0"
],
"env": {
"STUB_MODE": "your-value",
"UNIFI_HOST": "your-value",
"UNIFI_API_KEY": "your-value",
"UNIFI_SITE": "your-value",
"UNIFI_VERIFY_SSL": "your-value",
"MCP_UNIFI_CONTROLLERS_FILE": "your-value",
"MCP_UNIFI_MODULES_ENABLED": "your-value",
"UNIFI_ACCESS_HOST": "your-value",
"UNIFI_ACCESS_API_KEY": "your-value",
"UNIFI_ACCESS_PORT": "your-value",
"MCP_UNIFI_AUDIT_SINK": "your-value",
"MCP_UNIFI_AUDIT_PATH": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
STUB_MODE envUNIFI_HOST envUNIFI_SITE envUNIFI_VERIFY_SSL envMCP_UNIFI_CONTROLLERS_FILE envMCP_UNIFI_MODULES_ENABLED envUNIFI_ACCESS_HOST envUNIFI_ACCESS_PORT envMCP_UNIFI_AUDIT_SINK envMCP_UNIFI_AUDIT_PATH env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月8日
注册名称已通过 GitHub 账户 pete-builds 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:UNIFI_API_KEY, UNIFI_ACCESS_API_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.27.0)于18天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。
同一分类中有:Spec Driven Development, Remote Desktop Commander, alalanet — check before you pay
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Check packages, MCP servers and x402 endpoints before agents install or pay. Signed.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
Safety-first MCP server for self-hosted UniFi. Dry-run previews, JSONL audit log, composite rollback. Network + Protect + Access.
An MCP server built around the assumption that LLM-driven infrastructure calls need guardrails. Every destructive tool accepts dry_run=True and returns the predicted change set without writing. Composite tools (create_iot_network, create_guest_network, provision_homelab_service, provision_camera) capture pre-state and roll back applied steps on partial failure. Every call — dry-run or real — lands in a JSONL audit log with secrets scrubbed; the included mcp-unifi-replay CLI can re-issue a log against a fresh controller.
Beyond the safety substrate: Network tools for devices, AP radio tuning, VLANs, WLANs, firewall, switch ports, port forwards, DHCP reservations, AP groups, observability, Threat Management / IDS-IPS, Honeypot, and Teleport VPN, plus opt-in Protect (cameras, motion events, smart detections, recording config) and Access (doors, credentials, visitors, badge events, hubs / readers). Every tool accepts a controller parameter so one server instance manages multiple UniFi sites. Speaks both stdio (Claude Desktop, uvx, .dxt) and Streamable HTTP (Docker, Helm). The full, always-current tool list is in the auto-generated Tool Manifest. Works on any UniFi OS gateway running UniFi Network 9.x or newer (UDM, UDM Pro, UDM SE, UCG-Fiber, UCG-Ultra, UDR, UDW, UniFi OS Server), authenticated with a local API key from Settings → Control Plane → Integrations. Verified against a UCG-Fiber on UniFi OS 5.1.33 running UniFi Network 10.6.101 (2026-09-13). Firewall reads cover both the legacy rulesets (list_firewall_rules) and the Zone-Based Firewall (list_firewall_policies, list_firewall_zones), and audit_open_ports checks both, so a site that has migrated to zones is not reported as having no firewall. Legacy firewall writes (create_firewall_rule and friends) target /rest/firewallrule; zone policy writes (create_firewall_policy, update_firewall_policy, delete_firewall_policy) go through the official Integration API only, and the provisioning composites create a zone policy instead of a legacy rule on a zone-based site (ADR 0009). Network and WLAN writes go through the official Integration API where the request maps onto it exactly, and fall back to the private API otherwise; UNIFI_WRITE_API=private keeps every write private (ADR 0008). No Site Manager or cloud account required.
Four supported paths. Pick the one that matches how you run Claude.
Long-running container, Streamable HTTP on port 3714. Best for homelab and multi-client setups.
HTTP transport refuses to start without a bearer token, so supply one:
export MCP_UNIFI_TOKEN=$(openssl rand -hex 32)
docker run --rm -p 3714:3714 \ -e STUB_MODE=true \ -e MCP_UNIFI_AUTH_TOKENS="$MCP_UNIFI_TOKEN" \ ghcr.io/pete-builds/mcp-unifi:latest
Clients then send Authorization: Bearer $MCP_UNIFI_TOKEN. For throwaway local testing on loopback only, -e MCP_UNIFI_AUTH_REQUIRED=false skips auth entirely; never use it on an interface reachable by anything else, because every connected client gets admin-equivalent access to the controller.
Download mcp-unifi- .dxt from the latest release and double-click. Configuration is through a built-in UI in Claude Desktop. The bundle ships the Python runtime; no separate install needed. Uses stdio transport.
helm repo add mcp-unifi https://pete-builds.github.io/mcp-unifi/
helm install unifi mcp-unifi/mcp-unifi \ --set unifi.host=192.168.1.1 \ --set unifi.apiKey= \ --set auth.tokens=$(openssl rand -hex 32)
The chart ships auth.required: true with auth.tokens: "", so the pod will not start until you set a token (or --set auth.required=false, which is only appropriate for a trusted single-tenant cluster).
Quick one-off runs straight from the GitHub repo. Stdio transport.
uvx --from git+https://github.com/pete-builds/mcp-unifi mcp-unifi
Pin a release with @v0.5.0-rc.2 (or any tag) appended to the URL.
Full guides for each install path live in the docs site.
MCP_UNIFI_READONLY=true makes the server structurally unable to change anything: mutating tools are hidden from tools/list *and* refused on tools/call, so naming a hidden tool gets a normal error envelope instead of a write. Classification is declared per tool at registration (@audited("list_networks", mutates=False)), never inferred from tool names — twelve mutating tools, confirm_destructive_action among them, carry no create_/update_/delete_/set_ prefix. Registration fails if a tool has not declared a classification, so a new tool cannot default into being callable. Defense in depth on top of a read-only UniFi API key, not a replacement for it.dry_run=True and returns the predicted change set without writing. Composite tools (create_iot_network, create_guest_network, provision_homelab_service, provision_camera) capture pre-state and roll back applied steps on partial failure. Every tool call lands in a JSONL audit log with secrets scrubbed; the included mcp-unifi-replay CLI can re-issue a log against a fresh controller.controller parameter and a YAML controllers file (MCP_UNIFI_CONTROLLERS_FILE). No need to run a separate process per controller./proxy/network/api endpoint. No username/password storage, no cloud account, no Site Manager dependency.MCP_UNIFI_MODULES_ENABLED=network,protect,access. Access ships read-only (door unlocks and credential issuance require session-token auth and are deferred). UniFi Drive is not in scope.Fastest cold-start: Docker + Claude Code in stub mode, no hardware required.
export MCP_UNIFI_TOKEN=$(openssl rand -hex 32)
docker run -d --rm -p 3714:3714 \ -e STUB_MODE=true \ -e MCP_UNIFI_AUTH_TOKENS="$MCP_UNIFI_TOKEN" \ --name mcp-unifi ghcr.io/pete-builds/mcp-unifi:latest
claude mcp add --transport http --scope user unifi http://localhost:3714/mcp \
--header "Authorization: Bearer $MCP_UNIFI_TOKEN"
claude mcp list
docker run -d --rm -p 3714:3714 \
-e STUB_MODE=false \ -e UNIFI_HOST=192.168.1.1 \ -e UNIFI_API_KEY= \ -e MCP_UNIFI_AUTH_TOKENS="$MCP_UNIFI_TOKEN" \ --name mcp-unifi ghcr.io/pete-builds/mcp-unifi:latest
Generate the API key under Settings → Control Plane → Integrations → Create API Key on the gateway.
All config is read from environment variables (and .env when present). The six most common:
| Variable | Default | Notes |
|---|---|---|
STUB_MODE | true | When false, real-mode controller config is required. |
UNIFI_HOST | (empty) | Gateway IP or hostname. Required in real mode. |
UNIFI_API_KEY | (empty) | Local API key. Required in real mode. |
MCP_UNIFI_READONLY | false | When true, mutating tools are hidden and refused. See the Security guide. |
MCP_UNIFI_MODULES_ENABLED | network | Set to network,protect,access to enable all three modules. |
MCP_UNIFI_CONTROLLERS_FILE | (unset) | YAML file with named controllers for multi-site. |
MCP_UNIFI_OTEL_ENABLED | false | Optional OpenTelemetry tracing, one span per tool call. Off by default and the SDK is not a dependency. See Operations. |
UNIFI_API_KEY_FILE | (unset) | Read the API key from a file (a Docker or Kubernetes secret mount) instead of UNIFI_API_KEY. Wins if both are set, and turns TLS verification on by default. |
UNIFI_ACCESS_API_KEY_FILE | (unset) | File-backed form of UNIFI_ACCESS_API_KEY. |
UNIFI_OS_PASSWORD_FILE | (unset) | File-backed form of UNIFI_OS_PASSWORD. |
MCP_UNIFI_AUTH_TOKEN_FILE | (unset) | File holding one bearer token (or the full MCP_UNIFI_AUTH_TOKENS grammar). Adds to whatever MCP_UNIFI_AUTH_TOKENS defines. |
MCP_UNIFI_CLIENT_ID | (unset) | Client name for the bare token in MCP_UNIFI_AUTH_TOKEN_FILE. |
UNIFI_PINNED_CERT | (unset) | Path to the console's own certificate (PEM) from mcp-unifi-pin-cert. When set, that certificate is the only one the server will accept from this controller. See below. |
Full env var reference and the multi-site YAML schema are in the Configuration docs.
Every secret has a _FILE twin for Docker and Kubernetes secret mounts. The environment-variable form keeps working and is not deprecated by this release; the file form is opt-in and carries the hardened defaults inside it, so a controller configured by api_key_file verifies the gateway's TLS certificate unless you set verify_ssl: false. In a controllers YAML:
- name: lan
host: 192.168.1.1 api_key: # verify_ssl stays false: self-signed console on a LAN
A missing, empty or unreadable secret file fails startup with a message naming the controller and the field, never the contents. On every boot the server logs one line per controller still on the environment-variable shape or running with TLS verification off. That warning is the first step of a dated path (opt-in, then warn, then flip at a major release) recorded in ADR 0007; nothing is refused. docker-compose.yml shows the secret mount.
UniFi consoles present a self-signed certificate whose name list does not i
只显示了开头部分;其余内容请在仓库中阅读