Skip to main content
Glama
durely
by durely

Get activity time series

garmin_get_activity_streams
Read-onlyIdempotent

Retrieve second-by-second Garmin activity stream data, downsampled for context, to analyze heart rate, power, speed, cadence, altitude, or location over a chosen time window.

Instructions

Get second-by-second data from one activity's FIT file, downsampled to fit in context.

Returns per field min/avg/max over the window, plus columnar series: t (seconds from the start of the activity, or of the leg for a multisport leg) and one array per field. Units: heart_rate bpm, power W, speed m/s, cadence steps/min (running) or rpm (cycling) or strokes/min, altitude m, distance m (cumulative), temperature °C, respiration_rate breaths/min, performance_condition (Garmin's -20..+20 score), vertical_oscillation mm, stance_time ms. Cadence averages leave out zeros.

Defaults to heart_rate, power, speed, cadence, altitude (whichever the activity has) at 10 s resolution, at most 500 points; the resolution coarsens automatically for long activities. Zoom in with start_s/end_s (e.g. one interval from garmin_get_activity_laps' start offsets) and a smaller resolution_s.

"position" adds GPS latitude/longitude and reveals where the user was: only request it when the user asks for location or route analysis. Developer fields (e.g. running power from a Connect IQ app) can be requested by the name listed in available_fields, like "dev_RP_Power".

Input Schema

NameRequiredDescriptionDefault
end_sNoWindow end, seconds from the start
fieldsNoFields to return: heart_rate, power, speed, cadence, altitude, distance, temperature, respiration_rate, performance_condition, vertical_oscillation, stance_time, position, or a dev_* field
start_sNoWindow start, seconds from the start
max_pointsNoUpper bound on points returned
activity_idYesGarmin activity ID from garmin_list_activities
resolution_sNoSeconds per point (minimum)
response_formatNo'json' (default) for the full series, 'markdown' for stats and a short preview tablejson

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.5.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the read-only, idempotent, non-destructive profile, but the description layers on substantial extra behavior: automatic coarsening for long activities, omission of zeros in cadence averages, and a privacy warning that 'position' reveals where the user was. This is exactly the kind of context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core summary, then organized by returns, defaults, zooming, and the position/dev_fields caveats. Slightly long and repeats a few schema defaults (10 s, 500 points), but every block carries actionable information, so it earns most of its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the burden of explaining returns; it does so clearly (per-field min/avg/max plus columnar t-series with one array per field). The only minor gap is not stating error conditions for an activity lacking requested fields (e.g., what happens if power is absent), but overall it is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds genuine meaning: units for every field (bpm, W, m/s, °C, etc.), the semantics of performance_condition (-20..+20), cumulativeness of distance, dev_* field lookup via available_fields, and how resolution_s/max_points interact. This goes well beyond the schema's one-line descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get second-by-second data from one activity's FIT file') and immediately adds the key constraint ('downsampled to fit in context'). It distinguishes itself from siblings by referencing garmin_get_activity_laps for finding window offsets, so an agent can route here vs. a laps or analyze tool without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains default behavior (which fields, 10s resolution, 500 points), how to zoom ('start_s/end_s and a smaller resolution_s'), and where to get offsets from garmin_get_activity_laps. It also gives an explicit guardrail: only request 'position' when the user asks for location or route analysis.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.