omada-mcp
Provides tools for interacting with the TP-Link Omada SDN Controller, enabling AI assistants to read and safely modify Omada network settings including sites, devices, clients, SSIDs, site settings, events, logs, and perform operations like reboot, block/unblock client, rate limit, LED control, and more.
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-mcp list all sites"
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
A Model Context Protocol server for the TP-Link Omada SDN Controller. It lets an AI assistant read and safely modify an Omada network through well-defined, capability-gated tools.
Built as a security-first companion to
mbentley/docker-omada-controller.
Talks to the Omada Open API (OAuth2 client-credentials) — not the internal cookie/CSRF API. The full v1 OpenAPI spec is captured in
docs/openapi/.21 tools covering reads (sites, devices, clients, SSIDs, site settings, events, logs) and writes (reboot, block/unblock/reconnect client, rate limit, LED, SSID config, AP radio config, site roaming, band steering).
Capability profiles gate what the assistant can do —
safe-readis the default and exposes only read tools. Writes require explicit opt-in via env var.Every write tool defaults to
dryRun: true— preview the diff before applying. After apply, the controller is re-read and any silent overrides are surfaced.
Verified against Omada Controller 6.2.10.17 (apiVer 3).
Status — local use only
This release is designed to run on the same machine as your MCP client (e.g. your laptop running Claude Code or Claude Desktop). It is not ready to be deployed as a long-lived service on your home server, alongside the controller, or anywhere else network-reachable.
Why:
The server speaks stdio only today. Your MCP client launches it as a subprocess per session and pipes JSON-RPC over stdin/stdout — there is nothing to "connect to" over a network.
HTTP transport is scaffolded but not implemented. The env-var plumbing exists (
MCP_TRANSPORT,MCP_HTTP_ENABLE,MCP_HTTP_BIND,MCP_HTTP_PORT) so future work doesn't reshape the project — but today settingMCP_TRANSPORT=httpthrows a clear "use stdio" error.There is no authentication in front of the server. If HTTP were enabled today, anything reaching its port could invoke the write tools. A safe hosted deployment needs at minimum Bearer-token auth plus a nginx / VPN topology in front; that's a focused next phase, not a deploy-it-as-is.
So: even though
docker-compose.example.ymlshows the eventual pairing withmbentley/omada-controller, the only currently-supported deployment is run it locally, beside whatever MCP client is using it.
Related MCP server: NetBox Read/Write MCP Server
Quick start
1. Create an Open API client in the controller
Follow docs/SETUP.md: in the controller go to
Settings → Platform Integration → Open API, create a client-credentials
app, and capture the client ID, client secret and omadacId.
2. Configure .env
Copy .env.example to .env in the repo root and fill in:
OMADA_BASE_URL=https://omada.local:8043
OMADA_CLIENT_ID=...
OMADA_CLIENT_SECRET=...
OMADA_OMADAC_ID=...
OMADA_SITE_ID=... # optional; tools require an explicit siteId otherwise
OMADA_VERIFY_TLS=false # for self-signed controller certs
OMADA_CAPABILITY_PROFILE=safe-read # safe-read | ops-write | admin.env is git-ignored. Keep it on the machine that will run the server.
3. Pick a way to run it (choose ONE)
Both options run the server on whatever machine the MCP client is on. There's no operational difference — pick whichever you find simpler.
Option A — Node directly (recommended; no Docker needed)
npm install
npm run buildThen point your MCP client at the compiled entry point. For Claude Desktop
that means editing claude_desktop_config.json:
{
"mcpServers": {
"omada": {
"command": "node",
"args": ["/abs/path/to/omada-mcp/dist/index.js"]
}
}
}The server finds .env automatically — it looks next to the compiled
entry point (i.e. <repo>/dist/index.js → <repo>/.env), then in the
working directory, then at whatever path OMADA_DOTENV_PATH points at.
Any one of those three is enough.
If the server starts but fails with "Invalid configuration: …" telling you the required vars are
undefined, your.envis not where it's looking. Either move/copy.envnext todist/index.js, or setOMADA_DOTENV_PATHexplicitly:{ "mcpServers": { "omada": { "command": "node", "args": ["/abs/path/to/omada-mcp/dist/index.js"], "env": { "OMADA_DOTENV_PATH": "/abs/path/to/omada-mcp/.env" } } } }The MCP client's
envblock is also a perfectly good place to put the Omada config inline if you'd rather not keep a.envfile at all — e.g. setOMADA_BASE_URL,OMADA_CLIENT_ID,OMADA_CLIENT_SECRET,OMADA_OMADAC_IDdirectly there.
Option B — Local Docker build
If you'd rather not have Node installed locally:
docker build -t omada-mcp:local .This builds the image on your machine with the tag omada-mcp:local.
No registry is involved. Then in your MCP-client config:
{
"mcpServers": {
"omada": {
"command": "docker",
"args": ["run", "-i", "--rm",
"--env-file", "/abs/path/to/omada-mcp/.env",
"omada-mcp:local"]
}
}
}The MCP client runs docker run -i --rm per session; the container exits
when the session ends.
Note on ghcr.io/<owner>/omada-mcp:latest references
Some legacy snippets you may see reference an image tag like
ghcr.io/<owner>/omada-mcp:latest. That image does not exist — it is a
placeholder for a hypothetical published image on GitHub Container Registry.
The CI workflow in this repo builds the Docker image but does not push it
anywhere (push: false).
You only need a public registry image if you want to install on multiple machines without each one rebuilding from source. To make that real you'd need to:
Push this repo to GitHub under your own account/org (e.g.
your-name/omada-mcp).Edit
.github/workflows/ci.ymlto addpermissions: packages: write, adocker/login-actionstep againstghcr.io, and flippush: falsetopush: truewith a real tag (tags: ghcr.io/your-name/omada-mcp:latest).Reference the resulting image at
ghcr.io/your-name/omada-mcp:latest.
For a single-laptop setup you don't need any of this — Option A or B above is the right path.
Tool catalog
All read tools are tagged safe-read. Every write tool defaults to
dryRun: true — pass dryRun: false to apply.
Read (safe-read)
Tool | Purpose |
| List sites on the controller. |
| APs / switches / gateway at a site, with status & firmware. |
| Per-device detail; for APs, also per-band radio config. |
| Per-band radio settings on one AP. |
| Connected clients with SSID, AP, RSSI, traffic. Summary counts. |
| Full client detail. |
| SSIDs grouped by WLAN group. |
| Full SSID configuration. |
| Aggregate roaming + band-steering + mesh. |
| Site event log within a time window. |
| Site alert log (with |
Operational writes (ops-write)
Tool | Purpose |
| Reboot one AP / switch / gateway. |
| Block / allow a client by MAC. |
| Force a client to re-associate. |
| Per-client up / down bandwidth limit. |
| Site-wide LED on / off. |
Admin writes (admin)
Tool | Purpose |
| Fast roaming, AI roaming, force-disassociation, non-stick. |
| Site band-steering mode. |
| Modify SSID basic config (name, band, broadcast, 802.11r, PMF, VLAN). |
| Per-AP per-band: channel, width, Tx power, radio enable. |
Environment variables
Variable | Required | Default | Notes |
| yes | — | Controller URL, no trailing slash. |
| yes | — | From the Open API app. |
| yes | — | From the Open API app. Never logged. |
| yes | — | Controller ID. |
| no | — | Default site; otherwise tools need |
| no |
|
|
| no |
| HTTP timeout. |
| no |
|
|
| no |
|
|
| no |
| Reserved for the future HTTP transport. |
| no |
| Loopback bind when HTTP lands. |
| no |
| |
| no |
|
|
| no | — | Explicit override path to a |
Security
Default profile is
safe-read— writes require an explicit env-var opt-in.Every write tool defaults to
dryRun: true. Apply mode performs a GET-merge-PATCH and re-reads to surface any controller-side overrides (mutually-exclusive settings, silent rejections).Credentials are read only from env vars, never from tool arguments, never logged, never returned in tool output. The access token is registered with the logger so any accidental serialisation is masked.
Don't expose this server over a network in its current form. HTTP transport is not yet implemented and there is no authentication layer. Run it locally as documented in Quick start above.
Development
npm install
npm run build # tsc
npm run typecheck # tsc --noEmit
npm run lint # biome check
npm run test # vitestdocs/openapi/ holds the captured TP-Link Omada Open API v1 spec
(omada-open-api-v1-spec.json, OpenAPI 3.0.1) and an endpoint-map.md
documenting which Open API endpoint backs each MCP tool.
Prior art
Three other Omada MCP projects were consulted as references during the design (all MIT):
omada-mcp is independent code; the differentiator is the security-first
capability tiers, the dry-run framework with post-apply re-read, and
first-class write coverage of SSID / AP-radio / site-roaming config.
License
MIT — see LICENSE.
Available Tools
11 toolsget_ap_radiosGet AP radio configARead-only
Per-band radio configuration for one AP: channel, channel width, Tx power and Tx-power level for 2.4/5/6 GHz. Use list_devices to find the AP MAC.
Inputs: apMac (required), siteId.
get_clientGet client detailARead-only
Get full detail for one client by MAC: connection (SSID, AP, channel, RSSI, SNR, rates), addressing, traffic, uptime and lifecycle.
Inputs: clientMac (required), siteId.
get_deviceGet device detailARead-only
Get detail for one device by MAC. For APs, also includes per-band radio config (channel, width, Tx power). Use list_devices to find MACs.
Inputs: deviceMac (required), siteId.
get_site_settingsGet site settingsARead-only
Aggregate site-level wireless settings: roaming (fast roaming, AI roaming, force-disassociation, non-stick, 802.11k report), band steering and mesh. Reads three Open API endpoints in parallel.
Inputs: siteId.
get_ssidGet SSID detailARead-only
Full SSID configuration. If wlanId is omitted, the tool finds the owning WLAN group automatically via list_ssids.
Inputs: ssidId (required), wlanId, siteId.
list_clientsList clientsARead-only
List connected clients (wired + wireless) at a site, with SSID, AP, band, channel, RSSI, Tx/Rx rate and total traffic. Also returns site summary counts.
Inputs: siteId, pageSize, page.
list_devicesList devicesARead-only
List APs, switches and gateways at a site, with model, IP, status, firmware version and last-seen timestamp.
Inputs: siteId.
list_eventsList site eventsARead-only
Site event log (System / Device / Client events) within a time window. Defaults to the last 24 hours. Returns counts and a sample of entries.
Inputs: siteId, hoursAgo, module, pageSize, +1 more.
list_logsList alert logARead-only
Site alert log within a time window. Defaults to the last 24 hours. Optionally filter by module or resolved/unresolved.
Inputs: siteId, hoursAgo, module, resolved, +2 more.
list_sitesList sitesARead-only
List all sites on the Omada controller. Returns each site's id, name, region and time zone — useful as a starting point and to find the siteId that other tools need.
Inputs: no named parameters.
list_ssidsList SSIDsARead-only
List all SSIDs at a site, grouped by their WLAN group. Returns wlanId/wlanName and the ssidId/ssidName for each SSID — use those ids with get_ssid for full SSID configuration.
Inputs: siteId.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Most tools target distinct resources or aspects (e.g., clients, devices, events, logs, SSIDs). There is minor overlap between get_device (which includes radio info) and get_ap_radios (which focuses solely on radio configuration), but descriptions differentiate them.
All tool names follow a consistent 'verb_noun' pattern in snake_case (get_*, list_*). No mixed conventions or irregular verbs.
With 11 tools covering sites, devices, clients, events, logs, SSIDs, and settings, the count is well-scoped for a monitoring-oriented MCP server. No excessive or trivial tools.
The tool set covers core read operations for Omada network management (list, get details, settings). Minor gaps exist: no write operations (create/update/delete) and no advanced features like switch port info or topology, but essential monitoring is covered.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Ovanek MCP: Model Context Protocol server for Ovanek platform tools; writes are dry-run by default.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that allows secure execution of pre-approved commands, enabling AI assistants to safely interact with the user's system.17 npm22ISC
- AlicenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that provides safe, intelligent read/write access to NetBox instances, designed with safety-first principles for Large Language Model automation.4MIT
- AlicenseCqualityBmaintenanceSecurity-focused MCP server for TP-Link Omada Open API workflows, enabling network management via natural language.11757 npm28MIT
- AlicenseBqualityCmaintenanceA Model Context Protocol server that exposes TP-Link Omada controller APIs to AI copilots and automation workflows, enabling listing sites, devices, clients, and invoking arbitrary Omada endpoints.84MIT