# Triathlon Coach Skill

> Triathlon coach skill for Claude Code: pulls swim/bike/run + recovery data from connected fitness MCP servers (Garmin, Strava, Coros, Whoop, Oura, ...), computes CTL/ATL/TSB, ACWR & 80/20 distribution deterministically, and recommends your next session - with hard safety guardrails.

- **Type:** MCP server
- **Install:** `agentstack add mcp-henrikbrehm-triathlon-coach-skill`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [HenrikBrehm](https://agentstack.voostack.com/s/henrikbrehm)
- **Installs:** 0
- **Category:** [Integrations](https://agentstack.voostack.com/c/integrations)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [HenrikBrehm](https://github.com/HenrikBrehm)
- **Source:** https://github.com/HenrikBrehm/triathlon-coach-skill

## Install

```sh
agentstack add mcp-henrikbrehm-triathlon-coach-skill
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# triathlon-coach

A Claude Code Agent Skill that turns raw data from your connected fitness MCP servers into a structured triathlon training analysis and a concrete next-session recommendation.

## What it does

When you ask Claude about your training ("How is my form?", "What should I train today?"), the skill pulls your recent activities and wellness data from every connected fitness MCP server, normalizes it into a canonical schema, and produces a coach-style report with these sections:

1. **Snapshot** — fitness (CTL), fatigue (ATL), form (TSB), recovery status in one sentence
2. **Discipline breakdown** — swim/bike/run volume, intensity, trend, balance check
3. **Load & recovery trends** — CTL/ATL/TSB, ACWR, HRV/RHR/sleep trends
4. **Flags** — overtraining, illness, injury, monotony, and load-spike signals
5. **Next session** — discipline, type, duration, target zone, with a data-based rationale
6. **Block recommendation** — where you are in the training cycle and what to adjust
7. **Data coverage & gaps** — which sources and time window were used, what was missing

All numeric metrics are computed deterministically by a bundled Python script (`scripts/compute_metrics.py`) — the model never estimates training-load math in its head. Same input, same output, every time.

## How it works

```
discover fitness MCP servers
        |
        v
pull activities + wellness (last 42-90 days, all sources)
        |
        v
normalize into canonical JSON schema
        |
        v
deduplicate cross-source double counts
        |
        v
scripts/compute_metrics.py  (deterministic: PMC, ACWR, monotony, intensity, recovery)
        |
        v
coach report + next-session recommendation (in your language)
```

The skill ships with reference files (zones, training load, recovery, periodization, data-source mapping, glossary) that Claude loads on demand to interpret the script output.

## Supported data sources

The skill is source-agnostic. It discovers connected MCP servers by name pattern and works with any server that exposes activities and/or wellness data, including servers for:

Garmin Connect, Strava, Coros, Polar, Suunto, Wahoo, Whoop, Oura, intervals.icu, TrainingPeaks, Fitbit

If a source lacks a metric (e.g. no power data, no HRV), the skill degrades gracefully: it falls back to the next available load-estimation method (power → pace → heart rate → session RPE) and reports every gap explicitly instead of guessing.

## Requirements

- Claude Code, or claude.ai with custom skills enabled
- Python 3.9+ on PATH (the metrics script uses the standard library only — no pip installs)
- At least one fitness MCP server connected and authenticated

## Installation

### Claude Code

Copy the skill directory into your skills folder:

```bash
# personal scope (all projects)
cp -r skills/triathlon-coach ~/.claude/skills/

# or project scope (this project only)
cp -r skills/triathlon-coach .claude/skills/
```

### claude.ai

Zip the `skills/triathlon-coach/` directory and upload it as a custom skill in your claude.ai settings (Capabilities → Skills).

## Usage

Ask in English or German — the report is rendered in the language you use:

- "How is my form? Am I ready to add intensity this week?"
- "Weekly training report, please."
- "What should I train today?"
- "Wie ist mein Formstand?"
- "Was soll ich heute trainieren?"
- "Mach mir eine Trainingsanalyse der letzten sechs Wochen."

## What gets computed

All of the following come from `compute_metrics.py` — script-computed, never estimated by the model:

| Metric group | Contents |
|---|---|
| PMC | CTL (fitness), ATL (fatigue), TSB (form), daily series + ramp rate |
| ACWR | Acute:chronic workload ratio, rolling (7d/28d) and EWMA variants |
| Monotony & strain | Foster weekly monotony and strain |
| Intensity distribution | 80/20 low/moderate/high split from time-in-zone or session averages |
| Training load | Per-activity TSS via power, pace, heart rate, TRIMP, or session-RPE fallbacks |
| Recovery | HRV, resting HR, and sleep 7-day trends vs 28-day baselines |
| Flags | ACWR spikes, high monotony, fast CTL ramp, very low TSB, suppressed HRV, combined recovery alerts |

## Repository layout

```
README.md
LICENSE
skills/triathlon-coach/
├── SKILL.md                                  # skill entry point (workflow, report template, guardrails)
├── references/
│   ├── zones-and-thresholds.md               # FTP/LTHR/CSS/pace zone systems
│   ├── training-load-and-pmc.md              # TSS variants, CTL/ATL/TSB, ACWR, monotony
│   ├── recovery-and-readiness.md             # HRV, RHR, sleep, recovery scores
│   ├── periodization-and-planning.md         # blocks, tapering, session selection
│   ├── data-sources-and-normalization.md     # per-source field mapping, dedup rules
│   └── glossary.md                           # one-paragraph metric definitions
└── scripts/
    ├── compute_metrics.py                    # deterministic metrics engine (stdlib only)
    └── example_input.json                    # synthetic fixture for testing
```

## Disclaimer

This skill is decision support, not medical advice, and not a substitute for a physician or a certified coach. Your subjective feel and RPE always override the numbers — if the data says "go hard" and your body says otherwise, listen to your body. The skill never recommends training through pain, injury, or illness.

The skill adds no third-party services: it only reads from MCP servers you have connected yourself, and the bundled metrics script runs locally on your machine. Data pulled from your fitness accounts is processed in your Claude conversation like any other conversation content.

## License

MIT — see [LICENSE](LICENSE).

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [HenrikBrehm](https://github.com/HenrikBrehm)
- **Source:** [HenrikBrehm/triathlon-coach-skill](https://github.com/HenrikBrehm/triathlon-coach-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-henrikbrehm-triathlon-coach-skill
- Seller: https://agentstack.voostack.com/s/henrikbrehm
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
