TP2 ✅ omada-mcp live (.176/pve, StreamableHTTP /mcp) — Verbindungstest grün

Root cause der Crash-Loops gefunden:
- Container bekam Env beim Deploy INLINE (Portainer ignoriert env_file) → alte falsche Var-Namen
- jmtvms/tplink-omada-mcp v0.15 nutzt Omada OPEN API (CLIENT_ID/SECRET), nicht user/pass
- Transport ist StreamableHTTP (MCP_SERVER_USE_HTTP + MCP_HTTP_*), NICHT SSE/MCP_TRANSPORT

Jetzt: /health 200, MCP initialize-Handshake liefert Tools/Capabilities. settings.json → /mcp.
.env-Schema, .env.template, compose-Doku korrigiert.
Offen: Claude Code reload → VLANs anlegen + .12 adoptieren (Tool-Categories ggf. um write erweitern).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 15:07:14 +02:00
parent bf5d2b2741
commit d99d8cf6da
4 changed files with 39 additions and 32 deletions

View File

@@ -39,15 +39,14 @@ Kontrolle: MikroMCP (MikroTik) live · ALLNET = Klickanleitungen (inline) · Oma
### TP2 — Omada Access-Switch + Controller ▸ 🔄 IN ARBEIT (2026-06-15)
- ✅ Omada Controller 6.2.10.17 auf DS923 (macvlan `.175`): `omada/docker-compose.yml`, Stack via Portainer endpointId=14. **Wizard abgeschlossen** (configured=true), Creds in `mcp/omada/.env`.
- ✅ pve-mcp (samik081) in Claude Code eingetragen (`~/.claude/settings.json`, SSE `.173:3000`).
- ✅ omada-mcp Container deployed auf **pve-LXC (`.126`, endpointId=2), ipvlan-IP `.176`**, in `~/.claude/settings.json` eingetragen. **Aktuell gestoppt** (Crash-Loop).
- ⚠️ **Erkenntnis:** `jmtvms/tplink-omada-mcp` nutzt die **Omada OPEN API** (`OMADA_CLIENT_ID/SECRET/OMADAC_ID/SITE_ID`), **nicht** User/Passwort. `.env`-Schema entsprechend angepasst.
- ⚠️ Admin-API-Login (admin / Wizard-PW) gibt `-30109` → im UI verifizieren.
**Noch offen (Reihenfolge):**
1. Controller-UI https://10.40.41.175:8043 → Settings → Platform Integration → **Open API** → App anlegen (Grant: Client Credentials) → Client ID + Secret notieren
2. `OMADA_SITE_ID` holen (UI oder `GET /{omadacId}/api/v2/sites`)
3. `mcp/omada/.env` befüllen (CLIENT_ID/SECRET/SITE_ID) → Container neu starten (Portainer Stack `omada-mcp`, Id=200)
4. SSE-Test `http://10.40.41.176:3000/health` → Claude Code reload → omada-mcp Tools verfügbar
5. VLANs 10/20/30/40/50/90/99/100 anlegen → `.12` adoptieren → Port 2 (ap2) + Uplink → Trunk-All, Rest → Access VLAN10
- ✅ omada-mcp **live** auf **pve-LXC (`.126`, endpointId=2), ipvlan-IP `.176`**, Stack Id=200, in `~/.claude/settings.json`.
- **Transport:** StreamableHTTP `http://10.40.41.176:3000/mcp` (Health `/health` → 200, MCP-Handshake verifiziert).
- **Auth:** Omada **Open API Client-Credentials** (NICHT User/PW). Env: `MCP_SERVER_USE_HTTP/MCP_HTTP_*` + `OMADA_BASE_URL/OMADAC_ID/SITE_ID/CLIENT_ID/CLIENT_SECRET/STRICT_SSL`. Creds in `mcp/omada/.env`.
- ⚠️ Open-API-App wurde im Controller-UI angelegt (User); omadac_id=`adbef8fa…`, site_id=`6a2fe68e…`.
**Noch offen:**
1. Claude Code reload → omada-mcp Tools (84 Tools, read-categories) verfügbar
2. VLANs 10/20/30/40/50/90/99/100 anlegen → `.12` adoptieren → Port 2 (ap2) + Uplink → Trunk-All, Rest → Access VLAN10
(Hinweis: geladene Tool-Categories sind aktuell **read-only** — für VLAN/Port-Writes ggf. `OMADA_TOOL_CATEGORIES` um write-Scopes erweitern.)
- ✅ Port-Plan: Omada-Switch Port 2 = ap2 (Trunk all), Uplink-Port (→ ALLNET GE8) = Trunk all.
- ✅ Portainer-Ablösung: **Komodo** empfohlen (einzige Option mit nativem MCP `mcp-server-komodo`). Eigener Task.
- Abh. erfüllt: TP1 (GE8 Trunk ✅).

View File

@@ -10,7 +10,7 @@
|---|---|---|---|---|---|---|
| **MikroMCP** (AliKarami) | MikroTik hAP ax² ap1/ap2 (RouterOS 7) — WLAN/CAPsMAN, später Router-Cutover | **jetzt: lokal (dieser Mac)** / Ziel: Mac mini `.167` Docker | jetzt **stdio** (`npx mikromcp serve`) / Ziel HTTP `:3000` | `ghcr.io/alikarami/mikromcp:latest` (HTTP) bzw. npm `mikromcp` (stdio) | `mcp/mikromcp/` + Claude-Code user-config | 🟢 **live (stdio), doctor 12/12, in Claude Code ✓Connected** |
| **pve-mcp** (samik081) | Proxmox VE API (Host `.100`) | DS923 (`.10`), macvlan-IP **`.173`** | SSE `http://10.40.41.173:3000/sse` | `ghcr.io/samik081/mcp-pve:latest` | — (Stack via Portainer) | 🟢 **live, in Claude Code eingetragen** |
| **omada-mcp** (jmtvms) | TP-Link Omada Controller → ES208G (+ künftige Omada-Geräte) | **pve-LXC (`.126`, endpointId=2)**, ipvlan-IP **`.176`** | SSE `http://10.40.41.176:3000/sse` (`MCP_TRANSPORT=sse`) | `jmtvms/tplink-omada-mcp:latest` | `mcp/omada/` ✓, in settings.json ✓ | 🟠 **Container deployed (gestoppt) — braucht Open-API-Client-Creds (UI: Platform Integration → Open API). User/PW funktioniert NICHT, nur Client-Credentials.** |
| **omada-mcp** (jmtvms v0.15) | TP-Link Omada Controller → ES208G (+ künftige Omada-Geräte) | **pve-LXC (`.126`, endpointId=2)**, ipvlan-IP **`.176`** | **StreamableHTTP** `http://10.40.41.176:3000/mcp` (Health `/health`) | `jmtvms/tplink-omada-mcp:latest` | `mcp/omada/` ✓, settings.json ✓ | 🟢 **live (Up, /health 200, MCP-Handshake ✓). Auth = Omada Open API Client-Credentials. Tools nach Claude-Code-Reload.** |
| **omada-controller** | Omada Software Controller (keine MCP) | DS923 (`.10`), macvlan-IP **`.175`** | HTTPS `https://10.40.41.175:8043` | `mbentley/omada-controller:6.2` | `omada/docker-compose.yml` | 🟢 **live, configured, Wizard ✅** |
| **komodo-mcp** (samik081) | Docker-Management **5 Hosts** via Komodo Core (ersetzt Portainer) | DS923 (`.10`), macvlan-IP **`.176`** | SSE `http://10.40.41.176:3000/sse` | `ghcr.io/samik081/mcp-komodo:latest` | `mcp/komodo/` ✓ (`.env.example` → `.env` nach Phase 1) | 🟡 **geplant — Migration: `mcp/komodo/MIGRATION.md`** |
| ~~portainer-mcp~~ (offiziell) | Docker-Überblick via Portainer CE 2.40.0 | `.126:9443` | — | `portainer/portainer-mcp` | `mcp/portainer/` (Token .env ✓) | ⏳ **retired nach Komodo-Migration — Token aufheben bis Phase 4** |

View File

@@ -1,13 +1,20 @@
# omada-mcp Secrets — .env (gitignored). Dieses File = Template, .env = echte Werte.
#
# jmtvms/tplink-omada-mcp nutzt die Omada OPEN API (nicht User/Passwort!).
# Client-Credentials erzeugen: Controller-UI → Settings → Platform Integration → Open API →
# neuen App-Eintrag (Grant Type: Client Credentials) → liefert Client ID + Client Secret.
# omadac_id: aus https://10.40.41.175:8043/api/info → result.omadacId
# site_id: Controller-UI Site-Auswahl, oder API /{omadacId}/api/v2/sites → result.data[].id
# jmtvms/tplink-omada-mcp v0.15: StreamableHTTP-Transport + Omada OPEN API (Client Credentials).
# Client-Creds erzeugen: Controller-UI → Settings → Platform Integration → Open API →
# App anlegen (Grant Type: Client Credentials) → liefert Client ID + Client Secret.
# omadac_id: https://10.40.41.175:8043/api/info → result.omadacId
# site_id: Controller-UI Site, oder API /{omadacId}/api/v2/sites → result.data[].id
MCP_TRANSPORT=sse
PORT=3000
# --- Transport: StreamableHTTP auf :3000/mcp ---
MCP_SERVER_USE_HTTP=true
MCP_HTTP_BIND_ADDR=0.0.0.0
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
MCP_HTTP_ENABLE_HEALTHCHECK=true
MCP_HTTP_HEALTHCHECK_PATH=/health
# --- Omada Open API ---
OMADA_BASE_URL=https://10.40.41.175:8043
OMADA_OMADAC_ID=adbef8fa3505fb16b09818eab71d824e
OMADA_CLIENT_ID=REPLACE_OPENAPI_CLIENT_ID

View File

@@ -1,15 +1,19 @@
# omada-mcp — TP-Link Omada Controller MCP Server
# omada-mcp — TP-Link Omada Controller MCP Server (jmtvms/tplink-omada-mcp v0.15)
# Host: pve-LXC (10.40.41.126, Portainer endpointId=2) — Docker-LXC auf Proxmox
# Image: jmtvms/tplink-omada-mcp (stdio by default, SSE via MCP_TRANSPORT=sse)
# IP: 10.40.41.176 (ipvlan default_external) — .173=pve-mcp, .175=omada-controller (beide auf DS923)
#
# Hinweis: pve-LXC-Disk ist klein (1GB-Controller-Image scheiterte dort → Controller läuft auf DS923).
# omada-mcp (~node-alpine) ist klein genug für den pve-LXC.
# Transport: StreamableHTTP (NICHT SSE) → Endpoint http://10.40.41.176:3000/mcp, Health /health
# Auth: Omada OPEN API (Client Credentials) — KEIN username/password!
# Creds: Controller-UI → Settings → Platform Integration → Open API (Grant: Client Credentials).
#
# Deploy (via Portainer API, endpointId=2):
# POST /api/stacks/create/standalone/string?endpointId=2
# Env beim Deploy inline (env_file findet Portainer nicht) — Werte aus .env.
# Claude Code: ~/.claude/settings.json → "omada-mcp": {"url": "http://10.40.41.176:3000/sse"}
# Hinweis: pve-LXC-Disk ist klein (1GB-Controller-Image scheiterte dort → Controller läuft auf DS923).
# omada-mcp (node-alpine) ist klein genug für den pve-LXC.
#
# Deploy/Update (via Portainer API, endpointId=2):
# POST /api/stacks/create/standalone/string?endpointId=2 (erstmalig)
# PUT /api/stacks/200?endpointId=2 (update, Stack-Id=200)
# ⚠️ Portainer-String-Deploy findet env_file NICHT → Env beim Deploy INLINE senden (Werte aus .env).
# Claude Code: ~/.claude/settings.json → "omada-mcp": {"url": "http://10.40.41.176:3000/mcp"}
services:
omada-mcp:
@@ -20,13 +24,10 @@ services:
default_external:
ipv4_address: 10.40.41.176
env_file: .env
# Env-Vars (Omada OPEN API, in .env setzen — siehe .env.template):
# MCP_TRANSPORT=sse · PORT=3000
# OMADA_BASE_URL=https://10.40.41.175:8043
# OMADA_OMADAC_ID=<aus /api/info> · OMADA_SITE_ID=<aus /api/v2/sites>
# OMADA_CLIENT_ID / OMADA_CLIENT_SECRET=<Controller → Platform Integration → Open API>
# OMADA_STRICT_SSL=false
# ACHTUNG: Portainer-String-Deploy findet env_file NICHT → Env beim Deploy inline senden.
# Env-Vars (siehe .env.template) — Transport + Omada Open API:
# MCP_SERVER_USE_HTTP=true · MCP_HTTP_BIND_ADDR=0.0.0.0 · MCP_HTTP_PORT=3000 · MCP_HTTP_PATH=/mcp
# MCP_HTTP_ENABLE_HEALTHCHECK=true · MCP_HTTP_HEALTHCHECK_PATH=/health
# OMADA_BASE_URL · OMADA_OMADAC_ID · OMADA_SITE_ID · OMADA_CLIENT_ID · OMADA_CLIENT_SECRET · OMADA_STRICT_SSL=false
networks:
default_external: