Skip to main content
Glama
KallistoX

mcp-unifi-applications

UniFi MCP Server — Queryable API Documentation

CI PyPI Python Glama

A Model Context Protocol (MCP) server that makes the official UniFi API documentation queryable by AI agents — endpoint search, schema drill-down, and code examples in five languages, for Claude Desktop, Claude Code (VS Code / JetBrains), or any MCP-compatible client.

Covers every application Ubiquiti publishes API docs for: Network, Protect, Site Manager, InnerSpace, Mobility and Carrier Fabric.

It is read-only and credential-free: it serves documentation, it does not talk to your controller. Includes a Playwright-based scraper that turns the JS-rendered docs SPA into structured JSON, and a Python MCP server that serves it.

Example

"Without any context, just by using the unifi-applications MCP Server: can you tell me how to create a network with Go with the network API from UniFi, and what options do I have regarding the managed IPv4 DHCP gateway configuration?"

Claude works that out through the server, with none of the documentation in its context to begin with:

Call

What comes back

search_endpoints("create network")

POST /v1/sites/{siteId}/networks

get_endpoint("network/createnetwork")

the request body — management is a discriminated union

get_field_schema(…, "management[GATEWAY].ipv4Configuration.dhcpConfiguration")

only the DHCP subtree

get_example("network/createnetwork", "go")

a working request in Go

The third call is the one that earns the server its place. It returns this, and nothing else — not the 70 KB endpoint schema it is buried in:

# management[GATEWAY].ipv4Configuration.dhcpConfiguration (in requestBody)
- dhcpConfiguration: object (Gateway Managed IPv4 DHCP Configuration) — IPv4 DHCP
  configuration for this network. If omitted or null, DHCP is not working and hosts
  must get an address statically or from another server in this broadcast domain.
  - mode: string (required)
    [RELAY]:
      - dhcpServerIpAddresses: Array of string — DHCP Server IP addresses
    [SERVER]:
      - ipAddressRange: object
        - start: string (required)
        - stop: string (required)
      - leaseTimeSeconds: integer — The lease time in seconds for addresses in this range.
      - dnsServerIpAddressesOverride: Array of string — List of DNS servers assigned to
        client devices by the DHCP server. If none are specified, they will be selected
        automatically.
      - gatewayIpAddressOverride: string — Gateway IP address provided to DHCP clients.
      - domainName: string — Domain name that can be used to access network in the browser.
      - option43Value: string — Custom DHCP option (43) — the value MUST be the UniFi
        Network application's host IP address.
      - pxeConfiguration: object — Pre execution environment configuration for network boot
      … ntpServerIpAddresses, tftpServerAddress, timeOffsetSeconds, wpadUrl,
        winsServerIpAddresses, pingConflictDetectionEnabled

Both discriminator variants, every field typed and described. That is the answer to "what are my options" — and the model writes the Go from it without ever having seen the UniFi docs.

Related MCP server: UniFi Network MCP Server

Quick Start

1. Install

pip install mcp-unifi-applications

The scraped docs ship inside the package — there is nothing to scrape and no API key to configure. What you get:

Application

API version

Scraped

Pages

Network

v10.4.57

2026-09-10

82

Protect

v7.3.47

2026-09-10

81

Site Manager

v1.0.0

2026-09-10

12

InnerSpace

v1.3.23

2026-09-10

12

Mobility

v1.0.0

2026-09-10

9

Carrier Fabric

v1.0.0

2026-09-10

14

git clone https://github.com/KallistoX/mcp-unifi-applications.git
cd mcp-unifi-applications
python -m venv .venv
source .venv/bin/activate  # or: source .venv/bin/activate.fish
pip install .

2. Register with your client

Claude Code (VS Code / JetBrains) — add .mcp.json to your project root (Reload Window after):

{
  "mcpServers": {
    "unifi-docs": {
      "type": "stdio",
      "command": "mcp-unifi-applications"
    }
  }
}

Claude Desktop — add to ~/.config/Claude/claude_desktop_config.json (Linux) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "unifi-docs": {
      "command": "mcp-unifi-applications"
    }
  }
}

If the command is not on your client's PATH — Claude Desktop often does not inherit a shell PATH — give the absolute path instead, e.g. /path/to/.venv/bin/mcp-unifi-applications.

How this differs from other UniFi MCP servers

Most UniFi MCP servers are control planes: they authenticate against your controller and expose tools that read and change live state — devices, clients, firewall rules. This one is a knowledge plane. It never sees your network.

Control-plane servers

This server

Needs controller credentials

Yes

No

Touches live network state

Yes

No

Answers "what does this endpoint accept?"

Rarely

That is the whole job

Useful before you have hardware

No

Yes

They are complements, not competitors. Pair this one with a control-plane server when you are building against the UniFi API: this one tells the model what the API looks like, the other one calls it.

Why not just feed the model the OpenAPI spec?

Ubiquiti does publish one — developer.ui.com/<app>/v<version>/openapi.json. It is a good spec, and it is missing exactly the parts an agent needs most. For Network v10.4.57 (44 paths, 73 operations, 379 schemas):

  • 0 code examples. No x-codeSamples anywhere. This server carries ten per endpoint — curl, Go, Node.js, Python and Ansible, each in a local and a remote variant.

  • 0 response examples. This server ships the rendered response sample for every endpoint.

  • No guide pages. Filtering syntax, error handling, getting started — those live only in the rendered docs.

And a 409 KB spec does not fit usefully into a context window. get_field_schema returns one field subtree (management[GATEWAY].dhcpV4) instead of a 70 KB endpoint schema, so the model pulls in what it needs and nothing else.

Supported Applications

Application

URL

Local/Remote

Notes

Network

developer.ui.com/network

Both

Default app

Protect

developer.ui.com/protect

Both

Site Manager

developer.ui.com/site-manager

Remote only

No local/remote switch

InnerSpace

developer.ui.com/innerspace

Both

Early Access; version label reads v1.3.23 (EA)

Mobility

developer.ui.com/mobility

Remote only

Sidebar links out to mobility.ui.com

Carrier Fabric

developer.ui.com/carrier-fabric

Remote only

Subscriber API

All applications share the same docs SPA structure with version dropdowns, endpoint pages, and guide pages, so adding one is a single entry in the APPS object in scrape.mjs — the server discovers new app directories on its own.

Available Tools

Tool

Description

list_endpoints

List all API endpoints, optionally filtered by HTTP method or app

search_endpoints

Fuzzy search by name, path, method, or description (filterable by app)

get_endpoint

Full schema for an endpoint (summary or raw JSON)

get_endpoint_group

All CRUD operations for a resource (e.g. "networks")

get_example

Code examples in curl, Go, Node.js, Python, or Ansible (local/remote)

get_response_sample

Example JSON response for an endpoint

find_field

Search for a field name across all endpoint schemas

get_field_schema

Drill into a specific field's subtree (e.g. management[GATEWAY].dhcpV4)

get_guide

API guide pages (filtering syntax, error handling, getting started)

get_docs_info

Which docs are loaded: API version, scrape date, endpoint/guide counts per app

Tools that return multiple results accept an optional app parameter (network, protect, site-manager, innerspace, mobility, carrier-fabric) to filter by application.

Environment Variables

Variable

Default

Description

DOCS_DIR

the docs/ directory inside the installed package

Directory containing scraped JSON docs. Expects one subdirectory per application (network/, protect/, …). Set it to point at a checkout's freshly scraped output.

Re-scraping the docs

Only needed to pull a newer API version before the weekly workflow does, or to add an application.

# Build the scraper image
docker build -t unifi-scraper .

# Scrape Network API docs (default, latest version)
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs

# Scrape Protect API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app protect

# Scrape Site Manager API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app site-manager

# Scrape InnerSpace API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app innerspace

# Scrape Mobility or Carrier Fabric API docs
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app mobility
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app carrier-fabric

# Scrape a specific API version
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --app network --version v9.5.21

# List available API versions for an app
docker run --rm unifi-scraper node scrape.mjs --app protect --list-versions

# Scrape specific pages only
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs createnetwork filtering

# Force re-scrape (overwrite existing files)
docker run --rm -v "$(pwd)/src/mcp_unifi_applications/docs:/output" unifi-scraper node scrape.mjs --force

Scraper CLI

node scrape.mjs [options] [slug...]

Options:
  --app <name>      Application: network (default), protect, site-manager, innerspace, mobility, carrier-fabric.
  --version <ver>   API version to scrape (e.g. v10.1.84). Default: latest.
  --list-versions   Print available versions and exit.
  --force           Re-scrape even if output file exists.

Arguments:
  [slug...]         Scrape only these pages. Omit to scrape all pages.

The slug is the last path segment of the docs URL: https://developer.ui.com/network/v10.1.84/createnetwork -> createnetwork

Output is written to <output>/<app>/ — mount the package's docs directory (src/mcp_unifi_applications/docs/) so a scrape lands where the server reads it.

The full scan is resumable - already-scraped pages are skipped. Use --force to re-scrape.

Project Structure

mcp-unifi-applications/
├── scrape.mjs          # Playwright scraper (runs in Docker)
├── lib/
│   └── parse.mjs       # Scraper parsing logic, kept out of the browser so it is testable
├── Dockerfile          # Scraper container image
├── pyproject.toml      # Python project config
├── server.json         # MCP registry manifest
├── CHANGELOG.md        # Keep a Changelog
├── ROADMAP.md          # What is planned, what is not, and why
├── glama.json          # Glama maintainer declaration
├── src/
│   └── mcp_unifi_applications/
│       ├── server.py   # MCP server (Python, stdio transport)
│       └── docs/       # Scraped JSON, shipped with the package
│           ├── network/
│           ├── protect/
│           ├── site-manager/
│           ├── innerspace/
│           ├── mobility/
│           └── carrier-fabric/
├── scripts/
│   └── update_readme_versions.py   # Regenerates the README version table (run on main by CI)
└── tests/
    ├── test_mcp_server.py    # pytest
    └── scrape-parse.test.mjs # node --test

Output Format

What the scraper writes, and what the server reads.

Endpoint pages

{
  "h1": "Create Network",
  "method": "POST",
  "path": "/v1/sites/{siteId}/networks",
  "description": "Create a new network on a site.",
  "pathParameters": [ "...fields" ],
  "requestBody": [ "...fields" ],
  "responses": [{ "statuses": ["201"], "fields": [ "...fields" ] }],
  "examples": {
    "local": { "curl": "...", "go": "...", "nodejs": "...", "python": "...", "ansible": "..." },
    "remote": { "curl": "...", "go": "...", "nodejs": "...", "python": "...", "ansible": "..." }
  },
  "responseSample": "{ ... }",
  "sourceUrl": "https://developer.ui.com/network/v10.1.84/createnetwork"
}

Guide pages

{
  "h1": "Filtering",
  "type": "guide",
  "content": "Markdown content...",
  "sourceUrl": "https://developer.ui.com/network/v10.1.84/filtering"
}

Field objects (recursive)

{
  "name": "management",
  "required": true,
  "type": "string",
  "description": null,
  "discriminator": [
    { "value": "UNMANAGED", "selected": true, "schema": [ "...sibling fields" ] },
    { "value": "GATEWAY", "selected": false, "schema": [ "...sibling fields" ] }
  ],
  "children": [ "...child fields for object types" ]
}
  • discriminator.schema contains sibling fields visible when that option is active (not the discriminator field itself)

  • Nesting is recursive - discriminators within variants are fully expanded

  • children captures statically expanded object fields

Disclaimer

This project is not affiliated with, endorsed by, or sponsored by Ubiquiti Inc. The API documentation content scraped and served by this tool is the property of Ubiquiti Inc. and is sourced from their public developer portal. "UniFi" is a trademark of Ubiquiti Inc.

License

MIT

Available Tools

10 tools
find_fieldFind FieldA
Read-onlyIdempotent

Locate a field by name across every endpoint, including inside discriminator variants.

Returns one line per occurrence: endpoint slug, dotted path, and which schema section it sits in (request body, parameters, or response). Common names appear hundreds of times; the reply is capped at 50 and states the true total and how many endpoints are involved, so a short list is never mistaken for a complete one. Paths from here can be passed straight to get_field_schema. A name that matches nothing returns close alternatives.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoOptional — limit search to a specific endpoint.
field_nameYesThe field name to search for (case-insensitive).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description layers substantial behavior on top: the 50-line cap with true total and endpoint count, the close-alternatives fallback, the response format, and case-insensitivity. This is exactly the contextual value annotations cannot provide.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, and every subsequent sentence earns its place (format, cap, successor tool, fallback). Slightly long but information-dense with no filler.

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

Completeness5/5

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

For a search tool with an output schema, the description covers everything an agent needs: result format, line-by-line fields, pagination/truncation honesty, endpoint-count reporting, and downstream integration. Nothing actionable is missing.

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

Parameters3/5

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

Schema coverage is 100% — both parameters are documented, including case-insensitivity on field_name. The description adds the common-names-capped behavior but otherwise relies on the schema, which is the appropriate division of labor at the baseline.

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

Purpose5/5

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

States a specific verb ('locate') and resource ('field by name across every endpoint'), and adds the discriminator-variant nuance that shows real scope understanding. This cleanly separates it from siblings like list_endpoints and get_field_schema.

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

Usage Guidelines4/5

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

Explicitly names how output feeds into get_field_schema ('Paths from here can be passed straight to'), connecting this tool to its successor. It does not enumerate when-not-to-use cases, but the purpose and output semantics make the use case unambiguous.

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

get_docs_infoGet Docs InfoA
Read-onlyIdempotent

Report what documentation this server is serving.

Returns one line per application: API version, when it was scraped, and how many endpoints and guides it holds. Worth checking before trusting an answer about a recent API change — the documentation is a point-in-time copy, not a live view.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint all true, indicating a safe, read-only operation. The description adds valuable context that the documentation is a point-in-time copy, not live, which is critical for an agent to avoid relying on stale info. This goes beyond the annotations and is a key behavioral insight. The description is consistent with annotations, so no contradiction.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the straight purpose, then adds the crucial caveat about the documentation being a point-in-time copy. Every sentence adds value with no fluff. The structure is ideal: clear statement first, followed by actionable context.

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

Completeness5/5

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

The description is complete for this zero-parameter tool. It explains what the tool returns (one line per application with API version, scrape time, endpoint/guide counts) and provides a clear use case (checking before trusting answers about recent changes). Given the simplicity and output schema present, nothing is missing for an agent to correctly invoke this tool.

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

Parameters4/5

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

The tool has zero parameters, making parameter semantics a non-issue. With no parameters to document, the baseline is 4, indicating that the description does not need to compensate for missing parameter info. The description is sufficient for an agent to call the tool without any inputs.

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

Purpose4/5

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

The description clearly states the tool reports what documentation the server is serving crumb, and specifies the content: API version, scrape time, and counts of endpoints and guides. It is distinct from siblings because it provides an overview of the documentation set, whereas siblings like get_endpoint or get_guide focus on specific items. However, it could be slightly more explicit that it summarizes the whole documentation corpus vs. individual items.

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

Usage Guidelines4/5

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

The description advises checking this tool before trusting answers about recent API changes, making the usage context clear. It does not explicitly mention when not to use it or name alternatives, but the implicit guidance is strong enough for an agent to decide when this overview is appropriate. It lacks explicit exclusion criteria but is still effective.

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

get_endpointGet EndpointA
Read-onlyIdempotent

Get everything documented about one endpoint: method, path, description, path and query parameters, request body and response fields.

Returns readable text: a nested field list with types, required markers and descriptions, discriminator variants in brackets and enum values inline, folded at three levels deep. Large endpoints run to tens of thousands of characters — when you already know which field you need, get_field_schema returns that subtree alone. An unknown slug returns close matches rather than an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesEndpoint identifier, app-qualified ('network/createnetwork') or bare ('createnetwork') when only one application has it. Use search_endpoints or list_endpoints to find one.
summaryNoTrue (default) returns the folded text above. False returns the raw scraped JSON — complete and unfolded to every depth, several times larger, and only worth it when the folding hides something you need.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as read-only and idempotent, and the description adds substantial behavioral context: it returns readable folded text, folds at three levels deep, may be tens of thousands of characters, and returns close matches for unknown slugs. This goes well beyond the annotation signal and prepares the agent for output size and error behavior.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then covers output format, size, the alternative tool, and error behavior in a compact, well-organized set of sentences. Every sentence earns its place and no information is repeated or wasted.

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

Completeness5/5

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

Given that an output schema is present, return-field documentation is not the description's job. It covers tool scope, output format, scale warning, a recommended sibling for narrower use, and unknown-slug behavior, making it complete for an agent to select and invoke the tool confidently.

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

Parameters4/5

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

The input schema already provides full, detailed descriptions for both parameters, so the baseline is a 3. The description adds extra behavioral nuance by mentioning the large-output problem and the get_field_schema fallback, and by explaining that unknown slugs still produce useful matches. It does not deeply re-document the parameters, but what it adds is meaningful.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Get everything documented about one endpoint' and enumerates exactly what is included (method, path, parameters, request body, response fields). It also implicitly distinguishes itself from siblings by pointing to get_field_schema for narrower field-level queries, so an agent can tell which tool fits.

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

Usage Guidelines5/5

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

The description explicitly says to use get_field_schema when you already know the specific field, giving a concrete when-to-use alternative. It also warns that large endpoints produce very large output, and explains that an unknown slug returns close matches rather than an error, which helps an agent anticipate and handle edge cases.

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

get_endpoint_groupGet Endpoint GroupA
Read-onlyIdempotent

See every operation on one resource at once, grouped by API path.

Returns each matching resource path with its endpoints beneath it — method, slug, title and a one-line description — so the available verbs on a resource are visible together rather than found one at a time. Matching is a substring of the path, so 'networks' also finds nested paths, and one query can span applications.

ParametersJSON Schema
NameRequiredDescriptionDefault
resourceYesResource name or path fragment (e.g. 'networks', 'acl-rules', 'wifi/broadcasts').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description aligns with them. It adds genuinely useful behavioral detail beyond those annotations: substring matching, grouping by path, nested paths, and the ability to span applications.

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

Conciseness5/5

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

The description is compact and front-loaded: the purpose is stated first, then return shape, then matching behavior. Every sentence adds value without repetition or filler.

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

Completeness5/5

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

For a tool with one parameter, clear annotations, and an output schema, the description is complete from an agent's perspective. It explains what will be returned, how matching works, and what the grouping will look like, without needing to restate schema details.

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

Parameters4/5

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

Schema coverage is 100% and the resource parameter is already described with examples. The description adds important semantic detail beyond the schema: matching is a substring, nested paths are included, and one query can span applications, clarifying scope significantly.

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

Purpose5/5

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

The description opens with a specific verb and object: 'See every operation on one resource at once, grouped by API path.' It immediately distinguishes itself from tools like get_endpoint by emphasizing that all verbs on a resource are returned together rather than one at a time.

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

Usage Guidelines4/5

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

The description clearly communicates the intended use case: when you want all operations on a resource visible together, or when matching a path substring to find nested paths across applications. It does not explicitly name sibling alternatives or provide exclusions, but the context is strong enough for an agent to select it appropriately.

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

get_exampleGet ExampleA
Read-onlyIdempotent

Get a runnable request for one endpoint, in one language, as published by Ubiquiti.

Returns a heading naming the endpoint, language and mode, followed by a single code block. The request shape is authoritative; host addresses, site ids and API keys are placeholders to fill in. Bodies show the schema's default values, not a worked example — combine with get_endpoint or get_field_schema when the payload matters. If the requested language and mode pair does not exist, the reply lists the pairs that do instead of failing.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo'local' addresses the console directly (https://<console-ip>/proxy/…); 'remote' goes through the UniFi cloud API (api.ui.com). Defaults to 'local', except for the cloud-only applications — site-manager, mobility and carrier-fabric — which have no local form and default to 'remote'.
slugYesEndpoint identifier, app-qualified or bare when unambiguous.
languageNoOne of curl, go, nodejs, python, ansible.curl

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, and non-destructive hints. The description adds valuable behavioral context: it describes the return format (heading + single code block), clarifies that placeholders (host addresses, site ids, API keys) are to be filled in, and notes that bodies use schema default values. This goes beyond annotations and gives the agent a clear picture of what to expect.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the core purpose, then adding necessary context and usage guidance. There is no fluff or repetition. Every sentence earns its place: the first states the function, the second describes the response format and placeholders, the third covers usage and error handling.

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

Completeness5/5

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

Given that an output schema exists (per context signal), the description need not detail the full response structure. It covers the essential aspects: what the tool returns, how placeholders work, how to handle the payload case, and what happens on invalid pairs. It also names alternative tools for when this one is insufficient. The tool is simple and the description is complete for an agent to call it correctly.

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

Parameters3/5

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

The input schema has 100% coverage with clear descriptions for all three parameters (slug, language, mode), so the baseline is 3. The description mentions language and mode indirectly (e.g., 'in one language' and the error condition on language/mode pairs) but does not add significant new meaning about parameter syntax or valid values beyond what the schema already provides. It adds context about how parameters affect the output but not enough to justify a higher score.

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

Purpose5/5

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

The description opens with a precise statement: 'Get a runnable request for one endpoint, in one language, as published by Ubiquiti.' This identifies the exact verb, resource, and scoping (one endpoint, one language). It clearly differentiates from siblings like get_response_sample (which likely returns a sample response) and get_endpoint (which likely returns the endpoint definition) by focusing on the runnable request.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: 'Bodies show the schema's default values, not a worked example — combine with get_endpoint or get_field_schema when the payload matters.' This tells the agent to use alternative tools when the payload is important. It also explains the error behavior: 'If the requested language and mode pair does not exist, the reply lists the pairs that do instead of failing,' which clarifies what happens on invalid input.

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

get_field_schemaGet Field SchemaA
Read-onlyIdempotent

Drill into a specific field's schema within an endpoint.

Instead of fetching the full 70KB endpoint schema, use this to get just the subtree you need. Paths from find_field output work directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesEndpoint identifier (e.g. 'network/createnetwork').
field_pathYesDotted path to the field, with discriminator variants in brackets. Examples: 'dhcpV4', 'management[GATEWAY].dhcpV4', 'management[GATEWAY].dhcpV4.gateway'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context: it's a lightweight subtree fetch versus a large schema, and it accepts find_field output paths directly. This is meaningful but not rich — no mention of failure modes, pagination, or edge cases, which the annotations don't require given the read-only nature.

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

Conciseness5/5

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

Three sentences, each earning its place: core purpose, usage guidance with sibling differentiation, and input-compatibility note. Front-loaded with the primary function and zero filler.

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

Completeness5/5

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

Complete for a read-only tool with a defined output schema (so return values need no explanation), 100% parameter coverage, and annotations that establish the behavioral profile. Purpose, when-to-use, and input compatibility are all addressed — nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both slug and field_path are fully documented with examples in the schema. The description adds one genuinely useful note — 'Paths from find_field output work directly' — which clarifies the expected format of field_path beyond the schema. This is a real but marginal addition over the schema's baseline.

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

Purpose5/5

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

States a specific verb (drill into/get) and resource (a field's schema within an endpoint), and the second sentence explicitly contrasts it with fetching the full 70KB endpoint schema — which differentiates it from the sibling get_endpoint. An agent can tell it apart from its siblings without opening schemas.

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

Usage Guidelines4/5

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

The 'Instead of fetching the full 70KB endpoint schema, use this to get just the subtree you need' line gives clear context for when to choose this tool over a full-schema fetch. It also notes compatibility with find_field output. However, it doesn't name alternatives explicitly (e.g., get_endpoint) or state when not to use it beyond the size heuristic.

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

get_guideGet GuideA
Read-onlyIdempotent

Read a prose guide page: filtering syntax, error handling, getting started, response formats.

Returns the page as markdown with its title and source URL. Omit the topic to list what is available. Topics resolve by slug first, then by title; when the same slug exists in several applications the reply lists them and asks for an app rather than picking one. These pages carry the conventions that endpoint schemas assume but do not repeat.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoOptional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to search all.
topicNoGuide slug or search term. Omit to list all available guides.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations, disclosing output shape (markdown with title and source URL), resolution order (slug first, then title), and ambiguity handling (lists matches and asks rather than guessing). These are non-obvious behaviors an agent needs to invoke the tool correctly.

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

Conciseness5/5

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

The description front-loads the core purpose in the first sentence, then packs behavior, return value, and usage conditions into two compact sentences with no repeated information or filler.

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

Completeness5/5

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

The description covers what the tool returns, how topics are resolved, what happens in ambiguous cases, how to list available content, and why this tool matters relative to schema-based siblings. Combined with the annotations and schema, nothing essential is missing for correct invocation.

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

Parameters4/5

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

The schema already documents both parameters at 100% coveragecars, but the description adds meaningful semantics beyond the schema: the topic resolution order, the ambiguity behavior, and the fact that omitting the topic produces a list of all guides. This is valuable, hence above baseline, though not extensive.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Read a prose guide page,' and enumerates the contents (filtering syntax, error handling, response formats). It implicitly distinguishes itself from schema-focused sibling tools like get_endpoint and find_field by positioning this as the prose/conventions companion to those structured references.

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

Usage Guidelines4/5

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

It gives clear operational guidance: omit the topic to list available guides, use the app filter when needed, and expect slug-first resolution. It explains when these pages matter ('carry conventions that endpoint schemas assume') but does not explicitly name an alternative tool or state when not to use it, so it falls just short of a 5.

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

get_response_sampleGet Response SampleA
Read-onlyIdempotent

Get the sample response body published for one endpoint.

Returns raw JSON exactly as the documentation shows it, with placeholder values. About two thirds of endpoints have one; the rest say so plainly. This is the shape of a successful reply — for the field-by-field schema including types and which fields are optional, use get_endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesEndpoint identifier (e.g. 'network/getnetworksoverviewpage').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive behavior, and the description adds value by disclosing placeholder values, exact matching to documentation, and that missing samples are communicated plainly. It does not mention auth or rate limits, but these are not strongly demanded given the safe read-only profile.

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

Conciseness5/5

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

The description is compact and front-loaded with the clear purpose, followed immediately by return behavior and a routing note. Every sentence contributes either scope, capability, expectation-setting, or a pointer to the alternative tool.

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

Completeness5/5

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

There is an output schema, one required parameter documented fully, and complete annotations covering safety and idempotence. The description adds availability expectations and points to get_endpoint for schema details, which leaves an agent with enough to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100% and includes a concrete slug example, so the parameter meaning is already fully established. The description adds only broad context that the tool targets 'one endpoint', which does not go beyond the schema.

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

Purpose5/5

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

Description states a specific verb and resource: 'Get the sample response body published for one endpoint' and clarifies that it returns raw JSON as shown in documentation. It also differentiates itself by directing field-by-field schema needs to get_endpoint, so an agent can pick the right tool.

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

Usage Guidelines5/5

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

The description explicitly gives context for expected behavior: about two-thirds of endpoints have a sample and the rest say so plainly. It also names the alternative, get_endpoint, for schema/type/optional-field detail, making the choice between sibling tools clear.

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

list_endpointsList EndpointsA
Read-onlyIdempotent

Browse the endpoint catalogue: one line per endpoint with method, path, slug and title.

Returns at most 200 lines; beyond that the reply says how many were withheld and which filters would narrow it. For finding a specific endpoint, search_endpoints ranks by relevance instead. Unknown filter values are rejected by name rather than returned as an empty result.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoOptional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to list all.
methodNoOptional HTTP method filter (GET, POST, PUT, DELETE, PATCH).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the 200-line cap, the withholding message, and the rejection of unknown filter values. It doesn't describe pagination or the exact output schema, but the output schema exists and the description covers the key non-obvious behaviors.

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

Conciseness5/5

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

The description is compact and front-loaded: it opens with the core purpose and output format, then covers limits, alternatives, and error behavior in three sentences. Every sentence earns its place with no redundancy.

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

Completeness4/5

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

For a read-only list tool with an output schema and full parameter documentation, the description is nearly complete. It covers the cap, the alternative tool, and error behavior. The only minor gap is that it doesn't explicitly describe pagination or how to request more than 200 lines, but the description says the reply says how many were withheld and which filters would narrow it, which is sufficient guidance.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters (app and method) with their allowed values. The description adds the behavior of unknown filter values being rejected by name, which is useful, but it doesn't add much beyond the schema's parameter documentation. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Browse') and resource ('endpoint catalogue'), and specifies the output format (one line per endpoint with method, path, slug, title). It also distinguishes itself from search_endpoints by noting that search ranks by relevance, so an agent can clearly tell this is the list-all/browse tool.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool vs alternatives: 'For finding a specific endpoint, search_endpoints ranks by relevance instead.' It also explains the 200-line cap and that unknown filter values are rejected by name, giving clear behavioral context for when to use it.

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

search_endpointsSearch EndpointsA
Read-onlyIdempotent

Find endpoints by name, path fragment, method or description.

Returns up to ten matches ranked by relevance, each as a slug, method, path, title and a one-line description. Matching is fuzzy but floored: a query that resembles nothing returns no matches rather than the least-bad guess. Pass a result's slug to get_endpoint for the full schema. Unknown filter values are rejected by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
appNoOptional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to search all.
queryYesSearch term (endpoint name, path fragment, or keyword).
methodNoOptional HTTP method filter (GET, POST, PUT, DELETE, PATCH).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

The description discloses several non-obvious behaviors beyond the annotations: it returns at most ten matches, ranking by relevance, uses fuzzy matching with a floor (no results if nothing resembles the query), and rejects unknown filter values. Annotations already declare readOnlyHint and idempotentHint, so the description adds useful operational context without contradicting them.

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

Conciseness5/5

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

The description is tight and well-organized: purpose statement, output format, matching behavior, routing to get_endpoint, and filter error handling. Each sentence earns its place, and key info is front-loaded. No redundant or vague phrasing.

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

Completeness4/5

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

For a search tool with an output schema, the description covers the result shape, relevance cap, fuzzy matching floor, and the path to get_endpoint. It does not explicitly differentiate from list_endpoints or explain error scenarios beyond unknown filters, but given the output schema and annotations, it is sufficiently complete for an agent to call correctly.

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

Parameters3/5

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

Schema coverage is 100%, with each parameter (query, app, method) having its own description. The tool description adds minimal extra semantics beyond the schema—mostly restating that app and method act as filters. It does add the note that unknown filter values are rejected, but this is behavioral rather than parameter-specific. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Find endpoints by name, path fragment, method or description.' It clearly distinguishes the tool from siblings like list_endpoints by focusing on search and relevance ranking, and it explicitly routes to get_endpoint for full schema details.

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

Usage Guidelines3/5

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

The description implicitly guides usage by saying 'Pass a result's slug to get_endpoint for the full schema,' indicating when to use get_endpoint. However, it does not explicitly state when to prefer search_endpoints over list_endpoints or other siblings, leaving the selection partially to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.3.1
    • Changedget_endpoint2 fields changed
      • changedInput schema / properties / slug / description
        Previous value: -"Endpoint identifier, app-qualified ('network/createnetwork') or bare\n  ('createnetwork') when only one app has it. Use list_endpoints or\n  search_endpoints to find slugs."New value: +"Endpoint identifier, app-qualified ('network/createnetwork') or bare\n  ('createnetwork') when only one application has it. Use\n  search_endpoints or list_endpoints to find one."
      • changedInput schema / properties / summary / description
        Previous value: -"If True, return a compact field summary. If False, return raw JSON."New value: +"True (default) returns the folded text above. False returns the raw\n     scraped JSON — complete and unfolded to every depth, several times\n     larger, and only worth it when the folding hides something you need."
    • Changedget_example3 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Programming language — one of: curl, go, nodejs, python, ansible."New value: +"One of curl, go, nodejs, python, ansible."
      • changedInput schema / properties / mode / description
        Previous value: -"'local' (direct console access) or 'remote' (via cloud API).\n  Defaults to 'local'; remote-only apps (site-manager, mobility,\n  carrier-fabric) default to 'remote'."New value: +"'local' addresses the console directly (https://<console-ip>/proxy/…);\n  'remote' goes through the UniFi cloud API (api.ui.com). Defaults to\n  'local', except for the cloud-only applications — site-manager,\n  mobility and carrier-fabric — which have no local form and default to\n  'remote'."
      • changedInput schema / properties / slug / description
        Previous value: -"Endpoint identifier (e.g. 'network/createnetwork')."New value: +"Endpoint identifier, app-qualified or bare when unambiguous."
  2. 2 tool updatesv0.3.0
    • Changedget_endpoint1 field changed
      • changedInput schema / properties / slug / description
        Previous value: -"Endpoint identifier (e.g. 'createnetwork', 'listnetworks').\n  Use list_endpoints or search_endpoints to find slugs."New value: +"Endpoint identifier, app-qualified ('network/createnetwork') or bare\n  ('createnetwork') when only one app has it. Use list_endpoints or\n  search_endpoints to find slugs."
    • Changedget_response_sample1 field changed
      • changedInput schema / properties / slug / description
        Previous value: -"Endpoint identifier (e.g. 'listnetworks')."New value: +"Endpoint identifier (e.g. 'network/getnetworksoverviewpage')."
  3. 10 tool updates
    • First observedfind_field
    • First observedget_docs_info
    • First observedget_endpoint
    • First observedget_endpoint_group
    • First observedget_example
    • First observedget_field_schema
    • First observedget_guide
    • First observedget_response_sample
    • First observedlist_endpoints
    • First observedsearch_endpoints

TDQS

A4.4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct documentation operation: finding fields, listing endpoints, searching, fetching full endpoint details, examples, response samples, field schemas, endpoint groups, guides, and doc metadata. There is no meaningful overlap even between search_endpoints and list_endpoints, as one ranks by relevance and the other is a catalogue browser.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: find_field, list_endpoints, search_endpoints, get_endpoint, get_example, get_response_sample, get_field_schema, get_endpoint_group, get_guide, get_docs_info. Verbs are uniform and nouns correspond directly to the returned artifacts.

Tool Count5/5

Ten tools is well within the ideal range and each one covers a distinct documentation interaction mode. The count feels proportional to the server's purpose of serving a large API documentation corpus without being bloated.

Completeness5/5

The surface covers browsing, searching, retrieving endpoints, drilling into field schemas, obtaining examples and response samples, grouping by resource path, reading guides, and checking documentation freshness. No obvious gap remains for a documentation-exploration server.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables comprehensive management of UniFi Network infrastructure through 24 tools for monitoring and controlling devices, clients, wireless networks, security, and guest access. Supports network administration tasks like device restarts, client blocking, WLAN configuration, and backup creation.
    9 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Exposes the UniFi Network Integration API as tools for managing sites, devices, clients, networks, WiFi, firewalls, ACLs, switching, DNS policies, hotspot vouchers, VPNs, and more.
    43
    72 npm
    1
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    Enables AI agents to manage UniFi network infrastructure via the Model Context Protocol, supporting device management, network configuration, security, and QoS through local or cloud APIs.
    43
    27 npm
    165 PyPI
    267
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    A safety-first MCP server for managing UniFi networks, exposing 17 tools for telemetry, diagnostics, and guarded mutations with dry-run previews and confirm requirements.
    14
    MIT