关于 mcp-unifi-applications
mcp-unifi-applications 是只读 MCP 服务,将官方 UniFi API 文档提供给开发者和编码 Agent 查询。它覆盖六种 UniFi 应用,可按需检索模式、指南和代码示例,且不连接控制器。
主要功能
- 01按名称、路径、方法或描述搜索端点
- 02查看端点和字段模式
- 03获取指南与响应示例
- 04获取五种语言的代码示例
- 05覆盖六种 UniFi 应用
适用场景
- 01查找集成所需的 API 操作
- 02核对请求可接受的字段
- 03参考示例编写 API 请求
- 04查询 UniFi API 指南而不加载完整文档
MCP 相关
它向 MCP 客户端提供文档查询工具,包括端点搜索、模式检索、示例和指南。它不会访问 UniFi 控制器或实时网络状态。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
10收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| app | any | 否 | 可选的 app 筛选条件(network、protect、site-manager、innerspace、mobility、carrier-fabric)。省略则列出全部。 |
| method | any | 否 | 可选的 HTTP 方法筛选条件(GET、POST、PUT、DELETE、PATCH)。 |
详细介绍
UniFi MCP 服务 — 可查询的 API 文档
一个模型上下文协议(MCP)服务,可让 AI Agent 查询官方 UniFi API 文档——搜索端点、深入查看架构,以及获取五种语言的代码示例,可用于 Claude Desktop、Claude Code(VS Code / JetBrains)或任何兼容 MCP 的客户端。
涵盖 Ubiquiti 发布 API 文档的所有应用:Network、Protect、Site Manager、InnerSpace、Mobility 和 Carrier Fabric。
它是只读且无需凭据的:它提供文档,不会与控制器通信。内含一个基于 Playwright 的抓取器,可将由 JS 渲染的文档 SPA 转换为结构化 JSON;以及一个用于提供这些数据的 Python MCP 服务。
示例
“不提供任何上下文,仅使用 unifi-applications MCP 服务:你能告诉我如何通过 UniFi 的 Network API 使用 Go 创建网络吗?对于托管的 IPv4 DHCP 网关配置,我有哪些选项?”
Claude 通过该服务得出答案,开始时上下文中没有任何文档:
| 调用 | 返回内容 |
|---|---|
search_endpoints("create network") | POST /v1/sites/{siteId}/networks |
get_endpoint("network/createnetwork") | 请求正文 — management 是一个判别联合 |
get_field_schema(…, "management[GATEWAY].ipv4Configuration.dhcpConfiguration") | 仅 DHCP 子树 |
get_example("network/createnetwork", "go") | 可运行的 Go 请求示例 |
第三次调用正是这个服务的价值所在。它只返回以下内容,不包含其他内容——而不是它所在的 70 KB 端点架构:
# management[GATEWAY].ipv4Configuration.dhcpConfiguration (in requestBody)
- dhcpConfiguration: object (Gateway Managed IPv4 DHCP Configuration) — IPv4 DHCP
configuration for this network. If omitted or null, DHCP is not working and hosts
must get an address statically or from another server in this broadcast domain.
- mode: string (required)
[RELAY]:
- dhcpServerIpAddresses: Array of string — DHCP Server IP addresses
[SERVER]:
- ipAddressRange: object
- start: string (required)
- stop: string (required)
- leaseTimeSeconds: integer — The lease time in seconds for addresses in this range.
- dnsServerIpAddressesOverride: Array of string — List of DNS servers assigned to
client devices by the DHCP server. If none are specified, they will be selected
automatically.
- gatewayIpAddressOverride: string — Gateway IP address provided to DHCP clients.
- domainName: string — Domain name that can be used to access network in the browser.
- option43Value: string — Custom DHCP option (43) — the value MUST be the UniFi
Network application's host IP address.
- pxeConfiguration: object — Pre execution environment configuration for network boot
… ntpServerIpAddresses, tftpServerAddress, timeOffsetSeconds, wpadUrl,
winsServerIpAddresses, pingConflictDetectionEnabled
两个判别变体,每个字段都有类型和说明。这就是对“我有哪些选项”的回答——模型可以据此编写 Go 代码,无需事先看过 UniFi 文档。
快速开始
1. 安装
pip install mcp-unifi-applications
抓取后的文档已包含在软件包中——无需抓取,也无需配置 API 密钥。包含的内容如下:
| 应用 | API 版本 | 抓取日期 | 页面数 |
|---|---|---|---|
| Network | v10.6.106 | 2026-10-12 | 82 |
| Protect | v7.3.70 | 2026-10-12 | 81 |
| Site Manager | v1.0.0 | 2026-09-10 | 12 |
| InnerSpace | v1.3.23 | 2026-09-10 | 12 |
| Mobility | v1.0.0 | 2026-09-10 | 9 |
| Carrier Fabric | v1.0.0 | 2026-09-10 | 14 |
改为从源代码安装
git clone https://github.com/KallistoX/mcp-unifi-applications.git
cd mcp-unifi-applications
python -m venv .venv
source .venv/bin/activate # or: source .venv/bin/activate.fish
pip install .
2. 在客户端中注册
Claude Code(VS Code / JetBrains) — 在项目根目录添加 .mcp.json(之后重新加载窗口):
{
"mcpServers": {
"unifi-docs": {
"type": "stdio",
"command": "mcp-unifi-applications"
}
}
}
Claude Desktop — 添加到 ~/.config/Claude/claude_desktop_config.json(Linux)或
~/Library/Application Support/Claude/claude_desktop_config.json(macOS):
{
"mcpServers": {
"unifi-docs": {
"command": "mcp-unifi-applications"
}
}
}
如果命令不在客户端的 PATH 中——Claude Desktop 通常不会继承 shell 的 PATH——请改用绝对路径,例如
/path/to/.venv/bin/mcp-unifi-applications。
与其他 UniFi MCP 服务的区别
大多数 UniFi MCP 服务都是控制平面:它们向你的控制器进行身份验证,并提供用于读取和更改实时状态的工具——例如设备、客户端和防火墙规则。本服务则是知识平面,它永远不会接触你的网络。
| 控制平面服务 | 本服务 | |
|---|---|---|
| 需要控制器凭据 | 是 | 否 |
| 接触实时网络状态 | 是 | 否 |
| 回答“此端点接受什么?” | 很少 | 这正是它的全部职责 |
| 在你拥有硬件之前就有用 | 否 | 是 |
它们互为补充,而非竞争关系。使用 UniFi API 进行开发时,可将本服务与控制平面服务配合使用:本服务告诉模型 API 的结构,另一个服务则调用 API。
为什么不直接把 OpenAPI 规范提供给模型?
Ubiquiti 确实发布了规范——developer.ui.com/<app>/v<version>/openapi.json。这份规范不错,但恰好缺少 Agent 最需要的部分。以 Network v10.4.57 为例(44 个路径、73 个操作、379 个架构):
- 没有代码示例。 规范中没有任何
x-codeSamples。本服务为每个端点提供十个示例——curl、Go、Node.js、Python 和 Ansible,每种都有本地和远程版本。 - 没有响应示例。 本服务为每个端点都提供呈现后的响应示例。
- 没有指南页面。 过滤语法、错误处理、入门指南——这些内容仅存在于呈现后的文档中。
而且,409 KB 的规范无法有效地放入上下文窗口。get_field_schema 返回一个字段子树(management[GATEWAY].dhcpV4),而非 70 KB 的端点架构,因此模型只需提取所需内容。
支持的应用程序
| 应用程序 | URL | 本地/远程 | 备注 |
|---|---|---|---|
| Network | developer.ui.com/network | 两者 | 默认应用 |
| Protect | developer.ui.com/protect | 两者 | |
| Site Manager | developer.ui.com/site-manager | 仅远程 | 没有本地/远程切换选项 |
| InnerSpace | developer.ui.com/innerspace | 两者 | Early Access;版本标签显示为 v1.3.23 (EA) |
| Mobility | developer.ui.com/mobility | 仅远程 | 侧边栏链接到 mobility.ui.com |
| Carrier Fabric | developer.ui.com/carrier-fabric | 仅远程 | 订阅者 API |
所有应用都采用相同的文档 SPA 结构,包含版本下拉菜单、端点页面和指南页面,因此只需在 scrape.mjs 的 APPS 对象中添加一条记录,即可添加应用——服务会自行发现新的应用目录。
可用工具
| 工具 | 描述 |
|---|---|
list_endpoints | 列出所有 API 端点,可按 HTTP 方法或应用筛选 |
search_endpoints | 按名称、路径、方法或描述进行模糊搜索(可按应用筛选) |
get_endpoint | 获取端点的完整架构(摘要或原始 JSON) |
get_endpoint_group | 获取资源的所有 CRUD 操作(例如“networks”) |
get_example | 获取 curl、Go、Node.js、Python 或 Ansible 代码示例(本地/远程) |
get_response_sample | 获取端点的 JSON 响应示例 |
find_field | 在所有端点架构中搜索字段名称 |
get_field_schema | 深入查看特定字段的子树(例如 management[GATEWAY].dhcpV4) |
get_guide | 获取 API 指南页面(过滤语法、错误处理、入门指南) |
get_docs_info | 查看已加载的文档:API 版本、抓取日期,以及每个应用的端点和指南数量 |
返回多个结果的工具接受可选的 app 参数(network、protect、site-manager、innerspace、mobility、carrier-fabric),用于按应用筛选。
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
DOCS_DIR | 已安装软件包中的 docs/ 目录 | 存放抓取所得 JSON 文档的目录。每个应用应有一个子目录(network/、protect/,等等)。设置此变量可指向某个代码库中最新抓取的输出目录。 |
重新抓取文档
只有在每周工作流运行前需要获取较新的 API 版本,或要添加应用程序时才需要。
Docker 命令(需要 Playwright/Chromium)
# Build the scraper image
docker build -t unifi-scraper .
# Scrape Network API docs (default, latest version)
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs
# Scrape Protect API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app protect
# Scrape Site Manager API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app site-manager
# Scrape InnerSpace API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app innerspace
# Scrape Mobility or Carrier Fabric API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app mobility
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app carrier-fabric
# Scrape a specific API version
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app network --version v9.5.21
# List available API versions for an app
docker run --rm unifi-scraper node scrape.mjs --app protect --list-versions
# Scrape specific pages only
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs createnetwork filtering
# Force re-scrape (overwrite existing files)
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --force
抓取器 CLI
选项和参数
node scrape.mjs [options] [slug...]
Options:
--app <name> Application: network (default), protect, site-manager, innerspace, mobility, carrier-fabric.
--version <ver> API version to scrape (e.g. v10.1.84). Default: latest.
--list-versions Print available versions and exit.
--force Re-scrape even if output file exists.
Arguments:
[slug...] Scrape only these pages. Omit to scrape all pages.
slug 是文档 URL 的最后一个路径段:
https://developer.ui.com/network/v10.1.84/createnetwork -> createnetwork
输出写入 <output>/<app>/ — 挂载软件包的文档目录(src/mcp_unifi_applications/docs/),这样抓取的内容就会写入服务读取的位置。
完整扫描支持断点续传 — 已抓取的页面会跳过。使用 --force 重新抓取。
项目结构
仓库布局
mcp-unifi-applications/
├── scrape.mjs # Playwright scraper (runs in Docker)
├── lib/
│ └── parse.mjs # Scraper parsing logic, kept out of the browser so it is testable
├── Dockerfile # Scraper container image
├── pyproject.toml # Python project config
├── server.json # MCP registry manifest
├── CHANGELOG.md # Keep a Changelog
├── ROADMAP.md # What is planned, what is not, and why
├── glama.json # Glama maintainer declaration
├── src/
│ └── mcp_unifi_applications/
│ ├── server.py # MCP server (Python, stdio transport)
│ └── docs/ # Scraped JSON, shipped with the package
│ ├── network/
│ ├── protect/
│ ├── site-manager/
│ ├── innerspace/
│ ├── mobility/
│ └── carrier-fabric/
├── scripts/
│ └── update_readme_versions.py # Regenerates the README version table (run on main by CI)
└── tests/
├── test_mcp_server.py # pytest
└── scrape-parse.test.mjs # node --test
输出格式
抓取器写入的内容,以及服务读取的内容。
端点页面、指南页面和递归字段对象
端点页面
{
"h1": "Create Network",
"method": "POST",
"path": "/v1/sites/{siteId}/networks",
"description": "Create a new network on a site.",
"pathParameters": [ "...fields" ],
"requestBody": [ "...fields" ],
"responses": [{ "statuses": ["201"], "fields": [ "...fields" ] }],
"examples": {
"local": { "curl": "...", "go": "...", "nodejs": "...", "python": "...", "ansible": "..." },
"remote": { "curl": "...", "go": "...", "nodejs": "...", "python": "...", "ansible": "..." }
},
"responseSample": "{ ... }",
"sourceUrl": "https://developer.ui.com/network/v10.1.84/createnetwork"
}
指南页面
{
"h1": "Filtering",
"type": "guide",
"content": "Markdown content...",
"sourceUrl": "https://developer.ui.com/network/v10.1.84/filtering"
}
字段对象(递归)
{
"name": "management",
"required": true,
"type": "string",
"description": null,
"discriminator": [
{ "value": "UNMANAGED", "selected": true, "schema": [ "...sibling fields" ] },
{ "value": "GATEWAY", "selected": false, "schema": [ "...sibling fields" ] }
],
"children": [ "...child fields for object types" ]
}
discriminator.schema包含该选项处于启用状态时可见的同级字段(不包括 discriminator 字段本身)- 嵌套是递归的 — 变体中的 discriminator 会被完整展开
children包含静态展开的对象字段
免责声明
本项目与 Ubiquiti Inc. 无关,也未获得其认可或赞助。此工具抓取并提供的 API 文档内容归 Ubiquiti Inc. 所有,来源于其公开的开发者门户。“UniFi”是 Ubiquiti Inc. 的商标。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。