mcpField
M
mcp-unifi-applications

mcp-unifi-applications

本地服务
github.com开发工具402 周前更新

关于 mcp-unifi-applications

mcp-unifi-applications 是只读 MCP 服务,将官方 UniFi API 文档提供给开发者和编码 Agent 查询。它覆盖六种 UniFi 应用,可按需检索模式、指南和代码示例,且不连接控制器。

主要功能

  1. 01按名称、路径、方法或描述搜索端点
  2. 02查看端点和字段模式
  3. 03获取指南与响应示例
  4. 04获取五种语言的代码示例
  5. 05覆盖六种 UniFi 应用

适用场景

  1. 01查找集成所需的 API 操作
  2. 02核对请求可接受的字段
  3. 03参考示例编写 API 请求
  4. 04查询 UniFi API 指南而不加载完整文档

MCP 相关

它向 MCP 客户端提供文档查询工具,包括端点搜索、模式检索、示例和指南。它不会访问 UniFi 控制器或实时网络状态。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"kallistox-mcp-unifi-applications": {
"command": "uvx",
"args": [
"mcp-unifi-applications"
]
}
}
}
启动命令uvx mcp-unifi-applications

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypimcp-unifi-applications0.4.1

工具

10

收录的工具列表 · 更新于 2 周前

参数类型必填说明
appany否可选的 app 筛选条件(network、protect、site-manager、innerspace、mobility、carrier-fabric)。省略则列出全部。
methodany否可选的 HTTP 方法筛选条件(GET、POST、PUT、DELETE、PATCH)。

详细介绍

UniFi MCP 服务 — 可查询的 API 文档

CI PyPI Python Glama

一个模型上下文协议(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 网关配置,我有哪些选项?”

unifi-applications MCP 服务已在 Claude Code 中连接

在 Claude Code 中输入的提示词

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 版本抓取日期页面数
Networkv10.6.1062026-10-1282
Protectv7.3.702026-10-1281
Site Managerv1.0.02026-09-1012
InnerSpacev1.3.232026-09-1012
Mobilityv1.0.02026-09-109
Carrier Fabricv1.0.02026-09-1014
改为从源代码安装
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本地/远程备注
Networkdeveloper.ui.com/network两者默认应用
Protectdeveloper.ui.com/protect两者
Site Managerdeveloper.ui.com/site-manager仅远程没有本地/远程切换选项
InnerSpacedeveloper.ui.com/innerspace两者Early Access;版本标签显示为 v1.3.23 (EA)
Mobilitydeveloper.ui.com/mobility仅远程侧边栏链接到 mobility.ui.com
Carrier Fabricdeveloper.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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。