Skip to content
Agentmart
Submit a tool

UniFi Protect MCP

Manage UniFi Protect cameras, events, recordings, and smart detections.

Connector by sirkirby · GitHub account verified by the MCP Registry

IndexedMITLocal (stdio)★ 945
Write a review

Chalk Labs

Need help deploying UniFi Protect MCP?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.

npx agentmarket install connector/sirkirby-unifi-protect-mcp

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Manage UniFi Protect cameras, events, recordings, and smart detections via MCP.

Use cases: monitoring-observability

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.

Tools
31 read · 19 write · 7 delete
Secrets
3 (API keys, tokens or passwords)
Install scripts
None found
Runs as
Python package

Tools by what they do 57

Read from the source code; the running server may list different tools.

Read 31 · Look things up without changing anything.

  • protect_alarm_get_rule
  • protect_alarm_get_status
  • protect_alarm_list_profiles
  • protect_alarm_list_rules
  • protect_detection_search_labels
  • protect_export_clip
  • protect_get_camera
  • protect_get_camera_analytics
  • protect_get_camera_streams
  • protect_get_event
  • protect_get_event_thumbnail
  • protect_get_firmware_status
Show 19 more tools
  • protect_get_health
  • protect_get_incident_evidence
  • protect_get_recording_status
  • protect_get_snapshot
  • protect_get_system_info
  • protect_list_cameras
  • protect_list_chimes
  • protect_list_events
  • protect_list_known_faces
  • protect_list_known_license_plates
  • protect_list_lights
  • protect_list_liveviews
  • protect_list_recordings
  • protect_list_sensors
  • protect_list_smart_detections
  • protect_list_viewers
  • protect_recent_events
  • protect_search_detections
  • protect_subscribe_events

Write 19 · Create, change, send or run things.

  • protect_alarm_arm
  • protect_alarm_create_rule
  • protect_alarm_disarm
  • protect_alarm_update_rule
  • protect_create_liveview
  • protect_merge_known_faces
  • protect_ptz_move
  • protect_ptz_preset
  • protect_ptz_zoom
  • protect_toggle_recording
  • protect_toggle_rtsp
  • protect_trigger_chime
Show 7 more tools
  • protect_update_camera_settings
  • protect_update_chime
  • protect_update_known_face
  • protect_update_known_license_plate
  • protect_update_light
  • protect_update_sensor_settings
  • protect_update_viewer

Delete 7 · Delete, drop, revoke or wipe things.

  • protect_acknowledge_event
  • protect_alarm_delete_rule
  • protect_delete_known_face
  • protect_delete_known_license_plate
  • protect_delete_liveview
  • protect_delete_recording
  • protect_reboot_camera

Secrets and settings it asks for

Secrets: values you paste in that let it act as you.

  • UNIFI_API_KEY
  • UNIFI_PASSWORD
  • UNIFI_USERNAME

Other settings (environment variables or headers).

  • UNIFI_HOST
  • UNIFI_PORT
  • UNIFI_VERIFY_SSL

Tools (57)

Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].

  • protect_acknowledge_event

    Acknowledge an event by marking it as a favorite on the NVR. This is the closest equivalent to 'marking as read' in the Protect system. Requires confirm=True to apply.

  • protect_alarm_arm

    Arms a UniFi Protect Alarm Manager profile. On consoles running the UniFi OS Alarm Manager (Global mode) the profile is armed through its v2 action endpoint and the result is verified against the controller state (arming/armed); legacy consoles use PATCH arm + POST arm/enable. profile_id is a profile id from protect_alarm_list_profiles; Global-mode consoles also accept the profile name, legacy consoles need the id. Omit it when there is a single profile (legacy: the selected profile); a blank value is rejected. Requires confirm=True to apply — otherwise returns a preview.

  • protect_alarm_create_rule

    Creates a new alarm rule via POST. Body uses the canonical alarm rule shape returned by protect_alarm_list_rules/protect_alarm_get_rule: title, enabled, triggers, actions, and scope. The server assigns the rule id and returns the created rule. ``actions`` must be a non-empty list — the controller will accept an empty actions list but the resulting rule cannot be opened in the Protect UI. Requires confirm=True to apply — otherwise returns a preview.

  • protect_alarm_delete_rulecan change or delete data

    Deletes an alarm rule (automation) by id. Requires confirm=True to apply — otherwise returns a preview showing the rule that would be deleted. Destructive — the rule and its configured webhook actions cannot be recovered through the API.

  • protect_alarm_disarm

    Disarms the UniFi Protect Alarm Manager. On consoles running the UniFi OS Alarm Manager (Global mode) every active profile is disarmed through its v2 action endpoint, or only profile_id when given (an id or, in Global mode, a name; a blank value is rejected), and the result is verified against the controller state; legacy consoles use POST arm/disable system-wide. Requires confirm=True to apply — otherwise returns a preview.

  • protect_alarm_get_ruleread-only

    Fetches a single UniFi Protect alarm rule by id (normalized: id, title, enabled, triggers, actions, scope, stats), including AI-powered alarms.

  • protect_alarm_get_statusread-only

    Returns the current armed/disarmed state of the UniFi Protect Alarm Manager, including the active profile, raw status string, armed-at timestamp, and any breach info. Use this to check whether the security system is currently active.

  • protect_alarm_list_profilesread-only

    Lists all configured UniFi Protect Alarm Manager profiles with their id, name, state, state_set_at timestamp, activation delay, schedule count, automation count, id_family, and arm_compatible flag. On Global-mode consoles (id_family alarm_manager_v2) protect_alarm_arm and protect_alarm_disarm take these profile ids or names; on legacy (Local-mode) consoles they take the legacy profile id. Requires Protect 6.1+ with Alarm Manager configured in the web UI. Legacy fallback responses include _meta with complete=false because v2-only fields are unavailable.

  • protect_alarm_list_rulesread-only

    Lists every UniFi Protect alarm rule, including AI-powered alarms (e.g. AI Natural Language). Each rule is normalized to id, title, enabled, triggers, actions, scope, and stats. Use protect_alarm_get_rule for a single rule.

  • protect_alarm_update_rule

    Updates an alarm rule. Pass only the fields you want to change — current values are automatically preserved. Field keys use the canonical alarm rule shape returned by protect_alarm_list_rules/protect_alarm_get_rule: title, enabled, triggers, actions, and scope. Requires confirm=True to apply — otherwise returns a preview of the proposed changes.

  • protect_create_liveview

    Validates input for creating a new liveview with the given name and camera IDs. Note: liveview creation is not directly supported by the uiprotect Python API; this tool validates camera IDs and returns a preview. Use the Protect web UI to create liveviews.

  • protect_delete_known_facecan change or delete data

    Delete or remove a UniFi Protect face recognition group. This is destructive. Requires confirm=True to apply; otherwise returns a preview of the exact group.

  • protect_delete_known_license_platecan change or delete data

    Delete or remove a UniFi Protect license-plate recognition group. This is destructive. Requires confirm=True to apply; otherwise returns a preview of the exact group.

  • protect_delete_liveviewcan change or delete data

    Validates a liveview for deletion by ID. Note: liveview deletion is not directly supported by the uiprotect Python API; this tool returns information about the liveview. Use the Protect web UI to delete liveviews.

  • protect_delete_recordingcan change or delete data

    Attempts to delete recordings for a camera in a time range. Note: Individual recording deletion is NOT supported by the uiprotect API. Recording retention is managed automatically by the NVR. This tool returns information about the limitation and alternative approaches.

Show 42 more tools
  • protect_detection_search_labelsread-only

    List the detection-search filter vocabulary supported by this controller. Returns the legal label values (colors, vehicle types, smart detection types, event types, etc.) that the 'Find Anything' panel offers. Use the returned values as labels for protect_search_detections.

  • protect_export_clipread-only

    Exports a video clip from a camera for a specified time range. Returns metadata about the export (size, duration) but not the video data itself (too large for MCP responses). Maximum duration is 2 hours. For timelapse exports, pass fps (4=60x, 8=120x, 20=300x, 40=600x). Times must be ISO-8601 format (e.g., '2026-03-16T12:00:00Z').

  • protect_get_cameraread-only

    Returns detailed information for a single camera including firmware, IP address, MAC, mic/speaker settings, IR/HDR mode, stream channels, smart detection types, and PTZ capability. Use to inspect one camera.

  • protect_get_camera_analyticsread-only

    Returns motion and smart detection analytics for a camera including current detection state, last-detected timestamps for each type (person, vehicle, animal, etc.), and zone counts. For historical events, use the events API tools.

  • protect_get_camera_streamsread-only

    Returns RTSP/RTSPS stream URLs for a camera organized by channel (High, Medium, Low). Includes resolution, FPS, and bitrate for each stream. Use to connect a video player or integration to camera feeds.

  • protect_get_eventread-only

    Get detailed information for a single event by ID. Returns event type, camera, timestamps, score, smart detection types, thumbnail info, and recognized Known Face and license-plate (LPR) identity fields when Protect provides them.

  • protect_get_event_thumbnailread-only

    Get the thumbnail image for an event. Returns a base64-encoded JPEG. Thumbnails are generated after an event ends; in-progress events may not have thumbnails yet. Optionally specify width/height to resize.

  • protect_get_firmware_statusread-only

    Returns firmware update availability for the NVR and all adopted devices (cameras, lights, sensors, viewers, chimes, bridges, doorlocks). Use to check whether any device needs a firmware update.

  • protect_get_healthread-only

    Returns NVR health summary including CPU load and temperature, memory usage, and storage utilization. Use to diagnose performance issues or storage pressure.

  • protect_get_incident_evidenceread-only

    Collects bounded, read-only Protect event evidence for one incident window. Returns a unifi-incident-evidence-view by default: every source's coverage, failures and budget usage plus a bounded list of record citations, with omitted records counted; detail='full' returns the whole unifi-incident-evidence document. Each camera ID is its own source. Stops at the first spent budget and says so; check coverage_complete before treating an empty result as an all-clear.

  • protect_get_recording_statusread-only

    Returns the current recording state for one or all cameras. Shows recording mode (always, never, detections), whether actively recording, and available recording time range from NVR stats. Pass a camera_id to check a single camera, or omit for all cameras.

  • protect_get_snapshotread-only

    Fetches a JPEG snapshot from a camera. When include_image is True, returns the image as a base64-encoded string. When False (default), returns a reference URL. Optionally specify width and height to resize.

  • protect_get_system_inforead-only

    Returns NVR model, firmware version, uptime, storage usage, and connected device counts. Use for basic 'is the NVR healthy?' checks and capacity overview.

  • protect_list_camerasread-only

    Lists all cameras adopted by the Protect NVR with their name, model, connection state, recording mode, and whether they are currently recording. Use to get an overview of all cameras in the system.

  • protect_list_chimesread-only

    Lists all UniFi Protect chime devices with their name, connection state, volume, ring settings per camera, and available ringtones/tracks. Use to see chime configuration and which cameras trigger which chimes.

  • protect_list_eventsread-only

    Query events from the NVR with optional filters. Returns events from the Protect controller's database via REST API. Supports filtering by time range, event type (motion, smartDetectZone, ring, etc.), camera ID, and result limit. Face events include recognized Known Face identity fields, and license-plate (LPR) events include recognized plate identity fields, when Protect provides them. For real-time buffer events use protect_recent_events.

  • protect_list_known_facesread-only

    List UniFi Protect face recognition groups, including assigned Known Faces by default and unlabeled groups when group_types includes unknown. Returns metadata and controller image references only; image bytes are not fetched.

  • protect_list_known_license_platesread-only

    List UniFi Protect license-plate identities (vehicle recognition groups), including named/known license plates by default and unlabeled plate groups when group_types includes unknown. Each entry's `id` is the value to use in a `license_plate_known` alarm-rule condition. Returns metadata (incl. color/vehicleType when Protect provides them) and controller image references only; image bytes are not fetched.

  • protect_list_lightsread-only

    Lists all UniFi Protect floodlight devices with their name, connection state, brightness level, PIR motion sensitivity, and paired camera. Use to get an overview of all lights in the system.

  • protect_list_liveviewsread-only

    Lists all liveview configurations from the Protect NVR. Each liveview defines a multi-camera layout with slots, camera assignments, and cycle settings. Shows name, layout grid size, slot count, camera count, and whether it is the default or global view.

  • protect_list_recordingsread-only

    Returns recording availability information for a camera within a time range. Shows the recording window and whether footage exists. UniFi Protect stores recordings as continuous streams, not discrete segments. Defaults to the last 24 hours if no time range is specified. Times should be ISO-8601 format (e.g., '2026-03-16T00:00:00Z').

  • protect_list_sensorsread-only

    Lists all UniFi Protect sensor devices (motion, door/window, temperature, humidity, light level, leak detection). Shows connection state, battery status, current readings, and recent detection timestamps. Use to monitor environmental conditions and sensor health.

  • protect_list_smart_detectionsread-only

    List smart detection events (person, vehicle, animal, package, etc.) with optional filters. Filters by detection type, camera, confidence score, and time range. Only returns events above the minimum confidence threshold (default 50, configurable via PROTECT_SMART_DETECTION_MIN_CONFIDENCE). Face detections include recognized Known Face identity fields, and license-plate (LPR) detections include recognized plate identity fields, when Protect provides them.

  • protect_list_viewersread-only

    Lists all connected Protect viewers (e.g., UP-Viewer, Viewport) with their connection state, firmware version, and assigned liveview.

  • protect_merge_known_faces

    Merge one UniFi Protect face group into another. The target group survives and the source group is folded into it. Requires confirm=True to apply; otherwise returns a preview.

  • protect_ptz_move

    Moves a PTZ camera using normalized pan/tilt speeds. Requires confirm=True to execute. Use protect_ptz_zoom for zoom movement. Only works on PTZ-capable cameras.

  • protect_ptz_preset

    Moves a PTZ camera to a saved preset position by slot number. Returns available presets for the camera. Requires confirm=True to execute. Only works on PTZ-capable cameras.

  • protect_ptz_zoom

    Zooms a PTZ camera using normalized zoom speed. Requires confirm=True to execute. This is separate from optical zoom settings.

  • protect_reboot_cameracan change or delete data

    Reboots a camera. The camera will be temporarily unavailable during reboot. Requires confirm=True to execute. Use with caution — active recordings will be interrupted.

  • protect_recent_eventsread-only

    Get recent events from the in-memory websocket buffer. This is fast (no API call) and returns events received via the real-time websocket stream. Supports filtering by event_type, camera_id, min_confidence, and limit. Face events include recognized Known Face identity fields, and license-plate (LPR) events include recognized plate identity fields, when Protect provides them. Use this for real-time monitoring; use protect_list_events for historical queries.

  • protect_search_detectionsread-only

    Search detections across all cameras using Protect's 'Find Anything' filter vocabulary. Pass one or more labels of the form 'prefix:value' (e.g. 'vehicleType:truck', 'color:black', 'smartDetectType:vehicle'); labels are applied conjunctively. Call protect_detection_search_labels first to discover the legal labels for this controller. Returns matching smart detection events. excludeMotion defaults to true so plain motion events are filtered out.

  • protect_subscribe_eventsread-only

    Returns instructions for subscribing to real-time Protect events. Provides the MCP resource URI for the event stream and guidance on polling intervals. Use this to set up continuous event monitoring.

  • protect_toggle_recording

    Enables or disables recording on a camera. When enabled, sets recording mode to 'always'. When disabled, sets to 'never'. Requires confirm=True to apply.

  • protect_toggle_rtsp

    Enables or disables the RTSP/RTSPS stream on a camera channel. When enabled, the controller publishes the channel and assigns a stream alias; the RTSP/RTSPS URLs are returned. Choose the channel with quality (high, medium, low; default high). Requires confirm=True to apply.

  • protect_trigger_chime

    Plays the chime tone on a specific chime device. Optionally override volume (0-100) and repeat times (1-6) for this playback only. The chime's default settings are used if not specified. Requires confirm=True to play the chime; otherwise returns a preview.

  • protect_update_camera_settings

    Updates camera settings such as IR LED mode, HDR mode, mic/speaker volume, status light, and motion detection. Requires confirm=True to apply. HDR and microphone volume require UNIFI_PROTECT_API_KEY or UNIFI_API_KEY. Supported keys: ir_led_mode, hdr_mode, mic_enabled, mic_volume, status_light_on, speaker_volume, name, motion_detection.

  • protect_update_chime

    Updates chime settings. Without camera_id, updates global speaker volume (0-100), repeat times (1-6), or device name. With camera_id, updates that camera's ring volume or repeat_times while preserving other camera ring settings. Per-camera ring settings require a Protect API key configured via UNIFI_PROTECT_API_KEY or UNIFI_API_KEY. Requires confirm=True to apply. Supported global keys: volume, repeat_times, name. Supported per-camera keys: camera_id, volume, repeat_times.

  • protect_update_known_face

    Update UniFi Protect Known Face metadata. Pass only the fields you want to change; current values are automatically preserved. Supported fields: name, description, is_notification_enabled. Requires confirm=True to apply; otherwise returns a preview.

  • protect_update_known_license_plate

    Update UniFi Protect Known License Plate (license-plate identity) metadata. Pass only the fields you want to change; current values are automatically preserved. Supported fields: name, description, is_notification_enabled. Requires confirm=True to apply; otherwise returns a preview.

  • protect_update_light

    Updates light settings such as on/off state, LED brightness level (1-6), PIR motion sensitivity (0-100), motion-triggered duration (15-900 seconds), status indicator light, and device name. Requires confirm=True to apply. Power, brightness, sensitivity and duration require UNIFI_PROTECT_API_KEY or UNIFI_API_KEY. Supported keys: light_on (alias is_light_on), led_level, sensitivity, duration_seconds, status_light, name.

  • protect_update_sensor_settings

    Updates UniFi Protect sensor settings. Get sensor_id values from protect_list_sensors. Requires a Protect public API key configured on the server via UNIFI_PROTECT_API_KEY or UNIFI_API_KEY. Requires confirm=True to apply. Supported keys: name, light_settings, humidity_settings, temperature_settings, motion_settings, glass_break_settings, alarm_settings, schedule_mode, arm_profile_ids, has_custom_sensitivity_when_armed. Use snake_case inside nested settings, for example motion_settings.sensitivity_when_armed or light_settings.low_threshold.

  • protect_update_viewer

    Updates a UniFi Protect viewer name or liveview assignment. Get viewer_id values from protect_list_viewers and liveview_id values from protect_list_liveviews. These IDs are scoped to the Protect viewer/liveview tool family - do not pass them to camera, sensor, or chime tools. Requires a Protect public API key configured on the server via UNIFI_PROTECT_API_KEY or UNIFI_API_KEY. Requires confirm=True to apply. Pass only the fields you want to change - current values are automatically preserved. Supported keys: name, liveview_id, clear_liveview. Set clear_liveview=True to remove the current livev…

Signals

Stars
945
Forks
132
Open issues
12
Contributors
47
Weekly downloads
2,523
Last commit (this folder)
Oct 22, 2026 (8 days ago)
Last release
Oct 22, 2026 (8 days ago)
Last package publish
Oct 22, 2026 (8 days ago)

From GitHub (fetched Oct 24, 2026) and the package registry.

Details

Registry name
io.github.sirkirby/unifi-protect-mcp
Version
0.1.6
Auth
API key
Packages
pypi unifi-protect-mcp
License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from sirkirby

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get UniFi Protect MCP running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying UniFi Protect MCP?

CallGet help
Cite this page

UniFi Protect MCP. Agent Mart. https://agentmart.dev/connectors/sirkirby-unifi-protect-mcp (last updated 2026-10-24)