omada-mcp
Reads and, once unlocked, changes settings on a self-hosted TP-Link Omada WiFi controller
Reads and changes a TP-Link Omada SDN controller's sites, devices, clients, VLANs, firewall and Wi-Fi
By Alex Gibson (individual) TypeScript Local · stdio DevOps and monitoring
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs OMADA_BASE_URL, OMADA_OMADAC_ID, OMADA_CLIENT_ID, OMADA_CLIENT_SECRET. Replace each <NAME> with your value.
claude mcp add omada -e OMADA_BASE_URL=<OMADA_BASE_URL> -e OMADA_OMADAC_ID=<OMADA_OMADAC_ID> -e OMADA_CLIENT_ID=<OMADA_CLIENT_ID> -e OMADA_CLIENT_SECRET=<OMADA_CLIENT_SECRET> -- docker run -i --rm -e OMADA_BASE_URL -e OMADA_CLIENT_ID -e OMADA_CLIENT_SECRET -e OMADA_OMADAC_ID ghcr.io/realtydev/omada-mcp:latest{
"mcpServers": {
"omada": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OMADA_BASE_URL",
"-e",
"OMADA_CLIENT_ID",
"-e",
"OMADA_CLIENT_SECRET",
"-e",
"OMADA_OMADAC_ID",
"ghcr.io/realtydev/omada-mcp:latest"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}{
"mcpServers": {
"omada": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OMADA_BASE_URL",
"-e",
"OMADA_CLIENT_ID",
"-e",
"OMADA_CLIENT_SECRET",
"-e",
"OMADA_OMADAC_ID",
"ghcr.io/realtydev/omada-mcp:latest"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}{
"servers": {
"omada": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OMADA_BASE_URL",
"-e",
"OMADA_CLIENT_ID",
"-e",
"OMADA_CLIENT_SECRET",
"-e",
"OMADA_OMADAC_ID",
"ghcr.io/realtydev/omada-mcp:latest"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}[mcp_servers.omada]
command = "docker"
args = ["run", "-i", "--rm", "-e", "OMADA_BASE_URL", "-e", "OMADA_CLIENT_ID", "-e", "OMADA_CLIENT_SECRET", "-e", "OMADA_OMADAC_ID", "ghcr.io/realtydev/omada-mcp:latest"]
[mcp_servers.omada.env]
OMADA_BASE_URL = "<OMADA_BASE_URL>"
OMADA_OMADAC_ID = "<OMADA_OMADAC_ID>"
OMADA_CLIENT_ID = "<OMADA_CLIENT_ID>"
OMADA_CLIENT_SECRET = "<OMADA_CLIENT_SECRET>"gemini mcp add --scope user -e OMADA_BASE_URL=<OMADA_BASE_URL> -e OMADA_OMADAC_ID=<OMADA_OMADAC_ID> -e OMADA_CLIENT_ID=<OMADA_CLIENT_ID> -e OMADA_CLIENT_SECRET=<OMADA_CLIENT_SECRET> omada docker -- run -i --rm -e OMADA_BASE_URL -e OMADA_CLIENT_ID -e OMADA_CLIENT_SECRET -e OMADA_OMADAC_ID ghcr.io/realtydev/omada-mcp:latestOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs OMADA_BASE_URL, OMADA_OMADAC_ID, OMADA_CLIENT_ID, OMADA_CLIENT_SECRET. Replace each <NAME> with your value.
git clone https://github.com/realtydev/omada-mcp.git && cd omada-mcp
corepack enable && yarn install && yarn buildclaude mcp add omada -e OMADA_BASE_URL=<OMADA_BASE_URL> -e OMADA_OMADAC_ID=<OMADA_OMADAC_ID> -e OMADA_CLIENT_ID=<OMADA_CLIENT_ID> -e OMADA_CLIENT_SECRET=<OMADA_CLIENT_SECRET> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'{
"mcpServers": {
"omada": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}{
"mcpServers": {
"omada": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}{
"servers": {
"omada": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
],
"env": {
"OMADA_BASE_URL": "<OMADA_BASE_URL>",
"OMADA_OMADAC_ID": "<OMADA_OMADAC_ID>",
"OMADA_CLIENT_ID": "<OMADA_CLIENT_ID>",
"OMADA_CLIENT_SECRET": "<OMADA_CLIENT_SECRET>"
}
}
}
}[mcp_servers.omada]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]
[mcp_servers.omada.env]
OMADA_BASE_URL = "<OMADA_BASE_URL>"
OMADA_OMADAC_ID = "<OMADA_OMADAC_ID>"
OMADA_CLIENT_ID = "<OMADA_CLIENT_ID>"
OMADA_CLIENT_SECRET = "<OMADA_CLIENT_SECRET>"gemini mcp add --scope user -e OMADA_BASE_URL=<OMADA_BASE_URL> -e OMADA_OMADAC_ID=<OMADA_OMADAC_ID> -e OMADA_CLIENT_ID=<OMADA_CLIENT_ID> -e OMADA_CLIENT_SECRET=<OMADA_CLIENT_SECRET> omada node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'OMADA_BASE_URL |
Required: Address of the Omada controller, e.g. https://omada.local:8043. |
|---|---|
OMADA_OMADAC_ID |
Required: The controller ID (omadacId). |
OMADA_CLIENT_ID |
Required: Open API client ID; needed in the default oauth mode. |
OMADA_CLIENT_SECRET |
Required: Open API client secret; needed in the default oauth mode. |
OMADA_AUTH_MODE |
Optional: oauth (default) or web for Fusion web-session login. |
OMADA_WEB_USERNAME |
Optional: Web UI username; needed in web mode and for route, port forward and IP group tools. |
OMADA_WEB_PASSWORD |
Optional: Web UI password, paired with OMADA_WEB_USERNAME. |
OMADA_SITE_ID |
Optional: Default site ID for tools. |
OMADA_STRICT_SSL |
Optional: Verify the controller's TLS certificate; true by default, false for self-signed. |
OMADA_TIMEOUT |
Optional: Request timeout in ms, 30000 by default. |
MCP_SERVER_USE_HTTP |
Optional: true to serve HTTP instead of stdio. |
MCP_HTTP_BIND_ADDR |
Optional: HTTP bind address, 127.0.0.1 by default. |
In a container, a setting goes in with -e NAME=value after docker run.
Omada MCP connects an MCP client to a TP-Link Omada SDN controller so an assistant can inspect and reconfigure a network managed by it: sites, gateways, switches, access points, connected clients, LAN networks and VLANs, firewall rules and ACLs, SSIDs, static routes, port forwarding and WAN ports. It is a community project maintained by realtydev, which grew out of MiguelTVMS's tplink-omada-mcp; it is not published by TP-Link.
It has 78 tools at v0.6.1 (counted in src/tools/index.ts): 34 that read state, history, alerts, logs and statistics, and the rest that create, change or delete configuration, reboot or adopt devices, block clients, start firmware upgrades and run cable tests. A genericApiCall tool can reach any Open API endpoint the other tools do not cover. Most tools go through Omada's official Open API; routes, port forwarding writes and IP groups go through the controller's internal web UI API, which needs a web UI username and password as well.
It runs over stdio by default, or as a Streamable HTTP or SSE server with health checks, CORS settings and optional ngrok tunnelling. The repository also ships a separate optional WAN failover guard process, started with yarn wan-guard, which disconnects the primary WAN port when a cable modem hands out a private fallback lease; it is off and in dry-run mode unless enabled.
| Runtime | DockerorNode.js 24+ |
|---|
A TP-Link Omada SDN controller you can reach over the network, its controller ID (omadacId), and either Open API client credentials created in the controller (default oauth mode) or, for Fusion gateways without them, a web UI username and password (OMADA_AUTH_MODE=web). Docker for the published image ghcr.io/realtydev/omada-mcp, or Node 24 with Yarn 4 through Corepack to build from source. Route, port forwarding and IP group tools also need OMADA_WEB_USERNAME and OMADA_WEB_PASSWORD.
Only works with TP-Link Omada controllers. The internal web UI API used for routes and port forwarding is not a documented TP-Link interface. Dry runs exist only on setApRadio and setLogNotifications; other writes apply straight to the live network. The README lists silent as a value for MCP_SERVER_LOG_LEVEL, but src/config.ts at v0.6.1 accepts only debug, info, warn and error, so silent fails start-up validation. The HTTP endpoint has no authentication of its own. Requests time out after 30000 ms unless OMADA_TIMEOUT is set.
Suits people who run an Omada network, at home or for a small business, and want an assistant to diagnose Wi-Fi, clients and WAN problems and make changes, with Docker or Node available on a machine that can reach the controller. Because many tools write to live network settings, anyone who only wants reporting should give it an Open API app with a viewer role. kaviththiranga's omada-mcp-server, which we also list, is a separate Omada server that takes its pinned OpenAPI export from this repository; this one has hand-written tools plus the web UI API for routes and port forwarding.
listSiteslistDeviceslistClientsgetDevicegetGatewayWanStatusgetApRadiosgetClientHistorygetClientsearchDeviceslistDevicesStatslistMostActiveClientslistClientsActivitygetThreatListgetInternetInfogetPortForwardingStatusgetLanNetworkListgetSsidListgetSsidDetailgetFirewallSettinggetIpsSettinggetFirmwareDetailslistAlertslistEventslistFirewallAclslistIpGroupslistRoutesgetSwitchgetSwitchNetworkscreateLanNetworkupdateLanNetworkdeleteLanNetworkupdateFirewallSettingsetIpsSettingcreateFirewallAclupdateFirewallAcldeleteFirewallAclupdateSsidsetSsidEnableupdateSwitchPortupdateClientsetSwitchNetworkscreateRouteupdateRoutedeleteRoutecreatePortForwardupdatePortForwarddeletePortForwardupdateWanPortSettingsetSwitchPortStatusstartCableTestrebootDeviceadoptDeviceblockClientreconnectClientsetLogNotificationssetApRadiostartFirmwareUpgradesetGatewayWanConnectgenericApiCallgetServerInfo