omada-mcp
This is an MCP server that lets an AI assistant read and manage a TP-Link Omada WiFi network through a spec-driven interface to the controller's OpenAPI and legacy web APIs.
Read controller status, site list, devices, clients, and SSIDs via dedicated typed tools.
Search and inspect the full Omada OpenAPI spec (~1,650 operations) with
omada_search_apiandomada_describe_api.Call any OpenAPI endpoint with
omada_call, including automatic{omadacId}/{siteId}substitution, pagination, and query/body parameters.Use
omada_ui_callas a fallback for settings not exposed by the OpenAPI (legacy web-session API).Perform read-only operations by default; writes are blocked unless explicitly enabled.
When writes are unlocked, mutations return a dry-run preview unless confirmed with
confirm: true.Deny-list protects against irreversible actions like factory reset, firmware upgrade, deletion, and restore.
Includes shell scripts for status checks, token retrieval, authenticated API calls, config snapshots, roaming monitoring, and guided Wi-Fi surveys.
Provides a reusable Claude skill capturing Omada API gotchas and roaming measurement methods.
Integrates with TP-Link Omada controllers to read and tune WiFi networks via the Omada Open API and legacy web-session API. Provides tools for controller status, sites, devices, clients, SSIDs, API spec search/describe/call, and write-guarded configuration changes with dry-run previews.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@omada-mcpWhat's connected to my WiFi right now, and how strong is each device?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
omada-mcp
An MCP server for TP-Link Omada controllers, so an AI assistant (Claude Code, or any MCP client) can read and tune your WiFi network directly.
It is spec-driven: instead of hand-writing a tool per endpoint, it indexes the Omada Open API (~1,650 operations) and gives the model three tools to search it, inspect one operation, and call it. That means the whole API surface is reachable through nine tools.
It is read-only until you say otherwise. Every non-GET request is refused unless you explicitly unlock writes, and even then a mutation returns a dry-run preview until it is confirmed.
Built while fixing roaming on a real 3-AP home network. Full write-up with screenshots and measurements: article/ — what was actually wrong, what the numbers looked like before and after, and the two things the AI got wrong that measurement caught.
What it can do
Ask things like:
"What is connected to my WiFi right now, and how strong is each device?"
"Are any of my APs on the same channel?"
"Is fast roaming actually configured correctly?"
"Why does my phone stay on the far access point?"
"Show me the SSID settings" / "turn on the minimum RSSI threshold at -75"
Related MCP server: omada-mcp
Tools
Tool | |
| controller info, token health, write-mode, API index, site list |
| typed reads |
| search the Omada Open API spec |
| parameters + request/response schema for one operation |
| invoke any Open API endpoint (write-guarded) |
| legacy |
Safety model
Three independent gates on any write:
OMADA_ALLOW_WRITESunset or0→ every non-GET is refused.Unlocked but no
confirm: true→ returns a dry-run preview of the exact method, URL and JSON body. Nothing is sent.A deny-list blocks the irreversible regardless of the other two: factory reset, controller restore, firmware upgrade, device/site deletion, MSP mode, and edits to the Open API app itself.
The server reads its own .env, so credentials never enter your MCP client
config.
Setup
1. Create an Open API app on the controller
Controller UI → Settings → Platform Integration → Open API → Add New App → Client Mode → give it an admin role and all site privileges → save. Copy the Client ID and Client Secret (the secret is shown only once).
Find your omadacId:
curl -sk https://<controller-ip>/api/info2. Install
git clone https://github.com/<you>/omada-mcp.git && cd omada-mcp
npm ci && npm run build
cp .env.example .env && chmod 600 .env # fill in the values
npm run smoke # verifies both transports
npm run fetch-spec # builds the API index3. Register with your MCP client
claude mcp add --scope user omada -- node "$PWD/dist/index.js"About the API index
The server first tries to download the OpenAPI document from your controller.
Hardware controllers (OC200/OC300) on 5.15.x do not serve one —
/openapi/v3/api-docs returns 404 even with a valid token. In that case it falls
back to a pinned export of the same document, taken from a controller that does
serve it (vendored from realtydev/omada-mcp,
MIT).
Treat the index as a map, not the territory: it may list endpoints your
firmware does not have. The live controller is always the authority. Re-run
npm run fetch-spec after a firmware upgrade.
Shell scripts (work without any MCP client)
scripts/omada-status.sh # reachability, token, sites, device/client counts
scripts/omada-token.sh # print an access token
scripts/omada-api.sh /sites # authenticated GET
scripts/omada-snapshot.sh <dir> # full read-only config snapshot (for rollback)
scripts/omada-roamwatch.sh # live: prints a line each time a client changes AP
scripts/omada-survey.sh -m <MAC> "Kitchen" "Bedroom" # guided walk surveyomada-roamwatch.sh and omada-survey.sh are the ones worth knowing about: they
turn "my WiFi feels bad in that room" into numbers.
Skill for Claude Code
skill/SKILL.md is a reusable skill capturing the hard-won bits: Omada API
gotchas, enum decoders, the difference between configured and on-air settings,
and a tested method for measuring roaming. Copy it to
~/.claude/skills/omada-network/ and adapt the placeholders to your own site.
Requirements
Node 22+. Tested against Omada Controller 5.15.24.21 (OC200) with EAP225, EAP625-Outdoor and EAP683 access points.
License
MIT
Available Tools
9 toolsomada_callCall any Open API endpointA
Invoke any controller Open API endpoint. Give either operationId (from omada_search_api) or method+path. {omadacId} and {siteId} are filled in automatically. Non-GET calls are refused in read-only mode, and even when writes are unlocked they return a dry-run preview unless confirm: true - show that preview to the user and get an explicit yes first.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| path | No | e.g. /sites/{siteId}/clients - the /openapi/v1/{omadacId} prefix is added if absent | |
| query | No | ||
| method | No | ||
| confirm | No | Required to actually execute a write, after the user has approved it | |
| pathParams | No | Values for {placeholders} in the path | |
| operationId | No | From omada_search_api; supplies method and path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: non-GET calls are refused in read-only mode, writes return a dry-run preview unless confirm:true, and {omadacId}/{siteId} are auto-injected. It omits pagination behavior, error semantics, and what the response envelope looks like, which matters for a generic dispatcher.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, and the invocation modes are front-loaded ahead of the safety constraints. Every clause adds information an agent needs to call this correctly.
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 7-parameter generic API dispatcher with no output schema and no annotations, the description covers invocation, path templating, and the write-safety model. It is nearly sufficient, with return shape and pagination left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57% and the description fills the most important gaps: it explains the operationId alternative, that the /openapi/v1/{omadacId} prefix is applied automatically, and the exact approval semantics of confirm. It says nothing about body or query shape, which remain undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Invoke any controller Open API endpoint' — and implicitly separates itself from omada_ui_call by scoping to the Open API surface. It also names omada_search_api as the source of operationId, so an agent can route between the search/describe/call trio without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete entry paths ('operationId from omada_search_api' or 'method+path') and states the read-only and confirm-before-write conditions, plus the requirement to show the dry-run preview and get an explicit yes. It stops short of saying when to prefer the purpose-built siblings (omada_clients, omada_sites) over this generic escape hatch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_clientsList connected clientsBRead-only
Clients currently connected to a site: name, MAC, IP, wired/wireless, SSID, signal, traffic. Paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Default 1 | |
| siteId | No | ||
| pageSize | No | Default 100 | |
| searchKey | No | Filter by name/MAC/IP as the UI search box does |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and the description adds the pagination behavior plus a signal that results are a live snapshot ('currently connected'). It does not disclose rate limits, maximum result set, or how pagination terminates, so it adds moderate value over the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse sentences/fragments with the resource and fields front-loaded and no wasted words. The telegraphic field list is dense but appropriate for a list 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?
With no output schema and minimal annotations, the description carries the burden of describing returns, and it does so by naming the client fields, plus noting pagination. It is nearly complete for a simple list tool, missing only pagination limits and the site-scoping requirement.
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 75% (page, pageSize, and searchKey are documented; siteId is not). The description only echoes pagination, which the schema's page/pageSize already convey, and does not clarify whether siteId is needed to scope 'a site' — no real value beyond the schema's baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Clients currently connected to a site') and enumerates the returned fields (name, MAC, IP, wired/wireless, SSID, signal, traffic), which makes the scope clear. It does not explicitly differentiate itself from siblings like omada_devices or omada_search_api, but the 'connected clients' framing is distinct enough to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, no when-not-to-use, and no named alternative. The phrase 'currently connected' implies a live-inventory use case, but an agent gets no guidance on choosing this over omada_devices or omada_search_api.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_describe_apiDescribe one API operationARead-only
Full detail for a single operation: path/query parameters, request-body schema and response shape. Accepts an operationId from omada_search_api, or "METHOD /path".
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes | operationId, or e.g. "PATCH /openapi/v1/{omadacId}/sites/{siteId}/devices/{mac}" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a describe/read tool. Since there is no output schema, the description usefully discloses what the response contains (parameters, request-body schema, response shape), which is behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with what the tool returns and finished with the accepted input forms. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the return content well and fully documents the single input's accepted forms. Minor gap: it doesn't mention error behavior for invalid operationIds/paths, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter whose description already spells out the operationId or "METHOD /path" format, so the description largely restates the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: returns full detail for a single API operation, enumerating path/query parameters, request-body schema, and response shape. It explicitly distinguishes itself from the sibling omada_search_api by naming it as the source of the operationId.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it after omada_search_api, and tells the agent the accepted input forms (operationId or "METHOD /path"). It does not state when NOT to use it or contrast with omada_call, but the workflow placement is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_devicesList adopted devicesBRead-only
Adopted Omada devices for a site (gateways, switches, APs) with model, MAC, IP, status, uptime and firmware.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | No | Defaults to OMADA_SITE_ID or the only site |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read with no side effects, so the description does not need to carry the safety burden. It adds the useful fact that only *adopted* devices are returned and lists the fields exposed, but says nothing about scoping, pagination, or behavior when siteId is omitted (the schema covers that default).
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 tight sentence that front-loads the resource and then the returned fields. It is efficient with no filler, though the missing verb makes it a fragment rather than a fully self-contained statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-parameter read tool with no output schema, enumerating the returned device fields (model, MAC, IP, status, uptime, firmware) gives the agent enough to know what it will get and when it is the right call. Nothing essential is missing given the tool's low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is only one optional parameter, whose default behavior (OMADA_SITE_ID or the only site) is documented in the schema itself. The description adds no parameter detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (adopted Omada devices for a site) and enumerates the device families and fields returned, which distinguishes it from siblings like omada_clients and omada_ssids. It reads as a noun phrase rather than a verb, so the action ('list/retrieve') is only implied, but the resource is 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?
There is no statement of when to use this tool versus alternatives such as omada_status or omada_clients, and no conditions or prerequisites are given. Usage must be inferred entirely from the resource description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_search_apiSearch the controller APIARead-only
Search this controller's own OpenAPI spec for endpoints. Use it before omada_call whenever the exact operation is not already known - e.g. "poe port", "block client", "port forwarding", "firmware", "vlan".
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Restrict to a spec group file, e.g. "device" or "site-setting" | |
| limit | No | Default 25 | |
| query | Yes | Space-separated terms matched against operationId, path, summary and tags | |
| method | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds useful scoping context (searching the controller's own spec). However, it does not describe the result format, pagination, or how the returned endpoints should be consumed by omada_call.
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 wasted words. The core behavior is front-loaded, and the follow-up usage guidance with examples earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool, the description covers what it searches and when to use it, while the schema handles parameter details. It does not describe the shape of the search result or how to map results into an omada_call, which would be useful given there is no output schema.
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 75%, and the schema already documents query matching, group restriction, and limit behavior; the method enum is self-explanatory. The tool description adds example query terms but no additional parameter semantics 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?
The description uses a specific verb and resource: 'Search this controller's own OpenAPI spec for endpoints.' It clearly distinguishes itself from the sibling omada_call by positioning itself as the lookup step before an exact operation is known.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use it before omada_call whenever the exact operation is not already known,' with concrete example queries. It lacks an explicit when-not-to-use statement or direct comparison to omada_describe_api, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_sitesList Omada sitesARead-only
List the sites on this controller (siteId + name), which most other calls need.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds genuinely useful context beyond the annotation: the returned shape (siteId + name) and the fact that other calls depend on it. It says nothing about auth, pagination, or errors, but for a trivial zero-arg read that gap is minor.
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 compact sentence with the resource front-loaded and the return fields plus dependency hint packed into a parenthetical. Every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the job of describing what comes back (siteId + name) and why it matters, which fully covers a zero-parameter list call. Marginally incomplete only in not noting ordering, pagination, or emptiness behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4 and there is no parameter semantics to explain. The description's mention of return fields is output information rather than a substitute for parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the sites on this controller') and even names the fields returned (siteId + name), so the agent knows what it gets. It is distinguishable from siblings like omada_devices/omada_clients by resource, but it never explicitly contrasts itself with any of them, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'which most other calls need' implies this is a prerequisite/lookup call agents should run before site-scoped operations, which is useful implied guidance. However, it gives no explicit when-to-use/when-not statement or named alternative, so usage remains inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_ssidsList WLANs and SSIDsBRead-only
WLAN groups on the site and the SSIDs inside each: name, band, security, guest-network and VLAN settings.
| Name | Required | Description | Default |
|---|---|---|---|
| siteId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes this is a non-destructive read, lowering the bar. The description adds the shape of the returned data (grouped WLAN groups with per-SSID attributes), which is real context since no output schema exists, but it says nothing about pagination, permissions, or whether an omitted/default site scope is applied.
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 compact clause with zero filler; the returned-field inventory is front-loaded immediately after the resource. It is efficient, though the sentence is a noun fragment rather than a complete statement of action.
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, single-parameter read tool with no output schema, the description usefully enumerates what comes back and how it is grouped. It still leaves the optional siteId's semantics and any usage routing unexplained, which is a meaningful but not fatal gap at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (siteId, optional) with 0% schema description coverage, so the description must compensate. The phrase 'on the site' gestures at site scoping but never names siteId, explains its format, or states what happens when it is omitted — the optional/default behavior is entirely undocumented.
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?
Identifies a specific resource pair — WLAN groups and the SSIDs nested inside them — along with the fields of interest (name, band, security, guest-network, VLAN). The verb is carried only implicitly by the title 'List WLANs and SSIDs'; the resource itself is distinct from omada_devices, omada_clients, and omada_sites, so no sibling confusion. Clear, though not a full verb+resource statement in the description body.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no conditions, and no mention of any alternative tool. An agent must infer from the name alone that this is the SSID/WLAN-configuration listing tool rather than, say, omada_devices or a generic omada_call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_statusOmada controller statusARead-only
Health and wiring check: controller version/info, Open API token state, write-mode, deny-list state, API index freshness, legacy web-session availability, and the site list. Run this first when anything looks off.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true; the description goes beyond that by signaling this is a non-mutating diagnostic ('health and wiring check') and listing what it inspects. It does not contradict annotations and adds context about scope without claiming a destructive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The first sentence front-loads the purpose and enumerates the checks in a compact list; the second sentence provides a clear recommendation. Every phrase adds value, and the structure makes it easy to scan.
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 0-parameter read-only diagnostic, the description adequately covers when to call it and what information it surfaces. It does not mention the exact output shape, but no output schema exists and the enumerated checks imply the expected data. It is not fully exhaustive, but is complete enough for safe invocation.
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 and the schema is empty, so no parameter explanation is needed. The description still implicitly explains that no inputs are required by focusing entirely on the status of the controller environment. Baseline of 4 applies for zero-parameter tools.
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 gives a specific verb and resource: it is a 'health and wiring check' for the Omada controller, enumerating exactly what it reports (version, API token state, write-mode, deny-list, API index freshness, legacy sessions, site list). This clearly distinguishes it from sibling tools, which target specific entities like sites, devices, or API discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear trigger: 'Run this first when anything looks off.' This tells the agent when to invoke the tool, but it does not mention when not to use it or explicitly reference alternatives beyond the general first-step guidance. It gives actionable context but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
omada_ui_callCall the legacy web-UI APIA
Fallback transport for settings the Open API does not expose: the session API the Omada web UI itself uses (/{omadacId}/api/v2/...). Requires OMADA_WEB_USER/PASS. Same write rules as omada_call. Find paths by watching the browser network tab, or from the Omada community API notes.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| path | Yes | e.g. /api/v2/sites/{siteId}/setting/wlans - the /{omadacId} prefix is added if absent | |
| query | No | ||
| method | No | Default GET | |
| confirm | No | ||
| pathParams | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two real traits: it requires OMADA_WEB_USER/PASS credentials and it follows the same write rules as omada_call (i.e. it can mutate). It does not explain the undocumented `confirm` gate, session/cookie handling or expiry, or what happens on auth failure, which matters for a 6-param transport that can issue DELETE.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the fallback role and immediately followed by the credential requirement and path-discovery tip. No filler; only the missing `confirm` explanation keeps it from 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?
For a low-coverage schema, no annotations, and no output schema, the description omits too much: the meaning and necessity of `confirm`, how `body`/`query`/`pathParams` are composed, and what a response looks like. An agent could construct an unintended mutating call from this definition.
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 only 33% across 6 parameters, yet the description adds nothing about `body`, `query`, `pathParams`, `method` defaulting, or `confirm`. The one detail it does give (the /{omadacId} prefix being added) is already stated in the path parameter's schema description, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (the session API the Omada web UI itself uses, /{omadacId}/api/v2/...) and its role as a fallback transport for settings the Open API does not expose. This cleanly separates it from omada_call (Open API) and omada_describe_api/omada_search_api, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as a fallback for settings the Open API does not expose, which implies the alternative (use omada_call first), and gives concrete guidance on discovering paths (browser network tab, community API notes). No explicit 'do not use for X' exclusion, so 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
omada_call - First observed
omada_clients - First observed
omada_describe_api - First observed
omada_devices - First observed
omada_search_api - First observed
omada_sites - First observed
omada_ssids - First observed
omada_status - First observed
omada_ui_call
TDQS
Scored across 9 tools
Each tool has a clearly separated role: status, sites, devices, clients, and SSIDs are distinct resource views, while search_api, describe_api, call, and ui_call form a staged API workflow. There is minor overlap between omada_status (which also lists sites) and omada_sites, and between omada_call and omada_ui_call, but the descriptions make the boundaries explicit enough.
The omada_ prefix and snake_case are consistent, but the pattern is mixed: status/sites/devices/clients/ssids are noun-only names, while search_api/describe_api/call/ui_call are verb-oriented. This is readable and not chaotic, yet it does not follow a uniform verb_noun convention.
Nine tools is well-scoped: five high-level read/resource tools cover the common Omada surfaces, and four API/UI tools provide discovery, documentation lookup, and safe execution. Each tool earns its place without the set feeling bloated or thin.
The high-level tools cover the main query needs, while omada_search_api, omada_describe_api, omada_call, and omada_ui_call fill essentially any gap in the controller's exposed API or UI-facing session API. The dry-run/confirm write flow also prevents dead ends for mutating operations.
Maintenance
Related MCP Connectors
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI assistants to manage UniFi network infrastructure through 50+ tools covering devices, clients, networks, WiFi, firewall rules, and guest access using the official UniFi Network API.5243 npm5MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that enables AI assistants to read and safely modify TP-Link Omada networks through capability-gated tools, with a default read-only profile and dry-run writes for security.111MIT
- AlicenseCqualityDmaintenanceExposes TP-Link Omada controller APIs to AI copilots, enabling listing of sites, devices, and clients, and executing arbitrary Omada API calls via natural language.8420MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to manage TP-Link routers by listing clients, checking status, controlling Wi-Fi, and rebooting via natural language.1MIT