UniFi Site Manager and Network (unofficial) について
UniFi Site Manager and Network (unofficial) は、公式クラウドエンドポイント経由で UniFi コンソールやネットワークを管理する stdio 対応 MCP サーバーです。手書きのラッパーと API エンドポイントごとの生成ツールを備え、破壊的な書き込みにはデフォルトで確認を求めます。
主な機能
- 01Site Manager と Network API を網羅
- 02手書きおよび生成ツール
- 03コンソール、デバイス、クライアントの一覧
- 04ネットワーク、WiFi、ファイアウォールポリシーの管理
- 05デフォルトで書き込みを確認
活用シーン
- 01アカウント内の UniFi コンソールとサイトの確認
- 02デバイスやクライアントの状態確認
- 03ネットワーク、WiFi、ファイアウォールポリシーの作成・調整
MCP 対応
stdio 経由で MCP クライアントに UniFi Site Manager と Network API のツールを提供し、MCP リソースとプロンプトも公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
169掲載時のツール一覧 · 2 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| body | any | いいえ | POST/PUT/PATCH 用の JSON ボディ |
| path | string | はい | 設定済みの API ベース(api.ui.com)に対する相対パスです。"/v1/…" で始めてください。例:"/v1/hosts"。 |
| query | object | いいえ | フラットな文字列マップ形式のクエリパラメーター |
| method | enum | はい | HTTP メソッドGET | POST | PUT | PATCH | DELETE |
| confirm | string | いいえ | 適用するには "YES" を指定します。指定しない場合、ツールはプレビューを返します。 |
| dry_run | any | いいえ | true:プレビューのみで、何も送信されません。 |
詳細
the-real-unifi-mcp
公式クラウドエンドポイント経由で、UniFi Site Manager API と Network API への完全な読み書きアクセスを Claude(または任意の MCP クライアント)に提供する MCP サーバーです。クラウド専用で、トランスポートには stdio を使用します。
非公式プロジェクトです。 このサーバーは Ubiquiti Inc. との提携や承認を受けていません。UniFi と Ubiquiti は Ubiquiti Inc. の商標です。ここでは、このソフトウェアが連携する API の名称としてのみ使用しています。詳しくは NOTICE をご覧ください。
UniFi Site Manager API キーを設定すると、MCP クライアントから、169 個のツールを通じてコンソールの一覧表示、デバイスやクライアントの確認、ネットワーク、Wi-Fi、ファイアウォールポリシーなどの管理ができます。これらのツールは、ドキュメント化された API の全範囲をカバーします。
機能
- 169 個のツールで、UniFi の両方の API の読み取りと書き込みに対応します。
- 3 層構造のツール設計: 手書きのラッパー 86 個(Site Manager 10 個 + Network 76 個)+ ドキュメント化されたエンドポイントごとに 1 個の自動生成ツール 82 個 + 生リクエスト用のエスケープハッチ 1 個(86 + 82 + 1 = 169)。ツールの契約は
tests/contract/tools-contract.jsonで固定されています。 - すぐに使えるワークフロー向けの MCP リソースと MCP プロンプト。
- 遅延 ID 検出(consoleId / Network siteId / Site Manager siteId)。検出結果はプロセスの実行期間中キャッシュされます。
- 書き込みガードがデフォルトで有効:
UNIFI_CONFIRM_WRITES(デフォルトはtrue)により、破壊的なツールはプレビュー後に確認して実行されます。falseに設定すると、書き込みを直接実行します。モデル自体がconfirm: "YES"を送信できるため、これは安全策であって、人による承認ではありません(SECURITY.md を参照)。 - サーバー自身の stderr ログ行におけるシークレットの秘匿(既知のキーのパターンと、設定済み API キーの値)。
要件
- Node.js 22.12 以降の 22.x、24.x、または 26 以降(
engines:^22.12.0 || ^24.0.0 || >=26.0.0。テストツールチェーン vitest の対応範囲です)。Node 23 と 25 はサポートされていません。 - Network スコープを持つ UniFi Site Manager API キー。unifi.ui.com の「Settings」→「API」で作成してください。
- ファームウェアが 5.0.3 以上の UniFi Console(Network API に必要です)。
インストール
npm から(推奨)
インストールは不要です。MCP クライアントが npx でサーバーを起動し、初回使用時に npm からパッケージを取得します。
npx -y the-real-unifi-mcp # starts the server on stdio; needs UNIFI_API_KEY in the environment
または、グローバルにインストールして the-real-unifi-mcp コマンドを使用します。
npm install -g the-real-unifi-mcp
設定を変更したときだけ更新したい場合は、バージョン(the-real-unifi-mcp@<version>)を固定してください。v0.2.1 以降のリリースは、provenance 付きで GitHub Actions から npm に公開されています(v0.2.0 は GitHub リリースのみです)。npm audit signatures で検証できます。
ソースから
git clone https://github.com/mguttmann/the-real-unifi-mcp.git
cd the-real-unifi-mcp
npm ci
cp .env.example .env
# Edit .env: set UNIFI_API_KEY (Site Manager key with Network scope)
npm run build # prebuild runs lint, typecheck and unit tests first
npm start # node dist/index.js; reads .env from the current directory
MCPB バンドルとして
npm ci
npm run build:mcpb
# Writes release/the-real-unifi-mcp-<version>.mcpb (install it in Claude Desktop) and its SBOM.
このバンドルでは、設定項目(API キー、書き込み確認、読み取り専用、シークレットの非表示、ログレベル)が、以下の環境変数に ${user_config.<key>} プレースホルダーとして割り当てられます。ホストがこれらを置き換えずにサーバーを起動した場合、プレースホルダーのままの値は未設定として扱われます。各スイッチはデフォルト値を維持し、キーが不足しているとサーバーは停止し、該当する変数名を示す警告が表示されます。
v0.2.0 以降のリリースには、.mcpb、npm tarball、CycloneDX SBOM、SHA256SUMS が含まれます。docs/RELEASING.md を参照してください。
Configuration
| 変数 | デフォルト | 説明 |
|---|---|---|
UNIFI_API_KEY | (required) | Network スコープを持つ Site Manager API キー |
UNIFI_API_BASE | https://api.ui.com | API のベース URL。このホストが API キーを受け取ります。ローカルのスタブに対してテストする場合を除き、デフォルトのままにしてください。https:// である必要があります(平文の http:// は 127.0.0.1、[::1]、または localhost の場合のみ使用可能です)。また、パス、クエリ、フラグメントのないオリジンである必要があります。それ以外の場合、サーバーは起動時に停止します。 |
UNIFI_CONFIRM_WRITES | true | 有効にすると、破壊的なツールでは confirm: "YES" が必要です。無効にするには、false、0、no、off(大文字と小文字は区別しません)のいずれかを指定します。未設定、空、true、1、yes、on の場合は有効のままです。不明な値の場合も有効のままとなり、警告が記録されます。 |
UNIFI_TIMEOUT_MS | 30000 | リクエストごとのタイムアウト(ミリ秒)。レスポンスヘッダーと本文の両方が対象です。 |
UNIFI_LOG_LEVEL | info | debug | info | warn | error |
UNIFI_CONSOLE_ID | (unset) | 自動検出を上書きします(特定のコンソールに固定します。アカウントが複数のコンソール、または別の種類のホストを所有している場合に必要です)。 |
UNIFI_NETWORK_SITE_ID | (unset) | 自動検出を上書きします(特定の Network サイトに固定します)。 |
UNIFI_SITE_MANAGER_SITE_ID | (unset) | 自動検出を上書きします(特定の Site Manager サイトに固定します)。 |
UNIFI_READ_ONLY | false | 有効にすると、confirm パラメーターを持つすべてのツール(すべての書き込みツール、および GET 以外のメソッドを使う unifi_raw_request)は、リクエストを送信せずに code: "READ_ONLY" のエラーを返します。ツールは引き続き一覧に表示されます。値は UNIFI_CONFIRM_WRITES と同じです。不明な値の場合は有効になり、警告が記録されます。 |
UNIFI_REDACT_SECRETS | false | 有効にすると、すべてのツール結果で、確認プレビューにおいてマスクされるフィールド(パスワード、WiFi パスフレーズ、事前共有キー、シークレット、トークン、キー)が (redacted) に置き換えられます。nextToken などのページングトークンはそのままです。MCP リソース(unifi://hosts、unifi://identity)はマスクされません。書き込みツールは、プレースホルダーを含む本文を常に拒否します(「書き込みの安全性」を参照)。値は UNIFI_READ_ONLY と同じです。 |
UNIFI_MAX_RESULT_BYTES | 100000 | ツール結果のテキストがこの UTF-8 バイト数を超えると、この長さに切り詰められ、ページングパラメーターを示す ... (truncated: ...) マーカーで終わります。未設定または空の場合はデフォルト(JSON で約 25,000 トークン)です。0、off、none(大文字と小文字は区別しません)を指定すると、上限はなくなります。正の整数を指定すると、その値が上限になります。それ以外の値の場合、サーバーは起動時に停止します。MCP リソースは切り詰められません。 |
Claude Desktop config
claude_desktop_config.json(macOS では ~/Library/Application Support/Claude/claude_desktop_config.json、Windows では %APPDATA%\Claude\claude_desktop_config.json)に追加します。
{
"mcpServers": {
"unifi": {
"command": "npx",
"args": ["-y", "the-real-unifi-mcp"],
"env": {
"UNIFI_API_KEY": "<your Site Manager API key>"
}
}
}
}
Configuration の変数は、どれでも env に設定できます。ソースをチェックアウトした場合は、代わりに "command": "node" と "args": ["--env-file=/absolute/path/to/the-real-unifi-mcp/.env", "/absolute/path/to/the-real-unifi-mcp/dist/index.js"] を使用してください。
ファイルを編集した後、Claude Desktop を再起動してください。サーバーは unifi プレフィックスでツールを公開します。
Claude Code config
Claude Code CLI でサーバーを登録します(--scope user を指定するとすべてのプロジェクトで利用可能になります。デフォルトのスコープである local の場合、現在のプロジェクト内でのみ利用できます)。
claude mcp add --scope user unifi --env UNIFI_API_KEY="YOUR_SITE_MANAGER_API_KEY" -- npx -y the-real-unifi-mcp
ソースをチェックアウトした場合:
claude mcp add --scope user unifi -- node \
--env-file=/absolute/path/to/the-real-unifi-mcp/.env \
/absolute/path/to/the-real-unifi-mcp/dist/index.js
claude mcp list で接続状況を確認できます。
Tool reference
Site Manager のハンドラッパー(10)
api.ui.com に直接アクセスするアカウントレベルのツール:
unifi_sm_list_hosts:アカウント上のすべての UniFi コンソールを一覧表示します(pageSize、nextTokenは省略可能)unifi_sm_get_host:単一のコンソールの詳細を取得しますunifi_sm_list_sites:アカウントレベルのサイトを一覧表示します(pageSize、nextTokenは省略可能)。各サイトのstatisticsオブジェクトは、includeStatistics: trueを指定しない限り省略されますunifi_sm_list_devices:アカウントレベルのデバイス一覧を取得します(hostIds、time、pageSize、nextTokenは省略可能)unifi_sm_get_isp_metrics:バケット単位(5m/1h)の ISP メトリクスを取得します。beginTimestamp/endTimestampまたはduration(24h、7d、30d)を指定できますunifi_sm_query_isp_metrics:時間枠を指定して ISP メトリクスをクエリしますunifi_sm_list_sdwan_configs:SD-WAN 設定を一覧表示しますunifi_sm_get_sdwan_config:単一の SD-WAN 設定を取得しますunifi_sm_get_sdwan_config_status:SD-WAN 設定のステータスを取得しますunifi_sm_identity:解決済みの consoleId、networkSiteId、siteManagerSiteId を取得します
Network のハンドラッパー(76)
リソース別に分類された、Cloud Connector プロキシ経由でコンソール単位で使用するツールです。すべての unifi_net_list_* ツールでは、offset、limit、filter(ベンダーのフィルター構文)を省略可能です。結果にさらに項目がある場合は、次のオフセットを示す pagination ヒントが含まれます。
- 情報/サイト(2):
unifi_net_get_info、unifi_net_list_sites - デバイス(9):
unifi_net_list_devices、unifi_net_get_device、unifi_net_get_device_stats、unifi_net_list_pending_devices、unifi_net_adopt_devices、unifi_net_device_action、unifi_net_reboot_device、unifi_net_port_action、unifi_net_remove_device - クライアント(5):
unifi_net_list_clients、unifi_net_get_client、unifi_net_client_action、unifi_net_block_client、unifi_net_unblock_client(ブロック/ブロック解除は「未対応」エラーを返します。Network API にはそのようなクライアント操作はありません) - ネットワーク(6):
unifi_net_list_networks、unifi_net_get_network、unifi_net_get_network_references、unifi_net_create_network、unifi_net_update_network、unifi_net_delete_network - WiFi ブロードキャスト(5):
unifi_net_list_wifi、unifi_net_get_wifi、unifi_net_create_wifi、unifi_net_update_wifi、unifi_net_delete_wifi - ファイアウォール(13):
unifi_net_list_firewall_zones、unifi_net_get_firewall_zone、unifi_net_create_firewall_zone、unifi_net_update_firewall_zone、unifi_net_delete_firewall_zone、unifi_net_list_firewall_policies、unifi_net_get_firewall_policy、unifi_net_create_firewall_policy、unifi_net_update_firewall_policy、unifi_net_patch_firewall_policy、unifi_net_delete_firewall_policy、unifi_net_get_firewall_policy_ordering、unifi_net_reorder_firewall_policies - ACL ルール(7):
unifi_net_list_acl_rules、unifi_net_get_acl_rule、unifi_net_create_acl_rule、unifi_net_update_acl_rule、unifi_net_delete_acl_rule、unifi_net_get_acl_rule_ordering、unifi_net_reorder_acl_rules - DNS ポリシー(5):
unifi_net_list_dns_policies、unifi_net_get_dns_policy、unifi_net_create_dns_policy、unifi_net_update_dns_policy、unifi_net_delete_dns_policy - トラフィック照合リスト(5):
unifi_net_list_traffic_lists、unifi_net_get_traffic_list、unifi_net_create_traffic_list、unifi_net_update_traffic_list、unifi_net_delete_traffic_list - ホットスポット用バウチャー(5):
unifi_net_list_vouchers、unifi_net_get_voucher、unifi_net_create_vouchers、unifi_net_delete_voucher、unifi_net_delete_vouchers - スイッチング(6):
unifi_net_list_switch_stacks、unifi_net_get_switch_stack、unifi_net_list_mclag_domains、unifi_net_get_mclag_domain、unifi_net_list_lags、unifi_net_get_lag - サポート(8):
unifi_net_list_wans、unifi_net_list_site_to_site_vpn、unifi_net_list_vpn_servers、unifi_net_list_radius_profiles、unifi_net_list_device_tags、unifi_net_list_dpi_application_categories、unifi_net_list_dpi_applications、unifi_net_list_countries
自動生成ツール(82)
unifi_gen_<operationid> という名前です(ベンダーの operationId を小文字にしたもの。例:unifi_gen_createfirewallpolicy、unifi_gen_getinfo)。ドキュメント化されている UniFi API エンドポイントごとに 1 つのツールがあります(Site Manager API v1.0.0、Network API v11.0.97)。ただし、Site Manager の connector* プロキシエンドポイントは除きます。これらには unifi_raw_request を使用します。siteId はディスカバリーから自動的に解決されるため、呼び出し元が渡す必要はありません。書き込みツールはベンダーのリクエスト本文を body スキーマに記載しますが、0.2.1 と同様、任意の body 値をそのまま受け取り、送信します。unifi_gen_listsites は、includeStatistics: true が指定されない限り、各サイトの statistics オブジェクトを省略します。これは unifi_sm_list_sites と同じ動作です。すべてのツールの一覧は src/tools/generated/ を参照してください。
エスケープハッチ(1)
unifi_raw_request(method, path, body?, query?):api.ui.com{path} に対して任意の HTTP メソッドを実行します。パスは相対パスである必要があります。拒否される内容については SECURITY.md を参照してください。認証、再試行、エラー解析、ページネーションのヒントは自動的に処理されます。専用のツールがない場合に便利です。レスポンスはそのまま返されます。ここでの GET /v1/sites は、unifi_sm_list_sites がデフォルトで省略する statistics オブジェクトを保持します。
エラー
呼び出しに失敗すると、details に HTTP の statusCode(レスポンスが届かなかった場合は 0)と、判明している場合は code を含むエラー結果が返されます。code は UniFi API のコード、または NETWORK_ERROR、REDIRECT_REFUSED、TIMEOUT、CANCELLED(クライアントが呼び出しをキャンセルした場合)です。
リソース
unifi://identity:解決済みの consoleId と両方の siteId、およびコンソールのメタデータunifi://hosts:アカウントのホスト一覧unifi://hosts/{id}:単一ホストの詳細
プロンプト
unifi-audit-firewall:ファイアウォールのゾーンとポリシーを確認し、弱いルールにフラグを付けて、強化策を提案しますunifi-network-health:設定済みの WAN、状態別のデバイス数と保留中のファームウェア更新、タイプ別の接続クライアントと直近の接続クライアントunifi-adoption-status:保留中の採用に関するレポートと、採用/拒否の推奨
書き込みの安全性
デフォルトでは(UNIFI_CONFIRM_WRITES が未設定または true の場合)、破壊的なツールには明示的な confirm: "YES" 引数が必要です。指定しない場合、パスワード、WiFi のパスフレーズ、事前共有鍵、シークレット、トークン、本文内のキーが (redacted) に置き換えられたプレビューを返します。UNIFI_CONFIRM_WRITES=false を設定すると、破壊的なツールを直接実行できます。これらの設定にかかわらず、書き込みツールは、値の深さを問わず、値が正確に (redacted) である本文を拒否します(これは UNIFI_REDACT_SECRETS およびプレビューで使われるプレースホルダーです)。プレビューやリクエストを行う前に、該当フィールドのパスを含む code: "REDACTED_PLACEHOLDER" エラーを返すため、秘匿化を有効にして読み取ったオブジェクトによって、パスフレーズがプレースホルダーで上書きされることはありません。実際の値を設定するか、フィールドを省略してください。
{
"data": {
"preview": {
"tool": "unifi_net_create_vouchers",
"method": "POST",
"url": "/v1/connector/consoles/.../proxy/network/integration/v1/sites/.../hotspot/vouchers",
"body": { "count": 1, "name": "demo" }
},
"hint": "Write confirmation is on (UNIFI_CONFIRM_WRITES). Re-run with `confirm: \"YES\"` to apply this change."
}
}
すべての書き込みツールは dry_run: true も受け付けます。これを指定すると、confirm: "YES" または UNIFI_CONFIRM_WRITES=false の場合でも、同じプレビューを返し、実行はしません。UNIFI_READ_ONLY=true の場合、書き込みツールは code: "READ_ONLY" で拒否し、何も送信しません。読み取りツールは引き続き動作します。
モデルは自ら confirm: "YES" を送信できるため、このガードはモデルに対する第 2 の手順であり、人間による承認ではありません。書き込みのたびに自分で承認する場合は、MCP クライアントで書き込みツールごとの承認を有効にしてください(すべての書き込みツールに destructiveHint: true が設定されています)。
例
サーバーをインストールした後、Claude に貼り付けられるプロンプト:
- 「すべての UniFi ネットワークと、それぞれの VLAN ID を表示してください。」
- 「現在オフラインになっている UniFi デバイスはどれですか?」
- 「ファイアウォールの状態を監査してください。ゾーンごとにルールをまとめ、allow-any-any があればフラグを付けてください。」
- 「
AP-Office-1という名前のアクセスポイントを再起動してください。」 - 「
SW-Officeという名前のスイッチの PoE ポート 3 の電源を入れ直してください。」
破壊的な操作の例では UNIFI_CONFIRM_WRITES(デフォルトは true)の設定が適用されます。モデルはまずプレビューを受け取り、適用するには confirm: "YES" を付けて再度呼び出す必要があります。
制限事項
- クラウド専用です。 すべてのリクエストは、Site Manager API と Network Cloud Connector プロキシを経由して UniFi クラウドエンドポイント(
api.ui.com)に送信されます。コントローラーへの直接接続やローカルネットワークモードには対応していません。 - 単一アカウント、所有するコンソールが対象です。 検出処理では、API キーが所有するコンソールを特定します。複数コンソールや複数サイトのアカウントでは、
UNIFI_*_ID変数で ID を指定してください(トラブルシューティングを参照)。 - 自動生成ツールは公開ドキュメントに準拠します。
unifi_gen_*ツールは UniFi のドキュメントに記載されたエンドポイントから生成されます。入力スキーマの正確さは上流のドキュメントに依存します。エンドポイントの動作がスキーマの説明と異なる場合は、unifi_raw_requestを使用してください。 - Network API には新しいファームウェアが必要です。 Network API は、ファームウェアが 5.0.3 以上のコンソールでのみ利用できます。
- イベントストリーミング/WebSocket には対応していません。 ツールはリクエストとレスポンスのみを扱い、ライブイベントのサブスクリプションには対応していません。
トラブルシューティング
「Discovery: no console found …」
検出処理では、まずキーが所有する console タイプのホストを使用します。そのようなホストがない場合に限り、所有する ucore(UniFi OS Server)タイプのホストを使用します。コンソールのタイプが異なる場合、またはキーがホストを所有していない場合は、UNIFI_CONSOLE_ID=<id> を設定してください(unifi_sm_list_hosts に表示される id)。
「Discovery: multiple consoles match …」
Site Manager アカウントに複数の UniFi コンソールがあります。表示された ID のいずれかを使用して UNIFI_CONSOLE_ID=<id> を設定してください。複数の Network サイト(UNIFI_NETWORK_SITE_ID)や Site Manager サイト(UNIFI_SITE_MANAGER_SITE_ID)の場合も、同様に設定します。
401 Unauthorized
API キーに Network スコープがないか、キーが取り消されています。unifi.ui.com でキーを再生成し、Site Manager と UniFi Applications → Network の両方のスコープを有効にしてください。チャットやコミットで一度でも公開されたキーは、必ずローテーションしてください。
Claude Desktop にツールが表示されない
claude_desktop_config.json を編集した後、Claude Desktop を再起動してください。設定の変更は起動時にのみ読み込まれます。MCP ログは ~/Library/Logs/Claude/mcp-server-unifi.log(macOS)にあります。起動エラーや検出の失敗がないか確認してください。
非常に大きなリクエストの直後にサーバーが停止する
受信メッセージが 1 件で行の上限を超えると、MCP SDK は stdio トランスポートを閉じます(SECURITY.mdを参照)。その後、プロセスは stderr に stdio transport closed を記録し、エラー結果を返さずに終了コード 1 で終了します。入力を分割し(たとえば MAC アドレスの数を減らす、または呼び出しごとの本文を小さくする)、サーバーを再起動してください。
開発
npm run dev # tsx watch
npm run test:unit # unit tests (offline; what prebuild runs)
npm test # unit tests (offline; the live smoke is not part of it)
npm run test:integration # live read-only smoke against api.ui.com (only with UNIFI_LIVE=1 and UNIFI_API_KEY)
npm run codegen # download the vendor OpenAPI docs and regenerate src/tools/generated/ (see CONTRIBUTING.md first)
npm run inspector # MCP Inspector
npm run build:mcpb # build MCPB bundle + SBOMs into release/
npm run lint # ESLint (type-aware, src, tests, scripts)
npm run typecheck # tsc --noEmit (src), then tsconfig.tests.json (tests, scripts)
全体のワークフローについては、CONTRIBUTING.mdを参照してください。
アーキテクチャ
3 層のツール設計。 手書きのラッパー(unifi_sm_*、unifi_net_*)は、ID の自動解決と名前付き引数により、一般的な操作に使いやすく、ドキュメントも充実したエントリーポイントを提供します。自動生成された 82 個のツール(unifi_gen_*)は、コード生成カタログ(src/codegen/catalog.ts)に記載されたエンドポイントを網羅し、入力スキーマは上流の UniFi ドキュメントから導出されます。最初の 2 層で対応できない操作には、unifi_raw_request を使用できます。
遅延 ID 検出。 初回使用時に、サーバーは GET /v1/hosts を呼び出して所有コンソール(タイプが console のもの、または該当するコンソールがない場合は ucore)を見つけ、その後 GET /v1/sites(Network および Site Manager)を呼び出して両方の siteId を検出します。結果はプロセスの存続期間中キャッシュされます。同時に呼び出された場合は、保存されたプロミスを使って、進行中のリクエスト 1 件を共有します。複数コンソール/複数サイトのアカウントでは、環境変数を使って 3 つの ID すべてを固定できます。
再試行。 1 つのリクエストにつき、最大 3 回まで試行します。リクエストがサーバーに拒否されたことを示す 429 は、Retry-After(最大 60 秒)に従い、すべてのメソッドで再試行します。5xx と接続切断は GET の場合にのみ再試行します。POST、PUT、PATCH、DELETE は、接続が確立されなかった場合(例:ECONNREFUSED、ENOTFOUND)に限り、ネットワークエラー後に再送します。これにより、UniFi にすでに到達した可能性のある書き込みが重複することはありません。リダイレクトは拒否されます(API キーが設定済みのホストから外部に送られることはありません)。タイムアウトは再試行されません。ネットワーク障害は原因を含むエラーとして返され、warn レベルでログに記録されます。
コード生成パイプライン。 独立したビルドステップ(npm run codegen)で、ベンダーの OpenAPI ドキュメント(developer.ui.com/<api>/<version>/openapi.json)を tests/fixtures/openapi/ にダウンロードし、カタログに記載された各操作を Zod スキーマに変換して、エンドポイントごとに 1 つの .ts ファイルを出力します。カタログのすべての項目が成功しない限り、何も書き込みません。また、ベンダーの操作がカタログにも除外リストにもない場合は失敗します。npm run codegen -- --offline を実行すると、コミット済みのドキュメントから再生成されます。コミット済みの出力とバイト単位で一致することをユニットテストで確認します。出力は src/tools/generated/ に格納され、オフラインでビルドできるよう git にコミットされます。
セキュリティ
- API キーは環境変数
UNIFI_API_KEYからのみ読み込みます。ハードコードしないでください。 .envは gitignore に登録されています。envにキーを保持する MCP クライアント設定(例:claude_desktop_config.json)では、キーがプレーンテキストで保存されます。このファイルは非公開にしてください。- stderr ロガーは、既知のシークレットパターン(
UNIFI_API_KEY=...、X-API-Key、Authorization、apiKey、api_key、およびクエリパラメーターのapi_key/apikey/token/access_token)を、設定済みの API キーと完全一致する値も含めて、出力のどこに現れてもマスキングします。他のツールが書き込む出力は対象外です。 - リクエストパスは、設定された
UNIFI_API_BASEのオリジンに対する相対パスです。オリジンにはhttps://が必要です(ループバックのテスト用スタブに限り、通常のhttp://を使用できます)。API キーはそのオリジンにのみ送信され、リダイレクトは拒否されます。 - UniFi API のエラーテキストはログ行と同様にサニタイズされ、モデルに渡される前に固定長に切り詰められます。
- 破壊的な操作の前に確認ステップを設けるため、
UNIFI_CONFIRM_WRITES=true(デフォルト)を維持してください。 - ツールの結果には、UniFi の設定で名前を付けられるユーザーが制御する文字列(デバイス名、クライアントのホスト名、SSID、ルールの説明など)が含まれます。サーバーの指示では、モデルにこれらをデータとして扱うよう伝えていますが、破壊的なツールを実行する前に、MCP クライアントから確認を求めるようにしてください。脅威モデルについては SECURITY.md を参照してください。
脆弱性を報告する場合は、GitHub Security Advisories を使用してください。公開の Issue は作成しないでください。SECURITY.md を参照してください。
メンテナンス状況
- 1 人のメンテナー(@mguttmann)が、空き時間に可能な範囲でメンテナンスしています。サポート契約はなく、応答時間も保証されません。
- セキュリティ修正を機能追加より優先します。脆弱性は非公開で報告してください(セキュリティを参照)。
- 依存関係の更新は Dependabot によって行われます。ランタイム依存関係に既知の重大または深刻なアドバイザリがある場合、CI は失敗します。
- 修正は最新のマイナーリリースにのみ提供されます。
unifi_gen_*ツールは公開されている UniFi API ドキュメントに準拠しています。Ubiquiti が API を変更した場合は、後続のリリースで再生成されます。未対応項目はBACKLOG.mdに記載されています。- Issue とプルリクエストを歓迎します。CONTRIBUTING.mdと行動規範を参照してください。
貢献
CONTRIBUTING.mdを参照してください。
ライセンス
MIT ライセンスです。LICENSEを参照してください。tests/fixtures/openapi/にあるベンダー提供の OpenAPI ドキュメント(Ubiquiti の開発者向けドキュメント)は MIT ライセンスの対象外です。NOTICEを参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。