Skip to main content
Glama

UniFi MCP Server

mcp-name: io.github.mikeholownych/unifi-mcp

CI unifi-mcp MCP server Smithery

An MCP (Model Context Protocol) server that provides AI assistants like Claude with access to UniFi Network and Protect infrastructure management and analysis capabilities. It uses the native MCP SDK 2 MCPServer API (not FastMCP 3) and communicates over stdio by default.

Credits: This project started as a fork of gbassaragh/Unifi-mcp and has since evolved into a fully independent project. Thanks to @gbassaragh for the excellent starting point.

Improvements Over Upstream

  • Fixed local session authentication routing — in UNIFI_MODE=local, requests now correctly use the traditional controller API (/proxy/network) with cookie + CSRF session auth. Upstream always routed through the Integration API regardless of mode.

  • Mode-aware base URL resolutionapi_base_url now respects the configured auth mode instead of unconditionally returning the Integration API endpoint.

  • Expanded test suite — 250+ passing tests covering configuration, MCP compatibility, runtime persistence, network client behavior, server tool registration, and Protect integrations.

Related MCP server: UniFi MCP Server

Features

UniFi Network

  • Device Management: List, restart, locate, and upgrade UniFi devices (APs, switches, routers)

  • Client Management: Monitor connected clients, block/unblock, view traffic statistics

  • Site Management: View site health, network configurations, VLANs, and wireless settings

  • Statistics & Monitoring: Events, alarms, speed tests, and DPI statistics

  • AI-Powered Insights: Network analysis, optimization recommendations, and troubleshooting

UniFi Protect

  • Camera Management: List cameras, view status, get live snapshots

  • System Monitoring: NVR status, camera health summaries

  • Accessories: Manage lights, sensors, chimes, and viewers

  • Liveviews: Access configured camera view layouts

Multi-Device Support

  • Configure multiple UniFi devices (gateways, NVRs, etc.)

  • Target specific devices by name — all network and Protect tools accept an optional device parameter

  • Per-device API keys: each configured device authenticates with its own key

  • Mix of Network and Protect services across devices

Events and Safe Automation

  • Normalize and durably deduplicate Network and Protect events in optional SQLite storage

  • Poll each configured source independently and report unsupported capabilities explicitly

  • Run only built-in interval jobs: poll_events, retry_webhook_deliveries, capture_observations, and prune_runtime_data

  • Deliver filtered, signed HTTPS webhooks with bounded retries and dead-letter state

  • Keep persistence, background automation, and private webhook destinations disabled by default

Authentication Modes

Mode

Auth

Best for

local_api_key

Integration API key

Recommended default; broad read access

local

Username/password session

Full feature access: firewall rules, WLAN configs, site settings, events, alarms, DPI

cloud

api.ui.com key

Remote/cloud-managed controllers

When API keys are used (Integration API), a subset of controller features is only available via legacy session auth (UNIFI_MODE=local): network events, alarms, DPI statistics, speed tests, WLAN configs, firewall rules, port profiles, and routing tables. Tools for these features return a clear error explaining how to enable them rather than failing silently. Insight tools degrade gracefully and report data limitations.

Note on local accounts: SSO/Ubiquiti-account admins protected by MFA cannot complete session login. Create a local admin on your console (Restrict to Local Access Only) for UNIFI_MODE=local.

Agent Skills

Bundled skills (in skills/) teach agents proven workflows for this server — including controller-specific gotchas (Network 10 removed endpoints, zone-pair rules, WPA3 transition).

Full documentation: See SKILLS.md for usage guide, expected results, troubleshooting, and how to request new functionality.

Quick reference

Skill

Type

Purpose

unifi-network-audit

read-only

Full site audit: devices, clients, WiFi posture, firewall, structured report

unifi-troubleshoot-client

read-only

Diagnose a misbehaving device: RF, roaming, blocking, IP layer

unifi-wifi-optimize

write-gated

Channel plan, widths, WPA3 transition, band steering — approval-gated

unifi-grant-device-access

write-gated

Give a device a reserved IP + scoped zone-firewall access

unifi-internet-down

read-only triage

"Internet is dead!" — plain-English outage diagnosis, ISP escalation script

unifi-whos-home

read-only

"Who's on my WiFi?" — friendly inventory, intruder checks with randomized-MAC awareness

unifi-setup-new-device

write-gated

Get any new gadget online: pairing pitfalls (2.4GHz/WPA3), naming, IP reservation

unifi-dns-triage

read-only

"Site won't load but ping works" — resolution vs connectivity split, forced-internal-DNS patterns

unifi-mdns-discovery

read-only+

AirPrint/Cast broken across VLANs — mDNS reflection, IGMP/IPTV cautions

unifi-port-forwarding

write-gated

Self-hosted service exposure incl. hairpin NAT, CGNAT detection, zone-policy pairing

unifi-vpn

write-gated

WireGuard/Teleport setup + failure ladder (handshake/MTU/zone-policies)

unifi-firmware-campaign

write-gated

Staged firmware updates: snapshot, canary, verify, stuck-device ladder

unifi-mesh-backhaul

read-only

Slow far-room WiFi: wireless-uplink/hop diagnosis, wired-backhaul guidance

unifi-ids-ips-triage

read-only+

Threat alerts: false-positive vs real, suppression, IPS throughput cost

unifi-backup-migration

write-gated

What backups contain, migration rules of thumb, pre-migration snapshots

unifi-network-map

doc-writer

Persistent labeled topology (zones/VLANs/deps) that sharpens every other skill

How skills work

Just describe your problem naturally — the agent matches your request to the right skill and follows its workflow:

  • "My internet is down"unifi-internet-down diagnoses WAN, modem, gateway

  • "Who's on my WiFi?"unifi-whos-home lists devices, flags unknowns

  • "Audit my network"unifi-network-audit produces a full health report

  • "Set up my new TV"unifi-setup-new-device guides WiFi pairing

Write-gated skills (marked above) modify your network — they always ask approval before applying changes.

Skills for non-technical users avoid jargon, translate every technical term, and require confirmation before disruptive actions.

Install (per project): copy into .claude/skills/:

git clone https://github.com/mikeholownych/unifi-mcp.git
mkdir -p .claude/skills && cp -r unifi-mcp/skills/* .claude/skills/

See SKILLS.md for full usage guide, expected results, troubleshooting, and how to request new functionality.

Skills reference MCP tools by their plain names (get_firewall_policies, …); your MCP client prefixes them automatically.

Supported Hardware

  • UniFi Dream Machine (UDM, UDM-Pro, UDM-SE)

  • UniFi Cloud Gateway (UCG-Ultra, UCG-Fiber)

  • UniFi Network Video Recorder (UNVR, UNVR-Pro)

  • UniFi Network Application (self-hosted)

  • Traditional Cloud Key (Gen1, Gen2, Gen2+)

Limitations & Supported Versions

This server is built for operation on a trusted local network, talking to UniFi consoles by IP address. With that in mind:

  • TLS verification is disabled by default (UNIFI_VERIFY_SSL=false). UniFi OS ships self-signed certificates, and controllers are reached by IP on the LAN, so certificate verification is expected to fail. Enable UNIFI_VERIFY_SSL=true only when your controller presents a CA-trusted certificate.

  • No device configured at startup is allowed. The server boots and exposes all tools even before UNIFI_* credentials are supplied (e.g. when deployed and configured via environment variables). Device-bound tool calls then return a clear No device configured error until a device is set.

  • Scope enforcement applies to remote transports only. When running over Streamable HTTP, every tools/call is gated by read/write/admin OIDC scopes, and startup fails if any tool is unclassified. Over stdio (local IPC) no auth is required — stdio is assumed to be a trusted local process.

  • Integration API key limitations. A subset of controller features is only available via legacy session auth (UNIFI_MODE=local): network events, alarms, DPI statistics, speed tests, WLAN/firewall configs, port profiles, and routing tables. Tools for these return a clear error explaining how to enable them.

  • Tested against recent UniFi OS / Network / Protect. Newer controllers that removed legacy endpoints (e.g. UniFi Network 10 removed alarms/events endpoints) are handled by degrading gracefully rather than erroring.

  • Not a substitute for controller backups. Snapshots and reports are read-only exports; they do not configure or restore a controller.

Installation

# Clone the repository
git clone https://github.com/mikeholownych/unifi-mcp.git
cd unifi-mcp

# Install dependencies
uv sync

Using pip

pip install -e .

Configuration

Create a .env file in the project root (or set environment variables). See .env.example for all options.

UNIFI_CACHE_TTL controls the shared GET cache lifetime across client instances (default: 30 seconds). Mutation verification defaults to five fresh reads with exponential delays of 0.5, 1, 2, and 2 seconds. Tune this with UNIFI_MUTATION_VERIFY_ATTEMPTS, UNIFI_MUTATION_VERIFY_INITIAL_DELAY, and UNIFI_MUTATION_VERIFY_MAX_DELAY when a controller converges more slowly or quickly.

Optional Runtime Persistence

SQLite-backed runtime persistence is disabled by default. Enable it only when persistent runtime state is needed:

UNIFI_RUNTIME_ENABLED=true

By default, the database is runtime.db under UNIFI_DATA_DIR. If UNIFI_DATA_DIR is not set, the server follows the XDG data convention: $XDG_DATA_HOME/unifi-mcp when XDG_DATA_HOME is an absolute path, otherwise ~/.local/share/unifi-mcp. The resulting default database is therefore $XDG_DATA_HOME/unifi-mcp/runtime.db or ~/.local/share/unifi-mcp/runtime.db.

Set an explicit data directory or database path when needed:

UNIFI_DATA_DIR=/var/lib/unifi-mcp
UNIFI_RUNTIME_DATABASE=/var/lib/unifi-mcp/runtime.db

UNIFI_DATA_DIR and UNIFI_RUNTIME_DATABASE must resolve to absolute paths. UNIFI_RUNTIME_DATABASE overrides the database derived from UNIFI_DATA_DIR.

Events, Schedules, and Webhooks

Runtime persistence enables event storage and management tools, but does not start background work. Enable the scheduler separately:

UNIFI_RUNTIME_ENABLED=true
UNIFI_AUTOMATION_ENABLED=true

Event ingestion is capability-based polling, not a claim of universal UniFi push support:

  • Network event polling requires traditional local session auth with UNIFI_MODE=local.

  • Protect event polling requires a configured local username and password for each Protect device.

  • Integration API and cloud Network configurations are reported as unsupported for event polling.

  • Polling uses overlap plus durable source-key deduplication so timestamp boundaries do not create duplicate records.

Schedules can invoke only poll_events, retry_webhook_deliveries, capture_observations, or prune_runtime_data. Schedule and webhook mutations require confirm=true; arbitrary MCP tool names, commands, imports, and expressions are rejected.

Webhook destinations use HTTPS, do not follow redirects, and are resolved and checked before every attempt. Loopback, private, link-local, multicast, and reserved addresses are rejected unless UNIFI_WEBHOOK_ALLOW_PRIVATE=true. The dedicated webhook client retains certificate verification even when a UniFi controller uses a self-signed certificate.

Signing secrets never enter SQLite or MCP arguments. Set a secret in the server environment, then pass only its variable name as secret_env_name:

WEBHOOK_SECRET_AUTOMATION='replace-with-a-random-secret'

Useful tools include get_event_polling_status, poll_events_now, list_runtime_events, create_interval_schedule, run_schedule_now, list_job_runs, create_webhook_destination, test_webhook_destination, and list_webhook_deliveries. Retryable jobs and webhook failures use bounded exponential backoff; exhausted deliveries enter dead_letter state.

Portable Snapshots and Reports

Portable snapshots are versioned, canonical JSON exports assembled from supported read APIs. They include source scope, explicit data limitations, Network/Protect inventory, networks, WLAN metadata, and firewall rule/policy metadata. Credentials, API keys, cookies, authorization headers, and WLAN passphrases are structurally excluded.

# Optional absolute override; defaults to <UNIFI_DATA_DIR>/exports
UNIFI_EXPORT_DIR=/var/lib/unifi-mcp/exports

Export tools accept a plain filename rather than an arbitrary path, reject traversal and symlinks, and atomically write files with 0600 permissions. export_portable_snapshot includes a SHA-256 content checksum; verify_snapshot detects malformed, truncated, or modified snapshots. export_network_report renders the same strict model as escaped standalone HTML or formula-safe CSV.

Native controller backup download and restore are intentionally reported as unavailable until controller-family endpoints and safe restore verification are validated. Portable snapshots support assessment and assisted reconstruction; they are not represented as restorable native controller backups.

History and Prometheus

With runtime persistence enabled, capture_observations_now stores bounded aggregate site health, device/client counts, traffic totals, and Protect camera health. It never stores per-client history or packet-flow telemetry. query_observation_trends returns bounded UTC buckets with present=false for missed collections rather than inventing interpolated values.

Prometheus support is not part of the base dependency set and starts no listener by default:

uv sync --extra observability
UNIFI_RUNTIME_ENABLED=true
UNIFI_PROMETHEUS_ENABLED=true
UNIFI_PROMETHEUS_HOST=127.0.0.1

Metrics use fixed names without controller, site, client, MAC, IP, or SSID labels. Binding beyond loopback additionally requires UNIFI_PROMETHEUS_ALLOW_REMOTE=true and UNIFI_PROMETHEUS_BEARER_TOKEN_ENV naming an environment variable that contains the bearer token. The token value is read at request time and is never persisted.

Client Organization and QoS Previews

With runtime persistence enabled, clients can have multiple local tags and at most one local group. Membership is keyed by a controller/site-scoped SHA-256 value derived from the stable client MAC; raw MACs and mutable client names are not stored. Exact names and hostnames can be used as transient lookup hints, but ambiguous matches are rejected and the exact MAC must be supplied. Tags and groups survive client renames and do not change controller configuration.

Organization mutations require confirm=true. Use set_client_tags, create_client_group, assign_client_group, list_client_groups, and list_clients_by_organization to manage or query local metadata.

plan_client_qos_policy persists a one-hour deterministic target snapshot selected by one client, tag, or group. The target ledger contains only scoped one-way client keys and supports future resumable per-target apply state. This release has no validated controller QoS adapter: get_client_qos_capabilities reports that limitation, and apply_client_qos_policy returns without making a controller mutation. Local tags never imply a QoS policy.

Trusted Plugins

Plugins are disabled unless their Python entry-point name is explicitly listed in UNIFI_PLUGIN_ALLOWLIST. They execute as trusted local code in the server process and are not sandboxed. Required plugins must also be allowlisted and are listed in UNIFI_PLUGIN_REQUIRED; missing, incompatible, duplicate, or failed required plugins stop startup. Optional failures are isolated and visible through get_plugin_status.

Plugins use API version 1 and the unifi_mcp.plugins entry-point group:

[project.entry-points."unifi_mcp.plugins"]
example = "example_package.plugin:plugin"

The loaded object declares api_version = 1 and implements register(registry). The registry supports register_tool with an explicit read, write, or admin scope, plus named collectors, JobDefinition jobs, notification sinks, and byte-returning report renderers. Plugin names cannot shadow core tools or jobs.

Streamable HTTP and OIDC

Stdio remains the default local process transport and requires no identity-provider configuration. Remote MCP starts only when UNIFI_TRANSPORT=streamable-http; install the declared authentication capability with uv sync --extra oidc and provide complete OIDC settings:

UNIFI_TRANSPORT=streamable-http
UNIFI_HTTP_HOST=127.0.0.1
UNIFI_HTTP_PORT=8000
UNIFI_HTTP_PATH=/mcp
UNIFI_HTTP_PUBLIC_URL=https://mcp.example.com/mcp
UNIFI_OIDC_ISSUER=https://identity.example.com
UNIFI_OIDC_AUDIENCE=unifi-mcp
UNIFI_OIDC_ALGORITHMS=RS256

Discovery and JWKS data are fetched over HTTPS with bounded timeouts, cached for five minutes by default, and refreshed once for an unknown signing key. Tokens are validated locally for allowed asymmetric algorithm, signature, issuer, audience, expiry, subject, and scopes. Authorization headers, tokens, claims, and signing keys are not logged or persisted.

All HTTP tool calls require UNIFI_OIDC_READ_SCOPE (unifi:read by default). Mutations additionally require UNIFI_OIDC_WRITE_SCOPE; runtime administration and plugin status require UNIFI_OIDC_ADMIN_SCOPE. Existing confirm=true gates still apply. Non-loopback binding additionally requires UNIFI_HTTP_ALLOW_REMOTE=true; production TLS should terminate at the declared HTTPS public URL.

Configure multiple UniFi devices with different services:

UNIFI_DEVICES='[
  {
    "name": "main-gateway",
    "url": "https://192.168.1.1",
    "api_key": "your-gateway-api-key",
    "services": ["network"],
    "site": "default"
  },
  {
    "name": "nvr",
    "url": "https://192.168.1.2",
    "api_key": "your-nvr-api-key",
    "services": ["network", "protect"],
    "site": "default"
  }
]'
UNIFI_VERIFY_SSL=false

Device configuration fields:

Field

Description

Default

name

Friendly name for targeting the device

(required)

url

Base URL of the UniFi device

(required)

api_key

API key from UniFi OS Control Plane

(required)

services

Array: ["network"], ["protect"], or both

["network"]

site

Site name for network operations

"default"

verify_ssl

Verify SSL certificates

false

username

Username for Protect events (optional)

null

password

Password for Protect events (optional)

null

Note: The username and password fields are only required for Protect event tools (motion events, smart detections). Basic camera operations work with just the API key.

To create an API key:

  1. Log into your UniFi controller

  2. Go to Settings → Control Plane → API

  3. Create a new API key with appropriate permissions

Legacy Single-Device Configuration

For backwards compatibility, single-device configuration is still supported:

UNIFI_MODE=local_api_key
UNIFI_CONTROLLER_URL=https://192.168.1.1
UNIFI_CLOUD_API_KEY=your-api-key
UNIFI_SITE=default
UNIFI_VERIFY_SSL=false

Local Session Auth (Traditional)

For full-feature access with username/password authentication:

UNIFI_MODE=local
UNIFI_CONTROLLER_URL=https://192.168.1.1
UNIFI_USERNAME=local-admin
UNIFI_PASSWORD=your-password
UNIFI_SITE=default
UNIFI_IS_UDM=true
UNIFI_VERIFY_SSL=false

Cloud API (api.ui.com)

For Ubiquiti Cloud API access:

UNIFI_MODE=cloud
UNIFI_CLOUD_API_KEY=your-api-key

Get your API key from unifi.ui.com → API section.

Usage with Claude Desktop

Add to your Claude Desktop configuration (~/.config/claude/claude_desktop_config.json on Linux or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "unifi": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/unifi-mcp", "python", "-m", "unifi_mcp.server"],
      "env": {
        "UNIFI_DEVICES": "[{\"name\":\"gateway\",\"url\":\"https://192.168.1.1\",\"api_key\":\"your-key\",\"services\":[\"network\"]},{\"name\":\"nvr\",\"url\":\"https://192.168.1.2\",\"api_key\":\"your-key\",\"services\":[\"network\",\"protect\"]}]",
        "UNIFI_VERIFY_SSL": "false"
      }
    }
  }
}

Usage with Claude Code / opencode

# Add the MCP server
claude mcp add unifi -- uv run --directory /path/to/unifi-mcp python -m unifi_mcp.server

Or in opencode.json:

{
  "mcp": {
    "unifi": {
      "type": "local",
      "command": ["/path/to/unifi-mcp/.venv/bin/python", "-m", "unifi_mcp.server"],
      "enabled": true
    }
  }
}

Available Tools

Server Health

  • get_server_health - Report the server version, stdio transport, configured service counts, and optional persistence status. The response deliberately omits credentials, controller addresses, device names, and database paths.

Multi-Device Management

  • list_unifi_devices - List all configured UniFi devices and their services

Device Management

  • list_devices - List all UniFi network devices

  • get_device_details - Get detailed device information

  • restart_device - Restart a device

  • locate_device - Blink LED to locate device

  • get_device_stats - Get performance statistics

  • upgrade_device - Upgrade firmware

  • provision_device - Force re-provision

  • get_device_ports - List switch/gateway port configuration and link state

  • set_device_port - Configure one port; requires confirm=true and verifies controller read-back

Client Management

  • list_clients - List connected clients

  • list_all_clients - List all known clients (including offline)

  • get_client_details - Get client details

  • block_client / unblock_client - Block/unblock clients

  • kick_client - Disconnect a client

  • forget_client - Remove from known clients

  • get_client_traffic - Get traffic statistics

  • reserve_client_ip - Reserve IP via DHCP reservation

  • get_client_organization / set_client_tags - Read or replace durable local tags

  • create_client_group / delete_client_group - Manage local-only groups

  • assign_client_group / list_client_groups - Manage and inspect single-group membership

  • list_clients_by_organization - Resolve deterministic tag or group target sets

  • get_client_qos_capabilities - Report validated controller QoS support

  • plan_client_qos_policy / apply_client_qos_policy - Preview QoS targets and apply only when a validated adapter exists

Site Management

  • list_sites - List all sites

  • get_site_health - Get site health status

  • get_site_settings - Get site settings

  • get_sysinfo - Get system information

  • get_networks - Get network/VLAN configs

  • get_wlans - Get wireless network configs

  • get_port_profiles - Get switch port profiles

  • get_firewall_rules - Get legacy firewall rules

  • get_firewall_policies - Get zone-based firewall policies (UniFi Network 9+)

  • get_routing_table - Get routing table

  • get_port_forwards - Get port forwarding rules

  • create_port_forward / delete_port_forward - Manage port forwards

Configuration Management (writes)

  • create_network / update_network / delete_network - Manage networks and VLANs; each requires confirm=true and verifies controller read-back

  • create_wlan / update_wlan / delete_wlan - Manage wireless networks

  • create_firewall_policy / set_firewall_policy_enabled / delete_firewall_policy - Manage zone-based firewall policies

  • export_camera_clip - Export an MP4 beneath UNIFI_EXPORT_DIR; requires confirm=true

  • get_all_sites_health - Health overview across all sites

Write tools that remove data or cause disruption are confirm-gated or flagged destructive via MCP annotations.

Statistics & Monitoring

  • get_network_health - Overall network health

  • get_recent_events - Recent events

  • get_alarms - Active alarms

  • archive_all_alarms - Archive all alarms

  • run_speed_test - Start speed test

  • get_speed_test_status - Get speed test results

  • get_dpi_stats - DPI statistics

  • get_traffic_summary - Traffic summary

AI Insight Tools

  • analyze_network_issues - Comprehensive issue analysis

  • get_optimization_recommendations - Configuration recommendations

  • get_client_experience_report - Client quality metrics

  • get_device_health_summary - Device health overview

  • get_traffic_analysis - Traffic pattern analysis

  • get_all_sites_health - Health overview across all sites

Multi-Site Orchestration

  • get_global_inventory - Unified device inventory across all controllers

  • get_global_health - Aggregated health report across all controllers

  • get_global_client_summary - Client counts, top talkers, blocked clients across all controllers

  • troubleshoot_client - Deep-dive client troubleshooting

UniFi Protect

  • list_cameras - List all cameras with connection status

  • get_camera_details - Get detailed camera information

  • get_camera_snapshot - Get live snapshot (base64 JPEG)

  • get_protect_system_info - Get NVR system information

  • get_camera_health_summary - Camera health overview with issues

  • get_liveviews - Get configured liveview layouts

  • get_protect_accessories - List lights, sensors, chimes, viewers

UniFi Protect Events (require username/password)

  • get_motion_events - Get recent motion events

  • get_smart_detections - Get smart detection events (person, vehicle, animal, package)

  • get_protect_event_summary - Summary of all events by type

  • get_recent_protect_activity - Quick overview of recent activity

Example Conversations

After connecting the MCP server, you can ask Claude:

Network Management

  • "List all my UniFi devices"

  • "What's the current network health?"

  • "Analyze my network for any issues"

  • "What optimization recommendations do you have?"

  • "Show me client experience metrics"

  • "Troubleshoot the client with MAC aa:bb:cc:dd:ee:ff"

  • "Which clients are using the most bandwidth?"

  • "Are there any devices that need firmware updates?"

  • "Show me the recent network events"

  • "Run a speed test"

UniFi Protect

  • "List all my cameras"

  • "Show me the camera health summary"

  • "Get a snapshot from the Front Door camera"

  • "What's the status of my NVR?"

  • "Are any cameras disconnected?"

  • "Show me the protect accessories"

Protect Events (requires credentials)

  • "Show me recent motion events"

  • "What smart detections happened in the last 24 hours?"

  • "Were there any person detections today?"

  • "Give me an event summary for the past week"

  • "Show recent activity from the Front Door camera"

Multi-Device

  • "List my configured UniFi devices"

  • "Show cameras on my NVR"

  • "Get network health from the main gateway"

Development

Running Tests

uv run pytest

Code Formatting

uv run ruff check .
uv run ruff format .

Docker

docker build -t unifi-mcp .
docker run -i --rm --env-file .env unifi-mcp

To enable optional runtime persistence, mount a named volume at the image's writable /data directory:

docker run -i --rm \
  --env-file .env \
  --env UNIFI_RUNTIME_ENABLED=true \
  --env UNIFI_DATA_DIR=/data \
  --volume unifi-mcp-data:/data \
  unifi-mcp

--rm removes the stopped container, but the unifi-mcp-data named volume remains and preserves /data/runtime.db for subsequent runs.

Requesting new functionality

  • New skills: Open an issue with [Skill] prefix — describe the problem, workflow, and expected output

  • Modify skills: Open an issue with [Skill: skill-name] prefix — what's missing or broken

  • New tools: Open an issue with [Tool] prefix — include the UniFi API endpoint and expected format

See SKILLS.md for detailed contribution guidelines.

See CHANGELOG.md for release history and CONTRIBUTING.md to contribute.

Security Notes

  • Credentials are passed via environment variables — never commit .env

  • TLS verification is disabled by default (UNIFI_VERIFY_SSL=false) because the server is designed to run on a trusted LAN against UniFi consoles reached by IP with self-signed certificates. Enable it only with a CA-trusted certificate.

  • Over stdio (local IPC), no authentication is required — the transport is assumed to be a trusted local process. Over Streamable HTTP, all tool calls require a valid OIDC token with the appropriate read/write/admin scope, enforced server-side.

  • The server exposes both read and write tools

  • Disruptive or destructive tools are annotated and/or explicitly confirm-gated where implemented; MCP clients decide how to present or honor annotations

  • Especially dangerous operations such as factory reset remain unexposed

  • API keys should be kept secure and rotated periodically

License

MIT License

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

Available Tools

111 tools
analyze_network_issuesA
Read-only

Analyze a site and return a structured report of potential issues.

Read-only operation: it aggregates device health, client connection problems, interference, firmware status, and recent alarms into an AI-friendly summary of what may be wrong. Use get_alarms for the raw active-alarm list, get_device_health_summary for device-only status, or get_optimization_recommendations when you want improvement suggestions rather than a fault report.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true and description reinforces this with 'Read-only operation'. It also discloses aggregation behavior and output nature ('AI-friendly summary of what may be wrong'), adding useful context beyond the annotation. No contradictions or hidden side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by alternatives and parameter details. The Args section partially duplicates schema documentation, but overall it remains concise and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by stating the output is a structured report/summary of potential issues. It also documents both optional parameters and gives enough context to invoke the tool correctly. Minor omissions like exact response fields are acceptable given the 'AI-friendly summary' characterization.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; both site and device are already fully described in the input schema. The description repeats this information without adding deeper semantics like format, constraints, or interactions between the parameters, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Analyze'), resource ('a site'), and output ('structured report of potential issues'). It enumerates the aggregated data sources and explicitly distinguishes itself from sibling tools like get_alarms, get_device_health_summary, and get_optimization_recommendations, leaving no ambiguity about what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explicitly names when to use alternatives: get_alarms for raw alarms, get_device_health_summary for device-only status, and get_optimization_recommendations for improvements rather than fault reports. This gives clear routing guidance and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_client_qos_policyA
Destructive

Apply a validated QoS preview when a supported adapter exists. Requires confirmation.

Mutating operation: loads the plan referenced by plan_token and attempts to activate it. In the current release no validated adapter exists, so no controller mutation is performed (mutation_attempted=false); the call records the attempt. Returns success=false unless confirm=true. Use plan_client_qos_policy first to obtain a plan_token.

Args: plan_token: Token returned by plan_client_qos_policy identifying the plan. confirm: Must be True to attempt application; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to attempt application; without it the call is a no-op. Defaults to False.
plan_tokenYesToken returned by plan_client_qos_policy identifying the plan.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations only mark destructiveHint=true, the description adds that in the current release no controller mutation is performed, mutation_attempted=false, the call records the attempt, and success=false unless confirm=true. This goes well beyond the structured annotation and prevents an agent from expecting a real activation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose and confirmation requirement, then expands on behavior and parameters. Minor redundancy exists between 'Requires confirmation' and the confirm parameter rationale, but nothing is excessive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the critical behavioral caveats, the prerequisite workflow, and the parameter semantics. It could specify the full response contract, but it already gives the key success/mutation flags and current-release behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args entries simply restate the schema text for plan_token and confirm without adding extra semantics. The schema already carries the parameter meanings, so the description adds no value beyond a baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Apply'), resource ('validated QoS preview'), and a clear condition ('when a supported adapter exists'). It also names the prerequisite sibling tool plan_client_qos_policy, which distinguishes it from the planning step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs agents to call plan_client_qos_policy first to obtain a plan_token and requires confirmation before any effect. It does not enumerate all when-not-to-use cases, but the no-op behavior without confirm=true and the current no-adapter caveat provide clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

archive_all_alarmsA
Idempotent

Acknowledge and archive every active alarm on a site.

Non-destructive state change: it marks open alarms as archived so they no longer show in get_alarms; no device configuration is modified. Use get_alarms first to review what will be cleared; prefer analyze_network_issues when you want findings without clearing alarm state.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly discloses the behavioral effect beyond the idempotentHint annotation: it marks open alarms as archived, changes no device configuration, and affects what get_alarms returns. This gives the agent a precise mental model of the side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main explanation is compact and front-loaded, with the action, behavior, and usage guidance in the first sentences. The Args section is redundant with the schema, but it is short and does not meaningfully hurt clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two optional parameters and no output schema, the description covers purpose, behavior, side effects, and alternative tools. Nothing critical is missing for an agent to decide when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section merely repeats the schema's field descriptions verbatim. It adds no new semantic meaning beyond what the input schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: 'Acknowledge and archive every active alarm on a site.' It also differentiates itself from get_alarms and analyze_network_issues, so an agent can tell exactly what this tool does and what it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Use get_alarms first to review what will be cleared' and 'prefer analyze_network_issues when you want findings without clearing alarm state.' This clearly routes the agent to the right tool for adjacent tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assign_client_groupA
Idempotent

Assign or unassign one local client group. Requires confirm=true.

Mutating operation: sets the client's single local group membership (local_only) to the given group, or clears it when group is null. Does not mutate the controller. Returns success=false unless confirm=true. Use set_client_tags for tags, or list_clients_by_organization to find clients in a group.

Args: identity: Client MAC, IP, hostname, or alias to resolve to a known client. group: Group name to assign, or null/None to unassign the current group. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default. confirm: Must be True to change membership; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
groupYesGroup name to assign, or null/None to unassign the current group.
deviceNoOptional device name to target a specific console; omit for default.
confirmNoMust be True to change membership; without it the call is a no-op. Defaults to False.
identityYesClient MAC, IP, hostname, or alias to resolve to a known client.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint annotation, the description discloses that this is a mutating operation, that it replaces the client's single local group membership, that a null group clears membership, and that the controller is not mutated. It also reveals the success=false-until-confirm behavior, adding significant context that annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with an upfront summary, behavioral notes, and an Args block. It is somewhat repetitive with the schema descriptions, but every included sentence contributes functional guidance or clarifies important caveats like confirm behavior and non-mutation of the controller.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema, the description covers the required confirmation flag, exact membership semantics, null-group unassignment, identity resolution, site/device targeting, and relevant sibling tools. The success=false caveat partially addresses return behavior, making the tool safe to invoke without further assumptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 even though the description mostly mirrors the parameter descriptions. It does add context like 'resolve to a known client' for identity and reinforces the no-op behavior of confirm, but it does not materially extend beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Assign or unassign one local client group.' It clearly distinguishes itself from related siblings by pointing to set_client_tags for tags and list_clients_by_organization for finding clients in a group. Scope and semantic intent are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool, that confirm=true is required for the operation to take effect, and that without it the call is a no-op. It also provides alternative tools for tags and client-group listing, giving clear exclusions and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

block_clientA
Idempotent

Block a client from accessing the network by MAC address.

Mutating operation: the block is applied immediately and persists in the controller's firewall/blocklist. Use unblock_client to restore access, or kick_client to drop the connection without a persistent block.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that this is a mutating operation, applies immediately, and persists in the controller's firewall/blocklist. This goes beyond the idempotentHint annotation by explaining the real-world effect and durability of the action, though it does not cover failure modes or permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence purpose, a short behavioral note, explicit alternative guidance, and a clean Args list. Every sentence provides useful information, and the most important facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-changing tool with no output schema and minimal annotations, the description covers the core behavioral context: immediate effect, persistence, and reversal path. It could additionally clarify success/failure response behavior, but the essential information an agent needs to select and invoke the tool correctly is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section in the description essentially repeats the schema descriptions without adding new semantic detail. Because the schema already fully documents mac, site, and device, the description adds no meaningful parameter meaning beyond what is already structured.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action, target, and mechanism: 'Block a client from accessing the network by MAC address.' It clearly identifies the resource and differentiates the tool from related siblings by naming unblock_client and kick_client as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool versus alternatives: use unblock_client to restore access, and kick_client to drop a connection without a persistent block. This gives an agent clear decision criteria without needing to inspect other tool definitions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

capture_observations_nowA
Idempotent

Capture a bounded batch of aggregate UniFi health observations immediately.

Mutating operation: collects current health observations and persists them into the observation store right away, then refreshes cached metrics. Returns the number of inserted observations and any scope limitations. Use before query_observation_trends to ensure recent data, or rely on scheduled capture otherwise.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description openly labels the operation as 'Mutating', explains that it persists observations and refreshes cached metrics, and discloses return values. This adds meaningful behavioral context beyond the idempotentHint annotation, which alone would not reveal the persistence side effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line summary, a clear side-effect warning, and a usage directive. Every sentence earns its place, and the most important 'Mutating operation' label is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter action with no output schema, the description fully covers what the tool does, its side effects, what it returns, and when to use it. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and schema coverage is 100%, so there is no parameter burden for the description to carry. The description adds relevant conceptual context like 'bounded batch', but no parameter-specific semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Capture') with a clear resource ('aggregate UniFi health observations') and a temporal qualifier ('immediately'). It clearly distinguishes this tool from passive query tools like query_observation_trends.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: 'Use before query_observation_trends to ensure recent data, or rely on scheduled capture otherwise.' This provides both a selection condition and a named alternative, making it easy for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_client_groupA
Destructive

Create a controller-independent local client group. Requires confirm=true.

Mutating operation: persists a new empty local group (local_only) scoped to the controller/site; it does not create anything on the UniFi controller. Returns success=false unless confirm=true. Use assign_client_group to add members, or list_client_groups to see existing groups.

Args: name: Unique group name to create. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default. confirm: Must be True to create the group; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUnique group name to create.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
confirmNoMust be True to create the group; without it the call is a no-op. Defaults to False.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

It discloses the mutating nature, persistence behavior, local-only scope, no-op behavior without confirm=true, and the success=false return caveat. This goes well beyond the single destructiveHint annotation and gives the agent accurate expectations for side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured with a clear opening, a behavioral note, and an args list. There is minor redundancy around confirm=true being required and the no-op return behavior, but overall every section contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with only a destructiveHint annotation and no output schema, this description is thorough: it covers side effects, confirmation semantics, scope, return behavior, and routes to sibling tools. An agent has enough context to invoke it correctly and understand the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description largely mirrors the schema's parameter documentation. It adds some context (e.g., 'local_only' and no-op behavior), but does not substantially expand on what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a controller-independent local client group.' It further clarifies what the operation does not do ('does not create anything on the UniFi controller'), which differentiates it from siblings like assign_client_group, list_client_groups, and delete_client_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains the confirmation requirement and points to relevant alternatives: 'Use assign_client_group to add members, or list_client_groups to see existing groups.' It does not explicitly enumerate when not to use this tool, but the guidance is strong enough for an agent to choose it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_firewall_policyA

Create a zone-based firewall policy (UniFi Network 9+).

Mutating operation: applied immediately and persisted on the UniFi console. Action is ALLOW, BLOCK, or REJECT across the src_zone_id to dst_zone_id pair. Lower index evaluates earlier. A controller-generated "(Return)" companion rule is typically added. Requires zone ids from get_firewall_policies; review there first.

Args: name: Policy name (used for display and zone inference). action: Packet decision — "ALLOW", "BLOCK", or "REJECT". src_zone_id: Source zone id (from get_firewall_policies). dst_zone_id: Destination zone id (from get_firewall_policies). protocol: Protocol selector — "all", "tcp", "udp", "tcp_udp", "icmp", "igmp", or "icmpv6". description: Optional human-readable description. client_macs: Restrict the source to these client MAC addresses. index: Rule order index; lower values evaluate earlier. Omit for auto-order. enabled: Create the policy enabled. Defaults to True. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesPolicy name (used for display and zone inference).
siteNoSite to operate on. Defaults to "default".default
indexNoRule order index; lower values evaluate earlier. Omit for auto-order.
actionYesPacket decision — "ALLOW", "BLOCK", or "REJECT".
deviceNoOptional console name to target a specific UniFi device; omit for default.
enabledNoCreate the policy enabled. Defaults to True.
protocolNoProtocol selector — "all", "tcp", "udp", "tcp_udp", "icmp", "igmp", or "icmpv6".all
client_macsNoRestrict the source to these client MAC addresses.
descriptionNoOptional human-readable description.
dst_zone_idYesDestination zone id (from get_firewall_policies).
src_zone_idYesSource zone id (from get_firewall_policies).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly states that the operation is mutating, applied immediately, persisted on the UniFi console, that lower index values evaluate earlier, and that a controller-generated '(Return)' companion rule is typically added. These are meaningful side-effect disclosures beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and mutation status, then covers side effects, prerequisites, and an Args list. Every sentence contributes necessary information for safe invocation, and the structure makes the 11-parameter tool understandable without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters, no annotations, and no output schema, the description is complete: it covers all required inputs, defaults, protocol values, ordering semantics, prerequisite lookups, device/site targeting, and side effects. An agent has enough context to invoke it correctly and anticipate the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description repeats most parameter semantics already present in the schema, such as defaults, protocol choices, and the source of zone IDs. It adds useful grouping and emphasis for required parameters, but does not materially expand beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a zone-based firewall policy (UniFi Network 9+)'. It further clarifies the policy model (ALLOW/BLOCK/REJECT across a src_zone_id to dst_zone_id pair), which clearly distinguishes it from sibling tools like create_firewall_rule or set_firewall_policy_enabled.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context and explicit prerequisites: 'Requires zone ids from get_firewall_policies; review there first.' It also warns that the operation is mutating and applied immediately. It does not explicitly state when-not-to-use or name alternatives, but the zone-based framing and prerequisite guidance are strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_firewall_ruleA
Destructive

Create a legacy firewall rule (UniFi Network <9 or traditional API).

Mutating operation: applied immediately and persisted on the controller. For zone-based policies (Network 9+), prefer create_firewall_policy. Review existing rules with get_firewall_rules first.

Args: name: Unique rule name action: Action — "accept", "drop", or "reject" protocol: Protocol — "tcp", "udp", "icmp", "all", or IANA number dst_port: Destination port or range (e.g., "80", "80-443") src_zone: Source zone ID (from get_firewall_policies) dst_zone: Destination zone ID src_port: Source port or range logging: Enable logging for matches enabled: Whether rule is active on creation. Defaults to True. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific console; omit for default.

Returns: Created firewall rule configuration

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUnique rule name
siteNoSite to operate on. Defaults to "default".default
actionYesAction — "accept", "drop", or "reject"
deviceNoOptional console name to target a specific UniFi device; omit for default.
enabledNoWhether rule is active on creation. Defaults to True.
loggingNoEnable logging for matches.
dst_portNoDestination port or range (e.g., '80', '80-443').
dst_zoneNoDestination zone ID.
protocolYesProtocol — "tcp", "udp", "icmp", "all", or IANA number
src_portNoSource port or range.
src_zoneNoSource zone ID (from get_firewall_policies).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide destructiveHint=true, and the description adds valuable context on top: it is a 'Mutating operation: applied immediately and persisted on the controller.' This reveals immediacy and persistence behaviors not present in the annotation. It could also mention rollback or failure implications, but the existing disclosure is strong for a legacy API mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentences are useful and front-loaded with purpose and usage guidance. However, the Args section duplicates the input schema content one-for-one, which adds length without earning its place. The Returns line adds value since there is no output schema, but the overall structure could be tighter by omitting the redundant parameter list.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 11-parameter mutating tool with destructiveHint and no output schema, the description covers the essential context: legacy scope, mutation semantics, persistence, the preferred alternative for newer APIs, and a prerequisite to review existing rules. It mentions a return value, though vaguely. Missing details like error behavior or uniqueness handling for rule names keep it just short of a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description repeats the Args list verbatim without adding new semantic meaning. It does not explain relationships between parameters or edge cases, but given full schema coverage, the baseline of 3 is appropriate; the description simply does not add extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Create a legacy firewall rule', and specifies the scope (UniFi Network <9 or traditional API). It explicitly distinguishes itself from the sibling create_firewall_policy by saying zone-based policies should use that tool. This is a specific, well-scoped purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: use create_firewall_policy for Network 9+ zone-based policies, and review existing rules with get_firewall_rules first. This tells the agent both when to use this tool and when to prefer an alternative, which is exactly what usage guidance should do.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_interval_scheduleA
Destructive

Create an allowlisted recurring job. Requires confirm=true.

Mutating operation: persists a new interval schedule that runs job_name with the given arguments every interval_seconds. Returns success=false unless confirm=true. The job must be on the allowlist. Use set_schedule_enabled to pause it, or delete_schedule to remove it.

Args: name: Unique schedule identifier. job_name: Allowlisted job to run on the interval. interval_seconds: Recurrence period between runs, in seconds. arguments: Optional keyword arguments passed to the job on each run. confirm: Must be True to create the schedule; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUnique schedule identifier.
confirmNoMust be True to create the schedule; without it the call is a no-op. Defaults to False.
job_nameYesAllowlisted job to run on the interval.
argumentsNoOptional keyword arguments passed to the job on each run.
interval_secondsYesRecurrence period between runs, in seconds.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint=true annotation, the description discloses that without confirm=true the call 'is a no-op,' returns success=false, and requires the job to be allowlisted — exactly the kind of behavioral context annotations do not carry. It also states the persistence semantics with 'Mutating operation: persists a new interval schedule.' This fully aligns with destructiveHint and adds substantial value above it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition front-loads purpose in the first sentence and keeps the behavioral prose tightly scoped with a clear paragraph break before the Args list. However, the Args block duplicates schema descriptions for all five parameters at 100% coverage, and 'Requires confirm=true' is restated in the next paragraph — minor but real redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema, the description covers the confirmation gate, no-op behavior, allowlist constraint, and post-create lifecycle routing, which are the critical decision factors. It only partially describes the response ('Returns success=false unless confirm=true') and doesn't address duplicate names or error cases, but since the schema documents all parameters, the remaining gaps are minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all five parameters already documented, so the baseline is 3. The Args section restates the schema text nearly verbatim ('name: Unique schedule identifier', 'interval_seconds: Recurrence period between runs, in seconds') without adding new semantic meaning. The one behavioral nuance, the confirm no-op, already exists in the schema's own confirm description, so the description adds no information beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Create an allowlisted recurring job' names a specific verb and resource, and the second paragraph clarifies it 'persists a new interval schedule that runs job_name... every interval_seconds,' distinctly a creation operation. It explicitly differentiates itself from lifecycle siblings by naming set_schedule_enabled and delete_schedule as separate operations, so an agent can tell them apart 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives direct routing: 'Use set_schedule_enabled to pause it, or delete_schedule to remove it,' which tells the agent what to use instead once a schedule exists. The allowlist and confirm=true requirements set clear preconditions for invoking this tool. It stops short of contrasting with the run_schedule_now sibling or one-off execution, so the 'when not to use' guidance is partial.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_networkA
Destructive

Create a new network/VLAN segment on the gateway (corporate by default).

Mutating operation: applied immediately and persisted on the UniFi console. Provide subnet in CIDR form and an optional VLAN id to tag the segment; enable DHCP by supplying both dhcp_start and dhcp_stop. Requires confirm=true because routing/VLAN/DHCP changes can disrupt connectivity. Inspect with get_networks; reverse with delete_network.

Args: name: Network name (e.g. "IoT"). subnet: Subnet in CIDR form (e.g. "192.168.50.1/24"); omit for unrouted. vlan: VLAN id (1-4094) for a tagged segment; omit for untagged. purpose: Segment type — "corporate", "guest", or "wan". Defaults to "corporate". domain_name: DNS domain name advertised to clients (e.g. "example.local"). dhcp_start: DHCP pool start IP; supply with dhcp_stop to enable DHCP. dhcp_stop: DHCP pool end IP; supply with dhcp_start to enable DHCP. dhcp_lease_time: DHCP lease duration in seconds (default 86400). site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default. confirm: Safety gate: must be True to create. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNetwork name (e.g. "IoT").
siteNoSite to operate on. Defaults to "default".default
vlanNoVLAN id (1-4094) for a tagged segment; omit for untagged.
deviceNoOptional console name to target a specific UniFi device; omit for default.
subnetNoSubnet in CIDR form (e.g. "192.168.50.1/24"); omit for unrouted.
confirmNoSafety gate: must be True to create. Defaults to False.
purposeNoSegment type — "corporate", "guest", or "wan". Defaults to "corporate".corporate
dhcp_stopNoDHCP pool end IP; supply with dhcp_start to enable DHCP.
dhcp_startNoDHCP pool start IP; supply with dhcp_stop to enable DHCP.
domain_nameNoDNS domain name advertised to clients (e.g. "example.local").
dhcp_lease_timeNoDHCP lease duration in seconds (default 86400).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that the change is applied immediately and persisted, that confirm=true is required, and that routing/VLAN/DHCP changes can disrupt connectivity. This is meaningful additional behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with purpose and mutation warning, and the flow from high-level guidance to Args is logical. The Args list is somewhat redundant with the 100%-covered schema, so it is not maximally concise, but it is organized and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter destructive tool with no output schema, the description covers defaults, optionality, enabling conditions, safety gate, and related inspect/delete operations. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline applies. The description's Args section largely repeats the schema descriptions; the only extra value is grouping interdependent params (subnet/VLAN/DHCP) in the prose, which is marginal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource — 'Create a new network/VLAN segment on the gateway' — and adds the default purpose. This clearly distinguishes the operation from update_network/delete_network without needing to open the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States lifecycle alternatives explicitly: 'Inspect with get_networks; reverse with delete_network.' It also gives concrete creation conditions — CIDR subnet, optional VLAN, DHCP requires both dhcp_start and dhcp_stop, and confirm=true is mandatory for this disruptive mutation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_port_forwardA
Destructive

Create a port-forwarding rule that opens an external WAN port and maps it to an internal host/port.

Mutating operation: applied immediately and persisted on the UniFi console. Review existing rules with get_port_forwards first; remove with delete_port_forward. Prefer create_firewall_policy for zone-based/stateful filtering.

Args: name: Unique rule identifier used to find/delete the rule later. dst_port: Internal destination port (1-65535) on the target host. fwd_ip: LAN IP of the internal host receiving forwarded traffic. fwd_port: External listening port (1-65535) on the WAN. proto: IP protocol to forward — "tcp", "udp", or "both". enabled: Whether active on creation. Defaults to True. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesUnique rule identifier used to find/delete the rule later.
siteNoSite to operate on. Defaults to "default".default
protoNoIP protocol to forward — "tcp", "udp", or "both".tcp_udp
deviceNoOptional device name to target a specific console; omit for default.
fwd_ipYesLAN IP of the internal host receiving forwarded traffic.
enabledNoWhether active on creation. Defaults to True.
dst_portYesInternal destination port (1-65535) on the target host.
fwd_portYesExternal listening port (1-65535) on the WAN.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide destructiveHint: true, but the description adds operational detail: 'Mutating operation: applied immediately and persisted on the UniFi console.' It also surfaces the workflow of reviewing and deleting rules, which is useful context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose statement, a prominent mutating-operation warning, and targeted sibling guidance. The Args list is somewhat redundant with the schema, but the overall length is justified and each section is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutating tool with no output schema, the description covers the operation's effect, persistence, related tools, and an alternative. It gives an agent everything needed to decide when to call it and what the result will be.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description's Args section largely restates the schema rather than adding new meaning, though it usefully distinguishes fwd_port vs dst_port as external vs internal ports.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a port-forwarding rule that opens an external WAN port and maps it to an internal host/port.' It clearly distinguishes this tool from related siblings by name-checking create_firewall_policy, get_port_forwards, and delete_port_forward.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs the agent to review existing rules with get_port_forwards first, to remove rules with delete_port_forward, and to prefer create_firewall_policy for zone-based/stateful filtering. This gives clear decision criteria for selecting this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_webhook_destinationA
Destructive

Create a filtered outbound webhook. Requires confirm=true.

Mutating operation: persists a new outbound webhook destination posting to url, optionally signing with a secret from secret_env_name and limited to categories. Returns success=false unless confirm=true. Use set_webhook_destination_enabled to pause it, or delete_webhook_destination to remove it.

Args: name: Unique destination identifier. url: Endpoint that receives webhook payloads. secret_env_name: Optional name of an env var holding the signing secret. categories: Optional list of event categories to send; empty sends all. confirm: Must be True to create the destination; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesEndpoint that receives webhook payloads.
nameYesUnique destination identifier.
confirmNoMust be True to create the destination; without it the call is a no-op. Defaults to False.
categoriesNoOptional list of event categories to send; empty sends all.
secret_env_nameNoOptional name of an env var holding the signing secret.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that the operation persists a destination, is a mutating operation, and is a no-op returning success=false unless confirm=true. This adds meaningful safety and side-effect context the annotation alone does not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the key requirement (confirm=true) and is well-structured with a short explanation, lifecycle guidance, and an Args list. Some redundancy exists between the prose and the schema-covered Args section, but the description remains focused and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating creation tool with no output schema, the description covers the essential invocation requirements: confirm=true, required name/url, optional secret/categories, and post-creation alternatives. It gives enough for an agent to call it correctly, though the full success response shape is not specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all five parameters. The description largely repeats the schema's parameter meanings and adds no new semantic detail about formats, constraints, or interactions beyond what is already in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Create a filtered outbound webhook.' It clearly distinguishes this creation tool from lifecycle siblings by explicitly naming set_webhook_destination_enabled and delete_webhook_destination for later operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for use: creating a webhook destination requires confirm=true, and it points to sibling tools for pausing and deleting. It does not explicitly contrast with test_webhook_destination or list_webhook_destinations, but the creation scenario is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_wlanA
Destructive

Create a wireless network (SSID) with WPA2/WPA3 transition security by default.

Mutating operation: applied immediately and persisted on the UniFi console. Passphrase must be 8-63 characters. WPA2/WPA3 transition is enabled unless wpa3_transition is False, keeping WPA2 for legacy clients. Attach to a VLAN via network_conf_id, or mark is_guest for an isolated guest SSID. Inspect with get_wlans.

Args: name: SSID broadcast name. passphrase: WiFi password, 8-63 characters. network_conf_id: Network id to attach the SSID to; omit for the default LAN. wpa3_transition: Use WPA2/WPA3 transition mode. Defaults to True. hide_ssid: Broadcast the SSID hidden when True. Defaults to False. is_guest: Mark the SSID as an isolated guest network. Defaults to False. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSSID broadcast name.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
is_guestNoMark the SSID as an isolated guest network. Defaults to False.
hide_ssidNoBroadcast the SSID hidden when True. Defaults to False.
passphraseYesWiFi password, 8-63 characters.
network_conf_idNoNetwork id to attach the SSID to; omit for the default LAN.
wpa3_transitionNoUse WPA2/WPA3 transition mode. Defaults to True.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While destructiveHint already marks mutation, the description adds concrete behavioral context: immediate application, persistence on the UniFi console, WPA2/WPA3 transition behavior, legacy client support, and guest isolation. This meaningfully expands on the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded, followed by a clear mutation warning and an organized Args list. Despite covering eight parameters, every sentence carries useful information and the structure is easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter create operation with only destructiveHint as annotation, the description covers required inputs, all defaults, security behavior, VLAN/guest options, site/device selection, and verification via get_wlans. Nothing essential for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description improves on the schema by explaining why wpa3_transition retains WPA2 for legacy clients and by relating network_conf_id and is_guest to networking intent, though much of the Args section mirrors the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Create a wireless network (SSID)' and immediately names the default security mode. This clearly distinguishes it from siblings like get_wlans, update_wlan, and delete_wlan.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is a create operation applied immediately and persisted, and it explicitly routes to get_wlans for inspection. It does not explicitly state when not to use it or point to update_wlan/delete_wlan for existing SSIDs, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_client_groupA
Destructive

Delete a local group and its memberships. Requires confirm=true.

Mutating operation: removes the local group (local_only) and detaches its members; it does not touch the UniFi controller. Returns success=false unless confirm=true. Recreate with create_client_group if needed.

Args: name: Name of the local group to delete. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default. confirm: Must be True to delete the group; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the local group to delete.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
confirmNoMust be True to delete the group; without it the call is a no-op. Defaults to False.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that members are detached, the UniFi controller is untouched, success=false is returned without confirmation, and the operation is reversible via create_client_group. This gives an agent a clear, accurate behavioral model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded purpose and a clear Args list. There is minor redundancy around the confirm requirement, appearing both in the opening paragraph and the parameter description, but the overall length is justified for a destructive operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple four-parameter destructive tool with destructiveHint already set, the description covers purpose, required confirmation, side effects, recovery path, and the success/failure return signal. Nothing essential for an agent to safely invoke the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description's Args section largely restates the schema, and while it emphasizes the confirm no-op behavior, it does not add substantive new parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Delete a local group and its memberships.' It clearly distinguishes the operation from siblings like create_client_group and assign_client_group, and further scopes it to local-only groups that do not touch the UniFi controller.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the confirm=true requirement and the no-op behavior without it, which is essential usage guidance. It also points to create_client_group as the recovery path, though it does not explicitly enumerate when to prefer an alternative over this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_firewall_policyA
Destructive

Delete a zone-based firewall policy.

Mutating operation: removed immediately and persisted on the UniFi console. Requires confirm=true because removing a policy changes traffic flow. Predefined controller policies are refused. Target by id from get_firewall_policies.

Args: policy_id: Policy id to delete (from get_firewall_policies). confirm: Safety gate: must be True to delete. Defaults to False. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
confirmNoSafety gate: must be True to delete. Defaults to False.
policy_idYesPolicy id to delete (from get_firewall_policies).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true. The description adds meaningful behavioral context: the operation is mutating, removal is immediate and persisted, confirm=true is mandatory because traffic flow changes, and predefined controller policies are refused. These details go well beyond the annotation and give the agent an accurate safety and side-effect profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and clearly organized into behavioral notes and an Args block. It is efficient and readable, but the Args section largely duplicates the input schema descriptions, adding minor redundancy rather than earning each sentence entirely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive delete tool with no output schema, the description covers all critical context: what is deleted, persistence, safety gate, refused inputs, how to source the ID, and site/device targeting. Nothing essential for safe and correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters fully. The description's Args section repeats the same text rather than adding new semantic meaning. It does not explain formats, valid values, or additional constraints beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Delete a zone-based firewall policy', giving a specific verb and resource that clearly identifies the tool's function. It also distinguishes it from related sibling tools like delete_firewall_rule by specifying 'zone-based firewall policy'. This is unambiguous and immediately actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the required confirm=true gate, explains why it is required ('removing a policy changes traffic flow'), and notes that predefined controller policies are refused. It also directs the agent to obtain the policy_id from get_firewall_policies, providing clear guidance on the correct source and the condition under which deletion is disallowed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_firewall_ruleA
Destructive

Delete a legacy firewall rule. Requires confirm=True.

Mutating operation: permanently removes the rule from the controller.

Args: rule_id: Firewall rule ID (from get_firewall_rules) confirm: Must be True to actually delete site: Site to operate on. Defaults to "default". device: Optional console name to target a specific console; omit for default.

Returns: Deletion status

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
confirmNoMust be True to actually delete.
rule_idYesFirewall rule ID (from get_firewall_rules).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint=true annotation, the description explicitly states 'Mutating operation: permanently removes the rule from the controller,' disclosing that the operation is irreversible. It also surfaces the confirm=True gating requirement, which the annotations do not capture. This adds real behavioral context without contradicting the destructiveHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: a one-line purpose, a one-line mutation warning, then organized Args and Returns sections with clear defaults. The Args section partially duplicates schema text, but the overall length is still appropriate and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 4-parameter tool with no output schema, the description covers the critical usage facts: confirm=True requirement, permanence, ID provenance, site default, and optional device targeting. The notable gap is the Returns section — 'Deletion status' is vague, and with no output schema the agent has no way to know the success/error shape to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all four parameters, warranting the baseline of 3. The description's Args block largely mirrors the schema verbatim (site default, confirm gate, device nullability); its only added value is provenance for rule_id (from get_firewall_rules).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Delete a legacy firewall rule.' The 'legacy' qualifier distinguishes it from sibling tools like delete_firewall_policy and creates/updates firewall rules/policies, so an agent can tell them apart at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its scope with the word 'legacy' and gives the source of the rule ID ('from get_firewall_rules'), but it never explicitly names alternatives such as delete_firewall_policy for the newer firewall-policy model, nor states when not to use the tool. Usage routing is left mostly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_networkA
Destructive

Delete a network/VLAN by name or ID.

Mutating operation: removed immediately and persisted on the UniFi console. Requires confirm=true because deleting a network can drop clients and routes that depend on it. List networks with get_networks first to confirm the target.

Args: name: Network name or record id to delete. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default. confirm: Safety gate: must be True to delete. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNetwork name or record id to delete.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
confirmNoSafety gate: must be True to delete. Defaults to False.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond destructiveHint=true, the description adds that deletion is 'removed immediately and persisted on the UniFi console' and explains the consequences of dropping dependent clients/routes. It also reveals the confirm gate as a safety mechanism, which is more behavioral detail than the annotation alone provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: one-sentence purpose, a terse safety warning, and a clean Args list. Every sentence adds operational value, with no filler or repeated boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, one-required-parameter destructive tool with no output schema, the description covers the target, site/device selection, confirm requirement, risk, and prerequisite listing. Nothing an agent needs to safely invoke it is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all four parameters. The Args section in the description mirrors the schema instead of adding new parameter-level semantics; the extra value is behavioral context, not parameter detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Delete a network/VLAN by name or ID.' This immediately identifies the mutation and target, and the deletion semantics clearly set it apart from sibling network tools like get_networks, create_network, and update_network.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly requires confirm=true, warns about dropping clients and routes, and instructs the agent to 'List networks with get_networks first to confirm the target.' This gives a concrete prerequisite and safe workflow, so the agent knows exactly when and how to execute the deletion safely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_port_forwardA
Destructive

Delete a port forwarding rule.

Mutating operation: removed immediately and persisted on the UniFi console. Requires confirm=true because removing a forward closes external access. Target by rule id from get_port_forwards.

Args: rule_id: Port forward rule id to delete (from get_port_forwards). confirm: Safety gate: must be True to delete. Defaults to False. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
confirmNoSafety gate: must be True to delete. Defaults to False.
rule_idYesPort forward rule id to delete (from get_port_forwards).

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true, so the description carries the burden of explaining behavior. It adds valuable context: removal is immediate and persisted on the console, confirm=true is a mandatory safety gate, and deleting closes external access. This goes well beyond the annotation and gives the agent a clear mental model of consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The intro is front-loaded and informative, covering mutation behavior, consequences, and the confirm requirement in three concise sentences. However, the entire Args section duplicates the schema's parameter descriptions without adding new information, so not every part of the description earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all essential call decisions: required rule_id, confirm safety gate, site/device defaults, and the source of the rule id. With no output schema, it does not describe return values, but for a guarded delete operation the provided behavioral and parameter context is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args section repeats the schema descriptions nearly verbatim and adds no new meaning beyond what is already in the input schema. The only framing benefit is connecting rule_id to get_port_forwards, which the schema already mentions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Delete a port forwarding rule') and clarifies that the rule is targeted by id from get_port_forwards. This clearly identifies the operation, but it never explicitly names sibling tools like create_port_forward or get_port_forwards as alternatives, so it stops short of directly differentiating among them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: it is a mutating delete that requires confirm=true because it closes external access, and the target id comes from get_port_forwards. It does not include explicit when-not-to-use guidance or name alternatives, but for a delete tool the usage context is strong enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_scheduleA
Destructive

Delete a non-running schedule. Requires confirm=true.

Mutating operation: removes the identified schedule from the store. Returns success=false unless confirm=true. Use create_interval_schedule to add one, or set_schedule_enabled to pause instead of delete.

Args: schedule_id: Identifier of the schedule to delete. confirm: Must be True to delete the schedule; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to delete the schedule; without it the call is a no-op. Defaults to False.
schedule_idYesIdentifier of the schedule to delete.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds crucial behavior: the confirm parameter makes the call a no-op when false, and it returns success=false without confirmation. This is valuable context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a clear lead sentence, behavioral note, alternatives, and parameter list. Minor redundancy exists ('Requires confirm=true' and 'Returns success=false unless confirm=true' overlap slightly), but overall it is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter destructive tool, the description covers the core behavior, confirmation requirement, return signal, and alternatives. It does not specify what happens if the schedule is running, but the 'non-running' constraint partly addresses that. This is a minor gap rather than a major omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters clearly. The description repeats those meanings without adding new semantic detail, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Delete a non-running schedule') and immediately distinguishes itself from sibling tools by pointing to create_interval_schedule and set_schedule_enabled. An agent can determine exactly what this tool does and what it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the key usage condition (non-running schedule), the required confirm flag, and explicitly names alternatives for adding or pausing schedules. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_webhook_destinationA
Destructive

Delete a webhook destination and queued deliveries. Requires confirm=true.

Mutating operation: removes the identified webhook destination and its queued deliveries from the store. Returns success=false unless confirm=true. Use create_webhook_destination to add one.

Args: destination_id: Identifier of the webhook destination to delete. confirm: Must be True to delete the destination; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to delete the destination; without it the call is a no-op. Defaults to False.
destination_idYesIdentifier of the webhook destination to delete.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses destructive behavior beyond the destructiveHint annotation: it removes queued deliveries from the store, requires confirm=true, returns success=false without confirmation, and acts as a no-op without confirm. This gives the agent a precise safety model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear summary, behavioral note, and argument list. There is minor redundancy around the confirm requirement appearing three times, but it remains compact and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter destructive operation, the description covers the action, consequences, confirmation safeguard, and the related create operation. With annotations and a complete input schema, no critical information is missing for an agent to call it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters fully. The description repeats the parameter meanings without adding significant new detail beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb ('Delete') and resource ('webhook destination and queued deliveries'), making the operation unmistakable. It also contrasts with create_webhook_destination, which helps distinguish it from the most closely related sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes when this tool is appropriate: to permanently delete a webhook destination and its queued deliveries. It names create_webhook_destination as the alternative for adding a destination, though it does not discuss temporary disabling via set_webhook_destination_enabled as a non-destructive alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_wlanA
Destructive

Delete a wireless network (SSID).

Mutating operation: removed immediately and persisted on the UniFi console. Requires confirm=true because deleting an SSID disconnects its clients. Resolve the target by ID or name and review get_wlans first.

Args: wlan: WLAN id or SSID name to delete. confirm: Safety gate: must be True to delete. Defaults to False. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
wlanYesWLAN id or SSID name to delete.
deviceNoOptional console name to target a specific UniFi device; omit for default.
confirmNoSafety gate: must be True to delete. Defaults to False.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that deletion is immediate and persisted, and that deleting an SSID disconnects its clients. It also explains why confirm=true is mandatory, giving the agent important behavioral context before invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly organized: a one-line summary, behavior/risk notes, prerequisite guidance, and a clear Args block. Every sentence contributes useful information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive delete operation, the description covers the target, the safety flag, the site/device scope, the immediate effect, and the recommended prerereview. No output schema exists, but nothing essential to calling this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds value by explaining why confirm is required, emphasizing that wlan accepts an ID or SSID name, and advising review of get_wlans first, which goes slightly beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb ('Delete') and resource ('a wireless network (SSID)'), which clearly distinguishes it from siblings like create_wlan, update_wlan, and get_wlans. The description's scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational guidance: it instructs the agent to review get_wlans first, resolve the target by ID or name, and requires confirm=true. It does not explicitly contrast with create_wlan or update_wlan, but the prerequisite and safety-gate context make the appropriate use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_camera_clipA
Destructive

Export a UniFi Protect recording clip as an MP4 file written to local disk.

Mutating, file-writing operation: it resolves the camera (by id or name), fetches the recording for the requested time range, and writes an MP4 file into the server's confined export directory (the path is validated against that directory, so output_path must not escape it). Requires Protect username/password credentials configured for the console. The write is a no-op until confirm is set to true, at which point it returns the written file path and size in bytes. Use get_camera_snapshot for a single still image instead of a time-ranged clip.

Args: camera: Protect camera identifier or name to export footage from. start_ts: Clip start time as a Unix epoch timestamp (seconds). end_ts: Clip end time as a Unix epoch timestamp (seconds); must be after start_ts. output_path: Destination filename (or path relative to the export directory); it is confined to the server's export directory. device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device. confirm: Safety confirmation required for this file-writing operation; the export returns a failure message until set to true.

ParametersJSON Schema
NameRequiredDescriptionDefault
cameraYesProtect camera identifier or name to export footage from.
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
end_tsYesClip end time as a Unix epoch timestamp (seconds); must be after start_ts.
confirmNoSafety confirmation required for this file-writing operation; the export returns a failure message until set to true.
start_tsYesClip start time as a Unix epoch timestamp (seconds).
output_pathYesDestination filename (or path relative to the export directory); it is confined to the server's export directory.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark destructiveHint; the description discloses the file-writing mutation, path confinement validation, credential requirement, no-op-until-confirm semantics, and the returned path/size. This goes well beyond the annotation and contradicts nothing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is front-loaded and the prose is information-dense. The Args block duplicates schema content, which adds length, but the description remains structured and every distinct behavioral point earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only destructiveHint true and no output schema, the description carries the burden of explaining side effects, safety confirmation, path constraints, credentials, and result shape. It covers all of these, leaving no critical gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description's Args section largely restates schema text. It adds a bit of prose context about output_path being confined and confirm gating the write, but no new parameter-level details beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action: exporting a UniFi Protect recording clip as an MP4 file written to disk. It distinguishes itself from still-image capture by naming get_camera_snapshot as the alternative, which separates it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to use get_camera_snapshot when a single still image is needed instead of a time-ranged clip. It also states the credential prerequisite and the confirm requirement, giving clear context for when the operation will actually write.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_network_reportA
Destructive

Export an HTML or CSV report rendered from the portable snapshot model.

Mutating operation: writes a local report file immediately, persisted in the export directory. The call is rejected without writing unless confirm=true. Format must be "html" or "csv" and filename must end with the matching extension; plugins may register additional formats. Prefer export_portable_snapshot for the raw machine-readable model.

Args: filename: Output report file name inside the confined export directory; must end with the chosen format extension (e.g. .html, .csv). format: Report renderer to use — "html" or "csv" (plugins may register additional formats). confirm: Safety confirmation. Must be True to actually write; otherwise returns a rejection message.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatYesReport renderer to use — "html" or "csv" (plugins may register additional formats).
confirmNoSafety confirmation. Must be True to actually write; otherwise returns a rejection message.
filenameYesOutput report file name inside the confined export directory; must end with the chosen format extension (e.g. .html, .csv).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description explicitly declares 'Mutating operation: writes a local report file immediately, persisted in the export directory,' and explains rejection behavior when confirm is false. This informs the agent of side effects and side-effect gating. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states action, formats, safety requirement, and alternative in the first paragraph. Some redundancy exists between the prose and the repeated Args section, but every sentence contributes necessary operational context, and the structure is scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Combined with full schema coverage and the explicit safety/alternative statements, nothing an agent needs to invoke the tool correctly is missing. The description addresses the mutating side effect, required confirmation, file extension rules, and the preferred alternative — all critical to correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all three parameters with 100% coverage, and the description's Arg section essentially repeats those descriptions. No additional semantics about types, defaults, or constraints beyond what the schema provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a concrete verb and object: 'Export an HTML or CSV report rendered from the portable snapshot model.' It specifies output formats and clearly differentiates from export_portable_snapshot by mentioning the raw machine-readable alternative. Even among many sibling tools, its purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to prefer export_portable_snapshot when a raw machine-readable model is needed, which is a clear when-not-to-use. It also specifies the required confirm=true and format/extension constraints. This satisfies explicit guidance for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_portable_snapshotA
Destructive

Export a deterministic secret-free JSON snapshot to a local confined file.

Mutating operation: writes a local file immediately, persisted in the export directory. Returns the filename, size, schema version, and a content SHA-256 checksum for later verification with verify_snapshot. The call is rejected without writing unless confirm=true. Use export_network_report for human-readable HTML/CSV instead of the raw JSON model.

Args: filename: Target file name written inside the confined export directory (no path traversal). confirm: Safety confirmation. Must be True to actually write; otherwise returns a rejection message.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoSafety confirmation. Must be True to actually write; otherwise returns a rejection message.
filenameYesTarget file name written inside the confined export directory (no path traversal).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations only carry destructiveHint=true; the description goes well beyond this by disclosing that the call writes a file immediately to the confined export directory, is rejected without writing unless confirm=true, and returns a filename, size, schema version, and SHA-256 checksum. It also adds useful traits the annotations cannot express: deterministic and secret-free output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in a single crisp sentence, followed by a compact paragraph that covers behavior, safety gate, return contract, and sibling routing. Every sentence earns its place, with no filler or redundant repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description correctly takes on the return contract itself, listing filename, size, schema version, and SHA-256 checksum. For a 2-parameter tool with no nested objects, the description covers invocation, safety confirmation, destination, and verification path — 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented in the input schema. The description largely restates the confirm safety gate ('rejected without writing unless confirm=true') that the schema already explains, adding no new constraints or syntax details beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (export), a specific resource (deterministic secret-free JSON snapshot), and a scope (local confined file). It also explicitly differentiates from the sibling export_network_report by mentioning that it produces raw JSON rather than human-readable HTML/CSV, so an agent can distinguish it from siblings 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative and the selection condition: 'Use export_network_report for human-readable HTML/CSV instead of the raw JSON model.' It also implies the follow-up workflow by pointing to verify_snapshot for later checksum verification, giving the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forget_clientA
Destructive

Remove a client from the controller's known-clients list.

Destructive operation: deletes the client's stored identity and history; the client can still reappear on reconnect. Use kick_client to drop a session without deletion, or block_client to deny access persistently.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description adds concrete consequences: deletes stored client identity and history, and the client can reappear on reconnect. This goes beyond the annotation by explaining what is destroyed and the reconnection effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then a compact destructive warning and sibling routing, with only a short Args block. The Args block duplicates the schema, which prevents a 5, but nothing is wordy or off-topic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive three-parameter tool with 100% schema coverage and a destructive annotation, the description covers what is deleted, whether the client returns, how to choose alternatives, and all parameter roles. No output schema is needed for an action like this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents mac, site, and device. The description's Args block restates those descriptions without adding new semantics or examples, keeping this at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb-resource statement: 'Remove a client from the controller's known-clients list.' The description clearly delimits the operation against nearby siblings by naming kick_client and block_client as the alternatives for related but different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly labels the operation destructive and states when to prefer alternatives: kick_client for dropping a session without deletion, block_client for persistent denial. An agent gets direct decision rules rather than having to infer them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_alarmsA
Read-only

Return the currently active alarms (faults and warnings) for a site.

Read-only operation: it lists unacknowledged/active alarms with severity and message so you can see what needs attention. Use get_recent_events for the broad event feed including non-alarm activity; clear them with archive_all_alarms once handled, or use analyze_network_issues for a consolidated interpretation of alarms and health.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint=true, and the description reinforces it by saying 'Read-only operation.' Beyond that, it adds useful context: the tool lists 'unacknowledged/active alarms with severity and message' and scopes the query to a site and optional device. It doesn't describe pagination or rate limits, but for a simple read-only tool the added context is meaningfully helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: core purpose first, then read-only clarification, then routing to alternatives, then args. It is slightly redundant because 'Read-only operation' duplicates the readOnlyHint annotation and the Args section duplicates the schema, but the overall length is reasonable and every substantive sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of explaining return content; it does so by saying the tool lists 'unacknowledged/active alarms with severity and message.' It also covers when to use it and what to do afterward. Minor gaps remain: it doesn't specify the full alarm object structure, ordering, or empty-result behavior, but these are acceptable for a simple, low-complexity read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already fully describes both 'site' and 'device' parameters. The description's Args section simply repeats the schema text verbatim ('Site to query. Defaults to "default"' and 'Optional console/device name...'), adding no new meaning. Baseline 3 is appropriate because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Return the currently active alarms (faults and warnings) for a site,' which names a specific verb, resource, and scope. It distinguishes itself from siblings by explicitly contrasting with get_recent_events for non-alarm activity. This leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states when to use the tool ('so you can see what needs attention') and explicitly names alternatives with conditions: use get_recent_events for a broad event feed, archive_all_alarms once handled, or analyze_network_issues for consolidated interpretation. This is model usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_all_sites_healthA
Read-only

Return a health overview for every site managed by one UniFi console.

Read-only operation: it walks each site on the targeted console and returns a compact health snapshot per site (status, score, and key counts). Unlike get_global_health, this stays within a single console; unlike get_site_health, it covers all sites at once rather than one. Use get_global_health when you need cross-console aggregation; prefer get_site_health when you want full per-subsystem detail for a single named site.

Args: device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds behavioral detail beyond the annotation by stating the tool walks each site and returns a compact health snapshot per site including status, score, and key counts, which is useful context not present in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: a one-sentence summary, a compact comparison paragraph that routes to alternatives, and a minimal Args section. Every sentence contributes useful information with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one optional parameter, read-only annotations, and no output schema, the description covers the key gaps an agent needs: return shape, scope, relationship to sibling tools, and usage guidance. Nothing essential is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%; the single optional 'device' parameter is already documented in the schema as 'Optional console/device name to target a specific UniFi console; omit to use the default.' The description repeats this guidance but adds no new semantic meaning beyond the schema, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return a health overview for every site managed by one UniFi console.' It clearly distinguishes itself from siblings by naming get_global_health and get_site_health and explaining the scope difference: all sites within one console versus one site or cross-console aggregation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance with alternatives: use get_global_health for cross-console aggregation, prefer get_site_health for full per-subsystem detail of a single named site. This directly tells the agent how to route among the most similar sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_camera_detailsA
Read-only

Get the full configuration and runtime record for one Protect camera.

Read-only operation: it returns the camera's model, firmware, resolution, recording mode, privacy/IR state, connection state, and live statistics. The camera is resolved by ID first and then by name, so either form is accepted. Use list_cameras first to find the camera_id; use get_camera_snapshot to capture an image, or get_camera_health_summary for a connectivity-only view.

Args: camera_id: Protect camera identifier or name to look up. device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
camera_idYesProtect camera identifier or name to look up.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds valuable behavioral detail beyond the annotation by enumerating the returned fields and explaining the ID-then-name resolution order. It stops short of describing failure modes or output structure, but the added context is meaningful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: a crisp function statement, a concise read-only behavior summary, clear usage routing, and a compact Args block. Every sentence serves a purpose and nothing is redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only lookup with two parameters and no output schema, the description covers the purpose, prerequisite, alternatives, parameter resolution behavior, and a summary of returned data. No critical information needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds one genuinely useful semantic detail: 'camera is resolved by ID first and then by name.' The Args section mostly mirrors the schema, but this resolution behavior gives extra meaning to camera_id beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence, 'Get the full configuration and runtime record for one Protect camera,' states a specific verb, resource, and singular scope. It also names sibling tools (get_camera_snapshot, get_camera_health_summary) to distinguish this from related operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use list_cameras first to find the camera_id' and gives concrete alternatives with their conditions: get_camera_snapshot for an image and get_camera_health_summary for connectivity-only. This is clear when-to-use guidance with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_camera_health_summaryA
Read-only

Summarize the connectivity and health of all cameras on one Protect console.

Read-only operation: it partitions cameras into connected and disconnected sets, returns an overall status of "healthy" or "degraded", lists each disconnected camera as a critical issue, and offers remediation recommendations. Use this for a fleet-wide connectivity check; use list_cameras for the full per-camera detail or get_camera_details for one camera's complete record.

Args: device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint annotation by describing the output shape: connected/disconnected partitioning, an overall 'healthy' or 'degraded' status, critical issues listing disconnected cameras, and remediation recommendations. This gives the agent a clear model of what the operation returns and how it behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized: a clear first sentence defines the core purpose, the next sentences add behavioral detail and routing guidance, and the Args section handles the parameter. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only summary tool with one optional parameter and no output schema, the description covers the key return elements and selection behavior sufficiently. An agent has enough context to call the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, device, is already fully described in the input schema with 100% coverage. The description repeats the same device guidance without adding new meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('summarize') and resource ('connectivity and health of all cameras on one Protect console'), and explicitly distinguishes itself from list_cameras and get_camera_details. An agent can immediately understand the tool's scope and how it differs from nearby siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this tool for a fleet-wide connectivity check and names the alternatives for per-camera detail or a single camera's complete record. This gives clear when-to-use versus when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_camera_snapshotA
Read-only

Capture a still image from a connected Protect camera as a base64 JPEG.

Read-only operation: it requests a live frame from the camera and returns it as a base64-encoded JPEG plus camera name and id. If width and/or height are provided the image is resized to those pixel dimensions; if omitted the camera's native resolution is returned. A camera that is not in the CONNECTED state returns a success=false result rather than an image. Use get_camera_details to confirm the camera is online before calling.

Args: camera_id: Protect camera identifier or name to capture from. device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device. width: Optional target pixel width for the snapshot; native width if unset. height: Optional target pixel height for the snapshot; native height if unset.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoOptional target pixel width for the snapshot; native width if unset.
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
heightNoOptional target pixel height for the snapshot; native height if unset.
camera_idYesProtect camera identifier or name to capture from.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint annotation by explaining the live-frame request, the base64 JPEG plus camera name/id return value, resize behavior, and the success=false result for non-CONNECTED cameras. This gives the agent a strong model of what will happen when invoked.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main behavioral description is front-loaded and concise, with useful failure-mode and resize details. The Args block duplicates the schema descriptions, which adds mild redundancy, but the overall structure is readable and not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with no output schema, the description is remarkably complete: it specifies the return format, behavior with optional width/height, the offline-camera failure case, and the recommended pre-check via get_camera_details. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The Args section repeats the schema descriptions essentially verbatim, adding no new semantic information beyond what is already in the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool captures a still image from a Protect camera as a base64 JPEG, which is a specific verb and resource. It does not explicitly differentiate from related sibling tools like export_portable_snapshot or get_snapshot_capabilities, though the first sentence makes the core purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context, including the behavior for offline cameras and a direct recommendation to use get_camera_details to confirm the camera is online before calling. However, it does not explicitly state when to prefer this tool over related alternatives such as export_camera_clip or export_portable_snapshot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_client_detailsA
Read-only

Get the full device record for one client by MAC address.

Read-only operation: returns the client's identity, connection state, IP, signal/AP association, and history. Deeper than list_clients/list_all_clients, which return summarized rows only.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation'. It adds valuable behavioral context by enumerating what the response covers: identity, connection state, IP, signal/AP association, and history. No hidden mutation or side effects are implied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose, then read-only/return content, then sibling differentiation, then args. The Args block is somewhat redundant with the schema, but the overall length is appropriate and every section is clearly organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read operation, annotations cover safety, and the description lists the categories of returned data even without an output schema. It is complete enough for an agent to understand what it will get and when to use it, though exact response fields are not enumerated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The Args section in the description mostly repeats the schema fields and defaults, adding little new meaning beyond restating that 'device' is optional and defaults apply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a specific resource ('full device record for one client'), and the lookup key ('by MAC address'). It also explicitly differentiates itself from list_clients/list_all_clients by explaining it returns deeper detail than summarized rows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative tools (list_clients/list_all_clients) and gives the distinguishing condition: use this when you need depth beyond summarized rows. This gives an agent clear routing guidance for choosing this tool over its closest siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_client_experience_reportA
Read-only

Generate a client experience report with connection-quality metrics for a site.

Read-only operation: it summarizes signal-strength distribution, roaming stats, failed connections, and problematic clients across the site. Use troubleshoot_client for a deep dive on one specific client, or get_device_health_summary for the infrastructure view rather than client-side.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds useful context about what the report summarizes: signal-strength distribution, roaming stats, failed connections, and problematic clients. This goes beyond the annotation and helps set expectations about the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with purpose, then usage alternatives, then parameters. It is appropriately concise, though the Args section is redundant with the input schema. Every non-arg sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only report tool with two optional parameters and no required inputs, the description is complete. It explains what the report contains, how to choose among related tools, and what the parameter defaults are. No output schema exists, but the description gives enough information about the report's content to set expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section in the description essentially duplicates the schema descriptions without adding new meaning. The baseline of 3 applies because the schema handles parameter documentation fully; the description adds no extra semantic value for parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Generate a client experience report with connection-quality metrics for a site.' It clearly differentiates from sibling tools by naming troubleshoot_client and get_device_health_summary, so an agent can distinguish it from other reporting and client-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given for when to use which tool: troubleshoot_client for a deep dive on one specific client, get_device_health_summary for infrastructure view, and this tool for client-side summary metrics. This provides clear selection criteria beyond simple names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_client_organizationA
Read-only

Get durable local tags and group membership for one known client.

Read-only operation: resolves the client by identity, then returns its persisted local organization record (tags and group membership). This data is local to the server (local_only) and does not mutate the controller. Use set_client_tags or assign_client_group to change it.

Args: identity: Client MAC, IP, hostname, or alias to resolve to a known client. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
identityYesClient MAC, IP, hostname, or alias to resolve to a known client.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation readOnlyHint=true is reinforced by the description's 'Read-only operation' and 'does not mutate the controller.' It adds useful detail about resolving by identity, local_only data, and persistence, all of which exceed what the annotation alone provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, followed by a short behavior paragraph and a clear Args list. It is concise, but the Args section is redundant with the schema, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with no output schema, it explains the return concept (tags and group membership), the identity resolution behavior, and the local-only nature. It does not discuss failure modes or response format, but it is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section of the description merely repeats the schema descriptions verbatim. No additional semantic context is added beyond what the input schema already supplies, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get durable local tags and group membership for one known client.' This clearly distinguishes it from generic client tools such as get_client_details and from listing tools, making the purpose immediately identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states that set_client_tags or assign_client_group should be used to change the data, providing an clear when-not for mutations. It also frames the operation as read-only and local, giving solid usage context, though it does not contrast with other read-oriented sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_client_qos_capabilitiesA
Read-only

Describe validated controller QoS mutation capabilities.

Read-only operation: reports whether a validated controller QoS adapter is available for the targeted device. Previews created by plan_client_qos_policy are always local; apply_client_qos_policy performs no controller mutation in the current release. Use this before planning a policy to set expectations.

Args: device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds important behavioral context: the operation is read-only, previews are local, and apply_client_qos_policy performs no controller mutation in the current release. This meaningfully sets expectations and is consistent with the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the core purpose, and contains useful caveats. The Args section repeats schema-provided information but is not excessive; the overall structure is clear and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only capability check, the description is largely complete: it explains the preflight role, related policy tools, and local/no-mutation behavior. It does not specify the exact return format, but 'reports whether' is sufficient for an agent to act on the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially duplicates the schema's parameter text. No additional semantic detail is added beyond what the input schema already provides, so the baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it 'reports whether a validated controller QoS adapter is available' for a targeted device. It also references plan_client_qos_policy and apply_client_qos_policy, which disambiguates it from nearby QoS-related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: 'Use this before planning a policy to set expectations.' It names related QoS tools and clarifies that apply_client_qos_policy performs no controller mutation, but it does not fully enumerate when-not-to-use conditions or alternative selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_client_trafficA
Read-only

Get traffic statistics (rx/tx, throughput) for one client by MAC address.

Read-only operation: returns the client's cumulative and recent traffic counters. Use get_client_details for identity/connection state, or get_traffic_summary for site-wide traffic rather than a single client.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description reinforces this by saying 'Read-only operation: returns the client's cumulative and recent traffic counters.' This adds useful behavioral context beyond the annotation, such as the counters being cumulative/recent and covering rx/tx, throughput. It does not describe exact return formatting, but that is less critical for a read-only stats tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: first sentence states the purpose, second clarifies the read-only nature and return scope, third routes to alternatives, and the Args block is minimal. No wasted language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for selection and invocation: required parameter, default site, optional device, and alternatives are all covered. There is no output schema, but the description names the key returned data ('cumulative and recent traffic counters') and the operation type. A slight gap is the absence of units or exact return structure, but this is not blocking for a read-only traffic stats call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with each parameter already documented accurately (mac, site, device). The description repeats the parameter meanings in an Args block but adds no additional semantic detail beyond what the input schema provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get traffic statistics (rx/tx, throughput) for one client by MAC address.' It also differentiates itself from nearby siblings by explicitly naming get_client_details and get_traffic_summary as alternatives for different use cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when to use and when not: 'Use get_client_details for identity/connection state, or get_traffic_summary for site-wide traffic rather than a single client.' It also identifies that this is read-only, and the optional device parameter is scoped.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_detailsA
Read-only

Get detailed configuration and runtime record for one UniFi device.

Read-only operation: returns the device's ports, radios, uplink, system stats, temperatures, and traffic counters. The device is resolved by MAC first, then by name. Use list_devices to find the MAC; use get_device_stats for a metrics-only view without the full config dump.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes safety, and the description adds meaningful behavior: reads are read-only, the device is resolved by MAC first then by name, and the return includes configuration and runtime data. It does not discuss failure modes, but the annotation lowers the bar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and return contents, then gives alternatives and args. The Args block duplicates the schema descriptions, but the overall structure remains clear and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only detail lookup, the description covers what the tool returns, how the device is resolved, and how it differs from get_device_stats. It does not specify output format or error behavior, but with no output schema and a low-complexity tool, this is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description repeats the Args and adds a small behavioral detail about MAC-first resolution, but it does not substantially extend the semantic meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get detailed configuration and runtime record for one UniFi device.' It then enumerates the returned content (ports, radios, uplink, system stats, temperatures, traffic counters), which clearly differentiates it from siblings like get_device_stats.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent to use list_devices to find the MAC and get_device_stats for a metrics-only view without the full config dump. This directly guides tool selection against two relevant sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_health_summaryA
Read-only

Summarize device health across all APs, switches, and routers at a site.

Read-only operation: it reports uptime, load, memory, temperature, firmware versions, and devices needing attention. Use get_site_health or get_network_health for overall/site status, analyze_network_issues for issues folded into a report, or get_client_experience_report for the client perspective.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares the operation is read-only, and the description reinforces this by stating 'Read-only operation' and listing exactly what metrics are reported. It adds useful behavioral context about the scope and content of the summary, though it does not describe output format or potential response limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized: a single sentence states the core purpose, a second sentence clarifies read-only behavior and content, and the usage guidance names alternatives efficiently. The Args section is redundant with the schema but harmless and minimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's relatively simple behavior, the description covers the essential contextual information: what the summary includes, that it is read-only, and which sibling tools cover related but different needs. No output schema exists, but the listed output content gives enough expectation. A short note about response shape or error behavior would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters with defaults and descriptions. The tool description restates the site and device parameters but adds no new semantic detail beyond what the schema provides. This matches the baseline for full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the operation (summarize device health), the resource (APs, switches, and routers at a site), and the specific data included (uptime, load, memory, temperature, firmware, devices needing attention). It also names sibling tools that serve different purposes, making the tool's unique role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool versus alternatives: use get_site_health or get_network_health for overall/site status, analyze_network_issues for issue reports, and get_client_experience_report for client perspective. This is direct routing guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_portsA
Read-only

List the switch/gateway ports on a device with link and VLAN details.

Read-only operation: returns each port's index, name, media (GE/SFP), link state, speed, native network (VLAN) ID, PoE mode, forward setting, and the last connected peer MAC/IP where known. Use this to find the port_idx and current values before calling set_device_port.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true, and the description reinforces it with 'Read-only operation.' It adds transparency by listing exactly what is returned (media, link state, speed, native VLAN ID, PoE mode, peer MAC/IP) and notes the 'where known' caveat on peer data. No destructive or hidden behavior is possible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The narrative portion is tight and front-loaded, but the Args block duplicates the schema's parameter descriptions nearly verbatim. This is a minor redundancy since the input schema already documents mac, site, and device.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates by listing all returned port attributes and the 'where known' caveat. It also covers the mac format, site default, and optional device target, making the tool callable without external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section simply repeats the schema's parameter descriptions without adding new semantic detail. The baseline of 3 applies because the schema already carries the explanatory burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: 'List the switch/gateway ports on a device with link and VLAN details.' It enumerates the returned fields, which separates it from sibling read tools like get_device_details and explicitly links it to set_device_port.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly prescribes when to use it: 'Use this to find the port_idx and current values before calling set_device_port.' This is a concrete workflow instruction, and the read-only label tells the agent it is safe for retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_device_statsA
Read-only

Get performance and traffic statistics for one UniFi device.

Read-only operation: returns CPU/memory load, temperatures, fan level, client counts (user/guest), traffic totals, and AP radio stats where applicable. Use get_device_details for the full config record instead of metrics, or list_devices for a lightweight summary.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description reinforces and expands on this by listing exactly what metrics are returned and noting 'where applicable' for AP radio stats. This goes beyond the annotation's minimal signal, though it does not discuss rate limits or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by a compact metric list and explicit sibling alternatives. The Args section is structured and each sentence contributes meaningful guidance without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description names the expected return content in enough detail (CPU/memory, temperatures, fan, client counts, traffic, AP stats) for an agent to know what this tool provides. With all parameters documented and alternatives specified, nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's Args section largely duplicates the schema rather than adding new semantics; it clarifies MAC format and device targeting, but these are already present in the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get performance and traffic statistics for one UniFi device.' It enumerates the metrics returned and explicitly distinguishes itself from get_device_details and list_devices, so an agent can immediately understand its scope relative to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear routing guidance: use get_device_details for full config records, list_devices for lightweight summaries, and this tool specifically for metrics. It also frames the operation as read-only, helping the agent choose appropriate contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dpi_statsA
Read-only

Return Deep Packet Inspection application-breakdown statistics for a site.

Read-only operation: it ranks traffic by detected application/category so you can see what protocols and apps dominate usage. Use get_traffic_summary for a lighter volume-only overview, get_traffic_analysis for time-windowed trends and top talkers, or get_client_traffic for a single client's DPI view.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds behavioral context beyond the annotation by explaining that results are ranked by detected application/category, which tells the agent what kind of analysis the output supports. It does not go into return format or aggregation details, but the read-only safety profile is clearly covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by read-only context and alternative tools, and ends with a clean Args section. It is reasonably concise, though the Args section largely repeats the schema descriptions that are already present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description gives enough context that an agent knows what the tool returns (application/category breakdown ranking) and when to use it. It does not detail the exact output fields or time window, but all parameters are fully documented and the tool's role among siblings is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both site and device are already documented in the input schema with the same wording. The description's Args section duplicates this information rather than adding new semantic detail, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return Deep Packet Inspection application-breakdown statistics for a site.' It further clarifies that it ranks traffic by detected application/category, making the tool's role distinct from traffic summary, time-windowed analysis, and per-client DPI views.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names sibling alternatives and the conditions under which they should be used: 'Use get_traffic_summary for a lighter volume-only overview, get_traffic_analysis for time-windowed trends and top talkers, or get_client_traffic for a single client's DPI view.' This gives an agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_event_polling_statusA
Read-only

List event source capabilities and background polling state.

Read-only operation: returns each known event source with its capabilities and whether background polling is enabled. Use this to discover source names for poll_events_now, or list_runtime_events to read stored events.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as read-only, matching the readOnlyHint annotation. It also discloses what the response contains: each known event source, its capabilities, and whether background polling is enabled. This adds useful behavioral context beyond the bare annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states exactly what is listed, the second confirms the read-only behavior and return contents, and the third gives practical usage direction. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description sufficiently explains what the tool returns and how to use that output. It also names the relevant sibling tools for follow-up actions. For a parameterless status/discovery tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema carries no semantic burden. The description still clarifies that the operation covers all known event sources, which is sufficient for a no-argument discovery endpoint.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List') and a precise resource ('event source capabilities and background polling state'). It clearly differentiates itself from siblings by framing this as a discovery/status tool, not an action tool like poll_events_now or list_runtime_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool: to discover source names for poll_events_now, or to decide to use list_runtime_events for stored events. This is direct routing guidance and names the relevant alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firewall_policiesA
Read-only

Get zone-based firewall policies (UniFi Network 9+).

Read-only operation: returns each policy's name, action, protocol, index order, and source/destination zone ids. Policies are evaluated in index order; predefined "(Return)" companions appear alongside custom rules. Use create_firewall_policy to add one, or set_firewall_policy_enabled / delete_firewall_policy to manage it.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only readOnlyHint=true, and the description adds meaningful behavior beyond that: policies are evaluated in index order, and predefined '(Return)' companions appear alongside custom rules. It also notes the UniFi Network 9+ version requirement. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then return fields, then behavioral context, and then management alternatives. It is structured and each paragraph carries useful information. The only minor redundancy is the Args block duplicating schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description summarizes the return payload sufficiently: name, action, protocol, index order, and source/destination zone ids. It also covers optional site/device targeting and key evaluation behavior. Pagination or exact response shape is not described, but that is a minor gap for a read-only list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, and both parameters are already described in the schema with the exact same text as the description's Args section. The description adds no new semantic meaning over the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get zone-based firewall policies (UniFi Network 9+)', a specific verb and resource, and enumerates the returned fields. The 'zone-based' qualifier clearly differentiates this from the sibling get_firewall_rules. The purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names create_firewall_policy, set_firewall_policy_enabled, and delete_firewall_policy as the tools for adding or managing policies, guiding the agent to the right call for non-read operations. It also reinforces the read-only nature, which helps distinguish it from mutation tools. It does not explicitly contrast with get_firewall_rules, but the management alternatives are clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_firewall_rulesA
Read-only

Get legacy firewall rule configurations for a site.

Read-only operation: returns each rule's name, action, protocol, port, ruleset, and firewall-group bindings. Modern controllers use zone-based policies instead — see get_firewall_policies. Use create_firewall_policy for zone-based filtering.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only claim is redundant, but the description adds useful behavior beyond the annotation by enumerating exactly what data is returned (name, action, protocol, port, ruleset, firewall-group bindings). It also flags that this is legacy functionality on modern controllers. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with purpose, followed by return details and routing guidance. The Args section is somewhat redundant with the schema, but it is short and readable, so it does not significantly harm conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with two optional parameters and no output schema, the description is complete: it states the operation type, the returned fields, defaults, and points to alternatives for modern controllers. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section in the description repeats the schema's parameter descriptions verbatim without adding new meaning. The baseline of 3 applies because the schema already fully documents both parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get legacy firewall rule configurations for a site.' It also lists the returned fields, and explicitly distinguishes itself from get_firewall_policies, making it easy for an agent to identify exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear routing guidance: modern controllers should use get_firewall_policies, and zone-based filtering should use create_firewall_policy. This tells the agent both when to use this tool and when to choose a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_global_client_summaryA
Read-only

Summarize connected clients across every configured network console.

Read-only operation: it aggregates active clients from each network-enabled device and computes totals (wireless/wired/blocked), the top 10 talkers by usage, and a per-device client count. Use this for fleet-wide client visibility; use get_global_inventory for the device roster, get_global_health for subsystem health, or list_clients on a single console for the full per-client detail.

Returns: Dict with total_clients, wireless/wired/blocked counts, top_talkers, per_device counts, and an errors list when a console fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint annotation by explaining aggregation behavior: it aggregates active clients from network-enabled devices, computes wireless/wired/blocked totals, top 10 talkers, per-device counts, and includes an errors list when a console fails. This materially helps an agent predict behavior and output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, behavior, usage alternatives, and return shape each get a concise sentence. There is no filler or repetition that wastes the agent's attention.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument read-only tool with no output schema, the description fully covers scope, aggregation semantics, alternatives, and the return dictionary including failure behavior. An agent has enough context to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add about parameter meaning. The baseline of 4 applies because no parameter guidance is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and scope: 'Summarize connected clients across every configured network console.' It clearly distinguishes this tool from per-console tools like list_clients and names related siblings, so an agent can tell what it does without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool for fleet-wide client visibility and names alternatives: get_global_inventory for the device roster, get_global_health for subsystem health, and list_clients for full per-client detail. This provides clear routing guidance with exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_global_healthA
Read-only

Aggregate site health across every configured network console into one report.

Read-only operation: it collects per-subsystem site health (WAN/LAN/WLAN status, health score, and device/user counts) from each network-enabled device and folds them into a unified view with an overall "healthy" or "degraded" verdict. Use this for a single fleet-wide health check; use get_global_inventory for the device roster, get_global_client_summary for client counts, or get_site_health on a single console for full subsystem detail.

Returns: Dict with overall_status, device_count, a per-device subsystems breakdown, and an errors list when a console fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses what the operation collects (WAN/LAN/WLAN status, health score, device/user counts), how it folds it into a healthy/degraded verdict, and that a per-device errors list appears when a console fails. This is meaningful behavioral context beyond the structured annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the core purpose in the first sentence, then adds a scoped usage sentence and a compact return-value summary. No filler or redundancy beyond a harmless restatement of read-only behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with no output schema, the description is complete: it covers scope, aggregated output fields, verdict semantics, failure behavior, and alternative tools. An agent has enough to invoke and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so there is no parameter semantics burden on the description. The baseline for a no-parameter tool is 4; the description appropriately omits parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Aggregate site health across every configured network console') and clearly identifies the fleet-wide scope. It distinguishes itself from sibling tools by naming get_site_health for single-console detail and other global tools for inventory/client counts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to use the tool ('single fleet-wide health check') and lists alternatives with their purposes: get_global_inventory for device roster, get_global_client_summary for client counts, and get_site_health for full subsystem detail on one console. This is explicit routing with little left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_global_inventoryA
Read-only

Aggregate the full device inventory across every configured network console.

Read-only operation: it calls list_devices on each network-enabled device and merges the results into one list, tagging every entry with its source device name, plus any per-console errors. Use this to see every AP, switch, gateway, and router across all sites in one view; use list_unifi_devices for the console roster itself, or get_global_health / get_global_client_summary for aggregated health and client counts rather than the raw device records.

Returns: Dict with total_devices, the merged devices list (each tagged _source_device), and an errors list when a console fails.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses the underlying mechanism: it calls list_devices on each network-enabled device, merges results, tags entries with source device name, and captures per-console errors. It also specifies the return shape, giving the agent a clear behavioral model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured: a one-sentence purpose, a short read-only behavior note, explicit usage routing, and a compact Returns section. Every sentence adds information; none are redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-argument read-only aggregation tool, the description fully covers what it does, how it behaves, when to use it, and what it returns. There is no output schema, so the description's return-structure explanation is essential and sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so the description does not need to explain parameter meanings. The baseline of 4 applies because there are no parameters to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Aggregate the full device inventory across every configured network console.' It also enumerates the device categories included (AP, switch, gateway, router), and clearly distinguishes this tool from nearby siblings by naming what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: use this for a merged multi-console device view, use list_unifi_devices for the console roster itself, and use get_global_health / get_global_client_summary for aggregated health/client counts instead. This clearly routes the agent away from similar tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_liveviewsA
Read-only

List all configured UniFi Protect liveviews (camera view layouts).

Read-only operation: it returns each liveview's name, id, and the cameras and layout it includes on the targeted console. Use this to discover view groupings for dashboards or to confirm which cameras belong to a named liveview; it does not return footage or snapshots.

Args: device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation' without contradicting it. It adds useful context beyond annotations: the exact returned fields, the targeting of a specific Protect console, and the explicit negative scope of not returning footage or snapshots.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: core action first, then scope and use cases, then the parameter explanation. It is compact and informative, though 'Read-only operation' is slightly redundant with the annotation and the Args block mirrors the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter and no output schema, the description is complete: it explains the parameter resolution rule, the read-only nature, what fields are returned, and what is explicitly not returned. An agent has enough information to invoke and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, and the description's Args block essentially repeats the schema's wording for the optional `device` parameter. No additional semantic meaning, like format constraints or resolution order beyond the already-documented 'omit to use the first Protect-enabled device', is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all configured UniFi Protect liveviews (camera view layouts)', which is a specific verb and resource. It further clarifies the return contents (name, id, cameras, layout) and explicitly states it does not return footage or snapshots, distinguishing it from related media-retrieval tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: 'Use this to discover view groupings for dashboards or to confirm which cameras belong to a named liveview'. It also provides a when-not boundary by noting it 'does not return footage or snapshots'. However, it doesn't name alternative sibling tools for footage or snapshots, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_motion_eventsA
Read-only

Return recent camera motion events, resolved to camera names and timestamps.

Read-only operation: it queries Protect motion events over the lookback window, maps each event to its camera name and a human-readable timestamp, and returns the count and per-event list. Requires Protect username/password credentials configured for the console. Use get_smart_detections instead when you need AI classification (person/vehicle/animal/package) rather than raw motion; use get_protect_event_summary for aggregate counts.

Args: hours: Lookback window in hours from now (default 24). limit: Maximum number of events to return (default 50). camera_id: Optional Protect camera identifier or name to filter events to one camera; omit for all cameras. device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback window in hours from now (default 24).
limitNoMaximum number of events to return (default 50).
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
camera_idNoOptional Protect camera identifier or name to filter events to one camera; omit for all cameras.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already marks it read-only, and the description reinforces the read-only nature while adding genuine behavioral detail: it queries Protect events, maps them to camera names/human-readable timestamps, returns count and per-event list, and requires Protect credentials. This goes beyond annotation-only information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by concise read-only/requirements/alternatives and a compact Args block. No filler; each section contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only query with no output schema, the description tells the agent what it will get (count and per-event list with camera name/timestamp), how to constrain results, and which credential prerequisites exist. That is sufficient to invoke and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already covers all four parameters with the same descriptions and defaults, so the description adds no new meaning for hours, limit, camera_id, or device. The Args section is useful for visibility but not semantically additive beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Return recent camera motion events, resolved to camera names and timestamps.' It also names sibling alternatives, immediately distinguishing this tool from get_smart_detections and get_protect_event_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use alternatives: get_smart_detections for AI classification, get_protect_event_summary for aggregate counts. Also gives the lookback-window context and required credentials, making the selection criteria clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_network_healthA
Read-only

Return a single overall health summary for one site's network.

Read-only operation: it aggregates WAN/LAN/WLAN status, a composite health score, and device/user tallies into one condensed report. Use get_site_health when you need full per-subsystem detail for that site, get_all_sites_health for a multi-site sweep on one console, or get_global_health for cross-console aggregation.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description labels the operation read-only, matching the readOnlyHint annotation, and adds meaningful context about what the condensed report contains: WAN/LAN/WLAN status, a composite health score, and device/user tallies. It does not describe exact return formatting, but the annotation lowers the burden and the description still adds substantive behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence and the alternatives paragraph are tight and front-loaded. However, the Args block duplicates the input schema's descriptions almost verbatim, which adds length without new information for an agent that already has access to the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two optional parameters, a readOnly annotation, and no output schema, the description provides sufficient selection criteria, default behavior, and a summary of the returned report contents. It could be more explicit about the exact response structure, but nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args section in the description restates the schema descriptions (site defaults to 'default'; device is optional console name) without adding new constraints, format details, or examples beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Return a single overall health summary for one site's network.' It further specifies the aggregated content (WAN/LAN/WLAN status, composite health score, device/user tallies) and explicitly distinguishes itself from sibling tools like get_site_health, get_all_sites_health, and get_global_health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternatives and the conditions that select them: use get_site_health for full per-subsystem detail, get_all_sites_health for a multi-site sweep, and get_global_health for cross-console aggregation. This gives an agent clear routing guidance with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_networksA
Read-only

Get all network/VLAN configurations for a site.

Read-only operation: returns each network's name, purpose, VLAN id, subnet CIDR, and DHCP settings. Use create_network / update_network / delete_network to change them, or get_wlans for wireless networks.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description declares 'Read-only operation' and explains what the tool returns, adding value beyond the readOnlyHint=true annotation. It does not cover edge cases like site-not-found behavior, but for a simple read operation the disclosed behavior is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, read-only nature, return contents, alternatives, then parameters. Every sentence contributes useful information, and the argument block is clearly formatted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool, the description is complete: it specifies scope, returned fields, the fact that it is safe/non-mutating, and how to route to alternative tools. Since no output schema exists, including the returned field list is especially valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter descriptions already document both arguments. The description repeats the same parameter semantics rather than adding new meaning, though it does reinforce that 'site' is the primary scope and 'device' is optional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get all network/VLAN configurations for a site.' It also lists the exact returned fields (name, purpose, VLAN id, subnet CIDR, DHCP settings), which clearly differentiates it from sibling tools like get_wlans and create_network/update_network/delete_network.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names alternatives and their contexts: use create_network/update_network/delete_network for changes, and get_wlans for wireless networks. This gives an agent clear routing guidance without needing to inspect sibling schemas.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_observation_retention_statusA
Read-only

Get aggregate observation count and retained time range.

Read-only operation. Returns how many observations are stored and the earliest-to-latest retained time span. Use to gauge whether query_observation_trends can cover a desired window.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds value beyond the annotation by explaining exactly what is returned: the observation count and the earliest-to-latest retained time span.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and ends with a useful usage statement. Minor redundancy exists between 'Get aggregate observation count and retained time range' and the later restatement of the same output, which prevents a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only tool without an output schema, the description is complete: it names the returned data, confirms the read-only nature, and explains when to call it relative to query_observation_trends.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero parameters and the schema is empty, so parameter-level documentation is unnecessary. The description's focus on return values is appropriate for a parameterless operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get aggregate observation count and retained time range.' It also distinguishes itself from query_observation_trends by clarifying that this tool reports retention status, not observation data trends.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use to gauge whether query_observation_trends can cover a desired window,' providing a clear invocation context. It does not list exclusions or alternative conditions, but the guidance is specific and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_optimization_recommendationsA
Read-only

Analyze a site's configuration and return optimization recommendations.

Read-only operation: it checks channel selection, TX power, VLAN efficiency, port configurations, and bandwidth utilization to suggest improvements. Use analyze_network_issues when you want a fault/issue report instead of proactive tuning advice, or get_device_health_summary for device status only.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description labels itself as read-only, which aligns with the readOnlyHint annotation, and adds meaningful behavioral context by listing what it inspects. It goes beyond the annotation by explaining the scope of analysis, though it does not describe the exact shape of the returned recommendations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, concise, and front-loaded. The core purpose appears first, followed by usage guidance and parameter details, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for a read-only analysis tool with two optional parameters. It covers purpose, scope, alternatives, and parameter behavior. A minor gap is the lack of detail about the returned recommendation format, but the description adequately communicates what the tool returns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description's Args section largely duplicates that information and adds little beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Analyze a site's configuration and return optimization recommendations') and resource, then enumerates the exact areas checked (channel selection, TX power, VLAN efficiency, port configurations, bandwidth utilization). It also names sibling tools with different purposes, making differentiation easy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: use analyze_network_issues for fault/issue reports and get_device_health_summary for device status only. This directly tells the agent when to choose this tool versus clear alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_plugin_statusA
Read-only

List redacted trusted-plugin loading outcomes.

Read-only operation. Returns whether trusted code and sandboxing are active plus each plugin's load outcome. Requires admin scope when called over HTTP. Use to audit which plugins loaded successfully after startup.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already covers safety; the description adds that admin scope is required over HTTP and specifies the response content (trusted-code/sandboxing status plus per-plugin outcomes). This is useful behavioral context beyond the annotation, though it does not fully define what 'redacted' means in the output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences with the core purpose front-loaded; each sentence adds a distinct piece of information (purpose, read-only, return payload, admin scope, use case). No filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool without an output schema, the description provides enough to invoke and interpret the result: it names the operation, its auth requirement, and what the response contains. The only minor gap is the meaning of 'redacted,' but it does not block selection or invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, so the schema is fully covered by default; the description correctly focuses on return behavior instead. The baseline of 4 applies because there is nothing parameter-related to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and a distinct resource ('redacted trusted-plugin loading outcomes'), then clarifies exactly what is returned: whether trusted code and sandboxing are active and each plugin's load outcome. The tool is readily distinguished from the many health/site/device siblings by its plugin-specific subject.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the intended use case: 'Use to audit which plugins loaded successfully after startup.' It also states the admin-scope requirement for HTTP calls, but does not provide when-not-to-use or alternative sibling guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_port_forwardsA
Read-only

Get all port forwarding rules for a site.

Read-only operation: returns each rule mapping an external port+protocol to an internal IP+port on the gateway. Use this to audit forwards and to find a rule id before delete_port_forward, or create_port_forward to add one.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the readOnlyHint annotation by specifying exactly what is returned (mapping of external port/protocol to internal IP/port on the gateway). It frames the tool as an audit operation, which further clarifies expected behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line purpose, a brief behavioral/return explanation, a usage pointer, and a clear Args section. Every sentence adds functional value without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with only two optional parameters and no output schema, the description covers purpose, return shape, and usage workflow. It could add more detail about error cases or exact output format, but nothing essential is missing for calling it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter descriptions in the text mirror the schema exactly. The description does not add meaningful semantic detail beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get all port forwarding rules for a site') and explains what a rule contains (external port/protocol to internal IP/port mapping. This clearly distinguishes it from sibling tools like create_port_forward and delete_port_forward.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use the tool: to audit forwards and to find a rule id before delete_port_forward, and points to create_port_forward as the complementary operation. This gives the agent concrete routing guidance relative to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_port_profilesA
Read-only

Get switch port profile configurations for a site.

Read-only operation: returns each port profile's name and the settings applied to member switch ports (PoE, VLAN, forwarding). Use set_device_port to apply changes to a specific physical port.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description reinforces this by adding the specific return contents: each port profile's name and applied settings (PoE, VLAN, forwarding). It does not add deeper behavioral context like pagination or filtering limitations, but the read-only annotation lowers the bar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the core purpose and read-only nature. The Args section is somewhat redundant with the schema, but it is brief and does not clutter the overall structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with two optional parameters, the description covers what it returns, how it is scoped, and how it relates to the mutation sibling. No critical context is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters. The description's Args block simply repeats that information without adding new meaning beyond defaults and optionality already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Get switch port profile configurations'), names the resource ('port profiles'), and scopes it to a site. It also helps differentiate from the sibling set_device_port by showing what this tool is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly frames this as a read-only lookup and names the sibling set_device_port as the alternative for applying changes. This gives the agent clear decision guidance without requiring it to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_protect_accessoriesA
Read-only

Inventory all UniFi Protect accessories: lights, sensors, chimes, and viewers.

Read-only operation: it queries each accessory type on the targeted console and returns the raw records grouped by type along with a per-type count summary. Use this to audit Protect peripherals alongside cameras; it does not return camera devices (see list_cameras) nor event history.

Args: device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description confirms 'Read-only operation' while adding operational detail beyond the annotation: it 'queries each accessory type on the targeted console and returns the raw records grouped by type along with a per-type count summary.' It also discloses scope exclusions. This adds meaningful context beyond the structured annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by behavior and usage guidance that each earn their place. The only inefficiency is the Args block, which duplicates the schema verbatim; otherwise the explanation is compact and well-ordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional parameter and no output schema, the description covers purpose, accessory types, return shape (raw records grouped by type with counts), usage context, and exclusions. The internal structure of the raw records is unspecified, but nothing essential to invoking the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema's description of 'device' is identical to the Args section in the tool description. Because the structured schema already carries full parameter documentation, the description adds no new meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Inventory all UniFi Protect accessories: lights, sensors, chimes, and viewers' names a specific verb, resource, and explicit accessory types. It further distinguishes from siblings by stating 'it does not return camera devices (see list_cameras) nor event history,' so an agent can differentiate it from list_cameras and event-history tools 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this to audit Protect peripherals alongside cameras' and then gives exclusions: 'it does not return camera devices (see list_cameras) nor event history.' This provides both a positive use case and a named alternative, leaving no ambiguity about when to select this tool over its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_protect_event_summaryA
Read-only

Summarize all Protect events (motion, smart detections, doorbell) over a window.

Read-only operation: it aggregates event counts by type and camera activity for the lookback window on the targeted console. Requires Protect username/password credentials configured for the console. Use this for a single high-level tally; use get_motion_events or get_smart_detections for the underlying event records, or get_recent_protect_activity for the latest raw events.

Args: hours: Lookback window in hours from now (default 24). device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback window in hours from now (default 24).
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description explicitly states this is a read-only operation, aggregates event counts by type and camera activity, and requires configured credentials. This adds useful behavioral context, though it does not detail the exact response structure or edge-case behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose, followed by usage guidance, alternatives, and parameter details. Every sentence adds value without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only aggregation tool with only two optional parameters and no output schema, the description covers purpose, behavior, prerequisites, alternatives, and parameter semantics. It gives enough detail for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's parameter guidance mirrors the schema exactly. It does not add new meaning beyond the structured definitions, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation: summarizing Protect events over a lookback window and aggregating counts by type and camera activity. It also differentiates itself from sibling tools by saying to use get_motion_events, get_smart_detections, or get_recent_protect_activity for underlying or raw event records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use this tool ('Use this for a single high-level tally') and names the alternatives for more detailed data. It also provides a concrete prerequisite: Protect credentials must be configured for the console.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_protect_system_infoA
Read-only

Return UniFi Protect system information for one console, including device counts.

Read-only operation: it reports the Protect system version, NVR/storage status, and counts of cameras and accessories managed by the targeted console. Use this for a high-level overlay of a Protect deployment; use list_cameras or get_protect_accessories for the individual device inventory, or get_camera_health_summary for camera connectivity.

Args: device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the operation is read-only and details what it reports: Protect system version, NVR/storage status, and counts of cameras and accessories. This adds value beyond the readOnlyHint annotation by specifying the exact informational scope. It does not discuss output shape or error conditions, but for a simple read-only info tool the behavioral disclosure is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: a one-sentence summary, a read-only clarity statement, the main use case, sibling alternatives, and the parameter definition. Each sentence serves a distinct purpose with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, single-parameter tool, the description is complete: it explains what the tool returns, the intended high-level use case, the default behavior when 'device' is omitted, and which sibling tools cover adjacent needs. No critical context is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially repeats the schema's parameter description for 'device'. No additional parameter meaning, constraints, or examples are provided, so the description does not add value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Return UniFi Protect system information for one console, including device counts.' It clearly distinguishes itself from sibling inventory and health tools by naming what it does not do (list_cameras, get_protect_accessories, get_camera_health_summary).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: use this for a high-level overlay of a Protect deployment, and use named sibling tools for individual device inventory or camera connectivity. This leaves little ambiguity about when to choose this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_eventsA
Read-only

Return recent network events (connections, roams, admin actions) for a site.

Read-only operation: it surfaces the newest logged events with type, timestamp, and subject so you can trace what changed on the network. Use get_alarms when you only care about active fault/warning alarms rather than the full event stream; use get_optimization_recommendations or analyze_network_issues for interpreted, actionable findings.

Args: limit: Maximum number of events to return (default 50). site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
limitNoMaximum number of events to return (default 50).
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already include readOnlyHint=true, and the description reinforces this while adding context: it surfaces the newest logged events with type, timestamp, and subject, allowing the agent to trace network changes. This goes beyond the bare annotation, though it does not detail ordering guarantees, pagination, or response envelope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by usage guidance and parameters. The only minor issue is that the Args section repeats the schema descriptions almost verbatim, which is somewhat redundant but not harmful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with three optional parameters and no output schema, the description is complete: it explains what events are returned, what fields are included, how to scope by site and device, and which alternative tools to use for different needs. An agent has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and all three parameters already have clear descriptions in the input schema. The Args section in the description largely duplicates the schema text without adding new meaning, so the description does not enhance parameter understanding beyond the structured schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: 'Return recent network events' for a site, and enumerates the event types covered (connections, roams, admin actions). It also distinguishes itself from get_alarms and analysis tools, making sibling differentiation clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool versus alternatives: 'Use get_alarms when you only care about active fault/warning alarms' and 'use get_optimization_recommendations or analyze_network_issues for interpreted, actionable findings.' It also clarifies the read-only nature and defaults, leaving little ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_protect_activityA
Read-only

Return the most recent Protect events across all cameras as a quick overview.

Read-only operation: it fetches the latest events (up to limit) for the targeted console with camera names and timestamps resolved. Requires Protect username/password credentials configured for the console. Use this for a fast "what just happened" check; use get_protect_event_summary for aggregate counts or get_motion_events/get_smart_detections for filtered, time-windowed history.

Args: limit: Maximum number of recent events to return (default 20). device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of recent events to return (default 20).
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'Read-only operation' and adds context beyond the readOnlyHint annotation: it requires Protect username/password credentials, fetches up to limit events for the targeted console, and resolves camera names and timestamps. This is concrete behavioral detail an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then read-only behavior, then usage guidance and arguments. It is mostly efficient, though the Args section duplicates parameter descriptions already present in the schema, adding mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with two optional parameters, no output schema, and annotations covering safety, the description covers the essential context: purpose, alternatives, credential requirement, and default device behavior. 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.

Parameters3/5

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 Args section mostly restates the schema descriptions ('Maximum number of recent events to return (default 20)' and 'Optional Protect console name...'), adding no new meaning beyond what the input schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return the most recent Protect events across all cameras as a quick overview.' It is clearly distinguished from sibling tools like get_protect_event_summary, get_motion_events, and get_smart_detections, so an agent can tell what this tool does without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use this for a fast "what just happened" check' and routes alternatives: 'use get_protect_event_summary for aggregate counts or get_motion_events/get_smart_detections for filtered, time-windowed history.' It also states the credential prerequisite, leaving no ambiguity about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_routing_tableA
Read-only

Return the live Layer-3 routing table for a site's gateway.

Read-only operation: it lists each route with destination, next-hop, interface, and source/metric so you can verify static and learned routes. Use get_networks to inspect configured VLAN/subnet definitions rather than active forwarding paths.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation' while adding behavioral context: the table is live, lists each route with destination, next-hop, interface, and source/metric. This goes beyond the annotation by describing what the result contains without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, read-only clarification, alternative-tool routing, then parameter notes. Every sentence earns its place, and the alternative-tool sentence adds significant selection value without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with zero required parameters and no output schema, the description provides enough to call it correctly: it names the returned route fields, clarifies the live nature, and routes the agent to get_networks for configuration-level queries. Nothing necessary for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section merely restates the same information already present in the input schema: site defaults to 'default', device is optional and defaults to null. No additional semantics such as value formats, examples, or edge-case behavior are provided, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return the live Layer-3 routing table for a site's gateway.' It also names sibling get_networks to differentiate active forwarding paths from configured VLAN/subnet definitions, making the tool's scope immediately distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the intended use: 'verify static and learned routes' via the live routing table. It also provides a clear alternative: 'Use get_networks to inspect configured VLAN/subnet definitions rather than active forwarding paths.' This gives an agent explicit when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_server_healthA
Read-only

Return redaction-safe UniFi MCP runtime health and service counts.

Read-only operation. Reports counts of registered tools, configured data sources, and plugin status without exposing any secrets. Use to confirm the server and its sources are healthy before issuing deeper queries.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
versionYes
servicesYes
transportYes
persistenceYes
configured_devicesYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states it is read-only and redaction-safe, reporting only counts and status without exposing secrets. This adds meaningful behavioral context beyond the readOnlyHint annotation, clarifying what the tool does and does not reveal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first states what the tool returns, the second confirms safety/read-only behavior, and the third gives a concrete use case. No redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters, a readOnlyHint annotation, and an output schema present, the description covers everything an agent needs to select and invoke this tool correctly. It also positions the tool within a broader workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description need not explain parameter behavior. It still usefully indicates what information is reported, which is the relevant semantic content for this operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return redaction-safe UniFi MCP runtime health and service counts.' It clearly distinguishes itself from sibling health tools like get_site_health and get_network_health by focusing on the MCP runtime, registered tool counts, data sources, and plugin status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides a clear use context: 'Use to confirm the server and its sources are healthy before issuing deeper queries.' This tells the agent when to invoke the tool, though it does not explicitly mention alternatives or exclusion cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_site_healthA
Read-only

Get comprehensive health status for a site.

Read-only operation: returns per-subsystem health (WAN/LAN/WLAN status, score, and device/user counts) for the named site. Use get_network_health for a lighter summary, or get_global_health across consoles.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as read-only, consistent with the readOnlyHint annotation. It adds useful behavioral detail beyond the annotation by describing the returned per-subsystem health contents. No side effects are mentioned, but for a read-only health query this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentences are tight, front-loaded, and informative, with zero fluff. The Args section duplicates the schema verbatim, which is slightly redundant, but the overall length is justified and well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, return contents, parameters, and key alternatives, which is complete for a low-complexity read-only tool without an output schema. It does not fully enumerate every related sibling, but the most relevant routing guidance is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially repeats the schema's parameter documentation. It adds no new meaning beyond what the input schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get comprehensive health status for a site.' It further specifies the per-subsystem contents (WAN/LAN/WLAN status, score, device/user counts), and distinguishes itself from similar siblings by naming get_network_health and get_global_health. This makes the tool's role immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to choose alternatives: use get_network_health for a lighter summary, or get_global_health across consoles. It also clarifies the optional device parameter and the site default, leaving no ambiguity about invocation context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_site_settingsA
Read-only

Get the configuration settings for a site.

Read-only operation: returns the site's settings record (network, wireless, and advanced options) as stored on the controller. Use get_sysinfo for controller identity rather than tunable settings.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this while adding useful context: it returns the site's settings record 'as stored on the controller' and names the categories included. This goes beyond the annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main description is front-loaded and concise, with a clear read-only clarification and a helpful sibling comparison. The Args block is somewhat redundant with the schema, but the overall structure remains tight and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-optional-parameter read tool, the description covers what the tool returns, the scope of the settings, the read-only nature, and the key alternative. No output schema exists, but the description gives enough context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section only repeats the schema's existing parameter descriptions. It adds no new meaning beyond what the input schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get the configuration settings for a site.' It further clarifies the record contains network, wireless, and advanced options, and explicitly distinguishes itself from get_sysinfo, making it easy for an agent to select correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides direct usage guidance by naming the alternative: 'Use get_sysinfo for controller identity rather than tunable settings.' This tells the agent when not to use this tool and which sibling to choose instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_smart_detectionsA
Read-only

Return AI smart-detection events (person, vehicle, animal, package) with types.

Read-only operation: it queries Protect smart-detection events over the lookback window, maps each to its camera name and timestamp, and includes the smartDetectTypes and confidence score. Requires Protect username/password credentials configured for the console. Use detection_type to narrow to one class (e.g. "person"); use get_motion_events for raw motion without classification, or get_protect_event_summary for aggregate counts.

Args: hours: Lookback window in hours from now (default 24). limit: Maximum number of events to return (default 50). detection_type: Optional class filter - one of "person", "vehicle", "animal", "package"; omit for all smart-detection types. device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
hoursNoLookback window in hours from now (default 24).
limitNoMaximum number of events to return (default 50).
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
detection_typeNoOptional class filter - one of "person", "vehicle", "animal", "package"; omit for all smart-detection types.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations include readOnlyHint: true, and the description reinforces consistent read-only behavior while adding useful behavioral context: it queries the lookback window, maps events to camera name and timestamp, includes smartDetectTypes and confidence score, and requires Protect credentials. This goes beyond what annotations alone convey, though it does not address rate limits, ordering, or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded purpose statement, followed by behavioral guidance, sibling routing, and a compact Args section. It is appropriately sized, though the Args block largely duplicates schema descriptions, which is redundant if the schema is visible to the agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description reasonably conveys the essential return content: smart-detection types, camera name, timestamp, smartDetectTypes, and confidence score. It covers credentials, filtering, and alternatives. Minor gaps include lack of detail on result ordering, pagination behavior, and the structure of each returned event beyond the listed fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all four parameters. The description repeats the same parameter explanations rather than adding new semantic detail beyond the schema. It does not introduce examples, edge cases, or format constraints beyond what is already present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return AI smart-detection events (person, vehicle, animal, package) with types.' It clearly identifies what the tool returns and distinguishes it from related tools by naming the smart-detection classes and the fact that it operates on Protect events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool versus alternatives: it names get_motion_events for raw motion without classification and get_protect_event_summary for aggregate counts. It also explains how to narrow results via detection_type and notes the Protect credentials prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_snapshot_capabilitiesA
Read-only

Describe portable snapshot and report capabilities plus native backup limits.

Read-only operation. Returns supported report formats (html, csv), whether native controller backup/restore are available, and the configured source list. Use to learn what export_portable_snapshot and export_network_report can produce before calling them.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states 'Read-only operation', corroborating the readOnlyHint annotation, and goes beyond annotations by disclosing exactly what the response contains: supported report formats, native backup/restore availability, and the configured source list. Since there is no output schema, this fully carries the behavioral disclosure burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and every sentence earns its place: the opening defines the purpose, the middle states safety and return contents, and the closing provides usage context. It is front-loaded with the most important information and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only capability-discovery tool with no output schema, the description is complete: it explains what the tool does, what it returns, and when to use it relative to related export operations. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to document. Schema description coverage is 100% vacuously, and the baseline for zero-parameter tools is 4 because there is nothing for the description to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Describe'), a specific resource ('portable snapshot and report capabilities plus native backup limits'), and enumerates concrete output contents (html, csv formats, native backup availability, source list). This clearly distinguishes it from sibling export and verification tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs agents to use this tool to learn what export_portable_snapshot and export_network_report can produce before calling them, naming the relevant sibling tools and the triggering condition. This is direct and actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_speed_test_statusA
Read-only

Return the latest WAN speed-test result and run state for a site.

Read-only operation: it reports download/upload/latency from the most recent test and whether a test is in progress. Use run_speed_test to initiate a new measurement; this does not start one.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already marks this as safe, and the description reinforces and extends that by stating exactly what it reports: download/upload/latency from the most recent test and whether a test is in progress. It also explicitly clarifies that no new test is triggered, a behavioral detail not inferable from the schema alone. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, followed by the read-only note and the pointer to run_speed_test, then a brief Args list. The Args list is redundant with the schema but remains compact and non-disruptive. Overall it earns its place with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with two optional parameters and no output schema, the description conveys the key returned data (download/upload/latency and run state) and the correct alternative for starting a test. Minor edge cases, such as behavior when no prior test exists, are left unstated, but the core usage context is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section in the description repeats the schema property descriptions almost verbatim. No additional meaning is added beyond the schema's existing descriptions of site and device, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return the latest WAN speed-test result and run state for a site.' It clearly distinguishes itself from the sibling run_speed_test by stating it does not start a measurement. The scope is precise: site-level query covering download/upload/latency and run state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative for starting a test: 'Use run_speed_test to initiate a new measurement; this does not start one.' This gives a clear condition for when to use this tool versus a sibling. It also labels the operation read-only, further guiding appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sysinfoA
Read-only

Get system information for the site controller.

Read-only operation: returns controller identity, firmware version, and hardware/model details for the named site. Use get_site_settings for tunable settings instead of controller metadata.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes safety, and the description reinforces it by calling the operation 'Read-only' and specifying what data is returned. It adds useful behavioral context beyond the annotation: the operation returns identity, firmware, and hardware/model details, and can optionally target a device. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the core purpose, followed by a useful sibling-pointer and parameter details. The Args block repeats schema information exactly, which is mild redundancy, but overall every section earns its place and the length is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with two optional parameters and no output schema, the description provides enough context: what is returned, the read-only nature, the site/device scoping, and the main alternative tool. It is not exhaustive about response format or errors, but it is sufficient for reliable tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially duplicates the schema's parameter descriptions. The description does not add new semantic meaning beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get system information for the site controller,' then enumerates exactly what is returned (controller identity, firmware version, hardware/model details). It also distinguishes itself from get_site_settings, so an agent can clearly tell this tool apart from a likely sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs the agent to use get_site_settings when tunable settings are needed instead of controller metadata. It also clarifies the optional device argument and the default behavior ('omit for default'), giving clear selection and invocation guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_traffic_analysisA
Read-only

Analyze site traffic patterns over a configurable time window.

Read-only operation: it reports top talkers, application breakdown (DPI), bandwidth trends, and unusual activity for the lookback period. Use get_traffic_summary for a quick volume-only snapshot, get_dpi_stats for the app breakdown without the time series, or get_client_traffic for one client.

Args: hours: Lookback window in hours from now (default 24). site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
hoursNoLookback window in hours from now (default 24).
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already provide readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It also adds useful behavioral context by enumerating exactly what kind of analysis is performed: top talkers, DPI, bandwidth trends, and unusual activity. This is more than the annotation alone conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose sentence, read-only clarification, sibling routing, then a clean Args list. Every sentence contributes useful information, and the key scoping detail ('configurable time window') is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only analytics tool with no output schema, the description provides sufficient context: what it analyzes, what it reports, how parameters control scope, and which sibling tools cover adjacent use cases. An agent can confidently select and invoke this tool without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents hours, site, and device. The description's Args section largely repeats the schema's text and defaults without adding extra semantic meaning. This meets the baseline but does not go beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'Analyze site traffic patterns over a configurable time window.' It lists concrete outputs (top talkers, DPI breakdown, bandwidth trends, unusual activity), making the tool's purpose unmistakable. It also distinguishes itself from sibling tools by naming them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear routing guidance: use get_traffic_summary for a volume-only snapshot, get_dpi_stats for app breakdown without time series, and get_client_traffic for single-client traffic. This tells an agent exactly when to choose this tool versus the main alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_traffic_summaryA
Read-only

Return a condensed traffic-volume summary for a site.

Read-only operation: it reports overall throughput and totals without the per-app or time-series detail. Use get_dpi_stats for application-level breakdown, get_traffic_analysis for windowed trends and top talkers, or get_client_traffic for a specific client.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states 'Read-only operation,' matching the readOnlyHint annotation, and adds useful behavioral context about the output scope: overall throughput and totals without per-app or time-series detail. It does not describe error behavior or exact return fields, but for a simple read-only summary tool the added context is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with purpose, then differentiates from alternatives, then documents arguments. The Args block is redundant with the input schema, but the overall structure is clear and easy to scan, with no wasted filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity tool with two optional parameters, clear defaults, read-only semantics, and enough return-shape information (condensed traffic-volume summary, overall throughput and totals) to set expectations. The description also names alternatives, so an agent can select it confidently without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section merely restates the schema text for 'site' and 'device' without adding new semantics. The schema already documents defaults and optionality, so the description adds no extra parameter value beyond what structured data provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return a condensed traffic-volume summary for a site.' It further clarifies what the tool is not (no per-app or time-series detail), which helps distinguish it from traffic-related siblings without needing to inspect their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names alternatives and their appropriate use cases: get_dpi_stats for application-level breakdown, get_traffic_analysis for windowed trends and top talkers, and get_client_traffic for a specific client. This gives the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_wlansA
Read-only

Get all wireless network (SSID) configurations for a site.

Read-only operation: returns each WLAN's name, id, enabled state, guest flag, and security settings. Use create_wlan / update_wlan / delete_wlan to change them, or get_networks for wired networks.

Args: site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces 'Read-only operation' without contradiction. It adds useful context about what is returned: each WLAN's name, id, enabled state, guest flag, and security settings. This is appropriate additional transparency for a simple read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: purpose, read-only confirmation, returned fields, alternative tools, then parameters. Every sentence adds value, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation with two optional parameters and no output schema, the description is complete. It explains what is returned, clarifies that it is read-only, and points to sibling tools for related operations. No critical information is missing for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both site and device parameters. The description's Args section largely repeats the schema content without adding new semantic depth. It effectively confirms defaults but does not substantially go beyond the structured parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get all wireless network (SSID) configurations for a site.' It clearly distinguishes itself from get_networks by specifying WLANs and wired networks as separate. The description also enumerates key returned fields, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the relevant alternatives: 'Use create_wlan / update_wlan / delete_wlan to change them, or get_networks for wired networks.' This provides clear routing guidance for both mutation and wired-network use cases, which is strong usage guidance beyond the tool's own purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

kick_clientA
Idempotent

Force-disconnect a client; it may reconnect normally.

Mutating operation: drops the active session without a persistent block, so the client can re-associate. Use block_client/unblock_client for a lasting block, or forget_client to remove the client record entirely.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly discloses the behavioral impact: it is a mutating operation that drops the active session, has no persistent block, and allows the client to re-associate. This goes beyond the idempotentHint annotation by explaining what actually happens at the session level and what does not happen, giving the agent a clear safety and side-effect picture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line summary, a short behavioral explanation with sibling routing, and a clean Args list. No sentence is wasted, and the most important information is front-loaded. It earns every line it uses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter mutating tool with no output schema, the description covers the action, its side effects, its non-persistence, and the relevant alternatives. The idempotentHint annotation covers idempotency, and the schema covers parameter formats. Nothing essential is missing for an agent to correctly select and invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description's Args section essentially repeats the schema descriptions rather than adding new meaning. It is minimal and accurate, but does not enrich the parameter semantics beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Force-disconnect a client.' It clearly distinguishes this from sibling tools block_client/unblock_client and forget_client by stating that it drops the active session without a persistent block. An agent can confidently identify what this tool does and how it differs from related actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names alternatives and the conditions for choosing them: 'Use block_client/unblock_client for a lasting block, or forget_client to remove the client record entirely.' This directly answers when to use this tool versus its siblings and leaves no ambiguity about the temporary nature of the action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_clientsA
Read-only

List every known client (connected and offline) on a site.

Read-only operation: includes clients not currently connected, so it is the superset of list_clients. Use get_client_details for deep per-client detail or list_clients when you only need active connections.

Args: site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces it while adding useful scope context: it includes offline clients and is the superset of list_clients. However, it does not describe return format, pagination, or other behavioral details. This is consistent with calibration: annotation covers safety, description adds modest supporting context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then immediately clarifies scope and alternatives, then gives a compact Args block. Every sentence earns its place; no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation with fully documented parameters and clear sibling routing, the description is nearly complete. It does not detail the exact return fields or pagination, and there is no output schema, but the core selection and usage context are all present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially repeats the schema text without adding new meaning. Both parameters are already fully documented, so there is no need for the description to compensate; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb ('List') and resource ('every known client (connected and offline) on a site'), and explicitly distinguishes itself from the sibling list_clients as the superset. This lets an agent understand the scope without needing to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool versus alternatives: use get_client_details for deep per-client detail, and list_clients when only active connections are needed. This provides direct routing guidance among closely related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_camerasA
Read-only

List every UniFi Protect camera with its online state and identity.

Read-only operation: it returns a summary per camera (name, model, state, and connection status) for the targeted Protect console. Use this to discover the camera_id values needed by get_camera_details, get_camera_snapshot, get_camera_health_summary, and the event tools. Use get_camera_health_summary when you only need aggregate connected/disconnected counts rather than the full per-camera list.

Args: device: Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, and the description reinforces it as 'Read-only operation'. It adds useful behavioral context beyond the annotation by describing the per-camera summary fields and the targeting behavior for the Protect console, including the fallback to the first Protect-enabled device when device is omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core action appears in the first sentence, followed by return details, usage guidance, the alternative tool, and a parameter note. Every sentence serves a distinct purpose without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only listing tool, the description fully covers what the tool returns, why an agent would call it, how to choose an alternative, and how the optional device parameter behaves. No output schema exists, so the explicit summary-field disclosure is especially valuable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the device parameter's schema description already conveys the optional targeting behavior. The description's Args section repeats this same information without adding new semantics, so it neither hurts nor meaningfully improves on the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and object: 'List every UniFi Protect camera with its online state and identity.' It also clarifies the return content (name, model, state, connection status) and distinguishes the tool from get_camera_health_summary and the camera detail/snapshot tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is explicitly stated: use this tool to discover camera_id values needed by get_camera_details, get_camera_snapshot, get_camera_health_summary, and event tools. It also names the alternative for aggregate counts, get_camera_health_summary, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_client_groupsA
Read-only

List local client groups and deterministic member counts.

Read-only operation: returns the local groups (local_only) for the controller/site with a deterministic member count per group. Use list_clients_by_organization to enumerate the actual member identities.

Args: site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description reinforces this with 'Read-only operation.' It adds useful behavioral context beyond the annotation: results are scoped to local groups (local_only), member counts are deterministic, and identities are intentionally excluded. This is meaningful supplemental transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by read-only scope and the key sibling distinction. The Args section is slightly redundant with the schema but not excessive. Overall every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with two optional parameters, the description covers the main operational need: what is returned (groups with counts), the scope (local_only), and the alternative for member identities. No output schema exists, so a bit more detail about the exact return shape would be helpful, but the description is sufficient for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description's Args section only restates the same site and device explanations without adding new meaning, examples, or edge-case guidance. Therefore the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List local client groups and deterministic member counts.' It also distinguishes itself from list_clients_by_organization by clarifying that the latter enumerates actual member identities, so an agent can tell them apart without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly identifies list_clients_by_organization as the alternative for enumerating members, which gives clear decision guidance for the main ambiguity. It also marks itself as read-only. It doesn't explicitly discuss when to use create/delete/assign_client_group, but those are clearly different operations and the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_clientsA
Read-only

List all currently connected (online) clients on a site.

Read-only operation: returns only clients with an active connection at query time. For the historical/known roster including offline clients use list_all_clients; for deep per-client detail use get_client_details.

Args: site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, and the description reinforces it while adding temporal nuance: only clients with an active connection at query time are returned. This adds useful behavioral context beyond the structured annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the operation first, then read-only scope, then sibling alternatives, and finally the parameters. Every sentence contributes useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple optional-parameter read-only listing tool, the description fully covers what the tool returns, how it differs from nearby tools, and what the parameters mean. No output schema is present, but none is needed for an agent to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially mirrors the schema text for site and device. It adds no new meaning beyond what the input schema already documents, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List all currently connected (online) clients on a site.' Explicitly differentiates from list_all_clients and get_client_details, so an agent can identify this tool's exact scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear guidance on when to use this tool and when to use alternatives: use this for active connections at query time, list_all_clients for historical/known roster, and get_client_details for deep per-client detail. This leaves no ambiguity about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_clients_by_organizationA
Read-only

List stable client identities for exactly one local tag or group.

Read-only operation: returns the persisted client keys (MACs) that match a single tag or group filter (local_only). Exactly one of tag or group must be supplied; supplying neither or both is an error. Use list_client_groups to discover group names.

Args: tag: Optional local tag to filter clients by; mutually exclusive with group. group: Optional local group name to filter clients by; mutually exclusive with tag. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional local tag to filter clients by; mutually exclusive with group.
siteNoSite to operate on. Defaults to "default".default
groupNoOptional local group name to filter clients by; mutually exclusive with tag.
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description affirms the read-only behavior, adds that the result contains persisted MAC-based identities, and discloses the error condition for missing/conflicting filters. Since the readOnlyHint annotation already covers safety, the description adds meaningful operational context without contradicting the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentences are tight, front-loaded, and high-value. The Args section mostly duplicates schema descriptions, adding minor redundancy, but the overall length is still proportionate and the layout is clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All needed info is present: what is returned, the required filter constraint, error behavior, defaults, and a sibling pointer for discovering valid group names. The absence of an output schema is mitigated because the description states the return content (client keys/MACs).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds a crucial semantic above the schema: the exact-one-of requirement for tag/group, which the schema's optional fields would otherwise obscure. It also explains site and device defaults, though this largely mirrors the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operation ('List stable client identities') and a precise scope ('for exactly one local tag or group'). It also clarifies it returns persisted client keys (MACs), making the resource unambiguous. The pointer to list_client_groups further separates it from group-management siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit invocation constraints: exactly one of tag or group must be supplied, and neither/both is an error. It also directs the agent to list_client_groups for discovering group names. However, it does not explicitly state when to prefer this over list_clients or list_all_clients, so it falls short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_devicesA
Read-only

List all UniFi network devices (APs, switches, routers) on a site.

Read-only operation: returns a per-device summary for the targeted site, including name, MAC, model, type, IP, online state, uptime, and firmware version. Use this to discover the MAC values needed by get_device_details, restart_device, and the other device tools.

Distinction: use list_unifi_devices to see the server's configured consoles (controller roster); use get_global_inventory for an aggregated inventory across all consoles. This tool lists devices within one site on one console.

Args: site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes safety, and the description reinforces it with 'Read-only operation' and adds useful behavioral context about the per-device summary content. It does not mention pagination or limits, but for a straightforward list operation the stated behavior is sufficient and goes beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by read-only status, use case, sibling distinction, and parameters. The Args section is slightly redundant with the schema, but overall every section contributes meaningfully.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description fully compensates by listing the return fields (name, MAC, model, type, IP, online state, uptime, firmware version) and clarifying site/console scope. It also names sibling alternatives and typical use cases, making it self-sufficient for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents both parameters. The description's Args section largely repeats the schema text without adding new semantic detail, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List') and resource ('all UniFi network devices (APs, switches, routers) on a site'), and clearly distinguishes this tool from list_unifi_devices and get_global_inventory. It also enumerates the return fields, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool ('Use this to discover the MAC values needed by get_device_details, restart_device, and the other device tools') and explicitly contrasts it with sibling tools list_unifi_devices and get_global_inventory. This gives an agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_job_runsA
Read-only

List redacted background job run outcomes.

Read-only operation: returns up to limit recent schedule/job run records (status, timestamps) with secret values redacted. Use run_schedule_now or list_schedules to discover runnable schedules.

Args: limit: Maximum number of job runs to return. Defaults to 100.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of job runs to return. Defaults to 100.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavior beyond the readOnlyHint annotation: it confirms the operation is read-only, states that secret values are redacted, and describes the returned data as recent records with status and timestamps. This is strong transparency for a simple read tool, though it does not elaborate on ordering or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose and key behavioral note (redaction). It then provides sibling routing and parameter details without wasting words. Every sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter, no required inputs, and no output schema, the description is complete enough: it explains what is returned, the field kinds included, the redaction behavior, the limit parameter, and where to find runnable schedules. No critical gap remains for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section merely repeats the schema's existing limit description. It adds no new semantic detail beyond what the input schema already provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List redacted background job run outcomes.' It clearly identifies the tool's scope (recent schedule/job run records) and distinguishes it from siblings by explicitly mentioning run_schedule_now and list_schedules for discovering runnable schedules.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the tool's purpose and gives a clear alternative condition: 'Use run_schedule_now or list_schedules to discover runnable schedules.' This tells the agent when not to use this tool and names the siblings to use instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_observation_scopesA
Read-only

List the aggregate observation scopes currently retained.

Read-only operation. Returns the distinct scope dimensions (source, controller, site) present in the observation store. Use to discover valid filter values for query_observation_trends.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares the operation is read-only, and the description reinforces it. It adds useful behavioral detail beyond the annotation: the tool returns distinct scope dimensions from the observation store, which helps the agent understand what data to expect. No contradiction or hidden side effects are indicated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core purpose appears in the first sentence, followed by read-only confirmation and a concrete use case. Every sentence contributes meaningful information without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, an output schema is absent, and the readOnlyHint annotation covers the safety profile, the description fully covers what an agent needs to know. It explains both the output content and the intended use, leaving no critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to explain. The description compensates by clarifying what the return data represents, which is sufficient for an agent to invoke the tool confidently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), the resource ('aggregate observation scopes currently retained'), and exactly what is returned ('distinct scope dimensions (source, controller, site)'). It clearly distinguishes this tool from the query_observation_trends sibling by framing it as a discovery helper for filter values.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool: 'Use to discover valid filter values for query_observation_trends.' This provides a clear, actionable usage context and links it to the relevant sibling tool without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_runtime_eventsA
Read-only

List normalized events retained by the optional runtime store.

Read-only operation: returns up to limit normalized events persisted by the runtime store. Requires UNIFI_RUNTIME_ENABLED=true; otherwise unavailable. Use get_event_polling_status to see which sources feed events.

Args: limit: Maximum number of events to return. Defaults to 100.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of events to return. Defaults to 100.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The read-only hint is confirmed in the prose ('Read-only operation'), and the description adds meaningful behavior beyond the annotation: the runtime store is optional, the operation fails without the UNIFI_RUNTIME_ENABLED flag, and the result is capped by `limit`. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the resource and operation are stated in the first sentence, then prerequisites and related tool guidance follow. Every sentence adds useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only list operation, the description covers the resource, the limit parameter default, the enabling prerequisite, and the related status tool. With readOnlyHint already annotated and no output schema required, nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the only parameter `limit` is already fully documented in the schema as 'Maximum number of events to return. Defaults to 100.' The description repeats this without adding extra meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List') applied to a specific resource ('normalized events retained by the optional runtime store'), making the tool's scope clear. It also differentiates from event-related siblings by emphasizing the runtime store, so an agent can distinguish it from get_recent_events or poll_events_now.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: it is read-only, returns up to a limit of normalized events, and requires UNIFI_RUNTIME_ENABLED=true. It also points to get_event_polling_status as the related tool for seeing source feeds, but does not explicitly explain when to prefer this over alternatives like get_recent_events.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_schedulesA
Read-only

List allowlisted interval schedules.

Read-only operation: returns the persisted interval schedules (name, job, interval, enabled) and whether background automation is enabled. Use create_interval_schedule to add one, or run_schedule_now to trigger it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this is a safe read operation, and the description reinforces it by stating 'Read-only operation.' It adds useful detail about the response contents, including 'whether background automation is enabled,' which goes beyond the annotation. Minor gaps like pagination or ordering are not mentioned, but the behavior is well disclosed for a simple 0-parameter list call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences plus one brief routing sentence. Every sentence provides necessary information: what the tool lists, what it returns, and how to perform related actions. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 0-parameter, read-only list operation with no output schema, the description provides all essential context: the resource type ('allowlisted interval schedules'), the exact returned fields, and the read-only guarantee. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter meaning to add. The schema is empty and fully covered. The description appropriately focuses on what the operation returns rather than parameter usage, so the baseline 4 for 0-parameter tools is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List allowlisted interval schedules.' It then details the returned fields (name, job, interval, enabled) and flags the read-only nature, making the tool's purpose unambiguous and distinguishable from sibling tools like create_interval_schedule and run_schedule_now.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly positions this as the read-only listing operation and directs agents to create_interval_schedule for adding and run_schedule_now for triggering. This gives clear guidance on when to use this tool versus the relevant alternatives in the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sitesA
Read-only

List all UniFi sites accessible to the current user.

Read-only operation: returns each site's id and name from the targeted console(s). Use get_site_health / get_site_settings for per-site detail once you have a site name.

Args: device: Optional console name to target a specific UniFi device; omit for the default device.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceNoOptional console name to target a specific UniFi device; omit for the default device.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as read-only, consistent with the readOnlyHint annotation, and adds context about the scope ('accessible to the current user') and the output (site id and name). It does not disclose potential pagination or rate limits, but for a simple read-only listing tool the provided behavioral context is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short, front-loaded with the core purpose, and logically structured with a read-only note, return-value information, and an alternative-tool pointer. The Args block is redundant with the schema, which prevents a perfect score, but it is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with one optional parameter and no output schema, the description covers what the tool returns, how to target a specific console, and what to use afterward for more detail. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section repeats the schema's device description almost verbatim, adding no new semantic information. The optional device parameter is already well documented in the schema, so the description does not need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('all UniFi sites accessible to the current user'), and states the return values (each site's id and name). It further distinguishes itself from sibling tools by directing users to get_site_health / get_site_settings for per-site detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells users to use get_site_health / get_site_settings for per-site detail once a site name is known, which clarifies when this listing tool is appropriate versus its alternatives. It also frames list_sites as the initial discovery step, giving clear context for when to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_unifi_devicesA
Read-only

List every UniFi device (console) configured for this server.

Read-only operation: it returns each configured device's name, controller URL, site, and the services it exposes (network, protect), plus convenience lists of network-only and protect-only device names. This is the authoritative source for the device name accepted by every other tool's optional device parameter. Use get_global_inventory / get_global_health when you instead want aggregated data across those consoles rather than the console roster itself.

Returns: Dict with total_devices, a per-device list, and network_devices / protect_devices name lists.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only operation,' so there is no contradiction. It adds genuine value beyond the annotation by disclosing the return contents (name, controller URL, site, services, network-only/protect-only lists) and the response shape (Dict with total_devices, per-device list, and name lists), which is especially useful given there is no output schema. It stops short of a 5 because it does not address edge cases such as behavior when no consoles are configured.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then a compact paragraph of functional detail, an alternative-routing sentence, and a clearly formatted Returns section. Every sentence earns its place — no filler, no repetition of schema or annotation content — and the ~120-word length is appropriate for a tool that must compensate for the absence of an output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description covers everything an agent needs: exact scope, return fields and structure, and sibling routing. The explicit 'Returns:' section is a significant completeness win given no output schema exists; the only omission is edge-case behavior (e.g., empty roster), which is minor for this operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to explain beyond the schema; the 100% (vacuous) schema coverage and the 0-parameter baseline of 4 apply. The only parameter-related information, the 'device' parameter accepted by other tools, is correctly positioned as context for where this tool fits rather than as an input to this tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'List every UniFi device (console) configured for this server,' which precisely defines the tool's scope. The parenthetical '(console)' plus the explicit contrast with get_global_inventory / get_global_health ('aggregated data across those consoles rather than the console roster itself') distinguishes it from sibling tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names alternatives: 'Use get_global_inventory / get_global_health when you instead want aggregated data across those consoles rather than the console roster itself,' giving a clear when-not condition. It also positions the tool as 'the authoritative source for the device name accepted by every other tool's optional device parameter,' telling the agent exactly when to call it — when a valid console/device name is needed for downstream calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhook_deliveriesA
Read-only

List redacted webhook delivery and dead-letter state.

Read-only operation: returns up to limit delivery records (status, attempts, dead-letter state) with secret values redacted. Use test_webhook_destination to trigger a send, or list_webhook_destinations to see configured endpoints.

Args: limit: Maximum number of delivery records to return. Defaults to 100.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of delivery records to return. Defaults to 100.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true; the description reinforces this and adds meaningful behavior: secret values are redacted, up to limit records are returned, and dead-letter state is included. No contradiction with annotations. It doesn't cover ordering or pagination, but the added context exceeds the read-only annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded, scannable, and free of filler. The Args section duplicates the schema's parameter description, but the rest of the description is efficient and well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-param read-only tool with no output schema, the description conveys return contents, redaction behavior, and the limit default. It doesn't state ordering or pagination of deliveries, but the definition is largely self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% since the limit parameter is fully documented with type, default, and description. The description's Args block and prose only restate 'maximum ... returns up to limit' without adding new constraints, formatting, or edge-case meaning, so the schema carries the weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'List redacted webhook delivery and dead-letter state.' It explicitly differentiates from siblings by saying test_webhook_destination triggers a send and list_webhook_destinations shows configured endpoints, so an agent can pick this tool for inspecting delivery history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context: this read-only operation returns delivery records with status, attempts, and dead-letter state. It names sibling tools for related actions, but stops short of explicit when-not-to-use criteria or conditions for choosing this over a more general event list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_webhook_destinationsA
Read-only

List webhook destinations without secret values.

Read-only operation: returns configured outbound webhook destinations with secret material omitted. Use create_webhook_destination to add one, or list_webhook_deliveries to see send history.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description adds meaningful context by stating the operation is read-only and that secret material is omitted from the response. It also clarifies it returns configured outbound destinations, which goes beyond the annotation alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it opens with the key differentiator ('without secret values'), then gives read-only context and sibling routing. Every sentence earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter read-only listing, the description is complete. It tells the agent what is returned, what is omitted, and how related operations differ. No output schema is present, but the description sufficiently indicates the nature of the result without needing to document return fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter-level semantics are not needed. The schema coverage is effectively complete, and the description provides no misleading parameter details. This matches the baseline for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists webhook destinations and immediately distinguishes it from related operations by noting secret values are omitted. The verb 'List' plus the resource 'webhook destinations' makes the purpose unambiguous and differentiates it from sibling tools like create_webhook_destination and list_webhook_deliveries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names alternatives and when to use them: create_webhook_destination to add one and list_webhook_deliveries for send history. This gives an agent direct routing guidance and clarifies where this read-only listing fits among the webhook-related sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

locate_deviceA
Idempotent

Enable or disable LED blinking to physically locate a device.

Mutating operation: toggles the locator LED on the device and is persisted on the console. Set enabled=True to start blinking, False to stop. This changes only the LED state and has no effect on connectivity or config.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). enabled: True to start LED blinking, False to stop. Defaults to True. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
enabledNoTrue to start LED blinking, False to stop. Defaults to True.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as mutating, discloses that the LED state is persisted on the console, and assures that only the LED state changes without affecting connectivity or config. This goes well beyond the idempotentHint annotation and gives the agent a precise model of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and follows with concise behavioral context. The Args section is somewhat redundant with the schema, but it is clearly formatted and not wordy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the operation's effect, persistence, parameter meanings, and scoping options. There is no output schema, but the behavioral outcome is clearly stated, and the tool is simple enough that no further detail is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section largely duplicates the schema's parameter descriptions. No additional semantic nuance is added beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Enable or disable LED blinking to physically locate a device.' It clearly identifies the tool's function and distinguishes it from sibling device-management tools like restart_device or upgrade_device.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The purpose statement implies the usage context: physically locating a device. It tells the agent this is a locator function, not a general device management operation. It does not explicitly name alternatives or exclusion conditions, but the intended use is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_client_qos_policyA

Persist a deterministic QoS target preview without controller mutation.

Mutating (local) operation: resolves selector_type/selector_value to concrete client keys and stores a durable QoS plan (plan_token) on the server with the requested download/upload limits. It does NOT change the controller. Pair the returned plan_token with apply_client_qos_policy to attempt activation. Requires UNIFI_RUNTIME_ENABLED=true; use get_client_qos_capabilities to check adapters.

Args: selector_type: Scope of the policy - "client", "tag", or "group". selector_value: Client identity (MAC/IP/hostname) when selector_type is "client", otherwise the tag or group name to expand to clients. download_kbps: Maximum download bandwidth in kilobits per second. upload_kbps: Maximum upload bandwidth in kilobits per second. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
upload_kbpsYesMaximum upload bandwidth in kilobits per second.
download_kbpsYesMaximum download bandwidth in kilobits per second.
selector_typeYesScope of the policy - "client", "tag", or "group".
selector_valueYesClient identity (MAC/IP/hostname) when selector_type is "client", otherwise the tag or group name to expand to clients.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so well. It discloses that the operation is local, resolves selectors to client keys, persists a durable plan_token, does not mutate the controller, and has an environment prerequisite. This goes beyond basic verb/resource description and prevents false assumptions about immediate activation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by behavioral details, prerequisites, and parameter explanations. It is somewhat longer than strictly necessary because the Args section overlaps heavily with the schema, but every sentence contributes useful context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with no output schema and no annotations: it explains the operation's effect, the returned plan_token, the activation path, prerequisites, and parameter semantics. It stops short of detailing exact return formatting or failure modes, but those are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline of 3 applies. The description repeats and slightly clarifies the parameter meanings, especially selector_type and selector_value, but does not meaningfully add information beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Persist a deterministic QoS target preview') and clearly distinguishes it from apply_client_qos_policy by emphasizing it does NOT change the controller. It also references get_client_qos_capabilities, making the tool's role among siblings explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete usage context: it is a local mutating operation that stores a plan, requires UNIFI_RUNTIME_ENABLED=true, and should be paired with apply_client_qos_policy for activation. It also directs the agent to get_client_qos_capabilities for adapter checks, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

poll_events_nowA
Idempotent

Poll supported event sources now and durably deduplicate results.

Mutating (local) operation: triggers an immediate poll of matching event sources, inserts new normalized events into the runtime store, and deduplicates against what is already persisted. Requires UNIFI_RUNTIME_ENABLED=true. Use get_event_polling_status to discover source names; use list_runtime_events to read stored results.

Args: source: Optional source name to poll a single source; omit for all sources. device_name: Optional console/device name to filter sources; omit for all.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNoOptional source name to poll a single source; omit for all sources.
device_nameNoOptional console/device name to filter sources; omit for all.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only idempotentHint as annotation, the description carries the burden of disclosing side effects and does so well: it states this is a mutating local operation, triggers immediate poll, inserts new normalized events, deduplicates against persisted data, and requires a runtime feature flag. This gives the agent a clear behavioral model without contradicting the idempotentHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by side effects, prerequisites, and related tools. It is slightly redundant because the Args section duplicates the schema's parameter descriptions, but overall every paragraph earns its place and the length is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema, the description covers the essential context: what it does, what it changes, prerequisites, how to discover valid source names, and how to read results afterward. It does not state what the tool returns, but the side effects and invocation details are sufficiently complete for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with 100% coverage, so the baseline is 3. The description's Args section mostly repeats the schema text verbatim ('Optional source name to poll a single source; omit for all sources') without adding new meaning such as value formats, interactions between source and device_name, or validation rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Poll supported event sources now and durably deduplicate results.' It clearly identifies the action, the target, and a distinguishing side effect (deduplication), making it easy to differentiate from siblings like list_runtime_events and get_event_polling_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it is a mutating operation that triggers an immediate poll, requires UNIFI_RUNTIME_ENABLED=true, and tells the agent to use get_event_polling_status for source discovery and list_runtime_events for reading results. It names the relevant alternatives but does not explicitly frame when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

provision_deviceA
Destructive

Force re-provision a device with its current configuration.

Mutating operation: re-pushes the existing config to the device and is persisted on the console, without changing firmware or power-cycling like upgrade_device or restart_device. Use after config edits to force the device to re-adopt current settings.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that this is a 'Mutating operation' that re-pushes config and is 'persisted on the console,' adding behavioral context beyond the destructiveHint annotation. It also clarifies what the operation does not do—no firmware change and no power-cycling—which helps the agent understand the side effects and limits of the operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear front-loaded purpose, followed by behavioral details, usage guidance, and parameters. The Args section is somewhat redundant with the input schema, which slightly reduces efficiency, but the overall length is reasonable and every prose sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with three simple parameters and 100% schema coverage, the description is complete: it states the purpose, behavior, persistence, exclusions, and exact usage context. No critical information for selecting or invoking the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description's Args section essentially repeats the schema's parameter descriptions rather than adding new meaning. The prose does provide broader context for why parameters matter, but it does not go beyond the structured field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Force re-provision a device with its current configuration,' which uses a specific verb and resource and clearly states the operation's scope. It also distinguishes itself from sibling tools by explicitly contrasting with 'upgrade_device or restart_device,' making the tool's unique purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit usage directive: 'Use after config edits to force the device to re-adopt current settings.' It further clarifies when not to use it by stating it does not change firmware or power-cycle like upgrade_device or restart_device, providing clear routing among alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reserve_client_ipA
Idempotent

Create a DHCP reservation pinning an IP to a client.

Mutating operation: reserves the client's current IP (when ip is omitted) or the given IPv4 address, so the client keeps it across leases. Requires the client to be known; use list_clients to find the current IP if needed.

Args: client: Client MAC address or name to reserve an IP for. ip: Optional IPv4 address to reserve; omit to keep the client's current IP. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipNoOptional IPv4 address to reserve; omit to keep the client's current IP.
siteNoSite to operate on. Defaults to "default".default
clientYesClient MAC address or name to reserve an IP for.
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly labels the operation as 'Mutating operation' and explains the lasting effect: the client keeps the IP across leases. This adds behavioral detail beyond the idempotentHint annotation, covering conditional behavior when ip is omitted versus provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear purpose and includes a useful mutation warning before the args list. The only minor redundancy is repeating the ip omission behavior in both the prose and the parameter list, but overall it is appropriately sized and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-required-parameter mutation with no output schema, the description covers the prerequisite, default values, and the effect of the operation. It is sufficient for an agent to decide when and how to call it, though it does not describe response/error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args section essentially mirrors the schema descriptions (client as MAC/name, ip optional, site default, device optional), adding little new parameter-level meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create a DHCP reservation pinning an IP to a client,' which names a specific verb, resource, and outcome. It clearly explains the two modes—reserving the current IP or a provided IPv4—so the tool's function is unambiguous even among many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the prerequisite that the client must already be known and explicitly points to list_clients for discovering the current IP. This gives clear context for when and how to invoke the tool, though it does not discuss exclusionary cases or alternatives beyond that.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restart_deviceA
Destructive

Restart (reboot) a UniFi device by MAC address.

Mutating operation: sends a reboot command that is persisted on the console; the device goes offline briefly and reconnects. Unlike provision_device (re-push config without reboot) and upgrade_device (firmware update), this power-cycles the device. No other config change is needed.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that the command is persisted on the console, the device goes offline briefly and reconnects, and this operation power-cycles the device. This gives the agent a concrete model of the tool's runtime impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose, impact, sibling contrast, then argument details. Every sentence adds distinct operational value, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutating tool with no output schema, the description fully covers what happens, how to set the arguments, the defaults, and the alternatives. An agent has enough context to invoke the tool correctly and anticipate the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section largely restates what the schema already says. It adds no significant new param meaning beyond the structured schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line states a specific verb and resource: 'Restart (reboot) a UniFi device by MAC address.' It also differentiates itself from siblings by explicitly naming provision_device and upgrade_device, so an agent can identify this as the power-cycle operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly contrasts this tool with provision_device ('re-push config without reboot') and upgrade_device ('firmware update'), making the when-to-use decision clear. It also states 'No other config change is needed,' preventing unnecessary follow-up actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_schedule_nowA
Destructive

Run one allowlisted schedule immediately. Requires confirm=true.

Mutating operation: executes the identified schedule's job once, outside its normal interval, and records the run. Returns success=false unless confirm=true. Use list_job_runs to inspect the outcome; use set_schedule_enabled to disable auto-runs.

Args: schedule_id: Identifier of the schedule to run immediately. confirm: Must be True to run the schedule; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to run the schedule; without it the call is a no-op. Defaults to False.
schedule_idYesIdentifier of the schedule to run immediately.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description adds meaningful context beyond that: it discloses that the operation executes the job outside its normal interval, records the run, and returns success=false unless confirm=true — making clear that an unconfirmed call is a harmless no-op. Minor gaps remain (no mention of rate limits, sync/async execution), but the key behavioral risks are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening two paragraphs are tight, front-loaded, and every sentence earns its place. However, the Args section duplicates the schema descriptions for both parameters almost word-for-word, wasting close to half the description on content the agent already has in the schema; trimming that redundancy would lift this to a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with no output schema and no nested objects, the description covers the essentials: purpose, confirm precondition, return behavior (success=false without confirm), side effect (records the run), and where to inspect results via list_job_runs. The only notable gap is whether the run executes synchronously or is queued, but overall an agent has what it needs to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both schedule_id and confirm are already fully documented in the input schema. The Args section closely repeats that same schema text, adding no new meaning beyond what structured data provides — placing it at the baseline 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair — 'Run one allowlisted schedule immediately' — with scoping words 'one' and 'allowlisted' that distinguish it from bulk or configuration-level operations. It further differentiates itself from siblings by explicitly naming set_schedule_enabled (disables auto-runs) and list_job_runs (inspects outcomes), so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing guidance: use list_job_runs to inspect the outcome and set_schedule_enabled to disable auto-runs, naming the exact sibling alternatives and their purpose. It also states the precondition that the schedule must be allowlisted and that confirm=true is required, so an agent knows when this tool is appropriate and what gating it must satisfy.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_speed_testA
Idempotent

Start an on-demand WAN speed test from the site gateway.

Mutating/long-running operation: it triggers a test against the speed-test endpoint and returns a handle or immediate result; poll get_speed_test_status for completion. Use get_speed_test_status to read the latest result without starting a new test.

Args: site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the operation is mutating, long-running, triggers a test, and returns a handle or immediate result requiring polling. This adds useful operational context beyond the idempotentHint annotation and does not contradict it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Core behavior and the polling workflow are front-loaded and compactly stated. The Args section is redundant with the schema, which costs a little, but the overall structure remains scannable and informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter tool with no output schema, the description provides enough context: it names the trigger, the long-running behavior, the polling flow, and the sibling status tool. The return value is described at a handle/immediate-result level, which is adequate for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the Args section simply restates the site and device descriptions already present in the input schema. No additional meaning or usage nuance is added beyond the structured parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action and resource: 'Start an on-demand WAN speed test from the site gateway.' It also distinguishes itself from the sibling get_speed_test_status by noting that the sibling reads the latest result instead of starting a new test.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to poll get_speed_test_status for completion and to use that sibling to read the latest result without starting a new test. This gives an agent unambiguous when-to-use and when-not-to-use guidance relative to the nearest alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_client_tagsA
Idempotent

Replace local client tags by stable identity. Requires confirm=true.

Mutating operation: overwrites the client's persisted local tags with the supplied list and is stored on the server (local_only), not the controller. Returns success=false unless confirm=true. Use get_client_organization to read current tags first; use assign_client_group for group membership.

Args: identity: Client MAC, IP, hostname, or alias to resolve to a known client. tags: Full replacement tag list; an empty list clears all tags. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default. confirm: Must be True to apply the change; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
tagsYesFull replacement tag list; an empty list clears all tags.
deviceNoOptional device name to target a specific console; omit for default.
confirmNoMust be True to apply the change; without it the call is a no-op. Defaults to False.
identityYesClient MAC, IP, hostname, or alias to resolve to a known client.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behavioral details beyond the annotations: it mutates persisted server-side state, overwrites the full tag list, ignores controller-local state, and returns success=false unless confirm=true. This is strong transparency for a mutating tool, and it does not contradict the idempotentHint annotation since replacing the full tag list with the same list is idempotent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-sentence summary with the key requirement (confirm=true), a concise behavioral paragraph, and an Args list. Every sentence earns its place, and the critical safety-relevant behavior is front-loaded rather than buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with 5 parameters and no output schema, the description covers the essential context: identity resolution, replacement semantics, clearing behavior, site/device targeting, confirmation requirement, return behavior, and relationship to sibling tools. An agent has everything needed to call it correctly and safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description's Args section mostly restates the schema descriptions (identity, tags, site, device, confirm) without adding substantial new meaning. This meets the baseline but does not go beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Replace local client tags'), the target resource ('client's persisted local tags'), and the resolution mechanism ('by stable identity'). It also distinguishes itself from related operations by referencing get_client_organization for reading and assign_client_group for group membership, so an agent can clearly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use this tool versus alternatives: read current tags with get_client_organization first, and use assign_client_group for group membership. It also clarifies the confirm=true requirement and the no-op behavior without it, giving an agent clear conditions for invoking the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_device_portA
Destructive

Configure a single switch port: native VLAN, PoE mode, name, or enable state.

Mutating operation: applied immediately and persisted on the console, changing untagged VLAN traffic, PoE delivery, or link state on that port. Only the fields you provide change. Requires confirm=true because a port change can disrupt connectivity for the attached device or downstream network. Use get_device_ports first to find the port_idx and current values.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). port_idx: Port number to configure (1-based; e.g. 1-24 or SFP 25/26). name: Optional custom port name (e.g. "Cameras"). native_network: Optional network or VLAN name (or its ID) to set as the port's native/untagged VLAN. poe_mode: Optional PoE mode - "auto", "on", "off", or "passv24". forward: Optional VLAN forwarding - "all" (every VLAN) or "customize". enabled: Optional port enable state; True connects, False disables. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default. confirm: Must be True to apply the port change. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
nameNoOptional custom port name (e.g. "Cameras").
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.
confirmNoMust be True to apply the port change. Defaults to False.
enabledNoOptional port enable state; True connects, False disables.
forwardNoOptional VLAN forwarding - "all" (every VLAN) or "customize".
poe_modeNoOptional PoE mode - "auto", "on", "off", or "passv24".
port_idxYesPort number to configure (1-based; e.g. 1-24 or SFP 25/26).
native_networkNoOptional network or VLAN name (or its ID) to set as the port's native/untagged VLAN.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that the operation mutates state, is applied immediately, persists on the console, affects untagged VLAN traffic/PoE/link state, is partial ('Only the fields you provide change'), and requires confirm=true because it can disrupt connectivity. This is rich behavioral context that goes well beyond the annotation and helps an agent understand side effects and risk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a one-line summary, a behavioral note, and a clear Args list. It front-loads the purpose and follows with important caveats. The Args section is somewhat repetitive given the schema already describes each parameter identically, adding length without new information, but the overall structure is clear and every section carries useful context. A slight trim would earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutating tool with only destructiveHint as an annotation and no output schema, the description provides substantial context: prerequisites, side effects, confirmation requirement, and partial-update semantics. It does not describe the response format or error behavior, but the absence of an output schema lowers the expectation. The description covers most of what an agent needs to invoke the tool safely and correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's Args section largely duplicates the schema parameter descriptions and adds no new semantic meaning beyond what the schema already contains. The prose does clarify the 'only fields you provide change' behavior and the confirm requirement, but these are more behavioral than parameter-specific. The description adds minimal value beyond the fully described schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Configure a single switch port' and enumerates the configurable aspects (native VLAN, PoE mode, name, enable state). It is clearly distinguished from sibling tools like get_device_ports and update_network by focusing on a single port mutation. An agent can immediately understand what this tool does and what it does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises 'Use get_device_ports first to find the port_idx and current values,' establishing a clear prerequisite. It also explains the confirm=true necessity due to potential connectivity disruption, which guides when to set that flag. However, it does not mention alternative tools or explicitly state when not to use this tool, so it misses the full when/when-not structure for a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_firewall_policy_enabledA
Idempotent

Enable or disable a zone-based firewall policy.

Mutating operation: applied immediately and persisted on the UniFi console. Targets the policy by id from get_firewall_policies. Predefined controller policies can be toggled but not deleted. Inspect state with get_firewall_policies.

Args: policy_id: Policy id to toggle (from get_firewall_policies). enabled: True to enable, False to disable. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
enabledYesTrue to enable, False to disable.
policy_idYesPolicy id to toggle (from get_firewall_policies).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only idempotentHint in annotations, the description carries the behavioral burden and earns it: it declares the operation is mutating, applied immediately, persisted on the console, and that predefined controller policies have special toggle-but-not-delete semantics. This goes well beyond what idempotentHint alone communicates, without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first line, followed by a compact two-sentence behavioral paragraph. The Args block is somewhat redundant with the schema descriptions, which costs a point, but the overall size is appropriate with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four fully documented parameters and an idempotentHint, the description covers the essentials: operation semantics, timing, persistence, ID sourcing, and post-state inspection via get_firewall_policies. It doesn't describe the return value, but since there is no output schema and it directs agents to get_firewall_policies to verify state, this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args block restates the schema descriptions nearly verbatim (e.g., 'True to enable, False to disable'; 'Defaults to "default"') and adds only marginal context like the policy_id provenance from get_firewall_policies, which is already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource pair ('Enable or disable a zone-based firewall policy') and immediately differentiates from siblings by noting predefined controller policies can be toggled but not deleted, which clearly separates this from delete_firewall_policy and create_firewall_policy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent to target policies by id from get_firewall_policies and to inspect state with get_firewall_policies, establishing the read-before-toggle workflow. The 'not deleted' clause hints at delete_firewall_policy as an alternative, but it doesn't explicitly name it or state when to prefer it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_schedule_enabledA
Idempotent

Enable or pause a schedule. Requires confirm=true.

Mutating operation: flips the enabled flag on the identified schedule and persists it. Returns success=false unless confirm=true. Use create_interval_schedule to add, or delete_schedule to remove.

Args: schedule_id: Identifier of the schedule to modify. enabled: True to enable (run on interval) or False to pause it. confirm: Must be True to change the schedule; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to change the schedule; without it the call is a no-op. Defaults to False.
enabledYesTrue to enable (run on interval) or False to pause it.
schedule_idYesIdentifier of the schedule to modify.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide idempotentHint=true, so the description carries the burden of explaining side effects. It clearly states this is a mutating operation, persists the change, returns success=false unless confirm=true, and is a no-op without confirmation. This does not contradict the idempotentHint since the enabled parameter sets an absolute boolean state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the most critical operational detail (confirm=true), followed by mutation behavior, return behavior, and alternatives. The Args section is somewhat redundant with the schema, but the overall size is appropriate and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple boolean update with full schema coverage, the description covers the essential behavioral context: confirm guardrail, no-op behavior, success/failure indication, and sibling alternatives. It does not describe the full success response shape, but with no output schema this is not a blocking gap for tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all three parameters with 100% coverage, including the confirm default and no-op behavior. The description's Args section essentially repeats the schema rather than adding new parameter-level semantics, so it earns the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action (enable or pause) on a specific resource (a schedule), describes the mutating effect (flips and persists the enabled flag), and distinguishes itself from sibling create_interval_schedule and delete_schedule. An agent can immediately understand what this tool does and what it is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly warns that confirm=true is required and that without it the call is a no-op, which is essential for correct invocation. It also names the sibling alternative tools for adding (create_interval_schedule) and removing (delete_schedule) schedules, giving the agent clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_webhook_destination_enabledA
Idempotent

Enable or pause a webhook destination. Requires confirm=true.

Mutating operation: flips the enabled flag on the identified webhook destination and persists it. Returns success=false unless confirm=true. Use create_webhook_destination to add, or delete_webhook_destination to remove.

Args: destination_id: Identifier of the webhook destination to modify. enabled: True to enable delivery or False to pause it. confirm: Must be True to change the destination; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to change the destination; without it the call is a no-op. Defaults to False.
enabledYesTrue to enable delivery or False to pause it.
destination_idYesIdentifier of the webhook destination to modify.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the idempotentHint annotation by disclosing that this is a mutating operation, that it persists the change, that confirm=true is required, and that without confirmation the call is a no-op returning success=false. This gives the agent the exact safety-critical behavior needed to invoke it correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and confirm requirement, then provides mutation context, sibling alternatives, and parameter details in a clear order. The Args section is somewhat redundant with the schema, but the overall structure is efficient and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple setter with complete schema coverage and an idempotency annotation, the description includes the essential behavioral details: persistence, the confirm guard, no-op behavior, and relationship to add/delete tools. It does not describe the success response shape, but with no output schema declared, the provided return behavior note is likely sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents all three parameters. The Args section in the description mostly repeats the schema descriptions verbatim and adds no new meaning beyond what the schema provides. This meets the baseline for high coverage but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action ('Enable or pause a webhook destination') and names the exact resource and state it modifies. It also distinguishes itself from the sibling tools by noting that create_webhook_destination and delete_webhook_destination handle addition and removal, while this tool only changes the enabled flag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool: to set the enabled flag on an existing webhook destination. It explicitly routes the agent to create_webhook_destination for adding and delete_webhook_destination for removing, but it does not mention testing or listing alternatives, so the guidance is good but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_webhook_destinationA
Destructive

Send a synthetic payload to a webhook destination. Requires confirm=true.

Mutating (external) operation: dispatches a synthetic test payload to the identified destination and records the delivery outcome. Returns success=false unless confirm=true. Use list_webhook_deliveries to inspect the result.

Args: destination_id: Identifier of the webhook destination to test. confirm: Must be True to send the test payload; without it the call is a no-op. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be True to send the test payload; without it the call is a no-op. Defaults to False.
destination_idYesIdentifier of the webhook destination to test.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the destructiveHint annotation by disclosing that this is an external mutating operation, that it records the delivery outcome, and that it returns success=false unless confirm=true (otherwise it is a no-op). This is valuable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and includes structured Args. Some redundancy exists between the opening 'Requires confirm=true' and the confirm parameter explanation, but overall it is compact and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating external operation with no output schema, the description covers the essential context: side effects, confirm guard, success behavior, and how to verify the outcome via a sibling tool. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters. The description repeats the same meaning without adding significant new parameter-level detail, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: send a synthetic payload to a webhook destination. This clearly distinguishes it from sibling tools like create_webhook_destination, delete_webhook_destination, and list_webhook_deliveries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the required confirm=true condition and instructs the agent to use list_webhook_deliveries to inspect the result. It gives clear operational context, though it does not explicitly contrast this tool with other webhook-related actions beyond the follow-up inspection step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

troubleshoot_clientA
Read-only

Run a deep-dive troubleshooting analysis for one specific client.

Read-only operation: it examines connection history, signal quality, AP associations, roaming events, and potential issues for the named client. Use get_client_experience_report for a site-wide client-quality overview, or get_client_details for the raw record of one client without the analysis.

Args: mac: MAC address of the client to troubleshoot. site: Site to query. Defaults to "default". device: Optional console/device name to target a specific UniFi console; omit to use the default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesMAC address of the client to troubleshoot.
siteNoSite to query. Defaults to "default".default
deviceNoOptional console/device name to target a specific UniFi console; omit to use the default.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value beyond that by disclosing exactly what the analysis examines: connection history, signal quality, AP associations, roaming events, and potential issues. It also reinforces the read-only nature in plain language. Minor gap: no mention of what the output looks like, but the behavioral scope is well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by the read-only note and sibling routing, then argument details. Every section earns its place. The Args block is mildly redundant with the schema, but the structure is clean and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 100% schema coverage, a read-only annotation, and the absence of an output schema, the description is nearly complete: it states scope, behavior, alternative routing, and parameters. The one gap is that it never hints at what the analysis returns (a report? a diagnosis list?), which would matter to an agent since no output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all three parameters. The Args section in the description essentially repeats the schema's parameter descriptions without adding new semantics. Per the rubric, baseline 3 is correct when the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource pair ('Run a deep-dive troubleshooting analysis for one specific client') and explicitly differentiates from the two most relevant siblings: get_client_experience_report (site-wide overview) and get_client_details (raw record without analysis). An agent can tell exactly what this tool is for and what it is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names alternatives explicitly and gives the selection condition: use get_client_experience_report for site-wide overview, or get_client_details for a raw record without analysis. It also states the scope constraint ('one specific client') upfront, so the agent knows not to reach for this when a broader view is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unblock_clientA
Idempotent

Remove a prior block so a client can reconnect to the network.

Mutating operation: clears the persistent block set by block_client. Use block_client to re-block, or kick_client for a non-persistent disconnect.

Args: mac: Client MAC address to target. site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesClient MAC address to target.
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the idempotentHint annotation, the description discloses that this is a mutating operation that clears a persistent block set by block_client. It does not discuss permissions or return values, but it clearly communicates the key behavioral effect and persistence semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a clear one-line summary, a short mutating-operation warning with alternatives, then the parameter list. Every sentence earns its place and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple three-parameter, idempotent unblock operation with no output schema, the description covers purpose, mutation behavior, parameter semantics, and alternatives. There is no critical missing information needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The Args section mostly restates the schema descriptions without adding extra constraints, formats, or side-effect details, so it adds little semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Remove a prior block so a client can reconnect to the network.' It also distinguishes itself from block_client and kick_client by naming them, so an agent can tell what this tool does and does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: use block_client to re-block, or kick_client for a non-persistent disconnect. This clearly tells an agent when to use this tool versus the relevant sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_cameraA
Destructive

Update a camera's configuration.

Mutating operation: changes are applied immediately and persisted on the Protect console. Requires username/password configured for the device.

Args: camera: Camera ID or name (resolved by name if not an ID) name: New camera name is_recording_enabled: Enable/disable recording recording_mode: Recording mode — "always", "motion", "smart_detect", "never" device: Optional Protect console name to target a specific UniFi Protect device; omit for first configured Protect device.

Returns: Updated camera configuration

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew camera name.
cameraYesProtect camera identifier or name to update.
deviceNoOptional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device.
recording_modeNoRecording mode — "always", "motion", "smart_detect", "never".
is_recording_enabledNoEnable/disable recording.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses immediate persistence on the Protect console, the need for username/password configuration, and the camera's ID-or-name resolution behavior. This adds substantial behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the opening sentence defines the operation, the mutation note follows immediately, then a cleanly formatted Args list with a Returns line. The Args section duplicates some schema text but remains readable and free of fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers essential invocation context: required auth, immediate/persisted effect, device targeting fallback, and a return indication. It lacks only a richer return shape and explicit sibling routing, which are minor given full parameter coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description largely restates the schema's parameter meanings, with a small added nuance that camera IDs are resolved by name if not an ID. No significant new parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update a camera's configuration'), which clearly identifies the operation and differentiates it from the many get_* camera tools among siblings. It lacks an explicit contrast to a sibling or update-family tool, so it doesn't reach the top tier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description frames the operation as mutating and notes changes apply immediately, giving clear context about its effect. However, it does not explicitly say when to use this tool versus alternatives like get_camera_details or list_cameras, nor does it provide when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_firewall_ruleA
Destructive

Update a legacy firewall rule. Only provided fields are changed.

Mutating operation: applied immediately and persisted on the controller. Use get_firewall_rules to find the rule ID first.

Args: rule_id: Firewall rule ID (from get_firewall_rules) name: New rule name action: Action — "accept", "drop", or "reject" protocol: Protocol — "tcp", "udp", "icmp", "all", or IANA number dst_port: Destination port or range src_zone: Source zone ID dst_zone: Destination zone ID src_port: Source port or range logging: Enable/disable logging enabled: Enable/disable the rule site: Site to operate on. Defaults to "default". device: Optional console name to target a specific console; omit for default.

Returns: Updated firewall rule configuration

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew rule name.
siteNoSite to operate on. Defaults to "default".default
actionNoAction — "accept", "drop", or "reject"
deviceNoOptional console name to target a specific UniFi device; omit for default.
enabledNoEnable/disable the rule.
loggingNoEnable/disable logging.
rule_idYesFirewall rule ID (from get_firewall_rules).
dst_portNoDestination port or range.
dst_zoneNoDestination zone ID.
protocolNoProtocol — "tcp", "udp", "icmp", "all", or IANA number
src_portNoSource port or range.
src_zoneNoSource zone ID.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only destructiveHint=true as an annotation, the description adds meaningful behavior: it states the operation is 'Mutating operation: applied immediately and persisted on the controller.' It also clarifies partial-update semantics so the agent knows unspecified fields are not overwritten. This goes beyond the annotation by explaining persistence and update scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized and front-loads the most important information. However, the Args section largely repeats the schema's per-parameter descriptions, adding length without much extra value. It is readable but not as tight as it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutation tool with no output schema, the description covers the essential context: prerequisite lookup, partial-update behavior, persistence, and a minimal return description. It could be more complete about failure modes or exact return structure, but nothing critical is missing for selecting or invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes every parameter, so the baseline is met. The description adds the critical semantic that 'Only provided fields are changed,' which is essential for understanding how optional parameters behave. The Args list mostly duplicates the schema, but the partial-update statement gives parameter behavior not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Update') and a clear resource ('firewall rule'), and further specifies 'legacy firewall rule' and partial-update behavior ('Only provided fields are changed'). This distinguishes it from sibling tools like create_firewall_rule, delete_firewall_rule, and firewall policy tools without needing to inspect their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete prerequisite: 'Use get_firewall_rules to find the rule ID first.' It also implies when to use the tool—modifying an existing legacy firewall rule—and contrasts with create/delete operations through the partial-update wording. It does not explicitly name alternatives such as create_firewall_rule or delete_firewall_rule, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_networkA
Destructive

Update a network/VLAN; only the fields you provide change.

Mutating operation: applied immediately and persisted on the UniFi console. A single field change preserves the network's other settings. Pass both empty dhcp_start and dhcp_stop to disable DHCP. Requires confirm=true because VLAN, routing, or enable-state changes can disconnect clients. Inspect with get_networks.

Args: name: Network name or record id to update. name_new: Rename the network to this value. subnet: New subnet in CIDR form (e.g. "192.168.50.1/24"). vlan: New VLAN id (1-4094); pass -1 to clear VLAN tagging. domain_name: New DNS domain name for clients. dhcp_start: New DHCP pool start IP; pair with dhcp_stop to enable DHCP. dhcp_stop: New DHCP pool end IP; pair with dhcp_start to enable DHCP. dhcp_lease_time: New DHCP lease duration in seconds. enabled: Enable or disable the network. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default. confirm: Safety gate: must be True to apply. Defaults to False.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNetwork name or record id to update.
siteNoSite to operate on. Defaults to "default".default
vlanNoNew VLAN id (1-4094); pass -1 to clear VLAN tagging.
deviceNoOptional console name to target a specific UniFi device; omit for default.
subnetNoNew subnet in CIDR form (e.g. "192.168.50.1/24").
confirmNoSafety gate: must be True to apply. Defaults to False.
enabledNoEnable or disable the network.
name_newNoRename the network to this value.
dhcp_stopNoNew DHCP pool end IP; pair with dhcp_start to enable DHCP.
dhcp_startNoNew DHCP pool start IP; pair with dhcp_stop to enable DHCP.
domain_nameNoNew DNS domain name for clients.
dhcp_lease_timeNoNew DHCP lease duration in seconds.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark destructiveHint=true, so the description carries the burden of explaining the mutation. It adds that changes are applied immediately and persisted, that a single field change preserves other settings, that confirm=true is required, and that VLAN/routing/enable-state changes can disconnect clients. It also documents the special DHCP-disable behavior, which is valuable beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the most important behavioral facts: patch semantics, mutating operation, immediate persistence, and safety gate. The Args section is structured and gives one-line explanations per parameter, though it duplicates much of the input schema. There is no fluff, but the redundant parameter list keeps it from being a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the target resource, patch semantics, persistence, confirm requirement, client-disconnect risk, the DHCP special case, and points to get_networks for verification. It does not describe return values or error behavior, and there is no output schema, so this is a minor gap for a 12-parameter mutating tool. Overall it is substantially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema: the patch-like behavior of 'only the fields you provide change' and the combined DHCP-disable rule that passing both empty dhcp_start and dhcp_stop disables DHCP. The per-argument list largely restates the schema, which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update a network/VLAN,' and clarifies the patch semantics with 'only the fields you provide change.' It also distinguishes the read counterpart by saying 'Inspect with get_networks,' and the update operation is clearly separate from sibling creation/deletion tools like create_network and delete_network.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when this tool is appropriate: updating an existing network, with immediate persistence, and requiring confirm=true. It also names get_networks as the inspection alternative. It does not explicitly state exclusions such as 'use create_network to add a network' or 'use delete_network to remove one,' but the update semantics make those distinctions inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_site_settingsA
Destructive

Update site settings.

Mutating operation: changes are applied immediately and persisted. Settings are key-value pairs matching the UniFi site setting schema. Use get_site_settings first to see available settings and their current values.

Args: settings: Dictionary of settings to update (e.g., {"auto_backup_enabled": true}) site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional console name to target a specific UniFi device; omit for default.
settingsYesDictionary of settings to update (e.g., {'auto_backup_enabled': true}).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description discloses that 'changes are applied immediately and persisted', informing the agent of the side effects. It also frames the operation as mutating, consistent with the annotation, so no contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a clear purpose line, a warning about persistence, a helpful prerequisite, and a brief Args list. Every sentence earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the mutating behavior, suggests get_site_settings to inspect valid settings, and provides defaults for site and device plus an example settings dictionary. With no output schema and a free-form settings object, this is reasonably complete, though it omits response/error details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description's Args section mostly repeats that information, though it adds the example and the note that settings 'match the UniFi site setting schema'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Update site settings.', naming a specific verb and resource, and makes the mutating nature explicit. It is clearly distinguishable from sibling get_site_settings and other update tools by stating that it updates the site settings key-value store.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: call get_site_settings first to discover available settings and current values before updating. It does not explicitly enumerate alternatives or exclusions, but the precondition guidance is concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_wlanA
Destructive

Update a wireless network (SSID); only the fields you provide change.

Mutating operation: applied immediately and persisted on the UniFi console. Any single field updates the matching SSID (resolved by ID or name). Requoting passphrase sets the WiFi password; pmf_mode is disabled|optional|required. Inspect with get_wlans.

Args: wlan: WLAN id or SSID name to update. enabled: Enable or disable the SSID. hide_ssid: Hide the SSID from beacon broadcasts. passphrase: New WiFi password (minimum 8 characters). wpa3_support: Enable WPA3 support on the SSID. wpa3_transition: WPA2/WPA3 transition mode (keeps WPA2 for legacy clients). pmf_mode: Protected Management Frames mode — "disabled", "optional", or "required". bss_transition: Enable 802.11k/v band and AP steering. fast_roaming_enabled: Enable 802.11r fast roaming. site: Site to operate on. Defaults to "default". device: Optional console name to target a specific UniFi device; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
siteNoSite to operate on. Defaults to "default".default
wlanYesWLAN id or SSID name to update.
deviceNoOptional console name to target a specific UniFi device; omit for default.
enabledNoEnable or disable the SSID.
pmf_modeNoProtected Management Frames mode — "disabled", "optional", or "required".
hide_ssidNoHide the SSID from beacon broadcasts.
passphraseNoNew WiFi password (minimum 8 characters).
wpa3_supportNoEnable WPA3 support on the SSID.
bss_transitionNoEnable 802.11k/v band and AP steering.
wpa3_transitionNoWPA2/WPA3 transition mode (keeps WPA2 for legacy clients).
fast_roaming_enabledNoEnable 802.11r fast roaming.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry destructiveHint=true, and the description enriches this substantially: 'Mutating operation: applied immediately and persisted on the UniFi console', the partial-update guarantee ('only the fields you provide change'), and the passphrase/pmf_mode behavioral notes. No contradiction with the destructiveHint annotation exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening paragraph is tightly worded and front-loaded, with every sentence earning its place. However, the Args section copies the full 11-parameter schema verbatim, which is redundant noise for an agent that already receives the input schema, making the description longer than needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter destructive mutation with no output schema, the description covers the essential ground: target resolution, partial-update semantics, persistence, allowed pmf_mode values, and an inspection path. It omits failure modes and preconditions (e.g., what happens to connected clients), but an agent can call this tool correctly with what is provided.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's Args block is a near-verbatim duplicate of the schema. It adds global framing (partial updates) and a subtle passphrase hint, but individual parameter meaning is not enriched beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update a wireless network (SSID)'. It immediately disambiguates from siblings like create_wlan and delete_wlan, and clarifies partial-update semantics. The phrase 'Inspect with get_wlans' further separates it from its read-mode counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: how the target is resolved ('resolved by ID or name'), that the operation is applied immediately, and that get_wlans is the companion inspection tool. However, it never explicitly states when NOT to use this tool in favor of create_wlan or delete_wlan, so the exclusion guidance 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.

upgrade_deviceA
Destructive

Upgrade a device's firmware to the latest available version.

Mutating operation: initiates a firmware upgrade that is persisted once applied; the device reboots during the update. Unlike restart_device (plain reboot) and provision_device (config re-push), this changes the running firmware. Only proceeds when an upgrade is available on the console.

Args: mac: Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff). site: Site to operate on. Defaults to "default". device: Optional device name to target a specific console; omit for default.

ParametersJSON Schema
NameRequiredDescriptionDefault
macYesDevice MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff).
siteNoSite to operate on. Defaults to "default".default
deviceNoOptional device name to target a specific console; omit for default.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description reveals that the operation is mutating, persists once applied, causes a reboot, and only proceeds when an upgrade is available. This gives the agent a solid mental model of the tool's side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a crisp one-sentence purpose, a concise mutation warning with sibling differentiation, and a clear Args block. Every sentence earns its place, and the most important scoping information appears early.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter tool with full schema coverage, the description covers purpose, side effects, preconditions, and alternatives. No output schema exists, but the description's job is to support correct invocation, and it does so completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents mac, site, and device. The description repeats the same parameter details without adding new semantics, which keeps it at the baseline rather than higher.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names the specific operation and resource: 'Upgrade a device's firmware to the latest available version.' It explicitly contrasts with restart_device and provision_device, making the tool's identity and scope unambiguous even among many siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when this tool is the right choice: when the goal is changing running firmware, not a plain reboot or config re-push. It also states a precondition: 'Only proceeds when an upgrade is available on the console,' which helps the agent decide whether invocation will succeed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_snapshotA
Read-only

Verify the schema and checksum of a confined snapshot export.

Read-only operation. Reads the named snapshot from the export directory and validates its schema, redaction status, and content SHA-256. Returns validity plus schema version and checksum for integrity checks. Use after export_portable_snapshot to confirm the file is intact and secret-free.

Args: filename: Name of the snapshot file (within the confined export directory) to validate.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYesName of the snapshot file (within the confined export directory) to validate.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that it is read-only, reads from the export directory, validates schema, redaction status, and content SHA-256, and returns validity, schema version, and checksum. This goes well beyond the readOnlyHint annotation and gives the agent a solid model of what happens.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with purpose, logically organized, and every sentence contributes either behavioral detail or workflow context. No filler or unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only verification tool, the description covers what it operates on, what it validates, what it returns, and when to invoke it. No output schema is needed because the return type is summarized clearly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter description in the schema exactly matches the description text. The description adds no new semantic detail beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Verify') and names both the resource ('schema and checksum of a confined snapshot export') and the validation actions. It clearly distinguishes this tool from the snapshot-related sibling export_portable_snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'Use after export_portable_snapshot to confirm the file is intact and secret-free.' This gives clear contextual guidance and leaves no ambiguity about its place in the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 98 tool updatesv1.0.1
    • Changedanalyze_network_issues2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedapply_client_qos_policy2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to attempt application; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / plan_token / description
        Added value: +"Token returned by plan_client_qos_policy identifying the plan."
    • Changedarchive_all_alarms2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedassign_client_group5 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to change membership; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / group / description
        Added value: +"Group name to assign, or null/None to unassign the current group."
      • addedInput schema / properties / identity / description
        Added value: +"Client MAC, IP, hostname, or alias to resolve to a known client."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedblock_client3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedcreate_client_group4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to create the group; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / name / description
        Added value: +"Unique group name to create."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedcreate_firewall_policy11 fields changed
      • addedInput schema / properties / action / description
        Added value: +"Packet decision — \"ALLOW\", \"BLOCK\", or \"REJECT\"."
      • addedInput schema / properties / client_macs / description
        Added value: +"Restrict the source to these client MAC addresses."
      • addedInput schema / properties / description / description
        Added value: +"Optional human-readable description."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / dst_zone_id / description
        Added value: +"Destination zone id (from get_firewall_policies)."
      • addedInput schema / properties / enabled / description
        Added value: +"Create the policy enabled. Defaults to True."
      • addedInput schema / properties / index / description
        Added value: +"Rule order index; lower values evaluate earlier. Omit for auto-order."
      • addedInput schema / properties / name / description
        Added value: +"Policy name (used for display and zone inference)."
      • addedInput schema / properties / protocol / description
        Added value: +"Protocol selector — \"all\", \"tcp\", \"udp\", \"tcp_udp\", \"icmp\", \"igmp\", or \"icmpv6\"."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / src_zone_id / description
        Added value: +"Source zone id (from get_firewall_policies)."
    • Addedcreate_firewall_rule
    • Changedcreate_interval_schedule5 fields changed
      • addedInput schema / properties / arguments / description
        Added value: +"Optional keyword arguments passed to the job on each run."
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to create the schedule; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / interval_seconds / description
        Added value: +"Recurrence period between runs, in seconds."
      • addedInput schema / properties / job_name / description
        Added value: +"Allowlisted job to run on the interval."
      • addedInput schema / properties / name / description
        Added value: +"Unique schedule identifier."
    • Changedcreate_network11 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to create. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / dhcp_lease_time / description
        Added value: +"DHCP lease duration in seconds (default 86400)."
      • addedInput schema / properties / dhcp_start / description
        Added value: +"DHCP pool start IP; supply with dhcp_stop to enable DHCP."
      • addedInput schema / properties / dhcp_stop / description
        Added value: +"DHCP pool end IP; supply with dhcp_start to enable DHCP."
      • addedInput schema / properties / domain_name / description
        Added value: +"DNS domain name advertised to clients (e.g. \"example.local\")."
      • addedInput schema / properties / name / description
        Added value: +"Network name (e.g. \"IoT\")."
      • addedInput schema / properties / purpose / description
        Added value: +"Segment type — \"corporate\", \"guest\", or \"wan\". Defaults to \"corporate\"."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / subnet / description
        Added value: +"Subnet in CIDR form (e.g. \"192.168.50.1/24\"); omit for unrouted."
      • addedInput schema / properties / vlan / description
        Added value: +"VLAN id (1-4094) for a tagged segment; omit for untagged."
    • Changedcreate_port_forward8 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / dst_port / description
        Added value: +"Internal destination port (1-65535) on the target host."
      • addedInput schema / properties / enabled / description
        Added value: +"Whether active on creation. Defaults to True."
      • addedInput schema / properties / fwd_ip / description
        Added value: +"LAN IP of the internal host receiving forwarded traffic."
      • addedInput schema / properties / fwd_port / description
        Added value: +"External listening port (1-65535) on the WAN."
      • addedInput schema / properties / name / description
        Added value: +"Unique rule identifier used to find/delete the rule later."
      • addedInput schema / properties / proto / description
        Added value: +"IP protocol to forward — \"tcp\", \"udp\", or \"both\"."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedcreate_webhook_destination5 fields changed
      • addedInput schema / properties / categories / description
        Added value: +"Optional list of event categories to send; empty sends all."
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to create the destination; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / name / description
        Added value: +"Unique destination identifier."
      • addedInput schema / properties / secret_env_name / description
        Added value: +"Optional name of an env var holding the signing secret."
      • addedInput schema / properties / url / description
        Added value: +"Endpoint that receives webhook payloads."
    • Changedcreate_wlan8 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / hide_ssid / description
        Added value: +"Broadcast the SSID hidden when True. Defaults to False."
      • addedInput schema / properties / is_guest / description
        Added value: +"Mark the SSID as an isolated guest network. Defaults to False."
      • addedInput schema / properties / name / description
        Added value: +"SSID broadcast name."
      • addedInput schema / properties / network_conf_id / description
        Added value: +"Network id to attach the SSID to; omit for the default LAN."
      • addedInput schema / properties / passphrase / description
        Added value: +"WiFi password, 8-63 characters."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / wpa3_transition / description
        Added value: +"Use WPA2/WPA3 transition mode. Defaults to True."
    • Changeddelete_client_group4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to delete the group; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / name / description
        Added value: +"Name of the local group to delete."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changeddelete_firewall_policy4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to delete. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / policy_id / description
        Added value: +"Policy id to delete (from get_firewall_policies)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Addeddelete_firewall_rule
    • Changeddelete_network4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to delete. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / name / description
        Added value: +"Network name or record id to delete."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changeddelete_port_forward4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to delete. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / rule_id / description
        Added value: +"Port forward rule id to delete (from get_port_forwards)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changeddelete_schedule2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to delete the schedule; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / schedule_id / description
        Added value: +"Identifier of the schedule to delete."
    • Changeddelete_webhook_destination2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to delete the destination; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / destination_id / description
        Added value: +"Identifier of the webhook destination to delete."
    • Changeddelete_wlan4 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to delete. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / wlan / description
        Added value: +"WLAN id or SSID name to delete."
    • Changedexport_camera_clip6 fields changed
      • addedInput schema / properties / camera / description
        Added value: +"Protect camera identifier or name to export footage from."
      • addedInput schema / properties / confirm / description
        Added value: +"Safety confirmation required for this file-writing operation; the export returns a failure message until set to true."
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / end_ts / description
        Added value: +"Clip end time as a Unix epoch timestamp (seconds); must be after start_ts."
      • addedInput schema / properties / output_path / description
        Added value: +"Destination filename (or path relative to the export directory); it is confined to the server's export directory."
      • addedInput schema / properties / start_ts / description
        Added value: +"Clip start time as a Unix epoch timestamp (seconds)."
    • Changedexport_network_report3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety confirmation. Must be True to actually write; otherwise returns a rejection message."
      • addedInput schema / properties / filename / description
        Added value: +"Output report file name inside the confined export directory; must end with the chosen format extension (e.g. .html, .csv)."
      • addedInput schema / properties / format / description
        Added value: +"Report renderer to use — \"html\" or \"csv\" (plugins may register additional formats)."
    • Changedexport_portable_snapshot2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety confirmation. Must be True to actually write; otherwise returns a rejection message."
      • addedInput schema / properties / filename / description
        Added value: +"Target file name written inside the confined export directory (no path traversal)."
    • Changedforget_client3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_alarms2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_all_sites_health1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
    • Changedget_camera_details2 fields changed
      • addedInput schema / properties / camera_id / description
        Added value: +"Protect camera identifier or name to look up."
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedget_camera_health_summary1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedget_camera_snapshot4 fields changed
      • addedInput schema / properties / camera_id / description
        Added value: +"Protect camera identifier or name to capture from."
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / height / description
        Added value: +"Optional target pixel height for the snapshot; native height if unset."
      • addedInput schema / properties / width / description
        Added value: +"Optional target pixel width for the snapshot; native width if unset."
    • Changedget_client_details3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_client_experience_report2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_client_organization3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / identity / description
        Added value: +"Client MAC, IP, hostname, or alias to resolve to a known client."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_client_qos_capabilities1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
    • Changedget_client_traffic3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_device_details3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_device_health_summary2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_device_ports3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_device_stats3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_dpi_stats2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_firewall_policies2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_firewall_rules2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_liveviews1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedget_motion_events4 fields changed
      • addedInput schema / properties / camera_id / description
        Added value: +"Optional Protect camera identifier or name to filter events to one camera; omit for all cameras."
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / hours / description
        Added value: +"Lookback window in hours from now (default 24)."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of events to return (default 50)."
    • Changedget_network_health2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_networks2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_optimization_recommendations2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_port_forwards2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_port_profiles2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_protect_accessories1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedget_protect_event_summary2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / hours / description
        Added value: +"Lookback window in hours from now (default 24)."
    • Changedget_protect_system_info1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedget_recent_events3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of events to return (default 50)."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_recent_protect_activity2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of recent events to return (default 20)."
    • Changedget_routing_table2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_site_health2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_site_settings2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_smart_detections4 fields changed
      • addedInput schema / properties / detection_type / description
        Added value: +"Optional class filter - one of \"person\", \"vehicle\", \"animal\", \"package\"; omit for all smart-detection types."
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
      • addedInput schema / properties / hours / description
        Added value: +"Lookback window in hours from now (default 24)."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of events to return (default 50)."
    • Changedget_speed_test_status2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_sysinfo2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedget_traffic_analysis3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / hours / description
        Added value: +"Lookback window in hours from now (default 24)."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_traffic_summary2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedget_wlans2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedkick_client3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedlist_all_clients2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedlist_cameras1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional Protect console name to target a specific UniFi Protect device; omit to use the first Protect-enabled device."
    • Changedlist_client_groups2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedlist_clients2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedlist_clients_by_organization4 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / group / description
        Added value: +"Optional local group name to filter clients by; mutually exclusive with tag."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / tag / description
        Added value: +"Optional local tag to filter clients by; mutually exclusive with group."
    • Changedlist_devices2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedlist_job_runs1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of job runs to return. Defaults to 100."
    • Changedlist_runtime_events1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of events to return. Defaults to 100."
    • Changedlist_sites1 field changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for the default device."
    • Changedlist_webhook_deliveries1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of delivery records to return. Defaults to 100."
    • Changedlocate_device4 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / enabled / description
        Added value: +"True to start LED blinking, False to stop. Defaults to True."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedplan_client_qos_policy6 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / download_kbps / description
        Added value: +"Maximum download bandwidth in kilobits per second."
      • addedInput schema / properties / selector_type / description
        Added value: +"Scope of the policy - \"client\", \"tag\", or \"group\"."
      • addedInput schema / properties / selector_value / description
        Added value: +"Client identity (MAC/IP/hostname) when selector_type is \"client\", otherwise the tag or group name to expand to clients."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / upload_kbps / description
        Added value: +"Maximum upload bandwidth in kilobits per second."
    • Changedpoll_events_now2 fields changed
      • addedInput schema / properties / device_name / description
        Added value: +"Optional console/device name to filter sources; omit for all."
      • addedInput schema / properties / source / description
        Added value: +"Optional source name to poll a single source; omit for all sources."
    • Changedprovision_device3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedquery_observation_trends8 fields changed
      • addedInput schema / properties / bucket_seconds / description
        Added value: +"Width of each trend bucket in seconds. Defaults to 300."
      • addedInput schema / properties / controller / description
        Added value: +"Optional controller identifier filter; omit for all controllers."
      • addedInput schema / properties / end / description
        Added value: +"Inclusive UTC end timestamp (ISO-8601)."
      • addedInput schema / properties / kind / description
        Added value: +"Observation category to query (e.g. \"health\", \"client\", \"device\")."
      • addedInput schema / properties / metric / description
        Added value: +"Metric name within the kind (e.g. \"latency_ms\", \"cpu_pct\")."
      • addedInput schema / properties / site / description
        Added value: +"Optional site name filter (e.g. \"default\"); omit for all sites."
      • addedInput schema / properties / source / description
        Added value: +"Optional source filter (e.g. controller type); omit for all sources."
      • addedInput schema / properties / start / description
        Added value: +"Inclusive UTC start timestamp (ISO-8601)."
    • Changedreserve_client_ip4 fields changed
      • addedInput schema / properties / client / description
        Added value: +"Client MAC address or name to reserve an IP for."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / ip / description
        Added value: +"Optional IPv4 address to reserve; omit to keep the client's current IP."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedrestart_device3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedrun_schedule_now2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to run the schedule; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / schedule_id / description
        Added value: +"Identifier of the schedule to run immediately."
    • Changedrun_speed_test2 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedset_client_tags5 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to apply the change; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / identity / description
        Added value: +"Client MAC, IP, hostname, or alias to resolve to a known client."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / tags / description
        Added value: +"Full replacement tag list; an empty list clears all tags."
    • Changedset_device_port10 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to apply the port change. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / enabled / description
        Added value: +"Optional port enable state; True connects, False disables."
      • addedInput schema / properties / forward / description
        Added value: +"Optional VLAN forwarding - \"all\" (every VLAN) or \"customize\"."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / name / description
        Added value: +"Optional custom port name (e.g. \"Cameras\")."
      • addedInput schema / properties / native_network / description
        Added value: +"Optional network or VLAN name (or its ID) to set as the port's native/untagged VLAN."
      • addedInput schema / properties / poe_mode / description
        Added value: +"Optional PoE mode - \"auto\", \"on\", \"off\", or \"passv24\"."
      • addedInput schema / properties / port_idx / description
        Added value: +"Port number to configure (1-based; e.g. 1-24 or SFP 25/26)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedset_firewall_policy_enabled4 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / enabled / description
        Added value: +"True to enable, False to disable."
      • addedInput schema / properties / policy_id / description
        Added value: +"Policy id to toggle (from get_firewall_policies)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedset_schedule_enabled3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to change the schedule; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / enabled / description
        Added value: +"True to enable (run on interval) or False to pause it."
      • addedInput schema / properties / schedule_id / description
        Added value: +"Identifier of the schedule to modify."
    • Changedset_webhook_destination_enabled3 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to change the destination; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / destination_id / description
        Added value: +"Identifier of the webhook destination to modify."
      • addedInput schema / properties / enabled / description
        Added value: +"True to enable delivery or False to pause it."
    • Changedtest_webhook_destination2 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Must be True to send the test payload; without it the call is a no-op. Defaults to False."
      • addedInput schema / properties / destination_id / description
        Added value: +"Identifier of the webhook destination to test."
    • Changedtroubleshoot_client3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional console/device name to target a specific UniFi console; omit to use the default."
      • addedInput schema / properties / mac / description
        Added value: +"MAC address of the client to troubleshoot."
      • addedInput schema / properties / site / description
        Added value: +"Site to query. Defaults to \"default\"."
    • Changedunblock_client3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Client MAC address to target."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Addedupdate_camera
    • Addedupdate_firewall_rule
    • Changedupdate_network12 fields changed
      • addedInput schema / properties / confirm / description
        Added value: +"Safety gate: must be True to apply. Defaults to False."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / dhcp_lease_time / description
        Added value: +"New DHCP lease duration in seconds."
      • addedInput schema / properties / dhcp_start / description
        Added value: +"New DHCP pool start IP; pair with dhcp_stop to enable DHCP."
      • addedInput schema / properties / dhcp_stop / description
        Added value: +"New DHCP pool end IP; pair with dhcp_start to enable DHCP."
      • addedInput schema / properties / domain_name / description
        Added value: +"New DNS domain name for clients."
      • addedInput schema / properties / enabled / description
        Added value: +"Enable or disable the network."
      • addedInput schema / properties / name / description
        Added value: +"Network name or record id to update."
      • addedInput schema / properties / name_new / description
        Added value: +"Rename the network to this value."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / subnet / description
        Added value: +"New subnet in CIDR form (e.g. \"192.168.50.1/24\")."
      • addedInput schema / properties / vlan / description
        Added value: +"New VLAN id (1-4094); pass -1 to clear VLAN tagging."
    • Addedupdate_site_settings
    • Changedupdate_wlan11 fields changed
      • addedInput schema / properties / bss_transition / description
        Added value: +"Enable 802.11k/v band and AP steering."
      • addedInput schema / properties / device / description
        Added value: +"Optional console name to target a specific UniFi device; omit for default."
      • addedInput schema / properties / enabled / description
        Added value: +"Enable or disable the SSID."
      • addedInput schema / properties / fast_roaming_enabled / description
        Added value: +"Enable 802.11r fast roaming."
      • addedInput schema / properties / hide_ssid / description
        Added value: +"Hide the SSID from beacon broadcasts."
      • addedInput schema / properties / passphrase / description
        Added value: +"New WiFi password (minimum 8 characters)."
      • addedInput schema / properties / pmf_mode / description
        Added value: +"Protected Management Frames mode — \"disabled\", \"optional\", or \"required\"."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
      • addedInput schema / properties / wlan / description
        Added value: +"WLAN id or SSID name to update."
      • addedInput schema / properties / wpa3_support / description
        Added value: +"Enable WPA3 support on the SSID."
      • addedInput schema / properties / wpa3_transition / description
        Added value: +"WPA2/WPA3 transition mode (keeps WPA2 for legacy clients)."
    • Changedupgrade_device3 fields changed
      • addedInput schema / properties / device / description
        Added value: +"Optional device name to target a specific console; omit for default."
      • addedInput schema / properties / mac / description
        Added value: +"Device MAC address (case-insensitive; aa:bb:cc:dd:ee:ff or aabbccddeeff)."
      • addedInput schema / properties / site / description
        Added value: +"Site to operate on. Defaults to \"default\"."
    • Changedverify_snapshot1 field changed
      • addedInput schema / properties / filename / description
        Added value: +"Name of the snapshot file (within the confined export directory) to validate."
  2. 106 tool updatesv0.9.0
    • First observedanalyze_network_issues
    • First observedapply_client_qos_policy
    • First observedarchive_all_alarms
    • First observedassign_client_group
    • First observedblock_client
    • First observedcapture_observations_now
    • First observedcreate_client_group
    • First observedcreate_firewall_policy
    • First observedcreate_interval_schedule
    • First observedcreate_network
    • First observedcreate_port_forward
    • First observedcreate_webhook_destination
    • First observedcreate_wlan
    • First observeddelete_client_group
    • First observeddelete_firewall_policy
    • First observeddelete_network
    • First observeddelete_port_forward
    • First observeddelete_schedule
    • First observeddelete_webhook_destination
    • First observeddelete_wlan
    • First observedexport_camera_clip
    • First observedexport_network_report
    • First observedexport_portable_snapshot
    • First observedforget_client
    • First observedget_alarms
    • First observedget_all_sites_health
    • First observedget_camera_details
    • First observedget_camera_health_summary
    • First observedget_camera_snapshot
    • First observedget_client_details
    • First observedget_client_experience_report
    • First observedget_client_organization
    • First observedget_client_qos_capabilities
    • First observedget_client_traffic
    • First observedget_device_details
    • First observedget_device_health_summary
    • First observedget_device_ports
    • First observedget_device_stats
    • First observedget_dpi_stats
    • First observedget_event_polling_status
    • First observedget_firewall_policies
    • First observedget_firewall_rules
    • First observedget_global_client_summary
    • First observedget_global_health
    • First observedget_global_inventory
    • First observedget_liveviews
    • First observedget_motion_events
    • First observedget_network_health
    • First observedget_networks
    • First observedget_observation_retention_status
    • First observedget_optimization_recommendations
    • First observedget_plugin_status
    • First observedget_port_forwards
    • First observedget_port_profiles
    • First observedget_protect_accessories
    • First observedget_protect_event_summary
    • First observedget_protect_system_info
    • First observedget_recent_events
    • First observedget_recent_protect_activity
    • First observedget_routing_table
    • First observedget_server_health
    • First observedget_site_health
    • First observedget_site_settings
    • First observedget_smart_detections
    • First observedget_snapshot_capabilities
    • First observedget_speed_test_status
    • First observedget_sysinfo
    • First observedget_traffic_analysis
    • First observedget_traffic_summary
    • First observedget_wlans
    • First observedkick_client
    • First observedlist_all_clients
    • First observedlist_cameras
    • First observedlist_client_groups
    • First observedlist_clients
    • First observedlist_clients_by_organization
    • First observedlist_devices
    • First observedlist_job_runs
    • First observedlist_observation_scopes
    • First observedlist_runtime_events
    • First observedlist_schedules
    • First observedlist_sites
    • First observedlist_unifi_devices
    • First observedlist_webhook_deliveries
    • First observedlist_webhook_destinations
    • First observedlocate_device
    • First observedplan_client_qos_policy
    • First observedpoll_events_now
    • First observedprovision_device
    • First observedquery_observation_trends
    • First observedreserve_client_ip
    • First observedrestart_device
    • First observedrun_schedule_now
    • First observedrun_speed_test
    • First observedset_client_tags
    • First observedset_device_port
    • First observedset_firewall_policy_enabled
    • First observedset_schedule_enabled
    • First observedset_webhook_destination_enabled
    • First observedtest_webhook_destination
    • First observedtroubleshoot_client
    • First observedunblock_client
    • First observedupdate_network
    • First observedupdate_wlan
    • First observedupgrade_device
    • First observedverify_snapshot

TDQS

A3.8/5.0

Scored across 111 tools

Disambiguation3/5

The descriptions are unusually thorough and cross-reference near-neighbors well, but 111 tools creates many clusters where an agent could easily pick the wrong one. Health summaries, traffic views, Protect event tools, and analysis reports all overlap enough that careful reading is required to avoid misselection.

Naming Consistency4/5

Names overwhelmingly follow a clear verb_noun pattern such as list_*, get_*, create_*, update_*, delete_*, and set_*. Minor inconsistencies exist: reads mix list_ and get_ arbitrarily, global aggregation uses get_global_* alongside get_all_sites_health, and trigger operations use capture_, poll_, run_, and test_ inconsistently.

Tool Count1/5

With 111 tools, this is a severe count mismatch even for a server covering UniFi Network, Protect, and runtime administration. The tool count far exceeds the 25+ threshold for 'too many' and will overwhelm agent context and increase selection errors.

Completeness4/5

The surface is remarkably broad, covering CRUD for networks, WLANs, firewall rules/policies, client management, schedules, webhooks, and Protect cameras, plus global aggregation and analysis. Notable gaps include no update for firewall policies or port-forwarding rules and no device adoption/forget lifecycle, but most gaps can be worked around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to manage and monitor UniFi Network Controllers through natural language. Provides 25 read-only tools for discovering devices and clients, viewing security configurations, analyzing network statistics, and exporting configuration data.
    41
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with access to UniFi Network and Protect infrastructure for managing devices, monitoring clients, analyzing network health, viewing camera snapshots, and getting optimization recommendations across multiple UniFi controllers.
    2
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables comprehensive management of UniFi Network infrastructure through 24 tools for monitoring and controlling devices, clients, wireless networks, security, and guest access. Supports network administration tasks like device restarts, client blocking, WLAN configuration, and backup creation.
    10 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to manage and monitor UniFi network infrastructure through natural language, providing 46 management tools across device, client, WiFi, network, firewall, port forwarding, monitoring, and site management.
    1
    MIT