Skip to main content
Glama

get_activity

Read-only

Read ONE completed activity in full detail: all stats (NP, IF, TSS, avg/max power & HR, cadence, elevation, kJ, sRPE/load), heart-rate drift at the same power (cycling only), under one of two names: decouplingPct with decouplingBasis for ONE sustained effort (Pw:Hr across its halves), or hr_drift_across_reps for a session with reps (effort 1 vs the last at the same watts — a direction, not a verdict: the <5% line belongs to decouplingPct and does not transfer). When neither is present, decouplingNote says why. work_reps lists each sustained rep in order with the power it was ridden at and its heart rate as hr (mean), hrStart, hrEnd and hrMax — this is the athlete's own heart-rate graph as numbers, so read it instead of asking them for a screenshot of one. Read the SHAPE, not the mean: a rep that climbs and settles and one that climbs and keeps climbing average the same, as do a rep the athlete eased off and one he did not. Rising hrEnd at unchanged watts across reps is drift; flat is an aerobically clean session whatever any percentage says. Also returned: the interval structure, the device LAP structure if the file had laps, and both notes (note = the athlete's, coachNote = your earlier read). WHICH structure to read the session by is stated by structure_read_by: when the athlete has set this session to Laps on the card, structure/blocks ARE the file's laps and the detection travels alongside as structure_auto_detected — read the version they are looking at and don't re-cut the session into intervals they rejected. Otherwise it is our detection, as structure_detected/blocks_detected, with any laps as structure_laps — and when both are present, NEVER report a prescribed element as not done, cut short, or skipped on the strength of its absence from the detection alone: the detection reads the trace and can miss real work, while the laps are the athlete's own thumb on the button, so check both and grade on the laps when they disagree. Each detected block carries its own CADENCE and TERRAIN — 92rpm and -62m/11.4km mean the block lost 62 m over 11.4 km, i.e. a descent. Read them before attributing a power drop to fatigue: falling watts at a high cadence on a losing gradient is a rider out of gears, not a tiring one, and terrain is shown only where the net change exceeds 10 m. Use the id from list_activities. This is how you analyze how a session was actually executed (interval powers, rep consistency) before writing a coach read or adjusting the plan. Returns BOTH zone splits when the file supports them: time_in_zone_min is the stored measure and time_in_zone_basis names which quantity it is (%FTP, %threshold pace, or %maxHR) — read it before comparing this session's zone minutes with another's, because the same key is not the same quantity across activities. Two more preconditions travel with their numbers: tss_basis says whether a run's rTSS was grade-adjusted or read off raw pace (no altitude in the file), and np_caveat appears when the ride is too short for a 30-second rolling average to be stable. hr_time_in_zone_min is the heart-rate split, which the stored column never holds for a run — use it to tell a real physiological excursion from pace running ahead of a stale threshold mark. Its ref field names the maxHR the percentages are taken from; when that says it is a default rather than the athlete's measured maximum, say so instead of quoting the zones as precise. description is what the athlete (or the app that recorded the session) wrote on Strava / intervals.icu — on a gym session pushed from an app like Motra it holds every exercise, set, rep and weight, and since such a file carries neither power nor distance it is not a remark ABOUT the session, it IS the session: read it as the content and grade against it. list_activities flags its presence as hasDescription.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare a safe read, yet the description discloses rich behavior: how structure_read_by changes which structure to trust, the rule to grade on laps when laps and detection disagree, decoupling naming and its <5% line, cadence/terrain attribution, tss_basis and np_caveat preconditions, and zone-basis caveats. This is far beyond what annotations provide.

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

Conciseness3/5

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

Front-loaded with the core purpose, and most sentences carry substantive field semantics, but the body is an extremely dense run-on that packs many concepts into single sentences. Useful content is present, yet the sprawl works against quick scanning and some clause repetition could be trimmed.

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

Completeness5/5

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

With no output schema, the description assumes the full burden of explaining the return shape and does so exhaustively — stats, decoupling fields, work_reps sub-fields, structure variants, zone splits with basis and ref, and the description field. Nothing needed to interpret the response is missing.

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

Parameters4/5

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

Schema coverage is 0% and the single id param is undocumented in the schema, but the description states where the id comes from ('Use the id from list_activities'), supplying the missing semantics. It adds no further constraints on the value, so it is strong but not exhaustive.

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 ('Read ONE completed activity in full detail') and enumerates the returned content (stats, HR drift, work_reps, interval/lap structure, notes, zone splits). It clearly distinguishes the single-activity read from list_activities and get_activity_series.

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

Usage Guidelines4/5

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

Gives clear context for use ('how you analyze how a session was actually executed ... before writing a coach read or adjusting the plan') and routes the agent to list_activities for the id. It does not explicitly delimit when to prefer get_activity_series over this tool, so it stops short of full when/when-not guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources