Skip to main content
Glama

Garmin MCP

MCP server that exposes Garmin Connect data (steps, sleep, stress, activities, etc.) via garth and fastMCP. Auth: set GARMIN_EMAIL and GARMIN_PASSWORD in env, or use a saved session at ~/.garth (or GARTH_SESSION_PATH).

MCP config

Use full path to uvx (e.g. which uvx). Example for Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json) or Cursor:

{
  "mcpServers": {
    "garmin": {
      "command": "/Users/YOUR_USER/.local/bin/uvx",
      "args": ["--refresh", "--from", "git+https://github.com/lokranjanp/garminmcp", "garmin-mcp"],
      "env": {
        "GARMIN_EMAIL": "your-garmin-email@example.com",
        "GARMIN_PASSWORD": "your-password",

        "SMTP_HOST": "smtp.gmail.com",
        "SMTP_PORT": "587",
        "SMTP_USER": "your-email@gmail.com",
        "SMTP_PASSWORD": "your-app-password",
        "SMTP_TO": "recipient@example.com",
        "OUTPUT_DIR": "/Users/user.mac/garmin_data/",

        "LLM_API_BASE": "http://localhost:1234/v1",
        "LLM_API_KEY": "lm-studio",
        "LLM_MODEL": "your-loaded-model-name"
      }
    }
  }
}

From PyPI (if published): "args": ["garmin-mcp"].

Related MCP server: health-mcp

Commands

uv sync                    # install from uv.lock
uv run garmin-mcp          # run server locally
uv lock                    # refresh lock after changing pyproject.toml

Tools (17 base + 3 opt-in)

#

Tool

Description

Utility

1

garmin_current_datetime

Current date/time (local & UTC, ISO, weekday)

Auth

2

garmin_login

Log in and save session to disk

3

garmin_resume_session

Load saved session

User

4

garmin_user_profile

Profile (display name, timezone, etc.)

5

garmin_user_settings

Settings (units, preferences)

Metrics (daily/weekly series)

6

garmin_metric

Fetch daily or weekly stat series. metric: steps, sleep, stress, hydration, intensity_minutes, hrv. period: daily or weekly. count: number of periods.

Detailed health data

7

garmin_data

Fetch detailed data (single day or list). data_type: sleep, hrv, weight, body_battery_events, body_battery_stress. Use day for single-day or end_date+days for a range.

Activities

8

garmin_activities

List activities (start, limit)

9

garmin_activity_details

Full details for one activity by ID

10

garmin_activity_types

List all activity types (type IDs and keys)

Biomarkers & summary

11

garmin_daily_summary

One-day wellness: RHR, HR, stress, steps, SpO2, respiration, body battery, calories

12

garmin_resting_heart_rate

Resting heart rate for a date range

13

garmin_summary_report

Comprehensive biomarker + activity report (daily/weekly/biweekly/monthly)

Delivery

14

garmin_email_summary

Generate summary report and send via SMTP email (HTML + plain-text)

Statistical analysis

15

garmin_stats

Run a stats operation on numeric data. operation: describe, percentiles, correlation, trend, compare, moving_average, outliers.

Visualization (matplotlib)

16

garmin_viz

Render a chart. chart_type: line, bar, scatter, histogram, pie, heatmap, multi_line. Returns file path + base64 PNG.

Raw API

17

garmin_connect_api

Call any Connect API path (GET/POST)

LIDA / AI visualization (opt-in, requires LLM_API_KEY)

18

garmin_lida_visualize

AI-driven chart generation -- auto-picks the best chart type

19

garmin_lida_goals

Suggest N visualization goals for a dataset (EDA)

20

garmin_lida_explain

Explain a visualization's code in natural language

Dates: use YYYY-MM-DD; omit end date for "today" where supported.

SMTP env vars (for delivery tools)

Variable

Required

Description

SMTP_HOST

yes

SMTP server (e.g. smtp.gmail.com)

SMTP_PORT

no

Port, default 587 (STARTTLS)

SMTP_USER

yes

Login username / email

SMTP_PASSWORD

yes

Password or app-password

SMTP_FROM

no

Sender address (defaults to SMTP_USER)

SMTP_TO

no

Default recipient(s), comma-separated

SMTP_USE_SSL

no

"true" for implicit SSL (port 465); default uses STARTTLS

LLM env vars (for LIDA visualization tools -- opt-in)

The 3 LIDA tools (garmin_lida_*) are only registered when LLM_API_KEY is set. If omitted, the server loads with 17 tools instead of 20, reducing context overhead for the AI client.

Variable

Default

Description

LLM_PROVIDER

"openai"

LLM provider for LIDA

LLM_API_BASE

(none)

Custom endpoint -- set to http://localhost:1234/v1 for LM Studio

LLM_API_KEY

(none)

API key (use "lm-studio" for LM Studio). Setting this enables LIDA tools.

LLM_MODEL

"gpt-4o-mini"

Model name (for LM Studio: whatever model is loaded)

Visualization output is saved to output/viz/ (or OUTPUT_DIR env var) and also returned as base64 PNG in the JSON response.

Available Tools

17 tools
garmin_activitiesA

List activities from Garmin Connect. start: index to start from, limit: max number to return. Returns activity IDs, names, types, start time, duration, distance, etc.

Inputs: limit, start. Returns: result

garmin_activity_detailsA

Get full details for one activity by ID (running, cycling, strength, etc.). Includes summary (distance, duration, HR, calories, cadence, etc.), splits, and metadata. Use garmin_activities first to get activity_id values.

Inputs: activity_id (required). Returns: result

garmin_activity_typesA

List all Garmin activity types (running, cycling, strength_training, etc.) with type IDs and keys.

Inputs: no named parameters. Returns: result

garmin_connect_apiA

Call the Garmin Connect API at an arbitrary path. Use for endpoints not wrapped by other tools. path: e.g. /userprofile-service/socialProfile or /activitylist-service/... method: GET or POST. body: optional JSON string for POST.

Inputs: path (required), body, method. Returns: result

garmin_current_datetimeA

Return current date and time variables (local and UTC). Use for building date ranges or passing today's date to other Garmin tools (e.g. YYYY-MM-DD for day/sleep/weight).

Inputs: no named parameters. Returns: result

garmin_daily_summaryA

Get one-day wellness summary (biomarkers): RHR, min/max HR, stress, steps, distance, calories, SpO2 (avg/low/high), respiration (avg/low/high), body battery (charged/max/min), intensity minutes, floors, sleep summary. day: YYYY-MM-DD.

Inputs: day (required). Returns: result

garmin_dataA

Fetch detailed health data from Garmin Connect.

data_type: "sleep", "hrv", "weight", "body_battery_events", or "body_battery_stress". day: YYYY-MM-DD for single-day data. If omitted, fetches a list. end_date: YYYY-MM-DD end of range for list mode (defaults to today). days: number of days for list mode (default 7; up to 30 for weight).

When day is provided: returns detailed data for that single day. When day is omitted: returns a list of entries over the date range.

Note: body_battery_events and body_battery_stress only support single-day mode (day param).

Examples: garmin_data(data_type="sleep", day="2026-02-01") # single day garmin_data(data_type="sleep", days=14) # last 14 days garmin_data(data_type="weight", end_date="2026-02-01", days=30) garmin_data(data_type="body_battery_events", day="2026-02-01")

Inputs: data_type (required), day, days, end_date. Returns: result

garmin_email_summaryA

Generate a Garmin summary report and email it via SMTP.

period: "daily", "weekly", "biweekly", or "monthly" (default: weekly). end_date: YYYY-MM-DD (defaults to today). to: recipient email(s), comma-separated (defaults to SMTP_TO env var). subject: custom subject line (auto-generated if omitted).

Requires SMTP env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD. Optional: SMTP_FROM (defaults to SMTP_USER), SMTP_TO (default recipient), SMTP_USE_SSL ("true" for port-465 implicit SSL; default is STARTTLS).

The email contains a formatted HTML report (with plain-text fallback) covering all biomarkers: HR, HRV, stress, sleep, SpO2, respiration, body battery, steps, hydration, intensity minutes, calories, weight, activities, and strength training sessions.

FOCUS MORE ON STRENGTH AND CARDIO BIO-MARKERS IF POSSIBLE.

Inputs: to, period, subject, end_date. Returns: result

garmin_loginA

Log in to Garmin Connect with email and password. Saves the session to the given path (default: ~/.garth) so you can use resume_session later without logging in again.

Inputs: email (required), password (required), session_path. Returns: result

garmin_metricA

Fetch daily or weekly stat series from Garmin Connect.

metric: "steps", "sleep", "stress", "hydration", "intensity_minutes", or "hrv". period: "daily" (default) or "weekly". end_date: YYYY-MM-DD (defaults to today/this week). count: number of days or weeks to fetch (default 7).

Examples: garmin_metric(metric="steps", period="daily", count=14) garmin_metric(metric="stress", period="weekly", count=4) garmin_metric(metric="hrv", count=28)

Inputs: metric (required), count, period, end_date. Returns: result

garmin_resting_heart_rateA

Get resting heart rate (RHR) for one or more days. end_date: YYYY-MM-DD or omit for today. Returns daily RHR and optional 7-day average. metricId 60 = resting heart rate.

Inputs: days, end_date. Returns: result

garmin_resume_sessionA

Resume a previously saved Garmin session from disk. Use this (or set GARTH_SESSION_PATH) before calling other tools so they are authenticated. Default path: ~/.garth.

Inputs: session_path. Returns: result

garmin_statsA

Perform a statistical analysis operation on numeric data.

operation: one of "describe", "percentiles", "correlation", "trend", "compare", "moving_average", "outliers".

Common params: values: primary list of numeric values (required for all operations). y: second list of values (for "correlation" and "compare"). labels: parallel date/label list (for "trend" and "moving_average").

Operation-specific params: describe: (no extra params needed) percentiles: percentiles (list of ranks 0-100, default [5,10,25,50,75,90,95]) correlation: y (required), method ("pearson" or "spearman") trend: labels (optional date labels) compare: y (required sample B), a_label, b_label moving_average: window (default 7), labels outliers: method ("iqr" or "zscore"), threshold (default 1.5)

Examples: Descriptive stats: operation="describe", values=[65,62,68,70,64] Trend analysis: operation="trend", values=[rhr_vals...], labels=[dates...] Correlation: operation="correlation", values=[steps...], y=[sleep_scores...], method="pearson" Compare weeks: operation="compare", values=[this_week...], y=[last_week...], a_label="this_week", b_label="last_week"

Inputs: values (required), operation (required), y, labels, +6 more. Returns: result

garmin_summary_reportA

Generate a comprehensive summary of all essential biomarkers and activity stats.

period: "daily" (1 day), "weekly" (7 days), "biweekly" (14 days), or "monthly" (30 days). end_date: YYYY-MM-DD (defaults to today).

Includes: RHR, HRV, stress, sleep score, SpO2, respiration, body battery, steps, hydration, intensity minutes, calories, weight, activities breakdown, and strength training sessions.

Inputs: period, end_date. Returns: result

garmin_user_profileB

Get the current user's Garmin Connect profile (display name, timezone, activities, etc.).

Inputs: no named parameters. Returns: result

garmin_user_settingsA

Get the current user's Garmin Connect settings (units, preferences, etc.).

Inputs: no named parameters. Returns: result

garmin_vizA

Render a chart and return the image inline (displayed by Claude Desktop) plus the saved file path.

chart_type: "line", "bar", "scatter", "histogram", "pie", "heatmap", or "multi_line".

Common params (used by most types): x: x-axis values or labels. y: y-axis values (for histogram, pass the data here). title, x_label, y_label: chart labels.

Type-specific params: histogram: bins (default 20). heatmap: matrix (2-D list), x_labels, y_labels. multi_line: y_series (list of y-value lists), series_labels.

Examples: Line: chart_type="line", x=["Mon","Tue",...], y=[8000,9200,...] Bar: chart_type="bar", x=["running","strength"], y=[5,3] Scatter: chart_type="scatter", x=[steps...], y=[sleep_scores...] Histogram: chart_type="histogram", y=[hrv_values...] Pie: chart_type="pie", x=["running","cycling"], y=[120,80] Heatmap: chart_type="heatmap", matrix=[[...],[...]], x_labels=["Mon",...], y_labels=["Wk1",...] Multi-line: chart_type="multi_line", x=[dates...], y_series=[[rhr...],[stress...]], series_labels=["RHR","Stress"]

Inputs: chart_type (required), x, y, bins, +8 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 17 tools

    Disambiguation2/5

    Multiple tools overlap heavily: garmin_metric, garmin_data, garmin_daily_summary, garmin_summary_report, and garmin_email_summary all expose sleep, stress, HRV, or biomarker data in slightly different forms. garmin_summary_report and garmin_email_summary are nearly identical except for the email side effect, and garmin_connect_api adds another ambiguous path to the same data.

    Naming Consistency4/5

    The garmin_ prefix and snake_case style are consistent, and most names follow a readable resource-style pattern like garmin_activities or garmin_daily_summary. Minor inconsistencies like garmin_stats, garmin_viz, and garmin_email_summary (verb-style) keep it from being perfectly uniform.

    Tool Count3/5

    17 tools is in the borderline-heavy range for one server, especially since several tools are auxiliary (stats, viz, email, generic API passthrough) rather than core Garmin data retrieval. The overlapping wellness and summary tools could be consolidated to reduce the count without losing capability.

    Completeness4/5

    The tool set covers the core Garmin domain well: activities, activity details, biomarkers, user profile/settings, authentication, and an API fallback. Minor gaps exist, such as no explicit write/upload tools or dedicated series for every biomarker, but garmin_connect_api mitigates most missing endpoints.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Exposes personal Garmin wellness data through MCP tools for accessing summary, sleep, HRV, heart rate, stress, body battery, and historical data.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Personal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.
      1
      MIT