MCP server for Garmin Connect. Access your fitness, health, and training data from Claude Code, Claude Desktop, Cursor, Windsurf, or any MCP client.
61 tools across 7 categories: activities, daily health, trends, sleep, body composition, performance/training, and profile/devices.
API endpoints and authentication flow based on python-garminconnect by cyberjunky.
- Node.js 20+
- A Garmin Connect account (email and password)
claude mcp add garmin -e GARMIN_EMAIL=you@email.com -e GARMIN_PASSWORD=yourpass -- npx -y @nicolasvegam/garmin-connect-mcpAdd to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"garmin": {
"command": "npx",
"args": ["-y", "@nicolasvegam/garmin-connect-mcp"],
"env": {
"GARMIN_EMAIL": "you@email.com",
"GARMIN_PASSWORD": "yourpass"
}
}
}
}Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"garmin": {
"command": "npx",
"args": ["-y", "@nicolasvegam/garmin-connect-mcp"],
"env": {
"GARMIN_EMAIL": "you@email.com",
"GARMIN_PASSWORD": "yourpass"
}
}
}
}Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"garmin": {
"command": "npx",
"args": ["-y", "@nicolasvegam/garmin-connect-mcp"],
"env": {
"GARMIN_EMAIL": "you@email.com",
"GARMIN_PASSWORD": "yourpass"
}
}
}
}Run the server with environment variables:
GARMIN_EMAIL=you@email.com GARMIN_PASSWORD=yourpass npx -y @nicolasvegam/garmin-connect-mcpThe server communicates over stdio using the Model Context Protocol.
| Tool | Description |
|---|---|
get_activities |
List recent activities with pagination |
get_activities_by_date |
Search activities within a date range |
get_last_activity |
Get the most recent activity |
count_activities |
Get total number of activities |
get_activity |
Summary data for a specific activity |
get_activity_details |
Detailed metrics: HR, pace, elevation time series |
get_activity_splits |
Per-km or per-mile split data |
get_activity_weather |
Weather conditions during activity |
get_activity_hr_zones |
Time in each heart rate zone |
get_activity_exercise_sets |
Strength training sets (reps, weight) |
get_activity_types |
All available activity types |
get_progress_summary |
Fitness stats over a date range by activity type |
| Tool | Description |
|---|---|
get_daily_summary |
Full daily summary (steps, calories, distance, etc.) |
get_steps |
Step count for a date |
get_steps_chart |
Intraday step data throughout the day |
get_heart_rate |
Heart rate data (resting, max, zones, time series) |
get_resting_heart_rate |
Resting heart rate for a date |
get_stress |
Stress levels and time series |
get_body_battery |
Body Battery energy levels (date range) |
get_body_battery_events |
Battery charge/drain events for a day |
get_respiration |
Breathing rate data |
get_spo2 |
Blood oxygen saturation |
get_intensity_minutes |
Moderate/vigorous intensity minutes |
get_floors |
Floors climbed chart data |
get_hydration |
Daily hydration/water intake |
get_daily_events |
Daily wellness events |
| Tool | Description |
|---|---|
get_daily_steps_range |
Daily step counts over a date range |
get_weekly_steps |
Weekly step aggregates |
get_weekly_stress |
Weekly stress aggregates |
get_weekly_intensity_minutes |
Weekly intensity minutes |
| Tool | Description |
|---|---|
get_sleep_data |
Sleep stages, score, bed/wake times |
get_sleep_data_raw |
Raw sleep data with HR and SpO2 |
| Tool | Description |
|---|---|
get_body_composition |
Weight, BMI, body fat %, muscle mass (date range) |
get_latest_weight |
Most recent weight entry |
get_daily_weigh_ins |
All weigh-ins for a date |
get_weigh_ins |
Weigh-in records over a date range |
get_blood_pressure |
Blood pressure readings (date range) |
| Tool | Description |
|---|---|
get_vo2max |
VO2 Max estimate (running/cycling) |
get_training_readiness |
Training Readiness score |
get_training_status |
Training status and load |
get_hrv |
Heart Rate Variability |
get_endurance_score |
Endurance fitness score |
get_hill_score |
Climbing performance score |
get_race_predictions |
5K/10K/half/full marathon predictions |
get_fitness_age |
Estimated fitness age |
get_personal_records |
All personal records |
get_lactate_threshold |
Lactate threshold HR and pace |
get_cycling_ftp |
Functional Threshold Power (cycling) |
| Tool | Description |
|---|---|
get_user_profile |
User social profile and preferences |
get_user_settings |
User settings, measurement system, sleep schedule |
get_devices |
Registered Garmin devices |
get_device_settings |
Settings for a specific device |
get_device_last_used |
Last used device info |
get_primary_training_device |
Primary training device |
get_device_solar_data |
Solar charging data |
get_gear |
All tracked gear/equipment |
get_gear_stats |
Usage stats for a gear item |
get_goals |
Active goals and progress |
get_earned_badges |
Earned badges and achievements |
get_workouts |
Saved workouts |
get_workout |
Specific workout by ID |
Uses Garmin Connect credentials (email/password) via environment variables. OAuth tokens are cached in ~/.garmin-mcp/ to avoid re-authentication on each request.
If your Garmin account has MFA enabled (required for devices with ECG capabilities), you need to run the interactive setup once before using the MCP server:
GARMIN_EMAIL='you@email.com' GARMIN_PASSWORD='yourpass' npx -y @nicolasvegam/garmin-connect-mcp setupThis will:
- Log in to Garmin Connect
- Prompt you for the MFA code sent to your email or authenticator app
- Save OAuth tokens to
~/.garmin-mcp/
After setup, the MCP server will use the saved tokens automatically — no MFA prompt needed until the tokens expire. When they do, simply run the setup command again.
git clone https://github.com/Nicolasvegam/garmin-connect-mcp.git
cd garmin-connect-mcp
npm install
npm run buildTo test locally:
GARMIN_EMAIL=you@email.com GARMIN_PASSWORD=yourpass npm start- API endpoints and authentication flow based on
python-garminconnectby cyberjunky
MIT