UniFi Protect MCP
Manage UniFi Protect cameras, events, recordings, and smart detections.
Connector by sirkirby · GitHub account verified by the MCP Registry
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.
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.
About
Use cases: monitoring-observability
Reviews
Write a reviewNo 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_ruleprotect_alarm_get_statusprotect_alarm_list_profilesprotect_alarm_list_rulesprotect_detection_search_labelsprotect_export_clipprotect_get_cameraprotect_get_camera_analyticsprotect_get_camera_streamsprotect_get_eventprotect_get_event_thumbnailprotect_get_firmware_status
Show 19 more tools
protect_get_healthprotect_get_incident_evidenceprotect_get_recording_statusprotect_get_snapshotprotect_get_system_infoprotect_list_camerasprotect_list_chimesprotect_list_eventsprotect_list_known_facesprotect_list_known_license_platesprotect_list_lightsprotect_list_liveviewsprotect_list_recordingsprotect_list_sensorsprotect_list_smart_detectionsprotect_list_viewersprotect_recent_eventsprotect_search_detectionsprotect_subscribe_events
Write 19 · Create, change, send or run things.
protect_alarm_armprotect_alarm_create_ruleprotect_alarm_disarmprotect_alarm_update_ruleprotect_create_liveviewprotect_merge_known_facesprotect_ptz_moveprotect_ptz_presetprotect_ptz_zoomprotect_toggle_recordingprotect_toggle_rtspprotect_trigger_chime
Show 7 more tools
protect_update_camera_settingsprotect_update_chimeprotect_update_known_faceprotect_update_known_license_plateprotect_update_lightprotect_update_sensor_settingsprotect_update_viewer
Delete 7 · Delete, drop, revoke or wipe things.
protect_acknowledge_eventprotect_alarm_delete_ruleprotect_delete_known_faceprotect_delete_known_license_plateprotect_delete_liveviewprotect_delete_recordingprotect_reboot_camera
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
UNIFI_API_KEYUNIFI_PASSWORDUNIFI_USERNAME
Other settings (environment variables or headers).
UNIFI_HOSTUNIFI_PORTUNIFI_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_eventAcknowledge 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_armArms 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_ruleCreates 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 dataDeletes 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_disarmDisarms 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-onlyFetches a single UniFi Protect alarm rule by id (normalized: id, title, enabled, triggers, actions, scope, stats), including AI-powered alarms.
protect_alarm_get_statusread-onlyReturns 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-onlyLists 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-onlyLists 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_ruleUpdates 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_liveviewValidates 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 dataDelete 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 dataDelete 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 dataValidates 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 dataAttempts 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-onlyList 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-onlyExports 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-onlyReturns 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-onlyReturns 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-onlyReturns 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-onlyGet 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-onlyGet 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-onlyReturns 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-onlyReturns 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-onlyCollects 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-onlyReturns 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-onlyFetches 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-onlyReturns 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-onlyLists 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-onlyLists 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-onlyQuery 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-onlyList 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-onlyList 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-onlyLists 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-onlyLists 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-onlyReturns 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-onlyLists 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-onlyList 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-onlyLists all connected Protect viewers (e.g., UP-Viewer, Viewport) with their connection state, firmware version, and assigned liveview.
protect_merge_known_facesMerge 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_moveMoves 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_presetMoves 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_zoomZooms 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 dataReboots 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-onlyGet 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-onlySearch 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-onlyReturns 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_recordingEnables 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_rtspEnables 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_chimePlays 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_settingsUpdates 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_chimeUpdates 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_faceUpdate 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_plateUpdate 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_lightUpdates 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_settingsUpdates 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_viewerUpdates 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
- Repository
- github.com/sirkirby/unifi-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
More from sirkirby
- 0.821score
UniFi Network MCP
sirkirby
Manage UniFi Network devices, clients, firewall, VLANs, VPNs, and more.
ConnectorAFreshness: ALocal★ 945↓ 16.8K/wkClaude Code +5 - 0.807score
UniFi Access MCP
sirkirby
Manage UniFi Access doors, credentials, policies, visitors, and events.
ConnectorAFreshness: ALocal★ 945↓ 1K/wkClaude Code +5 - 0.583score
AGENTS.md · sirkirby/unifi-mcp
sirkirby
AGENTS.md from sirkirby/unifi-mcp: 354 lines covering Documentation scope, Non-Goals, Architecture Rules, Permission System and more.
TemplateAFreshness: A★ 945Codex +5
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.
Cite this page
UniFi Protect MCP. Agent Mart. https://agentmart.dev/connectors/sirkirby-unifi-protect-mcp (last updated 2026-10-24)