UniFi Protect MCP
This server exposes UniFi Protect’s Integration API as MCP tools, letting you monitor, inspect, and (when enabled) control Protect devices.
System & NVR: Get Protect application version, NVR/console info, and arm-mode status.
WebSocket subscriptions: Listen for device state changes and event notifications such as motion, ring, smart detect, and sensor alarms.
Cameras: List/get cameras, capture JPEG snapshots (including package cam), manage RTSPS streams, control PTZ patrols and presets, create talkback, and disable a camera mic.
Other devices: List/get/update lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, and alarm hubs.
Device actions: Play/stop sirens, test speaker sounds, activate relay outputs, trigger alarm-hub outputs, and trigger alarm webhooks.
Alarm manager: List/create/update/delete arm profiles, set the current profile, and arm/disarm the alarm.
Live views & files: List/get/create/update live views; list and upload animation files.
Users & POS: List/get Protect and UniFi Identity (ULP) users; ingest point-of-sale transactions as camera events.
Safety controls: Read-only mode is the default; write tools are opt-in via
UNIFI_PROTECT_READ_ONLY=false, support dry-run, and dangerous actions can require confirmation.
Provides tools for interacting with UniFi Protect, a video surveillance and device management platform by Ubiquiti. Enables listing and managing cameras, lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, alarm hubs, arm profiles, live views, files, users, and NVR status, as well as capturing snapshots, streaming RTSPS, and subscribing to device/event WebSocket updates.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@UniFi Protect MCPshow me a snapshot from the driveway camera"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
UniFi Protect MCP Server
An MCP (Model Context Protocol) server that exposes UniFi Protect's Integration REST API as tools for Claude Code and other MCP clients. Aligned with UniFi Protect API 7.3.70, with tools covering cameras, lights, sensors, chimes, viewers, sirens, fobs, relays, speakers, bridges, link stations, alarm hubs, arm profiles, live views, files, users, point-of-sale events, NVR status, and WebSocket subscriptions.
Prerequisites
Node.js 22.x (22.13 or newer) or 24.x — see
enginesinpackage.jsonA UniFi Protect system with the Integration API enabled
An API key generated from your UniFi Protect console (see Choosing an API key)
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"}}' -s userUse -s user for global availability across all projects, or -s project for the current project only.
A local console usually has a self-signed certificate, so the first call fails with a certificate error until you trust it: see Self-signed console certificates.
@latest runs the newest release every time the server starts, including a new major version. To take fixes but choose when to make breaking upgrades, pin the major version you have tested instead (@owine/unifi-protect-mcp@<major>).
From source
If you prefer to build locally:
git clone https://github.com/owine/unifi-protect-mcp.git
cd unifi-protect-mcp
corepack enable # provides pnpm at the version pinned in package.json
pnpm install
pnpm run buildThis project uses pnpm — npm install ignores pnpm-lock.yaml and may resolve different dependency versions than CI.
Then add to Claude Code:
claude mcp add-json unifi-protect '{"command":"node","args":["/path/to/unifi-protect-mcp/dist/index.js"],"env":{"UNIFI_PROTECT_HOST":"192.168.1.1","UNIFI_PROTECT_API_KEY":"your-api-key"}}' -s userEnvironment Variables
Variable | Required | Default | Description |
| Yes | — | IP or hostname of your UniFi Protect console, optionally with |
| Yes | — | API key from the console's integration settings (see Choosing an API key). Surrounding whitespace is trimmed; a key with a control character inside is refused at startup |
| No | — | Absolute path to a PEM file with the console's certificate, to verify a self-signed console without turning verification off (see below). Not allowed with |
| No |
| Set to |
| No |
| Set to |
| No | — | Cloud Connector console ID. Only used when |
The startup line in the MCP host's server log says whether the server is read-only or read-write. A configuration error names the variable at fault, and the server exits.
Self-signed console certificates
UniFi consoles ship with a self-signed certificate, so the first call to a local console usually fails with a certificate error. The safe fix is to trust that one certificate. Save it:
openssl s_client -connect 192.168.1.1:443 </dev/null 2>/dev/null | openssl x509 > ~/.config/unifi-protect-console.pemSet UNIFI_PROTECT_CA_CERT to the file's absolute path (for example /home/you/.config/unifi-protect-console.pem); MCP hosts do not expand ~ or $HOME in env. The server then accepts exactly that certificate, even though it is issued to a name like unifi.local and you connect by IP. Any other certificate must chain to the file and match the hostname. If the network between you and the console is not trusted, compare the fingerprint (openssl x509 -in <file> -noout -fingerprint -sha256) with the console's. If the console later generates a new certificate, save it again.
Setting UNIFI_PROTECT_VERIFY_SSL=false instead turns certificate checks off for this server's connections to the console, and only those (other TLS connections in the process are unaffected). Anyone who can intercept that traffic can then read the API key, so use it only on a network you trust.
Choosing an API key
Use the least-privileged key that works. Create the key from an admin account with no more access than you need. For the default read-only mode, that means an admin with view-only access to Protect; use a full-access admin only with
UNIFI_PROTECT_READ_ONLY=false.Prefer a local console key to a Site Manager key. A Site Manager key (Cloud Connector,
api.ui.com) reaches every console on the account and travels over the internet.
Manual Configuration
Alternatively, add to your ~/.claude.json under the top-level "mcpServers" key, or to Claude Desktop's claude_desktop_config.json the same way:
{
"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_CA_CERT": "/absolute/path/to/console.pem"
}
}
}
}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}.
TLS verification stays on: the server refuses to start with
UNIFI_PROTECT_VERIFY_SSL=false or UNIFI_PROTECT_CA_CERT for api.ui.com.
Ubiquiti's cloud has a publicly trusted certificate, and a pinned certificate
would replace the public certificate authorities for this server's connections.
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.
Upgrading to 3.0
3.0 puts more actions behind confirmation: physical outputs, disarming, anything that weakens alarm coverage, and live video and two-way audio. It also scopes TLS settings to this server, keeps every result within what one MCP message can carry, and makes cancellation stop the request to Protect.
If you use the server only through an LLM client (Claude Code, Claude Desktop, …), the model reads the new parameters from the tool schemas, so most setups need no change. Check three things:
Cloud Connector with verification off no longer starts. Unset
UNIFI_PROTECT_VERIFY_SSLwhenUNIFI_PROTECT_HOST=api.ui.com.Spellings of
UNIFI_PROTECT_READ_ONLY/UNIFI_PROTECT_VERIFY_SSLthat 2.x ignored now take effect (table below).Expect more approval prompts. Update tools and every confirm-gated tool are now annotated destructive (below).
Read on if you call tools from scripts or saved agent configurations, or keep allow-lists keyed on tool annotations.
Check your environment variables first
2.x treated only the exact string false as false. 3.0 also accepts 0, no and off, in any case, so a value that 2.x silently ignored now takes effect:
Setting | 2.x | 3.0 |
| Read-only | ⚠️ Write tools enabled |
| Certificate verified | Verification skipped |
| Verification skipped | ⚠️ Startup fails: "TLS verification cannot be disabled for api.ui.com". Unset |
| Turned verification off for every TLS connection in the process | Applies only to this server's connections to the console. Prefer the new |
| Sent as is; every call failed and the error quoted the key | Trimmed |
| Same | Startup fails with a message that does not repeat the key |
Any other unrecognized value keeps the safe default (read-only, verification on), as before. New: UNIFI_PROTECT_CA_CERT verifies a console's self-signed certificate (see Self-signed console certificates). Configuration errors now name the variable at fault, and the startup log line says whether the server is read-only or read-write.
Tool input changes (breaking)
Tool | 2.x | 3.0 |
| No confirmation | Requires |
| Omitting | Requires |
| Omitting | Requires |
| No confirmation | Requires |
| No confirmation | Requires |
| No confirmation | Requires |
| No confirmation | Requires |
| No confirmation | Requires |
| No confirmation | Requires |
Every tool that takes an ID | Any string | Only IDs as list and get tools return them: letters, digits, |
A call that leaves out state or enable, or passes a malformed ID, fails input validation. A call without confirm: true returns an error result ("This action requires confirmation: …"), so the agent can ask you and call again.
Toggling was removed because it is not safe to retry: a repeated toggle flips a gate or lock back to where it started. To act on the current state, read it first: each entry in outputs from protect_get_relay carries a state, and protect_get_alarm_hub reports alarmHub.output keyed by channel.
// 2.x: toggles output 0
{ "id": "<relay id>", "outputId": 0 }
// 3.0: explicit and safe to retry
{ "id": "<relay id>", "outputId": 0, "state": "on", "confirm": true }Relaxed: a dryRun: true preview never needs confirm. In 2.x, protect_disable_mic and protect_trigger_alarm_webhook rejected a dry run without confirm: true. Calls that send both still work.
New: every list tool except protect_list_nvrs takes optional limit and offset. A call with neither returns the whole list, as before.
Annotation changes (breaking for allow-lists)
protect_update_camera, everyprotect_update_<device>tool,protect_update_arm_profileandprotect_update_livevieware nowdestructiveHint: true, and so is every tool that takesconfirm(protect_stop_siren,protect_set_current_arm_profile,protect_create_rtsp_stream,protect_create_talkback,protect_disable_arm_alarm,protect_activate_relay_output,protect_trigger_alarm_hub_outputamong them). MCP clients that auto-approve non-destructive tools will now ask before running them, and allow-lists keyed on the annotation need updating.Every tool now has a
titleandopenWorldHint: false; the relay and alarm-hub output tools declareidempotentHint: true.
Stricter validation
UNIFI_PROTECT_HOSTis parsed as a URL authority. A pastedhttps://192.168.1.1/now works, and:443is dropped. A path, credentials, a non-numeric or out-of-range port, or an unbracketed IPv6 address now fails at startup instead of at the first request. Write IPv6 as[2001:db8::1]or[2001:db8::1]:7443.protect_upload_filerejectsbase64Datathat is not valid base64 (bad characters, length or padding), and empty input, where 2.x uploaded corrupt bytes without an error. Adata:URL prefix and line breaks are accepted. A file too large to fit one MCP message is refused with "File too large to send in one MCP message"; in 2.x an oversized request closed the server's stdio transport and the server exited with nothing logged.protect_update_liveviewrejects a body whosesettings.iddiffers fromid.
Output changes
Text results are compact JSON, not indented.
structuredContentis unchanged; use it if you parse results.Single-object results and dry-run previews now pass MCP clients' output validation. In 2.x, a top-level field the schema did not list, or any dry-run preview of a tool with an output schema, failed with
-32602.A snapshot, response or other result too large for one MCP message is refused with an error saying so. In 2.x it was sent, and the MCP client dropped the connection.
The
protect_upload_filedry-run preview reportsbyteLength(decoded size) in place ofdataLength(base64 string length).protect_subscribe_devices/protect_subscribe_eventsstop at a message cap or a size budget, whichever comes first (both stated in each tool's description), and addtruncated: true.durationis the time actually spent listening. A listen that fails before any message arrives (refused or unauthorized socket) returns an error result; in 2.x it returned{messages: [], error}as a success. One that fails partway still returns what it collected, witherror.A timeout names the call and what to do:
PATCH /cameras/…: Protect did not respond within … s, followed by "Retry when the console responds" for reads, or "The change may still have been applied; check before retrying" for writes. Snapshots and uploads time out before the MCP client's own request timeout, so you see this message instead of a bare client timeout.Network and TLS errors name the underlying cause, e.g.
fetch failed: connect ECONNREFUSED …, instead of a barefetch failed.Cancelling a tool call aborts its request to Protect, and a cancelled subscription closes its socket. In 2.x a cancelled relay switch could still land afterwards.
The server reports its real package version to MCP clients; 2.x always reported
1.0.0. It also sends server instructions (see Safety Features).
For packagers
undici is a new runtime dependency (scoped TLS and connection keep-alive).
Safety Features
Tool annotations. Every tool declares
readOnlyHint,destructiveHintandopenWorldHint: false(each talks only to your console), plus a readabletitle, so MCP clients such as Claude Code can decide when to ask you.destructiveHint: truemarks every tool that deletes or replaces existing state, which includes everyprotect_update_*tool, and every tool that takesconfirm. Clients that auto-approve non-destructive tools ask before those. The tool tables below mark them DESTRUCTIVE.Server instructions. On connect, the server gives the MCP host a short guide for the model, matched to read-only or read-write mode. It says to treat names and event text from the console as data, not instructions; that RTSPS and talkback URLs are credentials; and, when writes are enabled, to preview with
dryRunand ask you before passingconfirm.Read-only mode. On by default. Only the read tools (list, get, snapshot, subscriptions) are registered; write tools do not exist for the model, and registering one in read-only mode fails at startup. Set
UNIFI_PROTECT_READ_ONLY=falseto enable writes. Read-only mode still returns RTSPS URLs fromprotect_get_rtsp_streams, and those are credentials for live video.Confirmation parameter. Tools that are irreversible, switch physical outputs, trigger the alarm webhook, stop a siren, disarm or weaken alarm coverage, or open live video or two-way audio refuse to act unless the call carries
confirm: true. Without it the tool returns an error naming the action, so the agent can ask you first.protect_update_sensor,protect_update_fobandprotect_update_arm_profileneed it only when the change touches alarm-related settings (each tool's description names them); renames and LED changes do not.confirmis filled in by the model, so it is a prompt for the model to ask you, not a lock; for a human gate, keep your MCP client's approval prompts on for destructive tools.Dry-run support. Every write tool accepts
dryRun: trueand returns the request it would send (dryRun,action,path,body) without changing anything. A dry run never needsconfirm.Request safety. IDs must be IDs returned by list and get tools, and a request path that would resolve outside the Integration API is refused before it is sent. Redirects are refused, so the API key is never forwarded. Cancelling a tool call aborts its request to Protect.
See SECURITY.md for reporting vulnerabilities and operating the server safely.
Structured output
Read tools, and write tools that return the resource, declare an outputSchema, and return structuredContent alongside compact JSON text. Schemas are published as loose objects, so a field a firmware update adds flows through instead of failing validation. A list's items are under result; a paged list also has totalCount and offset. protect_get_snapshot returns an image. A dry run returns {dryRun, action, path, body}. Action endpoints that return no body succeed with an empty result.
Tools
DESTRUCTIVE marks tools annotated destructiveHint: true. Requires confirm: true marks tools that take confirm; every one of them is also DESTRUCTIVE. Pages with limit/offset marks list tools that take them.
System
Tool | Description |
| Get system information and version details |
| Get the NVR console info (a single object) |
Subscriptions
Tool | Description |
| Subscribe via WebSocket to device state updates for a short window (not over Cloud Connector) |
| Subscribe via WebSocket to event notifications for a short window (not over Cloud Connector) |
Cameras
Tool | Description |
| List all cameras (pages with |
| Get camera details by ID |
| DESTRUCTIVE: Update camera settings |
| Get a JPEG snapshot (returns image) |
| DESTRUCTIVE: Create an RTSPS stream session; the returned URLs are credentials for live video (requires |
| Get active RTSPS stream sessions (the URLs are credentials for live video) |
| DESTRUCTIVE: Stop and delete an active RTSPS stream |
| DESTRUCTIVE: Create a talkback (two-way audio) session; the returned URL is a credential (requires |
| DESTRUCTIVE: Irreversibly disable the camera microphone; only a factory reset restores it (requires |
| Start PTZ patrol at a given slot |
| Stop PTZ patrol |
| Move PTZ to a preset position |
Lights
Tool | Description |
| List all lights (pages with |
| Get light details by ID |
| DESTRUCTIVE: Update light settings |
Sensors
Tool | Description |
| List all sensors (pages with |
| Get sensor details by ID |
| DESTRUCTIVE: Update sensor settings (requires |
Chimes
Tool | Description |
| List all chimes (pages with |
| Get chime details by ID |
| DESTRUCTIVE: Update chime settings |
Viewers
Tool | Description |
| List all viewers (pages with |
| Get viewer details by ID |
| DESTRUCTIVE: Update viewer settings |
Sirens
Tool | Description |
| List all sirens (pages with |
| Get siren details by ID |
| DESTRUCTIVE: Update siren settings (name, volume, LED) |
| Activate the siren alarm for a given duration (5/10/20/30s) |
| DESTRUCTIVE: Stop an active siren; it silences an alarm (requires |
| Test the siren sound for 5 seconds at a given volume |
Fobs
Tool | Description |
| List all key fobs (pages with |
| Get fob details by ID |
| DESTRUCTIVE: Update fob settings (requires |
Relays
Tool | Description |
| List all relays (pages with |
| Get relay details by ID, including each output's state |
| DESTRUCTIVE: Update relay settings |
| DESTRUCTIVE: Turn a relay output channel on or off, with optional pulse duration (requires |
Speakers
Tool | Description |
| List all speakers (pages with |
| Get speaker details by ID |
| DESTRUCTIVE: Update speaker settings (volume, mic) |
| Test the speaker sound at a given volume |
Bridges
Tool | Description |
| List all bridges (pages with |
| Get bridge details by ID |
| DESTRUCTIVE: Update bridge settings |
Link Stations
Tool | Description |
| List all link stations, the non-alarm-hub gateways (pages with |
| Get link station details by ID |
| DESTRUCTIVE: Update link station settings |
Alarm Hubs
Tool | Description |
| List all alarm hubs (pages with |
| Get alarm hub details by ID |
| DESTRUCTIVE: Update alarm hub settings |
| DESTRUCTIVE: Turn an alarm hub output channel on or off: sirens, lights, locks (requires |
Arm Profiles — local alarm manager
Tool | Description |
| List all arm profiles (pages with |
| Create a new arm profile |
| DESTRUCTIVE: Set the active profile used when arming (requires |
| DESTRUCTIVE: Update an arm profile (requires |
| DESTRUCTIVE: Delete an arm profile by ID (requires |
| Arm the alarm using the current profile |
| DESTRUCTIVE: Disarm the alarm (requires |
Live Views
Tool | Description |
| List all live views (pages with |
| Get live view details by ID |
| Create a new live view |
| DESTRUCTIVE: Replace a live view (send the full object from |
Alarm & Files
Tool | Description |
| DESTRUCTIVE: Trigger an alarm webhook, firing its external alarm action (requires |
| List device asset files ( |
| Upload a device asset file (base64 in, sent as multipart/form-data) |
Users
Tool | Description |
| List Protect users, filtered by the key's access (pages with |
| Get a Protect user by ID |
| List UniFi Identity (ULP) users with enrolled credentials (pages with |
| Get a UniFi Identity user by ID |
Point of Sale
Tool | Description |
| Record a POS transaction as a camera event so it can be overlaid on recorded footage |
Troubleshooting
Configuration errors go to the MCP host's server log and the server exits. Tool errors reach the agent as results starting with Error:.
Message | Cause and fix |
| Missing from the server's |
| A path, credentials or a bad port in the host; bracket IPv6 addresses. |
| Paste the key again. |
| The path does not exist for the server. Use an absolute path; |
| No |
| Unset |
| The console ID only applies with |
| Read-only is the default. Set |
| Save the console's certificate to |
| Something between you and Ubiquiti's cloud is presenting another certificate, such as a TLS-inspecting proxy or firewall. |
| Wrong or unreachable host. |
| Wrong or revoked key, or its admin lacks the rights. |
| The console is slow. For a write, check whether it was applied before retrying. |
| The response is too large for one MCP message. Page a list with |
| Upload a smaller file. |
| Expected: the action needs |
| The agent passed a name or a malformed ID. |
| The WebSocket was refused or unauthorized; this is not "no activity". |
| Connect to the console directly for subscriptions. |
| The call broke the tool's input schema (for example a missing |
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 src/ and tests/ without emitting
pnpm run lint # ESLint, type-aware
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
pnpm run test:package # Pack, install the tarball and smoke-test it over stdioGit hooks are managed by lefthook — pnpm exec lefthook install enables them. Pre-commit runs ESLint on staged files, a full typecheck, and a GitGuardian secret scan when ggshield is installed (skipped otherwise), 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)deps: ...— dependency update (patch version bump; Renovate's type for package bumps)feat!: ...orBREAKING CHANGE:footer — breaking change (major version bump)chore:,docs:,ci:, etc. — no version bump
On push to main, release-please opens a Release PR that bumps the version and updates CHANGELOG.md. Merging that PR publishes to npm automatically. Merge pull requests with a rebase merge, so each commit (and any BREAKING CHANGE footer) reaches the changelog.
To override the version number, add Release-As: x.x.x in the commit body:
git commit --allow-empty -m "chore: release 2.0.0" -m "Release-As: 2.0.0"License
MIT
Available Tools
38 toolsprotect_get_alarm_hubGet alarm hubBRead-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 (armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered"), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus), threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Alarm hub ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| alarmHub | No | Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus) |
| modelKey | No | Resource kind |
| lastEvent | No | Last event timestamp in epoch ms (number) |
| isAlarmHub | No | Whether this device is an alarm hub (boolean) |
| ledSettings | No | LED settings (object: isEnabled) |
| threadState | No | Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered without the description. The description adds only a restatement of returned fields, with nothing about auth requirements, ID validity/not-found behavior, or any operational constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded but is followed by a very long dump of return keys, nested sub-keys and even a docs version tag ('7.3.70 docs'). Since an output schema exists, this enumeration is largely wasted text and bloats the definition well past what is needed to select and call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema supplied, the essentials (what it returns, which ID to pass) are covered. The bulk of the description is redundant with structured data rather than filling real gaps like error or not-found behavior, so it is adequate but not complete in the places that would actually help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, which already states it is the 'Alarm hub ID'. The description's 'by ID' adds no format, source, or lookup guidance (such as where to obtain the ID) beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb and resource ('Get full details for a specific alarm hub by ID'), which is unambiguous and clearly distinct from the list-style siblings like protect_list_alarm_hubs. It stops short of naming that sibling explicitly, so an agent must infer the retrieval-vs-enumeration split from the name pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the caller is expected to already hold a hub ID. There is no explicit guidance on when to reach for this tool versus protect_list_alarm_hubs (e.g. 'use the list tool to discover IDs'), and no prerequisites or failure conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_bridgeGet bridgeARead-only
Get full details for a specific bridge by ID. Returns: id, modelKey, name, mac, state, type, guid, platform, clients (array of MACs), maxClients (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bridge ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| clients | No | Connected client MACs (array of strings) |
| modelKey | No | Resource kind |
| platform | No | Hardware platform, e.g. "mt7621" |
| maxClients | No | Max client capacity (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, read-only, closed-world read. The description adds little behavioral context beyond enumerating return fields, and since an output schema exists that enumeration is largely redundant. No mention of auth needs, error behavior, or lookup failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences; the retrieval purpose leads and the field list follows. Slightly wasteful because the return-field enumeration duplicates what the output schema already provides, but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple one-param getter with a full output schema and covering read-only annotations needs little more than a clear purpose statement. The description is complete for correct invocation, though it adds no scoping constraints or error guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage and a single required 'id' parameter documented in the schema, the description's 'by ID' adds nothing beyond structured data. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (bridge) with a qualifying scope ('specific bridge by ID'), which implicitly distinguishes it from the sibling protect_list_bridges. It does not name the list alternative explicitly, so it falls just short of the top bar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied via 'by ID' - the agent can infer this is the single-item counterpart to protect_list_bridges. There is no explicit when-to-use, when-not-to-use, or named alternative, so guidance is adequate but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_cameraGet cameraARead-only
Get details for a specific camera by ID. The Protect Integration API returns the SAME field set as protect_list_cameras entries (id, mac, name, modelKey, state, type, guid, activePatrolSlot, hasPackageCamera, hdrType, isMicEnabled, micVolume, videoMode, featureFlags, lcdMessage, ledSettings, osdSettings, smartDetectSettings) — there is no extended/by-id-only payload (confirmed live on 7.3.70). Recording state, motion events, zones, and channel/RTSP config are NOT exposed by this API surface.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Camera ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Camera name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| hdrType | No | HDR mode, e.g. "auto" |
| modelKey | No | Always "camera" |
| micVolume | No | Microphone volume 0-100 (number) |
| videoMode | No | Video mode, e.g. "default" |
| lcdMessage | No | |
| ledSettings | No | |
| osdSettings | No | |
| featureFlags | No | |
| isMicEnabled | No | Microphone enabled (boolean) |
| activePatrolSlot | No | Active PTZ patrol slot, or null (number|null) |
| hasPackageCamera | No | Has a secondary package camera (boolean) |
| smartDetectSettings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, closed-world profile, so the bar is lower, and the description still adds real value by enumerating the returned field set and explicitly naming what is NOT exposed (recording state, motion events, zones, channel/RTSP config). That negative-space disclosure prevents wasted calls, though error/timeout behavior is unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then two sentences that each carry non-obvious information (identical field set, excluded data). The field enumeration is long but functional; the version parenthetical is defensible evidence but slightly incidental.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no prose, yet the description still summarizes the payload and its limits. For a single-ID lookup with full annotation coverage, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100% ('Camera ID' with a pattern constraint), so the schema already does the heavy lifting. The description adds no format or lookup guidance beyond saying 'by ID'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details for a specific camera by ID') and explicitly differentiates itself from the sibling protect_list_cameras by asserting the by-ID payload is identical to the list entry payload. An agent can tell exactly what this returns without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The note that there is 'no extended/by-id-only payload' implicitly tells the agent this call is not needed for richer data, but it never states when to prefer this over protect_list_cameras or what an invalid/missing ID yields. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_chimeGet chimeARead-only
Get full details for a specific chime by ID. Returns: id, modelKey, name, mac, state, type, guid, cameraIds (array of camera IDs), ringSettings (array of objects: cameraId, volume, ringtoneId, repeatTimes) — verified live 7.3.70.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Chime ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| modelKey | No | Resource kind |
| cameraIds | No | Paired camera IDs (array of strings) |
| ringSettings | No | Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without the description. The description contributes the field inventory and a version-verification note, which is beyond the annotations, but it says nothing about error behavior for unknown IDs or pagination (none expected).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose in the first clause, then the return fields. The long field enumeration is somewhat bloated given an output schema exists, but nothing is misleading or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a single-parameter read tool whose annotations carry the safety profile and whose output schema carries the return shape. The return-field list duplicates the output schema rather than filling a gap, but no information an agent needs to invoke it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With one parameter and 100% schema description coverage, the schema already documents the 'id' field and its pattern. The description adds no syntax, format, or sourcing guidance beyond restating that lookup is by ID, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details for a specific chime by ID'), which cleanly separates it from the list-style siblings like protect_list_chimes. It does not name a sibling explicitly, but 'by ID' makes the selection unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the phrase 'by ID' signals that a chime identifier is required, which an agent must obtain from protect_list_chimes first. No explicit when-to-use, prerequisite, or when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_fobGet fobBRead-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), wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Fob ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| modelKey | No | Resource kind |
| awayState | No | Away state, e.g. "ONLINE" |
| buttonLabels | No | Button label preset, e.g. "securityActions" |
| featureFlags | No | Feature flags (object: buttons[], hasKeypad — hasKeypad added in 7.3.x) |
| keypadSettings | No | Keypad config, added in 7.3.x (object: beepEnabled, beepVolume). The backlightEnabled/backlightBrightness fields were dropped in 7.3.70. |
| armControlSettings | No | Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId) |
| wirelessConnectionState | No | Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds no behavioral context beyond that — no auth requirements, no behavior on an invalid/unknown ID, no note on whether the response is cached or live — and its one added element, the return-field list, is redundant with the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and efficient, but the second sentence is a sprawling nested enumeration of return fields that duplicates the output schema and roughly doubles the length without adding selection value. The trailing '(7.3.70 docs)' citation is noise for an invoking agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With read-only annotations, a fully documented single required parameter, and an existing output schema, the description covers what an agent needs to invoke the tool correctly. The main residual gap is the absence of any routing hint to protect_list_fobs for obtaining a valid ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('Fob ID' plus a format pattern), so the schema fully documents it. The description adds no syntax, source, or format guidance for the id, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details for a specific fob by ID'), which is unambiguous and implies the get-vs-list distinction against protect_list_fobs. However, it never names the sibling or explicitly contrasts single-fetch with enumeration, so an agent must infer the relationship from naming convention alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'by ID' phrasing suggests calling this when you already hold a fob ID and need its full record. There is no explicit when-to-use, when-not-to-use, or pointer to protect_list_fobs for discovering IDs, which is the natural precondition for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_infoGet infoARead-only
Get UniFi Protect application information. Returns: applicationVersion (string).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| applicationVersion | No | Current Protect application version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only the return payload (applicationVersion), which is redundant with the existing output schema, so it contributes little beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with no filler; the purpose leads and the return value follows. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with full annotation coverage and an output schema, almost nothing is missing. The only gap is the absence of a note on when the info is useful (e.g., version/compatibility checks), which would help an agent decide to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly implies a no-argument invocation and adds nothing that could mislead about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get UniFi Protect application information") and scopes it to the application itself rather than a device. It is implicitly distinct from the many list_*/get_* device siblings, but never explicitly says "application-level, not a device" to differentiate it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool is the sole application-info tool among device-centric siblings, so an agent can infer it is for app metadata. There is no explicit when-to-use, when-not-to-use, or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_lightGet lightBRead-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.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Light ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| camera | No | Paired camera ID |
| isDark | No | Whether it is currently dark out (boolean) |
| modelKey | No | Resource kind |
| isLightOn | No | Whether the light is currently on (boolean) |
| lastMotion | No | Last motion timestamp in epoch ms (number) |
| lightModeSettings | No | Activation settings (object: mode, enableAt) |
| isLightForceEnabled | No | Main LED force-enabled (boolean) |
| isPirMotionDetected | No | PIR motion currently detected (boolean) |
| lightDeviceSettings | No | Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered without the description. The description adds nothing behavioral beyond that (no auth scope, error behavior, or freshness semantics), and its enumerated field list largely duplicates the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is correctly front-loaded in the first clause, but the long inline enumeration of return fields and the trailing '(7.3.70 docs)' citation consume most of the text without aiding tool selection. Since an output schema already exists, that field list is redundant rather than informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only fetch with a full output schema and clear annotations, the description covers what an agent needs in order to call the tool correctly. The only missing piece is routing context against the list/get sibling pair.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'id' parameter is documented in the schema with a pattern constraint. The description restates only that lookup is 'by ID' and adds no format, uniqueness, or sourcing detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (light) with clear scope ('full details ... by ID'), distinguishing a single-item fetch from the sibling list tool protect_list_lights by implication. It does not explicitly name that sibling, so an agent must infer the retrieve-one vs enumerate-many split from naming convention.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus protect_list_lights or the broader family of protect_get_* tools, and no stated prerequisite such as needing an ID obtained from a list call. The 'by ID' phrasing only weakly implies the lookup flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_link_stationGet link stationARead-only
Get full details for a specific link station by ID. Link stations are non-alarm-hub gateways (use protect_list_alarm_hubs for alarm hubs). Returns: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered"), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus), threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Link station ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| alarmHub | No | Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus) |
| modelKey | No | Resource kind |
| lastEvent | No | Last event timestamp in epoch ms (number) |
| isAlarmHub | No | Whether this device is an alarm hub (boolean) |
| ledSettings | No | LED settings (object: isEnabled) |
| threadState | No | Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds value by enumerating the rich return payload (alarmHub fields, threadState, ledSettings), which is genuinely useful context beyond the annotations, but it does not discuss auth, rate limits, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is crisp and front-loaded, but the second sentence is an enormous field enumeration that repeats the output schema (which already exists per context signals) and is hard to scan. Much of that field list is redundant with the declared output schema and harms readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-param read tool with a declared output schema, the definition covers purpose, disambiguation, and return shape, so an agent can call it correctly. The verbatim field dump duplicates the output schema rather than adding explanation, leaving minor room to improve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single id parameter is fully documented with a pattern, so the schema already carries the semantics. The description reinforces that id is a 'link station ID' and disambiguates it from alarm-hub IDs, adding marginal value beyond the schema baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (link station) with scope (full details, by ID). It actively disambiguates from the sibling protect_get_alarm_hub by explicitly noting that link stations are non-alarm-hub gateways and routing alarm-hub callers to protect_list_alarm_hubs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes context by contrasting link stations with alarm hubs and pointing to protect_list_alarm_hubs for alarm hubs. However, it does not mention protect_list_link_stations as the way to discover IDs, and no explicit when-not-to-use condition is given beyond the alarm-hub exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_liveviewGet liveviewARead-only
Get details for a specific live view by ID. Returns: id, modelKey, name, isDefault, isGlobal, layout, owner, slots (each slot: cameras string[], cycleMode, cycleInterval). The full slot list is needed when updating because PATCH replaces the slots array.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Liveview ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Liveview ID |
| name | No | Liveview name |
| owner | No | Owning user ID |
| slots | No | Camera slots |
| layout | No | Grid layout / slot count (number) |
| isGlobal | No | Whether shared across all users (boolean) |
| modelKey | No | Always "liveview" |
| isDefault | No | Whether this is the default liveview (boolean) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the PATCH-replaces-slots semantics, which affects how an agent orders calls. It omits error/not-found behavior for an invalid ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the return shape, then the PATCH caveat in three tight sentences. The enumerated return fields are somewhat redundant given the tool has an output schema, costing a little efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter tool with an output schema, the description covers the essentials and adds the one non-obvious workflow detail (slots must be fully supplied on PATCH because it replaces the array). No pagination or failure-mode notes, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage and a documented pattern, so the schema carries the parameter meaning. The description's 'by ID' adds nothing beyond it, which is the expected baseline 3 when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details for a specific live view by ID'), which is enough to separate it from the sibling list tool protect_list_liveviews, since 'by ID' implies single-item retrieval. It never names that sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete usage condition: fetch the full slot list when updating because PATCH replaces the slots array, which tells the agent when this call is required. It does not explicitly contrast with protect_list_liveviews as the alternative for enumerating views, so there is no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_relayGet relayBRead-only
Get full details for a specific relay by ID. Returns: id, modelKey, name, mac, state, type, guid, ledSettings (isEnabled), outputs (array of objects: id, name, type, delay, pulseDuration, state, rebootState — id is the outputId for protect_activate_relay_output), inputs (array of objects: id, name, state, actionTrigger, actionType, actionOutputId), wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Relay ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| inputs | No | Input channels (array of objects: id, name, state, actionTrigger, actionType, actionOutputId) |
| outputs | No | Output channels (array of objects: id, name, type, delay, pulseDuration, state, rebootState). `id` is the outputId for protect_activate_relay_output |
| modelKey | No | Resource kind |
| ledSettings | No | LED settings (object: isEnabled) |
| wirelessConnectionState | No | Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the safety profile is covered. The description goes beyond that by detailing the returned structure and, notably, linking outputs[].id to protect_activate_relay_output's outputId parameter, which is genuinely useful cross-tool context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, which is good, but the bulk of the text enumerates the full return shape even though an output schema already exists, making much of it redundant. It is dense and structured but not every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only single-parameter tool with a full output schema and complete annotations, the description is more than sufficient and even adds the cross-tool outputId link. Only minor edges (e.g., not-found behavior) are absent, which is acceptable here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'id' parameter, so the schema already documents it fully. The description's 'by ID' adds no format, source, or semantics beyond what the schema provides, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get full details for a specific relay by ID'), which an agent can distinguish from the list-style sibling protect_list_relays. However, it never explicitly names or contrasts with that sibling, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no exclusions or references to alternatives like protect_list_relays or protect_get_info. 'By ID' only weakly implies that an ID must already be known.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_rtsp_streamsGet RTSP streamsARead-only
Get active RTSPS stream sessions for a camera. Returns: high, medium, low, package — each an rtsps:// URL, or null (or absent) when no session is active at that quality. Use protect_create_rtsp_stream to start one. Each URL is a bearer credential for live video: do not repeat it unless the user asked for it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| low | No | RTSPS URL for the low-quality stream |
| high | No | RTSPS URL for the high-quality stream |
| medium | No | RTSPS URL for the medium-quality stream |
| package | No | RTSPS URL for the package-camera stream |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered; the description adds real value on top by disclosing the return shape (high/medium/low/package, null-or-absent when inactive) and warning that each URL is a bearer credential for live video that should not be repeated unprompted. That security caveat is behavior an annotation cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it does, what it returns, what to do instead, plus the credential caution. Everything is front-loaded and each sentence adds non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still explains the quality keys and null-when-inactive semantics, and it covers the sibling hand-off and the security constraint. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single 'Camera ID' parameter, so the schema carries the burden; the description only implies the id refers to a camera without adding format or constraint detail. Baseline 3 is appropriate for a one-parameter tool fully documented in schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get active RTSPS stream sessions for a camera') and scopes it precisely to the RTSP-stream concept. The sibling tools are all list/get entity tools, so a stream-session getter is clearly distinct, and the reference to protect_create_rtsp_stream further anchors it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to protect_create_rtsp_stream when it needs to start a session, which is genuine when-to-use guidance. It stops short of stating when not to call this tool (e.g. non-camera devices or no-session cases), so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_sensorGet sensorCRead-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 — each {value, status}), lightSettings / humiditySettings / temperatureSettings (isEnabled, margin, lowThreshold, highThreshold), isOpened, openStatusChangedAt, isMotionDetected, motionDetectedAt, motionSettings / glassBreakSettings (isEnabled, sensitivity, sensitivityWhenArmed), scheduleMode, armProfileIds, hasCustomSensitivityWhenArmed, alarmTriggeredAt, alarmSettings, leakDetectedAt, externalLeakDetectedAt, leakSettings (isInternalEnabled, isExternalEnabled), tamperingDetectedAt, wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Sensor ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| stats | No | Environmental stats (object: light, humidity, temperature — each { value, status }) |
| isOpened | No | Open/close contact state (boolean) |
| modelKey | No | Resource kind |
| mountType | No | Mount type, e.g. "door", "leak", "garage" |
| featureFlags | No | Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount }) |
| leakSettings | No | Leak detection settings, read-only (object: isInternalEnabled, isExternalEnabled) |
| scheduleMode | No | Schedule mode: "always" | "when_armed" |
| alarmSettings | No | Alarm settings (object: isEnabled) |
| armProfileIds | No | Arm profile IDs this sensor belongs to (array of strings) |
| batteryStatus | No | Battery status (object: percentage, isLow) |
| lightSettings | No | Light threshold settings (object: isEnabled, margin, lowThreshold, highThreshold) |
| leakDetectedAt | No | Last leak timestamp in epoch ms (number) |
| motionSettings | No | Motion detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed) |
| alarmTriggeredAt | No | Last alarm timestamp in epoch ms (number) |
| humiditySettings | No | Humidity threshold settings (object: isEnabled, margin, lowThreshold, highThreshold) |
| isMotionDetected | No | Motion currently detected (boolean) |
| motionDetectedAt | No | Last motion timestamp in epoch ms (number) |
| glassBreakSettings | No | Glass-break detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed) |
| openStatusChangedAt | No | Open-status change timestamp in epoch ms (number) |
| tamperingDetectedAt | No | Last tampering timestamp in epoch ms (number) |
| temperatureSettings | No | Temperature threshold settings (object: isEnabled, margin, lowThreshold, highThreshold) |
| externalLeakDetectedAt | No | Last external-leak timestamp in epoch ms (number) |
| wirelessConnectionState | No | Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge) |
| hasCustomSensitivityWhenArmed | No | Custom armed sensitivity enabled (boolean) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds no behavioral context beyond that — no auth requirements, no rate limits, no error or not-found semantics — and instead spends its budget restating return fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a well-formed, front-loaded purpose statement, but everything after it is a sprawling enumeration of return fields. Since an output schema exists, that enumeration is largely redundant and dominates the description's length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema and safety annotations, the core need is covered by the first sentence. The remaining text re-describes the return payload the output schema already defines, so the description is verbose in the wrong place and silent on genuinely useful details like not-found behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage and a single parameter fully documented as 'Sensor ID' with a pattern, the schema carries the meaning and the baseline is 3. The phrase 'by ID' adds nothing about format or sourcing of the ID beyond what the schema already specifies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (Get), resource (sensor), and scope (by ID, full details), which distinguishes it from the sibling protect_list_sensors in practice. It never names the sibling or any alternative explicitly, but the get-vs-list distinction is implicit in 'by ID'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus protect_list_sensors or the other protect_get_* siblings, no prerequisite for obtaining a valid sensor ID, and no error behavior for unknown IDs. The description only says what it returns, not when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_sirenGet sirenARead-only
Get full details for a specific siren by ID. Returns: id, modelKey, name, mac, state, type, guid, volume, ledSettings (isEnabled), sirenStatus (isActive, activatedAt, duration), connectionType, wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Siren ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| volume | No | Siren volume (number) |
| modelKey | No | Resource kind |
| ledSettings | No | LED settings (object: isEnabled) |
| sirenStatus | No | Current siren status (object: isActive, activatedAt, duration) |
| connectionType | No | Connection type, e.g. "lora" |
| wirelessConnectionState | No | Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds no behavioral context beyond that (no auth requirements, error behavior, or freshness guarantees), leaning instead on enumerating return fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence. The trailing return-field enumeration is long and largely duplicates the existing output schema, but it is compactly expressed and does not obscure the core statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a full output schema and rich annotations, the description covers the essentials. Since an output schema exists, the enumerated return fields are redundant rather than necessary, and the missing piece is routing guidance against sibling getters/lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('Siren ID', with pattern constraint), so the schema carries the semantics. The description adds nothing about format or constraints beyond restating 'by ID', which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details for a specific siren by ID'), which cleanly separates it from the list-style sibling protect_list_sirens. It stops short of naming the sibling or scope limits explicitly, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by ID' implies you already have an identifier, which is the only real usage signal. There is no explicit when-to-use guidance and no mention of alternatives such as protect_list_sirens for discovering IDs, so context is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_snapshotGet snapshotARead-only
Get a JPEG snapshot from a camera. Returns a base64-encoded image/jpeg (rendered directly by MCP clients). Use highQuality=true to force a 1080p-or-higher capture; set channel=package to capture from the secondary package camera on doorbells with hasPackageCamera=true. Fails with HTTP 503 when the camera is offline or unreachable. A snapshot too large for one MCP message is refused with an error; try without highQuality.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Camera ID | |
| channel | No | Camera channel to capture. Use "package" for cameras with hasPackageCamera=true (defaults to main) | |
| highQuality | No | If true, force a 1080p-or-higher resolution snapshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/destructive/openWorld; the description goes further by disclosing failure modes (HTTP 503 when the camera is offline or unreachable), an oversize-image refusal, and a concrete remediation ('try without highQuality'). It also notes clients render the image directly, so the agent knows what to expect from a read with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all front-loaded: what it returns first, then parameter modifiers, then failure modes and recovery. Every sentence carries operational information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return contract (base64 JPEG rendered by clients) and covers the error paths an agent must handle. For a read-only snapshot tool with 3 well-documented params, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already documented, so the baseline is 3; the description still adds value by tying highQuality to the 1080p-or-higher guarantee and to the size-refusal behavior, and by restating the package-camera prerequisite. The overlap with the schema keeps it from a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a JPEG snapshot from a camera') plus the concrete return payload ('base64-encoded image/jpeg'). This clearly separates it from siblings like protect_get_rtsp_streams (live stream) and protect_get_camera (metadata) without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for the optional parameters (highQuality for 1080p+, channel=package only for cameras with hasPackageCamera=true) and a fallback path when the response is too large. It does not, however, state when to prefer a snapshot over alternatives such as the RTSP stream tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_speakerGet speakerCRead-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.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Speaker ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| volume | No | Speaker volume (number) |
| modelKey | No | Resource kind |
| micVolume | No | Microphone volume (number) |
| featureFlags | No | Feature flags (object: hasMic) |
| isMicEnabled | No | Microphone enabled (boolean) |
| speakerState | No | Speaker state (object: status, mode) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false. The description only lists return fields, which are already covered by the output schema, and adds no behavioral context such as auth needs, rate limits, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and efficient. The second sentence enumerates many return fields that are redundant with the existing output schema, adding length without new value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter with an output schema and safety annotations, the description covers the operation, the required ID, and the returned fields. It lacks usage routing to sibling tools, but that is a minor gap for an obvious single-item retrieval.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the sole 'id' parameter as 'Speaker ID'. The description's 'by ID' adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get full details for a specific speaker by ID'), making the operation clear. It does not differentiate from sibling tools like protect_list_speakers, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit when-to-use, prerequisites, or alternative tools. 'By ID' is a parameter constraint, not guidance on choosing this tool over protect_list_speakers or other getters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_ulp_userGet ULP userARead-only
Get details for a specific UniFi Identity (ULP) user by ID. Returns: id, modelKey, firstName, lastName, fullName, email, status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ULP user ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | ULP user UUID |
| No | Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.70) | |
| status | No | Account status, e.g. ACTIVE |
| fullName | No | Full name |
| lastName | No | Last name |
| modelKey | No | Always "ulpUser" |
| firstName | No | First name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description contributes the returned field list, but says nothing about auth requirements, error behavior for an unknown ID, or pagination concerns — acceptable but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the identity/scope qualifier front-loaded before the return-value enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with full schema coverage, safety annotations, and an output schema, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'id' parameter carries its pattern and description in the schema, so the description's 'by ID' adds no syntax or format detail. Baseline 3 for a fully documented single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (UniFi Identity/ULP user), qualified by ID lookup, which cleanly separates it from protect_list_ulp_users and from the similarly named protect_get_user. An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'by ID' — you call it when you already hold a ULP user ID — but the description never states when to prefer this over protect_list_ulp_users or protect_get_user, nor any prerequisites. Adequate but with an obvious routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_userGet userARead-only
Get details for a specific Protect user by ID. Returns the same fields as protect_list_users entries: id, modelKey, name, firstName, lastName, email, ucoreUserId.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | User ID |
| name | No | Display name |
| No | Email address | |
| lastName | No | Last name |
| modelKey | No | Always "user" |
| firstName | No | First name |
| ucoreUserId | No | UniFi Core user UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only the returned field list, which is largely duplicated by the output schema, and omits error or permission behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose first and return fields second, with no wasted words. The field list is somewhat redundant with the output schema but remains short and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple read-by-ID tool with full annotation coverage and an existing output schema, so the description is nearly complete for calling it correctly. The only gap is no explicit disambiguation from protect_get_ulp_user, but the core invocation needs nothing more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 'User ID' and a pattern constraint; the description adds only 'by ID', which restates the schema. Baseline 3 is appropriate because the schema fully documents the single parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get details), resource (Protect user), and selector (by ID), plus the returned field shape. It does not explicitly differentiate from sibling protect_get_ulp_user, another user-fetching tool, so sibling discrimination is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage when you have a user ID and need details for that single user, and notes field parity with protect_list_users entries. However, it never states when to prefer this over protect_list_users or protect_get_ulp_user, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_get_viewerGet viewerARead-only
Get full details for a specific viewer by ID. Returns: id, modelKey, name, mac, state, type, guid, liveview, streamLimit (7.3.70 docs).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Viewer ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Device ID |
| mac | No | MAC address |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | Device name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| state | No | CONNECTED | DISCONNECTED | ... |
| liveview | No | Assigned live view ID, or null |
| modelKey | No | Resource kind |
| streamLimit | No | Max concurrent streams (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds no behavioral context beyond that (no auth requirements, no error behavior for an unknown ID); its field list is return-shape information, not behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose and free of filler. The enumerated return fields are slightly wasteful given an output schema exists, but the whole description is brief enough that it doesn't harm readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-by-ID tool with full annotation coverage and an output schema, the description covers what an agent needs to select and invoke it. Nothing essential is missing, though it could note the read-only nature or behavior on an invalid ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage ("Viewer ID" plus a pattern constraint), the schema already carries the semantics. The description's "by ID" adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get full details for a specific viewer by ID"), which cleanly separates it from the sibling protect_list_viewers. It does not name the sibling explicitly, but "by ID" versus listing makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the follow-up call after obtaining an ID from protect_list_viewers. There is no explicit when-to-use, when-not-to-use, or named alternative, so it lands at minimum viable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_alarm_hubsList alarm hubsARead-only
List all alarm hubs managed by UniFi Protect. Returns array; each alarm hub includes: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered"), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus), threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: it returns an array, and paged results also carry totalCount and offset. It stops short of describing ordering or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause is well front-loaded, but the middle is a sprawling enumeration of every nested field (ledSettings, alarmHub with a dozen sub-keys, threadState, etc.) that largely duplicates the existing output schema. This bulk crowds out the one actionably useful sentence, the pagination guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values need not be restated, and annotations cover safety; the pagination behavior is the piece that genuinely mattered and it is included. Nothing an agent needs to call this correctly is missing, though a pointer to the sibling get tool would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description goes beyond the terse schema strings by explaining the paging rationale (large sites) and the side effect of a paged call (totalCount and offset in the response). That gives the two parameters purpose the schema alone does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('alarm hubs managed by UniFi Protect'), and the plural/singular pairing with the sibling protect_get_alarm_hub is immediately clear. An agent can distinguish it from the get-by-id sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives pagination guidance ('On a large site, use limit and offset to page') but never states when to use this tool versus protect_get_alarm_hub or why a listing is preferable to a lookup. Usage is implied by the list-vs-get naming convention rather than made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_arm_profilesList arm profilesARead-only
List all arm profiles (only available when using the local alarm manager — the standalone NVR alarm system, not Protect cloud alerts). Returns array; each profile (7.3.70 docs): id, name, automations[], creator, schedules[], recordEverything, activationDelay (0 | 60000 | 300000 | 600000), createdAt, updatedAt. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the bar is lower; the description still adds real context about the returned array shape, the effect of paging (totalCount and offset appear), and the discrete activationDelay values. It omits permission/auth requirements and default page size, which keeps it out of the top band.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, front-loaded with purpose and scope, then return shape, then paging guidance — a sensible order with no filler sentences. Slightly overstuffed for a two-parameter list tool, and the '(7.3.70 docs)' citation is incidental metadata that does not help invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, availability constraint, return fields, and paging behavior; an output schema exists so return values need not be spelled out (though it does so usefully). The remaining gap is default behavior when no limit is supplied — an agent cannot tell whether the call returns everything or is capped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit/offset are already documented, giving a baseline of 3. The description adds operational meaning beyond the schema by explaining that these are the paging knobs to use on a large site and that using them changes the response shape (adds totalCount/offset).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all arm profiles') and immediately disambiguates the scope: local alarm manager / standalone NVR, explicitly not Protect cloud alerts. An agent can tell what this returns and which system it applies to without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not condition (only available with the local alarm manager, not cloud alerts) and directs the agent to use limit/offset for paging on large sites. It does not name an alternative tool, but with no sibling arm-profile tools there is no meaningful alternative to route to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_bridgesList bridgesARead-only
List all bridges managed by UniFi Protect. Returns array; each bridge includes: id, modelKey, name, mac, state, type, guid, platform, clients (array of MACs), maxClients (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds real behavioral context beyond that: the return is an array, and a paged result additionally carries totalCount and offset. It does not cover rate limits or auth requirements, but for a read-only list tool this is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by return shape and then paging advice, so the structure is sound. The full enumeration of every returned field is somewhat long given that an output schema exists and already carries that information, which is the only real inefficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only collection tool, the description, annotations, complete parameter schema and existing output schema together leave no critical gap: the agent knows what it lists, that it is safe, and how to page. Listing return fields is redundant with the output schema rather than filling a hole, so it does not reach a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both limit and offset are already fully documented in the schema. The description adds a modest amount of meaning by explaining when paging is warranted ('on a large site') and what a paged result includes, but this is incremental rather than compensating for a gap, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List all bridges managed by UniFi Protect'), and the word 'all' signals the unfiltered, collection-level scope that separates it from the sibling protect_get_bridge. It does not explicitly name that sibling, so it falls just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional guidance for the parameters ('On a large site, use limit and offset to page'), which is useful, but says nothing about when to prefer this tool over protect_get_bridge or the subscription tools, and offers no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_camerasList camerasARead-only
List all cameras managed by UniFi Protect. Returns array; each camera includes (Integration API 7.3.70-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. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only safety profile; the description adds substantial non-obvious behavior — the API version the fields were verified against, a full field inventory, explicit omissions, and the fact that a paged result additionally returns totalCount and offset. It also warns that guid is a shared model identifier, not a per-camera id, which is exactly the kind of trap an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, but the bulk of the text is a long enumeration of every returned field, which duplicates the declared output schema and is not needed for tool selection. The genuinely useful bits (pagination, exclusions, the guid caveat) are buried inside that enumeration rather than given precedence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the field list is over-delivery rather than a necessity; the description still covers what an agent needs to call this correctly — scope, paging, and known data limitations. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both limit and offset, so the baseline is 3. The description adds value by explaining the paging contract — that using limit/offset on a large site yields totalCount and offset in the response — which tells the agent how the parameters behave in combination, not just individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'List all cameras managed by UniFi Protect' — and reinforces list semantics by noting it returns an array and supports paging. It never names the sibling it must be distinguished from (protect_get_camera), so an agent must infer the list-vs-single distinction from the wording alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: 'On a large site, use limit and offset to page.' It also functions as negative guidance by enumerating data the Integration API does NOT expose (recording state, motion timestamps, firmware, host), steering the agent away from wasted calls. It stops short of explicitly routing between this tool and protect_get_camera.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_chimesList chimesARead-only
List all chimes managed by UniFi Protect. Returns array; each chime includes: id, modelKey, name, mac, state, type, guid, cameraIds (array of camera IDs), ringSettings (array of objects: cameraId, volume, ringtoneId, repeatTimes) — verified live 7.3.70. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: it states the response is an array, enumerates chime fields, and explains pagination behavior including totalCount and offset on paged results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then supplies return details followed by pagination guidance. The explicit field enumeration is somewhat redundant given the output schema exists, but the text is dense and every sentence is informative rather than repetitive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool with annotations and an output schema, the description is fully sufficient. It states the scope, return structure, and pagination behavior, so an agent has everything needed to call and interpret the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both limit and offset are already documented in the input schema. The description adds meaning by explaining the use case for paging on a large site and noting that paged results return totalCount and offset, which goes beyond the raw schema bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List all chimes managed by UniFi Protect.' It clearly distinguishes this bulk-listing tool from the sibling protect_get_chime single-resource tool through 'all' and 'List'. No ambiguity about what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides pagination guidance for large sites, which implies when to use limit and offset, but it does not explicitly say when to use this tool versus protect_get_chime or any other sibling. Usage is inferable from 'List all chimes' rather than directly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_filesList filesARead-only
List device asset files (only 'animations' is supported — clips uploadable to G4 Doorbell screens). Returns array; each record (verified live 7.3.70): id, name (server-generated), type, originalName, path, size, createdAt, updatedAt, metadata. An image upload (verified for GIF) later gains a derived .gif preview record, created asynchronously, so a listing taken right after the upload may show only the stored image. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) | |
| fileType | Yes | Asset file type (only 'animations' is supported) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, closed-world), yet the description adds real behavioral context: the asynchronous creation of a derived '<name>.gif' preview record, and the warning that a listing taken right after an upload may show only the stored image. The field enumeration ('verified live 7.3.70') is largely redundant given an output schema exists, which keeps this from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and constraint, then the async caveat, then paging guidance — a sensible ordering. It is dense but each clause carries information, except the enumerated record fields, which duplicate the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema and full parameter coverage, the description supplies exactly the missing context: the single supported file type, the async derived-preview caveat, and how to paginate a large site. Nothing needed to invoke it correctly appears to be absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description nevertheless adds meaning beyond the schema: that limit/offset are the paging mechanism and that a paged result additionally returns totalCount and offset, which is behavior the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List device asset files') and immediately narrows the scope to a single supported type ('only animations is supported — clips uploadable to G4 Doorbell screens'). Sibling list tools all target different resources (cameras, lights, chimes), so naming this resource is sufficient to tell it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional guidance on paging ('On a large site, use limit and offset to page'), which is useful and actionable. However it never states when to call this tool versus other listings or what the required fileType effectively forces, so usage remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_fobsList fobsARead-only
List all fobs managed by UniFi Protect. Returns array; each fob includes: id, modelKey, name, mac, state, type, guid, awayState, buttonLabels, featureFlags (buttons[], hasKeypad), armControlSettings (enabled, armProfileId, nightProfileId), keypadSettings (beepEnabled, beepVolume), wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds behavioral context: it lists the returned fob fields in detail and explains that paged results also return totalCount and offset. This extra information goes beyond the annotations and helps an agent understand the response shape and pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose, followed by return field details and a pagination note. It is somewhat lengthy due to the field enumeration, but every part serves to inform the agent. No rambling or redundant sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and safety annotations, the description is largely complete. It covers purpose, return shape, and pagination. It lacks explicit alternative-tool guidance, but for a simple list operation with structured output, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context for limit and offset by explaining they are used to page on large sites and that a paged result returns totalCount and offset. This clarifies the intended use beyond the schema's generic parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List all fobs managed by UniFi Protect.' This clearly distinguishes it from the singular sibling protect_get_fob by implying a collection, but it does not explicitly name alternatives. An agent can infer the purpose without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers pagination guidance ('On a large site, use limit and offset to page'), which is useful for parameter usage, but it gives no guidance on when to choose this tool over alternatives like protect_get_fob or other list tools. No selection criteria or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_lightsList lightsBRead-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.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description does add one genuinely behavioral detail — that a paged result also returns totalCount and offset — but the long field enumeration duplicates the existing output schema rather than adding traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is correctly front-loaded in the first sentence, but the following field-by-field enumeration is a long, low-value block that largely restates what the output schema already provides. The paging note at the end is the only additional sentence that earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering return shape, the description only needs to add operational context — which it does via the paging/totalCount note. Nothing essential for calling the tool correctly is missing, though the list-vs-get routing is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and their bounds are already documented, making the baseline 3. The description's note that limit/offset are for paging on large sites reinforces intent but adds no syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('List all lights managed by UniFi Protect'), which is unambiguous against the parallel protect_get_light tool. It does not explicitly name or contrast a sibling, so it falls just short of the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is conditional paging advice ('On a large site, use limit and offset to page'), which is really parameter behavior rather than a when-to-use rule. It never states when to prefer this over protect_get_light, leaving the list-vs-single distinction to be inferred from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_link_stationsList link stationsARead-only
List all link stations managed by UniFi Protect. Link stations are non-alarm-hub gateways (use protect_list_alarm_hubs for alarm hubs). Returns array; each link station includes: id, modelKey ("linkstation"), name, mac, state, type, guid, isAlarmHub, ledSettings (isEnabled), lastEvent, alarmHub (armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. "tampered"), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus), threadState (network: status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile requires no prose. The description does add one genuinely behavioral detail beyond that: paged results return totalCount and offset. However, the bulk of the remaining text is a field-by-field dump of the return payload, which the output schema already owns, and no auth/permission or freshness caveats are given.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence and the closing pagination sentence are tight and front-loaded, and the alarm-hub exclusion is correctly placed early. The long parenthetical enumeration of nested alarmHub/threadState fields is bulky and largely redundant given that an output schema exists, so not every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only list tool with a full output schema and complete schema descriptions, the description covers dataset scope, sibling routing, and pagination semantics — everything needed to call it correctly. It loses a point mainly for spending completeness budget restating return fields instead of, say, whether results are site/NVR-scoped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (limit = 'Return at most this many items', offset = 'Skip this many items first'), so the schema fully documents both parameters and the baseline is 3. The description only repeats the paging intent and adds that paged output includes totalCount/offset, which is marginal added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (list) + resource (link stations), with an explicit scoping definition: 'non-alarm-hub gateways'. It names the sibling that handles the other case (protect_list_alarm_hubs) and identifies the single-item sibling implicitly. An agent can distinguish this from protect_list_alarm_hubs and protect_get_link_station without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not/alternative rule: alarm hubs belong to protect_list_alarm_hubs. It also states the condition for using the alternative invocation mode ('On a large site, use limit and offset to page'), so both the tool choice and the parameter choice are routed for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_liveviewsList liveviewsARead-only
List all live views (camera grid layouts shown on viewers / in the Protect UI). Returns array; each liveview includes (Integration API 7.3.70-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. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds behavior the annotations do not: the array return shape, the paging behavior on large sites, and the explicit gotcha that slots use a `cameras` string-array rather than a single `cameraId` — a real tripwire for callers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then richer detail, then the caveat and paging note; the ordering is sensible. It is somewhat dense, and the enumerated liveview fields partly duplicate the existing output schema, but nothing is truly wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, a full output schema, and 100% schema description coverage, the description supplies only the extra bits an agent actually needs: the definition of a liveview, the string-array slots gotcha, and paging/totalCount behavior. Nothing required to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit/offset are already documented in the schema, but the description adds real semantics: that paging is the mechanism on large sites and that a paged response also carries totalCount and offset. That is genuinely new information about how the parameters behave.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all live views') and even defines what a live view is (camera grid layouts shown on viewers / in the Protect UI), which disambiguates it from unrelated Protect resources. It does not name or contrast the sibling protect_get_liveview, so the list-vs-single routing is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The paging advice ('On a large site, use limit and offset to page') is conditional usage guidance, but there is no explicit statement of when to use this tool versus protect_get_liveview or the other protect_list_* tools. Usage context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_nvrsList NVRsARead-only
Get the NVR (Network Video Recorder) console info. NOTE: despite the name, the Protect Integration API's /nvrs endpoint returns a SINGLE NVR object, not an array. Returns: id, modelKey, name, type (e.g. UNVR-PRO), guid, mac, doorbellSettings (defaultMessageText, defaultMessageResetTimeoutMs, customMessages[], customImages[] (preview, sprite)), armMode (status, armProfileId, armedAt, willBeArmedAt, breachDetectedAt, breachEventCount, breachTriggerEventId, breachEventId).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | NVR ID |
| mac | No | MAC address, added in 7.3.x |
| guid | No | Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device. |
| name | No | NVR name |
| type | No | Hardware model name, e.g. "UVC G6 Turret", "UP Chime PoE", "UNVR-PRO" |
| armMode | No | |
| modelKey | No | Always "nvr" |
| doorbellSettings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, closed-world safety profile, so the bar is lower. The description adds real context beyond structured fields: the single-object return behavior that contradicts the 'list' naming, which prevents a caller from misparsing the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose followed by the important naming caveat. The trailing field enumeration is somewhat redundant given an output schema exists, but the overall text is compact and earns most of its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema and clear annotations, the description covers everything needed to call it correctly. The return-field list duplicates the output schema rather than adding new information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('NVR console info'). Critically, it resolves the naming ambiguity against the sibling list/get pattern by noting that despite the 'list' name, the endpoint returns a single NVR object, so an agent knows no separate get_nvr sibling exists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied - it is the only route to NVR info and the note discourages array expectations - but there is no explicit when-to-use, when-not-to-use, or alternative-tool guidance. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_relaysList relaysARead-only
List all relays managed by UniFi Protect. Returns array; each relay includes: id, modelKey, name, mac, state, type, guid, ledSettings (isEnabled), outputs (array of objects: id, name, type, delay, pulseDuration, state, rebootState — id is the outputId for protect_activate_relay_output), inputs (array of objects: id, name, state, actionTrigger, actionType, actionOutputId), wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is fully covered. The description adds the useful cross-reference that an output's id is the outputId for protect_activate_relay_output, but the bulk of the text enumerates return fields rather than behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense run-on enumerating every nested field of the relay object. Since an output schema already exists, this field-by-field listing largely repeats structured data and hurts readability without adding proportionate value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with a full output schema, annotations, and 100% schema coverage, the description is more than adequate and even documents return structure beyond requirements. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented, so the baseline is 3. The description goes beyond the schema by explaining how limit/offset behave together (paging) and that a paged response includes totalCount and offset, which the schema does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all relays managed by UniFi Protect'), which cleanly separates it from the singular protect_get_relay sibling. The scope ('all relays managed by') is explicit, so an agent knows exactly what universe is returned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete operational condition ('On a large site, use limit and offset to page') and explains what a paged result returns. It stops short of naming alternatives (protect_get_relay / protect_subscribe_devices), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_sensorsList sensorsARead-only
List all sensors managed by UniFi Protect. Returns array; each sensor includes: id, modelKey, name, mac, state, type, guid, mountType, featureFlags (temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each {channelCount}), batteryStatus (percentage, isLow), stats (light, humidity, temperature — each {value, status}), lightSettings / humiditySettings / temperatureSettings (isEnabled, margin, lowThreshold, highThreshold), isOpened, openStatusChangedAt, isMotionDetected, motionDetectedAt, motionSettings / glassBreakSettings (isEnabled, sensitivity, sensitivityWhenArmed), scheduleMode, armProfileIds, hasCustomSensitivityWhenArmed, alarmTriggeredAt, alarmSettings, leakDetectedAt, externalLeakDetectedAt, leakSettings (isInternalEnabled, isExternalEnabled), tamperingDetectedAt, wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false, and destructiveHint=false. The description adds useful behavioral context by explaining pagination behavior and that a paged result returns totalCount and offset, though it does not cover auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, but the middle is an extensive enumeration of return fields that is redundant given the existing output schema. This bloats the description and violates the principle that every sentence should earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the annotations, the 100%-covered schema, and the existing output schema, the description supplies all necessary context: it identifies the resource, return type, and pagination mechanism. The extra field list is overcomplete but does not leave gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit and offset. The description mentions using them to page but adds no syntax or semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('sensors managed by UniFi Protect'), clearly distinguishing it from siblings like protect_get_sensor and protect_list_cameras.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides pagination guidance ('On a large site, use limit and offset to page') but does not explain when to choose this tool over protect_get_sensor or other list tools. Usage is implied rather than explicitly contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_sirensList sirensARead-only
List all sirens managed by UniFi Protect. Returns array; each siren includes: id, modelKey, name, mac, state, type, guid, volume, ledSettings (isEnabled), sirenStatus (isActive, activatedAt, duration), connectionType, wirelessConnectionState (signalState: signalQuality, signalStrength; batteryStatus: percentage, isLow; bridge) (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety and side-effect behavior are covered. The description adds pagination behavior (totalCount/offset in paged results), which is genuinely useful, but repeats the return-field inventory that the output schema already provides instead of disclosing anything richer (e.g. whether an empty site returns []).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and paging advice are front-loaded and tight, but the long field-by-field inventory (id, modelKey, name, mac, state ... nested wirelessConnectionState sub-fields) is verbose and largely redundant with the output schema, adding bulk without adding selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool's real complexity is pagination, and that is fully addressed; the presence of an output schema means return values need not be enumerated. The only gap is the absence of sibling routing guidance, which the agent would otherwise have to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline would be 3, but the description goes further by explaining the behavioral consequence of the two parameters — that a paged result adds totalCount and offset to the response. That is meaning beyond the schema's 'return at most this many items' and 'skip this many items'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all sirens managed by UniFi Protect'), which cleanly separates it from protect_get_siren. It does not explicitly contrast with siblings or the other protect_list_* tools, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one concrete usage condition — 'On a large site, use limit and offset to page' — which is real guidance, but it never states when to prefer this over protect_get_siren or the other list tools. 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_speakersList speakersBRead-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.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context in noting that paged results also return totalCount and offset, but the long field enumeration largely duplicates the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, which is good, but the mid-sentence field dump (id, modelKey, name, mac, ...) plus the '(7.3.70 docs)' fragment is noisy and mostly redundant with the output schema. It earns its place less than the opening and closing sentences do.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the field list is redundant rather than necessary, and annotations cover the safety profile, so the description only needs to establish purpose and paging behavior — which it does. It is complete enough for a simple read-only list tool, though it omits ordering/default behavior for the paged call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit and offset are already documented in the schema; the baseline is 3. The description corroborates their paging purpose ('use limit and offset to page') but adds no defaults, ranges, or syntax beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'List all speakers managed by UniFi Protect.' The list-vs-get distinction against sibling protect_get_speaker is clear from naming, but the description never explicitly differentiates itself from that sibling or from other protect_list_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage cue ('On a large site, use limit and offset to page'), which is real guidance. However, there is no when-not guidance and no mention of the alternative protect_get_speaker for fetching a single speaker, so routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_ulp_usersList ULP usersARead-only
List UniFi Identity (ULP) users — per the API docs, those with enrolled credentials (NFC cards, fingerprints). Returns array; each ULP user includes (Integration API 7.3.70-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. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely useful behavioral context beyond that: the scope limitation that enrolled-credential detail (NFC cards, fingerprints) is NOT exposed, and that paged responses also carry totalCount and offset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and scope definition, then return shape, then paging. Dense but every sentence carries information; the inline field enumeration and API-version parentheticals are slightly heavy but justified for a schema-verified contract.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields, but it does note the empty-string email for service accounts and the enrolled-credential limitation — the two things an agent would otherwise get wrong. The only real gap is not routing the agent away from protect_list_users.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents both parameters fully (100% coverage), so the baseline is 3. The description earns above baseline by explaining the operational purpose of limit/offset (paging a large site) and that paging changes the response envelope to include totalCount and offset.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and goes further by defining what a ULP user is (UniFi Identity users with enrolled credentials), which implicitly separates this list from protect_list_users. However, it never names that sibling, so an agent choosing between the two lists still has to infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one concrete usage condition — page with limit/offset on a large site — but offers no when-to-use vs alternatives guidance and does not mention protect_list_users or protect_get_ulp_user. Usage is implied by the definition rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_usersList usersARead-only
List all Protect users (filtered by the API key's access permissions). Returns array; each user includes (Integration API 7.3.70-verified): id, modelKey, name, firstName, lastName, email, ucoreUserId. The Integration API does NOT expose roles, permissions, login history, groups, or notification settings. On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), but the description goes further by enumerating the returned fields and, more valuably, explicitly listing what the Integration API does NOT expose (roles, permissions, login history, groups, notification settings). It also discloses the paging shape (totalCount, offset returned for paged results), which prevents futile calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by returned fields, exclusions, then paging advice, so a reader can stop early. Most sentences earn their place, though the parenthetical '7.3.70-verified' provenance tag is slightly noise for an agent selecting a tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be spelled out, yet the description still summarizes returned fields and explicit exclusions, plus paging semantics. The only meaningful gap is no routing guidance against the closely named sibling protect_list_ulp_users.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both limit and offset are already fully documented, setting the baseline at 3. The description adds value by tying them to a concrete scenario ('on a large site') and explaining what paging changes in the response (totalCount, offset), which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all Protect users') and adds the scoping caveat that results are filtered by the API key's access permissions. However, with siblings like protect_list_ulp_users and protect_get_user in the set, it never distinguishes which user population or granularity it covers, leaving that disambiguation to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one concrete usage cue ('On a large site, use limit and offset to page'), which is real guidance, but there is no when-to-use vs when-not guidance relative to protect_list_ulp_users or protect_get_user. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_list_viewersList viewersARead-only
List all viewers managed by UniFi Protect. Returns array; each viewer includes: id, modelKey, name, mac, state, type, guid, liveview, streamLimit (7.3.70 docs). On a large site, use limit and offset to page; a paged result also returns totalCount and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Return at most this many items | |
| offset | No | Skip this many items first (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | No | Paged results only: the index of the first item returned |
| result | Yes | Array of items returned by the list endpoint |
| totalCount | No | Paged results only: the number of items in the whole list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower, and the description adds genuine behavioral context: paged responses also return totalCount and offset. The enumerated return fields are largely redundant with the existing output schema, which slightly dilutes the added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then paging advice in a logical order with no filler sentences. The long field enumeration is the one part that costs more space than it earns, since an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, yet it still covers purpose and pagination behavior adequately. Nothing critical for calling a ReadOnly list endpoint is missing, though an explicit pointer to protect_get_viewer for single-item lookups would make it fully self-routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already defines limit and offset individually. The description adds meaning by framing both parameters as a coordinated paging mechanism and disclosing the paged-response fields (totalCount, offset), which the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("List all viewers managed by UniFi Protect") and scopes it as the collection-level operation, which implicitly separates it from the sibling protect_get_viewer. It never names the single-viewer alternative explicitly, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete usage cue — "On a large site, use limit and offset to page" — which tells the agent when paging matters. However, there is no guidance on when to use this list tool rather than protect_get_viewer for an individual viewer, or on any prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_subscribe_devicesSubscribe devicesARead-only
Connect to the device update WebSocket and collect messages for a specified duration (1-30s). Returns {messages, duration, error?, truncated?}; stops early with truncated=true after 200 messages or 100,000 characters of JSON, whichever comes first. A connection that fails before any message arrives returns an error. Each message is an envelope {type, item} where item is a device resource carrying id and modelKey (camera, light, sensor, nvr, …). The 7.3.70 docs show type 'add' with the full device object as item; other message types and whether updates carry only changed fields are not documented — inspect the captured messages. Use to detect device state changes or newly adopted devices. Not available over Cloud Connector (api.ui.com).
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Seconds to listen (1-30, default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Connection error, if any |
| duration | No | Seconds actually spent listening, to 0.1s (number); shorter than requested when the message cap or an error ends the listen early |
| messages | No | Captured WebSocket messages (add/update/remove or event envelopes) |
| truncated | No | true when listening stopped early at the message cap (boolean, absent otherwise) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive/openWorld annotations, the description discloses the truncation limits (200 messages or 100,000 chars), the early-stop flag, the error-on-connect-failure case, the message envelope shape, and even documentation gaps. This is unusually rich behavioral context for a streaming tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and return shape, and every sentence carries information (return contract, truncation, error mode, message envelope, doc caveat, use, availability). It is dense and long, but little of it is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter WebSocket subscription tool, the description covers the return contract, truncation, error behavior, message format, intended use, and platform availability. Even though an output schema exists, nothing an agent needs to invoke or interpret this call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single optional parameter. The description's '(1-30s)' merely restates the schema's minimum/maximum/default, adding no syntax or semantic detail beyond what the schema already provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb+resource: 'Connect to the device update WebSocket and collect messages for a specified duration', and clarifies scope with 'Use to detect device state changes or newly adopted devices'. It is clearly a streaming/subscription tool, but it never names the obvious sibling protect_subscribe_events, so the agent must infer the distinction from the word 'device'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a concrete use case ('detect device state changes or newly adopted devices') and a hard environment exclusion ('Not available over Cloud Connector (api.ui.com)'). However, it never routes the agent away from polling alternatives such as protect_list_cameras / protect_get_camera, so no explicit alternative is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protect_subscribe_eventsSubscribe eventsARead-only
Connect to the Protect event WebSocket and collect messages for a specified duration (1-30s). Returns {messages, duration, error?, truncated?}; stops early with truncated=true after 200 messages or 100,000 characters of JSON, whichever comes first. A connection that fails before any message arrives returns an error. Each message is an envelope {type: 'add' | 'update', item: {id, modelKey: 'event', type (event kind, e.g. 'ring'), start, end (epoch ms), device (ID of the camera/sensor that raised it)}} (7.3.70 docs). The full set of event kinds and any further event fields are not documented — inspect the captured messages. Not available over Cloud Connector (api.ui.com).
| Name | Required | Description | Default |
|---|---|---|---|
| duration | No | Seconds to listen (1-30, default 5) |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Connection error, if any |
| duration | No | Seconds actually spent listening, to 0.1s (number); shorter than requested when the message cap or an error ends the listen early |
| messages | No | Captured WebSocket messages (add/update/remove or event envelopes) |
| truncated | No | true when listening stopped early at the message cap (boolean, absent otherwise) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations by disclosing truncation caps (200 messages or 100,000 chars), the early-stop behavior with truncated=true, the error-on-no-message failure mode, the exact return shape, and a known documentation gap for event kinds. These are behavioral traits the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return contract, then progressively layers truncation, error, message shape, and availability. Dense but every clause carries operational information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description fully covers boundaries, failure modes, payload structure, and deployment constraints. An agent has everything needed to invoke it correctly and interpret the result without further inspection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description repeats the 1-30s bound, but it adds real meaning by tying duration to the truncation caps — clarifying that listening may end early before duration elapses. That interplay is not derivable from the numeric bound alone, so it edges above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: connect to the Protect event WebSocket and collect messages, with the envelope explicitly defining the payload as modelKey 'event'. The 'events' scope distinguishes it from the many list/get siblings, but it never names protect_subscribe_devices, the closest alternative, so differentiation must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the WebSocket/events framing and the Cloud Connector exclusion ('Not available over Cloud Connector'), which is genuinely useful routing information. However there is no explicit 'use this instead of protect_subscribe_devices when...' guidance, so the agent must infer when this is preferred over the sibling subscription tool.
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.
38 tool updates
v2.15.0- Changed
protect_get_alarm_hub4 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / alarmHub / descriptionPrevious value: -"Alarm hub status (object: armed, battery, connector, cover, output, input, …)"New value: +"Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. \"tampered\", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus)" - removed
Output schema / properties / deviceTamperStatusRemoved value: -{ - "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", - "type": [ - "string", - "null" - ] -}
- Changed
protect_get_bridge2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_camera22 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - removed
Output schema / properties / featureFlags / additionalPropertiesRemoved value: -{} - added
Output schema / properties / featureFlags / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "hasHdr": { + "description": "Supports HDR (boolean)" + }, + "hasLedStatus": { + "description": "Has a status LED (boolean)" + }, + "hasMic": { + "description": "Has a microphone (boolean)" + }, + "hasSpeaker": { + "description": "Has a speaker (boolean)" + }, + "smartDetectAudioTypes": { + "description": "Supported smart audio-detect types (array of strings)" + }, + "smartDetectTypes": { + "description": "Supported smart object-detect types (array of strings)" + }, + "supportFullHdSnapshot": { + "description": "Supports full-HD snapshot (boolean)" + }, + "videoModes": { + "description": "Supported video modes (array of strings)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / featureFlags / propertiesRemoved value: -{ - "hasHdr": { - "description": "Supports HDR (boolean)" - }, - "hasLedStatus": { - "description": "Has a status LED (boolean)" - }, - "hasMic": { - "description": "Has a microphone (boolean)" - }, - "hasSpeaker": { - "description": "Has a speaker (boolean)" - }, - "smartDetectAudioTypes": { - "description": "Supported smart audio-detect types (array of strings)" - }, - "smartDetectTypes": { - "description": "Supported smart object-detect types (array of strings)" - }, - "supportFullHdSnapshot": { - "description": "Supports full-HD snapshot (boolean)" - }, - "videoModes": { - "description": "Supported video modes (array of strings)" - } -} - removed
Output schema / properties / featureFlags / typeRemoved value: -"object" - removed
Output schema / properties / lcdMessage / additionalPropertiesRemoved value: -{} - added
Output schema / properties / lcdMessage / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "description": "Message text shown on the doorbell LCD", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / lcdMessage / propertiesRemoved value: -{ - "resetAt": { - "description": "Auto-reset timestamp in epoch ms, or null (number|null)" - }, - "text": { - "description": "Message text shown on the doorbell LCD", - "type": [ - "string", - "null" - ] - }, - "type": { - "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"", - "type": [ - "string", - "null" - ] - } -} - removed
Output schema / properties / lcdMessage / typeRemoved value: -"object" - removed
Output schema / properties / ledSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / ledSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "floodLed": { + "description": "Flood LED enabled (boolean)" + }, + "isEnabled": { + "description": "Status LED enabled (boolean)" + }, + "welcomeLed": { + "description": "Welcome LED enabled (boolean)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / ledSettings / propertiesRemoved value: -{ - "floodLed": { - "description": "Flood LED enabled (boolean)" - }, - "isEnabled": { - "description": "Status LED enabled (boolean)" - }, - "welcomeLed": { - "description": "Welcome LED enabled (boolean)" - } -} - removed
Output schema / properties / ledSettings / typeRemoved value: -"object" - removed
Output schema / properties / osdSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / osdSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "isDateEnabled": { + "description": "Overlay date (boolean)" + }, + "isDebugEnabled": { + "description": "Overlay debug info (boolean)" + }, + "isLogoEnabled": { + "description": "Overlay logo (boolean)" + }, + "isNameEnabled": { + "description": "Overlay camera name (boolean)" + }, + "overlayLocation": { + "description": "OSD position, e.g. \"topLeft\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / osdSettings / propertiesRemoved value: -{ - "isDateEnabled": { - "description": "Overlay date (boolean)" - }, - "isDebugEnabled": { - "description": "Overlay debug info (boolean)" - }, - "isLogoEnabled": { - "description": "Overlay logo (boolean)" - }, - "isNameEnabled": { - "description": "Overlay camera name (boolean)" - }, - "overlayLocation": { - "description": "OSD position, e.g. \"topLeft\"", - "type": [ - "string", - "null" - ] - } -} - removed
Output schema / properties / osdSettings / typeRemoved value: -"object" - removed
Output schema / properties / smartDetectSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / smartDetectSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "audioTypes": { + "description": "Enabled audio-detect types (array of strings)" + }, + "objectTypes": { + "description": "Enabled object-detect types (array of strings)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / smartDetectSettings / propertiesRemoved value: -{ - "audioTypes": { - "description": "Enabled audio-detect types (array of strings)" - }, - "objectTypes": { - "description": "Enabled object-detect types (array of strings)" - } -} - removed
Output schema / properties / smartDetectSettings / typeRemoved value: -"object"
- Changed
protect_get_chime2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_fob6 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / featureFlags / descriptionPrevious value: -"Feature flags (object: buttons[])"New value: +"Feature flags (object: buttons[], hasKeypad — hasKeypad added in 7.3.x)" - removed
Output schema / properties / hasKeypadRemoved value: -{ - "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" -} - changed
Output schema / properties / keypadSettings / descriptionPrevious value: -"Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)"New value: +"Keypad config, added in 7.3.x (object: beepEnabled, beepVolume). The backlightEnabled/backlightBrightness fields were dropped in 7.3.70." - changed
Output schema / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)"
- Changed
protect_get_info1 field changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_light2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_link_station4 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / alarmHub / descriptionPrevious value: -"Alarm hub status (object: armed, battery, connector, cover, output, input, …)"New value: +"Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. \"tampered\", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus)" - removed
Output schema / properties / deviceTamperStatusRemoved value: -{ - "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", - "type": [ - "string", - "null" - ] -}
- Changed
protect_get_liveview5 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / slots / anyOfAdded value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "cameras": { + "description": "Camera IDs shown in this slot (array of strings)" + }, + "cycleInterval": { + "description": "Cycle interval in seconds (number)" + }, + "cycleMode": { + "description": "Slot cycle mode, e.g. \"time\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / slots / itemsRemoved value: -{ - "additionalProperties": {}, - "properties": { - "cameras": { - "description": "Camera IDs shown in this slot (array of strings)" - }, - "cycleInterval": { - "description": "Cycle interval in seconds (number)" - }, - "cycleMode": { - "description": "Slot cycle mode, e.g. \"time\"", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -} - removed
Output schema / properties / slots / typeRemoved value: -"array"
- Changed
protect_get_relay5 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / inputs / descriptionPrevious value: -"Input channels (array of objects)"New value: +"Input channels (array of objects: id, name, state, actionTrigger, actionType, actionOutputId)" - changed
Output schema / properties / outputs / descriptionPrevious value: -"Output channels (array of objects)"New value: +"Output channels (array of objects: id, name, type, delay, pulseDuration, state, rebootState). `id` is the outputId for protect_activate_relay_output" - changed
Output schema / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)"
- Changed
protect_get_rtsp_streams2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_sensor10 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / glassBreakSettings / descriptionPrevious value: -"Glass-break detection settings (object)"New value: +"Glass-break detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed)" - changed
Output schema / properties / humiditySettings / descriptionPrevious value: -"Humidity threshold settings (object)"New value: +"Humidity threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / leakSettings / descriptionPrevious value: -"Leak detection settings (object)"New value: +"Leak detection settings, read-only (object: isInternalEnabled, isExternalEnabled)" - changed
Output schema / properties / lightSettings / descriptionPrevious value: -"Light threshold settings (object)"New value: +"Light threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / motionSettings / descriptionPrevious value: -"Motion detection settings (object)"New value: +"Motion detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed)" - changed
Output schema / properties / stats / descriptionPrevious value: -"Environmental stats (object: light, humidity, temperature)"New value: +"Environmental stats (object: light, humidity, temperature — each { value, status })" - changed
Output schema / properties / temperatureSettings / descriptionPrevious value: -"Temperature threshold settings (object)"New value: +"Temperature threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object: signalState, batteryStatus, bridge)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)"
- Changed
protect_get_siren3 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)"
- Changed
protect_get_snapshot2 fields changed- changed
Input schema / properties / highQuality / descriptionPrevious value: -"If true, request a high-quality snapshot"New value: +"If true, force a 1080p-or-higher resolution snapshot" - added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$"
- Changed
protect_get_speaker2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_ulp_user3 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / email / descriptionPrevious value: -"Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)"New value: +"Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.70)"
- Changed
protect_get_user2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_get_viewer2 fields changed- added
Input schema / properties / id / patternAdded value: +"^[A-Za-z0-9_-]{1,64}$" - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
protect_list_alarm_hubs8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / alarmHub / descriptionPrevious value: -"Alarm hub status (object: armed, battery, connector, cover, output, input, …)"New value: +"Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. \"tampered\", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus)" - removed
Output schema / properties / result / items / properties / deviceTamperStatusRemoved value: -{ - "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_arm_profiles6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_bridges6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_cameras26 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - removed
Output schema / properties / result / items / properties / featureFlags / additionalPropertiesRemoved value: -{} - added
Output schema / properties / result / items / properties / featureFlags / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "hasHdr": { + "description": "Supports HDR (boolean)" + }, + "hasLedStatus": { + "description": "Has a status LED (boolean)" + }, + "hasMic": { + "description": "Has a microphone (boolean)" + }, + "hasSpeaker": { + "description": "Has a speaker (boolean)" + }, + "smartDetectAudioTypes": { + "description": "Supported smart audio-detect types (array of strings)" + }, + "smartDetectTypes": { + "description": "Supported smart object-detect types (array of strings)" + }, + "supportFullHdSnapshot": { + "description": "Supports full-HD snapshot (boolean)" + }, + "videoModes": { + "description": "Supported video modes (array of strings)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / featureFlags / propertiesRemoved value: -{ - "hasHdr": { - "description": "Supports HDR (boolean)" - }, - "hasLedStatus": { - "description": "Has a status LED (boolean)" - }, - "hasMic": { - "description": "Has a microphone (boolean)" - }, - "hasSpeaker": { - "description": "Has a speaker (boolean)" - }, - "smartDetectAudioTypes": { - "description": "Supported smart audio-detect types (array of strings)" - }, - "smartDetectTypes": { - "description": "Supported smart object-detect types (array of strings)" - }, - "supportFullHdSnapshot": { - "description": "Supports full-HD snapshot (boolean)" - }, - "videoModes": { - "description": "Supported video modes (array of strings)" - } -} - removed
Output schema / properties / result / items / properties / featureFlags / typeRemoved value: -"object" - removed
Output schema / properties / result / items / properties / lcdMessage / additionalPropertiesRemoved value: -{} - added
Output schema / properties / result / items / properties / lcdMessage / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "description": "Message text shown on the doorbell LCD", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / lcdMessage / propertiesRemoved value: -{ - "resetAt": { - "description": "Auto-reset timestamp in epoch ms, or null (number|null)" - }, - "text": { - "description": "Message text shown on the doorbell LCD", - "type": [ - "string", - "null" - ] - }, - "type": { - "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"", - "type": [ - "string", - "null" - ] - } -} - removed
Output schema / properties / result / items / properties / lcdMessage / typeRemoved value: -"object" - removed
Output schema / properties / result / items / properties / ledSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / result / items / properties / ledSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "floodLed": { + "description": "Flood LED enabled (boolean)" + }, + "isEnabled": { + "description": "Status LED enabled (boolean)" + }, + "welcomeLed": { + "description": "Welcome LED enabled (boolean)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / ledSettings / propertiesRemoved value: -{ - "floodLed": { - "description": "Flood LED enabled (boolean)" - }, - "isEnabled": { - "description": "Status LED enabled (boolean)" - }, - "welcomeLed": { - "description": "Welcome LED enabled (boolean)" - } -} - removed
Output schema / properties / result / items / properties / ledSettings / typeRemoved value: -"object" - removed
Output schema / properties / result / items / properties / osdSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / result / items / properties / osdSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "isDateEnabled": { + "description": "Overlay date (boolean)" + }, + "isDebugEnabled": { + "description": "Overlay debug info (boolean)" + }, + "isLogoEnabled": { + "description": "Overlay logo (boolean)" + }, + "isNameEnabled": { + "description": "Overlay camera name (boolean)" + }, + "overlayLocation": { + "description": "OSD position, e.g. \"topLeft\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / osdSettings / propertiesRemoved value: -{ - "isDateEnabled": { - "description": "Overlay date (boolean)" - }, - "isDebugEnabled": { - "description": "Overlay debug info (boolean)" - }, - "isLogoEnabled": { - "description": "Overlay logo (boolean)" - }, - "isNameEnabled": { - "description": "Overlay camera name (boolean)" - }, - "overlayLocation": { - "description": "OSD position, e.g. \"topLeft\"", - "type": [ - "string", - "null" - ] - } -} - removed
Output schema / properties / result / items / properties / osdSettings / typeRemoved value: -"object" - removed
Output schema / properties / result / items / properties / smartDetectSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / result / items / properties / smartDetectSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "audioTypes": { + "description": "Enabled audio-detect types (array of strings)" + }, + "objectTypes": { + "description": "Enabled object-detect types (array of strings)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / smartDetectSettings / propertiesRemoved value: -{ - "audioTypes": { - "description": "Enabled audio-detect types (array of strings)" - }, - "objectTypes": { - "description": "Enabled object-detect types (array of strings)" - } -} - removed
Output schema / properties / result / items / properties / smartDetectSettings / typeRemoved value: -"object" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_chimes6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_files13 fields changed- added
Input schema / properties / fileType / constAdded value: +"animations" - changed
Input schema / properties / fileType / descriptionPrevious value: -"File type to list (only 'animations' is currently supported)"New value: +"Asset file type (only 'animations' is supported)" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / result / items / properties / createdAtAdded value: +{ + "description": "Creation time (ISO 8601)", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / idAdded value: +{ + "description": "File ID (same value as name)", + "type": "string" +} - added
Output schema / properties / result / items / properties / metadataAdded value: +{ + "description": "Asset metadata (object, empty in observed records)" +} - changed
Output schema / properties / result / items / properties / originalName / descriptionPrevious value: -"Original uploaded file name"New value: +"Uploaded file name; Protect appends the stored extension, e.g. \"welcome.gif.png\"" - added
Output schema / properties / result / items / properties / sizeAdded value: +{ + "description": "File size in bytes (number)" +} - added
Output schema / properties / result / items / properties / updatedAtAdded value: +{ + "description": "Last update time (ISO 8601)", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_fobs10 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / featureFlags / descriptionPrevious value: -"Feature flags (object: buttons[])"New value: +"Feature flags (object: buttons[], hasKeypad — hasKeypad added in 7.3.x)" - removed
Output schema / properties / result / items / properties / hasKeypadRemoved value: -{ - "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" -} - changed
Output schema / properties / result / items / properties / keypadSettings / descriptionPrevious value: -"Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)"New value: +"Keypad config, added in 7.3.x (object: beepEnabled, beepVolume). The backlightEnabled/backlightBrightness fields were dropped in 7.3.70." - changed
Output schema / properties / result / items / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_lights6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_link_stations8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / alarmHub / descriptionPrevious value: -"Alarm hub status (object: armed, battery, connector, cover, output, input, …)"New value: +"Alarm hub status (object: armed, battery, buckboost, connector, cover, deviceTamperStatus (e.g. \"tampered\", added in 7.3.x), currentMeterChannelStatus, currentMeterStatus, inputPower, poeout, powerMeter, output and input (maps keyed by channel), inputTerminalStatus, outputTerminalStatus, emergencyTerminalStatus, auxiliaryPowerTerminalStatus)" - removed
Output schema / properties / result / items / properties / deviceTamperStatusRemoved value: -{ - "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", - "type": [ - "string", - "null" - ] -} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_liveviews9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / result / items / properties / slots / anyOfAdded value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "cameras": { + "description": "Camera IDs shown in this slot (array of strings)" + }, + "cycleInterval": { + "description": "Cycle interval in seconds (number)" + }, + "cycleMode": { + "description": "Slot cycle mode, e.g. \"time\"", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - removed
Output schema / properties / result / items / properties / slots / itemsRemoved value: -{ - "additionalProperties": {}, - "properties": { - "cameras": { - "description": "Camera IDs shown in this slot (array of strings)" - }, - "cycleInterval": { - "description": "Cycle interval in seconds (number)" - }, - "cycleMode": { - "description": "Slot cycle mode, e.g. \"time\"", - "type": [ - "string", - "null" - ] - } - }, - "type": "object" -} - removed
Output schema / properties / result / items / properties / slots / typeRemoved value: -"array" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_nvrs9 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - removed
Output schema / properties / armMode / additionalPropertiesRemoved value: -{} - added
Output schema / properties / armMode / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "armProfileId": { + "description": "Active arm profile ID (present when arming/armed)", + "type": [ + "string", + "null" + ] + }, + "armedAt": { + "description": "Unix epoch ms when armed, or null (number|null)" + }, + "breachDetectedAt": { + "description": "Unix epoch ms of last breach, or null" + }, + "breachEventCount": { + "description": "Count of breach events (number)" + }, + "breachEventId": { + "description": "Breach event ID, or null (string|null)" + }, + "breachTriggerEventId": { + "description": "Triggering event ID, or null (string|null)" + }, + "status": { + "description": "disabled | arming | armed | ...", + "type": [ + "string", + "null" + ] + }, + "willBeArmedAt": { + "description": "Scheduled arm time, or null (number|null)" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / armMode / propertiesRemoved value: -{ - "armProfileId": { - "description": "Active arm profile ID (present when arming/armed)", - "type": [ - "string", - "null" - ] - }, - "armedAt": { - "description": "Unix epoch ms when armed, or null (number|null)" - }, - "breachDetectedAt": { - "description": "Unix epoch ms of last breach, or null" - }, - "breachEventCount": { - "description": "Count of breach events (number)" - }, - "breachEventId": { - "description": "Breach event ID, or null (string|null)" - }, - "breachTriggerEventId": { - "description": "Triggering event ID, or null (string|null)" - }, - "status": { - "description": "disabled | arming | armed | ...", - "type": [ - "string", - "null" - ] - }, - "willBeArmedAt": { - "description": "Scheduled arm time, or null (number|null)" - } -} - removed
Output schema / properties / armMode / typeRemoved value: -"object" - removed
Output schema / properties / doorbellSettings / additionalPropertiesRemoved value: -{} - added
Output schema / properties / doorbellSettings / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "customImages": { + "description": "Configured custom LCD images (array of objects: preview, sprite)" + }, + "customMessages": { + "description": "Configured custom LCD messages (array of strings)" + }, + "defaultMessageResetTimeoutMs": { + "description": "Reset timeout in ms (number)" + }, + "defaultMessageText": { + "description": "Default doorbell LCD message", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / doorbellSettings / propertiesRemoved value: -{ - "customImages": { - "description": "Configured custom LCD images (array)" - }, - "customMessages": { - "description": "Configured custom LCD messages (array of strings)" - }, - "defaultMessageResetTimeoutMs": { - "description": "Reset timeout in ms (number)" - }, - "defaultMessageText": { - "description": "Default doorbell LCD message", - "type": [ - "string", - "null" - ] - } -} - removed
Output schema / properties / doorbellSettings / typeRemoved value: -"object"
- Changed
protect_list_relays9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / inputs / descriptionPrevious value: -"Input channels (array of objects)"New value: +"Input channels (array of objects: id, name, state, actionTrigger, actionType, actionOutputId)" - changed
Output schema / properties / result / items / properties / outputs / descriptionPrevious value: -"Output channels (array of objects)"New value: +"Output channels (array of objects: id, name, type, delay, pulseDuration, state, rebootState). `id` is the outputId for protect_activate_relay_output" - changed
Output schema / properties / result / items / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_sensors14 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / glassBreakSettings / descriptionPrevious value: -"Glass-break detection settings (object)"New value: +"Glass-break detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed)" - changed
Output schema / properties / result / items / properties / humiditySettings / descriptionPrevious value: -"Humidity threshold settings (object)"New value: +"Humidity threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / result / items / properties / leakSettings / descriptionPrevious value: -"Leak detection settings (object)"New value: +"Leak detection settings, read-only (object: isInternalEnabled, isExternalEnabled)" - changed
Output schema / properties / result / items / properties / lightSettings / descriptionPrevious value: -"Light threshold settings (object)"New value: +"Light threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / result / items / properties / motionSettings / descriptionPrevious value: -"Motion detection settings (object)"New value: +"Motion detection settings (object: isEnabled, sensitivity, sensitivityWhenArmed)" - changed
Output schema / properties / result / items / properties / stats / descriptionPrevious value: -"Environmental stats (object: light, humidity, temperature)"New value: +"Environmental stats (object: light, humidity, temperature — each { value, status })" - changed
Output schema / properties / result / items / properties / temperatureSettings / descriptionPrevious value: -"Temperature threshold settings (object)"New value: +"Temperature threshold settings (object: isEnabled, margin, lowThreshold, highThreshold)" - changed
Output schema / properties / result / items / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object: signalState, batteryStatus, bridge)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_sirens7 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / wirelessConnectionState / descriptionPrevious value: -"Wireless link state (object)"New value: +"Wireless link state (object: signalState { signalQuality, signalStrength }, batteryStatus { percentage, isLow }, bridge)" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_speakers6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_ulp_users7 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / result / items / properties / email / descriptionPrevious value: -"Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)"New value: +"Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.70)" - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_users6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_list_viewers6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / limitAdded value: +{ + "description": "Return at most this many items", + "maximum": 9007199254740991, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many items first (default 0)", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / offsetAdded value: +{ + "description": "Paged results only: the index of the first item returned", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Paged results only: the number of items in the whole list", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
protect_subscribe_devices3 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / duration / descriptionPrevious value: -"Actual listen duration in seconds (number)"New value: +"Seconds actually spent listening, to 0.1s (number); shorter than requested when the message cap or an error ends the listen early" - added
Output schema / properties / truncatedAdded value: +{ + "description": "true when listening stopped early at the message cap (boolean, absent otherwise)" +}
- Changed
protect_subscribe_events3 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / duration / descriptionPrevious value: -"Actual listen duration in seconds (number)"New value: +"Seconds actually spent listening, to 0.1s (number); shorter than requested when the message cap or an error ends the listen early" - added
Output schema / properties / truncatedAdded value: +{ + "description": "true when listening stopped early at the message cap (boolean, absent otherwise)" +}
27 tool updates
v2.13.0- Changed
protect_get_alarm_hub4 fields changed- added
Output schema / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_bridge2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_camera2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_chime2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_fob5 fields changed- added
Output schema / properties / armControlSettingsAdded value: +{ + "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)" +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / hasKeypadAdded value: +{ + "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" +} - added
Output schema / properties / keypadSettingsAdded value: +{ + "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_light2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_link_station4 fields changed- added
Output schema / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_relay2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_sensor3 fields changed- added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })" +} - added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_siren2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_speaker2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_ulp_user1 field changed- added
Output schema / properties / emailAdded value: +{ + "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)", + "type": [ + "string", + "null" + ] +}
- Changed
protect_get_viewer2 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_alarm_hubs4 fields changed- added
Output schema / properties / result / items / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_bridges2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_cameras2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_chimes2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_fobs5 fields changed- added
Output schema / properties / result / items / properties / armControlSettingsAdded value: +{ + "description": "Arm-control config, added in 7.3.x (object: enabled, armProfileId, nightProfileId)" +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / hasKeypadAdded value: +{ + "description": "Whether this fob has a keypad, added in 7.3.x (boolean)" +} - added
Output schema / properties / result / items / properties / keypadSettingsAdded value: +{ + "description": "Keypad config, added in 7.3.x (object: beepEnabled, beepVolume, backlightEnabled, backlightBrightness)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_lights2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_link_stations4 fields changed- added
Output schema / properties / result / items / properties / deviceTamperStatusAdded value: +{ + "description": "Tamper status, added in 7.3.x, e.g. \"tampered\"", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / threadStateAdded value: +{ + "description": "Thread radio state, added in 7.3.x (object: network — status, role, networkName, channel, panId, extendedPanId, joinedDeviceCount, errorReason, lastUpdatedAt)" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_nvrs3 fields changed- added
Output schema / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / macAdded value: +{ + "description": "MAC address, added in 7.3.x", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_relays2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_sensors3 fields changed- added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Sensor capability flags, added in 7.3.x (object: temperature, humidity, light, motion, waterLeak, open, tamper, smoke — each { channelCount })" +} - added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_sirens2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_speakers2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_ulp_users1 field changed- added
Output schema / properties / result / items / properties / emailAdded value: +{ + "description": "Email address, added in 7.3.x. Empty string for service accounts (verified live 7.3.47)", + "type": [ + "string", + "null" + ] +}
- Changed
protect_list_viewers2 fields changed- added
Output schema / properties / result / items / properties / guidAdded value: +{ + "description": "Hardware MODEL GUID, shared by every unit of the same model. NOT a per-device identifier — use `id` to identify a device.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "description": "Hardware model name, e.g. \"UVC G6 Turret\", \"UP Chime PoE\", \"UNVR-PRO\"", + "type": [ + "string", + "null" + ] +}
37 tool updates
v2.11.5- Changed
protect_get_alarm_hub8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_bridge10 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / platform / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / platform / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_camera18 fields changed- removed
Output schema / properties / hdrType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / hdrType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lcdMessage / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lcdMessage / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lcdMessage / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lcdMessage / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / osdSettings / properties / overlayLocation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / osdSettings / properties / overlayLocation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / videoMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / videoMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_chime8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_fob12 fields changed- removed
Output schema / properties / awayState / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / awayState / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / buttonLabels / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / buttonLabels / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_info2 fields changed- removed
Output schema / properties / applicationVersion / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / applicationVersion / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_light10 fields changed- removed
Output schema / properties / camera / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / camera / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_link_station8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_liveview8 fields changed- removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / owner / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / owner / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / slots / items / properties / cycleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / slots / items / properties / cycleMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_relay8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_rtsp_streams8 fields changed- removed
Output schema / properties / high / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / high / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / low / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / low / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / medium / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / medium / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / package / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / package / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_sensor12 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mountType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mountType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / scheduleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / scheduleMode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_siren10 fields changed- removed
Output schema / properties / connectionType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / connectionType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_speaker8 fields changed- removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_ulp_user10 fields changed- removed
Output schema / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / fullName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / fullName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_user12 fields changed- removed
Output schema / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / ucoreUserId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / ucoreUserId / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_get_viewer10 fields changed- removed
Output schema / properties / liveview / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / liveview / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_alarm_hubs8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_arm_profiles4 fields changed- removed
Output schema / properties / result / items / properties / creator / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / creator / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_bridges10 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / platform / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / platform / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_cameras18 fields changed- removed
Output schema / properties / result / items / properties / hdrType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / hdrType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lcdMessage / properties / text / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lcdMessage / properties / text / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lcdMessage / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lcdMessage / properties / type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / osdSettings / properties / overlayLocation / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / osdSettings / properties / overlayLocation / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / videoMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / videoMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_chimes8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_files8 fields changed- removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / originalName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / originalName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / path / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / path / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / type / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_fobs12 fields changed- removed
Output schema / properties / result / items / properties / awayState / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / awayState / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / buttonLabels / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / buttonLabels / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_lights10 fields changed- removed
Output schema / properties / result / items / properties / camera / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / camera / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_link_stations8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_liveviews8 fields changed- removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / owner / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / owner / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / slots / items / properties / cycleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / slots / items / properties / cycleMode / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_nvrs10 fields changed- removed
Output schema / properties / armMode / properties / armProfileId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / armMode / properties / armProfileId / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / armMode / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / armMode / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / doorbellSettings / properties / defaultMessageText / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / doorbellSettings / properties / defaultMessageText / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_relays8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_sensors12 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mountType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mountType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / scheduleMode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / scheduleMode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_sirens10 fields changed- removed
Output schema / properties / result / items / properties / connectionType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / connectionType / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_speakers8 fields changed- removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_ulp_users10 fields changed- removed
Output schema / properties / result / items / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / fullName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / fullName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / status / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_users12 fields changed- removed
Output schema / properties / result / items / properties / email / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / email / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / firstName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / firstName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / lastName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / lastName / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / ucoreUserId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / ucoreUserId / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_list_viewers10 fields changed- removed
Output schema / properties / result / items / properties / liveview / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / liveview / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / mac / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / mac / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / modelKey / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / modelKey / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / result / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / result / items / properties / state / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_subscribe_devices2 fields changed- removed
Output schema / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / error / typeAdded value: +[ + "string", + "null" +]
- Changed
protect_subscribe_events2 fields changed- removed
Output schema / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / error / typeAdded value: +[ + "string", + "null" +]
11 tool updates
v2.10.0- Added
protect_get_fob - Added
protect_get_info - Added
protect_get_link_station - Added
protect_get_rtsp_streams - Added
protect_list_arm_profiles - Added
protect_list_chimes - Added
protect_list_fobs - Added
protect_list_link_stations - Added
protect_list_nvrs - Added
protect_list_speakers - Added
protect_list_viewers
11 tool updates
v2.9.0- Removed
protect_get_fob - Removed
protect_get_info - Removed
protect_get_link_station - Removed
protect_get_rtsp_streams - Removed
protect_list_arm_profiles - Removed
protect_list_chimes - Removed
protect_list_fobs - Removed
protect_list_link_stations - Removed
protect_list_nvrs - Removed
protect_list_speakers - Removed
protect_list_viewers
28 tool updates
v2.7.5- Changed
protect_get_alarm_hub4 fields changed- added
Output schema / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_get_bridge3 fields changed- added
Output schema / properties / clientsAdded value: +{ + "description": "Connected client MACs (array of strings)" +} - added
Output schema / properties / maxClientsAdded value: +{ + "description": "Max client capacity (number)" +} - added
Output schema / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Hardware platform, e.g. \"mt7621\"" +}
- Changed
protect_get_camera4 fields changed- added
Output schema / properties / lcdMessage / additionalPropertiesAdded value: +{} - removed
Output schema / properties / lcdMessage / descriptionRemoved value: -"Doorbell LCD message (object; often empty {})" - added
Output schema / properties / lcdMessage / propertiesAdded value: +{ + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message text shown on the doorbell LCD" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"" + } +} - added
Output schema / properties / lcdMessage / typeAdded value: +"object"
- Changed
protect_get_chime2 fields changed- added
Output schema / properties / cameraIdsAdded value: +{ + "description": "Paired camera IDs (array of strings)" +} - added
Output schema / properties / ringSettingsAdded value: +{ + "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)" +}
- Changed
protect_get_fob4 fields changed- added
Output schema / properties / awayStateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Away state, e.g. \"ONLINE\"" +} - added
Output schema / properties / buttonLabelsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Button label preset, e.g. \"securityActions\"" +} - added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: buttons[])" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_light8 fields changed- added
Output schema / properties / cameraAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paired camera ID" +} - added
Output schema / properties / isDarkAdded value: +{ + "description": "Whether it is currently dark out (boolean)" +} - added
Output schema / properties / isLightForceEnabledAdded value: +{ + "description": "Main LED force-enabled (boolean)" +} - added
Output schema / properties / isLightOnAdded value: +{ + "description": "Whether the light is currently on (boolean)" +} - added
Output schema / properties / isPirMotionDetectedAdded value: +{ + "description": "PIR motion currently detected (boolean)" +} - added
Output schema / properties / lastMotionAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / lightDeviceSettingsAdded value: +{ + "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)" +} - added
Output schema / properties / lightModeSettingsAdded value: +{ + "description": "Activation settings (object: mode, enableAt)" +}
- Changed
protect_get_link_station4 fields changed- added
Output schema / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_get_relay4 fields changed- added
Output schema / properties / inputsAdded value: +{ + "description": "Input channels (array of objects)" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / outputsAdded value: +{ + "description": "Output channels (array of objects)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_sensor22 fields changed- added
Output schema / properties / alarmSettingsAdded value: +{ + "description": "Alarm settings (object: isEnabled)" +} - added
Output schema / properties / alarmTriggeredAtAdded value: +{ + "description": "Last alarm timestamp in epoch ms (number)" +} - added
Output schema / properties / armProfileIdsAdded value: +{ + "description": "Arm profile IDs this sensor belongs to (array of strings)" +} - added
Output schema / properties / batteryStatusAdded value: +{ + "description": "Battery status (object: percentage, isLow)" +} - added
Output schema / properties / externalLeakDetectedAtAdded value: +{ + "description": "Last external-leak timestamp in epoch ms (number)" +} - added
Output schema / properties / glassBreakSettingsAdded value: +{ + "description": "Glass-break detection settings (object)" +} - added
Output schema / properties / hasCustomSensitivityWhenArmedAdded value: +{ + "description": "Custom armed sensitivity enabled (boolean)" +} - added
Output schema / properties / humiditySettingsAdded value: +{ + "description": "Humidity threshold settings (object)" +} - added
Output schema / properties / isMotionDetectedAdded value: +{ + "description": "Motion currently detected (boolean)" +} - added
Output schema / properties / isOpenedAdded value: +{ + "description": "Open/close contact state (boolean)" +} - added
Output schema / properties / leakDetectedAtAdded value: +{ + "description": "Last leak timestamp in epoch ms (number)" +} - added
Output schema / properties / leakSettingsAdded value: +{ + "description": "Leak detection settings (object)" +} - added
Output schema / properties / lightSettingsAdded value: +{ + "description": "Light threshold settings (object)" +} - added
Output schema / properties / motionDetectedAtAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / motionSettingsAdded value: +{ + "description": "Motion detection settings (object)" +} - added
Output schema / properties / mountTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Mount type, e.g. \"door\", \"leak\", \"garage\"" +} - added
Output schema / properties / openStatusChangedAtAdded value: +{ + "description": "Open-status change timestamp in epoch ms (number)" +} - added
Output schema / properties / scheduleModeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Schedule mode: \"always\" | \"when_armed\"" +} - added
Output schema / properties / statsAdded value: +{ + "description": "Environmental stats (object: light, humidity, temperature)" +} - added
Output schema / properties / tamperingDetectedAtAdded value: +{ + "description": "Last tampering timestamp in epoch ms (number)" +} - added
Output schema / properties / temperatureSettingsAdded value: +{ + "description": "Temperature threshold settings (object)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object: signalState, batteryStatus, bridge)" +}
- Changed
protect_get_siren5 fields changed- added
Output schema / properties / connectionTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Connection type, e.g. \"lora\"" +} - added
Output schema / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / sirenStatusAdded value: +{ + "description": "Current siren status (object: isActive, activatedAt, duration)" +} - added
Output schema / properties / volumeAdded value: +{ + "description": "Siren volume (number)" +} - added
Output schema / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_get_snapshot1 field changed- added
Input schema / properties / channelAdded value: +{ + "description": "Camera channel to capture. Use \"package\" for cameras with hasPackageCamera=true (defaults to main)", + "enum": [ + "main", + "package" + ], + "type": "string" +}
- Changed
protect_get_speaker5 fields changed- added
Output schema / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: hasMic)" +} - added
Output schema / properties / isMicEnabledAdded value: +{ + "description": "Microphone enabled (boolean)" +} - added
Output schema / properties / micVolumeAdded value: +{ + "description": "Microphone volume (number)" +} - added
Output schema / properties / speakerStateAdded value: +{ + "description": "Speaker state (object: status, mode)" +} - added
Output schema / properties / volumeAdded value: +{ + "description": "Speaker volume (number)" +}
- Changed
protect_get_viewer2 fields changed- added
Output schema / properties / liveviewAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Assigned live view ID, or null" +} - added
Output schema / properties / streamLimitAdded value: +{ + "description": "Max concurrent streams (number)" +}
- Changed
protect_list_alarm_hubs4 fields changed- added
Output schema / properties / result / items / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / result / items / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / result / items / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_list_arm_profiles8 fields changed- added
Output schema / properties / result / items / properties / activationDelayAdded value: +{ + "description": "Activation delay in ms: 0 | 60000 | 300000 | 600000 (number)" +} - added
Output schema / properties / result / items / properties / automationsAdded value: +{ + "description": "Associated automation IDs (array of strings)" +} - added
Output schema / properties / result / items / properties / createdAtAdded value: +{ + "description": "Creation timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / creatorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ID of the user who created the profile" +} - removed
Output schema / properties / result / items / properties / modelKeyRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resource kind" -} - added
Output schema / properties / result / items / properties / recordEverythingAdded value: +{ + "description": "Record everything while active (boolean)" +} - added
Output schema / properties / result / items / properties / schedulesAdded value: +{ + "description": "Arm schedules (array of objects)" +} - added
Output schema / properties / result / items / properties / updatedAtAdded value: +{ + "description": "Last update timestamp in epoch ms (number)" +}
- Changed
protect_list_bridges3 fields changed- added
Output schema / properties / result / items / properties / clientsAdded value: +{ + "description": "Connected client MACs (array of strings)" +} - added
Output schema / properties / result / items / properties / maxClientsAdded value: +{ + "description": "Max client capacity (number)" +} - added
Output schema / properties / result / items / properties / platformAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Hardware platform, e.g. \"mt7621\"" +}
- Changed
protect_list_cameras4 fields changed- added
Output schema / properties / result / items / properties / lcdMessage / additionalPropertiesAdded value: +{} - removed
Output schema / properties / result / items / properties / lcdMessage / descriptionRemoved value: -"Doorbell LCD message (object; often empty {})" - added
Output schema / properties / result / items / properties / lcdMessage / propertiesAdded value: +{ + "resetAt": { + "description": "Auto-reset timestamp in epoch ms, or null (number|null)" + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message text shown on the doorbell LCD" + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Message type, e.g. \"CUSTOM_MESSAGE\", \"LEAVE_PACKAGE_AT_DOOR\", \"DO_NOT_DISTURB\"" + } +} - added
Output schema / properties / result / items / properties / lcdMessage / typeAdded value: +"object"
- Changed
protect_list_chimes2 fields changed- added
Output schema / properties / result / items / properties / cameraIdsAdded value: +{ + "description": "Paired camera IDs (array of strings)" +} - added
Output schema / properties / result / items / properties / ringSettingsAdded value: +{ + "description": "Per-camera ring config (array of objects: cameraId, volume, ringtoneId, repeatTimes)" +}
- Changed
protect_list_files6 fields changed- removed
Output schema / properties / result / items / properties / idRemoved value: -{ - "description": "File ID", - "type": "string" -} - removed
Output schema / properties / result / items / properties / modelKeyRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Resource kind" -} - changed
Output schema / properties / result / items / properties / name / descriptionPrevious value: -"File name"New value: +"Stored file name (server-generated)" - added
Output schema / properties / result / items / properties / originalNameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Original uploaded file name" +} - added
Output schema / properties / result / items / properties / pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Server-side storage path" +} - added
Output schema / properties / result / items / properties / typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Asset file type, e.g. \"animations\"" +}
- Changed
protect_list_fobs4 fields changed- added
Output schema / properties / result / items / properties / awayStateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Away state, e.g. \"ONLINE\"" +} - added
Output schema / properties / result / items / properties / buttonLabelsAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Button label preset, e.g. \"securityActions\"" +} - added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: buttons[])" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_lights8 fields changed- added
Output schema / properties / result / items / properties / cameraAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Paired camera ID" +} - added
Output schema / properties / result / items / properties / isDarkAdded value: +{ + "description": "Whether it is currently dark out (boolean)" +} - added
Output schema / properties / result / items / properties / isLightForceEnabledAdded value: +{ + "description": "Main LED force-enabled (boolean)" +} - added
Output schema / properties / result / items / properties / isLightOnAdded value: +{ + "description": "Whether the light is currently on (boolean)" +} - added
Output schema / properties / result / items / properties / isPirMotionDetectedAdded value: +{ + "description": "PIR motion currently detected (boolean)" +} - added
Output schema / properties / result / items / properties / lastMotionAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / lightDeviceSettingsAdded value: +{ + "description": "Hardware settings (object: isIndicatorEnabled, pirDuration, pirSensitivity, ledLevel)" +} - added
Output schema / properties / result / items / properties / lightModeSettingsAdded value: +{ + "description": "Activation settings (object: mode, enableAt)" +}
- Changed
protect_list_link_stations4 fields changed- added
Output schema / properties / result / items / properties / alarmHubAdded value: +{ + "description": "Alarm hub status (object: armed, battery, connector, cover, output, input, …)" +} - added
Output schema / properties / result / items / properties / isAlarmHubAdded value: +{ + "description": "Whether this device is an alarm hub (boolean)" +} - added
Output schema / properties / result / items / properties / lastEventAdded value: +{ + "description": "Last event timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +}
- Changed
protect_list_nvrs2 fields changed- added
Output schema / properties / armMode / properties / armProfileIdAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Active arm profile ID (present when arming/armed)" +} - changed
Output schema / properties / armMode / properties / status / descriptionPrevious value: -"disabled | armed | ..."New value: +"disabled | arming | armed | ..."
- Changed
protect_list_relays4 fields changed- added
Output schema / properties / result / items / properties / inputsAdded value: +{ + "description": "Input channels (array of objects)" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / outputsAdded value: +{ + "description": "Output channels (array of objects)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_sensors22 fields changed- added
Output schema / properties / result / items / properties / alarmSettingsAdded value: +{ + "description": "Alarm settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / alarmTriggeredAtAdded value: +{ + "description": "Last alarm timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / armProfileIdsAdded value: +{ + "description": "Arm profile IDs this sensor belongs to (array of strings)" +} - added
Output schema / properties / result / items / properties / batteryStatusAdded value: +{ + "description": "Battery status (object: percentage, isLow)" +} - added
Output schema / properties / result / items / properties / externalLeakDetectedAtAdded value: +{ + "description": "Last external-leak timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / glassBreakSettingsAdded value: +{ + "description": "Glass-break detection settings (object)" +} - added
Output schema / properties / result / items / properties / hasCustomSensitivityWhenArmedAdded value: +{ + "description": "Custom armed sensitivity enabled (boolean)" +} - added
Output schema / properties / result / items / properties / humiditySettingsAdded value: +{ + "description": "Humidity threshold settings (object)" +} - added
Output schema / properties / result / items / properties / isMotionDetectedAdded value: +{ + "description": "Motion currently detected (boolean)" +} - added
Output schema / properties / result / items / properties / isOpenedAdded value: +{ + "description": "Open/close contact state (boolean)" +} - added
Output schema / properties / result / items / properties / leakDetectedAtAdded value: +{ + "description": "Last leak timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / leakSettingsAdded value: +{ + "description": "Leak detection settings (object)" +} - added
Output schema / properties / result / items / properties / lightSettingsAdded value: +{ + "description": "Light threshold settings (object)" +} - added
Output schema / properties / result / items / properties / motionDetectedAtAdded value: +{ + "description": "Last motion timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / motionSettingsAdded value: +{ + "description": "Motion detection settings (object)" +} - added
Output schema / properties / result / items / properties / mountTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Mount type, e.g. \"door\", \"leak\", \"garage\"" +} - added
Output schema / properties / result / items / properties / openStatusChangedAtAdded value: +{ + "description": "Open-status change timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / scheduleModeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Schedule mode: \"always\" | \"when_armed\"" +} - added
Output schema / properties / result / items / properties / statsAdded value: +{ + "description": "Environmental stats (object: light, humidity, temperature)" +} - added
Output schema / properties / result / items / properties / tamperingDetectedAtAdded value: +{ + "description": "Last tampering timestamp in epoch ms (number)" +} - added
Output schema / properties / result / items / properties / temperatureSettingsAdded value: +{ + "description": "Temperature threshold settings (object)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object: signalState, batteryStatus, bridge)" +}
- Changed
protect_list_sirens5 fields changed- added
Output schema / properties / result / items / properties / connectionTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Connection type, e.g. \"lora\"" +} - added
Output schema / properties / result / items / properties / ledSettingsAdded value: +{ + "description": "LED settings (object: isEnabled)" +} - added
Output schema / properties / result / items / properties / sirenStatusAdded value: +{ + "description": "Current siren status (object: isActive, activatedAt, duration)" +} - added
Output schema / properties / result / items / properties / volumeAdded value: +{ + "description": "Siren volume (number)" +} - added
Output schema / properties / result / items / properties / wirelessConnectionStateAdded value: +{ + "description": "Wireless link state (object)" +}
- Changed
protect_list_speakers5 fields changed- added
Output schema / properties / result / items / properties / featureFlagsAdded value: +{ + "description": "Feature flags (object: hasMic)" +} - added
Output schema / properties / result / items / properties / isMicEnabledAdded value: +{ + "description": "Microphone enabled (boolean)" +} - added
Output schema / properties / result / items / properties / micVolumeAdded value: +{ + "description": "Microphone volume (number)" +} - added
Output schema / properties / result / items / properties / speakerStateAdded value: +{ + "description": "Speaker state (object: status, mode)" +} - added
Output schema / properties / result / items / properties / volumeAdded value: +{ + "description": "Speaker volume (number)" +}
- Changed
protect_list_viewers2 fields changed- added
Output schema / properties / result / items / properties / liveviewAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Assigned live view ID, or null" +} - added
Output schema / properties / result / items / properties / streamLimitAdded value: +{ + "description": "Max concurrent streams (number)" +}
38 tool updates
v2.7.4- First observed
protect_get_alarm_hub - First observed
protect_get_bridge - First observed
protect_get_camera - First observed
protect_get_chime - First observed
protect_get_fob - First observed
protect_get_info - First observed
protect_get_light - First observed
protect_get_link_station - First observed
protect_get_liveview - First observed
protect_get_relay - First observed
protect_get_rtsp_streams - First observed
protect_get_sensor - First observed
protect_get_siren - First observed
protect_get_snapshot - First observed
protect_get_speaker - First observed
protect_get_ulp_user - First observed
protect_get_user - First observed
protect_get_viewer - First observed
protect_list_alarm_hubs - First observed
protect_list_arm_profiles - First observed
protect_list_bridges - First observed
protect_list_cameras - First observed
protect_list_chimes - First observed
protect_list_files - First observed
protect_list_fobs - First observed
protect_list_lights - First observed
protect_list_link_stations - First observed
protect_list_liveviews - First observed
protect_list_nvrs - First observed
protect_list_relays - First observed
protect_list_sensors - First observed
protect_list_sirens - First observed
protect_list_speakers - First observed
protect_list_ulp_users - First observed
protect_list_users - First observed
protect_list_viewers - First observed
protect_subscribe_devices - First observed
protect_subscribe_events
TDQS
Scored across 38 tools
Most tools are cleanly separated: every device family has a distinct list_* vs get_* pair distinguished by verb, and snapshot/rtsp/subscribe are clearly unique. The only real overlap is protect_list_link_stations vs protect_list_alarm_hubs, which return the same modelKey ('linkstation') and nearly identical field sets, though the descriptions explicitly disambiguate.
Every tool uses the same protect_ prefix followed by a consistent verb_noun pattern (list_*, get_*, subscribe_*), with no camelCase or mixed-style deviations. Naming is highly predictable across all 38 tools.
38 tools is heavy, driven by 13 device families each carrying both a list_* and a get_* variant. The get_* tools add little since their descriptions admit they return the same field set as the list entries, so several tools are near-redundant even if the underlying domain is large.
The surface is read-only (list/get/snapshot/rtsp), with no create/update/delete/arm operations even though descriptions reference a PATCH for liveviews. Worse, two referenced tools are absent from the set (protect_create_rtsp_stream and protect_activate_relay_output), which will cause agent failures when followed.
Maintenance
Related MCP Connectors
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Universal AI API Orchestrator — 1,554 tools, 96 services. One install.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceExposes the UniFi Network Integration API as MCP tools, dynamically loaded from JSON manifests, with read-only mode by default.MIT
- AlicenseBqualityDmaintenanceProvides 170+ tools to manage UniFi networks via the internal controller API, enabling AI assistants to perform full network management including clients, devices, WLANs, firewall, and more.64MIT
- AlicenseBqualityBmaintenanceExposes the Firewalla MSP API as tools for Claude Code and other MCP clients, enabling natural-language management of Firewalla boxes, alarms, rules, devices, flows, target lists, and trends with full read/write capabilities.19MIT
- FlicenseNot gradedqualityCmaintenanceEnables read-only querying of a UniFi fleet via the Site Manager API and per-console connector proxy, allowing users to list hosts, sites, devices, ISP metrics, and live network clients through Claude.-