Skip to main content

UniFi Protect MCP Server

Project description

UniFi Protect MCP Server

UniFi Protect MCP Server

MCP server exposing UniFi Protect tools for LLMs, agents, and automation platforms. Query cameras, events, smart detections, recordings, lights, sensors, chimes, and the Alarm Manager -- with safe-by-default permissions and preview-before-confirm for all mutations.

License: MIT Python 3.13+

Install

Claude Code (recommended)

The plugin installs the MCP server, an agent skill for tool discovery, and a guided setup command:

/plugin marketplace add sirkirby/unifi-mcp
/plugin install unifi-protect@unifi-plugins

Then run the interactive setup to configure your controller connection:

/unifi-protect:setup

This walks you through entering your controller host, credentials, and permission preferences — then writes everything to .claude/settings.json so it persists across sessions. If you already have the Network plugin configured on the same controller, the setup will detect and reuse those credentials. Restart Claude Code after setup to connect.

PyPI / Docker

# PyPI
uvx unifi-protect-mcp@latest
# or: pip install unifi-protect-mcp

# Docker
docker pull ghcr.io/sirkirby/unifi-protect-mcp:latest

# From source
git clone https://github.com/sirkirby/unifi-mcp.git
cd unifi-mcp && uv sync

Usage Examples

Once connected, just ask your AI agent in natural language:

"List all cameras that detected motion in the last hour"

"Show me smart detection events from the front door camera today — people and vehicles only"

"Which cameras have the most motion events this week? Any unusual patterns?"

"Are there any cameras offline or with degraded connections?"

"Show me all recording events from the driveway camera between 2 AM and 5 AM last night"

"What sensors triggered alerts today and what were the readings?"

All camera and event queries are read-only by default. Mutations (camera settings, light controls) use a preview-then-confirm flow.

Configure

Set these environment variables (or create a .env file). If you used /unifi-protect:setup, this is already done.

# Server-specific variables (recommended)
UNIFI_PROTECT_HOST=192.168.1.1      # Controller IP or hostname
UNIFI_PROTECT_USERNAME=admin         # Local admin username
UNIFI_PROTECT_PASSWORD=your-password # Admin password
# Optional:
# UNIFI_PROTECT_API_KEY=             # UniFi API key (experimental — read-only, subset of tools)
# UNIFI_PROTECT_PORT=443             # Controller HTTPS port
# UNIFI_PROTECT_VERIFY_SSL=false     # SSL certificate verification

Fallback: The shared UNIFI_* variables (e.g., UNIFI_HOST) also work. The server checks for UNIFI_PROTECT_* first and falls back to UNIFI_* if the server-specific variable is not set. For single-controller setups, the shared variables are all you need.

Run

# stdio transport (default -- for Claude Desktop, LM Studio, etc.)
unifi-protect-mcp

# Docker
docker run -i --rm \
  -e UNIFI_PROTECT_HOST=192.168.1.1 \
  -e UNIFI_PROTECT_USERNAME=admin \
  -e UNIFI_PROTECT_PASSWORD=secret \
  ghcr.io/sirkirby/unifi-protect-mcp:latest

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "unifi-protect": {
      "command": "uvx",
      "args": ["unifi-protect-mcp"],
      "env": {
        "UNIFI_PROTECT_HOST": "192.168.1.1",
        "UNIFI_PROTECT_USERNAME": "admin",
        "UNIFI_PROTECT_PASSWORD": "your-password"
      }
    }
  }
}

Features

  • Cameras -- list, inspect, snapshot, RTSP streams, PTZ control, settings, recording toggle, reboot
  • Events -- query historical events, smart detections (person/vehicle/animal/package), thumbnails
  • Real-time streaming -- websocket event buffer with MCP resource subscriptions and polling
  • Recordings -- status, availability, clip export with timelapse support
  • Devices -- lights (brightness, PIR sensitivity), sensors (temperature, humidity, motion), chimes (volume, trigger)
  • Liveviews -- list and inspect multi-camera layouts
  • System -- NVR info, health metrics, firmware status, connected viewers

Agent Skills

The Protect plugin ships one agent skill that works alongside the MCP tools:

Security Digest

Cross-product event intelligence that generates a concise security summary across all connected UniFi systems.

  • Sources: Protect camera events, Access door events, Network firewall activity
  • Severity classification: Events are classified by time-of-day context (business hours vs. after hours vs. overnight) and event type (person detection, vehicle, door access, firewall block, etc.)
  • Cross-product correlation: Five built-in correlation rules surface patterns that span products:
    • Motion at a door camera without a corresponding badge-in
    • Multiple failed door access attempts in a short window
    • Person detection coinciding with firewall blocks from the same timeframe
    • After-hours camera activity with no Access event
    • Repeated vehicle detections at the perimeter
  • Activity counts: Aggregated totals across all sources for quick at-a-glance awareness

Invoke via the skill command after installing the plugin:

/unifi-protect:security-digest

Event Improvements

camera_name in Event Responses

All event-related tools now include camera_name alongside camera_id in every event object. The name is resolved from bootstrap data cached at startup — no extra API calls required.

Affected tools: protect_list_events, protect_list_smart_detections, protect_recent_events

Before:

{ "camera_id": "abc123", "type": "motion", ... }

After:

{ "camera_id": "abc123", "camera_name": "Front Door", "type": "motion", ... }

This eliminates the need to call protect_list_cameras separately just to map IDs to names.

Compact Mode

protect_list_events and protect_list_smart_detections accept a compact=true parameter that strips low-signal fields from responses: thumbnail_id, category, sub_category, and is_favorite. This produces responses roughly 40% smaller.

# Standard call
protect_list_events(limit=50)

# Compact — recommended for digests, summaries, and context-constrained workflows
protect_list_events(limit=50, compact=True)

Compact mode is the recommended default when building summaries or feeding events into downstream prompts where token budget matters.

Documentation

  • Configuration -- Full env var reference, YAML config, Protect-specific options
  • Permissions -- Permission system, category defaults, how to enable mutations
  • Tool Catalog -- All 38 tools organized by category
  • Event Streaming -- Real-time event architecture, MCP resources, polling
  • Troubleshooting -- Connection issues, SSL, missing tools

Development

cd apps/protect
make test         # Run tests
make lint         # Lint
make format       # Format
make manifest     # Regenerate tools_manifest.json
make pre-commit   # All of the above

See the root CONTRIBUTING.md for the full monorepo workflow.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

unifi_protect_mcp-0.3.0.tar.gz (51.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

unifi_protect_mcp-0.3.0-py3-none-any.whl (71.0 kB view details)

Uploaded Python 3

File details

Details for the file unifi_protect_mcp-0.3.0.tar.gz.

File metadata

  • Download URL: unifi_protect_mcp-0.3.0.tar.gz
  • Upload date:
  • Size: 51.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for unifi_protect_mcp-0.3.0.tar.gz
Algorithm Hash digest
SHA256 d914fbea00b032a574ddc6d3fd7a8934ae4c53d9f83e8ccb996a2b3e1eef02e5
MD5 37ba9c40ec552a4240b9caea90b7329e
BLAKE2b-256 8751e677a51f995f0e490c00e64630b52c3de8f331776383a8eb91502a1d6733

See more details on using hashes here.

Provenance

The following attestation bundles were made for unifi_protect_mcp-0.3.0.tar.gz:

Publisher: publish-protect.yml on sirkirby/unifi-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file unifi_protect_mcp-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for unifi_protect_mcp-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 eda0ccfbf873044b73c61e875514fa02e8c2b686424210eeb244be148bcd173e
MD5 89b0c45dde6cc7cce87453871d302f74
BLAKE2b-256 6e212d861362e44c69f9e387ba8c9b93e1939a211ec535f9eb519538d2be666d

See more details on using hashes here.

Provenance

The following attestation bundles were made for unifi_protect_mcp-0.3.0-py3-none-any.whl:

Publisher: publish-protect.yml on sirkirby/unifi-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page