Install
openclaw skills install @dw1161/garmin-connect-healthFetch 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 and SQLite.
openclaw skills install @dw1161/garmin-connect-healthFetch comprehensive health & fitness data from Garmin Connect for your AI agent.
| Category | Fields |
|---|---|
| Activity | Steps, distance, calories (active + BMR), floors, intensity minutes |
| Heart Rate | Min/max/resting heart rate |
| Sleep | Duration, score, deep/light/REM/awake breakdown, stress during sleep |
| HRV | Last night avg, 5min peak, weekly avg, status (balanced/unbalanced), baseline |
| Body Battery | Current level, daily min/max |
| SpO2 | Average and minimum blood oxygen |
| Respiration | Waking and sleep breathing rate |
| Stress | Average/max, rest/low/medium/high duration breakdown |
| Training Status | Overreaching/Highly Active/Productive/Maintaining/Recovery/Detraining + acute/chronic load ratio |
| Training Readiness | Score (0-100) |
| Fitness Metrics | VO2 Max, fitness age, endurance score, hill score |
| Race Predictions | 5K/10K/Half/Marathon predicted times |
| Weight/Body Comp | Weight (kg), body fat %, BMI (requires Garmin Index scale) |
| Hydration | Intake (ml) vs goal |
| Activities | Individual workouts with HR, duration, calories, elevation, training effect, and detail JSON |
| Weekly Summary | Total/avg steps for the week |
| SQLite Tables | daily_summary, activities, and activity_sets for queryable local analysis |
pip install "garminconnect>=0.3.11"
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
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.
First login may require MFA verification. You'll be prompted to enter a code sent to your email.
garminconnect 0.3.x uses native authentication and cannot reuse legacy Garth token files. Upgrading from 0.2.x requires one new interactive login and MFA challenge.
Ask your AI agent:
# 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
~/.garmin_health/YYYY-MM-DD.json -- Daily JSON snapshots~/.garmin_health/latest.json -- Most recent JSON snapshot~/.garmin_health/garmin.db -- SQLite database with daily_summary, activities, and activity_sets tables~/.garminconnect/ -- OAuth token cacheOverride with env vars:
GARMIN_DATA_DIR -- Change data directoryGARMIN_TOKENSTORE -- Change token cache directoryGARMIN_IS_CN=true -- Use Garmin Connect CN endpoint (set once in shell profile)All labels and output in English. JSON field names are English by design.
~/.garminconnect/). Subsequent runs reuse this token and do not re-send your password.--password CLI flag to avoid password exposure in shell history.connect.garmin.com (or connect.garmin.com.cn for CN accounts). No proxies or intermediaries.garminconnect >= 0.3.11