Garmin Connect MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_API_KEY | Yes | Your Garmin Personal API key from Garmin Connect (Settings → Personal API Token). Required to read your Garmin data. | |
| MCP_AUTH_TOKEN | No | Your sign-in password typed on the server's sign-in page when connecting an app, and used as a Bearer token for header-based clients like Claude Code. Optional, but at least one of MCP_OAUTH_CLIENT_SECRET or MCP_AUTH_TOKEN must be set. | |
| MCP_OAUTH_CLIENT_ID | No | The OAuth client ID you enter in the app. Keep the default garmin-mcp. | garmin-mcp |
| MCP_OAUTH_CLIENT_SECRET | No | The OAuth client secret you enter in Claude, Gemini or ChatGPT. Optional, but at least one of MCP_OAUTH_CLIENT_SECRET or MCP_AUTH_TOKEN must be set. | |
| MCP_OAUTH_REDIRECT_URIS | No | Optional extra allowed sign-in callback URLs, comma-separated. Claude's, Gemini's and ChatGPT's are already allowed. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Read-only access to the user's own Garmin Connect data through the official Garmin Connect Personal API.
Dates are calendar dates (YYYY-MM-DD) in the user's local time zone. If you don't know the user's time zone or "today", call garmin_get_user_settings first.
Several range endpoints have a maximum span (steps and stress 28 days; hydration, sleep summaries and Body Battery 31 days; daily summaries 365 days). Split longer periods into several calls.
To analyse workouts, find IDs with garmin_search_activities, then call garmin_get_activity.
Distances are in meters, durations in seconds, speeds in m/s, all body weights (weigh-ins, bone/muscle mass, weight goals) in GRAMS.
A result of {"noData": true} means nothing was recorded, not an error.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| garmin_get_user_settingsA | Get the user's Garmin Connect settings: displayName, timeZone, preferredLocale, measurementSystem (metric/statute), first day of week, date/time/number formats, heart rate and power display formats, hydration and glucose units, golf units, wheelchair mode and preferred training days. Call this first to learn the user's time zone (so you know what "today" is) and preferred units. |
| garmin_search_activitiesA | Search and list the user's recorded activities (runs, rides, swims, strength sessions, hikes, dives…), newest first by default. Returns an array of activity summaries with: activityId, activityName, description, startTimeLocal/startTimeGMT, activityType, eventType, distance (meters), duration / movingDuration / elapsedDuration (seconds), elevationGain/Loss (meters), averageSpeed/maxSpeed (m/s), calories, averageHR/maxHR (bpm), cadence, power, training effect and more. Use this first to find activity IDs, then call garmin_get_activity for splits and full detail, or garmin_download_activity_file for the original FIT file. All filters are optional and combined with AND. Paginate with |
| garmin_get_activityA | Get the full detail of one activity: name, type, event type, time zone, device and metadata, the summary (distance m, duration s, speeds m/s, heart rate, power, cadence, calories, training effect, elevation), split/lap summaries, and dive or multisport info when relevant. Get the activityId from garmin_search_activities. Does not include per-second samples; use garmin_download_activity_file for the raw FIT data. |
| garmin_get_activity_workoutsA | List the structured workouts that were followed during an activity (workout name, sport, steps with targets, creation time). Returns an empty array when the activity was not a structured workout. |
| garmin_download_activity_fileA | Download the original file recorded by the device for an activity, usually a ZIP containing the .FIT file with every sample (GPS track, heart rate, power, cadence…). When running locally with GARMIN_DOWNLOAD_DIR set, the file is saved there and the path is returned. Otherwise the file is returned inline as a base64 embedded resource, up to 3 MB. For summaries, splits or metrics, prefer garmin_get_activity: it is much smaller. |
| garmin_get_daily_summaryA | Get the user's complete wellness summary for one day: total/active/BMR kilocalories, steps and step goal, distance (meters), floors climbed, intensity minutes (moderate/vigorous) and goal, highly active/active/sedentary/sleeping seconds, min/max/resting heart rate, stress averages and durations, Body Battery charged/drained/highest/lowest, SpO2 and respiration. Best single call for "how was my day?". For many days at once use garmin_get_daily_summaries. |
| garmin_get_daily_summariesA | Get daily wellness summaries (steps, calories, distance, intensity minutes, heart rate, stress, Body Battery, floors…) for every day in a range, returned as |
| garmin_get_stepsA | Get daily step totals for a date range: one entry per day with calendarDate, totalSteps, totalDistance (meters) and stepGoal. Maximum range: 28 days per request; split longer periods, or use garmin_get_daily_summaries (up to 365 days), which also includes steps. |
| garmin_get_stressA | Get daily stress statistics for a date range: one entry per day with calendarDate and a |
| garmin_get_hydrationA | Get logged water intake per day: calendarDate, valueInML (consumed), goalInML, sweatLossInML (estimated from activities), activityIntakeInML and lastEntryTimestampLocal. Only has data if the user logs hydration in Garmin Connect. Maximum range: 31 days. |
| garmin_get_wellness_activitiesA | Get wellness activities (e.g. breathwork, meditation, relaxation and other non-fitness sessions recorded on the device) for a date range: name, type, notes, start/end timestamps, summary values and time in zones. Both dates are inclusive. Fitness activities such as runs or rides are not here; use garmin_search_activities for those. |
| garmin_get_sleepA | Get sleep data for one calendar date (the night ending on that morning): sleep start/end timestamps, sleepTimeSeconds, deepSleepSeconds, lightSleepSeconds, remSleepSeconds, awakeSleepSeconds, awakeCount, napTimeSeconds, sleep scores and feedback, average/lowest SpO2, respiration, avgHeartRate and avgSleepStress. Durations are in seconds. For several nights use garmin_get_sleep_summaries. |
| garmin_get_sleep_summariesA | Get one sleep summary per night for a date range, each with sleep start/end timestamps, sleepTimeSeconds, deepSleepSeconds, lightSleepSeconds, remSleepSeconds, awakeSleepSeconds, awakeCount, napTimeSeconds, sleep scores and feedback, average/lowest SpO2, respiration, avgHeartRate and avgSleepStress. Durations are in seconds. Maximum range: 31 days per request. |
| garmin_get_heart_rateA | Get heart rate for one day: restingHeartRate, minHeartRate, maxHeartRate, lastSevenDaysAvgRestingHeartRate, abnormal-HR alerts, and |
| garmin_get_heart_rate_zonesA | Get the user's heart rate zone configuration, one entry per sport (default, running, cycling…): training method (%max HR, %HRR or %LTHR), zone1Floor..zone5Floor (bpm), and the max, resting and lactate threshold heart rates used. |
| garmin_get_hrvA | Get overnight HRV for one date: |
| garmin_get_hrv_summariesA | Get one HRV summary per day for a date range (weeklyAvg, lastNightAvg, baseline, status, feedback), without the 5-minute readings. Use for HRV trends and recovery analysis. |
| garmin_get_body_batteryA | Get Body Battery (energy level 0–100) per day: charged and drained totals, a time series |
| garmin_get_spo2A | Get Pulse Ox (SpO2, %) for one day: averageSpO2, lowestSpO2, latestSpO2, lastSevenDaysAvgSpO2, avgSleepSpO2, single readings and hourly averages, plus altitude acclimation data. Requires a watch with Pulse Ox enabled. |
| garmin_get_fitness_ageA | Get the latest Fitness Age as of a date: chronologicalAge, fitnessAge, achievableFitnessAge, previousFitnessAge, and the components behind it (BMI or body fat, resting heart rate, vigorous activity days/minutes) with improvement targets. |
| garmin_get_weight_entriesA | Get every individual weigh-in in a date range (from Index scales, other smart scales or manual entries): date, timestampGMT, weight, bmi, bodyFat, bodyWater, boneMass, muscleMass, visceralFat, metabolicAge, physiqueRating and weightDelta (change since the previous weigh-in); weight, boneMass and muscleMass are in GRAMS (75000 = 75 kg); bodyFat and bodyWater are percentages; timestampGMT and date are epoch milliseconds. For one value per day plus the range average use garmin_get_weight_summary. |
| garmin_get_weight_summaryA | Get a weight summary for a date range: dailyWeightSummaries (latest weigh-in per day, or all of them with includeAll), totalAverage for the range, and the closest weigh-ins before (previousDateWeight) and after (nextDateWeight) the range; weight, boneMass and muscleMass are in GRAMS (75000 = 75 kg); bodyFat and bodyWater are percentages; timestampGMT and date are epoch milliseconds. |
| garmin_get_weight_goalsA | Get the user's weight goals in effect during a date range: userGoals (goalValue = target weight in GRAMS, category such as MANUAL or PREGNANCY, tracking period, start/end dates) and userGoalRanges (low/high target ranges, also in grams). |
| garmin_get_nutrition_logA | Get the user's food log for one day from Garmin Connect nutrition tracking: daily nutrition goals, totals of calories and nutrients consumed (protein, carbs, fat, fiber…), logged foods with serving sizes, and meal-by-meal details (breakfast, lunch, dinner, snacks). Only has data if the user logs food in Garmin Connect. |
| garmin_get_menstrual_cycle_summaryA | Women's health: get the menstrual cycle that contains a date: cycle start/end, dayInCycle, currentPhase and days until the next phase, period length, predicted cycle length, fertile window, predicted ovulation date, and pregnancy info (due date, week) when pregnancy tracking is on. Only has data if the user tracks their cycle in Garmin Connect. |
| garmin_get_menstrual_cycle_dayA | Women's health: detailed view of one day: the user's daily log (flow, symptoms, mood and other entries), the cycle summary for that day, and, during pregnancy tracking, weekly weight goal ranges and optionally baby movement (kick count) data. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 26 tools
Tools target distinct Garmin data endpoints, and the descriptions explicitly clarify singular-vs-range and summary-vs-entry variants. The closest overlaps, such as garmin_get_daily_summary/garmin_get_daily_summaries and garmin_get_sleep/garmin_get_sleep_summaries, are well delineated but still require the agent to pay attention.
Every tool uses the garmin_ prefix followed by a consistent verb_noun pattern such as get_heart_rate, search_activities, and download_activity_file. The use of get/search/download is predictable and there is no mixed naming convention.
26 tools is large, but it reflects Garmin Connect's broad surface across activities, sleep, body metrics, nutrition, and women's health. Some singular/range pairs and overlapping summary tools could be consolidated, so the set is slightly heavy but largely justified.
Coverage is strong across the major read-only Garmin wellness and activity domains, including sleep, heart rate, HRV, Body Battery, weight, nutrition, and menstrual health. Gaps remain for metrics such as VO2 max, training status/readiness, device/gear/workout management, and any write or update operations.