UniFi Fabric MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_TLS_MODE | No | none, https, or mtls. | none |
| MCP_AUTH_MODE | No | none, bearer, or oauth. Unset resolves to bearer when MCP_BEARER_TOKEN is set, else none. | unset |
| UNIFI_API_KEY | No | Single API key shorthand. Required if UNIFI_API_KEYS is not set. | |
| UNIFI_API_KEYS | No | JSON list of key configs for multi-console MSP setups. | [] |
| MCP_TLS_KEYFILE | No | Server private key path. Required for https/mtls. | |
| UNIFI_LOG_LEVEL | No | Logging verbosity. Accepts DEBUG, INFO, WARNING, ERROR, CRITICAL. | INFO |
| MCP_BEARER_TOKEN | No | Shared secret for bearer mode. | |
| MCP_OAUTH_ISSUER | No | OAuth issuer URL. Required for oauth. | |
| MCP_TLS_CA_CERTS | No | Client CA bundle for verifying client certs. Required for mtls. | |
| MCP_TLS_CERTFILE | No | Server certificate path. Required for https/mtls. | |
| FASTMCP_TRANSPORT | No | Sets the communication protocol between the MCP server and clients. | streamable-http |
| MCP_TLS_CERT_REQS | No | Client-cert verification level for mtls: none, optional, or required. | |
| MCP_OAUTH_AUDIENCE | No | Expected token audience. Required for oauth. | |
| MCP_OAUTH_BASE_URL | No | Public base URL of this resource server. Required for oauth. | |
| MCP_OAUTH_JWKS_URI | No | JWKS URI for signature verification. Required for oauth. | |
| UNIFI_API_BASE_URL | No | UniFi Site Manager API base URL. | https://api.ui.com |
| MCP_OAUTH_ALGORITHM | No | JWT signing algorithm to accept. | RS256 |
| MCP_TLS_KEY_PASSWORD | No | Password for an encrypted private key. Optional. | |
| UNIFI_CACHE_MAX_HOSTS | No | Max entries in the hosts TTLCache. | 512 |
| UNIFI_CACHE_MAX_SITES | No | Max entries in the per-console sites TTLCache. | 2048 |
| UNIFI_MAX_CONCURRENCY | No | Max concurrent outbound requests to api.ui.com. | 10 |
| UNIFI_CACHE_TTL_SECONDS | No | TTL for host/site registry cache (seconds). | 900 |
| UNIFI_PAGINATE_MAX_PAGES | No | Hard cap on pages drained per call. Default is unlimited. | None |
| MCP_OAUTH_REQUIRED_SCOPES | No | Comma-separated scopes a token must carry. | |
| UNIFI_ENABLE_MOBILITY_WRITE | No | Enable guarded Mobility write tools. Fail-closed: default OFF. | false |
| UNIFI_ENABLE_CONNECTOR_WRITE | No | Enable the mutating generic connector relay. Fail-closed: default OFF. | false |
| UNIFI_REQUEST_TIMEOUT_SECONDS | No | HTTP request timeout in seconds. | 30 |
| MCP_OAUTH_AUTHORIZATION_SERVERS | No | Comma-separated authorization-server URLs. Defaults to [MCP_OAUTH_ISSUER]. | |
| UNIFI_PROTECT_MUTATIONS_ENABLED | No | Deployment-level kill switch for all Protect mutation and physical-action tools. Default ON. | true |
| UNIFI_ENABLE_CARRIER_FABRIC_WRITE | No | Enable guarded Carrier / ISP Fabric write tools. Fail-closed: default OFF. | false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_hostsA | List all UniFi consoles (hosts) with firmware, WAN IP, and status. Host records are returned verbatim, including reportedState GPS coordinates. By default every page is drained and the complete host list is returned. Pass page_token to fetch a single page manually (the response then carries a nextToken cursor to continue). A capped drain returns the hosts gathered so far with incomplete=true rather than truncating silently. |
| get_hostA | Get details for a single UniFi console by name or ID. host: console name, ID, or composite ID (MAC:numericId format for cloud consoles). Host record is returned verbatim, including reportedState GPS coordinates. |
| list_sitesA | List all sites with device/client counts and ISP info. The By default every page is drained and the complete site list is returned. Pass page_token to fetch a single page manually (the response then carries a nextToken cursor to continue). A capped drain returns the sites gathered so far with incomplete=true rather than truncating silently. |
| list_devicesA | List all devices across the fleet with status, firmware, and model. host: optional filter by console name, ID, or composite ID (MAC:numericId format). By default every page is drained and the complete device list is returned. Pass page_token to fetch a single page manually (the response then carries a nextToken cursor to continue). A capped drain returns the devices gathered so far with incomplete=true rather than truncating silently. |
| get_isp_metricsA | Get WAN health metrics (speed, latency, packet loss, uptime). This is the simple, unfiltered variant (interval only). To scope by console/site or a
time window, use interval: time bucket for metrics aggregation — '5m' or '1h'. Returns a dict with a 'periods' list containing WAN speed, latency, packet loss, and uptime. |
| query_isp_metricsA | Query filtered ISP metrics with optional site/time range filters. This is the filtered variant of interval: time bucket for metrics aggregation — '5m' or '1h'. host: console name, ID, or composite ID (MAC:numericId format) — resolves to hostId. site: site name or ID — resolves to siteId automatically. sites: advanced use — list of raw {hostId, siteId} dicts; use host/site params instead for human-readable names. start_time/end_time: ISO 8601 UTC timestamp STRINGS, e.g. "2026-07-23T00:00:00Z". These are strings, NOT epoch numbers — passing an epoch integer (seconds or milliseconds) is rejected by schema validation with 'Input should be a valid string [type=string_type]'. (Note the deliberate inconsistency with the epoch-based history tools: list_protect_events, list_client_sessions and get_historical_stats take epoch SECONDS as integers, whereas this Site Manager tool takes ISO 8601 strings.) An epoch supplied AS a string (e.g. "1690000000000") is also rejected, with the expected format, rather than being forwarded to the API as a meaningless window. |
| list_sdwan_configsA | List Site Magic (SD-WAN) VPN mesh configurations. By default every page is drained and the complete config list is returned. Pass page_token to fetch a single page manually (the response then carries a nextToken cursor to continue). A capped drain returns the configs gathered so far with incomplete=true rather than truncating silently. |
| get_sdwan_configA | Get a single SD-WAN configuration by ID. config_id: REQUIRED. Obtain it from |
| get_sdwan_config_statusA | Get the status of an SD-WAN configuration by ID. config_id: REQUIRED. Obtain it from |
| list_all_sites_aggregatedA | List all sites with aggregated health stats from the /v1/sites/ API. Returns sites merged with health summary: device counts, client counts, alerts, and connectivity status in a single call. |
| get_site_health_summaryB | Get health summary for a single site: uptime, alerts, and device counts. site: site name or ID. |
| compare_site_performanceB | Compare health and performance metrics across multiple sites side-by-side. sites: list of site names or IDs to compare. |
| search_across_sitesA | Search for devices or clients matching a query across all sites. query: search term matched against name, MAC address, IP, or model. |
| get_site_inventoryA | Get full inventory for a site: all devices and connected clients. site: site name or ID. |
| get_network_application_infoA | Get the UniFi Network application version reported by a console. host: console name, ID, or composite ID (MAC:numericId format). |
| list_local_sitesA | List sites managed by one UniFi Network application. host: console name, ID, or composite ID (MAC:numericId format). By default every page is drained and the complete list is returned. Pass offset/limit to fetch a single page manually (native envelope preserved). A capped drain returns the sites gathered so far with incomplete=true rather than truncating silently. filter: optional UniFi Integration API filter. |
| list_networksA | List all networks/VLANs for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Networks are offset-paginated (native default page size 25); by default every page
is drained and the complete list is returned as {data, totalCount}. Pass offset or
limit for a single manual page. filter: optional Network Integration API filter
expression, forwarded unchanged as the upstream |
| create_networkA | Create a new network/VLAN on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Validated locally before the request (a missing field raises ValueError naming it):
D12 auto-exclusion: UniFi silently adds every new network to the
|
| get_networkA | Get a single network/VLAN by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
network_id: REQUIRED. Obtain it from |
| update_networkA | Update an existing network/VLAN. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
network_config: full network configuration to replace with.
network_id: REQUIRED. Obtain it from |
| delete_networkA | Delete a network/VLAN. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
network_id: REQUIRED. Obtain it from |
| get_network_referencesA | Get all resources referencing a network — useful before deleting to check dependencies. Returns WiFi broadcasts, firewall policies, and port profiles that use this network. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. network_id: network UUID from list_networks. |
| list_lagsA | List Link Aggregation Groups (LAGs) on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Drains all pages by default; pass offset/limit for a single manual page. A capped drain is flagged incomplete rather than truncated silently. filter: optional UniFi Integration API filter expression. |
| get_lagA | Get one Link Aggregation Group. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. lag_id: LAG UUID from list_lags. |
| list_mc_lag_domainsA | List Multi-Chassis Link Aggregation (MC-LAG) domains on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Drains all pages by default; pass offset/limit for a single manual page. A capped drain is flagged incomplete rather than truncated silently. filter: optional UniFi Integration API filter expression. |
| get_mc_lag_domainA | Get one Multi-Chassis Link Aggregation domain. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. mc_lag_domain_id: domain UUID from list_mc_lag_domains. |
| list_switch_stacksA | List switch stacks on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Drains all pages by default; pass offset/limit for a single manual page. A capped drain is flagged incomplete rather than truncated silently. filter: optional UniFi Integration API filter expression. |
| get_switch_stackA | Get one switch stack. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. switch_stack_id: switch-stack UUID from list_switch_stacks. |
| list_wifi_broadcastsA | List all WiFi broadcast SSIDs for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
filter: optional Network Integration API filter expression, forwarded unchanged as
the upstream |
| create_wifi_broadcastA | Create a new WiFi broadcast SSID on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Validated locally before the request (a missing field raises ValueError naming it):
|
| get_wifi_broadcastA | Get a single WiFi broadcast SSID by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
broadcast_id: REQUIRED. Obtain it from |
| update_wifi_broadcastA | Update an existing WiFi broadcast SSID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
broadcast: full WiFi broadcast configuration to replace with.
broadcast_id: REQUIRED. Obtain it from |
| delete_wifi_broadcastA | Delete a WiFi broadcast SSID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
broadcast_id: REQUIRED. Obtain it from |
| list_wan_interfacesA | List WAN interfaces for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| update_wan_interfaceC | Update a WAN interface configuration. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. wan_id: WAN interface ID to update. wan: fields to update (name, ip, gateway, dns, etc.). |
| list_site_devicesA | List all adopted devices for a site via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
By default every page is drained and the complete device list is returned.
offset/limit: fetch a single page manually (the API's totalCount is
surfaced so you can advance). filter: optional Network Integration API
filter expression, forwarded unchanged as the upstream |
| adopt_deviceB | Adopt a device onto a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device: device adoption payload (mac, name, etc.). Example: adopt_device(host="main-office", site="HQ", device={"mac": "aa:bb:cc:dd:ee:ff"}) |
| get_deviceA | Get details for a single adopted device. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device UUID or MAC address (accepted formats: AA:BB:CC:DD:EE:FF, AABBCCDDEEFF, aa-bb-cc-dd-ee-ff). |
| unadopt_deviceC | Unadopt (remove) a device from a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: unique identifier of the device to remove. Example: unadopt_device(host="main-office", site="HQ", device_id="device-uuid-here") |
| execute_device_actionA | Execute a device action (restart, upgrade, locate, etc.). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
action: must include: {'action': str}. Common commands: {'action': 'restart'},
{'action': 'adopt'}, {'action': 'force-provision'}. Valid commands vary by device type.
device_id: REQUIRED. Obtain it from |
| get_device_statisticsB | Get latest statistics for a device. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device UUID or MAC address (accepted formats: AA:BB:CC:DD:EE:FF, AABBCCDDEEFF, aa-bb-cc-dd-ee-ff). |
| execute_port_actionA | Execute a port action on a device interface. OPERATIONAL-ACTION-ONLY, NOT A CONFIG WRITER: this Integration port-actions endpoint performs a transient operational action; it does NOT persist port configuration. A PoE power cycle ({'action': 'power-cycle'}, canonical id POWER_CYCLE) is the only valid action -- it powers a PoE port off and back on (only meaningful on PoE-capable ports). Config-style actions such as {'action': 'set-poe-mode', ...} are rejected by the controller with HTTP 400 'unknown-type-id' and leave the port unchanged (verified live). Do NOT use this to set PoE mode, STP, VLAN, or any persistent port setting -- there is no confirmed per-port persistent-config writer on this API; a shared Ethernet Port Profile (update_port_profile) is a different, wide-blast-radius surface. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
port_idx: port index number (1-based, matching the switch's physical port numbering).
action: the port-action payload, shape {'action': str}, forwarded verbatim to the
UniFi Network Integration API port-actions endpoint. 'power-cycle' (POWER_CYCLE)
is the one valid, documented action; other values return HTTP 400
'unknown-type-id' from the controller.
device_id: REQUIRED. Obtain it from |
| restart_deviceA | Restart an adopted device. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
device_id: REQUIRED. Obtain it from |
| locate_deviceA | Toggle the locate LED on an adopted device. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
enabled: True to enable locate LED, False to disable.
device_id: REQUIRED. Obtain it from |
| upgrade_deviceA | Trigger a firmware upgrade on an adopted device. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
device_id: REQUIRED. Obtain it from |
| list_pending_devicesA | List devices pending adoption on a console. host: console name, ID, or composite ID (MAC:numericId format). |
| create_device_tagA | Create a device tag on a site. This is a write operation that modifies live config. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tag: required fields:
|
| update_device_tagA | Update a device tag by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tag_id: device tag ID to update. tag: fields to update (name, color, etc.). |
| delete_device_tagA | Delete a device tag by ID. This permanently removes the tag from the site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tag_id: device tag ID to delete. |
| approve_pending_deviceA | Approve a pending device for adoption onto a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device ID from list_pending_devices to approve. |
| reject_pending_deviceB | Reject a pending device, preventing it from joining the site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device ID from list_pending_devices to reject. |
| list_clientsA | List connected clients for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
By default every page is drained and the complete client list is returned
as {data, totalCount}. offset/limit: fetch a single page manually (the
API's totalCount is surfaced so you can advance). client_type: convenience
shorthand — WIRELESS, WIRED, or ALL (default: all types) — translated into
the upstream |
| get_clientA | Get details for a single client. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
client_id: REQUIRED. Obtain it from |
| execute_client_actionB | Execute a client action (block, unblock, reconnect). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
action: must include: {'action': str}. Common commands: {'action': 'block'},
{'action': 'unblock'}, {'action': 'reconnect'}.
client_id: REQUIRED. Obtain it from |
| block_clientB | Block a client on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
client_id: REQUIRED. Obtain it from |
| unblock_clientA | Unblock a previously blocked client on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
client_id: REQUIRED. Obtain it from |
| reconnect_clientA | Force a client to reconnect on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
client_id: REQUIRED. Obtain it from |
| list_firewall_policiesA | List firewall policies for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
By default every page is drained and the complete policy list is returned as
{data, totalCount}. Pass offset/limit to fetch a single page manually (the
API's totalCount is surfaced so you can advance). filter: optional Network
Integration API filter expression, forwarded unchanged as the upstream |
| create_firewall_policyA | Create a new firewall policy on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. policy: required fields (all validated locally — a missing field raises ValueError naming it — and all verified against the live controller):
|
| get_firewall_policyA | Get a single firewall policy by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy_id: REQUIRED. The policy's id; obtain it from |
| update_firewall_policyA | Full-replace a firewall policy by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy: full firewall policy configuration to replace with.
policy_id: REQUIRED. The policy's id; obtain it from
|
| patch_firewall_policyB | Partially update a firewall policy by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
fields: fields to update on the policy.
policy_id: REQUIRED. The policy's id; obtain it from |
| delete_firewall_policyA | Delete a firewall policy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy_id: REQUIRED. The policy's id; obtain it from |
| get_firewall_policy_orderingA | Get the ordering of firewall policies for a site filtered by source and destination zone. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. source_zone_id: UUID of the source firewall zone (required by the API). destination_zone_id: UUID of the destination firewall zone (required by the API). |
| set_firewall_policy_orderingA | Set the ordering of firewall policies within one source/destination zone pair. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. source_zone_id: UUID of the source firewall zone. REQUIRED by the API and sent as a query parameter (NOT read from the ordering body); omitting it returns HTTP 400. destination_zone_id: UUID of the destination firewall zone. Same requirement as source_zone_id. Use the same zone pair you read with get_firewall_policy_ordering. ordering: policy ordering configuration (the ordered policy list for that zone pair). |
| list_firewall_zones_proxyA | List all firewall zones for a site via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Zones are offset-paginated (native default page size 25); by default every page is drained and the complete list is returned as {data, totalCount}. Pass offset or limit for a single manual page. A capped drain is flagged incomplete. |
| create_firewall_zone_proxyA | Create a new firewall zone on a site via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. zone: must include {'name': str, 'networkIds': [str]} — both required, validated locally (a missing field raises ValueError naming it) and verified against the live controller. Get network IDs from list_networks. |
| get_firewall_zone_proxyA | Get a single firewall zone by ID via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
zone_id: REQUIRED. Obtain it from |
| update_firewall_zone_proxyA | Update a firewall zone by ID via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
zone: full firewall zone configuration to replace with.
zone_id: REQUIRED. Obtain it from |
| delete_firewall_zone_proxyA | Delete a firewall zone via connector proxy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
zone_id: REQUIRED. Obtain it from |
| list_acl_rulesA | List all ACL rules for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_acl_ruleA | Create a new ACL rule on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Validated locally before the request (a missing field raises ValueError naming it):
|
| get_acl_ruleA | Get a single ACL rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
rule_id: REQUIRED. The rule's id; obtain it from |
| update_acl_ruleA | Update an existing ACL rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
rule: full ACL rule configuration to replace with.
rule_id: REQUIRED. The rule's id; obtain it from |
| delete_acl_ruleA | Delete an ACL rule. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
rule_id: REQUIRED. The rule's id; obtain it from |
| get_acl_rule_orderingA | Get the ordering of ACL rules for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| set_acl_rule_orderingB | Set the ordering of ACL rules for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. ordering: ACL rule ordering configuration. |
| list_dns_policiesA | List all DNS policies for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. DNS policies are offset-paginated (native default page size 25); by default every page is drained and the complete list is returned as {data, totalCount}. Pass offset or limit for a single manual page. A capped drain is flagged incomplete. |
| create_dns_policyA | Create a new DNS policy on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Validated locally before the request (a missing field raises ValueError naming it):
|
| get_dns_policyA | Get a single DNS policy by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy_id: REQUIRED. The policy's id; obtain it from |
| update_dns_policyA | Update a DNS policy by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy: full DNS policy configuration to replace with.
policy_id: REQUIRED. The policy's id; obtain it from |
| delete_dns_policyA | Delete a DNS policy. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
policy_id: REQUIRED. The policy's id; obtain it from |
| list_traffic_matching_listsA | List all traffic matching lists for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_traffic_matching_listA | Create a new traffic matching list on a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Validated locally before the request (a missing field raises ValueError naming it):
a top-level |
| get_traffic_matching_listA | Get a single traffic matching list by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
list_id: REQUIRED. Obtain it from |
| update_traffic_matching_listA | Update a traffic matching list by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
traffic_list: full traffic matching list configuration to replace with.
list_id: REQUIRED. Obtain it from |
| delete_traffic_matching_listA | Delete a traffic matching list. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
list_id: REQUIRED. Obtain it from |
| list_vpn_serversA | List VPN servers for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. VPN servers are offset-paginated (native default page size 25); by default every page is drained and the complete list is returned as {data, totalCount}. Pass offset or limit for a single manual page. A capped drain is flagged incomplete. |
| list_site_to_site_tunnelsA | List site-to-site VPN tunnels for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| list_radius_profilesA | List RADIUS profiles for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. RADIUS profiles are offset-paginated (native default page size 25); by default every page is drained and the complete list is returned as {data, totalCount}. Pass offset or limit for a single manual page. A capped drain is flagged incomplete. |
| list_hotspot_vouchersA | List all hotspot/guest vouchers for a site (there is no This is the voucher-listing tool; the family is host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Vouchers are offset-paginated (native default page size 100) and batches routinely exceed that; by default every page is drained and the complete list is returned as {data, totalCount}. Pass offset or limit for a single manual page. A capped drain is flagged incomplete. |
| create_hotspot_vouchersA | Generate hotspot vouchers for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
voucher_config: required fields (validated locally — a missing field raises ValueError
naming it — and verified against the live controller): |
| get_hotspot_voucherA | Get a single hotspot voucher by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
voucher_id: REQUIRED. Obtain it from |
| delete_hotspot_voucherA | Delete a single hotspot voucher. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
voucher_id: REQUIRED. Obtain it from |
| bulk_delete_hotspot_vouchersB | Bulk delete hotspot vouchers matching filter criteria. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. filter_params: filter parameters to select vouchers for deletion. |
| list_device_tagsA | List all device tags defined in a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| list_countriesA | List all countries with ISO codes available on a console. host: console name, ID, or composite ID (MAC:numericId format). |
| list_camerasA | List all cameras on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_cameraA | Get details for a single Protect camera by ID. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| update_cameraA | Update settings for a Protect camera (name, recording mode, etc.). host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of camera settings to update.
camera_id: REQUIRED. Obtain it from |
| get_camera_snapshotA | Get a snapshot from a Protect camera. Returns base64-encoded JPEG image data. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| get_rtsps_streamA | Get existing RTSPS stream URLs for a Protect camera. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| create_rtsps_streamA | Create an RTSPS stream for a Protect camera. host: console name, ID, or composite ID (MAC:numericId format).
qualities: list of channel names to enable. The exhaustive set is 'high', 'medium',
'low', and 'package' (verified live against get_rtsps_stream, which reports exactly
these four channel keys). 'package' exists only on package-camera doorbells; on other
cameras it is null. There is NO 'highest' channel. Case-insensitive — values are
normalized to lowercase before sending. The list is forwarded to the API as-is with
no local allow-list, so an unrecognised name is not validated here; the upstream
Protect API governs the outcome (a name with no matching channel yields no stream for
that entry rather than a local error).
camera_id: REQUIRED. Obtain it from |
| delete_rtsps_streamA | Delete an RTSPS stream for a Protect camera. host: console name, ID, or composite ID (MAC:numericId format).
qualities: list of channel names to delete. The exhaustive set is 'high', 'medium',
'low', and 'package' (verified live; 'package' only on package-camera doorbells).
There is NO 'highest' channel. Case-insensitive — values are normalized to lowercase
before sending. Forwarded to the API as-is with no local allow-list; an unrecognised
name is not validated here and the upstream Protect API governs the outcome.
camera_id: REQUIRED. Obtain it from |
| start_talkback_sessionA | Start a talkback audio session on a Protect camera. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| disable_camera_mic_permanentlyA | Permanently disable the microphone on a Protect camera. This cannot be undone. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| ptz_goto_presetA | Move a PTZ camera to a preset position slot. host: console name, ID, or composite ID (MAC:numericId format).
slot: preset slot number to move to.
camera_id: REQUIRED. Obtain it from |
| ptz_patrol_startB | Start a PTZ patrol on a preset slot. host: console name, ID, or composite ID (MAC:numericId format).
slot: patrol preset slot number.
camera_id: REQUIRED. Obtain it from |
| ptz_patrol_stopB | Stop the current PTZ patrol on a camera. host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| list_sensorsA | List all sensors on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_sensorA | Get details for a single Protect sensor by ID. host: console name, ID, or composite ID (MAC:numericId format).
sensor_id: REQUIRED. Obtain it from |
| update_sensorB | Update settings for a Protect sensor. host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of sensor settings to update.
sensor_id: REQUIRED. Obtain it from |
| list_protect_eventsA | Query historical Protect events (motion, smart-detect, sensor open/close, etc.). This uses the private /proxy/protect/api/events REST path — the ONLY source of historical events. The official Protect Integration API exposes events solely over WebSocket (/v1/subscribe/events) with no REST query endpoint, so do not expect the integration path to answer this. REQUIRED: host, start, and end. host: console name, ID, or composite ID (MAC:numericId format). start/end: REQUIRED. Epoch SECONDS (UTC) as integers, converted to milliseconds internally. Ranges are inclusive on both ends. History depth is bounded by the NVR's retention. (Contrast query_isp_metrics, which wants ISO 8601 strings.) types: filter by event TYPE; single value or a list. Verified-present values: motion, smartDetectZone, smartAudioDetect, sensorOpened, sensorClosed, access. NOTE: person/face/animal/alrmSpeak are NOT event types — they are smart-detect subtypes and belong in smart_detect_types, not here. An unrecognised value returns zero events. smart_detect_types: filter by the smart-detect SUBTYPE — person, vehicle, animal, package, face, licensePlate (on smartDetectZone events) and the audio alarms alrmSpeak, alrmSiren, alrmBark, alrmCarHorn (on smartAudioDetect events). This is a distinct upstream parameter from types. The API only honours it when types is also set to the relevant event type(s); passing smart_detect_types alone is a silent no-op upstream, so this tool rejects that with a clear error. Example: types="smartDetectZone", smart_detect_types="person" for just person detections; types="smartAudioDetect", smart_detect_types="alrmSpeak" to isolate the dominant audio-alarm noise. cameras: filter by camera NAME or ID; single value or list. Names resolve to IDs (case-insensitive) — an unknown name errors rather than silently matching nothing. categories: filter by event category; single value or list. Verified values: motion, smart, iot, admin. Unknown values are silently ignored by the upstream API. without_descriptions: when true, ask the API to omit each event's description block (~16% smaller payload). Opt-in only — full-fidelity records are the default and descriptions are never dropped automatically. limit/offset: offset-based pagination (not cursor-based). By default (neither given) every page is drained and the complete event set for the window is returned — a wide window can hold tens of thousands of events, so expect all of them, not just the first page. Pass offset or limit to fetch a single manual page instead; a capped drain is flagged incomplete rather than truncating. order_direction: "ASC" (default, oldest-first) or "DESC" (newest-first). Sensor events set the top-level |
| list_recognition_groupsA | List recognition groups (enrolled faces / vehicles) on a Protect console. Uses the private /proxy/protect/api/recognition/{type}/groups REST path (not the Protect Integration API, which has no recognition surface). Each group is a recognised subject with a stable, monotonic id (face_1, face_90, …), a name / matchedName label, a detectionsCount, and createdAt/firstDetectedAt/lastDetectedAt timestamps usable as sync and change-detection keys. This is a faithful pass-through: the name label is returned as-is and nothing is redacted. Response shape: {"groups": [...], "count": N} (plus "nextPage" / "incomplete" when paging manually). The array key is "groups", NOT "data" — unlike the offset-proxy tools that return {"data": [...], "totalCount": N}; read the list from result["groups"]. host: console name, ID, or composite ID (MAC:numericId format). type: recognition type. Use 'face' or 'vehicle' (singular). Plural forms ('faces', 'vehicles') are NOT valid and return HTTP 400 from upstream — two separate agents have guessed plural and hit this error. The value is forwarded as-is, so any other type the console accepts also works, and any it rejects is answered by the API's own error. has_name: when true, return only named groups (unnamed groups are filtered out). page_size: API page size; also the drain page size. Defaults to 200. order_by / order_direction: server-side sort. order_direction is 'asc' or 'desc', case-insensitive ('ASC'/'DESC' behave identically); an unrecognised value is rejected upstream with HTTP 400. It only takes effect together with order_by (e.g. order_by='name') — with order_by set but order_direction omitted the API defaults to descending. order_by accepts name, createdAt, lastDetectedAt, or detectionsCount. page: fetch a single page (1-based) instead of draining. The response pages via a links.next envelope; by default every page is drained and the complete group set is returned. Pass page to fetch one page manually — nextPage is then surfaced. |
| get_recognition_group_countsA | Get aggregate recognition-group counts for a Protect console. Returns totals such as totalCount, nameNotNullCount (named groups), nameIsNullCount, notificationEnabledCount, and degradedCount. host: console name, ID, or composite ID (MAC:numericId format). type: recognition type. Use 'face' or 'vehicle' (singular — plural forms return HTTP 400 from upstream). Forwarded to the API as-is. |
| get_recognition_group_imageA | Get a recognition group's reference crop. Returns base64-encoded JPEG image data. host: console name, ID, or composite ID (MAC:numericId format). type: recognition type. Use 'face' or 'vehicle' (singular -- plural forms return HTTP 400 from upstream). Forwarded to the API as-is. group_id: the group's stable id, e.g. face_90. |
| list_recognition_detectionsA | List a recognition group's detections (individual sightings) on a Protect console. REQUIRED: both Each detection carries id, eventId (joinable against list_protect_events), thumbnailId (fetch the crop with get_thumbnail), detectedAt (epoch ms), cameraId, and matchedGroupConfidence (0-100). Response shape: {"detections": [...], "count": N} (plus "nextPage" / "incomplete" when paging manually). The array key is "detections", NOT "data" — unlike the offset-proxy tools that return {"data": [...], "totalCount": N}; read the list from result["detections"]. host: console name, ID, or composite ID (MAC:numericId format).
type: recognition type. Use 'face' or 'vehicle' (singular -- plural forms
return HTTP 400 from upstream). Forwarded to the API as-is.
group_id: REQUIRED. The group's stable id, e.g. face_90 — take it from a
|
| get_thumbnailA | Get a detection thumbnail crop. Returns base64-encoded JPEG image data. host: console name, ID, or composite ID (MAC:numericId format). thumbnail_id: the thumbnailId from a detection record. |
| list_lightsA | List all lights on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_lightA | Get details for a single Protect light by ID. host: console name, ID, or composite ID (MAC:numericId format).
light_id: REQUIRED. Obtain it from |
| update_lightA | Update settings for a Protect light (brightness, sensitivity, etc.). host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of light settings to update.
light_id: REQUIRED. Obtain it from |
| list_chimesA | List all chimes on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_chimeA | Get details for a single Protect chime by ID. host: console name, ID, or composite ID (MAC:numericId format).
chime_id: REQUIRED. Obtain it from |
| update_chimeA | Update settings for a Protect chime (volume, ringtone, etc.). host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of chime settings to update.
chime_id: REQUIRED. Obtain it from |
| list_viewersA | List all viewers on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_viewerA | Get details for a single Protect viewer by ID. host: console name, ID, or composite ID (MAC:numericId format).
viewer_id: REQUIRED. Obtain it from |
| update_viewerB | Update settings for a Protect viewer (liveview assignment, etc.). host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of viewer settings to update.
viewer_id: REQUIRED. Obtain it from |
| list_liveviewsB | List all liveviews on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). |
| get_liveviewA | Get details for a single Protect liveview by ID. host: console name, ID, or composite ID (MAC:numericId format).
liveview_id: REQUIRED. Obtain it from |
| create_liveviewB | Create a liveview on a Protect console. host: console name, ID, or composite ID (MAC:numericId format). name: liveview display name. settings: optional additional liveview fields (layout, slots, etc.). |
| update_liveviewB | Update a liveview on a Protect console. host: console name, ID, or composite ID (MAC:numericId format).
settings: key-value pairs of liveview settings to update.
liveview_id: REQUIRED. Obtain it from |
| get_nvrA | Get NVR details from a Protect console. Returns NVR hardware info, storage status, firmware version, and system health. host: console name, ID, or composite ID (MAC:numericId format). |
| list_protect_filesA | List Protect device asset files of a given type. host: console name, ID, or composite ID (MAC:numericId format). file_type: Protect asset category. 'sounds' and 'images' are the known categories. The GET endpoint does NOT validate this value — an unrecognised category returns HTTP 200 with an empty list rather than an error, so a wrong value is indistinguishable from a genuinely empty category. Pass a known category exactly. |
| upload_protect_fileA | Upload a Protect device asset file. WARNING: Uploads asset file to NVR storage. Overwriting system files may not be reversible. host: console name, ID, or composite ID (MAC:numericId format). file_type: Protect asset category. 'sounds' and 'images' are the known categories; the value selects the upload target path (/files/{file_type}). The category is not validated on read-back, so pass a known category exactly. filename: name of the file to upload (e.g. 'alert.mp3'). file_content_base64: base64-encoded file content. |
| trigger_alarm_webhookA | Trigger an alarm manager webhook by ID. WARNING: triggers physical alarm hardware. Verify webhook ID is correct before confirming. host: console name, ID, or composite ID (MAC:numericId format). webhook_id: alarm webhook ID to trigger. confirm: must be True to execute. Prevents accidental triggers on live infrastructure. |
| list_arm_profilesA | List arm profiles on a Protect console (GET /v1/arm-profiles via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). Availability requires a Protect application exposing the v7.1.87 Integration API. |
| get_arm_profileA | Get one arm profile by id (filters GET /v1/arm-profiles; no GET-by-id exists upstream). host: console name, ID, or composite ID (MAC:numericId format).
arm_profile_id: REQUIRED. Obtain it from |
| create_arm_profileA | Create an arm profile (POST /v1/arm-profiles via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). name: REQUIRED display name for the profile. settings: the rest of the required body — automations, schedules, recordEverything, activationDelay (server-side validated). Governed by UNIFI_PROTECT_MUTATIONS_ENABLED. |
| update_arm_profileA | Update an arm profile (PATCH /v1/arm-profiles/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
arm_profile_id: REQUIRED. Obtain it from |
| delete_arm_profileA | Delete an arm profile (DELETE /v1/arm-profiles/{id}). Irreversible — no undo. host: console name, ID, or composite ID (MAC:numericId format).
arm_profile_id: REQUIRED. Obtain it from |
| update_arm_profile_settingsA | Select the active arm profile (PATCH /v1/arm-profiles/settings). host: console name, ID, or composite ID (MAC:numericId format).
arm_profile_id: REQUIRED. Obtain it from |
| enable_armA | Enable the arm alarm using the selected profile (POST /v1/arm-profiles/enable). WARNING: arms the alarm system (physical side effects); requires a local Alarm Manager. host: console name, ID, or composite ID (MAC:numericId format). confirm: must be true to execute. Governed by UNIFI_PROTECT_MUTATIONS_ENABLED. |
| disable_armA | Disable the arm alarm (POST /v1/arm-profiles/disable). Disarms the system. WARNING: physical side effects; requires a local Alarm Manager. host: console name, ID, or composite ID (MAC:numericId format). confirm: must be true to execute. Governed by UNIFI_PROTECT_MUTATIONS_ENABLED. |
| list_sirensA | List sirens on a Protect console (GET /v1/sirens via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_sirenA | Get one siren by id (GET /v1/sirens/{id}). host: console name, ID, or composite ID (MAC:numericId format).
siren_id: REQUIRED. Obtain it from |
| update_sirenA | Update siren settings (PATCH /v1/sirens/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
siren_id: REQUIRED. Obtain it from |
| siren_playA | Sound a siren (POST /v1/sirens/{id}/play). WARNING: physical alarm sound. host: console name, ID, or composite ID (MAC:numericId format).
siren_id: REQUIRED. Obtain it from |
| siren_stopA | Stop a sounding siren (POST /v1/sirens/{id}/stop). WARNING: physical action. host: console name, ID, or composite ID (MAC:numericId format).
siren_id: REQUIRED. Obtain it from |
| siren_test_soundA | Test a siren's sound (POST /v1/sirens/{id}/test-sound). WARNING: physical sound. host: console name, ID, or composite ID (MAC:numericId format).
siren_id: REQUIRED. Obtain it from |
| list_fobsA | List fobs on a Protect console (GET /v1/fobs via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_fobA | Get one fob by id (GET /v1/fobs/{id}). host: console name, ID, or composite ID (MAC:numericId format).
fob_id: REQUIRED. Obtain it from |
| update_fobA | Update fob settings (PATCH /v1/fobs/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
fob_id: REQUIRED. Obtain it from |
| list_relaysA | List relays on a Protect console (GET /v1/relays via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_relayA | Get one relay by id (GET /v1/relays/{id}). host: console name, ID, or composite ID (MAC:numericId format).
relay_id: REQUIRED. Obtain it from |
| update_relayA | Update relay settings (PATCH /v1/relays/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
relay_id: REQUIRED. Obtain it from |
| relay_activate_outputA | Switch a relay output (POST /v1/relays/{id}/outputs/{outputId}/activate). WARNING: physically switches hardware.
host: console name, ID, or composite ID (MAC:numericId format).
relay_id: REQUIRED. Obtain it from |
| list_speakersA | List speakers on a Protect console (GET /v1/speakers via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_speakerA | Get one speaker by id (GET /v1/speakers/{id}). host: console name, ID, or composite ID (MAC:numericId format).
speaker_id: REQUIRED. Obtain it from |
| update_speakerA | Update speaker settings (PATCH /v1/speakers/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
speaker_id: REQUIRED. Obtain it from |
| speaker_test_soundA | Test a speaker's sound (POST /v1/speakers/{id}/test-sound). WARNING: physical sound. host: console name, ID, or composite ID (MAC:numericId format).
speaker_id: REQUIRED. Obtain it from |
| list_bridgesA | List bridges on a Protect console (GET /v1/bridges via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_bridgeA | Get one bridge by id (GET /v1/bridges/{id}). host: console name, ID, or composite ID (MAC:numericId format).
bridge_id: REQUIRED. Obtain it from |
| update_bridgeA | Update bridge settings (PATCH /v1/bridges/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
bridge_id: REQUIRED. Obtain it from |
| list_link_stationsA | List link stations on a Protect console (GET /v1/link-stations via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_link_stationA | Get one link station by id (GET /v1/link-stations/{id}). host: console name, ID, or composite ID (MAC:numericId format).
link_station_id: REQUIRED. Obtain it from |
| update_link_stationA | Update link-station settings (PATCH /v1/link-stations/{id}) with read/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
link_station_id: REQUIRED. Obtain it from |
| list_alarm_hubsA | List alarm hubs on a Protect console (GET /v1/alarm-hubs via Fabric proxy). host: console name, ID, or composite ID (MAC:numericId format). |
| get_alarm_hubA | Get one alarm hub by id (GET /v1/alarm-hubs/{id}). host: console name, ID, or composite ID (MAC:numericId format).
alarm_hub_id: REQUIRED. Obtain it from |
| update_alarm_hubA | Update alarm-hub settings (PATCH /v1/alarm-hubs/{id}) with read-before/no-op/read-after. host: console name, ID, or composite ID (MAC:numericId format).
alarm_hub_id: REQUIRED. Obtain it from |
| alarm_hub_trigger_outputA | Trigger an alarm-hub output (POST /v1/alarm-hubs/{id}/outputs/{outputId}/trigger). WARNING: physically triggers alarm-hub output hardware.
host: console name, ID, or composite ID (MAC:numericId format).
alarm_hub_id: REQUIRED. Obtain it from |
| list_protect_usersA | List Protect users (GET /v1/users via Fabric proxy). Read-only in the Integration API. host: console name, ID, or composite ID (MAC:numericId format). |
| get_protect_userA | Get one Protect user by id (GET /v1/users/{id}). Read-only. host: console name, ID, or composite ID (MAC:numericId format).
user_id: REQUIRED. Obtain it from |
| get_protect_application_infoA | Get Protect application metadata (GET /v1/meta/info via Fabric proxy). Read-only. Reports the Protect application version and Integration-API capabilities — the authoritative check for which extended Protect families this console supports. host: console name, ID, or composite ID (MAC:numericId format). |
| list_ulp_usersA | List ULP (UniFi account) users (GET /v1/ulp-users). Read-only. Distinct from |
| get_ulp_userA | Get one ULP (UniFi account) user by id (GET /v1/ulp-users/{id}). Read-only. host: console name, ID, or composite ID (MAC:numericId format).
ulp_user_id: REQUIRED. Obtain it from |
| pos_ingest_transactionA | Ingest a POS transaction overlay onto camera footage. Route: POST /v1/pos/cameras/{id}/transactions (Fabric proxy). WARNING: creates a footage overlay event with no documented rollback. This has its own
confirmation boundary and an idempotency guard; the POS write is never auto-retried.
host: console name, ID, or composite ID (MAC:numericId format).
camera_id: REQUIRED. Obtain it from |
| list_port_forwardsB | List all port forwarding rules for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_port_forwardA | Create a port forwarding rule via the Classic REST API. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
payload: port forward config. Required fields (validated locally — a missing field
raises ValueError naming it): name, dst_port, fwd, fwd_port. |
| update_port_forwardA | Update a port forwarding rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. forward_id: port forward rule ID. payload: fields to update. |
| delete_port_forwardA | Delete a port forwarding rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
forward_id: REQUIRED. Obtain it from |
| list_traffic_rulesB | List traffic matching rules (QoS, application, IP group matching). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_traffic_ruleA | Create a traffic matching rule (QoS, block, or route by application/IP group). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. payload: required fields (validated locally — a missing field raises ValueError naming it — and verified against the live controller):
|
| update_traffic_ruleA | Update a traffic rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. rule_id: traffic rule ID. payload: fields to update. |
| delete_traffic_ruleA | Delete a traffic rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
rule_id: REQUIRED. The rule's id; obtain it from |
| create_site_to_site_tunnelA | Create a site-to-site VPN tunnel. This is a write operation that modifies live config. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tunnel: tunnel configuration payload (remoteIp, psk, networks, enabled, etc.). |
| update_site_to_site_tunnelB | Update a site-to-site VPN tunnel by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tunnel_id: tunnel ID to update. tunnel: fields to update (remoteIp, psk, networks, enabled, etc.). |
| delete_site_to_site_tunnelA | Delete a site-to-site VPN tunnel by ID. This permanently removes the tunnel config. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. tunnel_id: tunnel ID to delete. |
| get_vpn_serverA | Get a single VPN server configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. server_id: VPN server ID. |
| create_vpn_serverB | Create a VPN server (OpenVPN, WireGuard, or L2TP). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. vpn_type: 'openvpn', 'wireguard', or 'l2tp'. subnet: VPN client address pool CIDR. |
| update_vpn_serverB | Update a VPN server configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. server_id: VPN server ID. fields: fields to update (name, type, subnet, enabled, etc.). |
| delete_vpn_serverA | Delete a VPN server by ID. WARNING: Permanently removes VPN server. Connected clients will lose access immediately. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. server_id: VPN server ID. |
| get_radius_profileB | Get a single RADIUS authentication profile by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. profile_id: RADIUS profile ID. |
| create_radius_profileA | Create a RADIUS authentication profile. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. name: REQUIRED. Display name for the new RADIUS profile. auth_server_ip: REQUIRED. RADIUS authentication server IP address (string). auth_server_port: REQUIRED. RADIUS authentication server UDP port (integer, e.g. 1812). auth_server_secret: REQUIRED. Shared secret (string) for the RADIUS authentication server. acct_server_ip/port/secret: optional accounting server details. Note: if the console returns HTTP 405, RADIUS profile creation is not supported on this firmware version and profiles are effectively read-only. Use list_radius_profiles instead. |
| list_hotspot_operatorsA | List hotspot operator accounts for captive portal management. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_hotspot_operatorA | Create a hotspot operator account. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. name: operator username. password: operator password. |
| update_hotspot_operatorA | Update a hotspot operator by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. operator_id: hotspot operator ID. fields: fields to update (name, x_password, note, etc.). |
| delete_hotspot_operatorA | Delete a hotspot operator by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. operator_id: hotspot operator ID. |
| list_configured_api_keysA | List all configured API keys with their labels and types. Shows which API keys are available for MSP multi-console queries. Returns labels and org-key status without exposing actual key values. |
| list_all_devicesA | List all devices across the entire fleet. Aggregates devices from all consoles. Optionally filter by status (e.g. 'offline', 'online', 'updating') to find problem devices quickly. status_filter is applied LOCALLY by exact (case-insensitive) match against each device's status/state. WARNING: an unrecognised value is NOT rejected — it matches nothing and returns an EMPTY device list, so a typo (e.g. 'ofline') looks like a healthy fleet with zero problem devices rather than an error. Omit status_filter to get the full fleet, then read the real status values off the returned records. key_label: scope query to a specific API key (use list_configured_api_keys to see available keys). |
| list_all_clientsA | List all connected clients across all sites. Fans out requests to every site and aggregates results with source host/site annotations on each client record. key_label: scope query to consoles visible to a specific API key. |
| get_fleet_summaryA | Get a high-level fleet summary: host, site, and device counts with status breakdowns. Useful for a quick overview of the entire UniFi deployment. key_label: scope summary to consoles visible to a specific API key. |
| search_device_fleetA | Search for a device by name, MAC address, or model across the entire fleet. Returns all matching devices from all consoles. key_label: scope search to consoles visible to a specific API key. query: REQUIRED. Search string matched against device name, model, and MAC across the fleet. |
| get_site_statisticsA | Get site health statistics: latency, throughput, and client counts per subsystem. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns a list of subsystem health objects from the Classic REST /stat/health endpoint. |
| get_system_infoA | Get controller/console system info: version, uptime, and memory. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns system info objects from the Classic REST /stat/sysinfo endpoint. |
| list_active_clients_statsA | List detailed per-client statistics: traffic, signal strength, and experience score. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns a list of client stat objects from the Classic REST /stat/sta endpoint. |
| list_device_statsA | List per-device statistics: CPU load, memory, uptime, and port throughput. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns a list of device stat objects from the Classic REST /stat/device endpoint. |
| get_client_link_diagnosticsA | Get first-class per-client link/policy diagnostics for one or more clients. Read-only and Fabric-only: reuses the same Classic REST /v1/connector/consoles/{host_id}/proxy/network/api/s/{site_slug}/stat/sta request as list_active_clients_stats, then selects the requested client(s) from that payload in memory. Surfaces link quality (rssi, signal, noise, channel, radio_name), rx_rate/tx_rate and retry counters, satisfaction_reason, network/VLAN identity, QoS, fixed-IP, and virtual-network override fields when upstream provides them — the matching record is returned unchanged, so unknown/future fields survive. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. client_id: a single client selector — its /stat/sta _id, id, or mac (case- and separator-insensitive). Provide EITHER client_id OR client_ids, not both. client_ids: a bounded, explicit list of client selectors (max 64) for multi-client selection; returns the matching records as a list. A selector that matches no client fails clearly rather than being silently skipped. |
| get_device_port_stateA | Get switch port health, PoE, optics, and LLDP telemetry for a device. Read-only and Fabric-only: reuses the same Classic REST /v1/connector/consoles/{host_id}/proxy/network/api/s/{site_slug}/stat/device request as list_device_stats (one call, no new route), then projects the selected device's port telemetry from that payload. Upstream operational fields are preserved verbatim — link state/speed/duplex, rx/tx byte/packet/error/drop counters, PoE state and draw (poe_enable/poe_good/poe_power/poe_voltage/poe_current/poe_class/poe_mode), SFP/optics fields where present, and port config identity — nothing is renamed or dropped. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device selector — its /stat/device _id, id, or mac (case- and separator-insensitive). port_idx: optional 1-based port number. Omit it for the device view (verbatim port_table and lldp_table plus a thermal/power summary); set it to return that single port_table row verbatim. An unknown port_idx fails clearly. |
| get_device_stp_stateA | Get per-device STP/RSTP state and per-port STP role/state/path-cost. Read-only and Fabric-only: reads the same Classic REST /v1/connector/consoles/{host_id}/proxy/network/api/s/{site_slug}/stat/device payload as list_device_stats and projects the selected device's STP fields. Returns the device-level stp_version, stp_priority, root_switch/root (and any other stp_* field present) plus per-port STP role/state/path-cost where upstream provides them, all verbatim. This tool is read-only: STP-priority write support is documented in the PR description only and no write is performed here. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. device_id: device selector — its /stat/device _id, id, or mac (case- and separator-insensitive). |
| list_client_sessionsA | List historical client connection sessions from the Classic REST /stat/session endpoint. This is the highest-value history tool: retention is ~90 days, so it covers far more than the currently-connected client list. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. start/end: epoch SECONDS (UTC). This endpoint uses seconds natively — passing milliseconds returns HTTP 200 with an EMPTY array and no error, so seconds are enforced (millisecond-magnitude values are rejected). session_type: session class filter. The values that actually narrow the result are "all" (default — the full unfiltered set), "user" (regular clients), and "guest" (guest-network clients). WARNING: an unrecognised value is NOT rejected and does NOT return an empty array — the endpoint silently ignores it and returns the full "all" set, so a typo yields everything rather than a visible error or "no data". (UniFi documents "voucher" as a fourth class; on tested firmware it returned the full set, so prefer "user"/"guest" for real narrowing.) Each session includes mac, is_wired, assoc_time (session start, epoch seconds), duration (seconds), ap_mac, rx_bytes, tx_bytes, satisfaction, hostname, ip, _id, and roaming_sessions[]. Two things that surprise callers:
The response is passed through verbatim, including identifiers (MAC/IP/hostname). |
| get_historical_statsA | Get bucketed historical statistics from the Classic REST /stat/report endpoint. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. interval: one of "5minutes", "hourly", "daily". scope: one of "ap", "user", "site". The "ap" scope carries num_sta per AP per bucket. start/end: epoch SECONDS (UTC). Unlike /stat/session, this endpoint requires MILLISECONDS — the tool converts seconds to milliseconds internally, so callers always pass seconds for a consistent interface. attrs: metrics to aggregate; defaults to num_sta, rx_bytes, tx_bytes. Retention differs by interval: 5minutes ~1 day, hourly ~7 days, daily ~91 days. Output "time" is epoch milliseconds. Note: rx_bytes/tx_bytes come back as JSON floats in scientific notation (e.g. 5.27e9) — treat them as floats, not ints. The response is passed through verbatim. |
| list_known_clientsA | List the full per-site client roster incl. offline history (Classic REST /stat/alluser). Unlike list_active_clients_stats (currently-connected only), this includes clients seen historically — typically far more entries. (Distinct from the fleet-wide list_all_clients aggregation tool, which spans every console.) This endpoint accepts GET. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Each entry includes mac, first_seen, last_seen, disconnect_timestamp (all epoch seconds), is_wired, oui, last_ip, last_radio, hostname, and device-fingerprint fields. The response is passed through verbatim, including identifiers (MAC/IP/hostname/name). |
| list_usersA | List DHCP fixed-IP reservations and client aliases for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns entries with fields: name, note, fixed_ip, use_fixedip, network_id. |
| get_userA | Get a single DHCP/client-alias entry by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
user_id: REQUIRED. Obtain it from |
| update_userA | Update a DHCP/client-alias entry by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
payload: fields to update (name, note, fixed_ip, use_fixedip, network_id).
user_id: REQUIRED. Obtain it from |
| list_traffic_routesB | List static/policy traffic routes for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| create_traffic_routeA | Create a traffic route on a site (policy-based routing / WAN load-balancing). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. payload: required fields (validated locally — a missing field raises ValueError naming it — and verified against the live controller). This v2 endpoint uses snake_case wire field names (verified: 'network_id' is accepted, 'networkId' is not):
|
| get_traffic_routeA | Get a single traffic route by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
route_id: REQUIRED. Obtain it from |
| update_traffic_routeA | Update a traffic route by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
payload: full traffic route configuration to replace with.
route_id: REQUIRED. Obtain it from |
| delete_traffic_routeA | Delete a traffic route by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
route_id: REQUIRED. Obtain it from |
| list_settingsA | List all controller setting groups for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns a list of setting objects grouped by key (mgmt, super_smtp, guest_access, etc.). |
| get_settingA | Get a controller setting group by key. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. setting_key: setting group identifier (e.g. 'mgmt', 'super_smtp', 'guest_access'). There is no schema endpoint, so reading a group is how you discover what it accepts: the returned object lists every settable field and its current (valid) value. Inspect it before calling update_setting — the controller silently drops any field or enum value it does not recognise, so match an existing field's shape exactly. Common keys and notable enum fields (grounded in live responses): mdns (mode, enabled_for), ntp (setting_preference), doh (state), ips (ips_mode), global_nat (mode), ssl_inspection (state), dashboard (layout_preference), locale (timezone), country (code), guest_access (auth), super_mgmt (data_retention_setting_preference). Fields prefixed 'x_' hold credentials/secrets and are returned verbatim. |
| update_settingA | Update a controller setting group by key. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. setting_key: setting group identifier (e.g. 'mgmt', 'super_smtp', 'guest_access'). payload: setting fields to update. Discover the schema first by calling get_setting(setting_key): it returns every settable field and its current (valid) value. The controller silently drops any unrecognised field or enum value (HTTP 200, value unchanged), so a guessed value fails invisibly; this tool detects that no-op and raises an error naming the rejected field and pointing you back at get_setting. |
| list_dynamic_dnsA | List Dynamic DNS provider configurations for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returned verbatim, including plaintext x_password credential fields. |
| get_dynamic_dnsA | Get a single Dynamic DNS configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
Returned verbatim, including plaintext x_password credential fields.
ddns_id: REQUIRED. Obtain it from |
| update_dynamic_dnsB | Update a Dynamic DNS configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
payload: DDNS configuration fields to update.
ddns_id: REQUIRED. Obtain it from |
| list_port_profilesB | List switch port profiles (speed, VLAN, PoE config) for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_port_profileB | Get a single switch port profile by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. profile_id: port profile ID. |
| update_port_profileA | Update a switch port profile by ID. WARNING -- SHARED PROFILE, WIDE BLAST RADIUS: this edits a shared Ethernet Port Profile (Classic REST /rest/portconf), NOT one switch or one port. A single write changes STP/PoE/storm-control/VLAN/etc. for EVERY port on EVERY switch that has this profile assigned. It is NOT a per-device or per-port writer and must never be presented or used as a per-port/per-device STP-priority or PoE-mode writer -- for that, no confirmed per-port config route exists via this API. Read the profile's assignments and confirm the intended blast radius before writing. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. profile_id: port profile ID. payload: fields to update (e.g. speed, native_networkconf_id, op_mode, poe_mode). Applies to every port using this profile, not a single port. |
| allow_network_on_port_profileA | Atomically allow (un-exclude) a VLAN network on a switch port profile. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
profile_id: REQUIRED. The port profile id; from This is the D12 auto-exclusion remediation: it fresh-reads the profile, removes
|
| exclude_network_on_port_profileA | Atomically exclude (untag) a VLAN network from a switch port profile. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID.
profile_id: REQUIRED. The port profile id; from Inverse of |
| list_routing_entriesB | List static routing table entries for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| list_wlan_configsA | List per-SSID WLAN configurations (security, band steering, rate limits) for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returned verbatim, including plaintext x_passphrase credential fields. |
| get_wlan_configA | Get a single WLAN (SSID) configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. wlan_id: WLAN config ID. Returned verbatim, including plaintext x_passphrase credential fields. |
| update_wlan_configC | Update a WLAN (SSID) configuration by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. wlan_id: WLAN config ID. payload: fields to update (e.g. x_passphrase, security, band, enabled). |
| list_wlan_groupsB | List WLAN groups for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_wlan_groupA | Get a single WLAN group by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. group_id: WLAN group ID. |
| get_channel_planA | Get RF channel assignments and DFS status for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| list_rogue_apsA | List neighboring APs detected by the site's radios. Returns ALL neighboring APs (most will have is_rogue=false and are benign neighbors). Only a small subset with is_rogue=true are confirmed rogue APs. Set rogue_only=true to filter to confirmed rogues only. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returns entries with BSSID, SSID, channel, signal strength, is_rogue flag, and detection time. |
| list_firewall_rulesA | List classic L3/L4 firewall rules for a site (distinct from Integration API policies). host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_firewall_ruleB | Get a single classic firewall rule by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. rule_id: firewall rule ID. |
| list_firewall_groupsB | List firewall groups (IP/port sets referenced by firewall rules) for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_firewall_groupA | Get a single firewall group by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. group_id: firewall group ID. |
| list_accountsA | List local RADIUS user accounts for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. Returned verbatim, including plaintext x_password credential fields. |
| get_accountA | Get a single RADIUS account by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. account_id: RADIUS account ID. Returned verbatim, including plaintext x_password credential fields. |
| list_hotspot_packagesA | List guest portal billing packages for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_hotspot_packageA | Get a single hotspot billing package by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. package_id: hotspot package ID. |
| list_scheduled_tasksA | List scheduled tasks (firmware upgrade schedules, speed tests) for a site. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. |
| get_scheduled_taskA | Get a single scheduled task by ID. host: console name, ID, or composite ID (MAC:numericId format). site: site name or ID. task_id: scheduled task ID. |
| list_dpi_categoriesA | List DPI (Deep Packet Inspection) app categories available for traffic rules. Categories include Social Media, Streaming Video, Gaming, etc. host: console name, ID, or composite ID (MAC:numericId format). site: ignored — DPI data is host-level, not site-scoped. By default every page is drained and the complete catalogue is returned as {data, totalCount}. Pass offset/limit to fetch a single page manually. A capped drain returns the categories gathered so far with incomplete=true rather than truncating silently. |
| list_dpi_applicationsA | List DPI applications available for traffic rules. Companion to list_dpi_categories; use application IDs in traffic rule configurations. host: console name, ID, or composite ID (MAC:numericId format). site: ignored — DPI data is host-level, not site-scoped. By default every page is drained and the complete catalogue is returned as {data, totalCount}. Pass offset/limit to fetch a single page manually. A capped drain returns the applications gathered so far with incomplete=true rather than truncating silently. |
| get_innerspace_summaryA | Inventory a console's InnerSpace floor-plan project without the full payload. Returns counts and structure: shape breakdown by type (wall / device / map / scale), per-floor plans with each plan's own scale, product and wall-material / attenuation-type dictionary sizes, and project metadata. Call this before get_innerspace_project when you only need to know what's present. Surfaces the multi-floor caveat: floors do not share a coordinate origin. host: console name, ID, or composite ID (MAC:numericId format). mode: '3D' (default; device shapes carry real metric mounting heights) or '2D'. |
| get_innerspace_projectA | Return the full InnerSpace floor-plan project geometry for a console. The complete (~66 KB) project document: shapes, plans, products, wall types, and attenuation-object types. Returned verbatim, including device meta.mac / meta.ip and floor-plan image/asset URLs. Prefer get_innerspace_summary first if you only need an inventory — this payload is large. host: console name, ID, or composite ID (MAC:numericId format). mode: '3D' (default; device shapes carry real metric mounting heights) or '2D' (device shapes flattened to z=0). 3D is the only mode with real heights. |
| list_innerspace_devicesA | List placed device shapes from a console's InnerSpace floor-plan. Each mounted device's placement: mount, productId, title, position, and rotation (pov = heading/yaw, base = mount tilt). Returned verbatim, including device meta.mac / meta.ip. Use mode='3D' (default) for real metric mounting heights; mode='2D' flattens positions to z=0. host: console name, ID, or composite ID (MAC:numericId format). mode: '3D' (default) or '2D'. |
| list_innerspace_floor_plansA | List a console's InnerSpace floor plans (documented Integration API). Each floor plan carries id, name, floor_number, image_url (an asset path — fetch with get_innerspace_asset), ppm (pixels per metre, the scale for interpreting coordinates/heights), width/height (image pixels), origin_x/origin_y, and site_id when filtered. Returned verbatim. host: console name, ID, or composite ID (MAC:numericId format). site_id: optional UniFi site filter — only floor plans whose product siteId matches. |
| list_innerspace_access_pointsA | List placed access points from a console's InnerSpace floor plans (Integration API). Each AP carries id, name, model (SKU), mac, serial, floor_plan_id, x/y (pixels on the floor-plan image), height (mounting height in metres), azimuth (antenna orientation, 0-360 degrees), mount, and status. Returned verbatim, including mac/serial. host: console name, ID, or composite ID (MAC:numericId format). site_id: optional UniFi site filter — only APs whose product siteId matches. |
| list_innerspace_switchesA | List placed switches from a console's InnerSpace floor plans (Integration API). Each switch carries id, name, model, type (switch), mac, serial, floor_plan_id, x/y (pixels on the floor-plan image), and status. Returned verbatim, including mac/serial. host: console name, ID, or composite ID (MAC:numericId format). site_id: optional UniFi site filter — only switches whose product siteId matches. |
| list_innerspace_inventoryA | List UNPLACED device inventory for a console's InnerSpace project (Integration API). Devices known to the project but not yet positioned on a floor plan. Each carries id, name, model, mac, and serial. Returned verbatim, including mac/serial. The response array key is 'devices'. host: console name, ID, or composite ID (MAC:numericId format). site_id: optional UniFi site filter — only inventory whose product siteId matches. |
| get_innerspace_assetA | Download a floor-plan asset (image) from a console's InnerSpace project. Fetches the binary asset from the documented …/integration/v1/assets/{planId}/ {filename} endpoint (a floor plan's image_url resolves here). Bytes are returned base64-encoded inline under image_base64 when at or below the 10 MiB inline cap; a larger asset returns metadata only (image_base64=null) plus a note and the connector path to fetch it out-of-band. content_type is the upstream media type (typically image/jpeg or image/png). host: console name, ID, or composite ID (MAC:numericId format). plan_id: the id in the {planId} segment of the floor plan's image_url -- i.e. the value between '/assets/' and the trailing '/{filename}'. This is the asset-group UUID and is NOT the floor plan's own 'id' field (they differ); passing the plan 'id' returns HTTP 404. Parse both plan_id and filename from image_url (from list_innerspace_floor_plans) rather than constructing them from the plan id. filename: the asset filename as published in the floor plan's image_url. |
| list_carrier_subscribersA | List Carrier / ISP Fabric subscribers visible to the authenticated ISP key. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only — the Carrier Fabric is not deployed here. Cursor-paginated by the API; every page is drained and the complete list is returned under subscribers. plan_id: optional service-plan UUID filter. suspended: optional boolean filter. sort: optional createdAt/-createdAt/name/-name/subscriberNumber/-subscriberNumber. key_label: optional configured API-key label to route on a specific key. |
| get_carrier_subscriberA | Get one Carrier / ISP Fabric subscriber by ID. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Returns the full Subscriber object verbatim under subscriber; an unknown id surfaces the upstream subscriber_not_found (404) verbatim. subscriber_id: the subscriber UUID from list_carrier_subscribers. key_label: optional configured API-key label to route on a specific key. |
| list_carrier_service_plansA | List the Carrier / ISP Fabric service plans for the authenticated organization. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Not query- paginated by the API; the full set is returned under service_plans. key_label: optional configured API-key label to route on a specific key. |
| get_carrier_service_planA | Get one Carrier / ISP Fabric service plan by ID. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. An unknown id surfaces the upstream service_plan_not_found (404) verbatim. plan_id: the service-plan UUID from list_carrier_service_plans. key_label: optional configured API-key label to route on a specific key. |
| create_carrier_subscriberA | Create a Carrier / ISP Fabric subscriber (POST /v1/carrier/subscribers). Guarded write. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only; a live create is impossible here. subscriber_number is required (1-32 chars). Optional name (<=128), email (<=255), notes (<=4096), service_address (<=1024), plan_id (UUID), metadata (object). Requires confirm=true and the UNIFI_ENABLE_CARRIER_FABRIC_WRITE gate. subscriber_number: unique subscriber number (1-32 characters). name/email/notes/service_address/plan_id/metadata: optional profile fields. confirm: must be true to apply the create. key_label: optional configured API-key label to route on a specific key. |
| update_carrier_subscriberA | Update a Carrier / ISP Fabric subscriber (PATCH .../subscribers/{id}). Guarded write. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Documented partial update: only the fields you pass are sent; omitted fields are left unchanged; pass at least one. subscriber_number is 1-32 chars when provided. Guarded: read-before, no-op when all provided fields already match, confirm=true, write kill-switch, read-after. NOTE: unlike the module function, omitting a field here (None) leaves it unchanged — MCP cannot express an explicit-null "clear" through this wrapper. subscriber_id: the subscriber UUID from list_carrier_subscribers. subscriber_number/name/email/notes/service_address/plan_id/metadata: optional new values. confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| attach_carrier_subscriber_hostA | Attach or re-link a subscriber's gateway host (PUT .../subscribers/{id}/host). Guarded. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. host_id must be a host in the same ISP organization. Guarded: read-before, no-op when already linked, confirm=true, write kill-switch, read-after (reports prev_host_id). subscriber_id: the subscriber UUID from list_carrier_subscribers. host_id: the gateway host id to link. confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| detach_carrier_subscriber_hostA | Detach a subscriber's gateway host (DELETE .../subscribers/{id}/host). Guarded write. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Guarded: read-before, no-op when no host is attached, confirm=true, write kill-switch, read-after (reports the just-detached prev_host_id). subscriber_id: the subscriber UUID from list_carrier_subscribers. confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| assign_carrier_subscriber_planA | Assign a service plan to a subscriber (PUT .../subscribers/{id}/plan). Guarded write. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. An archived or unknown plan is rejected upstream. Guarded: read-before, no-op when already on this plan, confirm=true, write kill-switch, read-after. subscriber_id: the subscriber UUID from list_carrier_subscribers. plan_id: the service-plan UUID to assign (from list_carrier_service_plans). confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| suspend_carrier_subscriberA | Suspend a subscriber's service (POST .../subscribers/{id}/suspend). Guarded write. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Guarded: read-before, no-op when already suspended, confirm=true, write kill-switch, read-after. An optional reason is recorded on the subscriber. subscriber_id: the subscriber UUID from list_carrier_subscribers. reason: optional free-text suspension reason. confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| resume_carrier_subscriberA | Resume a suspended subscriber's service (POST .../subscribers/{id}/resume). Guarded. Not testable against the maintainer's live hardware; hermetic/spec-conformance tested only. Guarded: read-before, no-op when not currently suspended, confirm=true, write kill-switch, read-after. subscriber_id: the subscriber UUID from list_carrier_subscribers. confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| fabric_connector_getA | Relay a GET through the official Fabric connector to a console's /proxy/. The escape hatch for a controller-supported route that has no typed tool yet. Always
available — GET needs no confirm. A 4xx/5xx is returned as host: console name or ID (resolved to the owning API key + host id via the Registry).
path: the relay-relative application path AFTER |
| fabric_connector_postA | Relay a POST (create/command) through the Fabric connector. MUTATION — GATED. Refused unless BOTH confirm=true AND the server's UNIFI_ENABLE_CONNECTOR_WRITE flag are
set (fail-closed; gating is checked before any network call). POST targets a collection
or command route (e.g. See fabric_connector_get for host/path/site/scope semantics. body: the JSON request body. Every attempt is written to the structured audit log (never the API key value). |
| fabric_connector_putA | Relay a PUT (full replace) through the Fabric connector. MUTATION — GATED. Refused unless BOTH confirm=true AND UNIFI_ENABLE_CONNECTOR_WRITE are set. PUT has a GET
twin at the same resource path, so the resource is read BEFORE and AFTER the write and
the result carries readBefore / readAfter / noOp (diff-based: a same-value write is
flagged noOp=true). Use this for reversible per-device config probes (e.g. Classic REST
See fabric_connector_get for host/path/site/scope semantics. body: the JSON request body. |
| fabric_connector_patchA | Relay a PATCH (partial update) through the Fabric connector. MUTATION — GATED. Refused unless BOTH confirm=true AND UNIFI_ENABLE_CONNECTOR_WRITE are set. PATCH has a
GET twin, so read-before/write/read-after with noOp detection applies (see
fabric_connector_put). The candidate legacy InnerSpace save route
( See fabric_connector_get for host/path/site/scope semantics. body: the JSON request body. |
| fabric_connector_deleteA | Relay a DELETE through the Fabric connector. MUTATION — GATED, IRREVERSIBLE. Refused unless BOTH confirm=true AND UNIFI_ENABLE_CONNECTOR_WRITE are set. DELETE has a GET twin, so the resource is read before and after; a successful delete makes the read-after return a 4xx, which the result records. There is no undo — confirm the exact resource path before enabling. See fabric_connector_get for host/path/site/scope semantics. body: optional JSON body. |
| list_mobility_workspacesA | List UniFi Mobility workspaces visible to the authenticated API key. A workspace is a mobility "cloud site" (workspace_id, workspace_name, is_owner, status). Returned verbatim. Not query-paginated by the API. Mobility identity is workspace-based and independent of the console host/site model. key_label: optional configured API-key label to route the request on a specific key (multi-key deployments). Omit to use the default key. |
| list_mobility_adminsA | List the admins of a Mobility workspace (mobility permissions only). Each admin carries name, email, status, is_owner and a permissions object exposing the umr (Mobile Routing) level (ALL/VIEW_ONLY/NONE); permissions is null for a pending invite. Returned verbatim. workspace_id: the workspace UUID from list_mobility_workspaces. key_label: optional configured API-key label to route on a specific key. |
| list_mobility_devicesA | List the UMR devices in a Mobility workspace. Each device is the lightweight summary (id, name, model, state, firmware_version, mac_address). Offset-paginated by the API (limit/offset, 200 max); every page is drained. workspace_id: the workspace UUID from list_mobility_workspaces. key_label: optional configured API-key label to route on a specific key. |
| get_mobility_deviceA | Get full detail for one UMR device in a Mobility workspace. Returns the complete DeviceDetail (WAN/cellular/WiFi/VPN/subscription/GPS, counts, and the summary fields) verbatim under device. workspace_id: the workspace UUID from list_mobility_workspaces. device_id: the device UUID from list_mobility_devices. key_label: optional configured API-key label to route on a specific key. |
| list_mobility_clientsA | List the clients associated with a UMR device. Each client carries mac, name, type (WIRED/WIRELESS), connection_status, ip_address, is_blocked and (wireless only) a wifi_experience score. Offset-paginated by the API (limit/offset, 200 max); every page is drained. workspace_id: the workspace UUID from list_mobility_workspaces. device_id: the device UUID from list_mobility_devices. key_label: optional configured API-key label to route on a specific key. |
| update_mobility_device_nameA | Rename a UMR device (guarded write). WARNING: mutates live device config. Sends the full documented body {"name": name} (1-32 chars). Read-before, no-op detection (returns status="no_op" when already named this), confirm=true guard (returns a current-vs-proposed preview otherwise), an environment kill-switch (UNIFI_ENABLE_MOBILITY_WRITE, gated OFF by default pending issue #186 semantics verification), and a read-after verification. workspace_id: the workspace UUID from list_mobility_workspaces. device_id: the device UUID from list_mobility_devices. name: the new device name (1-32 characters). confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| update_mobility_device_networkA | Update a UMR device's LAN / DHCP settings (guarded write). Mutates live config. DOCUMENTED partial update: only provided fields are applied (WAN/IPv6/ InternetSource are not configurable here). At least one field is required. WARNING: docs conflict on full-replacement vs partial-merge PUT semantics, so writes are gated OFF by default pending live verification (issue #186). dhcp_mode is 'dhcp' (enabled) or 'none' (disabled); IPs must be IPv4; dhcp_lease_time is seconds (0 = infinite). Read-before, no-op detection on the observable host_address, confirm=true guard, kill-switch, read-after. workspace_id: the workspace UUID from list_mobility_workspaces. device_id: the device UUID from list_mobility_devices. host_address: optional new LAN gateway IPv4. dhcp_mode: optional 'dhcp' or 'none'. dhcp_range_start: optional DHCP pool start IPv4. dhcp_range_stop: optional DHCP pool end IPv4. dhcp_lease_time: optional DHCP lease seconds (>=0; 0 = infinite). confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
| update_mobility_device_wirelessA | Update a UMR device's WiFi SSID + password (guarded write). Mutates live config. Both fields are required by the API (channel/TX power/security protocol are not configurable here). ssid is 1-32 chars; password is a WPA2-PSK secret of 8-63 chars. Read-before, confirm=true guard, kill-switch, read-after. There is no no-op short-circuit (the password is not observable, so an unchanged config cannot be proven). The supplied password is not echoed back in the result. workspace_id: the workspace UUID from list_mobility_workspaces. device_id: the device UUID from list_mobility_devices. ssid: the new WiFi SSID (1-32 characters). password: the new WPA2-PSK password (8-63 characters). confirm: must be true to apply the change. key_label: optional configured API-key label to route on a specific key. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/swkstudios/unifi-fabric-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server