mcp-unifi-applications について
mcp-unifi-applicationsは、公式UniFi APIドキュメントを検索可能にする読み取り専用のMCPサーバーです。開発者やコーディングエージェント向けに6つのUniFiアプリを扱い、コントローラーには接続せず、必要なスキーマやガイド、コード例を返します。
主な機能
- 01名前、パス、メソッド、説明によるエンドポイント検索
- 02エンドポイントとフィールドのスキーマ確認
- 03ガイドとレスポンス例の取得
- 045言語のコード例の取得
- 056つの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 Server — クエリ可能な API ドキュメント
公式のUniFi API ドキュメントを AI エージェントからクエリ可能にする Model Context Protocol(MCP)サーバーです。エンドポイントの検索、スキーマの詳細確認、5 つの言語でのコード例に対応しており、Claude Desktop、Claude Code(VS Code / JetBrains)、または MCP 互換の任意のクライアントで利用できます。
Ubiquiti が API ドキュメントを公開しているすべてのアプリケーション、Network、Protect、Site Manager、InnerSpace、Mobility、Carrier Fabricを網羅しています。
読み取り専用で、認証情報は不要です。ドキュメントを提供するだけで、コントローラーには接続しません。JavaScript で描画されるドキュメント SPA を構造化 JSON に変換する Playwright ベースのスクレーパーと、それを提供する Python MCP サーバーが含まれています。
例
「コンテキストなしで、unifi-applications MCP Server を使うだけで、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 で動作するリクエスト |
3 つ目の呼び出しこそ、このサーバーが役立つ理由です。返されるのは次の内容だけで、これが埋め込まれている 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
両方の識別子バリアントと、型と説明が付いたすべてのフィールドが含まれています。これが 「どんなオプションがあるのか」 への回答であり、モデルは UniFi のドキュメントを一度も見ていなくても、これをもとに Go のコードを作成します。
クイックスタート
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 はシェルの 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 です。優れた仕様ですが、エージェントにとって最も必要な情報が含まれていません。Network v10.4.57 の場合(44 パス、73 オペレーション、379 スキーマ):
- コード例は 0 件です。
x-codeSamplesはどこにもありません。このサーバーは、エンドポイントごとに curl、Go、Node.js、Python、Ansible の 5 種類の例を、それぞれローカル版とリモート版で提供します。 - レスポンス例は 0 件です。 このサーバーは、すべてのエンドポイントのレンダリング済みレスポンス例を提供します。
- ガイドページがありません。 フィルタリング構文、エラー処理、利用開始方法などは、レンダリング済みドキュメントにしかありません。
また、409 KB の仕様書はコンテキストウィンドウに有効活用できる形で収まりません。get_field_schema は 70 KB のエンドポイントスキーマではなく、1 つのフィールドのサブツリー(management[GATEWAY].dhcpV4)を返します。そのため、モデルは必要な情報だけを取得できます。
対応アプリケーション
| アプリケーション | URL | ローカル/リモート | 備考 |
|---|---|---|---|
| Network | developer.ui.com/network | 両方 | デフォルトのアプリ |
| Protect | developer.ui.com/protect | 両方 | |
| Site Manager | developer.ui.com/site-manager | リモートのみ | ローカル/リモートの切り替えなし |
| InnerSpace | developer.ui.com/innerspace | 両方 | 早期アクセス版。バージョンラベルは v1.3.23 (EA) と表示されます |
| Mobility | developer.ui.com/mobility | リモートのみ | サイドバーから mobility.ui.com へリンクします |
| Carrier Fabric | developer.ui.com/carrier-fabric | リモートのみ | Subscriber API |
すべてのアプリケーションで、バージョンのドロップダウン、エンドポイントページ、ガイドページを備えた同じドキュメント SPA 構造を共有しています。そのため、アプリケーションの追加は scrape.mjs の APPS オブジェクトにエントリーを 1 つ追加するだけです。サーバーが新しいアプリケーションのディレクトリを自動で検出します。
利用可能なツール
| ツール | 説明 |
|---|---|
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 ドキュメントを含むディレクトリです。アプリケーションごとに 1 つのサブディレクトリ(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.
スラッグはドキュメント 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には、そのオプションが有効なときに表示される兄弟フィールドが格納されます(ディスクリミネーターフィールド自体は含まれません)。- ネストは再帰的です。バリアント内のディスクリミネーターも完全に展開されます。
childrenには、静的に展開されたオブジェクトフィールドが格納されます。
免責事項
このプロジェクトは Ubiquiti Inc. と提携、承認、または後援関係にありません。このツールがスクレイピングして提供する API ドキュメントのコンテンツは Ubiquiti Inc. の所有物であり、同社の公開 開発者ポータル から取得しています。「UniFi」は Ubiquiti Inc. の商標です。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。