garmin-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GARMIN_EMAIL | No | Your Garmin email address. | |
| GARMIN_PASSWORD | No | Your Garmin password. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_activitiesA | List recorded activities, most recent first. Args: since: Only activities on or after this ISO date (e.g. "2026-03-01"). activity_type: Filter by sport — running, cycling, swimming, transition, multisport. Filtering by sport also reveals the legs inside multisport events, so asking for running includes the run of a triathlon. limit: Maximum activities to return (default 20, capped at 200). until: Only activities before this ISO date. Returns a compact record per activity. Multisport events appear as a single entry unless a sport filter is given. |
| get_activity_detailA | Full detail for one activity: summary, laps, and multisport legs. Args: activity_id: The activity's id, as returned by list_activities. Laps are what make an interval session legible — eight quarter-mile repeats look identical to a steady run in the summary numbers alone. |
| get_activity_streamsA | Time series for one activity — heart rate, pace, altitude and so on. Args: activity_id: The activity's id. fields: Which series to return. Defaults to heart_rate, speed and altitude. Available: heart_rate, speed, altitude, cadence, power, distance, temperature, grade, lat, lon, vertical_oscillation, stance_time, step_length, respiration_rate. max_points: How many points per series (default 200, capped at 2000). Series are averaged into buckets rather than returned raw — a three-hour ride holds around 11 000 samples per channel. Output is columnar: {"heart_rate": [...], "elapsed_s": [...]}. Because the series is smoothed, its own highest and lowest values
understate the real ones. Read peaks from |
| weekly_summaryA | Training totals for one week, broken down by sport. Args: week_start: Any ISO date within the week of interest. Snapped back to the Monday, so "2026-03-18" and "2026-03-16" describe the same week. Defaults to the current week. Multisport events count once, at their combined distance, rather than once per leg. |
| compare_activitiesA | Compare two activities side by side, with the differences computed. Args: id_a: First activity id. id_b: Second activity id. Deltas are calculated here rather than left to the reader, including a plain-language verdict on pace — where a positive number means slower, which is easy to misread. |
| database_statusA | What the database currently holds, and whether it is reachable. Worth calling before concluding that an activity is missing: an empty result may mean nothing has been ingested yet rather than that the session never happened. |
| sync_nowA | Pull new activities from Garmin right now, without leaving the conversation. Args: limit: Maximum activities to download (default: the configured batch size, 25). Requires the ingest worker to be running — it is the only process allowed to write, since DuckDB grants exclusive access to a single writer. If no worker is listening this fails immediately with instructions, rather than appearing to hang. Also imports anything waiting in data/inbox/, which needs neither network nor credentials. |
| create_workoutA | Create a structured workout in the athlete's Garmin library. Args: name: What the session is called, e.g. "Threshold 4x2km". blocks: The session, in order. A block is either a step or a repeat. Step: {"kind": "warmup"|"interval"|"recovery"|"cooldown"|"rest", "duration_s": 1200} or {"distance_m": 2000}, optionally "target_pace": "3:55" and "pace_tolerance_s": 5. Exactly one of duration_s or distance_m per step. Repeat: {"times": 4, "steps": [ ...steps... ]} sport: running, cycling or swimming. description: Optional note attached to the workout. confirm: Must be true to actually create it. Call this without Example blocks for "20 min easy, then 12 x 1 min at 3:45 with 1 min float": [{"kind": "warmup", "duration_s": 1200}, {"times": 12, "steps": [ {"kind": "interval", "duration_s": 60, "target_pace": "3:45"}, {"kind": "recovery", "duration_s": 60}]}, {"kind": "cooldown", "duration_s": 600}] |
| delete_workoutA | Remove a workout from the athlete's Garmin library. Args: workout_id: The id returned by create_workout. confirm: Must be true to actually delete. The undo for create_workout. Same two-step rule: without confirm it reports what would be removed and does nothing. |
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 9 tools
Each tool has a clearly distinct purpose: activity retrieval, streams, weekly aggregation, comparison, workout creation/deletion, sync, and database status. No two tools overlap in functionality, so an agent can reliably select the correct one.
Most tools follow a verb_noun pattern (list_activities, create_workout, get_activity_detail), but weekly_summary and database_status are noun phrases, and sync_now is verb+adverb. The mixed style is still readable and predictable, but not perfectly uniform.
Nine tools is well within the ideal 3-15 range. Each tool covers a distinct operation needed for a Garmin data server, and none feel redundant or unnecessary.
Activity data is comprehensively covered: list, detail, streams, weekly summary, and comparison. Workout creation and deletion are present, but there is no way to list or update existing workouts, which is a minor gap for managing a workout library. Sync and status tools round out the surface well.