apple-workouts-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| STRAVA_TOKENS | No | Path to the Strava token cache file. | ~/.hooda-workouts/strava_tokens.json |
| MCP_AUTH_TOKEN | No | Bearer token that gates the remote MCP, feed, and status routes. Required for remote deployment. | |
| STRAVA_CLIENT_ID | No | Strava API client ID. Optional; set with STRAVA_CLIENT_SECRET to enable Strava history tools. | |
| WORKOUT_FEED_DIR | No | Overrides the default iCloud Drive › HoodaRun › MCP workout feed directory. | |
| STRAVA_CLIENT_SECRET | No | Strava API client secret. Optional; set with STRAVA_CLIENT_ID to enable Strava history tools. |
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 |
|---|---|
| list_activitiesB | Recent activities from Strava (read-only): id, name, type, start, distance, HR. |
| assess_fitnessB | Read-only: summarise recent training (from Strava), and size the gap to a marathon goal. With |
| list_scheduledB | Workouts in the feed (optionally within [start_date, end_date]), each marked with whether HoodaRun has confirmed it's scheduled on the Watch. |
| sync_statusA | What HoodaRun last reported: when it synced, what's on the Watch, what's waiting for a free slot (WorkoutKit caps scheduled workouts), and errors. |
| preview_workoutA | Compile a workout or strength spec and return the exact WorkoutKit-shaped JSON HoodaRun would receive, without publishing anything. |
| create_workoutA | Create a structured running workout and schedule it for a date. schedule_date is 'YYYY-MM-DD'; time is optional 24h 'HH:MM'. The same name on the same date overwrites instead of duplicating. Targets: 'hr:2' (HR zone) or 'pace:6:35-6:55' (min/mi window); durations '15:00', '1mi', '400m', 'open'. Set spec.location='indoor' for treadmill sessions. |
| create_strength_workoutB | Create a guided strength/core workout and schedule it for a date. Each exercise takes |
| unschedule_workoutA | Remove one workout from the feed by id; HoodaRun removes it from the Watch at its next sync. |
| clear_scheduledA | Remove every feed workout in [start_date, end_date] inclusive. Destructive. Defaults to dry_run=True — call again with dry_run=False to commit. Only touches workouts this server published; workouts made in HoodaRun's own builder are never removed. |
| create_training_planA | Publish a multi-week plan you wrote yourself.
|
| create_marathon_planA | Build a marathon block for ANY race and ANY goal, scaled to current fitness. Reads recent Strava history (unless |
| create_hs_track_planB | Build a high-school track block: 800 / 1600 / 3200 / 5k.
|
| list_marathonsC | Marathons in the catalogue whose next running falls inside the window. Dates come from each race's scheduling rule — confirm with the organiser. |
| pick_random_marathonC | Pick a marathon at random from the catalogue — the 'surprise me' path. |
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 14 tools
Most tools have clearly distinct purposes: feed reads (list_scheduled, sync_status), feed mutations (unschedule_workout, clear_scheduled), and creation tools are well separated. The only real overlap is among the plan builders (create_training_plan vs create_marathon_plan vs create_hs_track_plan) — an agent could plausibly reach for the generic plan publisher when a marathon or track block is wanted, though the descriptions do clarify.
Almost all names are snake_case verb_noun (create_workout, list_scheduled, preview_workout, clear_scheduled). Minor deviations: sync_status is noun-only and pick_random_marathon is verb_adj_noun, but overall the pattern is predictable.
14 tools sit comfortably in the ideal band for a workout scheduling/generation server. Each tool covers a genuine capability — read feed, mutate feed, preview, sync, plan generation, catalogue — with no filler.
Lifecycle coverage is strong: create, preview/validate, list, unschedule single, clear range, plus sync status and plan publishing. Gaps are minor — no explicit get-by-id or update-existing-workout tool, though same-name/date overwrite and unschedule-then-recreate provide workarounds.