UniFi Protect MCP
This server exposes UniFi Protect’s Integration API as MCP tools, letting you monitor, inspect, and (when enabled) control Protect devices.
System & NVR: Get Protect application version, NVR/console info, and arm-mode status.
WebSocket subscriptions: Listen for device state changes and event notifications such as motion, ring, smart detect, and sensor alarms.
Cameras: List/get cameras, capture JPEG snapshots (including package cam), manage RTSPS streams, control PTZ patrols and presets, create talkback, and disable a camera mic.
Other devices: List/get/update lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, and alarm hubs.
Device actions: Play/stop sirens, test speaker sounds, activate relay outputs, trigger alarm-hub outputs, and trigger alarm webhooks.
Alarm manager: List/create/update/delete arm profiles, set the current profile, and arm/disarm the alarm.
Live views & files: List/get/create/update live views; list and upload animation files.
Users & POS: List/get Protect and UniFi Identity (ULP) users; ingest point-of-sale transactions as camera events.
Safety controls: Read-only mode is the default; write tools are opt-in via
UNIFI_PROTECT_READ_ONLY=false, support dry-run, and dangerous actions can require confirmation.
Provides tools for interacting with UniFi Protect, a video surveillance and device management platform by Ubiquiti. Enables listing and managing cameras, lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, alarm hubs, arm profiles, live views, files, users, and NVR status, as well as capturing snapshots, streaming RTSPS, and subscribing to device/event WebSocket updates.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@UniFi Protect MCPshow me a snapshot from the driveway camera"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
UniFi Protect MCP Server
An MCP (Model Context Protocol) server that exposes UniFi Protect's Integration REST API as tools for Claude Code and other MCP clients. Aligned with UniFi Protect API 7.3.47 — 74 tools covering cameras, lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, alarm hubs, arm profiles, live views, files, users, point-of-sale events, NVR status, and WebSocket subscriptions.
Prerequisites
Node.js 22.x (22.13 or newer) or 24.x — see
enginesinpackage.jsonA UniFi Protect system with the Integration API enabled
An API key generated from your UniFi Protect console
Related MCP server: UniFi Internal API MCP Server
Setup
Quick start (npx)
Add to Claude Code with a single command — no clone or build needed:
claude mcp add-json unifi-protect '{"command":"npx","args":["-y","@owine/unifi-protect-mcp@latest"],"env":{"UNIFI_PROTECT_HOST":"192.168.1.1","UNIFI_PROTECT_API_KEY":"your-api-key","UNIFI_PROTECT_VERIFY_SSL":"false"}}' -s userUse -s user for global availability across all projects, or -s project for the current project only.
From source
If you prefer to build locally:
git clone https://github.com/owine/unifi-protect-mcp.git
cd unifi-protect-mcp
corepack enable # provides pnpm at the version pinned in package.json
pnpm install
pnpm run buildThis project uses pnpm — npm install ignores pnpm-lock.yaml and may resolve different dependency versions than CI.
Then add to Claude Code:
claude mcp add-json unifi-protect '{"command":"node","args":["/path/to/unifi-protect-mcp/dist/index.js"],"env":{"UNIFI_PROTECT_HOST":"192.168.1.1","UNIFI_PROTECT_API_KEY":"your-api-key","UNIFI_PROTECT_VERIFY_SSL":"false"}}' -s userEnvironment Variables
Variable | Required | Default | Description |
| Yes | — | IP or hostname of your UniFi Protect console |
| Yes | — | API key from Protect integration settings |
| No |
| Set to |
| No |
| Set to |
| No | — | Cloud Connector console ID. Only used when |
Manual Configuration
Alternatively, add to your ~/.claude.json under the top-level "mcpServers" key:
{
"mcpServers": {
"unifi-protect": {
"command": "npx",
"args": ["-y", "@owine/unifi-protect-mcp@latest"],
"env": {
"UNIFI_PROTECT_HOST": "192.168.1.1",
"UNIFI_PROTECT_API_KEY": "your-api-key",
"UNIFI_PROTECT_VERIFY_SSL": "false"
}
}
}
}Safety Features
This server provides layered safety controls for responsible operation:
Tool annotations — Every tool declares
readOnlyHintanddestructiveHintso MCP clients (like Claude Code) can make informed confirmation decisions
Cloud Connector
To reach a console through Ubiquiti's Cloud Connector instead of over the local
network, set UNIFI_PROTECT_HOST=api.ui.com and UNIFI_PROTECT_CONSOLE_ID to
the console's ID, and supply a Site Manager API key (unifi.ui.com →
Settings → API) as UNIFI_PROTECT_API_KEY. That is a different credential
from a local console API key. Requests are routed through
/v1/connector/consoles/{id}. Keep TLS verification enabled.
Find your console ID with:
curl -s https://api.ui.com/v1/hosts -H "X-API-KEY: $KEY" | jq -r '.data[].id'WebSocket subscriptions do not work over Cloud Connector. The connector
proxies REST calls but returns HTTP 404 on a WebSocket upgrade, so
protect_subscribe_devices and protect_subscribe_events fail fast with an
explanatory error. Every other tool, including snapshots and file uploads,
works. Connect directly to the console host if you need subscriptions.
Note that /v1/hosts reports protect under controllers for consoles where
Protect is merely available, not necessarily installed; only consoles actually
running Protect will answer.
Setting UNIFI_PROTECT_CONSOLE_ID against a local host is not fatal: the
server logs a warning and talks to that host directly.
Read-only mode — Enabled by default. Only read operations (list, get, snapshot) are registered. Set
UNIFI_PROTECT_READ_ONLY=falseto enable write/mutating toolsConfirmation parameter — The most dangerous tools (
protect_disable_mic,protect_trigger_alarm_webhook) require an explicitconfirm: trueparameter that must be present for the call to succeedDry-run support — All write tools (except those with
confirm) accept an optionaldryRun: trueparameter that returns a preview of what would happen without making any changes
Tools (73 total)
System (2)
Tool | Description |
| Get system information and version details |
| List all NVR devices |
Subscriptions (2)
Tool | Description |
| Subscribe via WebSocket to device state updates |
| Subscribe via WebSocket to event notifications |
Cameras (12)
Tool | Description |
| List all cameras |
| Get camera details by ID |
| Update camera settings |
| Get a JPEG snapshot (returns image) |
| Create an RTSPS stream session |
| Get active RTSPS stream sessions |
| Stop and delete an active RTSPS stream |
| Create a talkback (two-way audio) session |
| IRREVERSIBLE: Permanently disable camera microphone |
| Start PTZ patrol at a given slot |
| Stop PTZ patrol |
| Move PTZ to a preset position |
Lights (3)
Tool | Description |
| List all lights |
| Get light details by ID |
| Update light settings |
Sensors (3)
Tool | Description |
| List all sensors |
| Get sensor details by ID |
| Update sensor settings |
Chimes (3)
Tool | Description |
| List all chimes |
| Get chime details by ID |
| Update chime settings |
Viewers (3)
Tool | Description |
| List all viewers |
| Get viewer details by ID |
| Update viewer settings |
Sirens (6)
Tool | Description |
| List all sirens |
| Get siren details by ID |
| Update siren settings (name, volume, LED) |
| Activate the siren alarm for a given duration (5/10/20/30s) |
| Stop an active siren |
| Test the siren sound for 5 seconds at a given volume |
Fobs (3)
Tool | Description |
| List all key fobs |
| Get fob details by ID |
| Update fob settings |
Relays (4)
Tool | Description |
| List all relays |
| Get relay details by ID |
| Update relay settings |
| Set/toggle a relay output channel, with optional pulse duration |
Speakers (4)
Tool | Description |
| List all speakers |
| Get speaker details by ID |
| Update speaker settings (volume, mic) |
| Test the speaker sound at a given volume |
Bridges (3)
Tool | Description |
| List all bridges |
| Get bridge details by ID |
| Update bridge settings |
Link Stations (3)
Tool | Description |
| List all link stations (non-alarm-hub gateways) |
| Get link station details by ID |
| Update link station settings |
Alarm Hubs (4)
Tool | Description |
| List all alarm hubs |
| Get alarm hub details by ID |
| Update alarm hub settings |
| Trigger an alarm hub output channel (sirens, lights, etc.) |
Arm Profiles (7) — local alarm manager
Tool | Description |
| List all arm profiles |
| Create a new arm profile |
| Set the active profile used when arming |
| Update an arm profile |
| DESTRUCTIVE: Delete an arm profile by ID |
| Arm the alarm using the current profile |
| Disarm the alarm |
Live Views (4)
Tool | Description |
| List all live views |
| Get live view details by ID |
| Create a new live view |
| Update a live view |
Alarm & Files (3)
Tool | Description |
| Trigger an alarm webhook (fires external alarm action) |
| List files by type |
| Upload a file (base64-encoded) |
Users (4)
Tool | Description |
| List Protect users (filtered by access permissions) |
| Get a Protect user by ID |
| List UniFi Identity (ULP) users with enrolled credentials |
| Get a UniFi Identity user by ID |
Point of Sale (1)
Tool | Description |
| Record a POS transaction as a camera event so it can be overlaid on recorded footage |
Development
The Node version used for development is pinned in .nvmrc. With fnm installed, fnm use reads it automatically on cd.
pnpm run build # Compile TypeScript
pnpm start # Run the server
pnpm run typecheck # Type-check without emitting
pnpm run lint # ESLint
pnpm run lint:fix # ESLint with auto-fix
pnpm test # Run all tests (vitest)
pnpm run test:watch # Run tests in watch mode
pnpm run test:coverage # Run tests with coverageGit hooks are managed by lefthook — pnpm exec lefthook install enables them. Pre-commit runs ESLint on staged files and a full typecheck, so fnm and pnpm both need to be on your PATH.
Commit conventions
This project uses conventional commits and release-please for automated releases:
feat: ...— new feature (minor version bump)fix: ...— bug fix (patch version bump)feat!: ...orBREAKING CHANGE:footer — breaking change (major version bump)chore:,docs:,ci:, etc. — no version bump
On push to main, release-please opens a Release PR that bumps the version and updates CHANGELOG.md. Merging that PR publishes to npm automatically.
To override the version number, add Release-As: x.x.x in the commit body:
git commit --allow-empty -m "chore: release 2.0.0" -m "Release-As: 2.0.0"License
MIT
Available Tools
38 toolsprotect_get_alarm_hubARead-only
Get full details for a specific alarm hub by ID. Returns: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (object), deviceTamperStatus, threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Alarm hub ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| alarmHub | No | Alarm hub status (object: armed, battery, connector, cover, output, input, …) |
| modelKey | No | Resource kind |
| lastEvent | No | Last event timestamp in epoch ms (number) |
| isAlarmHub | No | Whether this device is an alarm hub (boolean) |
| ledSettings | No | LED settings (object: isEnabled) |
| threadState | No | Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) |
| deviceTamperStatus | No | Tamper status, added in 7.3.x, e.g. "tampered" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds a detailed enumeration of returned fields, including nested threadState and alarmHub, but it does not disclose error behavior, authentication needs, or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a crisp, front-loaded purpose statement. The long return-field list is dense but organized and serves as a useful summary, though some of it duplicates the output schema and the docs-version parenthetical adds minor noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-param read tool with annotations and an output schema, the description is sufficient: it names the resource, retrieval key, and the shape of returned data. No critical invocation information appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, id, already describes itself as 'Alarm hub ID' with required=true. The description reiterates that retrieval is 'by ID' but adds no format, precedence, or additional semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and target: 'Get full details for a specific alarm hub by ID.' The mention of 'full details' and the specific resource distinguishes it from list_alarm_hubs and other get_* siblings without relying on inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly positions the tool as the single-entity retrieval variant ('by ID'), implying use when an ID is already known rather than for listing alarm hubs. It does not explicitly name the alternative list_alarm_hubs or state when not to use it, so it stops short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_bridgeARead-only
Get full details for a specific bridge by ID. Returns: id, modelKey, name, mac, state, type, guid, platform, clients (array of MACs), maxClients (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bridge ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| clients | No | Connected client MACs (array of strings) |
| modelKey | No | Resource kind |
| platform | No | Hardware platform, e.g. "mt7621" |
| maxClients | No | Max client capacity (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by enumerating the exact returned fields, including the clients array and the maxClients version note, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence states the action, then lists return fields in a compact colon-delimited format. Every word earns its place; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity get-by-id tool with one documented parameter, read-only annotations, and an output schema, the description is complete. It even adds the returned-field list, which exceeds what the structured fields require.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes 'id' as 'Bridge ID' (100% coverage), so the baseline is 3. The description reinforces that the ID identifies a specific bridge but adds no format, source, or usage details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), a precise resource ('full details for a specific bridge by ID'), and clearly distinguishes itself from list_bridges and other get_* siblings. The returned-field list further clarifies the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by ID' makes it clear this is for retrieving one specific bridge, not enumerating bridges (which list_bridges handles). It does not explicitly name alternative tools or exclusion conditions, but the context is unambiguous for a get-by-id tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_cameraARead-only
Get details for a specific camera by ID. The Protect Integration API returns the SAME field set as protect_list_cameras entries (id, mac, name, modelKey, state, type, guid, activePatrolSlot, hasPackageCamera, hdrType, isMicEnabled, micVolume, videoMode, featureFlags, lcdMessage, ledSettings, osdSettings, smartDetectSettings) — there is no extended/by-id-only payload (confirmed live on 7.3.47). Recording state, motion events, zones, and channel/RTSP config are NOT exposed by this API surface.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Camera ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Camera name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| hdrType | No | HDR mode, e.g. "auto" |
| modelKey | No | Always "camera" |
| micVolume | No | Microphone volume 0-100 (number) |
| videoMode | No | Video mode, e.g. "default" |
| lcdMessage | No | |
| ledSettings | No | |
| osdSettings | No | |
| featureFlags | No | |
| isMicEnabled | No | Microphone enabled (boolean) |
| activePatrolSlot | No | Active PTZ patrol slot, or null (number|null) |
| hasPackageCamera | No | Has a secondary package camera (boolean) |
| smartDetectSettings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive. The description adds substantial behavioral context beyond annotations by enumerating the exact returned field set, confirming there is no hidden extended payload, and explicitly stating which common camera data is not available. This is valuable, non-redundant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key purpose is front-loaded in the first sentence, and the rest of the description earns its place: the field enumeration sets expectations and the explicit exclusions prevent misuse. Despite the long field list, there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read-only getter with an output schema, this description is complete. It tells the agent what will be returned, what will not be returned, and confirms there is no hidden extra payload, making the tool safely callable without further investigation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the single 'id' parameter as 'Camera ID' with 100% coverage. The description only restates that lookup is by ID, adding no format, source, or usage detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get details for a specific camera by ID.' It further distinguishes itself from protect_list_cameras by clarifying it returns the same field set and offers no extended by-id payload, so an agent can confidently tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the primary use case clear: fetch details for one camera by ID. It also gives useful exclusions by stating recording state, motion events, zones, and channel/RTSP config are not exposed, though it does not explicitly name alternative tools for those needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_chimeARead-only
Get full details for a specific chime by ID. Returns: id, modelKey, name, mac, state, type, guid, cameraIds (array of camera IDs), ringSettings (array of objects: cameraId, volume, ringtoneId, repeatTimes) — verified live 7.3.47.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chime ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| modelKey | No | Resource kind |
| cameraIds | No | Paired camera IDs (array of strings) |
| ringSettings | No | Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds response-shape detail and a 'verified live 7.3.47' reliability signal, but no additional behavioral or error context beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that identifies the operation before listing return fields. The field list is compact, and the version note is a short reliability cue with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only lookup with annotations and an output schema, the description provides everything needed to invoke the tool correctly and understand the response. No critical guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, id, is already fully documented in the schema as 'Chime ID' with 100% coverage. The description adds no new semantic meaning beyond 'by ID', so the schema does the heavy lifting and the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), a concrete resource ('chime'), and the selection criterion ('by ID'). It also enumerates the returned fields, making it easy to distinguish from list_chimes and other sibling get_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a specific chime by ID' clearly implies use when an ID is already known and full details are needed, while list_chimes would cover enumeration. It does not explicitly name alternatives or exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_fobARead-only
Get full details for a specific fob by ID. Returns: id, modelKey, name, mac, state, type, guid, awayState, buttonLabels, featureFlags (buttons[]), hasKeypad, armControlSettings (enabled, armProfileId, nightProfileId), keypadSettings (beepEnabled, beepVolume, backlightEnabled, backlightBrightness), wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fob ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| modelKey | No | Resource kind |
| awayState | No | Away state, e.g. "ONLINE" |
| hasKeypad | No | Whether this fob has a keypad, added in 7.3.x (boolean) |
| buttonLabels | No | Button label preset, e.g. "securityActions" |
| featureFlags | No | Feature flags (object: buttons[]) |
| keypadSettings | No | Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness) |
| armControlSettings | No | Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId) |
| wirelessConnectionState | No | Wireless link state (object) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by enumerating the returned fields, including nested objects and a version reference for wirelessConnectionState. However, it does not disclose behavior on missing IDs, error conditions, or any rate limits. Given the annotation coverage, this is acceptable but not outstanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action and resource. It lists the return fields in a structured manner, which is informative without being excessively verbose. The mention of a documentation version for one field is a minor extra that could be omitted, but overall the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a straightforward get-by-ID operation with a single parameter and a detailed output schema. The description covers the purpose and the expected return content, making it complete for an agent to call correctly. The only missing element is explicit error handling behavior, but the presence of an output schema mitigates this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the single 'id' parameter with 100% coverage, so the baseline is 3. The description does not add any additional semantic detail about the ID (e.g., format, length, or validation rules) beyond what the schema provides, which is sufficient for a simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get full details for a specific fob by ID.' It specifies the resource (fob) and the action (get details), and the list of returned fields adds specificity. It is easily distinguished from the sibling protect_list_fobs which lists all fobs, and from other get_* tools by naming the 'fob' resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: you need a specific fob ID to retrieve full details. However, it does not explicitly state when to prefer this over protect_list_fobs (e.g., when you already have an ID and need detailed attributes) or mention any exclusions or alternatives. The guidance is adequate for a simple get-by-ID tool but relies on the standard pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_infoARead-only
Get UniFi Protect application information. Returns: applicationVersion (string).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| applicationVersion | No | Current Protect application version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds only that the payload contains applicationVersion, which is largely redundant with the existing output schema, and says nothing about latency, auth, or scope beyond the app itself.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the verb and resource, and no filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema already defining the return shape, the description contains everything an agent needs to call it correctly. There is no meaningful gap left to fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No misleading parameter claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and a specific resource ('UniFi Protect application information'), which is clearly distinct from the sibling device-scoped tools like protect_get_camera or protect_list_nvrs. An agent can identify this as the application-level info endpoint without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — this is the only tool for application-level metadata, so there is no real alternative to route to — but the description never states when an agent should reach for it (e.g., version checks or capability probing). No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_lightARead-only
Get full details for a specific light by ID. Returns: id, modelKey, name, mac, state, type, guid, lightModeSettings (mode, enableAt), lightDeviceSettings (isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel), isDark, isLightOn, isLightForceEnabled, lastMotion, isPirMotionDetected, camera (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Light ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| camera | No | Paired camera ID |
| isDark | No | Whether it is currently dark out (boolean) |
| modelKey | No | Resource kind |
| isLightOn | No | Whether the light is currently on (boolean) |
| lastMotion | No | Last motion timestamp in epoch ms (number) |
| lightModeSettings | No | Activation settings (object: mode, enableAt) |
| isLightForceEnabled | No | Main LED force-enabled (boolean) |
| isPirMotionDetected | No | PIR motion currently detected (boolean) |
| lightDeviceSettings | No | Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds an explicit list of returned fields, but this largely duplicates what the output schema would provide and does not disclose behaviors like not-found handling or permissions. It is adequate, not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, which is good. However, the long enumeration of return fields is redundant when an output schema exists and makes the description longer than necessary for such a simple one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only retrieval with one required parameter, an output schema, and read-only annotations, the description provides enough context to invoke the tool correctly. Only minor gaps like error behavior or authentication requirements remain, which are not critical here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for the single required 'id' parameter, defining it as 'Light ID.' The description does not add additional parameter semantics beyond restating that the lookup is by ID, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get full details for a specific light by ID.' It clearly identifies the tool as a single-light retrieval operation and distinguishes it from sibling tools like protect_list_lights or protect_get_sensor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a specific light by ID' conveys when to use the tool: when full details for one light are needed. It does not explicitly name alternatives or exclusions, but the context is clear enough for an agent to select it over list-style siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_link_stationARead-only
Get full details for a specific link station by ID. Returns: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (object), deviceTamperStatus, threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Link station ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| alarmHub | No | Alarm hub status (object: armed, battery, connector, cover, output, input, …) |
| modelKey | No | Resource kind |
| lastEvent | No | Last event timestamp in epoch ms (number) |
| isAlarmHub | No | Whether this device is an alarm hub (boolean) |
| ledSettings | No | LED settings (object: isEnabled) |
| threadState | No | Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) |
| deviceTamperStatus | No | Tamper status, added in 7.3.x, e.g. "tampered" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds detail about the returned fields and references the 7.3.47 docs, but does not discuss errors, permissions, or other behavioral edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded and the description is compact. The long list of returned fields is somewhat redundant with the existing output schema, but it is structured and informative enough not to feel like wasted space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single well-documented parameter, read-only annotations, and an output schema covering return values, the description is complete for an agent to select and invoke the tool correctly. The included docs reference adds helpful provenance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the single `id` parameter as 'Link station ID', giving 100% schema coverage. The description adds no extra semantic detail beyond restating that the lookup is by ID, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a clear resource ('link station'), and the selection criterion ('by ID'). It is differentiated from sibling tools like protect_list_link_stations, which lists stations rather than retrieving one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for retrieving a single link station when its ID is known, as opposed to listing all stations. It does not explicitly name an alternative such as protect_list_link_stations, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_liveviewARead-only
Get details for a specific live view by ID. Returns: id, modelKey, name, isDefault, isGlobal, layout, owner, slots (each slot: cameras string[], cycleMode, cycleInterval). The full slot list is needed when updating because PATCH replaces the slots array.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Liveview ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Liveview ID |
| name | No | Liveview name |
| owner | No | Owning user ID |
| slots | No | Camera slots |
| layout | No | Grid layout / slot count (number) |
| isGlobal | No | Whether shared across all users (boolean) |
| modelKey | No | Always "liveview" |
| isDefault | No | Whether this is the default liveview (boolean) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. Beyond that, the description explains the critical round-trip behavior with PATCH replacing the slots array – real behavioral context that helps the agent avoid data loss. The output field list overlaps with the output schema, but the slot-level detail is useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the purpose, followed by the relevant return shape and the update caveat. Efficient with minimal waste, though the return field enumeration is partially redundant with an existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with an output schema present, this description covers purpose, return shape, and the key behavioral caveat about PATCH replacing slots. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single 'id' parameter is fully documented in the schema. The description adds no syntax or format details beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details for a specific live view by ID'), consistent with the get-by-id pattern in its sibling set (protect_get_camera, protect_get_user, etc.). An agent can tell it apart from protect_list_liveviews without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear usage condition by linking to the update workflow ('needed when updating because PATCH replaces the slots array'). It does not explicitly name protect_update_liveview or warn about when not to call it, but the context is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_relayARead-only
Get full details for a specific relay by ID. Returns: id, modelKey, name, mac, state, type, guid, ledSettings (isEnabled), outputs (array), inputs (array), wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Relay ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| inputs | No | Input channels (array of objects) |
| outputs | No | Output channels (array of objects) |
| modelKey | No | Resource kind |
| ledSettings | No | LED settings (object: isEnabled) |
| wirelessConnectionState | No | Wireless link state (object) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds value by listing the returned fields and noting a version-specific field (wirelessConnectionState). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the purpose and then lists returned fields. No wasted words, and the most important information (the verb and resource) appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no side effects, the description fully covers what it does, what it returns, and even a version note. An agent has everything needed to invoke it correctly, especially given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the id parameter is documented as 'Relay ID'). The description reinforces that the ID identifies a relay but does not add syntax or format details beyond the schema. The baseline of 3 applies because the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('full details for a specific relay by ID'), and it enumerates the returned fields. This clearly distinguishes it from sibling tools like protect_list_relays (which lists all relays) and other get_* tools. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (when you need details for one relay by ID) but does not explicitly mention alternatives or exclusions. Given the sibling list_relays exists, an agent can infer the distinction, but there is no explicit guidance like 'use list_relays to enumerate all relays'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_rtsp_streamsARead-only
Get active RTSPS stream sessions for a camera. Returns the per-quality stream URLs currently published (keys typically: high, medium, low, package). Empty/missing keys mean no session is currently active at that quality — use protect_create_rtsp_stream to start one.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| low | No | RTSPS URL for the low-quality stream |
| high | No | RTSPS URL for the high-quality stream |
| medium | No | RTSPS URL for the medium-quality stream |
| package | No | RTSPS URL for the package-camera stream |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful return semantics: the quality keys (high, medium, low, package) and the meaning of empty/missing keys, which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose, then return shape, then the follow-up action. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with annotations and an output schema, the description covers purpose, return key semantics, and next-step routing. Nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (id) and schema coverage is 100%, so the schema already documents it as the Camera ID. The description adds nothing beyond implying the scope is a single camera, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (active RTSPS stream sessions) scoped to a camera, and immediately clarifies what is returned (per-quality stream URLs). This is easily distinguishable from the sibling get/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the empty/missing-key condition and routes the agent to protect_create_rtsp_stream when a session needs to be started. This is exactly the when-to-use/when-to-switch guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_sensorARead-only
Get full details for a specific sensor by ID. Returns: id, modelKey, name, mac, state, type, guid, mountType, featureFlags (temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each {channelCount}), batteryStatus (percentage, isLow), stats (light, humidity, temperature), lightSettings, humiditySettings, temperatureSettings, isOpened, openStatusChangedAt, isMotionDetected, motionDetectedAt, motionSettings, glassBreakSettings, scheduleMode, armProfileIds, hasCustomSensitivityWhenArmed, alarmTriggeredAt, alarmSettings, leakDetectedAt, externalLeakDetectedAt, leakSettings, tamperingDetectedAt, wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Sensor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| stats | No | Environmental stats (object: light, humidity, temperature) |
| isOpened | No | Open/close contact state (boolean) |
| modelKey | No | Resource kind |
| mountType | No | Mount type, e.g. "door", "leak", "garage" |
| featureFlags | No | Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount }) |
| leakSettings | No | Leak detection settings (object) |
| scheduleMode | No | Schedule mode: "always" | "when_armed" |
| alarmSettings | No | Alarm settings (object: isEnabled) |
| armProfileIds | No | Arm profile IDs this sensor belongs to (array of strings) |
| batteryStatus | No | Battery status (object: percentage, isLow) |
| lightSettings | No | Light threshold settings (object) |
| leakDetectedAt | No | Last leak timestamp in epoch ms (number) |
| motionSettings | No | Motion detection settings (object) |
| alarmTriggeredAt | No | Last alarm timestamp in epoch ms (number) |
| humiditySettings | No | Humidity threshold settings (object) |
| isMotionDetected | No | Motion currently detected (boolean) |
| motionDetectedAt | No | Last motion timestamp in epoch ms (number) |
| glassBreakSettings | No | Glass-break detection settings (object) |
| openStatusChangedAt | No | Open-status change timestamp in epoch ms (number) |
| tamperingDetectedAt | No | Last tampering timestamp in epoch ms (number) |
| temperatureSettings | No | Temperature threshold settings (object) |
| externalLeakDetectedAt | No | Last external-leak timestamp in epoch ms (number) |
| wirelessConnectionState | No | Wireless link state (object: signalState, batteryStatus, bridge) |
| hasCustomSensitivityWhenArmed | No | Custom armed sensitivity enabled (boolean) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description goes beyond annotations by enumerating the exact fields returned, which is valuable behavioral context. It also notes the wirelessConnectionState field is from version 7.3.47 docs, adding version-specific transparency. This does not contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the purpose in the first sentence, then provides a comprehensive but structured list of return fields. It is lengthy, but each item adds value by informing the agent what data is available. The trailing note about '(7.3.47 docs)' is slightly ambiguous but not wasteful. Overall, it is well-organized and not repetitive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to explain return values, yet it does, which is a bonus. It covers the single parameter fully via the schema and provides a thorough field list. The version note adds nuance. Nothing critical is missing for an agent to call this tool correctly, though it could explicitly mention it's for sensors only, which is already implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, id, which the schema already describes as 'Sensor ID' (100% coverage). The description adds no additional meaning about the parameter itself, but the schema fully covers it. Baseline 3 is appropriate since the schema does the heavy lifting and the description focuses on the response rather than the input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Get full details for a specific sensor by ID.' This distinguishes it from list_sensors (which lists) and other get tools for different resources (camera, light, etc.). The resource is explicit, so an agent can immediately identify this as the per-sensor retrieval tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly mention when to use this versus alternatives, but it clearly implies usage: when you need full details for one specific sensor, not a list. The sibling list shows other get tools for other resources, so the context is clear. It doesn't provide exclusions or alternatives, but the purpose is unambiguous enough that an agent would know to use this for a sensor ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_sirenARead-only
Get full details for a specific siren by ID. Returns: id, modelKey, name, mac, state, type, guid, volume, ledSettings (isEnabled), sirenStatus (isActive, activatedAt, duration), connectionType, wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Siren ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| volume | No | Siren volume (number) |
| modelKey | No | Resource kind |
| ledSettings | No | LED settings (object: isEnabled) |
| sirenStatus | No | Current siren status (object: isActive, activatedAt, duration) |
| connectionType | No | Connection type, e.g. "lora" |
| wirelessConnectionState | No | Wireless link state (object) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it a read-only, non-destructive operation. The description adds the full field list and nested structure (ledSettings, sirenStatus), which exceeds what the annotations alone convey, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the purpose and then present the return schema as a readable inline list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only getter with output schema and safety annotations, the description covers purpose, parameters, and return shape without missing operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter id is already fully described in the schema as 'Siren ID'; the description's reference to 'by ID' adds no new syntax or format, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States explicit fetch-by-ID semantics and enumerates returned attributes; distinguishes itself from sibling list_sirens by focusing on a specific siren.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by ID' makes it clear this is for retrieving one known siren rather than enumerating all sirens, but it does not explicitly point to list_sirens for ID discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_snapshotARead-only
Get a JPEG snapshot from a camera. Returns a base64-encoded image/jpeg (rendered directly by MCP clients). Use highQuality=true for full-resolution capture; set channel=package to capture from the secondary package camera on doorbells with hasPackageCamera=true.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID | |
| channel | No | Camera channel to capture. Use "package" for cameras with hasPackageCamera=true (defaults to main) | |
| highQuality | No | If true, request a high-quality snapshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds value by specifying the return format (base64-encoded image/jpeg) and the conditional behavior for package camera capture, enhancing transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with two sentences that front-load the main purpose. Every sentence provides essential information, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool and good annotations/schema, the description is complete enough. It covers the return type and parameter guidance. No output schema exists, but the description compensates by explaining the output format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with parameter descriptions, but the description adds meaningful semantics: highQuality=true for full-resolution and channel=package for secondary camera usage. This provides context that the schema alone lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get a JPEG snapshot from a camera.' It specifies the verb and resource, and the mention of base64-encoded output distinguishes it from other protect_get_* siblings which retrieve different device data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidelines for parameter usage: use highQuality=true for full-resolution and channel=package for secondary camera on doorbells with hasPackageCamera=true. This helps the agent decide when to use these parameters, though it does not explicitly state when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_speakerARead-only
Get full details for a specific speaker by ID. Returns: id, modelKey, name, mac, state, type, guid, volume, micVolume, isMicEnabled, speakerState (status, mode), featureFlags (hasMic) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Speaker ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| volume | No | Speaker volume (number) |
| modelKey | No | Resource kind |
| micVolume | No | Microphone volume (number) |
| featureFlags | No | Feature flags (object: hasMic) |
| isMicEnabled | No | Microphone enabled (boolean) |
| speakerState | No | Speaker state (object: status, mode) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the description adds no contradiction. It contributes only a version reference and a return-field list, without disclosing extra behaviors like error handling, permissions, or latency; for a simple getter this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the action and key parameter, followed by a compact return-field list and docs reference. No filler or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only getter with full schema parameter coverage and an output schema, the description is essentially complete. There are no missing details an agent needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, id, is 100% covered by the schema ('Speaker ID'), and the description merely restates that selection is by ID. No additional format, uniqueness, or lookup semantics are supplied, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States an explicit verb ('Get'), a specific resource ('full details for a specific speaker'), and the selection key 'by ID.' This cleanly contrasts with list-oriented siblings like protect_list_speakers while matching the get_* pattern across sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the intended use — fetch one speaker once an ID is known — but it does not explicitly say when to choose this over protect_list_speakers or state any exclusions. There is enough context to infer usage, but no direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_ulp_userARead-only
Get details for a specific UniFi Identity (ULP) user by ID. Returns: id, modelKey, firstName, lastName, fullName, email, status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ULP user ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | ULP user UUID |
| No | Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47) | |
| status | No | Account status, e.g. ACTIVE |
| fullName | No | Full name |
| lastName | No | Last name |
| modelKey | No | Always "ulpUser" |
| firstName | No | First name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds the list of return fields, which is useful but largely redundant given the output schema. It does not mention error behavior, permissions, or other behavioral details, but with annotations providing the safety profile and the output schema covering return structure, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and resource, then lists return fields. There is no wasted wording or redundant information. It is appropriately concise for a simple get-by-ID tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a one-parameter tool with a known output schema and safe read-only annotations. It clearly states what the tool does and what it returns. It does not cover edge cases like not-found behavior, but given the tool's simplicity and the presence of an output schema, the description is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'id', and its schema description ('ULP user ID') already defines it. The description repeats 'by ID' but adds no additional semantics, such as format or constraints, beyond the schema. Baseline 3 is correct for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Get'), a specific resource ('details for a specific UniFi Identity (ULP) user'), and the retrieval method ('by ID'). It also lists the returned fields, which makes the purpose unambiguous. It distinguishes from sibling tools like protect_get_user by explicitly specifying ULP users, and from protect_list_ulp_users by targeting a single ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when a single ULP user ID is known, but it does not explicitly state when not to use it or point to alternatives such as protect_list_ulp_users for listing all users. The usage context is clear enough for a get-by-id tool, but explicit guidance would improve the score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_userBRead-only
Get details for a specific Protect user by ID. Returns the same fields as protect_list_users entries: id, modelKey, name, firstName, lastName, email, ucoreUserId.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | User ID |
| name | No | Display name |
| No | Email address | |
| lastName | No | Last name |
| modelKey | No | Always "user" |
| firstName | No | First name |
| ucoreUserId | No | UniFi Core user UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the concrete return field set (id, modelKey, name, email, ucoreUserId), which is useful shape context, but says nothing about error behavior for invalid IDs or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with purpose and then the return shape. No filler, no repetition of the tool name as a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not have been enumerated (though doing so is harmless). For a one-parameter read tool with full annotations, the definition is essentially complete; only the ambiguity with protect_get_ulp_user/protect_list_users keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'id' parameter is documented in the schema as 'User ID.' The description's 'by ID' adds nothing beyond that. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get details for a specific Protect user by ID.' An agent understands exactly what it fetches. However, it does not distinguish itself from close siblings such as protect_get_ulp_user or protect_list_users, which is what would push this to a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given beyond the implicit 'you have an ID.' With siblings protect_get_ulp_user and protect_list_users in the same namespace, the agent is left to infer which user-lookup tool applies. No conditions, prerequisites, or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_viewerARead-only
Get full details for a specific viewer by ID. Returns: id, modelKey, name, mac, state, type, guid, liveview, streamLimit (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Viewer ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| liveview | No | Assigned live view ID, or null |
| modelKey | No | Resource kind |
| streamLimit | No | Max concurrent streams (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds value by enumerating the returned fields and citing the docs version. It does not contradict the annotations and gives useful context about what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core action and resource, followed by a compact field list. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with annotations and an output schema, this description covers what the tool does, what it returns, and when to use it. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter 'id' is already described as 'Viewer ID'. The description adds no extra semantic detail about the parameter beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get full details') and resource ('a specific viewer by ID'), clearly distinguishing this from list_viewers and the other get_* siblings. The focus on ID-based retrieval makes the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is the tool to use when you have a specific viewer ID and need full details. It does not explicitly mention list_viewers as the alternative for enumeration, but the context is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_alarm_hubsARead-only
List all alarm hubs managed by UniFi Protect. Returns array; each alarm hub includes: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (object), deviceTamperStatus, threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds behavioral transparency by detailing the exact fields in the returned array, including the nested threadState object, and notes the documentation version (7.3.47). This goes beyond the annotations and helps the agent anticipate the response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides a dense list of return fields. It is concise for the amount of information conveyed, though the field enumeration is extensive. The single-sentence structure is efficient and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation, the description covers the resource, scope, and return structure adequately. An output schema exists, so the field enumeration is redundant but not harmful. The main missing context is a clarification of how this tool differs from list_link_stations, which could affect agent selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully covers parameter semantics. The description correctly omits parameter details, and the baseline of 4 applies because there is nothing to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'List all alarm hubs managed by UniFi Protect' with a specific resource. It also enumerates the expected return fields, which distinguishes it from a singular get_alarm_hub. The mention of modelKey 'linkstation' could hint at overlap with list_link_stations, but the tool name and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need all alarm hubs, but it provides no explicit guidance on when to use this tool over the similar sibling list_link_stations. Since both tools exist and the description notes modelKey 'linkstation', the lack of differentiation is a gap. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_arm_profilesARead-only
List all arm profiles (only available when using the local alarm manager — the standalone NVR alarm system, not Protect cloud alerts). Returns array; each profile (7.1.83 docs): id, name, automations[], creator, schedules[], recordEverything, activationDelay (0 | 60000 | 300000 | 600000), createdAt, updatedAt.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the environment constraint (local alarm manager only) and the shape of the returned array, which is genuinely useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the availability constraint front-loaded. The field enumeration is somewhat redundant given an output schema exists, but it stays brief and does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with full annotation coverage and an output schema, the description supplies the key missing piece — the local-alarm-manager-only scope. Return-value detail is already handled by the output schema, so the definition is essentially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the baseline the description carries no parameter burden. Nothing is missing or misleading on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all arm profiles') and immediately scopes it to the local alarm manager rather than Protect cloud alerts. An agent can distinguish this tool's domain without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical explicitly states the condition under which the tool is available ('only available when using the local alarm manager — the standalone NVR alarm system, not Protect cloud alerts'), which tells the agent when it applies. It does not name a specific alternative sibling to use otherwise, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_bridgesARead-only
List all bridges managed by UniFi Protect. Returns array; each bridge includes: id, modelKey, name, mac, state, type, guid, platform, clients (array of MACs), maxClients (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a safe read operation. The description adds value by disclosing the return shape as an array and enumerating the fields included per bridge, including clients and maxClients. This goes beyond the annotation-only view without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that names the action and scope first, then provides a compact field list. There is no filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only list operation with an output schema available, the description is complete. It states the resource, scope, return type, and key fields, leaving no ambiguity for an agent deciding to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to clarify. The empty input schema is fully covered, and the description adds no unnecessary parameter assumptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "List all bridges managed by UniFi Protect." The scope is explicit, and it is clearly distinguishable from sibling list tools like protect_list_cameras and protect_list_sensors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use when an agent needs all bridges in the Protect system. It does not explicitly mention alternatives such as protect_get_bridge for a single bridge, but the list-all framing provides sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_camerasARead-only
List all cameras managed by UniFi Protect. Returns array; each camera includes (Integration API 7.3.47-verified fields): id, mac, name, modelKey, state (CONNECTED/DISCONNECTED), type (hardware model name, e.g. UVC G6 Turret), guid (hardware MODEL GUID — every camera of the same model returns the same value, so it is NOT a per-camera identifier; use id), activePatrolSlot, hasPackageCamera, hdrType, isMicEnabled, micVolume, videoMode, featureFlags (hasHdr, hasMic, hasSpeaker, hasLedStatus, smartDetectTypes[], smartDetectAudioTypes[], videoModes[], supportFullHdSnapshot), lcdMessage (type, resetAt, text), ledSettings (isEnabled, floodLed, welcomeLed), osdSettings (isNameEnabled, isDateEnabled, isLogoEnabled, isDebugEnabled, overlayLocation), smartDetectSettings (objectTypes[], audioTypes[]). The Integration API does NOT expose recording state, motion timestamps, connection/last-seen, firmware, host, or per-channel stream config.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/destructiveHint annotations by disclosing exact returned fields, state enum values, and a critical caveat that guid is a model GUID rather than a per-camera identifier. It also explicitly lists what the Integration API does NOT expose, setting accurate expectations and preventing misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with its core purpose. The field enumeration is dense and detailed, yet every part adds either return-contract precision or limitation context. It could be slightly more compact, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only list tool, the description is exceptionally complete. It states the scope, enumerates the returned fields, clarifies the semantics of a confusing field (guid), and names the data the API cannot provide. An agent has everything needed to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so parameter semantics are not applicable. The description correctly focuses on the output contract instead, which is the only meaningful semantic content for this parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all cameras managed by UniFi Protect.' It clearly distinguishes itself from sibling tools such as protect_get_camera, which retrieves a single camera, and other protect_list_* tools for different device types. The resource scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear: use it when you need all cameras managed by UniFi Protect. It does not explicitly name alternatives or state exclusions, but the phrase 'all cameras' strongly implies this is the enumeration tool rather than a single-camera getter, which is adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_chimesARead-only
List all chimes managed by UniFi Protect. Returns array; each chime includes: id, modelKey, name, mac, state, type, guid, cameraIds (array of camera IDs), ringSettings (array of objects: cameraId, volume, ringtoneId, repeatTimes) — verified live 7.3.47.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavioral detail by specifying the exact return shape, field names, and nested ringSettings structure. It also notes verification against firmware 7.3.47, adding credibility beyond the annotations. Missing pagination or ordering details, but for a list-all read operation this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the main purpose comes first, followed by the return structure and a verification note. The field enumeration is dense but directly useful, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only list tool, the description provides everything an agent needs: the scope ('all chimes'), the output type ('array'), and the complete field layout. The output-schema signal further reinforces the completeness, so no critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so the parameter contract is fully complete by default. The description has no need to elaborate on parameters and correctly omits them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all chimes managed by UniFi Protect.' It unambiguously identifies the tool's function and distinguishes it from sibling list/get tools for other device types by naming the exact resource (chimes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: when you need the full set of chimes. However, it does not explicitly mention alternatives such as protect_get_chime for retrieving a single chime, nor does it provide exclusion criteria, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_filesARead-only
List files of a given type (only 'animations' is currently supported — clips uploadable to G4 Doorbell screens). Returns array; each record (7.1.83 docs): name (server-generated), type, originalName, path.
| Name | Required | Description | Default |
|---|---|---|---|
| fileType | Yes | File type to list (only 'animations' is currently supported) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the 'only animations currently supported' limitation, but that same statement is already duplicated in the schema parameter description, and it says nothing about pagination, auth, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and constraint in the first clause, efficient overall. However, the trailing 'Returns array; each record ... name, type, originalName, path' is redundant since an output schema exists, so it dilutes rather than adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description covers the purpose and the key limitation; it need not explain return values. It is complete enough to call the tool correctly, missing only minor usage routing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage, so the schema already documents fileType and its supported value. The description merely restates the same constraint without adding format, default, or enumeration detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (files) plus the scoping constraint that only 'animations' file type is supported. The sibling set is all distinct-protected-resource list/get pairs, so there is no ambiguity about which resource this touches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and the single supported fileType value, but there is no explicit when-to-use statement, no mention of related tools, and no note on what to do with the returned records (e.g., feeding an upload endpoint). Adequate but leaves routing guidance to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_fobsARead-only
List all fobs managed by UniFi Protect. Returns array; each fob includes: id, modelKey, name, mac, state, type, guid, awayState, buttonLabels, featureFlags (buttons[]), hasKeypad, armControlSettings (enabled, armProfileId, nightProfileId), keypadSettings (beepEnabled, beepVolume, backlightEnabled, backlightBrightness), wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description correctly avoids repeating safety. It adds behavioral value by specifying the return type ('Returns array'), enumerating the exact fields, and noting a version-specific detail (wirelessConnectionState in 7.3.47). This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the core purpose, then lists return fields. While the field enumeration is lengthy, it is structured and informative, not redundant waste. It could be slightly shorter by relying on the output schema, but it serves as a quick reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list tool with an output schema present, the description is complete. It states what it does, what it returns, and adds a version note. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% (empty schema). Baseline for 0 params is 4, and the description correctly omits any parameter details since none exist. No additional meaning is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all fobs managed by UniFi Protect' – a specific verb and resource, and the word 'all' differentiates it from the singular get_fob sibling. It also enumerates the return fields, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for retrieving all fobs, but does not explicitly name alternatives or provide when-not-to-use guidance. The existence of protect_get_fob is not referenced, so an agent must infer which to choose. The context is clear but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_lightsARead-only
List all lights managed by UniFi Protect. Returns array; each light includes: id, modelKey, name, mac, state, type, guid, lightModeSettings (mode, enableAt), lightDeviceSettings (isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel), isDark, isLightOn, isLightForceEnabled, lastMotion, isPirMotionDetected, camera (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds substantial behavioral detail beyond annotations, including the exact return shape, field names, nested setting groups, and even a documentation version reference. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence, and the field list is organized into grouped settings. The enumeration is somewhat long and partly redundant with the existing output schema, but it remains compact and information-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only list tool with an output schema, the description covers everything an agent needs: what it lists, what the returned array contains, and the relevant documentation version. No prerequisites, pagination, or auth details are necessary given the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the input schema is empty with 100% schema description coverage. There is nothing for the description to clarify about parameters, so the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), resource ('lights'), and scope ('all lights managed by UniFi Protect'), making the tool's purpose unmistakable. It also distinguishes itself from the sibling protect_get_light by emphasizing 'all' rather than a single light.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'List all lights' gives clear context for when this tool is appropriate. However, it does not explicitly mention alternative tools like protect_get_light for retrieving an individual light, so there is no direct exclusion or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_link_stationsARead-only
List all link stations managed by UniFi Protect. Returns array; each link station includes: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (object), deviceTamperStatus, threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it specifies the return shape (array), the exact fields included, and notes the documentation version (7.3.47 docs). It does not disclose potential pagination, rate limits, or error behavior, but for a read-only list operation with no parameters, the provided detail is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that front-loads the core action ('List all link stations') and then enumerates the return fields. It is not overly verbose, but the field list is long and somewhat technical; it could be slightly more scannable with bullet points or a shorter summary. Still, every part earns its place by documenting the output structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, an output schema exists, and annotations cover safety, the description is largely complete. It details the return fields extensively, which is the main thing an agent needs to know. Minor gaps: it doesn't mention whether the list is sorted, whether it can be empty, or any error conditions, but these are not critical for a read-only list tool with no inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete (100% coverage). The description adds no parameter semantics because there are none to describe. Per the rubric, 0 params = baseline 4, and the description appropriately focuses on the return payload instead. It could theoretically mention that no arguments are required, but the empty schema already conveys that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'all link stations managed by UniFi Protect', which distinguishes it from sibling tools like protect_get_link_station (singular) and protect_list_cameras. It also specifies the return type (array) and enumerates the fields included, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it lists all link stations, contrasting with the singular get_link_station sibling. However, it does not explicitly state when to use this tool versus alternatives (e.g., 'use get_link_station for a single station'), nor does it mention any exclusions or prerequisites. The context is clear enough for an agent to infer the primary use case, but explicit routing guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_liveviewsARead-only
List all live views (camera grid layouts shown on viewers / in the Protect UI). Returns array; each liveview includes (Integration API 7.1.83-verified): id, modelKey, name, isDefault, isGlobal, layout (number, slot count), owner (user ID), slots (array of {cameras: string[], cycleMode, cycleInterval}). NOTE: slots use a cameras string-array, not a single cameraId.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful schema-level context beyond annotations: the exact shape of returned fields, the API version verification (7.1.83), and a getcha about the 'cameras' string-array field name. It doesn't cover pagination or empty-result behavior, but that's a minor gap given annotations handle safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and follows with the return shape and a caveat. Slightly dense with field enumeration, but every sentence earns its place by adding information an agent needs to interpret or use the response.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with a covered output schema and annotations, this is complete: purpose is clear, return shape is enumerated, a notable field-name pitfall is flagged, and safety is handled by annotations. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description compensates appropriately by thoroughly documenting the meaningful fields of the returned objects, which is the relevant 'semantics' here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all live views') and immediately defines what a liveview is ('camera grid layouts shown on viewers / in the Protect UI'). This distinguishes it from siblings like protect_list_viewers, which lists viewer devices rather than the grid layouts themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — an agent needing to enumerate liveviews would call this — but the description offers no explicit when-to-use, when-not-to-use, or pointers to alternatives such as protect_get_liveview for fetching a single liveview. The implicit contrast is present but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_nvrsARead-only
Get the NVR (Network Video Recorder) console info. NOTE: despite the name, the Protect Integration API's /nvrs endpoint returns a SINGLE NVR object, not an array. Returns: id, modelKey, name, type (e.g. UNVR-PRO), guid, mac, doorbellSettings (defaultMessageText, defaultMessageResetTimeoutMs, customMessages[], customImages[]), armMode (status, armedAt, willBeArmedAt, breachDetectedAt, breachEventCount, breachTriggerEventId, breachEventId).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | NVR ID |
| mac | No | MAC address, added in 7.3.x |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | NVR name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| armMode | No | |
| modelKey | No | Always "nvr" |
| doorbellSettings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by revealing the singular response shape and enumerating the returned fields (id, modelKey, type, doorbellSettings, armMode), going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and the critical singular-object caveat before listing return fields. The field enumeration is somewhat long but relevant and not padded; it remains compact enough for a zero-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema and annotations present, the description is complete. It covers the main purpose, the important array-vs-single-object behavior, and the expected return fields, leaving no gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so the schema fully covers parameters. A zero-parameter tool gets a baseline of 4; no additional parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the NVR (Network Video Recorder) console info.' It also explicitly corrects the name's implication by noting the endpoint returns a SINGLE NVR object, not an array, which distinguishes it from a typical list operation and from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to retrieve console information for the single NVR. The explicit 'not an array' caveat helps prevent misuse, though it does not name alternative sibling tools or provide explicit when-not conditions beyond that caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_relaysARead-only
List all relays managed by UniFi Protect. Returns array; each relay includes: id, modelKey, name, mac, state, type, guid, ledSettings (isEnabled), outputs (array), inputs (array), wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds return-format transparency by enumerating the relay fields and noting the docs version, going beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence, front-loaded with the action and resource, followed by a terse field list. No filler or redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter read-only list with an output schema and siblings for context; the description is sufficient for an agent to call it correctly and understand the result structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool accepts zero parameters, so there is no parameter burden. Per the baseline for 0-param tools, the description does not need to explain parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all relays managed by UniFi Protect') and the return shape. It is clearly distinct from sibling list tools and from protect_get_relay.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case (need all relays) is only implied by the verb 'List'. The description does not explicitly mention when to use this instead of protect_get_relay or other list tools, and it gives no exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_sensorsARead-only
List all sensors managed by UniFi Protect. Returns array; each sensor includes: id, modelKey, name, mac, state, type, guid, mountType, featureFlags (temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each {channelCount}), batteryStatus (percentage, isLow), stats (light, humidity, temperature), lightSettings, humiditySettings, temperatureSettings, isOpened, openStatusChangedAt, isMotionDetected, motionDetectedAt, motionSettings, glassBreakSettings, scheduleMode, armProfileIds, hasCustomSensitivityWhenArmed, alarmTriggeredAt, alarmSettings, leakDetectedAt, externalLeakDetectedAt, leakSettings, tamperingDetectedAt, wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the return type (array) and a detailed field enumeration, giving the agent concrete visibility into response contents beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and easy to parse, but the long comma-separated field inventory makes the description heavier than necessary, especially since an output schema exists. The information is relevant, but some trimming would improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list operation with an output schema, the description fully covers scope, return type, and field details. Nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema covers 100% of the input surface, so there are no parameters for the description to explain. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('all sensors managed by UniFi Protect'), making its scope unambiguous. It is clearly distinct from sibling protect_get_sensor and other list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'List all sensors' implies the tool is for batch retrieval of the full sensor set, but it does not explicitly name alternatives such as protect_get_sensor for individual sensors or state when not to use it. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_sirensARead-only
List all sirens managed by UniFi Protect. Returns array; each siren includes: id, modelKey, name, mac, state, type, guid, volume, ledSettings (isEnabled), sirenStatus (isActive, activatedAt, duration), connectionType, wirelessConnectionState (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is read-only and non-destructive; the description adds meaningful behavioral detail by specifying the return type (array) and enumerating the exact fields available. It also notes a version-dependent field, which is useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences with no filler. It front-loads the core purpose and then succinctly lists the return fields, including a useful version note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list operation, the description is complete. An agent can invoke the tool without additional info and knows exactly what fields will be returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the schema covers everything and the description does not need to explain inputs. The returned fields are described, adding value beyond the empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool lists all sirens managed by UniFi Protect, which is a specific verb and resource. It also includes the return structure, making it easy to distinguish from the get_siren and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is implied: call this when you need a list of all sirens rather than a single siren. However, there is no explicit guidance about when to prefer this over protect_get_siren or other list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_speakersARead-only
List all speakers managed by UniFi Protect. Returns array; each speaker includes: id, modelKey, name, mac, state, type, guid, volume, micVolume, isMicEnabled, speakerState (status, mode), featureFlags (hasMic) (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the return shape (array of speakers with specific fields), but it does not disclose operational behaviors such as filtering, pagination, permissions, or rate limits. This is adequate but not rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and remains compact. The enumeration of returned fields is useful, though somewhat redundant given that an output schema exists; overall it stays concise and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only list tool with annotations and an output schema, the description is complete: it states the resource, the action, the return shape, and even the documentation version. No further details are necessary for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100% (empty schema). With no parameters to document, the description does not need to add parameter meaning; the baseline of 4 applies because there is nothing for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all speakers managed by UniFi Protect.' This clearly identifies the tool's action and scope, and the 'all speakers' wording differentiates it from the sibling protect_get_speaker, which targets a single speaker.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'List all' phrasing implies a listing use case, but the description does not explicitly state when to use this tool versus protect_get_speaker or any other list/get siblings, and it provides no exclusions or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_ulp_usersARead-only
List all UniFi Identity (ULP) users. Returns array; each ULP user includes (Integration API 7.3.47-verified): id, modelKey, firstName, lastName, fullName, email (empty string for service accounts), status (e.g. ACTIVE). Enrolled-credential detail (NFC cards, fingerprints) is NOT exposed by this API surface.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing the exact fields returned and explicitly noting that enrolled-credential details (NFC cards, fingerprints) are NOT exposed. This goes beyond the annotations and provides useful behavioral context about the API surface's limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose. Every sentence adds meaningful information: the first states what the tool does, the second details the return shape and an important limitation. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with an output schema, the description covers the essential information: the return type, the fields included, and the notable omission (credential details). It also notes API version verification. It doesn't discuss pagination or error handling, but these are minor for a simple list operation. The description is sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema confirms no properties. Since there are no parameters to document, the description doesn't need to explain any. Baseline for zero parameters is 4, and the description correctly avoids adding irrelevant parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List all UniFi Identity (ULP) users.' It also clarifies the exact user type (ULP) and the return format (array), distinguishing it from sibling tools like protect_list_users (Protect users) and protect_get_ulp_user (singular). The API version verification adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: this tool lists all ULP users. However, it does not explicitly contrast with alternatives such as protect_list_users or protect_get_ulp_user, nor does it state when to use this tool versus others. The purpose is unambiguous, but there is no explicit 'when not to use' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_usersARead-only
List all Protect users (filtered by the API key's access permissions). Returns array; each user includes (Integration API 7.3.47-verified): id, modelKey, name, firstName, lastName, email, ucoreUserId. The Integration API does NOT expose roles, permissions, login history, groups, or notification settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful behavioral context by disclosing API-key-based filtering and explicitly listing fields that are NOT exposed (roles, permissions, login history, groups, notification settings). This helps agents set expectations beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action and scope appear in the first sentence, followed by return fields and important exclusions. Every sentence earns its place, with no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simple profile (0 parameters, read-only annotations, output schema present), the description is complete. It specifies the filtered listing behavior, the exact fields returned per the Integration API, and the notable data the API does not expose, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and 100% schema description coverage, so there are no parameter semantics to clarify. The description adds value by explaining the filtered scope of the returned results, which is relevant even without parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List all Protect users') and resource, with explicit scoping ('filtered by the API key's access permissions'). This clearly distinguishes it from related siblings like protect_get_user (single resource) and protect_list_ulp_users (different user type).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a caller needs the full set of Protect users visible to the API key. However, it does not explicitly state when to prefer this over alternatives such as protect_get_user or protect_list_ulp_users, nor does it mention exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_viewersARead-only
List all viewers managed by UniFi Protect. Returns array; each viewer includes: id, modelKey, name, mac, state, type, guid, liveview, streamLimit (7.3.47 docs).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Array of items returned by the list endpoint |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that the call returns an array with specific fields, which is useful, but it does not mention pagination, ordering, or any additional behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the operation, the resource, the return type, and the relevant fields. The documentation version note adds useful provenance without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with an output schema present, the description provides everything needed: what is listed, the scope, and the expected return shape. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema coverage is effectively 100% for that empty parameter set. There is no parameter semantic burden for the description to carry, so the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'viewers' and explicitly scopes to 'all viewers managed by UniFi Protect.' This clearly distinguishes it from sibling tools like protect_get_viewer and other list_* variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'List all viewers' phrasing makes the enumeration use case clear, especially alongside the singular protect_get_viewer sibling. It does not explicitly state when not to use it or name an alternative, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_subscribe_devicesARead-only
Connect to the device update WebSocket and collect messages for a specified duration (1-30s). Returns {messages, duration, error?}; each message has {type: 'add'|'update'|'remove', modelKey: 'camera'|'light'|'sensor'|..., id, payload: partial device fields that changed}. Use to detect state changes like isRecording flipping, battery drops, or new devices being adopted — fields delivered are only those that changed, not the full device object.
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Seconds to listen (1-30, default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Connection error, if any |
| duration | No | Actual listen duration in seconds (number) |
| messages | No | Captured WebSocket messages (add/update/remove or event envelopes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it a safe read (readOnlyHint=true, destructiveHint=false), and the description adds real behavioral context: the listen window (1-30s) and the key trait that only changed fields are delivered, not the full object. It stops short of mention of dropped connections or reconnection behavior, but adds genuine value over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return shape, then the use case. It is dense but every sentence carries information; only the return-shape detail is partly redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the action, duration constraint, return shape, and use case, which is enough to invoke it. Missing only differentiation from the sibling protect_subscribe_events, the closest alternative for an agent deciding between streaming tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% with the same 1-30s/default-5 detail already in the schema. The description's duration mention adds no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (subscribe/connect) and resource (device update WebSocket), and the exact operation (collect messages for 1-30s). It is clearly distinguishable from the sibling list_* and get_* tools, which are one-shot reads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('use to detect state changes like isRecording flipping, battery drops, or new devices being adopted'). However, it never contrasts with the sibling protect_subscribe_events or states when a polling read (protect_list_cameras) is preferable, so no explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_subscribe_eventsARead-only
Connect to the Protect event WebSocket and collect messages for a specified duration (1-30s). Returns {messages, duration, error?}; each event message includes: id, type ('motion' | 'ring' | 'smartDetectZone' | 'smartDetectLine' | 'sensorMotion' | 'sensorAlarm' | 'fingerprint' | 'nfcCard' | ...), start, end (null while ongoing), camera/sensor id, score, smartDetectTypes (['person','vehicle','animal','package','license_plate','face']), metadata (e.g. detected license plate text, NFC card id, fingerprint id, ULP user match).
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Seconds to listen (1-30, default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Connection error, if any |
| duration | No | Actual listen duration in seconds (number) |
| messages | No | Captured WebSocket messages (add/update/remove or event envelopes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true/destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: the duration range (1-30s), that events arrive as a stream, the ongoing-event semantics (end=null), and the full shape of returned event messages including optional error field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the connect-and-collect behavior, then enumerates return shape. It is long but information-dense with little filler; the enum listings are the bulk but arguably useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is optional—yet the description complements it with concrete event field semantics (type enum, smartDetectTypes, metadata examples) that help the agent interpret results. Only minor gap is the absence of explicit when-to-use guidance versus sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'duration' parameter is fully documented in both schema and description (1-30s, default 5). The description adds no syntax or format beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Connect... and collect messages') and resource ('Protect event WebSocket'), and the name/title align. Clearly distinct from sibling list/get tools, which are request-response, whereas this is a streaming/collection operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (listening for live events over a duration) but never explicitly states when to use this tool versus alternatives like protect_list_cameras or protect_subscribe_devices. No exclusions or routing guidance are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v2.13.0- Changed
protect_get_alarm_hub4 fields changed- added
Output schema / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_bridge2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_camera2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_chime2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_fob5 fields changed- added
Output schema / properties / armControlSettingsAdded value: +{ + "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)" +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / hasKeypadAdded value: +{ + "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" +} - added
Output schema / properties / keypadSettingsAdded value: +{ + "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_light2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_link_station4 fields changed- added
Output schema / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_relay2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_sensor3 fields changed- added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })" +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_siren2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_speaker2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_ulp_user1 field changed- added
Output schema / properties / emailAdded value: +{ + "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_viewer2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_alarm_hubs4 fields changed- added
Output schema / properties / result / items / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_bridges2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_cameras2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_chimes2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_fobs5 fields changed- added
Output schema / properties / result / items / properties / armControlSettingsAdded value: +{ + "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)" +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / hasKeypadAdded value: +{ + "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" +} - added
Output schema / properties / result / items / properties / keypadSettingsAdded value: +{ + "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_lights2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_link_stations4 fields changed- added
Output schema / properties / result / items / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_nvrs3 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / macAdded value: +{ + "description": "MAC address, added in 7.3.x", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_relays2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_sensors3 fields changed- added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })" +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_sirens2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_speakers2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_ulp_users1 field changed- added
Output schema / properties / result / items / properties / emailAdded value: +{ + "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_viewers2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
37 tool updates
v2.11.5- Changed
protect_get_alarm_hub8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_bridge10 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / platform / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / platform / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_camera18 fields changed- removed
Output schema / properties / hdrType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / hdrType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lcdMessage / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lcdMessage / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lcdMessage / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lcdMessage / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / osdSettings / properties / overlayLocation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / osdSettings / properties / overlayLocation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / videoMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / videoMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_chime8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_fob12 fields changed- removed
Output schema / properties / awayState / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / awayState / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / buttonLabels / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / buttonLabels / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_info2 fields changed- removed
Output schema / properties / applicationVersion / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / applicationVersion / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_light10 fields changed- removed
Output schema / properties / camera / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / camera / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_link_station8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_liveview8 fields changed- removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / owner / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / owner / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / slots / items / properties / cycleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / slots / items / properties / cycleMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_relay8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_rtsp_streams8 fields changed- removed
Output schema / properties / high / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / high / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / low / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / low / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / medium / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / medium / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / package / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / package / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_sensor12 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mountType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mountType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / scheduleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / scheduleMode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_siren10 fields changed- removed
Output schema / properties / connectionType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / connectionType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_speaker8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_ulp_user10 fields changed- removed
Output schema / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / fullName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / fullName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_user12 fields changed- removed
Output schema / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / ucoreUserId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / ucoreUserId / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_viewer10 fields changed- removed
Output schema / properties / liveview / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / liveview / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_alarm_hubs8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_arm_profiles4 fields changed- removed
Output schema / properties / result / items / properties / creator / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / creator / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_bridges10 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / platform / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / platform / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_cameras18 fields changed- removed
Output schema / properties / result / items / properties / hdrType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / hdrType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lcdMessage / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lcdMessage / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lcdMessage / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lcdMessage / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / osdSettings / properties / overlayLocation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / osdSettings / properties / overlayLocation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / videoMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / videoMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_chimes8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_files8 fields changed- removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / originalName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / originalName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / path / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / path / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / type / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_fobs12 fields changed- removed
Output schema / properties / result / items / properties / awayState / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / awayState / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / buttonLabels / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / buttonLabels / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_lights10 fields changed- removed
Output schema / properties / result / items / properties / camera / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / camera / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_link_stations8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_liveviews8 fields changed- removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / owner / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / owner / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / slots / items / properties / cycleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / slots / items / properties / cycleMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_nvrs10 fields changed- removed
Output schema / properties / armMode / properties / armProfileId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / armMode / properties / armProfileId / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / armMode / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / armMode / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / doorbellSettings / properties / defaultMessageText / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / doorbellSettings / properties / defaultMessageText / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_relays8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_sensors12 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mountType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mountType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / scheduleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / scheduleMode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_sirens10 fields changed- removed
Output schema / properties / result / items / properties / connectionType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / connectionType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_speakers8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_ulp_users10 fields changed- removed
Output schema / properties / result / items / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / fullName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / fullName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / status / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_users12 fields changed- removed
Output schema / properties / result / items / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / ucoreUserId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / ucoreUserId / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_viewers10 fields changed- removed
Output schema / properties / result / items / properties / liveview / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / liveview / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_subscribe_devices2 fields changed- removed
Output schema / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / error / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_subscribe_events2 fields changed- removed
Output schema / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / error / typeAdded value: +[ + "string", + "null" +]
11 tool updates
v2.10.0- Added
protect_get_fob - Added
protect_get_info - Added
protect_get_link_station - Added
protect_get_rtsp_streams - Added
protect_list_arm_profiles - Added
protect_list_chimes - Added
protect_list_fobs - Added
protect_list_link_stations - Added
protect_list_nvrs - Added
protect_list_speakers - Added
protect_list_viewers
11 tool updates
v2.9.0- Removed
protect_get_fob - Removed
protect_get_info - Removed
protect_get_link_station - Removed
protect_get_rtsp_streams - Removed
protect_list_arm_profiles - Removed
protect_list_chimes - Removed
protect_list_fobs - Removed
protect_list_link_stations - Removed
protect_list_nvrs - Removed
protect_list_speakers - Removed
protect_list_viewers
28 tool updates
v2.7.5- Changed
protect_get_alarm_hub4 fields changed- added
Output schema / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_get_bridge3 fields changed- added
Output schema / properties / clientsAdded value: +{ + "description": "Connected client MACs (array of strings)" +} - added
Output schema / properties / maxClientsAdded value: +{ + "description": "Max client capacity (number)" +} - added
Output schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Hardware platform, e.g. \"mt7621\"" +}
- Changed
protect_get_camera4 fields changed- added
Output schema / properties / lcdMessage / additionalPropertiesAdded value: +{} - removed
Output schema / properties / lcdMessage / descriptionRemoved value: -"Doorbell LCD message (object; often empty {})" - added
Output schema / properties / lcdMessage / propertiesAdded value: +{ + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message text shown on the doorbell LCD" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"" + } +} - added
Output schema / properties / lcdMessage / typeAdded value: +"object"
- Changed
protect_get_chime2 fields changed- added
Output schema / properties / cameraIdsAdded value: +{ + "description": "Paired camera IDs (array of strings)" +} - added
Output schema / properties / ringSettingsAdded value: +{ + "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)" +}
- Changed
protect_get_fob4 fields changed- added
Output schema / properties / awayStateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Away state, e.g. \"ONLINE\"" +} - added
Output schema / properties / buttonLabelsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Button label preset, e.g. \"securityActions\"" +} - added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: buttons[])" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_light8 fields changed- added
Output schema / properties / cameraAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paired camera ID" +} - added
Output schema / properties / isDarkAdded value: +{ + "description": "Whether it is currently dark out (boolean)" +} - added
Output schema / properties / isLightForceEnabledAdded value: +{ + "description": "Main LED force-enabled (boolean)" +} - added
Output schema / properties / isLightOnAdded value: +{ + "description": "Whether the light is currently on (boolean)" +} - added
Output schema / properties / isPirMotionDetectedAdded value: +{ + "description": "PIR motion currently detected (boolean)" +} - added
Output schema / properties / lastMotionAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / lightDeviceSettingsAdded value: +{ + "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)" +} - added
Output schema / properties / lightModeSettingsAdded value: +{ + "description": "Activation settings (object: mode, enableAt)" +}
- Changed
protect_get_link_station4 fields changed- added
Output schema / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_get_relay4 fields changed- added
Output schema / properties / inputsAdded value: +{ + "description": "Input channels (array of objects)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / outputsAdded value: +{ + "description": "Output channels (array of objects)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_sensor22 fields changed- added
Output schema / properties / alarmSettingsAdded value: +{ + "description": "Alarm settings (object: isEnabled)" +} - added
Output schema / properties / alarmTriggeredAtAdded value: +{ + "description": "Last alarm timestamp in epoch ms (number)" +} - added
Output schema / properties / armProfileIdsAdded value: +{ + "description": "Arm profile IDs this sensor belongs to (array of strings)" +} - added
Output schema / properties / batteryStatusAdded value: +{ + "description": "Battery status (object: percentage, isLow)" +} - added
Output schema / properties / externalLeakDetectedAtAdded value: +{ + "description": "Last external-leak timestamp in epoch ms (number)" +} - added
Output schema / properties / glassBreakSettingsAdded value: +{ + "description": "Glass-break detection settings (object)" +} - added
Output schema / properties / hasCustomSensitivityWhenArmedAdded value: +{ + "description": "Custom armed sensitivity enabled (boolean)" +} - added
Output schema / properties / humiditySettingsAdded value: +{ + "description": "Humidity threshold settings (object)" +} - added
Output schema / properties / isMotionDetectedAdded value: +{ + "description": "Motion currently detected (boolean)" +} - added
Output schema / properties / isOpenedAdded value: +{ + "description": "Open/close contact state (boolean)" +} - added
Output schema / properties / leakDetectedAtAdded value: +{ + "description": "Last leak timestamp in epoch ms (number)" +} - added
Output schema / properties / leakSettingsAdded value: +{ + "description": "Leak detection settings (object)" +} - added
Output schema / properties / lightSettingsAdded value: +{ + "description": "Light threshold settings (object)" +} - added
Output schema / properties / motionDetectedAtAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / motionSettingsAdded value: +{ + "description": "Motion detection settings (object)" +} - added
Output schema / properties / mountTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Mount type, e.g. \"door\", \"leak\", \"garage\"" +} - added
Output schema / properties / openStatusChangedAtAdded value: +{ + "description": "Open-status change timestamp in epoch ms (number)" +} - added
Output schema / properties / scheduleModeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Schedule mode: \"always\" | \"when_armed\"" +} - added
Output schema / properties / statsAdded value: +{ + "description": "Environmental stats (object: light, humidity, temperature)" +} - added
Output schema / properties / tamperingDetectedAtAdded value: +{ + "description": "Last tampering timestamp in epoch ms (number)" +} - added
Output schema / properties / temperatureSettingsAdded value: +{ + "description": "Temperature threshold settings (object)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object: signalState, batteryStatus, bridge)" +}
- Changed
protect_get_siren5 fields changed- added
Output schema / properties / connectionTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Connection type, e.g. \"lora\"" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / sirenStatusAdded value: +{ + "description": "Current siren status (object: isActive, activatedAt, duration)" +} - added
Output schema / properties / volumeAdded value: +{ + "description": "Siren volume (number)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_snapshot1 field changed- added
Input schema / properties / channelAdded value: +{ + "description": "Camera channel to capture. Use \"package\" for cameras with hasPackageCamera=true (defaults to main)", + "enum": [ + "main", + "package" + ], + "type": "string" +}
- Changed
protect_get_speaker5 fields changed- added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: hasMic)" +} - added
Output schema / properties / isMicEnabledAdded value: +{ + "description": "Microphone enabled (boolean)" +} - added
Output schema / properties / micVolumeAdded value: +{ + "description": "Microphone volume (number)" +} - added
Output schema / properties / speakerStateAdded value: +{ + "description": "Speaker state (object: status, mode)" +} - added
Output schema / properties / volumeAdded value: +{ + "description": "Speaker volume (number)" +}
- Changed
protect_get_viewer2 fields changed- added
Output schema / properties / liveviewAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Assigned live view ID, or null" +} - added
Output schema / properties / streamLimitAdded value: +{ + "description": "Max concurrent streams (number)" +}
- Changed
protect_list_alarm_hubs4 fields changed- added
Output schema / properties / result / items / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / result / items / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / result / items / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_list_arm_profiles8 fields changed- added
Output schema / properties / result / items / properties / activationDelayAdded value: +{ + "description": "Activation delay in ms: 0 | 60000 | 300000 | 600000 (number)" +} - added
Output schema / properties / result / items / properties / automationsAdded value: +{ + "description": "Associated automation IDs (array of strings)" +} - added
Output schema / properties / result / items / properties / createdAtAdded value: +{ + "description": "Creation timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / creatorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ID of the user who created the profile" +} - removed
Output schema / properties / result / items / properties / modelKeyRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resource kind" -} - added
Output schema / properties / result / items / properties / recordEverythingAdded value: +{ + "description": "Record everything while active (boolean)" +} - added
Output schema / properties / result / items / properties / schedulesAdded value: +{ + "description": "Arm schedules (array of objects)" +} - added
Output schema / properties / result / items / properties / updatedAtAdded value: +{ + "description": "Last update timestamp in epoch ms (number)" +}
- Changed
protect_list_bridges3 fields changed- added
Output schema / properties / result / items / properties / clientsAdded value: +{ + "description": "Connected client MACs (array of strings)" +} - added
Output schema / properties / result / items / properties / maxClientsAdded value: +{ + "description": "Max client capacity (number)" +} - added
Output schema / properties / result / items / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Hardware platform, e.g. \"mt7621\"" +}
- Changed
protect_list_cameras4 fields changed- added
Output schema / properties / result / items / properties / lcdMessage / additionalPropertiesAdded value: +{} - removed
Output schema / properties / result / items / properties / lcdMessage / descriptionRemoved value: -"Doorbell LCD message (object; often empty {})" - added
Output schema / properties / result / items / properties / lcdMessage / propertiesAdded value: +{ + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message text shown on the doorbell LCD" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"" + } +} - added
Output schema / properties / result / items / properties / lcdMessage / typeAdded value: +"object"
- Changed
protect_list_chimes2 fields changed- added
Output schema / properties / result / items / properties / cameraIdsAdded value: +{ + "description": "Paired camera IDs (array of strings)" +} - added
Output schema / properties / result / items / properties / ringSettingsAdded value: +{ + "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)" +}
- Changed
protect_list_files6 fields changed- removed
Output schema / properties / result / items / properties / idRemoved value: -{ - "description": "File ID", - "type": "string" -} - removed
Output schema / properties / result / items / properties / modelKeyRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resource kind" -} - changed
Output schema / properties / result / items / properties / name / descriptionPrevious value: -"File name"New value: +"Stored file name (server-generated)" - added
Output schema / properties / result / items / properties / originalNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Original uploaded file name" +} - added
Output schema / properties / result / items / properties / pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Server-side storage path" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Asset file type, e.g. \"animations\"" +}
- Changed
protect_list_fobs4 fields changed- added
Output schema / properties / result / items / properties / awayStateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Away state, e.g. \"ONLINE\"" +} - added
Output schema / properties / result / items / properties / buttonLabelsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Button label preset, e.g. \"securityActions\"" +} - added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: buttons[])" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_lights8 fields changed- added
Output schema / properties / result / items / properties / cameraAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paired camera ID" +} - added
Output schema / properties / result / items / properties / isDarkAdded value: +{ + "description": "Whether it is currently dark out (boolean)" +} - added
Output schema / properties / result / items / properties / isLightForceEnabledAdded value: +{ + "description": "Main LED force-enabled (boolean)" +} - added
Output schema / properties / result / items / properties / isLightOnAdded value: +{ + "description": "Whether the light is currently on (boolean)" +} - added
Output schema / properties / result / items / properties / isPirMotionDetectedAdded value: +{ + "description": "PIR motion currently detected (boolean)" +} - added
Output schema / properties / result / items / properties / lastMotionAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / lightDeviceSettingsAdded value: +{ + "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)" +} - added
Output schema / properties / result / items / properties / lightModeSettingsAdded value: +{ + "description": "Activation settings (object: mode, enableAt)" +}
- Changed
protect_list_link_stations4 fields changed- added
Output schema / properties / result / items / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / result / items / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / result / items / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_list_nvrs2 fields changed- added
Output schema / properties / armMode / properties / armProfileIdAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Active arm profile ID (present when arming/armed)" +} - changed
Output schema / properties / armMode / properties / status / descriptionPrevious value: -"disabled | armed | ..."New value: +"disabled | arming | armed | ..."
- Changed
protect_list_relays4 fields changed- added
Output schema / properties / result / items / properties / inputsAdded value: +{ + "description": "Input channels (array of objects)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / outputsAdded value: +{ + "description": "Output channels (array of objects)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_sensors22 fields changed- added
Output schema / properties / result / items / properties / alarmSettingsAdded value: +{ + "description": "Alarm settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / alarmTriggeredAtAdded value: +{ + "description": "Last alarm timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / armProfileIdsAdded value: +{ + "description": "Arm profile IDs this sensor belongs to (array of strings)" +} - added
Output schema / properties / result / items / properties / batteryStatusAdded value: +{ + "description": "Battery status (object: percentage, isLow)" +} - added
Output schema / properties / result / items / properties / externalLeakDetectedAtAdded value: +{ + "description": "Last external-leak timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / glassBreakSettingsAdded value: +{ + "description": "Glass-break detection settings (object)" +} - added
Output schema / properties / result / items / properties / hasCustomSensitivityWhenArmedAdded value: +{ + "description": "Custom armed sensitivity enabled (boolean)" +} - added
Output schema / properties / result / items / properties / humiditySettingsAdded value: +{ + "description": "Humidity threshold settings (object)" +} - added
Output schema / properties / result / items / properties / isMotionDetectedAdded value: +{ + "description": "Motion currently detected (boolean)" +} - added
Output schema / properties / result / items / properties / isOpenedAdded value: +{ + "description": "Open/close contact state (boolean)" +} - added
Output schema / properties / result / items / properties / leakDetectedAtAdded value: +{ + "description": "Last leak timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / leakSettingsAdded value: +{ + "description": "Leak detection settings (object)" +} - added
Output schema / properties / result / items / properties / lightSettingsAdded value: +{ + "description": "Light threshold settings (object)" +} - added
Output schema / properties / result / items / properties / motionDetectedAtAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / motionSettingsAdded value: +{ + "description": "Motion detection settings (object)" +} - added
Output schema / properties / result / items / properties / mountTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Mount type, e.g. \"door\", \"leak\", \"garage\"" +} - added
Output schema / properties / result / items / properties / openStatusChangedAtAdded value: +{ + "description": "Open-status change timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / scheduleModeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Schedule mode: \"always\" | \"when_armed\"" +} - added
Output schema / properties / result / items / properties / statsAdded value: +{ + "description": "Environmental stats (object: light, humidity, temperature)" +} - added
Output schema / properties / result / items / properties / tamperingDetectedAtAdded value: +{ + "description": "Last tampering timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / temperatureSettingsAdded value: +{ + "description": "Temperature threshold settings (object)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object: signalState, batteryStatus, bridge)" +}
- Changed
protect_list_sirens5 fields changed- added
Output schema / properties / result / items / properties / connectionTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Connection type, e.g. \"lora\"" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / sirenStatusAdded value: +{ + "description": "Current siren status (object: isActive, activatedAt, duration)" +} - added
Output schema / properties / result / items / properties / volumeAdded value: +{ + "description": "Siren volume (number)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_speakers5 fields changed- added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: hasMic)" +} - added
Output schema / properties / result / items / properties / isMicEnabledAdded value: +{ + "description": "Microphone enabled (boolean)" +} - added
Output schema / properties / result / items / properties / micVolumeAdded value: +{ + "description": "Microphone volume (number)" +} - added
Output schema / properties / result / items / properties / speakerStateAdded value: +{ + "description": "Speaker state (object: status, mode)" +} - added
Output schema / properties / result / items / properties / volumeAdded value: +{ + "description": "Speaker volume (number)" +}
- Changed
protect_list_viewers2 fields changed- added
Output schema / properties / result / items / properties / liveviewAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Assigned live view ID, or null" +} - added
Output schema / properties / result / items / properties / streamLimitAdded value: +{ + "description": "Max concurrent streams (number)" +}
38 tool updates
v2.7.4- First observed
protect_get_alarm_hub - First observed
protect_get_bridge - First observed
protect_get_camera - First observed
protect_get_chime - First observed
protect_get_fob - First observed
protect_get_info - First observed
protect_get_light - First observed
protect_get_link_station - First observed
protect_get_liveview - First observed
protect_get_relay - First observed
protect_get_rtsp_streams - First observed
protect_get_sensor - First observed
protect_get_siren - First observed
protect_get_snapshot - First observed
protect_get_speaker - First observed
protect_get_ulp_user - First observed
protect_get_user - First observed
protect_get_viewer - First observed
protect_list_alarm_hubs - First observed
protect_list_arm_profiles - First observed
protect_list_bridges - First observed
protect_list_cameras - First observed
protect_list_chimes - First observed
protect_list_files - First observed
protect_list_fobs - First observed
protect_list_lights - First observed
protect_list_link_stations - First observed
protect_list_liveviews - First observed
protect_list_nvrs - First observed
protect_list_relays - First observed
protect_list_sensors - First observed
protect_list_sirens - First observed
protect_list_speakers - First observed
protect_list_ulp_users - First observed
protect_list_users - First observed
protect_list_viewers - First observed
protect_subscribe_devices - First observed
protect_subscribe_events
TDQS
Scored across 38 tools
Most tools are clearly separated by resource type (list vs get per device category), making selection straightforward. The primary confusion is between protect_list_link_stations and protect_list_alarm_hubs, which return the same field set with alarm hubs explicitly sharing the 'linkstation' modelKey, creating an ambiguous boundary.
All tool names follow a uniform protect_verb_noun convention with consistent snake_case, e.g., protect_list_cameras, protect_get_sensor, protect_subscribe_events. There are no mixed casing or irregular verb forms.
38 tools is substantial, and many get/list pairs (e.g., protect_get_light vs protect_list_lights) return identical field sets, making the get tools largely redundant and inflating the count. The breadth of device types justifies some size, but the repetitive pattern suggests the surface could be consolidated.
The server covers read operations and subscriptions well, but lacks write/update/delete capabilities for most resources (no liveview creation/update, no device setting changes, no user management). Critically, protect_get_rtsp_streams references protect_create_rtsp_stream, yet that tool is absent, leaving an explicit dead-end in the workflow.
Maintenance
Related MCP Connectors
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Universal AI API Orchestrator — 1,554 tools, 96 services. One install.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExposes the UniFi Network Integration API as MCP tools, dynamically loaded from JSON manifests, with read-only mode by default.MIT
- AlicenseBqualityDmaintenanceProvides 170+ tools to manage UniFi networks via the internal controller API, enabling AI assistants to perform full network management including clients, devices, WLANs, firewall, and more.64MIT
- AlicenseBqualityAmaintenanceExposes the Firewalla MSP API as tools for Claude Code and other MCP clients, enabling natural-language management of Firewalla boxes, alarms, rules, devices, flows, target lists, and trends with full read/write capabilities.19MIT
- AlicenseNot gradedqualityCmaintenanceEnables read-only querying of a UniFi fleet via the Site Manager API and per-console connector proxy, allowing users to list hosts, sites, devices, ISP metrics, and live network clients through Claude.Academic Free v1.1