Ich wollte Codex auf meinem Mac einen einfachen Auftrag geben: Schau dir meine letzten Radtrainings an und plane ein sinnvolles Workout für morgen. Nicht als Vorschlag im Chat, den ich anschließend von Hand nachbauen muss. Das fertige Workout soll in der Workout-App auf meiner Apple Watch liegen.

Die Daten dafür liegen in HealthKit auf dem iPhone. Codex läuft auf dem Mac. Ask My Health verbindet beides über einen lokalen MCP-Server.

Vom Prompt zum Apple-Watch-Workout

Der Ablauf sieht so aus:

  1. Ask My Health startet einen MCP-Endpoint auf dem iPhone.
  2. Codex verbindet sich und liest die Beschreibungen der verfügbaren HealthKit- und WorkoutKit-Tools.
  3. Codex fragt den gewählten Trainingszeitraum ab.
  4. Codex trennt gemessene, abgeleitete und fehlende Werte.
  5. Codex baut daraus ein Workout mit Aufwärmen, Belastungsblöcken, Erholung und Zielwerten und lässt den Plan von Ask My Health validieren.
  6. Erst nach meiner Bestätigung plant Ask My Health das Workout über WorkoutKit ein.

Danach erscheint es in der Workout-App auf der Apple Watch.

Der Umweg über die Daten ist Absicht. Ich wollte keinen KI-Coach, der aus einem kurzen Prompt irgendeine Intervalleinheit erfindet. Bevor ein Plan entsteht, soll Codex die letzten Einheiten zeigen, Datenlücken markieren und seine Annahmen nennen.

Umfang ist nicht Belastung

Bei Radtraining reicht „drei Fahrten, 180 Kilometer“ nicht als Analyse. Ich brauche mehrere Ebenen:

  • Umfang: Dauer, Distanz und Häufigkeit beschreiben, wie viel trainiert wurde.
  • Externe Belastung: Leistung, Tempo oder Höhenmeter beschreiben die mechanische Arbeit.
  • Interne Belastung: Herzfrequenz oder daraus abgeleitete Werte wie TRIMP beschreiben die körperliche Reaktion.
  • Erholungskontext: HRV und Ruhepuls können den Verlauf ergänzen, wenn sie regelmäßig und unter vergleichbaren Bedingungen gemessen wurden.

Diese Werte sind nicht austauschbar. Zwei 90-minütige Fahrten können völlig unterschiedliche Leistungskurven haben. Dieselbe Leistung kann je nach Herzfrequenzreaktion ebenfalls etwas anderes bedeuten. Auch in der Forschung hängt der Zusammenhang zwischen internen und externen Belastungsmaßen von Messgröße und Trainingsform ab.

Ask My Health gibt diese Ebenen deshalb getrennt aus. Es gibt keinen Gesamtscore, der alle Unterschiede versteckt. Und wenn Leistung, Herzfrequenz oder Kadenz fehlen, ist das kein Nullwert. Die Daten fehlen.

Fehlende Daten sind ein Befund

Bei TSS werde ich pingelig. Für eine leistungsbasierte Berechnung werden Dauer, Normalized Power, Intensity Factor und FTP benötigt. Die von TrainingPeaks dokumentierte Formel lautet:

TSS = (Sekunden × NP × IF) / (FTP × 3600) × 100

Ohne Leistungskurve oder mit einem veralteten FTP-Wert will ich keine TSS sehen. Eine Zahl mit zwei Nachkommastellen wäre dann nur präzise formatierter Unsinn. training_compute_load_metrics meldet stattdessen, welche Eingaben fehlen.

Bei HRV gilt dasselbe. Ein einzelner Wert entscheidet nicht, ob morgen ein hartes oder lockeres Training ansteht. Interessanter sind Abweichungen vom persönlichen Verlauf unter vergleichbaren Messbedingungen. Welche Baseline- und Mittelungsverfahren dafür am besten funktionieren, ist selbst in der Forschung nicht abschließend geklärt.

Ich nutze HRV und Ruhepuls als Kontext, nicht als Schalter. Müdigkeit, Krankheitssymptome und Schmerzen stehen ohnehin nicht vollständig in HealthKit.

Ask My Health ist keine Medizin-App. Die Tools analysieren Trainingsdaten und bereiten Workouts vor; sie liefern keine Diagnose und keine medizinische Empfehlung.

HealthKit über MCP abfragen

Codex auf dem Mac kann HealthKit auf dem iPhone nicht direkt abfragen. Ask My Health stellt dafür ausgewählte Operationen als MCP-Tools bereit:

healthkit_get_authorization_status
healthkit_request_read_authorization
healthkit_query_workouts
training_compute_load_metrics

Beim Verbindungsaufbau sieht Codex die Tool-Beschreibungen und JSON-Schemas. Jeder Request nennt eine Operation und deren Argumente, zum Beispiel Sportart und Zeitraum. Ask My Health prüft das Token, führt die passende HealthKit-Abfrage auf dem iPhone aus und gibt das Ergebnis als MCP-Response zurück.

Mehr Zugriff bekommt Codex nicht. HealthKit bleibt die Berechtigungsgrenze. Was auf dem iPhone nicht freigegeben oder nicht vorhanden ist, kann der MCP-Server auch nicht liefern.

Die Verbindung zu Codex

Ask My Health stellt im lokalen Netzwerk einen Streamable-HTTP-Endpoint bereit. Die Konfiguration liegt global in ~/.codex/config.toml oder projektspezifisch in .codex/config.toml:

[mcp_servers.ask_my_health]
url = "http://<lokale-iphone-ip>:8787/mcp"
bearer_token_env_var = "ASK_MY_HEALTH_TOKEN"
default_tools_approval_mode = "prompt"

Streamable HTTP, Bearer-Token und default_tools_approval_mode sind in der Codex-Dokumentation zu MCP beschrieben. Mit prompt fragt Codex standardmäßig vor jedem Tool-Aufruf nach.

In der TOML-Datei steht nur der Name der Umgebungsvariable. Das eigentliche Token kommt aus der Prozessumgebung von Codex. Der Endpoint verwendet HTTP, nicht HTTPS. Das Token authentifiziert den Client, verschlüsselt aber nicht den Transport. Deshalb nutze ich den Server nur in einem vertrauenswürdigen lokalen Netz und rotiere das Token nach Demos.

Ask-My-Health-Serveransicht mit unkenntlich gemachten lokalen Netzwerkdaten und Bearer-Token
Die Serveransicht zeigt Endpoint, Token, Framework-Verfügbarkeit und ausstehende Freigaben. Adresse und Token sind unkenntlich gemacht.

Der Prompt als Analyseprotokoll

Mein Prompt klingt eher nach Analyseauftrag als nach Coaching-Frage:

Nutze ausschließlich den MCP-Server ask_my_health.

1. Prüfe den HealthKit-Autorisierungsstatus.
2. Lies nur Radtrainings der letzten 14 Tage.
3. Vergleiche die letzten 7 Tage mit den 7 Tagen davor.
4. Liste für jede Einheit Dauer, Distanz, Leistung, Herzfrequenz
   und Kadenz auf, soweit vorhanden.
5. Trenne gemessene, abgeleitete und fehlende Werte.
6. Berechne Lastmetriken nur bei vollständigen Pflichtfeldern und
   nenne die verwendeten Schwellenwerte.
7. Schlage genau ein strukturiertes Workout für morgen vor und
   begründe es aus den vorhandenen Daten.
8. Validiere den Plan mit WorkoutKit.

Zeige Datengrundlage, Annahmen und vollständigen Plan vor jedem
Schreibvorgang. Rufe workoutkit_schedule_workout erst nach meiner
ausdrücklichen Bestätigung auf. Erfinde keine fehlenden Werte und
gib keine medizinische Einschätzung.

Die zwei Sieben-Tage-Blöcke sind nur ein schneller Vergleich von Umfang und Intensität. Für eine längerfristige Trainingssteuerung würde ich größere Zeiträume, Trainingsphasen und persönliche Schwellenwerte einbeziehen.

Prompt-Bibliothek in Ask My Health mit unkenntlich gemachter lokaler Adresse
Die Prompt-Vorlagen definieren Datenbereich, Vergleichsfenster, fehlende Werte und den Freigabepunkt.

Aus dem Vorschlag wird ein Workout

Die Analyse verwendet lesende HealthKit-Tools. Für das Workout gibt es eigene WorkoutKit-Tools:

workoutkit_get_capabilities
workoutkit_get_authorization_status
workoutkit_validate_workout_plan
workoutkit_schedule_workout

Codex schickt Aufwärmen, Belastungsblöcke, Erholung und Zielwerte zuerst an workoutkit_validate_workout_plan. Das Tool prüft, ob sich der Vorschlag als WorkoutKit-Plan abbilden lässt. Eingeplant wird dabei noch nichts.

workoutkit_schedule_workout darf erst nach meiner ausdrücklichen Freigabe laufen. Im Ablauf gibt es deshalb zwei Stopps: Codex fragt vor dem Tool-Aufruf nach, und Ask My Health zeigt den vorbereiteten Plan noch einmal auf dem iPhone. Erst danach geht er an Apples Systemablauf und weiter zur Apple Watch.

Planansicht in Ask My Health mit WorkoutKit-Unterstützung und vorbereiteten Workouts
Der vorbereitete WorkoutKit-Plan wartet auf die Freigabe am iPhone. Danach übernimmt Apples Systemablauf die Synchronisation zur Apple Watch.

Lokal heißt nicht offline

Ask My Health braucht für die Verbindung kein eigenes Cloud-Backend. „Lokaler MCP-Server“ beschreibt allerdings nur, wo der Endpoint läuft.

Die Tool-Ergebnisse werden Teil des aktuellen Codex-Tasks. Wie sie gespeichert und aufbewahrt werden, hängt von der verwendeten Codex-Oberfläche, dem Konto und dessen Einstellungen ab. Deshalb frage ich nur die Sportart, den Zeitraum und die Felder ab, die ich für den Plan brauche.

Für mich ist genau das der interessante Teil: Codex plant ein echtes Apple-Watch-Workout, aber die Datengrundlage bleibt sichtbar. Wenn Leistung, FTP oder HRV fehlen, muss Codex diese Lücke im Vorschlag nennen. Danach kann ich ihn annehmen, ändern oder verwerfen.