Garmin Local MCP
Integrates with Garmin Connect to search exercises, preview structured workouts, read activity/workout/calendar summaries, and—when writes are enabled—create, update, schedule, and unschedule AI-tagged workouts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Garmin Local MCP Search Garmin exercises for dumbbell row, then preview 3x10 at 15 lb."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Garmin Local MCP
Create and manage Garmin Connect workouts through an AI app that supports local MCP servers. Runs on your computer, uses your own Garmin session, and exposes a small set of tools rather than the full Garmin API.
Status: local alpha. Python 3.12, macOS and Linux. No Windows support, hosted connector, or multi-user service in this release. This is an unofficial project, not affiliated with Garmin. Garmin authentication and endpoints can change.
What it does
Preview structured workouts without login or uploading.
Search Garmin's bundled strength exercise catalog.
Read compact activity, workout-library and calendar summaries.
Create, update in place, schedule and unschedule workouts when writes are enabled.
Support timed warmups, left/right steps, supersets, exercise notes and rest timers.
Supports running, cycling, cardio and strength. Swimming/multisport are outside
v1. The pinned library says walking/hiking workout models cannot be uploaded.
Strength loads accept pounds only (weight_lb). Kilogram input is disabled
until the upstream representation is independently verified. Do not supply kg
values in the pound field.
Related MCP server: Garmin Workouts MCP Server
Install and connect
Install uv, download or clone this repository, and enter its directory. Then:
uv sync --locked
uv run --locked garmin-mcp loginEnter your email, password and MFA code in the terminal, never in an AI chat. Every interactive login authenticates a fresh session; it replaces any previous local session only after successful authentication and saving. Each person should use their own computer/user account or a separate private token directory.
Add the following to an AI client's local MCP server configuration, replacing the command with the absolute path to your checkout:
{
"mcpServers": {
"garmin-local": {
"command": "/ABSOLUTE/PATH/garmin-local-mcp/.venv/bin/garmin-mcp",
"args": ["serve"]
}
}
}The client starts this process when it needs it. Preview and exercise search work without login. There is no HTTP listener. This local process configuration is not an installable phone connector; phone-only use needs a separately built remote service or a supported connection to a running computer.
To enable writes, change the arguments to ["serve", "--allow-writes"] and restart
the MCP connection. Configure your AI client to ask for approval for write calls.
The flag enables tools; it is not per-call human approval. Tool annotations
are hints and cannot enforce a client's approval UI.
Example prompt:
Search for the exact Garmin names, then preview a strength workout with three sets of ten dumbbell rows per arm at 15 lb per dumbbell and 60 seconds rest after both arms. Wait for me to review before creating it.
Tokens are saved to ~/.local/share/garmin-local-mcp/garmin_tokens.json. The parent
directory must be owned by you with mode 700 and the token file with mode 600.
Symlinks in the token path are rejected. Use --token-dir /absolute/private/path
on both login and serve for another location. Tokens are plaintext files
protected by permissions, not encrypted or stored in a system keychain.
MCP tools
Tool | Behavior |
| Validate/build a typed workout; return compact steps and totals without uploading |
| Search the bundled catalog for exact exercise names |
| Paginated date, type, distance, duration, average HR and training effects |
| Paginated ID, name, sport and estimated duration |
| Schedule and workout IDs over up to 31 days |
| Write-enabled only: create a new |
| Write-enabled only: replace an |
| Write-enabled only: schedule an |
| Write-enabled only: verify the calendar entry and its |
No delete, generic API, raw payload, filesystem or shell tools are exposed.
Read tools return summaries, not full workout definitions. The MCP write guard
requires a name beginning [AI] ; this reduces accidental edits but is not proof
of ownership. Untagged workouts can be updated using the explicit saved-plan CLI
below. The tools do not push workouts to a watch: send them from Garmin Connect.
See the exported tool schemas. Unknown inputs are rejected. Repeats are one level deep, with at most 500 expanded steps. The local validator's bounds do not guarantee a watch will accept every possible workout.
Workout input
{
"workout": {
"name": "Easy intervals",
"sport": "running",
"steps": [
{"kind": "warmup", "duration_seconds": 300},
{"kind": "repeat", "count": 3, "skip_last_rest": true, "steps": [
{"kind": "interval", "distance_meters": 500,
"target": {"kind": "pace_seconds_per_km", "low": 300, "high": 330}},
{"kind": "recovery", "duration_seconds": 60}
]},
{"kind": "cooldown", "duration_seconds": 300}
]
}
}Pace uses seconds/km (300 means 5:00/km). HR targets use heart_rate_bpm with
low/high values. Each executable step has exactly one of duration, distance, or
reps. Strength steps use an exact exercise name from search; add weight_lb and
notes as needed. Omit a load when unknown; zero is an explicit value.
Use notes to distinguish total weight, per dumbbell, per side, or added plate
weight. For unilateral exercises, use separate left/right steps with notes,
followed by one rest. A superset is a repeat group with both exercises and then
rest. skip_last_rest omits the group's final rest. Notes also support exercise
aliases when the catalog lacks an exact movement; the caller must review them.
Workout and step notes are preserved. There is no automatic weight progression. Preview duration sums fixed-time steps and programmed rests, accounting for skipped final rests. It excludes distance and repetition time, is marked partial when appropriate, and supplies that partial value to Garmin's estimate field.
Reusable saved plans
The synthetic example demonstrates the plan format. It is not a recommended training program and its ID is a placeholder.
mkdir -p private-workouts
cp examples/saved-workout.json private-workouts/my-workout.json
# Edit workout_id, expected_name and the complete workout definition.
# Obtain the actual ID/name using list_workouts or Garmin Connect.
uv run --locked python scripts/saved_workout.py private-workouts/my-workout.jsonThe command above only previews. After reviewing the plan, apply explicitly:
uv run --locked python scripts/saved_workout.py private-workouts/my-workout.json --applyThis CLI can update an existing untagged workout. It checks the exact ID, current name and sport, preserves the name/ID, skips writes when the definition already matches, and verifies the result. It replaces the full routine, not individual steps. Never apply the example unchanged. Private routines are gitignored and excluded from release archives. They still contain personal information: keep local copies and backups private.
Reuse the saved workout each week; re-uploading is unnecessary. To change it, edit the plan, preview, apply once, then send the updated version to your watch. Calendar scheduling, recurring jobs, and automatic progression are not created by this workflow.
Security, reliability and verification
Your AI provider receives the data returned by tools. Activity summaries omit GPS and account/profile fields. Treat Garmin text as data, not instructions.
Logging goes to stderr; upstream Garmin response logging is suppressed and API errors are sanitized. No application payload logs or recordings are created.
Tokens grant broader account access than the tool allowlist. Removing a local token file is not server-side revocation. See SECURITY.md.
Preview is a dry run, not an authorization token. Review actual write arguments.
Calls are serialized. The wrapper does not retry writes. Upstream may refresh authentication and repeat a request rejected with 401. Network failures can occur after a write succeeds; inspect Garmin before repeating create/schedule.
Unscheduling fails closed if it cannot identify the schedule's workout using
workoutScheduleIdandworkoutId. That response shape still needs live testing.Login, creation, and in-place strength updates with pound values, timed steps, repeats, supersets and notes have been read-back verified on one account. Device display/execution, other accounts, running/cycling uploads, and scheduling are not comprehensively live-tested. Read-back does not prove watch compatibility.
Offline tests use synthetic data and exercise validation, privacy filtering, write guards, token permissions and the real stdio protocol. CI does not contact Garmin. See CONTRIBUTING.md for commands.
The underlying API is provided by
python-garminconnect, with
FastMCP handling MCP. Runtime dependencies are pinned and
uv.lock captures the full environment. Review updates deliberately.
License
MIT. Dependency licenses remain their own.
Available Tools
5 toolslist_activitiesBRead-only
Recent activities, newest first. Returns selected metrics without GPS, account fields, or raw responses.
Inputs: limit, start. Returns: object
list_scheduled_workoutsBRead-only
List workout schedule IDs and associated workout IDs in a range of up to 31 days.
Inputs: end_date (required), start_date (required). Returns: object
list_workoutsBRead-only
List workout names, IDs, sport and duration. Other workouts can be read but only [AI] workouts can be changed.
Inputs: limit, start. Returns: object
preview_workoutARead-only
Validate and preview a workout without authentication or uploading. Pace is seconds/km; HR is bpm. Repeats have one level. Duration totals exclude distance/repetition steps.
Inputs: workout (required). Returns: object
search_exercisesARead-only
Search the bundled strength catalog. Use the exact returned name in an exercise step.
Inputs: term (required), limit. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool has a clearly distinct target: activities, workout definitions, scheduled workouts, workout preview/validation, and exercise catalog search. The two workout-listing tools are related but their descriptions make the distinction clear.
All tool names use consistent snake_case verb_noun conventions: list_*, preview_*, and search_*. The pattern is predictable and easy to reason about.
Five tools is a compact, well-scoped set for a local Garmin companion server. Each tool covers a distinct read or validation capability without excessive surface area.
The set only lists activities/workouts/schedules and previews workouts; it lacks tools to create, update, delete, or actually schedule/upload workouts despite implying changes to [AI] workouts. This leaves major lifecycle gaps for an agent trying to manage Garmin workouts.
Maintenance
Related MCP Connectors
List, fetch, create, edit (replace), delete and schedule structured workouts on Garmin Connect (runn
Garmin watch data for AI assistants: activities, sleep, HRV, recovery. Never writes to Garmin.
Convert, validate, and inspect workout files (FIT, TCX, ZWO, Garmin Connect) for AI agents.
Read your workouts, history, and stats; create and schedule new workouts. Writes are additive only.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceExposes Garmin Connect data and workout management to AI agents, supporting tools, resources, and prompts for health data, workout creation, and coaching workflows.1-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access Garmin Connect activities, workouts, and workout templates for querying and creating workout plans.6MIT
- AlicenseAqualityDmaintenanceBrings Garmin training data into Claude via Intervals.icu, enabling querying of activities, wellness, and planned workouts, as well as creating structured workouts that sync back to the Garmin watch.91MIT
- AlicenseNot gradedqualityDmaintenanceEnables listing, creating, editing, deleting, and scheduling structured workouts (run, cycle, swim, triathlon) on Garmin Connect via natural language.MIT