runcoach
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RUNCOACH_TZ | No | IANA zone for 'which day was this run' | system zone |
| RUNCOACH_LOG | No | Log level — set INFO or DEBUG to watch a sync. INFO and DEBUG also log every HTTP request of the web app | WARNING |
| RUNCOACH_HOME | No | Data directory | ~/.runcoach |
| RUNCOACH_MODEL | No | Model for coach cards | CLI default |
| RUNCOACH_TOKEN | No | Required for --host 0.0.0.0 (phone in your home network) | |
| RUNCOACH_QUOTA_WAIT_S | No | How long a job waits for subscription quota | 3600 |
| RUNCOACH_GARMIN_TOKENS | No | Reuse an existing python-garminconnect token dir | ~/.runcoach/garmin |
| RUNCOACH_JOB_TIMEOUT_S | No | Hard timeout for a single coach job | 600 |
| RUNCOACH_LT_HISTORY_DAYS | No | How far back the lactate-threshold history is fetched | 180 |
| RUNCOACH_ACTIVITY_BACKFILL_DAYS | No | Minimum window of workouts a sync fetches (the ACWR fallback needs ~28 days) | 35 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_training_readinessA | Today's readiness verdict GO / EASY / REST with the signals behind it (HRV status, sleep score, Body Battery, resting HR vs 27-day baseline, ACWR, days since the last hard workout). Rule-based and conservative. START HERE for "should I train today?". Flags stale data explicitly. |
| get_recovery_summaryA | Averages of sleep, HRV, resting HR, stress, Body Battery and steps over the last N days plus a snapshot of the latest day. Use for "how has my recovery been?". Aggregates only — never a day-by-day list. |
| get_daily_metricsA | Every recorded recovery value for ONE day (default: latest day with data). Use when a single night/day is in question, not for trends. |
| get_trendA | Weekly averages of ONE recovery metric over the last N days — for "is my HRV / resting HR / sleep trending up or down?". |
| get_training_loadA | Training-load picture: ACWR with its SOURCE (Garmin's EWMA ratio, or a self-computed fallback that is less reliable), Garmin training status, VO2max with change, and weekly load buckets. VO2max change is only reported when the value actually varied (Garmin carries the last value forward). |
| get_recent_activitiesA | Workout digest: totals per sport plus the latest workouts, each run classified Quality / Long Run / Easy (from training effect and duration). Use to see what was actually trained before recommending the next session. |
| get_intensity_distributionA | Time in heart-rate zones across all runs (easy Z1-2 / moderate Z3 / hard Z4-5 / Z5) with percentages — the basis for the 80/20 polarisation question. States how many runs have zone detail, so an incomplete picture is visible. |
| analyze_workoutA | Deep dive into ONE run: time in each HR zone, interval structure (rep count, rep length, work vs recovery HR), weather, performance condition, plus rule-based notes. Default: the latest run with detail. The interval structure is Garmin's auto-detection — if the athlete states a different structure, the athlete is right. |
| get_vo2max_historyA | VO2max over the last 8 weeks as STEPS (only the days the value really changed — Garmin carries it forward in between) plus a descriptive comparison of the last 28 days with the 28 before (distance, Z5 minutes, easy share, temperature). Use for "why is my VO2max moving?". Descriptive, not causal. |
| sync_garminA | Pull the latest days and workouts from Garmin Connect NOW. Call this first when today's run or last night's sleep is missing. Takes 10-40 s. Read-only towards Garmin; writes only to the local database. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Each tool maps to a distinct analytical question: readiness verdict, aggregate recovery, single-day detail, trend, load, activity digest, intensity split, single-workout analysis, VO2max history, and sync. Overlapping data sources are explicitly scoped in the descriptions, so an agent can reliably pick the right one.
Nine of ten tools follow the uniform get_<domain> pattern, and the one exception (sync_garmin) is a clearly distinct imperative action. There is no mixing of naming styles or vague generic verbs.
Ten tools is a well-scoped number for a running/recovery analytics server. Each tool covers a distinct data-retrieval concern and none feels redundant or unnecessary.
The surface thoroughly covers retrospective training and recovery analysis: readiness, load, trends, activities, intensity, and single-workout details. The main gap is forward-looking coaching functionality such as workout prescription or race prediction, but the stated analytics workflows are essentially complete.