Files
bf-infra/mcp
Christoph Emsenhuber 3562e19e47 Portainer 2.40 → 2.42.0 Bump + portainer-mcp projektspezifisch
Portainer-Server (pve LXC 400): 2.40.0 → 2.42.0 via Image-Swap mit Volume-Erhalt.
Pre-Upgrade-Snapshot: docker commit :2.40.0-preupgrade-20260828 (Rollback 7 d
verfügbar) + Settings/Stacks/Endpoints-JSON-Dump (40 KB, 31 Stacks, 4 Endpoints).
Instance-ID + API-Token nach Bump identisch — kein Re-Auth, kein Settings-Verlust.

portainer-mcp: offizielles PyPI-Paket mcp-portainer~=2.42.0 (193 Tools), nur
in bf-infra/opencode.jsonc, via uvx-stdio. Tool-Gate: get_guidance() einmal pro
Session zwingend vor erstem Read. Andere Projekte unberührt.

Korrekturen ggü. Handoff 2026-08-28 README:
- mcp-portainer PyPI bis 2.42.6, Docker-Hub portainer/portainer-ce nur bis 2.42.0
  (unterschiedliche Versionierungspfade).
- mcp/portainer/README.md ist auf 2.42.6 formuliert und sollte nachgezogen werden.

Bestand: mcp/INVENTORY.md portainer-mcp ⛔→🟢 + Header MCP-WARP-Direktive ergänzt.
.mcp.json (war getrackt aus Commit 3426366) entfernt: opencode nutzt opencode.jsonc,
nicht .mcp.json — Claude-Code-Konvention hier irrelevant.
2026-08-28 21:17:52 +02:00
..

MCP-Control-Plane — BF

Zentrale, versionierte MCP-Server für BF. Übersicht aller MCPs: INVENTORY.md. Ziel: ein nachvollziehbarer Satz MCPs (gegen "1000 MCP-Leichen"), zentral als Container, FQDN-adressiert.

MikroMCP (MikroTik ap1/ap2)

REST-primär + guarded SSH; RouterOS-7-nativ; Safety: dry-run, plan_changes/apply_plan/rollback_change, Confirmation-Tokens, RBAC, Audit-Log. Image: ghcr.io/alikarami/mikromcp:latest.

Zwei Betriebsarten

  • A — lokal stdio (schnell, kein Netz-Exposure): läuft dort wo Claude läuft, RBAC = built-in superadmin, keine Tokens/Secret nötig. Gut für sofortige WLAN-Arbeit. Trotzdem in INVENTORY eintragen.
  • B — Docker HTTP auf Mac mini (zentral, Ziel): docker-compose.yml. Erfordert Confirmation-Secret + Bearer-Token-Identität. Endpoint später hinter NPM (FQDN+Auth).

RouterOS-User (beide APs) — NICHT admin verwenden

/user group add name=mcp policy=read,write,api,rest-api,test,ssh,sniff,!ftp,!policy,!password
/user add name=mcp-api group=mcp password=<stark>

(ftp nur falls upload_file gebraucht wird; sniff nur für torch. SSH-Dienst muss laufen für ping/traceroute/torch/run_command — REST blockt diese Befehle generell.)

B deployen (Mac mini 10.40.41.167)

openssl rand -hex 32                      # -> MIKROMCP_CONFIRMATION_SECRET
# identities.yaml aus identities.example.yaml bauen (Token: openssl rand -hex 32, dann bcrypt-Hash):
node -e "const b=require('bcryptjs');b.hash(process.argv[1],12).then(console.log)" <raw-token>

scp -r mcp/mikromcp 10.40.41.167:/opt/docker/mikromcp
ssh 10.40.41.167 'cd /opt/docker/mikromcp && cp .env.example .env'   # .env + config/identities.yaml füllen
ssh 10.40.41.167 'cd /opt/docker/mikromcp && docker compose up -d && docker compose logs --tail=50'

Smoke-Test: curl -s http://10.40.41.167:3000/health bzw. MCP-Initialize mit Bearer-Token.

In Claude Code einhängen

  • A (stdio): claude mcp add mikromcp -- npx -y mikromcp + ENV (MIKROMCP_CONFIG_PATH, ROUTER_AP1_USER/PASS, …).
  • B (http): claude mcp add --transport http mikromcp http://10.40.41.167:3000 (Header Authorization: Bearer <raw-token>). Nach FQDN: URL auf https://<fqdn> umstellen.

Wartet auf: Omada-Controller (≥6.1.x, ../../omada/docker-compose.yml, Ziel pve-LXC 10.40.41.126) up + ES208G adoptiert. Env: OMADA_BASE_URL, OMADA_CLIENT_ID/SECRET, OMADA_OMADAC_ID, OMADA_SITE_ID, OMADA_STRICT_SSL=false (self-signed). Tools: Switch-Ports/VLAN/Firewall CRUD. Details: INVENTORY.md.

Sicherheit (wichtig)

Ein MikroMCP/omada-mcp-HTTP-Endpoint kann Infrastruktur administrieren. Daher: nur auf LAN-IP binden, dedizierte Nicht-admin-User, Confirmation-Secret gesetzt, Audit-Log an, später NPM+Auth+TLS+FQDN davor.