The read side goes past the app's summary screens: get_activity_typed_splits breaks a trail run into ClimbPro climb segments with Grade Adjusted Pace, and get_lactate_threshold and get_activity_hr_zones return the numbers that Norwegian double-threshold and 80/20 plans are built on. The write side is a single call — create_running_workout takes warmup, interval, recovery and repeat steps with pace, heart-rate, cadence or power targets and uploads them for the watch to sync. Every Garmin response passes through strip_pii() first, which removes owner names, profile ids and the start and end GPS coordinates before the model sees them.
A Garmin Connect client built around running, with 24 tools covering activity detail down to the split, weekly and monthly volume, training and HRV metrics, sleep and Body Battery, shoe mileage, and a workout builder that uploads to Garmin.
- Activities at split resolution: get_recent_activities lists runs up to a count capped at 100, get_activities_by_date takes a start_date and end_date, and get_activity_detail, get_activity_splits and get_activity_hr_zones open one run's stamina, per-kilometre splits and heart-rate zone distribution — 47 fields in all, from pace and cadence through running dynamics, power, Grade Adjusted Pace and gradient.
- Trail runs read as terrain rather than one average: get_activity_typed_splits returns ClimbPro climb segments with their grade and Grade Adjusted Pace, and get_activity_weather returns the temperature, humidity and wind the run happened in.
- Volume trends without a spreadsheet: get_weekly_running_summary aggregates over weeks capped at 12, and get_monthly_running_summary returns a month alongside its comparison with the one before.
- Training metrics against your own baseline: get_training_status and get_training_readiness for a date, get_vo2max_and_fitness for VO2 max and fitness age, get_race_predictions for 5K, 10K, half and full marathon times, and get_lactate_threshold for threshold heart rate and pace across a date range.
- Recovery in its own tools: get_heart_rate_data and get_hrv_data for a date, get_sleep_data for the night, get_daily_wellness for stress, Body Battery, SpO2 and respiration, and get_weekly_wellness_summary over weeks capped at 4.
- Records, goals and gear: get_personal_records covers 1K through marathon, get_goals filters by active, completed or all, and get_running_gear returns each pair of shoes with its cumulative distance and wear rate.
- create_running_workout assembles a structured session from warmup, interval, recovery, rest, cooldown and repeat steps — each ending on duration_seconds or distance_meters, each able to target pace, heart_rate, cadence or power — and uploads it to Garmin for the watch to pick up; get_workouts lists what is already saved.
Python 3.10+, the uv package manager, and a Garmin Connect account. Authenticate once with scripts/auth.py, which prompts for an MFA code when the account uses one and stores OAuth tokens in ~/.garminconnect/; putting GARMIN_EMAIL and GARMIN_PASSWORD in .env lets an expired token refresh itself instead of prompting again.
