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:
- Ask My Health startet einen MCP-Endpoint auf dem iPhone.
- Codex verbindet sich und liest die Beschreibungen der verfügbaren HealthKit- und WorkoutKit-Tools.
- Codex fragt den gewählten Trainingszeitraum ab.
- Codex trennt gemessene, abgeleitete und fehlende Werte.
- Codex baut daraus ein Workout mit Aufwärmen, Belastungsblöcken, Erholung und Zielwerten und lässt den Plan von Ask My Health validieren.
- 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.
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.
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.
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.
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.