Skip to main content
Glama
yashhooda1

apple-workouts-mcp

by yashhooda1

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
STRAVA_TOKENSNoPath to the Strava token cache file.~/.hooda-workouts/strava_tokens.json
MCP_AUTH_TOKENNoBearer token that gates the remote MCP, feed, and status routes. Required for remote deployment.
STRAVA_CLIENT_IDNoStrava API client ID. Optional; set with STRAVA_CLIENT_SECRET to enable Strava history tools.
WORKOUT_FEED_DIRNoOverrides the default iCloud Drive › HoodaRun › MCP workout feed directory.
STRAVA_CLIENT_SECRETNoStrava 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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 goal_time ('3:15:00') and race_date ('2027-04-19') also returns what the goal asks for, what a safe ramp reaches, and — when those disagree — the goal this runway does support.

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 reps (an open set you end with the Action button) or hold ('45s', timed), plus sets and rest_s. Each set shows on the Watch by name, e.g. 'Romanian Deadlift · 8 reps', with a timed rest between sets.

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.

items is a list of {"date": "YYYY-MM-DD", "spec": } — a spec with exercises is strength, otherwise running. Re-pushing the same plan name updates it in place, and (replace=True) drops sessions from the earlier push that are no longer in the plan. dry_run=True validates and reports without publishing.

create_marathon_planA

Build a marathon block for ANY race and ANY goal, scaled to current fitness.

Reads recent Strava history (unless use_strava_history=False or current_weekly_miles is supplied), compares it to what the goal asks for, and ramps from where the runner actually is — 8%/week ceiling, 3-up-1-down, 3-week taper, ending on race day. If the goal doesn't fit the runway, the plan targets the goal that does and says so; force_goal=True overrides. Two strength sessions a week; weekly fuelling/recovery guidance in the report. dry_run=True validates without publishing.

create_hs_track_planB

Build a high-school track block: 800 / 1600 / 3200 / 5k.

goal_time defaults to the barrier — sub-2:00 800, sub-4:30 1600, sub-10:00 3200, sub-15:00 5K. With current_pr the report sizes the gap honestly. training_age ('new' | 'developing' | 'experienced') sets a hard mileage ceiling; Sunday is always rest; no doubles; nutrition guidance is adequacy-only. Take it to the athlete's school coach before running it. dry_run=True validates without publishing.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.5/5.0

Scored across 14 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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.

Maintenance

ActivityMaintained
ResponsivenessNo issues