Garmin (MissingMCP.com)
Your watch has the answers.
What it can do
- Get Activities By Date: Get activities between specified dates with pagination support. For accounts with large activity histories, broad date ranges can return thousands of activities in a single res
- Get Activities Fordate: Get activities for a specific date Args: date: Date in YYYY-MM-DD format
- Get Activity: Get detailed information for a single activity. Returns a comprehensive summary including timing, distance, heart rate, elevation, training effect, and an event_type field. Common event_
What data it sees
Do you need an account
No: the server works without sign-in
Your watch has the answers. Everything your watch knows — training, sleep, recovery, health — in a conversation. Ask questions, spot trends, and let Claude plan workouts that land right back on your wrist. 135 tools for activities, sleep, HRV, training readiness and workouts. Free, open source.
How to connect
How to connect Garmin (MissingMCP.com) to Claude
The server address to paste into Claude settings:
https://garmin-missing-mcp.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Garmin (MissingMCP.com) to ChatGPT
The server address to paste into ChatGPT settings:
https://garmin-missing-mcp.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Garmin (MissingMCP.com) to Cursor
The server address to paste into Cursor settings:
https://garmin-missing-mcp.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (60)
Raw names from tools/list. Only developers need these.
| get_activities_by_date | Get activities between specified dates with pagination support. For accounts with large activity histories, broad date ranges can return thousands of activities in a single response. Use page and page_size to retrieve activities in manageable chunks and avoid "result too large" errors. Activities are ordered newest-first. Pagination: when has_more is true the response includes next_page — pass that value as page on the next call to retrieve the following page. Repeat until has_more is false. Note: total_count for a date range is not available from the Garmin API without fetching all results. Use has_more / next_page to walk pages. Each activity includes an event_type field with values such as: - "race" — explicitly tagged as a race by the user - "training" — explicitly tagged as a training activity - "uncategorized" — no event type set; common for Peloton imports and untagged outdoor runs. Distinct from "training": filter for races with event_type == "race" rather than excluding "training", since many non-race activities appear as "uncategorized" not "training" - field omitted — activity pre-dates event type support in the API Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format activity_type: Optional activity type filter (e.g., cycling, running, swimming) page: Zero-based page number (default 0) page_size: Number of activities per page, max 200 (default 100) |
| get_activities_fordate | Get activities for a specific date Args: date: Date in YYYY-MM-DD format |
| get_activity | Get detailed information for a single activity. Returns a comprehensive summary including timing, distance, heart rate, elevation, training effect, and an event_type field. Common event_type values: "race", "training", "uncategorized" (no event type set by the user). The field is omitted for very old activities that pre-date event type support in the Garmin API. Args: activity_id: ID of the activity to retrieve |
| set_activity_name | Set or update the name of an activity. Args: activity_id: ID of the activity to update activity_name: New activity name |
| set_activity_type | Change the activity type (sport) of an activity. Useful for reclassifying a mislabelled activity, e.g. flipping a run logged as 'trail_running' to 'running', or a 'treadmill_running' walk to 'treadmill_walking'. Call get_activity_types to see all valid type keys. Args: activity_id: ID of the activity to update type_key: Target activity type key (e.g. 'running', 'trail_running', 'treadmill_running', 'cycling', 'lap_swimming') |
| set_activity_description | Set or update the free-text description (notes) of an activity. This is the notes field shown on the activity page — useful for recording how a session felt, kit used, conditions, niggles, etc. Pass an empty string to clear an existing description. Args: activity_id: ID of the activity to update description: New description text (empty string clears it) |
| set_activity_event_type | Set the event type of an activity. Event type categorises the activity's purpose. Valid keys: race, recreation, specialEvent, training, transportation, touring, geocaching, fitness, uncategorized. Args: activity_id: ID of the activity to update event_type: Target event type key (e.g. 'race', 'training') |
| set_perceived_effort | Set the perceived effort (RPE) for an activity. Mirrors Garmin Connect's 'Perceived Effort' rating on a 0-10 scale, where 0 clears the rating. Internally Garmin stores this multiplied by 10 (so RPE 7 is stored as 70); this tool handles the conversion. Args: activity_id: ID of the activity to update rpe: Perceived effort from 0 to 10 (0 clears the rating) |
| set_activity_feel | Set how an activity felt ('How did you feel?'). Mirrors Garmin Connect's 5-point feel rating, stored as one of: 0 = very tired / poor 25 = tired 50 = normal 75 = good 100 = strong Higher is better. Args: activity_id: ID of the activity to update feel: One of 0, 25, 50, 75, 100 |
| get_activity_splits | Get splits for an activity Args: activity_id: ID of the activity to retrieve splits for |
| get_activity_typed_splits | Get typed splits for an activity Args: activity_id: ID of the activity to retrieve typed splits for |
| get_activity_split_summaries | Get split summaries for an activity Args: activity_id: ID of the activity to retrieve split summaries for |
| get_activity_weather | Get weather data for an activity Args: activity_id: ID of the activity to retrieve weather data for |
| get_activity_hr_in_timezones | Get heart rate data in different time zones for an activity Args: activity_id: ID of the activity to retrieve heart rate time zone data for |
| get_activity_power_in_timezones | Get power distribution across training zones for an activity. Returns time spent in each power zone with watt thresholds and duration. Requires a power meter. Zones are based on the athlete's FTP configured in Garmin Connect. Args: activity_id: ID of the activity to retrieve power zone data for |
| get_activity_gear | Get gear data used for an activity Args: activity_id: ID of the activity to retrieve gear data for |
| get_activity_exercise_sets | Get exercise sets for strength training activities Args: activity_id: ID of the activity to retrieve exercise sets for |
| count_activities | Get total count of activities in the user's Garmin account Returns the total number of activities recorded. |
| get_activities | Get activities with pagination support. Retrieves a paginated list of activities ordered newest-first. Use this for browsing through large activity lists when you do not need to filter by date range, or as a complement to get_activities_by_date. Each activity includes an event_type field. Common values: "race", "training", "uncategorized" (no event type set by the user — common for Peloton imports and untagged runs). Filter for races with event_type == "race" rather than excluding "training", as many non-race activities appear as "uncategorized" rather than "training". Args: start: Starting index (default 0) limit: Maximum number of activities to return (default 20, max 100) |
| create_manual_activity | Log a manual activity in Garmin Connect — useful for activities done without a watch. The type_key must match a Garmin activity type. Use get_activity_types to see the full list. Common values: yoga, strength_training, meditation, indoor_cycling, pilates, bouldering, fitness_equipment. Args: type_key: Activity type key (e.g. "yoga", "strength_training") date: Date of the activity in YYYY-MM-DD format duration_minutes: Duration of the activity in minutes start_time: Start time as HH:MM (24-hour, default 09:00) activity_name: Optional title; defaults to the type_key if not provided distance_km: Distance in kilometres (default 0.0 for non-distance activities) time_zone: IANA time zone for the activity (default UTC) |
| get_activity_types | Get all available activity types Returns a list of all activity types supported by Garmin Connect, useful for filtering activities by type. |
| get_stats | Get daily activity stats with curated essential metrics Returns a summary of daily health and activity data including steps, calories, heart rate, stress, body battery, and sleep metrics. Args: date: Date in YYYY-MM-DD format |
| get_user_summary | Get user summary data (compatible with garminconnect-ha) Args: date: Date in YYYY-MM-DD format |
| get_body_composition | Get body composition data for a single date or date range Args: start_date: Date in YYYY-MM-DD format or start date if end_date provided end_date: Optional end date in YYYY-MM-DD format for date range |
| get_stats_and_body | Get stats and body composition data Args: date: Date in YYYY-MM-DD format |
| get_steps_data | Get detailed steps data with 15-minute intervals Note: This returns full interval data (~14KB). For a compact summary, use get_stats() which includes total_steps. Args: date: Date in YYYY-MM-DD format |
| get_daily_steps | Get steps data for a date range Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format |
| get_training_readiness | Get training readiness data with curated metrics Returns training readiness score and contributing factors. Args: date: Date in YYYY-MM-DD format |
| get_body_battery | Get body battery data with events Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format |
| get_body_battery_events | Get body battery events data Args: date: Date in YYYY-MM-DD format |
| get_blood_pressure | Get blood pressure data Args: start_date: Start date in YYYY-MM-DD format end_date: End date in YYYY-MM-DD format |
| get_floors | Get floors climbed data Args: date: Date in YYYY-MM-DD format |
| get_rhr_day | Get resting heart rate data Args: date: Date in YYYY-MM-DD format |
| get_heart_rates | Get full heart rate time-series data Note: This returns detailed 2-minute interval data (~25KB). For a compact summary, use get_heart_rates_summary(). Args: date: Date in YYYY-MM-DD format |
| get_heart_rates_summary | Get heart rate summary with essential metrics (lightweight version) Returns a compact summary (~500 bytes) instead of full time-series data (~25KB). Ideal for daily health checkups and LLM integrations. Args: date: Date in YYYY-MM-DD format |
| get_hydration_data | Get hydration data Args: date: Date in YYYY-MM-DD format |
| get_sleep_data | Get full sleep data with all details Note: This returns detailed sleep data (~50KB). For a compact summary, use get_sleep_summary(). Args: date: Date in YYYY-MM-DD format |
| get_sleep_summary | Get sleep summary with only essential metrics (lightweight version) This endpoint returns a compact summary of sleep data (~350 bytes) instead of the full granular data (~50KB). Ideal for daily health checkups and LLM integrations where the full time-series data would overwhelm the context window. Args: date: Date in YYYY-MM-DD format |
| get_stress_data | Get full stress time-series data Note: This returns detailed interval data (~35KB) including body battery. For a compact summary, use get_stress_summary(). Args: date: Date in YYYY-MM-DD format |
| get_stress_summary | Get stress summary with essential metrics (lightweight version) Returns a compact summary (~400 bytes) instead of full time-series data (~35KB). Ideal for daily health checkups and LLM integrations. Args: date: Date in YYYY-MM-DD format |
| get_respiration_data | Get full respiration time-series data Note: This returns detailed interval data (~20KB). For a compact summary, use get_respiration_summary(). Args: date: Date in YYYY-MM-DD format |
| get_respiration_summary | Get respiration summary with essential metrics (lightweight version) Returns a compact summary (~300 bytes) instead of full time-series data (~20KB). Args: date: Date in YYYY-MM-DD format |
| get_spo2_data | Get SpO2 (blood oxygen) data Args: date: Date in YYYY-MM-DD format |
| get_all_day_stress | Get all-day stress data Args: date: Date in YYYY-MM-DD format |
| get_all_day_events | Get daily wellness events data Args: date: Date in YYYY-MM-DD format |
| get_lifestyle_logging_data | Get lifestyle logging data for a specific date Returns lifestyle logging data which allows users to track behaviors and their impact on health metrics. Args: date: Date in YYYY-MM-DD format |
| get_weekly_steps | Get weekly step data aggregates Returns weekly step totals for the specified number of weeks ending at end_date. Args: end_date: End date in YYYY-MM-DD format weeks: Number of weeks to fetch (default 4, max 52) |
| get_weekly_stress | Get weekly stress data aggregates Returns weekly stress values for the specified number of weeks ending at end_date. Args: end_date: End date in YYYY-MM-DD format weeks: Number of weeks to fetch (default 4, max 52) |
| get_weekly_intensity_minutes | Get weekly intensity minutes data aggregates Returns weekly intensity minutes (moderate and vigorous) for the specified number of weeks ending at end_date. Args: end_date: End date in YYYY-MM-DD format weeks: Number of weeks to fetch (default 4, max 52) |
| get_morning_training_readiness | Get morning training readiness score Returns the morning training readiness assessment, which evaluates recovery status and readiness to train based on overnight metrics. Args: date: Date in YYYY-MM-DD format |
| get_full_name | Get user's full name from profile |
| get_unit_system | Get user's preferred unit system from profile |
| get_user_profile | Get user profile information |
| get_userprofile_settings | Get user profile settings |
| get_devices | Get all Garmin devices associated with the user account |
| get_device_last_used | Get information about the last used Garmin device |
| get_device_settings | Get settings for a specific Garmin device Returns device configuration including time/date format, units, activity tracking settings, and alarm information. Args: device_id: Device ID (optional; defaults to the most recently used device when omitted; can be obtained from get_devices or get_device_last_used) |
| get_primary_training_device | Get information about the primary training device Returns details about the device designated as primary for training metrics, along with other wearable devices on the account. |
| get_device_solar_data | Get solar data for a specific device Returns solar charging data for devices with solar panels (e.g., Instinct Solar, Fenix Solar). Only applicable to solar-capable devices. Args: device_id: Device ID (can be obtained from get_devices) date: Date in YYYY-MM-DD format |
| get_device_alarms | Get alarms from all Garmin devices Returns all configured alarms with their schedules, sounds, and enabled status. |