garmin-connect-health

Fetch health and fitness data from Garmin Connect -- 40+ metrics including sleep, HRV, stress, body battery, SpO2, VO2 Max, training status, and activities. Stores data locally as JSON.

install
source · Clone the upstream repo
git clone https://github.com/dw1161/garmin-connect-health
Claude Code · Install into ~/.claude/skills/
git clone --depth=1 https://github.com/dw1161/garmin-connect-health ~/.claude/skills/dw1161-garmin-connect-health-garmin-connect-health
manifest: SKILL.md
source content

Garmin Connect Health Data Skill

Fetch comprehensive health & fitness data from Garmin Connect for your AI agent.

Data Coverage

CategoryFields
ActivitySteps, distance, calories (active + BMR), floors, intensity minutes
Heart RateMin/max/resting heart rate
SleepDuration, score, deep/light/REM/awake breakdown, stress during sleep
HRVLast night avg, 5min peak, weekly avg, status (balanced/unbalanced), baseline
Body BatteryCurrent level, daily min/max
SpO2Average and minimum blood oxygen
RespirationWaking and sleep breathing rate
StressAverage/max, rest/low/medium/high duration breakdown
Training StatusOverreaching/Highly Active/Productive/Maintaining/Recovery/Detraining + acute/chronic load ratio
Training ReadinessScore (0-100)
Fitness MetricsVO2 Max, fitness age, endurance score, hill score
Race Predictions5K/10K/Half/Marathon predicted times
Weight/Body CompWeight (kg), body fat %, BMI (requires Garmin Index scale)
HydrationIntake (ml) vs goal
ActivitiesIndividual workouts with HR, duration, calories, elevation, training effect
Weekly SummaryTotal/avg steps for the week

Setup

1. Install dependency

pip install garminconnect

2. Set credentials (choose one method)

Option A -- Environment variables:

export GARMIN_EMAIL="you@example.com"
export GARMIN_PASSWORD="yourpassword"

Option B -- CLI args:

python3 garmin_health.py --email you@example.com --password yourpassword

Option C -- macOS Keychain:

security add-generic-password -a "you@example.com" -s "garmin_connect" -w "yourpassword"

Option D -- Credentials file:

echo -e "email=you@example.com\npassword=yourpassword" > ~/.garmin_credentials
chmod 600 ~/.garmin_credentials

3. Set region (China accounts only)

If your Garmin account was registered in China, add this to your shell profile (

~/.zshrc
/
~/.bashrc
) once:

export GARMIN_IS_CN=true

This tells the skill to use

connect.garmin.com.cn
instead of the global endpoint -- more reliable for mainland China IPs and prevents 429 rate-limit errors. Skip this step if you have a global Garmin account.

4. First run

First login may require MFA verification. You'll be prompted to enter a code sent to your email.

5. Use with OpenClaw

Ask your AI agent:

  • "Show my health data"
  • "How did I sleep last night?"
  • "What's my HRV?"
  • "Am I overtraining?"

Usage

# Fetch today's data (default)
python3 garmin_health.py

# Fetch specific date
python3 garmin_health.py --date 2026-03-16

# Show latest cached data
python3 garmin_health.py --show

# Use Garmin Connect CN endpoint (Chinese accounts / mainland China IP)
python3 garmin_health.py --cn

# With credentials
python3 garmin_health.py --email you@example.com --password pass

Data Storage

  • ~/.garmin_health/YYYY-MM-DD.json
    -- Daily snapshots
  • ~/.garmin_health/latest.json
    -- Most recent fetch
  • ~/.garminconnect/
    -- OAuth token cache

Override with env vars:

  • GARMIN_DATA_DIR
    -- Change data directory
  • GARMIN_TOKENSTORE
    -- Change token cache directory
  • GARMIN_IS_CN=true
    -- Use Garmin Connect CN endpoint (set once in shell profile)

Supported Languages

All labels and output in English. JSON field names are English by design.

Security & Privacy

  • Your credentials only -- this skill authenticates with Garmin Connect using your own account credentials. No credentials are shared with or stored by this skill.
  • Local storage only -- all fetched health data is saved as JSON files on your own machine. No data is sent to any third party.
  • Token caching -- after first login, an OAuth token is cached locally (
    ~/.garminconnect/
    ). Subsequent runs reuse this token and do not re-send your password.
  • Recommended auth -- use macOS Keychain or environment variables rather than
    --password
    CLI flag to avoid password exposure in shell history.
  • Official API only -- all requests go directly to
    connect.garmin.com
    (or
    connect.garmin.com.cn
    for CN accounts). No proxies or intermediaries.

Requirements

  • Python 3.10+
  • garminconnect
    library
  • A Garmin Connect account
  • Device: Any Garmin watch/fitness tracker synced to Garmin Connect