Skip to main content
Glama

mcp-unifi

CI Release License: MIT Python MCP Coverage

セルフホスト型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ワークフローを単一のツール呼び出しに短縮できます。

クイックスタート

公開されているイメージをプルして実行します:

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.0

APIキーは、ゲートウェイの 設定 → コントロールプレーン → インテグレーション から生成してください。

ツールリファレンス

ツール

シグネチャ

機能

list_devices

()

採用済みのゲートウェイ、AP、スイッチを、状態、稼働時間、無線ごとの情報とともにリストします。

list_networks

()

設定済みのすべてのネットワーク/VLAN(サブネット、DHCP範囲、VLAN ID)をリストします。

create_vlan

(name, vlan_id, subnet, dhcp_start?, dhcp_stop?, purpose?)

新しいVLANタグ付きネットワークを作成します。

update_vlan

(network_id, updates)

既存のVLANのフィールドをパッチします。

delete_vlan

(network_id)

VLANを削除します。

list_wlans

()

すべてのWiFi SSIDをリストします。

create_wlan

(name, passphrase, network_id, security?, wpa_mode?, is_guest?, hide_ssid?, wlan_band?)

特定のVLANにバインドされた新しいSSIDを作成します。

update_wlan

(wlan_id, updates)

既存のSSIDのフィールド(名前、パスフレーズ、hide_ssidなど)をパッチします。

delete_wlan

(wlan_id)

WiFi SSIDを削除します。

list_firewall_rules

()

すべてのファイアウォールルールをリストします。

create_firewall_rule

(name, ruleset, action, rule_index?, protocol?, src_address?, dst_address?, src_networkconf_id?, dst_networkconf_id?, enabled?)

ファイアウォールルールを作成します。

delete_firewall_rule

(rule_id)

ファイアウォールルールを削除します。

list_port_profiles

()

スイッチポートプロファイル(PoEモード、ネイティブVLAN、転送)をリストします。

list_clients

()

現在接続されている無線および有線クライアント(MAC、ホスト名、IP、信号強度/満足度、APまたはスイッチポート、稼働時間)をリストします。

create_iot_network

(name, vlan_id, passphrase, main_lan_subnet?, subnet?, isolate?, hide_ssid?)

一括作成:VLAN + SSID + 分離ルール。失敗時はロールバックします。

すべてのツールはJSON文字列を返します。エラーは構造化された {"error": "...", "stub_mode": bool} オブジェクトとして返されるため、ClaudeはMCPループをクラッシュさせることなく失敗を表示できます。

スタブモードとリアルモード

モード

使用場面

動作

スタブ (STUB_MODE=true, デフォルト)

開発、デモ、ハードウェア到着前のClaudeフロー構築

1つのゲートウェイ、1つのAP、1つのネットワーク、1つのSSID、1つのファイアウォールルール、2つのポートプロファイルでシードされたメモリ内ステートマシン。作成/更新/削除はコンテナの存続期間中保持されます。再起動でリセットされます。

リアル (STUB_MODE=false)

UCG-Fiber/UDM/その他のUniFi OSゲートウェイでの本番運用

ローカルAPIキーを使用してゲートウェイとHTTPS通信します。UNIFI_HOSTUNIFI_API_KEY が必要です。

モードの切り替えは設定変更であり、コード変更ではありません。同じ11個のツール、同じレスポンス形式です。

設定

すべての設定は環境変数(および存在する場合は .env ファイル)から読み込まれます。設定は起動時にPydanticによって検証され、無効な値がある場合は役立つメッセージとともに即座に失敗します。

変数

デフォルト

必須

メモ

STUB_MODE

bool

true

いいえ

false の場合、リアルモードの認証情報が必要です。

UNIFI_HOST

string

""

リアルモードのみ

ゲートウェイのIPまたはホスト名(スキームなし)。

UNIFI_PORT

int

443

いいえ

ゲートウェイのHTTPSポート。

UNIFI_SITE

string

default

いいえ

コントローラーのサイト識別子。

UNIFI_API_KEY

string

""

リアルモードのみ

設定 → コントロールプレーン → インテグレーション からのローカルAPIキー。

UNIFI_VERIFY_SSL

bool

false

いいえ

ゲートウェイに正規の証明書をインストールしている場合は true に設定します。

IOT_SUBNET_TEMPLATE

string

10.0.{vlan_id}.0/24

いいえ

{vlan_id} プレースホルダーを含める必要があります。

IOT_DHCP_START_OFFSET

int (2-254)

100

いいえ

IoT /24 内の最初のDHCPリースオフセット。

IOT_DHCP_STOP_OFFSET

int (2-254)

200

いいえ

IoT /24 内の最後のDHCPリースオフセット。

MCP_HOST

string

0.0.0.0

いいえ

バインドアドレス。

MCP_PORT

int

3714

いいえ

リッスンポート。

LOG_LEVEL

enum

INFO

いいえ

DEBUG, INFO, WARNING, ERROR, CRITICAL のいずれか。

LOG_FORMAT

enum

json

いいえ

本番環境は json、ローカル開発は text

完全な例は .env.example にあります。

MCPクライアントの設定

Claude Code

claude mcp add unifi --transport http --scope user --url http://<host>:3714/mcp

Claude 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 で実行され、シェルやホームディレクトリはなく、読み取り専用のルートファイルシステム/tmptmpfs)で、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.13

Dependabotが、requirements.in レベルの更新とDockerベースイメージのダイジェスト更新のために毎週PRを作成します。

謝辞

UniFiコントローラーのエンドポイントパスは、sirkirby/unifi-mcp プロジェクトを参照しました。そのリポジトリはAPIサーフェスの調査資料として使用されましたが、コードはコピーされていません。ここでの実装は、実績のあるForgeパターンに従った独立したFastMCP + httpxビルドです。

ライセンス

MIT

貢献

Issueやプルリクエストを歓迎します。PRを開く前に:

  1. ruff checkruff format --checkmypy src/mcp_unifi がクリーンであることを確認してください。

  2. テストを追加または更新し、カバレッジを80%以上に維持してください。

  3. ローカルで pytest を実行し、スイートがパスすることを確認してください。

  4. CHANGELOG.md[Unreleased] 見出しの下を更新してください。

A
license - permissive license
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
2Releases (12mo)

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pete-builds/mcp-unifi'

If you have feedback or need assistance with the MCP directory API, please join our Discord server