--- name: wearable-health-mcp description: "Use when: Wearables-Daten (COROS) ueber MCP-CLI integrieren." version: 1.0.0 author: mehlzoerwer platforms: [linux] models: default: mimo-v2-flash license: MIT related_skills: [pocketbase-deployment, content-creator] --- # Wearable-Health-MCP (COROS u.a.) ## When to Use Nutze diesen Skill, wenn Wearable-/Gesundheitsdaten (z.B. **COROS-Sportuhr**) über einen **MCP-Gateway-CLI** abgefragt und in eine App/Backend (z.B. PersoEnt) integriert werden sollen — um korrekte CLI-Flag-Syntax, Browser-Login und Token-Sicherheit zu kennen, ohne sie neu zu erkunden. > **Use when:** Gesundheits-/Trainingsdaten eines Wearables (Sportuhr) über einen MCP-Gateway-CLI abziehen und in eine App/Backend integrieren. Derzeit konkret: **COROS → PersoEnt** über das offizielle `coros-mcp`-Paket. ## Was es ist `coros-mcp` (npm, **offiziell von COROS**: maintainer `coros_openplatform`) ist eine TypeScript-CLI zum MCP-Gateway `https://mcp.coros.com` (Europa: `https://mcpeu.coros.com`). Login + MCP-Tool-Aufrufe. **Kein zusätzlicher Cloud-Fremdkostenpflicht-Call nötig innerhalb des Rahmenbudgets — der Hersteller stellt es gratis.** ## Installation ```bash npm install -g coros-mcp # installiert bin /usr/local/bin/coros-mcp ``` ## Login (Browser-Auth, 1x) ```bash coros-mcp login-start # gibt Link: https://mcpeu.coros.com/cli/login/ # Nutzer öffnet Link im Browser, loggt sich ins COROS-Konto ein coros-mcp login-finish # → "login ok", Token gecacht coros-mcp login-status # "no pending login session" wenn fertig coros-mcp logout # Cache leeren ``` Der Login ist ein OAuth-ähnlicher browser flow; nur das echte COROS-Konto kann ihn abschließen (Client-ID/Secret werden NICHT manuell konfiguriert). ## 🔥 CLI-Flag-Syntax (VERIFIZIERT 2026-08-15 — häufigste Fehlerquelle) **Beachte exakt diese Flags — ANDERE Varianten scheitern mit `unknown argument`:** ```bash # Tools auflisten (JSON-Array mit name/description/inputSchema) coros-mcp list-tools # Ein Tool-Schema anzeigen: coros-mcp describe-tool --tool # Tool AUFRUFEN — Argumente als --arguments-json (WICHTIG: nicht --args!) : coros-mcp call-tool --tool --arguments-json '' ``` **Getestete Fehlversuche (real aufgetreten):** `--args`, `--name`, `--tool`-ohne-`--arguments-json`, reine Positionsargumente → alle `error: unknown argument`. Das `--help` auf Unterbefehle zeigt nur die HAUPT-Hilfe (nicht die Flag-Struktur). **Verlässliche Quelle bei Unklarheit: Packagedatei lesen** `grep -n "call-tool|--tool|--arguments-json" $(npm root -g)/coros-mcp/dist/*.js` — dort steht die echte Sub-Kommando-Logik. ## Verifizierte Tools (22, Stand 2026-08-15) | Gruppe | Tools (Beispiele) | |--------|-------------------| | Schlaf | `querySleepData` (Score/Dauer/Phasen), `querySleepHrv` (avg+Range+Baseline) | | Herz | `queryAvgHeartRate`, `queryRestingHeartRate` | | Stress | `queryStressLevel`, `queryStressTimeSeries` | | Gesundheit | `queryDailyHealthData` (Schritte/Kalorien/Exercise), `queryHealthCheckTimeSeries` (Roh-HR+HRV+Stress+Atmung) | | Sport | `querySportRecords`, `getActivityDetail`, `queryActivityLapData`, `queryCustomActivityLapData`, `analyzeActivityDetail` (Coach-Style), `downloadActivityFitFiles`, `queryActivityFitFileDownloadUrls` | | Fitness | `queryFitnessAssessmentOverview` (VO2max/Threshold-Pace), `queryTrainingLoadAssessment`, `queryRecoveryStatus` (%), `queryTrainingSchedule` | | Profil/Geräte | `queryUserInfo` (Größe/Gewicht/Geburt/Geschlecht), `queryDevices`, `queryMenstruationCycles` | **Detektiv-Priorität für Kausal-Analyse (Team-Review 2026-08-15):** P0=HRV + Schlaf, P1=Stress + Erholung, P2=Ruhe-HR + VO2max, P3=Sport/FIT. ## 🔒 Token-Sicherheit (Team-Auflage 2026-08-15) - Token liegt in `//token.json` (d.h. `/root/.coros-mcp-skill-gateway-ts/eu/token.json`) — **im Klartext**. - Die CLI LIEST es selbst aus diesem Cache → **nicht verschlüsseln an Ort**, sonst bricht die CLI. Stattdessen: - `chmod 600` token.json UND `chmod 700` Cache-Verzeichnisse (root-only) - **Verschlüsselte Sicherungskopie** anlegen: `age` installieren, `age-keygen -o /root/.coros-age-key.txt`, dann `age -r -o /root/.coros-token.json.age ` → Datei beginnt mit `age-encryption.org/v1`. - **Niemals Token in Logs/env** — nur zur Laufzeit vom Cache einlesen. - Single-User-PersoEnt = kleine Angriffsfläche (kein Multi-User-Token-Management nötig). ## Architektur-Empfehlung (Team-Review 2026-08-15) Für Uhren-Health (= tagesbasiert, nicht Echtzeit) **Cron-Poller 1×/Tag (03:00)** → Daten in PocketBase/Backend schreiben; **Live-UI liest NUR aus Backend**, nie Live-COROS (Entkopplung + Rate-Limit + Offline-Fähigkeit). Upsert pro (Datum, Datentyp). ⚠️ **Noch NICHT umgesetzt (Stand 2026-08-15):** der eigentliche Poller-Skript (COROS→PocketBase Write) war zum Sitzungsende noch nie fertig — die PocketBase-Auth-Token-Abfrage blockierte auf Nutzer-Freigabe. Vorgehen siehe nächster Abschnitt. ## Nächster Schritt (noch offen) 1. PersoEnt PocketBase-Login (Auth-Token holen) — **erfordert Nutzer-Freigabe** (sensible Login-Lösung) 2. Collection `health_records`-Schema prüfen (Felder: weight, blood_pressure, pulse, user_id lt. pocketbase-deployment) 3. Poller-Skript: `coros-mcp call-tool --tool querySleepHrv --arguments-json '{}'` je Tag → upsert in PocketBase 4. PersoEnt-Dashboard/Detektiv liest daraus ## Referenzen - `references/coros-tools-inventory.md` — vollständige 22-Tool-Beschreibungen (Detaildichte)