mcp-unifi
mcp-unifi
セルフホスト型UniFiゲートウェイ管理用のMCPサーバーです。デバイス、ネットワーク/VLAN、WiFi SSID(フルCRUD)、ファイアウォールルール(フルCRUD)、スイッチポートプロファイル、接続クライアントを網羅する15種類のツールに加え、分離されたIoTサブネット(VLAN、SSID、ファイアウォールブロック)を単一の呼び出しでプロビジョニングし、部分的な失敗時には自動ロールバックを行う create_iot_network ツールを提供します。
FastMCPとStreamable HTTPトランスポート上に構築されています。ローカルAPIキーを使用して、UCG-Fiber、UDM Pro、またはその他のUniFi OSゲートウェイと通信します。サイトマネージャーやクラウドアカウントは不要です。
すべてのツールはJSONを返します。エラーは構造化された {"error": "...", "stub_mode": bool} オブジェクトとして返されるため、ゲートウェイの不調によってMCPループがクラッシュすることはありません。
理由
現在のUniFi自動化の多くは、コントローラーUIのクリック操作、壊れやすい場当たり的なスクリプトの作成、または重量級のコミュニティSDKの導入を必要とします。mcp-unifiは、MCP対応クライアント(Claude Code、Claude Desktop、カスタムエージェント)に対して、毎週行うような操作(IoT VLANの立ち上げ、ファイアウォールルールの追加、SSIDの監査、採用済みデバイスのリスト表示など)のための、小さく、焦点を絞った、型安全なインターフェースを提供します。
複合ツールである create_iot_network を使用すれば、15ステップかかるUIワークフローを単一のツール呼び出しに短縮できます。
Related MCP server: UniFi MCP
クイックスタート
公開されているイメージをプルして実行します:
docker run --rm \
-p 3714:3714 \
-e STUB_MODE=true \
ghcr.io/pete-builds/mcp-unifi:0.2.0サーバーはデフォルトでスタブモードで起動します。これは現実的なモックデータを返し、UniFiハードウェアを必要としません。Claude Codeに登録します:
claude mcp add unifi --transport http --scope user --url http://localhost:3714/mcp次に、Claude Codeに「私のUniFiデバイスをリストして」と尋ねると、2つのスタブ化されたデバイスが表示されるはずです。
実際のゲートウェイと通信するには、認証情報を渡し、スタブモードをオフにします:
docker run --rm \
-p 3714:3714 \
-e STUB_MODE=false \
-e UNIFI_HOST=192.168.1.1 \
-e UNIFI_API_KEY=<your-local-api-key> \
ghcr.io/pete-builds/mcp-unifi:0.2.0APIキーは、ゲートウェイの 設定 → コントロールプレーン → インテグレーション から生成してください。
ツールリファレンス
ツール | シグネチャ | 機能 |
|
| 採用済みのゲートウェイ、AP、スイッチを、状態、稼働時間、無線ごとの情報とともにリストします。 |
|
| 設定済みのすべてのネットワーク/VLAN(サブネット、DHCP範囲、VLAN ID)をリストします。 |
|
| 新しいVLANタグ付きネットワークを作成します。 |
|
| 既存のVLANのフィールドをパッチします。 |
|
| VLANを削除します。 |
|
| すべてのWiFi SSIDをリストします。 |
|
| 特定のVLANにバインドされた新しいSSIDを作成します。 |
|
| 既存のSSIDのフィールド(名前、パスフレーズ、hide_ssidなど)をパッチします。 |
|
| WiFi SSIDを削除します。 |
|
| すべてのファイアウォールルールをリストします。 |
|
| ファイアウォールルールを作成します。 |
|
| ファイアウォールルールを削除します。 |
|
| スイッチポートプロファイル(PoEモード、ネイティブVLAN、転送)をリストします。 |
|
| 現在接続されている無線および有線クライアント(MAC、ホスト名、IP、信号強度/満足度、APまたはスイッチポート、稼働時間)をリストします。 |
|
| 一括作成:VLAN + SSID + 分離ルール。失敗時はロールバックします。 |
すべてのツールはJSON文字列を返します。エラーは構造化された {"error": "...", "stub_mode": bool} オブジェクトとして返されるため、ClaudeはMCPループをクラッシュさせることなく失敗を表示できます。
スタブモードとリアルモード
モード | 使用場面 | 動作 |
スタブ ( | 開発、デモ、ハードウェア到着前のClaudeフロー構築 | 1つのゲートウェイ、1つのAP、1つのネットワーク、1つのSSID、1つのファイアウォールルール、2つのポートプロファイルでシードされたメモリ内ステートマシン。作成/更新/削除はコンテナの存続期間中保持されます。再起動でリセットされます。 |
リアル ( | UCG-Fiber/UDM/その他のUniFi OSゲートウェイでの本番運用 | ローカルAPIキーを使用してゲートウェイとHTTPS通信します。 |
モードの切り替えは設定変更であり、コード変更ではありません。同じ11個のツール、同じレスポンス形式です。
設定
すべての設定は環境変数(および存在する場合は .env ファイル)から読み込まれます。設定は起動時にPydanticによって検証され、無効な値がある場合は役立つメッセージとともに即座に失敗します。
変数 | 型 | デフォルト | 必須 | メモ |
| bool |
| いいえ |
|
| string |
| リアルモードのみ | ゲートウェイのIPまたはホスト名(スキームなし)。 |
| int |
| いいえ | ゲートウェイのHTTPSポート。 |
| string |
| いいえ | コントローラーのサイト識別子。 |
| string |
| リアルモードのみ | 設定 → コントロールプレーン → インテグレーション からのローカルAPIキー。 |
| bool |
| いいえ | ゲートウェイに正規の証明書をインストールしている場合は |
| string |
| いいえ |
|
| int (2-254) |
| いいえ | IoT /24 内の最初のDHCPリースオフセット。 |
| int (2-254) |
| いいえ | IoT /24 内の最後のDHCPリースオフセット。 |
| string |
| いいえ | バインドアドレス。 |
| int |
| いいえ | リッスンポート。 |
| enum |
| いいえ |
|
| enum |
| いいえ | 本番環境は |
完全な例は .env.example にあります。
MCPクライアントの設定
Claude Code
claude mcp add unifi --transport http --scope user --url http://<host>:3714/mcpClaude Desktop
claude_desktop_config.json に以下を追加します:
{
"mcpServers": {
"unifi": {
"transport": "streamable-http",
"url": "http://<host>:3714/mcp"
}
}
}汎用設定
http://<host>:3714/mcp でStreamable HTTPを利用可能です。Streamable HTTPトランスポートをサポートするすべてのMCPクライアント(仕様 2025-03-26以降)が接続できます。
アーキテクチャ
+---------------------+ Streamable HTTP +---------------------+
| MCP Client | --------------------------> | mcp-unifi |
| (Claude Code, etc) | <-------------------------- | (FastMCP server) |
+---------------------+ +----------+----------+
|
| HTTPS + X-API-Key
v
+----------+----------+
| UniFi OS Gateway |
| /proxy/network/... |
+---------------------+このサーバーは軽量な非同期プロキシです。MCPツール呼び出しをUniFiコントローラーのREST呼び出しに変換し、レスポンスを整形してJSONを返します。状態を保存せず、クラウドへの呼び出しも行わず、着信MCP接続の認証も行いません(信頼できるLAN内で実行してください)。
セキュリティ上の注意
UNIFI_API_KEYはコンテナの環境変数内にのみ存在します。ログに記録されることはなく、MCPレスポンスでエコーバックされることもなく、このサーバーによってディスクに書き込まれることもありません。WLANパスフレーズは、すべてのツールレスポンスの出力時に(スタブモードであっても)スクラブ(
[REDACTED])されます。コンテナは UID 1000 で実行され、シェルやホームディレクトリはなく、読み取り専用のルートファイルシステム(
/tmpはtmpfs)で、no-new-privilegesが設定されています。ベースイメージはダイジェストで固定されています。Pythonの依存関係は、ハッシュロックされた
requirements.lockからpip --require-hashesを使用してインストールされます。公開されているイメージはマルチアーキテクチャ(amd64/arm64)であり、
docker/build-push-actionを介したビルドの来歴証明とSBOMが含まれています。MCPサーバー自体は認証されていません。信頼できるLAN境界、認証付きのリバースプロキシ、またはTailscale ACLの背後に配置してください。
脆弱性レポートについては、SECURITY.md を参照してください。
開発
Python 3.13+ と Docker が必要です。
# Clone + install dev deps
git clone https://github.com/pete-builds/mcp-unifi.git
cd mcp-unifi
python -m venv .venv && source .venv/bin/activate
pip install --require-hashes -r requirements-dev.lock
pip install -e . --no-deps
# Run the test suite (101 tests, ~95% coverage)
pytest
# Lint and format
ruff check src tests
ruff format src tests
# Type check (mypy strict)
mypy src/mcp_unifi
# Run the server locally in stub mode
python -m mcp_unifi.server
# Or build the image yourself instead of pulling from GHCR
cp docker-compose.example.yml docker-compose.yml
docker compose up --buildテスト
======================= 101 passed in 1.5s =======================
Name Stmts Miss Branch BrPart Cover
-----------------------------------------------------------------
src/mcp_unifi/__init__.py 2 0 0 0 100%
src/mcp_unifi/clients/__init__ 3 0 0 0 100%
src/mcp_unifi/clients/stubs.py 70 1 6 0 99%
src/mcp_unifi/clients/unifi.py 82 0 12 0 100%
src/mcp_unifi/config.py 38 1 8 0 98%
src/mcp_unifi/healthcheck.py 18 1 0 0 94%
src/mcp_unifi/logging_setup.py 33 1 12 2 93%
src/mcp_unifi/models.py 6 0 0 0 100%
src/mcp_unifi/server.py 232 15 70 5 92%
-----------------------------------------------------------------
TOTAL 484 19 108 7 95%CIは、80%以上のカバレッジ、ruff lint、ruff format、mypy strict、およびHIGHまたはCRITICALの発見で失敗するTrivy fs+imageスキャンによってゲートされています。
依存関係の更新
requirements.lock および requirements-dev.lock ファイルはハッシュ固定されています。requirements.in(または requirements-dev.in)を編集し、再生成します:
uv pip compile requirements.in --output-file requirements.lock --generate-hashes --python-version 3.13
uv pip compile requirements-dev.in --output-file requirements-dev.lock --generate-hashes --python-version 3.13Dependabotが、requirements.in レベルの更新とDockerベースイメージのダイジェスト更新のために毎週PRを作成します。
謝辞
UniFiコントローラーのエンドポイントパスは、sirkirby/unifi-mcp プロジェクトを参照しました。そのリポジトリはAPIサーフェスの調査資料として使用されましたが、コードはコピーされていません。ここでの実装は、実績のあるForgeパターンに従った独立したFastMCP + httpxビルドです。
ライセンス
MIT。
貢献
Issueやプルリクエストを歓迎します。PRを開く前に:
ruff check、ruff format --check、mypy src/mcp_unifiがクリーンであることを確認してください。テストを追加または更新し、カバレッジを80%以上に維持してください。
ローカルで
pytestを実行し、スイートがパスすることを確認してください。CHANGELOG.mdの[Unreleased]見出しの下を更新してください。
This server cannot be deployed
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for URnetwork VPN and Proxy
A MCP server built for developers enabling Git based project management with project and personal…
- ArcjetOAuthcom.arcjet
An MCP server for Arcjet - the runtime security platform that ships with your AI code.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- FlicenseBqualityDmaintenanceMCP server for UniFi Network Controller that provides full API coverage for managing APs, clients, WLANs, firewall rules, VLANs, port forwards, and more.51-
- AlicenseBqualityCmaintenanceAn MCP server that enables AI assistants to manage UniFi network infrastructure, including cloud management, local network devices, and Protect cameras, through natural language.62MIT
- AlicenseNot gradedqualityDmaintenanceA safety-first MCP server for managing UniFi networks, exposing 17 tools for telemetry, diagnostics, and guarded mutations with dry-run previews and confirm requirements.14MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for UniFi Network Controller enabling AI assistants to manage UniFi infrastructure via natural language. It supports firewall rules, IPv6, and uses lazy/eager tool modes to minimize context usage.6Mozilla Public 2.0