MCP UniFi应用程序
一个MCP服务器,它公开 UniFi应用程序API 文档(网络、保护、站点管理器)作为Claude Desktop、Claude Code(VS Code/JetBrains)或任何兼容MCP的客户端的可查询工具。
包括一个基于Playwright的scraper,它将JS渲染的文档SPA转换为结构化的JSON文件,以及一个为它们提供服务的Python MCP服务器。
示例
*“你能告诉我如何使用UniFi的Go with network API创建网络吗?关于托管IPv4 DHCP网关配置,我有哪些选项?”*
Claude自动查询MCP服务器-搜索端点、获取模式和深入鉴别器变体-然后用完整的API详细信息和一个有效的Go示例进行响应:
快速开始
1.报废单据
scraper在Docker内部运行(需要Playwright/Chromium):
# Build the scraper image
docker build -t unifi-scraper .
# Scrape Network API docs (default, latest version)
docker run --rm -v $(pwd)/docs:/output unifi-scraper node scrape.mjs
# Scrape Protect API docs
docker run --rm -v $(pwd)/docs:/output unifi-scraper node scrape.mjs --app protect
# Scrape Site Manager API docs
docker run --rm -v $(pwd)/docs:/output unifi-scraper node scrape.mjs --app site-manager
# Scrape a specific API version
docker run --rm -v $(pwd)/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)/docs:/output unifi-scraper node scrape.mjs createnetwork filtering
# Force re-scrape (overwrite existing files)
docker run --rm -v $(pwd)/docs:/output unifi-scraper node scrape.mjs --forceNetwork API v10.1.84的预处理文档包含在 docs/network/.
2.安装MCP服务器
python -m venv .venv
source .venv/bin/activate # or: source .venv/bin/activate.fish
pip install .3.向您的客户注册
克劳德代码(VS代码/JetBrains) -添加 .mcp.json 到项目根目录(之后重新加载窗口):
{
"mcpServers": {
"unifi-docs": {
"type": "stdio",
"command": "/path/to/mcp-unifi-applications/.venv/bin/python",
"args": ["/path/to/mcp-unifi-applications/mcp_server.py"]
}
}
}克劳德桌面 -添加到 ~/.config/Claude/claude_desktop_config.json (Linux)或 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"unifi-docs": {
"command": "/path/to/mcp-unifi-applications/.venv/bin/python",
"args": ["/path/to/mcp-unifi-applications/mcp_server.py"]
}
}
}支持的应用程序
| 应用程序 | URL | 本地/远程 | 注释 |
|---|---|---|---|
| 网络 | developer.ui.com/network | 两者都有 | 默认应用程序 |
| 保护 | developer.ui.com/protect | 两者 | |
| 现场经理 | developer.ui.com/site-manager | 仅远程 | 无本地/远程开关 |
这三个应用程序共享相同的文档SPA结构,包括版本下拉菜单、端点页面和指南页面。
可用工具
| 工具 | 说明 |
|---|---|
list_endpoints | 列出所有API端点,可选择通过HTTP方法或应用程序进行筛选 |
search_endpoints | 按名称、路径、方法或描述进行模糊搜索(可按应用程序过滤) |
get_endpoint | 端点的完整模式(摘要或原始JSON) |
get_endpoint_group | 资源(例如“网络”)的所有CRUD操作 |
get_example | curl、Go、Node.js、Python或Ansible(本地/远程)中的代码示例 |
get_response_sample | 端点的JSON响应示例 |
find_field | 在所有端点架构中搜索字段名 |
get_field_schema | 深入特定字段的子树(例如。 management[GATEWAY].dhcpV4) |
get_guide | API指南页(筛选语法、错误处理、入门) |
返回多个结果的工具接受可选 app 参数(network, protect, site-manager)按应用程序过滤。
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
DOCS_DIR | ./docs (相对于 mcp_server.py) | 包含抓取的JSON文档的目录。需要应用程序子目录(network/, protect/, site-manager/). |
刮刀CLI
node scrape.mjs [options] [slug...]
Options:
--app Application: network (default), protect, site-manager.
--version 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
输出被写入 // (例如。 docs/network/, docs/protect/).
完整扫描是可恢复的——已经刮擦的页面将被跳过。使用 --force 重新刮。
项目结构
mcp-unifi-applications/
├── scrape.mjs # Playwright scraper (runs in Docker)
├── mcp_server.py # MCP server (Python, stdio transport)
├── Dockerfile # Scraper container image
├── pyproject.toml # Python project config
├── docs/ # Scraped JSON output
│ ├── network/ # Network API docs
│ ├── protect/ # Protect API docs
│ └── site-manager/ # Site Manager API docs
└── tests/
└── test_mcp_server.py输出格式
端点页面
{
"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包含该选项处于活动状态时可见的兄弟字段(不是鉴别器字段本身)- 嵌套是递归的——变体中的鉴别器被完全扩展
children捕获静态扩展的对象字段
免责声明
本项目不隶属于Ubiquiti股份有限公司、由其背书或赞助。本工具抓取和提供的API文档内容归 Ubiquiti股份有限公司。 并且来源于他们的公众 开发者门户.“UniFi”是Ubiquiti股份有限公司的商标。
许可证
麻省理工学院
