mcp-unifi-applications
Provides queryable access to Ubiquiti's UniFi API documentation for Network, Protect, Site Manager, InnerSpace, Mobility, and Carrier Fabric, enabling endpoint search, schema drill-down, field lookup, guides, and code examples.
UniFi MCP Server — Queryable API Documentation
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 |
|
|
| the request body — |
| only the DHCP subtree |
| 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, pingConflictDetectionEnabledBoth 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-applicationsThe 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-07-27 | 82 |
Protect | v7.3.47 | 2026-09-09 | 81 |
Site Manager | v1.0.0 | 2026-07-17 | 12 |
InnerSpace | v1.3.23 | 2026-09-09 | 12 |
Mobility | v1.0.0 | 2026-09-09 | 9 |
Carrier Fabric | v1.0.0 | 2026-09-09 | 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-codeSamplesanywhere. 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 |
| Both | Default app |
Protect |
| Both | |
Site Manager |
| Remote only | No local/remote switch |
InnerSpace |
| Both | Early Access; version label reads |
Mobility |
| Remote only | Sidebar links out to |
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 all API endpoints, optionally filtered by HTTP method or app |
| Fuzzy search by name, path, method, or description (filterable by app) |
| Full schema for an endpoint (summary or raw JSON) |
| All CRUD operations for a resource (e.g. "networks") |
| Code examples in curl, Go, Node.js, Python, or Ansible (local/remote) |
| Example JSON response for an endpoint |
| Search for a field name across all endpoint schemas |
| Drill into a specific field's subtree (e.g. |
| API guide pages (filtering syntax, error handling, getting started) |
| 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 |
| the | Directory containing scraped JSON docs. Expects one subdirectory per application ( |
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 --forceScraper 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
├── 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 --testOutput 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.schemacontains sibling fields visible when that option is active (not the discriminator field itself)Nesting is recursive - discriminators within variants are fully expanded
childrencaptures 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 toolsfind_fieldFind FieldA
Find where a field appears across endpoint schemas.
Searches through request bodies, path parameters, and responses including inside discriminator variants. Uses a pre-built index for speed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Optional — limit search to a specific endpoint. | |
| field_name | Yes | The field name to search for (case-insensitive). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the search covers request bodies, path parameters, and responses, including discriminator variants, and mentions it uses a pre-built index for speed. With no annotations provided, the description carries the burden, and it does add useful behavioral context, though it doesn't mention case-insensitivity (which is in the schema) or any limitations of the pre-built index.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: the first sentence states the core purpose, and the second adds scope and performance context. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are already documented. The description covers the search scope and performance characteristics. It could mention what the output looks like or how to interpret results, but the output schema likely covers that. Overall, it's complete enough 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds context about what the search covers (request bodies, path parameters, responses, discriminator variants) but doesn't add meaning beyond the schema for the parameters themselves. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: finding where a field appears across endpoint schemas. It specifies the resource (endpoint schemas) and the action (search), and distinguishes it from sibling tools like get_field_schema by focusing on cross-schema search rather than retrieving a single field's schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need to locate a field across request bodies, path parameters, and responses, including discriminator variants. It doesn't explicitly name alternatives or exclusions, but the scope is clear enough for an agent to select it over siblings like get_field_schema or search_endpoints.
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
Show which UniFi API docs are loaded: API version, scrape date, endpoint and guide counts per app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. 'Show' communicates a read-only, non-mutating operation, and listing what information is returned gives the agent a good sense of expected behavior. However, it does not explicitly state that it performs no side effects, requires no authentication, or has no significant cost; for such a simple metadata tool this is a minor gap rather than a serious one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the tool's purpose and then lists the specific data elements. Every word adds value, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only metadata tool with an output schema available, the description is complete. It tells the agent what the tool reports, and the presence of an output schema covers return-value details. No missing information would prevent correct invocation or interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description correctly adds no parameter details because none exist, and the input schema confirms an empty object. Nothing more is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') and a clear resource ('which UniFi API docs are loaded'), then enumerates the exact content: API version, scrape date, endpoint and guide counts per app. This clearly differentiates it from sibling tools like list_endpoints or get_guide, which operate on individual docs rather than reporting loaded-doc metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the use case: when an agent needs an overview of which documentation is loaded and its versioning/coverage stats, rather than querying individual endpoints or guides. It does not explicitly name alternatives or exclusions, but the zero-parameter metadata nature of the tool makes the appropriate context sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_endpointGet EndpointB
Get the full schema for a UniFi API endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Endpoint identifier (e.g. 'createnetwork', 'listnetworks'). Use list_endpoints or search_endpoints to find slugs. | |
| summary | No | If True, return a compact field summary. If False, return raw JSON. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are completely absent, so the description carries the full burden. The description only says 'Get the full schema,' which is minimal. It does not disclose any behavioral traits such as output format nuances, potential error conditions, rate limiting, or what 'full schema' means. The schema exists but the description adds no behavioral context beyond the tool's basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded with the action. No extra fluff. However, given the tool's complexity and absent annotations, a bit more behavioral context could be added without much bloat, so it's not a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, which likely conveys the return structure, so that part is covered. The parameters are well-documented in the schema. However, with no annotations and a minimal description, the agent lacks information on when to use this tool vs othersabbildung, the exact nature of the schema returned, and potential edge cases. For a tool that retrieves schemas, it is minimally adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides detailed descriptions for both parameters: 'slug' explains format and how to find it, 'summary' explains true/false behavior. Since schema coverage is 100%, the description adds little extra. The description itself mentions no parameter details, so it does not compensate beyond the schema, which is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Get the full schema for a UniFi API endpoint.' It distinguishes the tool from siblings by focusing on schema retrieval, though it doesn't explicitly name which sibling to use instead. The purpose is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: to get schemas for endpoints. It doesn't explicitly state when to use alternatives like list_endpoints or search_endpoints, but the parameter descriptions for 'slug' mention using those to find slugs, which gives some guidance. However, no explicit exclusions or alternative selection criteria beyond that.
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
Get all CRUD operations for a resource (e.g. 'networks', 'firewall', 'wifi').
Returns a summary of every endpoint that operates on the same resource path, so you can see all available operations at once.
| Name | Required | Description | Default |
|---|---|---|---|
| resource | Yes | Resource name or path fragment (e.g. 'networks', 'acl-rules', 'wifi/broadcasts'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral aspects. It states that it returns a 'summary of every endpoint' and the purpose is to see all operations, which is a read operation. However, it does not mention any potential side effects or prerequisites (e.g., authentication) or limitations (e.g., pagination). There is no contradiction, but the description could add more behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a brief two-sentence paragraph that front-loads the primary purpose in the first sentence and provides a clear explanation of the output in the second. It is concise with no unnecessary filler, earning a high score for efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter well-documented, an output schema present, and no nested objects. The description sufficiently explains the tool's purpose and output. However, it does not mention any limitations like pagination or rate limits, which could be relevant for a tool that returns a summary of many endpoints. This is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is well-documented in the schema with examples. The description adds examples of resource names ('networks', 'firewall', 'wifi') and clarifies that it is a 'path fragment', which is slightly more than the schema. However, the added value is minimal given the schema already provides examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get all CRUD operations for a resource' with specific verb 'Get' and resource examples. It differentiates from siblings by focusing on grouping operations by resource path, while siblings like 'get_endpoint' retrieve individual endpoints. However, it could be more explicit about the distinction from 'list_endpoints'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when you need all operations for a specific resource. It gives examples of resource names and explains the benefit of seeing all available operations at once. It does not explicitly state when NOT to use it or mention alternatives, but the sibling names and purpose are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exampleGet ExampleB
Get a code example for a specific UniFi API endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'local' (direct console access) or 'remote' (via cloud API). Defaults to 'local'; remote-only apps (site-manager, mobility, carrier-fabric) default to 'remote'. | |
| slug | Yes | Endpoint identifier (e.g. 'network/createnetwork'). | |
| language | No | Programming language — one of: curl, go, nodejs, python, ansible. | curl |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Get' strongly implies a safe, read-only operation, and the output schema documents the return shape, so behavior is not opaque. However, the description does not explicitly confirm side-effect-free behavior or any other runtime characteristics in the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no filler, front-loaded with the action and resource. Every token in the available description is meaningful. There is no unnecessary framing or repeated information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only example lookup with a fully documented input schema and an output schema present, the description plus structured fields give an agent enough to call the tool correctly. It could only be improved by adding sibling selection guidance, but that gap is already penalized under usage guidelines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema itself documents all three parameters well, including defaults, formats, and allowed language values. The description adds nothing beyond that, which matches the baseline expectation for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Get a code example for a specific UniFi API endpoint.' It is clearly a retrieval tool, and 'code example' distinguishes it from response-sample or endpoint metadata tools. It does not explicitly name siblings, but the noun 'code example' narrows the purpose well.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance. With siblings such as get_endpoint, get_response_sample, and find_field, an agent is given no explicit help selecting this tool over alternatives. This is a real gap.
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
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Endpoint identifier (e.g. 'network/createnetwork'). | |
| field_path | Yes | Dotted path to the field, with discriminator variants in brackets. Examples: 'dhcpV4', 'management[GATEWAY].dhcpV4', 'management[GATEWAY].dhcpV4.gateway'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does communicate that the tool returns only the requested schema subtree rather than a full endpoint schema, which is valuable. However, it does not explicitly disclose whether the operation is side-effect-free, what happens for invalid paths, or any auth/permission expectations, leaving some important behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first sentence, the main alternative in the second, and the value intervention with find_field in the third. There is no filler or redundant restatement of the input schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple read-only tool with two well-documented parameters, 100% schema coverage, and an output schema exists, so return-value details do not need repeating. The description covers why to use this tool, what to expect to receive (the subtree), and how to obtain valid field paths, making it functionally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter description coverage is 100% and already includes good examples. The description adds extra meaning by explaining that slug points at an endpoint's schema and that field_path can be taken directly from find_field output, helping agents construct valid values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states action ('drill into'), resource ('specific field's schema'), and context ('within an endpoint'). Explicitly contrasts with fetching the full endpoint schema and references find_field, giving agents enough to distinguish it from get_endpoint and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use, saying to use this tool instead of fetching the full 70KB endpoint schema when only a subtree is needed. It also signals compatibility by stating that find_field paths work directly, which tells agents how this tool fits into a larger workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_guideGet GuideA
Get a UniFi API guide page (e.g. filtering syntax, error handling, getting started).
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Optional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to search all. | |
| topic | No | Guide slug or search term. Omit to list all available guides. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Get a ... guide page,' which implies a read-only operation, but it does not address auth requirements, error behavior, rate limits, or what happens with invalid topics or slugs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. The parenthetical examples are compact and informative, and the description is appropriately sized for a simple lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with zero required parameters, 100% schema coverage, and an output schema, the description is mostly sufficient. It lacks explicit usage guidance versus sibling tools, but the resource type and examples cover the essential calling intent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already well-documented in the schema (app filter values, topic slug/search term, omit behavior), so the baseline is 3. The description adds useful examples of guide topics, which clarifies what kind of values 'topic' may take and pushes it slightly beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact resource ('UniFi API guide page') with a specific verb ('Get') and concrete examples (filtering syntax, error handling, getting started). This clearly distinguishes it from sibling tools that target endpoints, examples, or field schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative tool guidance is given. The topic examples imply it is for conceptual/API documentation rather than endpoint-specific details, but there is no exclusion or comparison to get_docs_info or list_endpoints, so the agent must infer when to choose this tool.
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
Get the example JSON response for a specific UniFi API endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Endpoint identifier (e.g. 'listnetworks'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the tool returns an example JSON response, which is a read-only behavior. However, it doesn't mention whether the response is static/sample data or a live call, nor any error behavior (e.g., unknown slug). The description is accurate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the core action and object. No wasted words. The example in the schema helps clarify the parameter format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (1 param, output schema present), so the description is mostly sufficient. However, with no annotations and no mention of how to discover valid slugs (e.g., via list_endpoints), an agent might not know where to get the slug value. The output schema exists, so return format is covered, but the input source is not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the 'slug' parameter is described as 'Endpoint identifier (e.g. 'listnetworks')'. The description adds the context that the slug identifies a specific endpoint, but doesn't add much beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: retrieving an example JSON response for a specific UniFi API endpoint. It uses a specific verb ('Get') and resource ('example JSON response'), and the mention of 'specific UniFi API endpoint' distinguishes it from generic listing/searching tools. However, it doesn't explicitly differentiate from the sibling 'get_example', which may be a close alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: call this when you need an example response for a known endpoint identifier. It doesn't explicitly state when not to use it or name alternatives like 'get_example' or 'get_endpoint'. The context is clear enough for a simple tool, but lacks explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_endpointsList EndpointsA
List all available UniFi API endpoints with their HTTP method and path.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Optional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to list all. | |
| method | No | Optional HTTP method filter (GET, POST, PUT, DELETE, PATCH). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure. It states the tool lists all endpoints with method and path, implying a read-only operation, but does not disclose any additional traits such as pagination, ordering, or whether filters are case-sensitive. The simplicity of the operation makes this acceptable, but more could be said.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that immediately conveys the primary purpose and output. There is no redundant text or structural issues; it is highly concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two optional parameters and an output schema that documents the return format. The description covers the essential information (what it lists and the output fields). Nothing critical is missing for an agent to call it correctly, though a note on read-only nature or explicit 'returns a list' could add slight completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, both 'app' and 'method' parameters are fully described in the schema. The description adds no additional meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'available UniFi API endpoints' with the specific output 'HTTP method and path'. This distinguishes it from siblings like search_endpoints (which implies searching) and get_endpoint (which implies a single endpoint retrieval).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by mentioning optional filters, but it does not explicitly state when to use this tool versus alternatives, nor does it provide any exclusions or conditions. The context signals show siblings that might overlap, but the description lacks direct guidance on selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_endpointsSearch EndpointsA
Search UniFi API endpoints by name, path, method, or description.
Returns the top matching endpoints ranked by relevance. Use the slug from results with get_endpoint for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Optional app filter (network, protect, site-manager, innerspace, mobility, carrier-fabric). Omit to search all. | |
| query | Yes | Search term (endpoint name, path fragment, or keyword). | |
| method | No | Optional HTTP method filter (GET, POST, PUT, DELETE, PATCH). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It does state that results are 'top matching' and 'ranked by relevance', which informs the agent that not all matches are returned. However, it does not mention whether the operation is read-only (implied by search but not explicit), error handling, pagination, or the number of results returned. This partial disclosure earns a mid-range score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundant phrases. The primary purpose is stated immediately, followed by a concise note on behavior and a directive for next steps. Every sentence earns its place; no fluff or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, all documented in schema) and the existence of an output schema, the description covers the essentials: what it searches, what it returns (top matches), and how to proceed. It doesn't mention edge cases like empty results or result count limits, but these are minor for a search tool. The presence of an output schema reduces the need to explain return structures. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, meaning every parameter (app, query, method) already has a description in the schema. The description adds little beyond what the schema provides; it merely implies that query can match name, path, or description, which is already implied by the parameter description. No additional semantic value is added, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Search), a clear resource (UniFi API endpoints), and the search dimensions (name, path, method, description). It clearly distinguishes itself from sibling tools like list_endpoints (which likely lists all) and get_endpoint (which fetches one by slug) by framing this as a relevance-ranked search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear workflow: search first, then use the returned slug with get_endpoint for full details. This implies when to use this tool (when you need to find an endpoint) and what to do next, but it doesn't explicitly contrast with list_endpoints or state conditions when search would be inappropriate. Some guidance is present but not exhaustive.
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. Dates show when Glama detected each change.
10 tool updates
- First observed
find_field - First observed
get_docs_info - First observed
get_endpoint - First observed
get_endpoint_group - First observed
get_example - First observed
get_field_schema - First observed
get_guide - First observed
get_response_sample - First observed
list_endpoints - First observed
search_endpoints
TDQS
Scored across 10 tools
Each tool has a clear, non-overlapping job: listing endpoints, searching them, retrieving schemas/examples/responses, exploring fields by name/detail, grouping CRUD operations, and accessing guides/docs info. Even get_example and get_response_sample are cleanly separated by output type.
Tool names follow a consistent verb_noun pattern (list_, search_, get_, find_) with all lower_snake_case. The naming makes it easy to predict what each tool does.
10 tools is appropriate for an API documentation explorer: discovery, detail lookup, field-level inspection, resource grouping, and metadata are all represented without unnecessary redundancy.
The surface covers the full documentation workflow: discover endpoints, inspect schemas, see examples and response samples, locate fields, explore resource groups, and read guides/docs info. No obvious dead ends remain.
Maintenance
Related MCP Connectors
Live Steam Market API docs, schemas, products, games, markets and endpoint search.
Official TheRundown API documentation search. No live data or authenticated Product API calls.
31Cross-network DeFi API data, AMM analytics, and SDK docs for 17+ networks.
Zyrvix crypto-payments API reference for AI coding assistants. Anonymous, read-only.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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.10MIT
- AlicenseAqualityAmaintenanceExposes the UniFi Network Integration API as tools for managing sites, devices, clients, networks, WiFi, firewalls, ACLs, switching, DNS policies, hotspot vouchers, VPNs, and more.41260MIT
- AlicenseNot gradedqualityCmaintenanceA safety-first MCP server for managing UniFi networks, exposing 17 tools for telemetry, diagnostics, and guarded mutations with dry-run previews and confirm requirements.14MIT
- AlicenseAqualityBmaintenanceMCP server providing typed, safety-gated access to UniFi Network consoles via the official API, enabling management of devices, clients, networks, WiFi, firewall policies, and more.1618MIT
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/KallistoX/mcp-unifi-applications'
If you have feedback or need assistance with the MCP directory API, please join our Discord server