Skip to main content
Glama
owine

UniFi Protect MCP

by owine

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 engines in package.json

  • A 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 user

Use -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 build

This 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 user

Environment Variables

Variable

Required

Default

Description

UNIFI_PROTECT_HOST

Yes

—

IP or hostname of your UniFi Protect console

UNIFI_PROTECT_API_KEY

Yes

—

API key from Protect integration settings

UNIFI_PROTECT_VERIFY_SSL

No

true

Set to false to skip TLS certificate verification (needed for self-signed certs)

UNIFI_PROTECT_READ_ONLY

No

true

Set to false to enable write/mutating tools (default is monitoring-only mode)

UNIFI_PROTECT_CONSOLE_ID

No

—

Cloud Connector console ID. Only used when UNIFI_PROTECT_HOST is api.ui.com; ignored (with a warning on stderr) otherwise

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 readOnlyHint and destructiveHint so 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=false to enable write/mutating tools

  • Confirmation parameter — The most dangerous tools (protect_disable_mic, protect_trigger_alarm_webhook) require an explicit confirm: true parameter that must be present for the call to succeed

  • Dry-run support — All write tools (except those with confirm) accept an optional dryRun: true parameter that returns a preview of what would happen without making any changes

Tools (73 total)

System (2)

Tool

Description

protect_get_info

Get system information and version details

protect_list_nvrs

List all NVR devices

Subscriptions (2)

Tool

Description

protect_subscribe_devices

Subscribe via WebSocket to device state updates

protect_subscribe_events

Subscribe via WebSocket to event notifications

Cameras (12)

Tool

Description

protect_list_cameras

List all cameras

protect_get_camera

Get camera details by ID

protect_update_camera

Update camera settings

protect_get_snapshot

Get a JPEG snapshot (returns image)

protect_create_rtsp_stream

Create an RTSPS stream session

protect_get_rtsp_streams

Get active RTSPS stream sessions

protect_delete_rtsp_stream

Stop and delete an active RTSPS stream

protect_create_talkback

Create a talkback (two-way audio) session

protect_disable_mic

IRREVERSIBLE: Permanently disable camera microphone

protect_start_ptz_patrol

Start PTZ patrol at a given slot

protect_stop_ptz_patrol

Stop PTZ patrol

protect_goto_ptz_preset

Move PTZ to a preset position

Lights (3)

Tool

Description

protect_list_lights

List all lights

protect_get_light

Get light details by ID

protect_update_light

Update light settings

Sensors (3)

Tool

Description

protect_list_sensors

List all sensors

protect_get_sensor

Get sensor details by ID

protect_update_sensor

Update sensor settings

Chimes (3)

Tool

Description

protect_list_chimes

List all chimes

protect_get_chime

Get chime details by ID

protect_update_chime

Update chime settings

Viewers (3)

Tool

Description

protect_list_viewers

List all viewers

protect_get_viewer

Get viewer details by ID

protect_update_viewer

Update viewer settings

Sirens (6)

Tool

Description

protect_list_sirens

List all sirens

protect_get_siren

Get siren details by ID

protect_update_siren

Update siren settings (name, volume, LED)

protect_play_siren

Activate the siren alarm for a given duration (5/10/20/30s)

protect_stop_siren

Stop an active siren

protect_test_siren_sound

Test the siren sound for 5 seconds at a given volume

Fobs (3)

Tool

Description

protect_list_fobs

List all key fobs

protect_get_fob

Get fob details by ID

protect_update_fob

Update fob settings

Relays (4)

Tool

Description

protect_list_relays

List all relays

protect_get_relay

Get relay details by ID

protect_update_relay

Update relay settings

protect_activate_relay_output

Set/toggle a relay output channel, with optional pulse duration

Speakers (4)

Tool

Description

protect_list_speakers

List all speakers

protect_get_speaker

Get speaker details by ID

protect_update_speaker

Update speaker settings (volume, mic)

protect_test_speaker_sound

Test the speaker sound at a given volume

Bridges (3)

Tool

Description

protect_list_bridges

List all bridges

protect_get_bridge

Get bridge details by ID

protect_update_bridge

Update bridge settings

Tool

Description

protect_list_link_stations

List all link stations (non-alarm-hub gateways)

protect_get_link_station

Get link station details by ID

protect_update_link_station

Update link station settings

Alarm Hubs (4)

Tool

Description

protect_list_alarm_hubs

List all alarm hubs

protect_get_alarm_hub

Get alarm hub details by ID

protect_update_alarm_hub

Update alarm hub settings

protect_trigger_alarm_hub_output

Trigger an alarm hub output channel (sirens, lights, etc.)

Arm Profiles (7) — local alarm manager

Tool

Description

protect_list_arm_profiles

List all arm profiles

protect_create_arm_profile

Create a new arm profile

protect_set_current_arm_profile

Set the active profile used when arming

protect_update_arm_profile

Update an arm profile

protect_delete_arm_profile

DESTRUCTIVE: Delete an arm profile by ID

protect_enable_arm_alarm

Arm the alarm using the current profile

protect_disable_arm_alarm

Disarm the alarm

Live Views (4)

Tool

Description

protect_list_liveviews

List all live views

protect_get_liveview

Get live view details by ID

protect_create_liveview

Create a new live view

protect_update_liveview

Update a live view

Alarm & Files (3)

Tool

Description

protect_trigger_alarm_webhook

Trigger an alarm webhook (fires external alarm action)

protect_list_files

List files by type

protect_upload_file

Upload a file (base64-encoded)

Users (4)

Tool

Description

protect_list_users

List Protect users (filtered by access permissions)

protect_get_user

Get a Protect user by ID

protect_list_ulp_users

List UniFi Identity (ULP) users with enrolled credentials

protect_get_ulp_user

Get a UniFi Identity user by ID

Point of Sale (1)

Tool

Description

protect_ingest_pos_transaction

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 coverage

Git 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!: ... or BREAKING 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 tools
protect_get_alarm_hubA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAlarm hub ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
alarmHubNoAlarm hub status (object: armed, battery, connector, cover, output, input, …)
modelKeyNoResource kind
lastEventNoLast event timestamp in epoch ms (number)
isAlarmHubNoWhether this device is an alarm hub (boolean)
ledSettingsNoLED settings (object: isEnabled)
threadStateNoThread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)
deviceTamperStatusNoTamper status, added in 7.3.x, e.g. "tampered"

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_bridgeA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesBridge ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
clientsNoConnected client MACs (array of strings)
modelKeyNoResource kind
platformNoHardware platform, e.g. "mt7621"
maxClientsNoMax client capacity (number)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_cameraA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCamera ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoCamera ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoCamera name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
hdrTypeNoHDR mode, e.g. "auto"
modelKeyNoAlways "camera"
micVolumeNoMicrophone volume 0-100 (number)
videoModeNoVideo mode, e.g. "default"
lcdMessageNo
ledSettingsNo
osdSettingsNo
featureFlagsNo
isMicEnabledNoMicrophone enabled (boolean)
activePatrolSlotNoActive PTZ patrol slot, or null (number|null)
hasPackageCameraNoHas a secondary package camera (boolean)
smartDetectSettingsNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_chimeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesChime ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
modelKeyNoResource kind
cameraIdsNoPaired camera IDs (array of strings)
ringSettingsNoPer-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_fobA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesFob ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
modelKeyNoResource kind
awayStateNoAway state, e.g. "ONLINE"
hasKeypadNoWhether this fob has a keypad, added in 7.3.x (boolean)
buttonLabelsNoButton label preset, e.g. "securityActions"
featureFlagsNoFeature flags (object: buttons[])
keypadSettingsNoKeypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)
armControlSettingsNoArm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)
wirelessConnectionStateNoWireless link state (object)

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_infoA
Read-only

Get UniFi Protect application information. Returns: applicationVersion (string).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
applicationVersionNoCurrent Protect application version

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_lightA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLight ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
cameraNoPaired camera ID
isDarkNoWhether it is currently dark out (boolean)
modelKeyNoResource kind
isLightOnNoWhether the light is currently on (boolean)
lastMotionNoLast motion timestamp in epoch ms (number)
lightModeSettingsNoActivation settings (object: mode, enableAt)
isLightForceEnabledNoMain LED force-enabled (boolean)
isPirMotionDetectedNoPIR motion currently detected (boolean)
lightDeviceSettingsNoHardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_liveviewA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLiveview ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoLiveview ID
nameNoLiveview name
ownerNoOwning user ID
slotsNoCamera slots
layoutNoGrid layout / slot count (number)
isGlobalNoWhether shared across all users (boolean)
modelKeyNoAlways "liveview"
isDefaultNoWhether this is the default liveview (boolean)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_relayA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesRelay ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
inputsNoInput channels (array of objects)
outputsNoOutput channels (array of objects)
modelKeyNoResource kind
ledSettingsNoLED settings (object: isEnabled)
wirelessConnectionStateNoWireless link state (object)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_streamsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCamera ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
lowNoRTSPS URL for the low-quality stream
highNoRTSPS URL for the high-quality stream
mediumNoRTSPS URL for the medium-quality stream
packageNoRTSPS URL for the package-camera stream

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_sensorA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSensor ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
statsNoEnvironmental stats (object: light, humidity, temperature)
isOpenedNoOpen/close contact state (boolean)
modelKeyNoResource kind
mountTypeNoMount type, e.g. "door", "leak", "garage"
featureFlagsNoSensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })
leakSettingsNoLeak detection settings (object)
scheduleModeNoSchedule mode: "always" | "when_armed"
alarmSettingsNoAlarm settings (object: isEnabled)
armProfileIdsNoArm profile IDs this sensor belongs to (array of strings)
batteryStatusNoBattery status (object: percentage, isLow)
lightSettingsNoLight threshold settings (object)
leakDetectedAtNoLast leak timestamp in epoch ms (number)
motionSettingsNoMotion detection settings (object)
alarmTriggeredAtNoLast alarm timestamp in epoch ms (number)
humiditySettingsNoHumidity threshold settings (object)
isMotionDetectedNoMotion currently detected (boolean)
motionDetectedAtNoLast motion timestamp in epoch ms (number)
glassBreakSettingsNoGlass-break detection settings (object)
openStatusChangedAtNoOpen-status change timestamp in epoch ms (number)
tamperingDetectedAtNoLast tampering timestamp in epoch ms (number)
temperatureSettingsNoTemperature threshold settings (object)
externalLeakDetectedAtNoLast external-leak timestamp in epoch ms (number)
wirelessConnectionStateNoWireless link state (object: signalState, batteryStatus, bridge)
hasCustomSensitivityWhenArmedNoCustom armed sensitivity enabled (boolean)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_sirenA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSiren ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
volumeNoSiren volume (number)
modelKeyNoResource kind
ledSettingsNoLED settings (object: isEnabled)
sirenStatusNoCurrent siren status (object: isActive, activatedAt, duration)
connectionTypeNoConnection type, e.g. "lora"
wirelessConnectionStateNoWireless link state (object)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_snapshotA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCamera ID
channelNoCamera channel to capture. Use "package" for cameras with hasPackageCamera=true (defaults to main)
highQualityNoIf true, request a high-quality snapshot

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_speakerA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesSpeaker ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
volumeNoSpeaker volume (number)
modelKeyNoResource kind
micVolumeNoMicrophone volume (number)
featureFlagsNoFeature flags (object: hasMic)
isMicEnabledNoMicrophone enabled (boolean)
speakerStateNoSpeaker state (object: status, mode)

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_userA
Read-only

Get details for a specific UniFi Identity (ULP) user by ID. Returns: id, modelKey, firstName, lastName, fullName, email, status.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesULP user ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoULP user UUID
emailNoEmail address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)
statusNoAccount status, e.g. ACTIVE
fullNameNoFull name
lastNameNoLast name
modelKeyNoAlways "ulpUser"
firstNameNoFirst name

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_userB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUser ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoUser ID
nameNoDisplay name
emailNoEmail address
lastNameNoLast name
modelKeyNoAlways "user"
firstNameNoFirst name
ucoreUserIdNoUniFi Core user UUID

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_viewerA
Read-only

Get full details for a specific viewer by ID. Returns: id, modelKey, name, mac, state, type, guid, liveview, streamLimit (7.3.47 docs).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesViewer ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoDevice ID
macNoMAC address
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoDevice name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
stateNoCONNECTED | DISCONNECTED | ...
liveviewNoAssigned live view ID, or null
modelKeyNoResource kind
streamLimitNoMax concurrent streams (number)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_hubsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_profilesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_bridgesA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_camerasA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_chimesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_filesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileTypeYesFile type to list (only 'animations' is currently supported)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_fobsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_lightsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_liveviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_nvrsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoNVR ID
macNoMAC address, added in 7.3.x
guidNoHardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.
nameNoNVR name
typeNoHardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO"
armModeNo
modelKeyNoAlways "nvr"
doorbellSettingsNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_relaysA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_sensorsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_sirensA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_speakersA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_usersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_usersA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_viewersA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesArray of items returned by the list endpoint

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_devicesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
durationNoSeconds to listen (1-30, default 5)

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoConnection error, if any
durationNoActual listen duration in seconds (number)
messagesNoCaptured WebSocket messages (add/update/remove or event envelopes)

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_eventsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
durationNoSeconds to listen (1-30, default 5)

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoConnection error, if any
durationNoActual listen duration in seconds (number)
messagesNoCaptured WebSocket messages (add/update/remove or event envelopes)

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 27 tool updatesv2.13.0
    • Changedprotect_get_alarm_hub4 fields changed
      • addedOutput schema / properties / deviceTamperStatus
        Added value: +{
        +  "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / threadState
        Added value: +{
        +  "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)"
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_bridge2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_camera2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_chime2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_fob5 fields changed
      • addedOutput schema / properties / armControlSettings
        Added value: +{
        +  "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)"
        +}
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / hasKeypad
        Added value: +{
        +  "description": "Whether this fob has a keypad, added in 7.3.x (boolean)"
        +}
      • addedOutput schema / properties / keypadSettings
        Added value: +{
        +  "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)"
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_light2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_link_station4 fields changed
      • addedOutput schema / properties / deviceTamperStatus
        Added value: +{
        +  "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / threadState
        Added value: +{
        +  "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)"
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_relay2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_sensor3 fields changed
      • addedOutput schema / properties / featureFlags
        Added value: +{
        +  "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })"
        +}
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_siren2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_speaker2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_ulp_user1 field changed
      • addedOutput schema / properties / email
        Added value: +{
        +  "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_get_viewer2 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_alarm_hubs4 fields changed
      • addedOutput schema / properties / result / items / properties / deviceTamperStatus
        Added value: +{
        +  "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / threadState
        Added value: +{
        +  "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)"
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_bridges2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_cameras2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_chimes2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_fobs5 fields changed
      • addedOutput schema / properties / result / items / properties / armControlSettings
        Added value: +{
        +  "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)"
        +}
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / hasKeypad
        Added value: +{
        +  "description": "Whether this fob has a keypad, added in 7.3.x (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / keypadSettings
        Added value: +{
        +  "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)"
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_lights2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_link_stations4 fields changed
      • addedOutput schema / properties / result / items / properties / deviceTamperStatus
        Added value: +{
        +  "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / threadState
        Added value: +{
        +  "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)"
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_nvrs3 fields changed
      • addedOutput schema / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / mac
        Added value: +{
        +  "description": "MAC address, added in 7.3.x",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_relays2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_sensors3 fields changed
      • addedOutput schema / properties / result / items / properties / featureFlags
        Added value: +{
        +  "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })"
        +}
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_sirens2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_speakers2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_ulp_users1 field changed
      • addedOutput schema / properties / result / items / properties / email
        Added value: +{
        +  "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedprotect_list_viewers2 fields changed
      • addedOutput schema / properties / result / items / properties / guid
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  2. 37 tool updatesv2.11.5
    • Changedprotect_get_alarm_hub8 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_bridge10 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / platform / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / platform / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_camera18 fields changed
      • removedOutput schema / properties / hdrType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / hdrType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / lcdMessage / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / lcdMessage / properties / text / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / lcdMessage / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / lcdMessage / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / osdSettings / properties / overlayLocation / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / osdSettings / properties / overlayLocation / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / videoMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / videoMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_chime8 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_fob12 fields changed
      • removedOutput schema / properties / awayState / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / awayState / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / buttonLabels / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / buttonLabels / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_info2 fields changed
      • removedOutput schema / properties / applicationVersion / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / applicationVersion / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_light10 fields changed
      • removedOutput schema / properties / camera / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / camera / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_link_station8 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_liveview8 fields changed
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / owner / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / owner / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / slots / items / properties / cycleMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / slots / items / properties / cycleMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_relay8 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_rtsp_streams8 fields changed
      • removedOutput schema / properties / high / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / high / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / low / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / low / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / medium / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / medium / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / package / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / package / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_sensor12 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mountType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mountType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / scheduleMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / scheduleMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_siren10 fields changed
      • removedOutput schema / properties / connectionType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / connectionType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_speaker8 fields changed
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_ulp_user10 fields changed
      • removedOutput schema / properties / firstName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / firstName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / fullName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / fullName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / lastName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / lastName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_user12 fields changed
      • removedOutput schema / properties / email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / email / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / firstName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / firstName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / lastName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / lastName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / ucoreUserId / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / ucoreUserId / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_get_viewer10 fields changed
      • removedOutput schema / properties / liveview / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / liveview / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_alarm_hubs8 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_arm_profiles4 fields changed
      • removedOutput schema / properties / result / items / properties / creator / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / creator / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_bridges10 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / platform / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / platform / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_cameras18 fields changed
      • removedOutput schema / properties / result / items / properties / hdrType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / hdrType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / lcdMessage / properties / text / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / lcdMessage / properties / text / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / lcdMessage / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / lcdMessage / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / osdSettings / properties / overlayLocation / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / osdSettings / properties / overlayLocation / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / videoMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / videoMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_chimes8 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_files8 fields changed
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / originalName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / originalName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / path / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_fobs12 fields changed
      • removedOutput schema / properties / result / items / properties / awayState / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / awayState / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / buttonLabels / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / buttonLabels / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_lights10 fields changed
      • removedOutput schema / properties / result / items / properties / camera / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / camera / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_link_stations8 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_liveviews8 fields changed
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / owner / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / owner / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / slots / items / properties / cycleMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / slots / items / properties / cycleMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_nvrs10 fields changed
      • removedOutput schema / properties / armMode / properties / armProfileId / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / armMode / properties / armProfileId / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / armMode / properties / status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / armMode / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / doorbellSettings / properties / defaultMessageText / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / doorbellSettings / properties / defaultMessageText / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_relays8 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_sensors12 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mountType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mountType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / scheduleMode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / scheduleMode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_sirens10 fields changed
      • removedOutput schema / properties / result / items / properties / connectionType / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / connectionType / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_speakers8 fields changed
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_ulp_users10 fields changed
      • removedOutput schema / properties / result / items / properties / firstName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / firstName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / fullName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / fullName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / lastName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / lastName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_users12 fields changed
      • removedOutput schema / properties / result / items / properties / email / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / email / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / firstName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / firstName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / lastName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / lastName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / ucoreUserId / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / ucoreUserId / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_list_viewers10 fields changed
      • removedOutput schema / properties / result / items / properties / liveview / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / liveview / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / mac / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / mac / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / modelKey / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / modelKey / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_subscribe_devices2 fields changed
      • removedOutput schema / properties / error / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / error / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedprotect_subscribe_events2 fields changed
      • removedOutput schema / properties / error / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / error / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  3. 11 tool updatesv2.10.0
    • Addedprotect_get_fob
    • Addedprotect_get_info
    • Addedprotect_get_link_station
    • Addedprotect_get_rtsp_streams
    • Addedprotect_list_arm_profiles
    • Addedprotect_list_chimes
    • Addedprotect_list_fobs
    • Addedprotect_list_link_stations
    • Addedprotect_list_nvrs
    • Addedprotect_list_speakers
    • Addedprotect_list_viewers
  4. 11 tool updatesv2.9.0
    • Removedprotect_get_fob
    • Removedprotect_get_info
    • Removedprotect_get_link_station
    • Removedprotect_get_rtsp_streams
    • Removedprotect_list_arm_profiles
    • Removedprotect_list_chimes
    • Removedprotect_list_fobs
    • Removedprotect_list_link_stations
    • Removedprotect_list_nvrs
    • Removedprotect_list_speakers
    • Removedprotect_list_viewers
  5. 28 tool updatesv2.7.5
    • Changedprotect_get_alarm_hub4 fields changed
      • addedOutput schema / properties / alarmHub
        Added value: +{
        +  "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)"
        +}
      • addedOutput schema / properties / isAlarmHub
        Added value: +{
        +  "description": "Whether this device is an alarm hub (boolean)"
        +}
      • addedOutput schema / properties / lastEvent
        Added value: +{
        +  "description": "Last event timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
    • Changedprotect_get_bridge3 fields changed
      • addedOutput schema / properties / clients
        Added value: +{
        +  "description": "Connected client MACs (array of strings)"
        +}
      • addedOutput schema / properties / maxClients
        Added value: +{
        +  "description": "Max client capacity (number)"
        +}
      • addedOutput schema / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Hardware platform, e.g. \"mt7621\""
        +}
    • Changedprotect_get_camera4 fields changed
      • addedOutput schema / properties / lcdMessage / additionalProperties
        Added value: +{}
      • removedOutput schema / properties / lcdMessage / description
        Removed value: -"Doorbell LCD message (object; often empty {})"
      • addedOutput schema / properties / lcdMessage / properties
        Added 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\""
        +  }
        +}
      • addedOutput schema / properties / lcdMessage / type
        Added value: +"object"
    • Changedprotect_get_chime2 fields changed
      • addedOutput schema / properties / cameraIds
        Added value: +{
        +  "description": "Paired camera IDs (array of strings)"
        +}
      • addedOutput schema / properties / ringSettings
        Added value: +{
        +  "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)"
        +}
    • Changedprotect_get_fob4 fields changed
      • addedOutput schema / properties / awayState
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Away state, e.g. \"ONLINE\""
        +}
      • addedOutput schema / properties / buttonLabels
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Button label preset, e.g. \"securityActions\""
        +}
      • addedOutput schema / properties / featureFlags
        Added value: +{
        +  "description": "Feature flags (object: buttons[])"
        +}
      • addedOutput schema / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_get_light8 fields changed
      • addedOutput schema / properties / camera
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Paired camera ID"
        +}
      • addedOutput schema / properties / isDark
        Added value: +{
        +  "description": "Whether it is currently dark out (boolean)"
        +}
      • addedOutput schema / properties / isLightForceEnabled
        Added value: +{
        +  "description": "Main LED force-enabled (boolean)"
        +}
      • addedOutput schema / properties / isLightOn
        Added value: +{
        +  "description": "Whether the light is currently on (boolean)"
        +}
      • addedOutput schema / properties / isPirMotionDetected
        Added value: +{
        +  "description": "PIR motion currently detected (boolean)"
        +}
      • addedOutput schema / properties / lastMotion
        Added value: +{
        +  "description": "Last motion timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / lightDeviceSettings
        Added value: +{
        +  "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)"
        +}
      • addedOutput schema / properties / lightModeSettings
        Added value: +{
        +  "description": "Activation settings (object: mode, enableAt)"
        +}
    • Changedprotect_get_link_station4 fields changed
      • addedOutput schema / properties / alarmHub
        Added value: +{
        +  "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)"
        +}
      • addedOutput schema / properties / isAlarmHub
        Added value: +{
        +  "description": "Whether this device is an alarm hub (boolean)"
        +}
      • addedOutput schema / properties / lastEvent
        Added value: +{
        +  "description": "Last event timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
    • Changedprotect_get_relay4 fields changed
      • addedOutput schema / properties / inputs
        Added value: +{
        +  "description": "Input channels (array of objects)"
        +}
      • addedOutput schema / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / outputs
        Added value: +{
        +  "description": "Output channels (array of objects)"
        +}
      • addedOutput schema / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_get_sensor22 fields changed
      • addedOutput schema / properties / alarmSettings
        Added value: +{
        +  "description": "Alarm settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / alarmTriggeredAt
        Added value: +{
        +  "description": "Last alarm timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / armProfileIds
        Added value: +{
        +  "description": "Arm profile IDs this sensor belongs to (array of strings)"
        +}
      • addedOutput schema / properties / batteryStatus
        Added value: +{
        +  "description": "Battery status (object: percentage, isLow)"
        +}
      • addedOutput schema / properties / externalLeakDetectedAt
        Added value: +{
        +  "description": "Last external-leak timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / glassBreakSettings
        Added value: +{
        +  "description": "Glass-break detection settings (object)"
        +}
      • addedOutput schema / properties / hasCustomSensitivityWhenArmed
        Added value: +{
        +  "description": "Custom armed sensitivity enabled (boolean)"
        +}
      • addedOutput schema / properties / humiditySettings
        Added value: +{
        +  "description": "Humidity threshold settings (object)"
        +}
      • addedOutput schema / properties / isMotionDetected
        Added value: +{
        +  "description": "Motion currently detected (boolean)"
        +}
      • addedOutput schema / properties / isOpened
        Added value: +{
        +  "description": "Open/close contact state (boolean)"
        +}
      • addedOutput schema / properties / leakDetectedAt
        Added value: +{
        +  "description": "Last leak timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / leakSettings
        Added value: +{
        +  "description": "Leak detection settings (object)"
        +}
      • addedOutput schema / properties / lightSettings
        Added value: +{
        +  "description": "Light threshold settings (object)"
        +}
      • addedOutput schema / properties / motionDetectedAt
        Added value: +{
        +  "description": "Last motion timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / motionSettings
        Added value: +{
        +  "description": "Motion detection settings (object)"
        +}
      • addedOutput schema / properties / mountType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Mount type, e.g. \"door\", \"leak\", \"garage\""
        +}
      • addedOutput schema / properties / openStatusChangedAt
        Added value: +{
        +  "description": "Open-status change timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / scheduleMode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Schedule mode: \"always\" | \"when_armed\""
        +}
      • addedOutput schema / properties / stats
        Added value: +{
        +  "description": "Environmental stats (object: light, humidity, temperature)"
        +}
      • addedOutput schema / properties / tamperingDetectedAt
        Added value: +{
        +  "description": "Last tampering timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / temperatureSettings
        Added value: +{
        +  "description": "Temperature threshold settings (object)"
        +}
      • addedOutput schema / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object: signalState, batteryStatus, bridge)"
        +}
    • Changedprotect_get_siren5 fields changed
      • addedOutput schema / properties / connectionType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Connection type, e.g. \"lora\""
        +}
      • addedOutput schema / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / sirenStatus
        Added value: +{
        +  "description": "Current siren status (object: isActive, activatedAt, duration)"
        +}
      • addedOutput schema / properties / volume
        Added value: +{
        +  "description": "Siren volume (number)"
        +}
      • addedOutput schema / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_get_snapshot1 field changed
      • addedInput schema / properties / channel
        Added value: +{
        +  "description": "Camera channel to capture. Use \"package\" for cameras with hasPackageCamera=true (defaults to main)",
        +  "enum": [
        +    "main",
        +    "package"
        +  ],
        +  "type": "string"
        +}
    • Changedprotect_get_speaker5 fields changed
      • addedOutput schema / properties / featureFlags
        Added value: +{
        +  "description": "Feature flags (object: hasMic)"
        +}
      • addedOutput schema / properties / isMicEnabled
        Added value: +{
        +  "description": "Microphone enabled (boolean)"
        +}
      • addedOutput schema / properties / micVolume
        Added value: +{
        +  "description": "Microphone volume (number)"
        +}
      • addedOutput schema / properties / speakerState
        Added value: +{
        +  "description": "Speaker state (object: status, mode)"
        +}
      • addedOutput schema / properties / volume
        Added value: +{
        +  "description": "Speaker volume (number)"
        +}
    • Changedprotect_get_viewer2 fields changed
      • addedOutput schema / properties / liveview
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Assigned live view ID, or null"
        +}
      • addedOutput schema / properties / streamLimit
        Added value: +{
        +  "description": "Max concurrent streams (number)"
        +}
    • Changedprotect_list_alarm_hubs4 fields changed
      • addedOutput schema / properties / result / items / properties / alarmHub
        Added value: +{
        +  "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)"
        +}
      • addedOutput schema / properties / result / items / properties / isAlarmHub
        Added value: +{
        +  "description": "Whether this device is an alarm hub (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / lastEvent
        Added value: +{
        +  "description": "Last event timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
    • Changedprotect_list_arm_profiles8 fields changed
      • addedOutput schema / properties / result / items / properties / activationDelay
        Added value: +{
        +  "description": "Activation delay in ms: 0 | 60000 | 300000 | 600000 (number)"
        +}
      • addedOutput schema / properties / result / items / properties / automations
        Added value: +{
        +  "description": "Associated automation IDs (array of strings)"
        +}
      • addedOutput schema / properties / result / items / properties / createdAt
        Added value: +{
        +  "description": "Creation timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / creator
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "ID of the user who created the profile"
        +}
      • removedOutput schema / properties / result / items / properties / modelKey
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Resource kind"
        -}
      • addedOutput schema / properties / result / items / properties / recordEverything
        Added value: +{
        +  "description": "Record everything while active (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / schedules
        Added value: +{
        +  "description": "Arm schedules (array of objects)"
        +}
      • addedOutput schema / properties / result / items / properties / updatedAt
        Added value: +{
        +  "description": "Last update timestamp in epoch ms (number)"
        +}
    • Changedprotect_list_bridges3 fields changed
      • addedOutput schema / properties / result / items / properties / clients
        Added value: +{
        +  "description": "Connected client MACs (array of strings)"
        +}
      • addedOutput schema / properties / result / items / properties / maxClients
        Added value: +{
        +  "description": "Max client capacity (number)"
        +}
      • addedOutput schema / properties / result / items / properties / platform
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Hardware platform, e.g. \"mt7621\""
        +}
    • Changedprotect_list_cameras4 fields changed
      • addedOutput schema / properties / result / items / properties / lcdMessage / additionalProperties
        Added value: +{}
      • removedOutput schema / properties / result / items / properties / lcdMessage / description
        Removed value: -"Doorbell LCD message (object; often empty {})"
      • addedOutput schema / properties / result / items / properties / lcdMessage / properties
        Added 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\""
        +  }
        +}
      • addedOutput schema / properties / result / items / properties / lcdMessage / type
        Added value: +"object"
    • Changedprotect_list_chimes2 fields changed
      • addedOutput schema / properties / result / items / properties / cameraIds
        Added value: +{
        +  "description": "Paired camera IDs (array of strings)"
        +}
      • addedOutput schema / properties / result / items / properties / ringSettings
        Added value: +{
        +  "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)"
        +}
    • Changedprotect_list_files6 fields changed
      • removedOutput schema / properties / result / items / properties / id
        Removed value: -{
        -  "description": "File ID",
        -  "type": "string"
        -}
      • removedOutput schema / properties / result / items / properties / modelKey
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Resource kind"
        -}
      • changedOutput schema / properties / result / items / properties / name / description
        Previous value: -"File name"New value: +"Stored file name (server-generated)"
      • addedOutput schema / properties / result / items / properties / originalName
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Original uploaded file name"
        +}
      • addedOutput schema / properties / result / items / properties / path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Server-side storage path"
        +}
      • addedOutput schema / properties / result / items / properties / type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Asset file type, e.g. \"animations\""
        +}
    • Changedprotect_list_fobs4 fields changed
      • addedOutput schema / properties / result / items / properties / awayState
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Away state, e.g. \"ONLINE\""
        +}
      • addedOutput schema / properties / result / items / properties / buttonLabels
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Button label preset, e.g. \"securityActions\""
        +}
      • addedOutput schema / properties / result / items / properties / featureFlags
        Added value: +{
        +  "description": "Feature flags (object: buttons[])"
        +}
      • addedOutput schema / properties / result / items / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_list_lights8 fields changed
      • addedOutput schema / properties / result / items / properties / camera
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Paired camera ID"
        +}
      • addedOutput schema / properties / result / items / properties / isDark
        Added value: +{
        +  "description": "Whether it is currently dark out (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / isLightForceEnabled
        Added value: +{
        +  "description": "Main LED force-enabled (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / isLightOn
        Added value: +{
        +  "description": "Whether the light is currently on (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / isPirMotionDetected
        Added value: +{
        +  "description": "PIR motion currently detected (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / lastMotion
        Added value: +{
        +  "description": "Last motion timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / lightDeviceSettings
        Added value: +{
        +  "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)"
        +}
      • addedOutput schema / properties / result / items / properties / lightModeSettings
        Added value: +{
        +  "description": "Activation settings (object: mode, enableAt)"
        +}
    • Changedprotect_list_link_stations4 fields changed
      • addedOutput schema / properties / result / items / properties / alarmHub
        Added value: +{
        +  "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)"
        +}
      • addedOutput schema / properties / result / items / properties / isAlarmHub
        Added value: +{
        +  "description": "Whether this device is an alarm hub (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / lastEvent
        Added value: +{
        +  "description": "Last event timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
    • Changedprotect_list_nvrs2 fields changed
      • addedOutput schema / properties / armMode / properties / armProfileId
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Active arm profile ID (present when arming/armed)"
        +}
      • changedOutput schema / properties / armMode / properties / status / description
        Previous value: -"disabled | armed | ..."New value: +"disabled | arming | armed | ..."
    • Changedprotect_list_relays4 fields changed
      • addedOutput schema / properties / result / items / properties / inputs
        Added value: +{
        +  "description": "Input channels (array of objects)"
        +}
      • addedOutput schema / properties / result / items / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / result / items / properties / outputs
        Added value: +{
        +  "description": "Output channels (array of objects)"
        +}
      • addedOutput schema / properties / result / items / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_list_sensors22 fields changed
      • addedOutput schema / properties / result / items / properties / alarmSettings
        Added value: +{
        +  "description": "Alarm settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / result / items / properties / alarmTriggeredAt
        Added value: +{
        +  "description": "Last alarm timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / armProfileIds
        Added value: +{
        +  "description": "Arm profile IDs this sensor belongs to (array of strings)"
        +}
      • addedOutput schema / properties / result / items / properties / batteryStatus
        Added value: +{
        +  "description": "Battery status (object: percentage, isLow)"
        +}
      • addedOutput schema / properties / result / items / properties / externalLeakDetectedAt
        Added value: +{
        +  "description": "Last external-leak timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / glassBreakSettings
        Added value: +{
        +  "description": "Glass-break detection settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / hasCustomSensitivityWhenArmed
        Added value: +{
        +  "description": "Custom armed sensitivity enabled (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / humiditySettings
        Added value: +{
        +  "description": "Humidity threshold settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / isMotionDetected
        Added value: +{
        +  "description": "Motion currently detected (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / isOpened
        Added value: +{
        +  "description": "Open/close contact state (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / leakDetectedAt
        Added value: +{
        +  "description": "Last leak timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / leakSettings
        Added value: +{
        +  "description": "Leak detection settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / lightSettings
        Added value: +{
        +  "description": "Light threshold settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / motionDetectedAt
        Added value: +{
        +  "description": "Last motion timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / motionSettings
        Added value: +{
        +  "description": "Motion detection settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / mountType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Mount type, e.g. \"door\", \"leak\", \"garage\""
        +}
      • addedOutput schema / properties / result / items / properties / openStatusChangedAt
        Added value: +{
        +  "description": "Open-status change timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / scheduleMode
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Schedule mode: \"always\" | \"when_armed\""
        +}
      • addedOutput schema / properties / result / items / properties / stats
        Added value: +{
        +  "description": "Environmental stats (object: light, humidity, temperature)"
        +}
      • addedOutput schema / properties / result / items / properties / tamperingDetectedAt
        Added value: +{
        +  "description": "Last tampering timestamp in epoch ms (number)"
        +}
      • addedOutput schema / properties / result / items / properties / temperatureSettings
        Added value: +{
        +  "description": "Temperature threshold settings (object)"
        +}
      • addedOutput schema / properties / result / items / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object: signalState, batteryStatus, bridge)"
        +}
    • Changedprotect_list_sirens5 fields changed
      • addedOutput schema / properties / result / items / properties / connectionType
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Connection type, e.g. \"lora\""
        +}
      • addedOutput schema / properties / result / items / properties / ledSettings
        Added value: +{
        +  "description": "LED settings (object: isEnabled)"
        +}
      • addedOutput schema / properties / result / items / properties / sirenStatus
        Added value: +{
        +  "description": "Current siren status (object: isActive, activatedAt, duration)"
        +}
      • addedOutput schema / properties / result / items / properties / volume
        Added value: +{
        +  "description": "Siren volume (number)"
        +}
      • addedOutput schema / properties / result / items / properties / wirelessConnectionState
        Added value: +{
        +  "description": "Wireless link state (object)"
        +}
    • Changedprotect_list_speakers5 fields changed
      • addedOutput schema / properties / result / items / properties / featureFlags
        Added value: +{
        +  "description": "Feature flags (object: hasMic)"
        +}
      • addedOutput schema / properties / result / items / properties / isMicEnabled
        Added value: +{
        +  "description": "Microphone enabled (boolean)"
        +}
      • addedOutput schema / properties / result / items / properties / micVolume
        Added value: +{
        +  "description": "Microphone volume (number)"
        +}
      • addedOutput schema / properties / result / items / properties / speakerState
        Added value: +{
        +  "description": "Speaker state (object: status, mode)"
        +}
      • addedOutput schema / properties / result / items / properties / volume
        Added value: +{
        +  "description": "Speaker volume (number)"
        +}
    • Changedprotect_list_viewers2 fields changed
      • addedOutput schema / properties / result / items / properties / liveview
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Assigned live view ID, or null"
        +}
      • addedOutput schema / properties / result / items / properties / streamLimit
        Added value: +{
        +  "description": "Max concurrent streams (number)"
        +}
  6. 38 tool updatesv2.7.4
    • First observedprotect_get_alarm_hub
    • First observedprotect_get_bridge
    • First observedprotect_get_camera
    • First observedprotect_get_chime
    • First observedprotect_get_fob
    • First observedprotect_get_info
    • First observedprotect_get_light
    • First observedprotect_get_link_station
    • First observedprotect_get_liveview
    • First observedprotect_get_relay
    • First observedprotect_get_rtsp_streams
    • First observedprotect_get_sensor
    • First observedprotect_get_siren
    • First observedprotect_get_snapshot
    • First observedprotect_get_speaker
    • First observedprotect_get_ulp_user
    • First observedprotect_get_user
    • First observedprotect_get_viewer
    • First observedprotect_list_alarm_hubs
    • First observedprotect_list_arm_profiles
    • First observedprotect_list_bridges
    • First observedprotect_list_cameras
    • First observedprotect_list_chimes
    • First observedprotect_list_files
    • First observedprotect_list_fobs
    • First observedprotect_list_lights
    • First observedprotect_list_link_stations
    • First observedprotect_list_liveviews
    • First observedprotect_list_nvrs
    • First observedprotect_list_relays
    • First observedprotect_list_sensors
    • First observedprotect_list_sirens
    • First observedprotect_list_speakers
    • First observedprotect_list_ulp_users
    • First observedprotect_list_users
    • First observedprotect_list_viewers
    • First observedprotect_subscribe_devices
    • First observedprotect_subscribe_events

TDQS

A3.8/5.0

Scored across 38 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness2/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Exposes 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.
    19
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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