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. |
Capabilities
Features and capabilities supported by this server
| 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 | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/NoaMatout/garmin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server