Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
GARMIN_EMAILNoYour Garmin email address.
GARMIN_PASSWORDNoYour Garmin password.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 true_range, which is computed over every sample.

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 confirm first. That returns the session written out in full and creates nothing. Show it to the athlete, and only call again with confirm=true once they have agreed — this puts a real workout on their Garmin account and onto their watch, and they should see it before that happens rather than after.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

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