Skip to main content
Glama
matisdsp

io.github.matisdsp/fartlek

by matisdsp

Fartlek

A coach's morning report from your Garmin data, for any LLM via MCP.

Every other Garmin MCP server hands the LLM a filing cabinet of raw JSON — one night of sleep is ~52K tokens, one activity stream ~155K. The model can't read it, so it skims and improvises. Fartlek does the synthesis server-side: computed sports-science metrics (CTL/ATL/TSB, ACWR, monotony, calibrated training load), personal baselines with significance floors, safety alerts — delivered as compact, verdict-first reports the model can actually reason about.

The token contract (v0.1): calling every tool in the catalog once, at default arguments, costs under 9K tokens — a sixth of one raw Garmin sleep payload. Excluding the garmin_raw escape hatch, the whole synthesis surface sums to under 4K. Hard caps are enforced per response by the renderer, with disclosed truncation.

Status: v0.1 (Phase 1). 8 synthesis tools; the trend suite (weekly review, multi-week load, fitness/race outlook, recovery audit) ships with v0.2. Design: docs/DESIGN.md · plan: ROADMAP.md · contributors: docs/HANDOFF.md.

The tools

Tool

What it answers

Cap

garmin_brief

"How am I today — can I train hard?" Fused GREEN/AMBER/RED verdict vs your own baselines

600

garmin_activities

Browse the log, get activity IDs

1,300

garmin_activity

One session in depth: reps, fade, comparison to your most similar past session

1,000–4,000

garmin_athlete

Reference card: zones, PRs, goal, data coverage

600

garmin_gear

Shoe/bike mileage vs your Garmin-set retirement limits, and what you're actually rotating

500

garmin_set_profile

Tell it your goal race / phase / availability (local only)

200

garmin_log

Log RPE, wellness, illness/injury — the athlete outranks the sensors

120

garmin_sync

Force refresh / deepen history backfill

150

garmin_raw

Bounded, compacted escape hatch to named raw sources

5,000

First call on a fresh install runs the cold start automatically (~30 API calls, ≈1 minute): 180 days of history, warm CTL/ATL from day 0, then background sleep/HRV backfill.

Related MCP server: claude-garmin

Quickstart

Install with either:

# uv (recommended) — runs without cloning
uvx fartlek-mcp

# or pipx
pipx install fartlek-mcp

Or clone and run from source (requires Python ≥ 3.12 and uv):

git clone https://github.com/matisdsp/fartlek && cd fartlek
uv sync

# One-time Garmin login (email/password + MFA if enabled).
# Credentials are never stored; OAuth tokens go to ~/.fartlek/tokens/.
uv run fartlek auth

# Optional but recommended: warm the local store now instead of on first use
uv run fartlek sync --nights 60

uv run fartlek doctor   # check everything is healthy

Then point your MCP client at the server.

Any MCP-compatible client works — the server speaks standard JSON-RPC over stdio, so it is client-agnostic. The snippets below are just the per-client config formats; Claude Desktop, Claude Code, Cursor, Continue, Cline, Windsurf, Zed, VS Code (Copilot Chat), and Gemini CLI all work. The universal invocation is uvx fartlek-mcp.

Claude Code — from this directory, .mcp.json is picked up automatically. From anywhere else:

claude mcp add fartlek -- uvx fartlek-mcp

Claude Desktopclaude_desktop_config.json:

{
  "mcpServers": {
    "fartlek": {
      "command": "uvx",
      "args": ["fartlek-mcp"]
    }
  }
}

Cursor.cursor/mcp.json, same command/args block as above.

Continue / Cline / Windsurf / Zed — same pattern: wherever the client keeps its MCP server list, add a fartlek entry with command: "uvx", args: ["fartlek-mcp"]. Most editors adopt the Claude Desktop format verbatim.

Any other stdio MCP client — invoke the server binary directly:

fartlek-mcp          # speaks JSON-RPC over stdin/stdout

Ask things like "can I go hard today?", "analyze my last run", "how did I sleep this week?" — and tell it how sessions felt: your reported RPE and illness notes gate the readiness verdict.

Docker

Build and run locally:

docker build -t fartlek-mcp .
# Tokens and store are persisted in ./fartlek-data on the host
mkdir -p fartlek-data
docker run -i --rm -v "$PWD/fartlek-data:/data" fartlek-mcp

For fartlek auth, run it interactively once to populate the volume, then use the image as the MCP server:

docker run -it --rm -v "$PWD/fartlek-data:/data" --entrypoint fartlek fartlek-mcp auth

CLI

Command

What it does

fartlek auth

one-time Garmin Connect login (MFA supported), tokens stored locally

fartlek sync [--nights N]

manual sync (tier 0+1, optional N-night sleep/HRV backfill)

fartlek doctor

check tokens, Garmin connectivity, local store health

fartlek accounts

list local accounts

fartlek export [dir]

export the store (consistent SQLite snapshot + CSV per table)

fartlek reset

wipe all local tokens and data (asks confirmation)

Environment: GARMINTOKENS overrides the token location, FARTLEK_HOME the data directory (default ~/.fartlek).

Releasing to PyPI (maintainers)

Releases are published via trusted publishing (OIDC) — no API tokens anywhere.

  1. On pypi.org → Account settings → Publishing → add a GitHub publisher:

    • PyPI project name: fartlek-mcp · owner: matisdsp · repo: fartlek

    • Workflow: release.yml · environment: pypi

  2. Bump version in pyproject.toml, commit, then tag and push:

git tag v0.1.0 && git push origin v0.1.0

The release workflow builds, runs tests, and uploads to PyPI. A published version can't be overwritten — to fix a mistake, bump to the next patch (0.1.1).

Privacy

Local-first: stdio transport, your credentials and health data never leave your machine. The server only talks to Garmin's API with your own tokens, sequentially and rate-limited. fartlek export gives you everything; fartlek reset removes everything.

How Fartlek reaches your data — read this before connecting an account

Garmin has an official developer programme, and Fartlek is not part of it. Like every other open-source Garmin client, it signs in with your own credentials and reads the same endpoints the Garmin Connect apps use. Those endpoints are not published for third-party use, and Garmin's Terms of Use list, among examples of prohibited conduct, "using any process, whether automated or manual, that accesses, copies, or scrapes content from the Site through any means not purposely made available through the Site."

What that means in practice:

  • Your account is yours to risk. Garmin can rate-limit, block, or suspend accounts for automated access. Fartlek is deliberately polite — sequential calls, backoff on 429, and Garmin is contacted only by the sync process, never per question — but politeness is not permission.

  • It can break without warning. Garmin changed its login in March 2026 and broke every third-party client for weeks. This will happen again.

  • Read-only, by decision. Fartlek never writes to Garmin: no workouts pushed to your watch, no training plans, no edits to your activities. The two tools that write (garmin_log, garmin_set_profile) write to the local SQLite store and nothing else. Pushing structured workouts was specified and then dropped — see docs/DESIGN.md §2.4. Garmin's Training API is the sanctioned route for that, and it requires a cloud-to-cloud integration, which would mean your data leaving your machine.

  • Nothing is redistributed. Your data stays on your disk. Fartlek's own responses are derived from it and are shown only to you and the LLM client you chose.

If that trade-off is not one you want to make, do not connect an account. This is stated here rather than buried, because it is the kind of thing you should decide before installing, not discover afterwards.

License & trademark

Apache 2.0. Fartlek is an independent open-source project, not affiliated with, endorsed by, or sponsored by Garmin Ltd. "Garmin" is used only to describe compatibility with Garmin Connect data.

Available Tools

14 tools
garmin_activitiesA
Read-only

Browse the log and get activity IDs. One row per session, each carrying the activity_id garmin_activity accepts. Filter by date range and sport; truncation is disclosed with narrowing advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sportNo
end_dateNoYYYY-MM-DD, default today
start_dateNoYYYY-MM-DD, default today−13d

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

With annotations already indicating readOnlyHint=true and destructiveHint=false, the description adds valuable behavioral context: it discloses truncation behavior ('truncation is disclosed with narrowing advice') and describes the output structure ('One row per session, each carrying the activity_id'). This goes beyond the annotations by explaining result-set limits and the relationship to garmin_activity.

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

Conciseness5/5

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

The description is three concise sentences, front-loaded with the primary action ('Browse the log and get activity IDs'). Each sentence adds essential information: purpose, output format, and filtering/truncation behavior. No wasted words or redundancy.

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?

Given the output schema exists and the tool has four optional parameters, the description covers the core functionality, filtering options, truncation behavior, and the connection to garmin_activity. It doesn't mention default date ranges or limit defaults, but these are documented in the schema. The description is sufficiently complete for a read-only browsing tool.

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

Parameters3/5

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

Schema description coverage is 50%, with start_date and end_date having explicit date format descriptions. The description mentions 'Filter by date range and sport,' which adds context for sport and date parameters, but it does not clarify the 'limit' parameter beyond what the schema already provides (min/max/default). The truncation hint partially compensates, but the tool could be more explicit about how limit interacts with truncation.

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?

The description clearly states the tool's purpose: 'Browse the log and get activity IDs.' It specifies the resource (the log) and the action (browse/get IDs), and distinguishes itself from sibling tools like garmin_activity by noting the IDs are what that tool accepts. This makes the tool's role unambiguous.

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?

The description provides clear usage context: 'Filter by date range and sport; truncation is disclosed with narrowing advice.' This indicates when filters should be applied to avoid truncation. It also implicitly guides the user to use garmin_activity for further details on each activity. However, it lacks explicit when-not-to-use guidance or direct comparison with alternatives like garmin_log.

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

garmin_activityA
Read-only

ONE session in depth: execution vs structure, rep-by-rep fade, decoupling, comparison to the closest past session, planned-vs-executed. Select by activity_id, by date, or omit both for the latest — add sport for the latest of that sport. 'splits' adds the lap table; 'full' adds an HR/pace curve.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD
sportNo
detailNostandard
activity_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: the kinds of analysis performed (e.g., 'rep-by-rep fade', 'planned-vs-executed'), the selection fallback to the latest activity, and the addition of lap tables or HR/pace curves for 'splits' and 'full'. No contradictions exist.

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

Conciseness5/5

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

Three compact sentences deliver all key information with no fluff. The first sentence front-loads the core purpose, the second covers selection logic, and the third explains detail levels. Every clause adds value and is appropriately sized for the complexity.

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?

Given the tool's moderate complexity and the presence of an output schema, the description covers purpose, selection modes, detail levels, and analytical insights. It is complete enough for an agent to select and invoke the tool correctly. The 'ONE session' phrasing also prevents confusion with the plural sibling garmin_activities.

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 description coverage is only 25%, so the description must compensate, and it does extensively. It explains how activity_id, date, and sport interact in selection, and clarifies that omitting both activity_id and date returns the latest activity. It also gives meaning to the 'detail' parameter by specifying what 'splits' and 'full' add. This is well beyond the schema's bare parameter names.

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?

The description opens with 'ONE session in depth,' clearly identifying the resource (a single Garmin activity/session) and the operation (retrieving detailed analysis). It distinguishes itself from the sibling tool 'garmin_activities' by explicitly focusing on one session rather than a list, and the phrases 'execution vs structure, rep-by-rep fade, decoupling, comparison to the closest past session, planned-vs-executed' specify the kind of depth provided.

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?

Provides explicit selection instructions: 'Select by activity_id, by date, or omit both for the latest — add sport for the latest of that sport.' It also explains when to use 'splits' and 'full' detail levels. However, it does not explicitly name alternatives or state when not to use this tool versus siblings, though the 'ONE session' wording implies the contrast with garmin_activities.

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

garmin_athleteA
Read-only

Reference card: zones, thresholds, PRs, goal and phase, baselines, injury notes, device data coverage. Call once when athlete context is unknown; it changes rarely. To change it, garmin_set_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read operation. The description adds behavioral context by noting the data 'changes rarely' and suggesting a single call, which informs the agent about stability and call frequency. It does not contradict annotations, and the added context goes beyond what the structured fields provide.

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

Conciseness5/5

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

The description is two sentences with no redundant words. The first sentence lists the data categories in a compact, scannable format. The second sentence delivers usage guidance and the sibling reference. Every clause contributes meaning.

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?

Given that the tool has an output schema (which handles return details), no parameters, and annotations covering safety, the description fully covers the essential context: what the tool provides, when to call it, and how to update the underlying data. The presence of sibling tools like 'garmin_reference' and 'garmin_set_profile' makes the explicit differentiation valuable and complete.

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?

The tool has zero parameters, so the schema contains no information to clarify. The description's content list serves as the semantic context for what the tool returns, effectively compensating for the lack of parameters. With no params, the baseline is 4, and the description meets that baseline by conveying the scope of the reference card.

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?

The description uses 'Reference card' followed by a concrete list of contents (zones, thresholds, PRs, goal and phase, baselines, injury notes, device data coverage), making the tool's purpose immediately clear. It also distinguishes itself from the sibling 'garmin_set_profile' by explicitly stating that changing the profile is a different tool's job.

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?

The description gives explicit when-to-use guidance: 'Call once when athlete context is unknown; it changes rarely.' It also provides an alternative: 'To change it, garmin_set_profile.' This clearly tells the agent when to invoke this tool and when to use a sibling instead.

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

garmin_briefA
Read-only

Call FIRST for anything about TODAY: readiness, whether to train, current state. Zero arguments. Returns a fused go/modify/rest verdict against personal baselines, active alerts, yesterday's session with its activity_id, and today's planned workout. One session → garmin_activity; browsing → garmin_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD, default today

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already mark readOnlyHint and destructiveHint, so the bar is lower. The description adds useful output context (verdict, alerts, yesterday's activity_id, planned workout). However, the claim 'Zero arguments' is factually wrong since the schema includes an optional date parameter, which undermines transparency.

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?

The description is compact, front-loaded, and free of fluff. The 'Zero arguments' inaccuracy is a minor blemish, but overall it earns its place.

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?

Given the presence of an output schema and strong annotations, the description covers what the tool does, when to use it, and how it differs from siblings. The only notable gap is the misleading argument count, but the core functionality is sufficiently complete for a read-only brief.

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

Parameters2/5

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

The schema alone covers the date parameter with 100% coverage and a clear description. But the tool description's false 'Zero arguments' statement actively misleads the agent about parameter usage, so the description detracts from rather than adds to parameter understanding.

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?

The description clearly states what the tool does: provides a fused daily brief for today's readiness and training status. It differentiates from siblings by explicitly directing to garmin_activity for a single session and garmin_activities for browsing.

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?

It explicitly instructs 'Call FIRST for anything about TODAY' and gives clear alternatives: 'One session → garmin_activity; browsing → garmin_activities.' This is textbook when-to-use guidance.

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

garmin_fitnessA
Read-only

Is training working: VO2max and efficiency trends, HR at a fixed pace, long-run durability, a race projection against the stored goal, and form projected to race day with taper guidance. Call for 'am I getting fitter', race planning, taper timing, goal feasibility. Set the goal with garmin_set_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
weeksNowindow length, default 12
anchor_dateNoYYYY-MM-DD, default today

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already mark readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds analytical scope and dependency on a stored goal ('against the stored goal', 'projected to race day') but offers no behavioral details such as data source freshness or error conditions.

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?

Text is two sentences plus an introductory clause; front-loaded with 'Is training working', then lists outputs and use cases. Some redundancy exists: race projection/race planning and taper guidance/taper timing are repeated in the second sentence.

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?

With read-only annotation, an output schema, and a 2-parameter schema that fully documents inputs, the description provides enough context for a typical agent. It covers primary use cases and related tool, though it omits edge-case behavior when no goal is stored.

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

Parameters3/5

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

Input schema covers both parameters (weeks, anchor_date) with descriptions and defaults, so description need not repeat them. Description does not mention these parameters at all, but schema coverage is 100%, so baseline 3 applies.

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?

Description opens with 'Is training working:' and enumerates specific outputs (VO2max, efficiency trends, HR at fixed pace, long-run durability, race projection, form/taper). It distinguishes from siblings by naming a related tool for setting goals and specifying call intents like 'am I getting fitter'.

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?

'Call for 'am I getting fitter', race planning, taper timing, goal feasibility' provides explicit when-to-use guidance, and points to garmin_set_profile for goal configuration. However, it does not explicitly list exclusions or alternative analytical tools.

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

garmin_loadA
Read-only

Multi-week dose: fitness/fatigue/form (CTL/ATL/TSB), ramp rate, ACWR, monotony/strain, and intensity drift vs this athlete's own norm. Call for 'am I training too much', ramp/taper dosing, periodization. Not single-day readiness (garmin_brief); overtraining physiology is garmin_recovery.

ParametersJSON Schema
NameRequiredDescriptionDefault
weeksNowindow length, default 8
anchor_dateNoYYYY-MM-DD, default today

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful context: it reports multi-week trends normalized to the athlete's own norm and excludes single-day readiness. This goes beyond the annotation safety profile without contradicting it.

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

Conciseness5/5

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

Two sentences, densely packed with domain-specific information. Front-loaded with the core output and followed by usage and exclusions. No wasted words.

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?

The tool's complexity, output schema availability, and sibling context are fully addressed. The description covers the key domain, use cases, and alternatives, while the existence of an output schema eliminates the need to explain return values. Parameters are fully documented in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description does not elaborate on the parameters (weeks, anchor_date), but the schema already documents them adequately. No additional semantic value is provided beyond the schema.

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?

The description uses a specific verb 'load' with a clear resource: multi-week training load metrics (CTL/ATL/TSB, ramp rate, ACWR, etc.). It explicitly contrasts with sibling tools (garmin_brief, garmin_recovery), making its unique purpose unmistakable.

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?

Explicitly states when to call ('am I training too much', ramp/taper dosing, periodization) and what it is NOT for (single-day readiness, overtraining physiology), naming the alternative tools. This provides unambiguous usage guidance.

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

garmin_logA
Idempotent

Subjective data the watch cannot capture: session RPE (1-10), Hooper wellness (fatigue, soreness, stress, mood, sleep quality, each 1-7), and notes — especially illness or injury (set flag; resolve when healed). Feeds sRPE load and caps the readiness verdict. Ask for RPE after discussing a session if missing.

ParametersJSON Schema
NameRequiredDescriptionDefault
rpeNo
dateNoYYYY-MM-DD, default today
flagNo
moodNo
noteNo
stressNo
fatigueNo
sorenessNo
activity_idNo
resolve_flagNo
sleep_qualityNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, idempotent=true, destructive=false), the description discloses important downstream effects: the data 'feeds sRPE load and caps the readiness verdict.' It also explains the flag lifecycle ('set flag; resolve when healed'), adding behavioral context far beyond what annotations alone provide.

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

Conciseness5/5

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

The description is three sentences, with the core purpose front-loaded in the first phrase. Every sentence adds value: field enumeration, downstream consequences, and a specific interaction guideline. No filler or redundant restatement of the tool name.

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?

For an 11-parameter, presumably write-oriented tool, the description covers what to log, the exact scales, the flag lifecycle, the effect on load/readiness, and when to prompt for missing data. The existence of an output schema reduces the need to describe return values, and the description stands well alongside sibling tools.

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?

Despite the very low schema description coverage (9%), the description compensates thoroughly by enumerating all key parameters with their scales: RPE 1-10, Hooper wellness dimensions (fatigue, soreness, stress, mood, sleep quality) each 1-7, notes, and flags. It also clarifies the resolve_flag behavior and the expected values for wellness parameters.

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?

The description opens with 'Subjective data the watch cannot capture,' clearly identifying the tool's resource and scope: logging RPE, Hooper wellness, notes, and flags. It distinguishes itself from sibling tools by contrasting with objective watch-captured data, and names concrete fields with ranges.

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?

The description gives explicit guidance for when to log RPE ('Ask for RPE after discussing a session if missing') and when to set/resolve illness or injury flags. It implies the tool is for subjective data only, which differentiates it from objective sibling tools, but it does not explicitly name alternatives or state when not to use it.

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

garmin_rawA
Read-only

Bounded escape hatch to one named Garmin source, compacted and hard-capped. Use ONLY when a synthesis tool cannot answer and the user explicitly asks for raw values. Never a starting point.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD, default today
seriesNo
sourceYes
max_pointsNo
activity_idNorequired for activity_* sources and weather

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it is 'compacted and hard-capped,' 'bounded,' and tied to a single named source. This gives the agent a clear expectation of constrained, raw output, though it does not detail response formatting or edge cases.

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

Conciseness5/5

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

The description is two sentences with no filler. It front-loads the core concept ('Bounded escape hatch'), immediately adds usage restrictions, and ends with a clear prohibition. Every phrase earns its place, making it highly concise and well-structured.

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?

Given that an output schema exists and annotations cover safety, the description does not need to explain return values or destructive behavior. It provides essential context about boundedness, raw values, and usage policy. It does not enumerate all source-specific dependencies, but the schema covers those details, so the description is reasonably complete for a deliberately constrained escape-hatch tool.

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

Parameters2/5

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

Schema description coverage is only 40%, so the description should compensate. It only implicitly references 'source' via 'one named Garmin source' and 'hard-capped' via max_points, but provides no guidance on date, series, or activity_id dependencies. The schema itself documents activity_id as required for activity_* sources and weather, but the description adds minimal parameter-level value.

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

Purpose4/5

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

The description conveys that this is a bounded way to access raw values from a single named Garmin source, and explicitly contrasts it with synthesis tools by saying 'Use ONLY when a synthesis tool cannot answer and the user explicitly asks for raw values.' However, it relies on the metaphor 'escape hatch' instead of a direct verb like 'retrieve' or 'fetch,' so it is clear but not maximally explicit.

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?

The description gives explicit when-to-use guidance: only when a synthesis tool cannot answer and the user explicitly requests raw values. It also states a firm exclusion: 'Never a starting point.' This clearly distinguishes it from sibling synthesis tools and prevents inappropriate first-use.

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

garmin_recoveryA
Read-only

Sleep, HRV, resting HR and load structure vs personal baselines, plus the multi-marker overtraining audit. Call for tiredness, sleep, 'am I overtraining or getting sick', or when another tool flags recovery. OWNS overtraining questions. Single-day go/no-go is garmin_brief.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNowindow length, default 28
anchor_dateNoYYYY-MM-DD, default today

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so no safety disclosure is needed. The description adds behavioral context: it compares to personal baselines and performs a multi-marker audit, which clarifies the analysis scope. It does not mention any side effects or limitations, but for a read-only tool that is acceptable.

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

Conciseness5/5

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

The description is three tight sentences, front-loaded with the tool's core outputs. Every sentence earns its place: what it provides, when to call it, and how it differs from a sibling tool. No redundancy or filler.

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 a rich output schema present, the description doesn't need to detail return values. It covers purpose, usage triggers, exclusions, and ownership. The two optional parameters are simple and well-documented in the schema, leaving no significant gaps.

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

Parameters3/5

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

Schema coverage is 100%: both 'days' and 'anchor_date' have clear descriptions in the input schema. The description doesn't add extra parameter detail, but with complete schema coverage, baseline 3 is appropriate. It implicitly refers to a time window ('vs personal baselines') without augmenting the schema.

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?

The description clearly identifies the tool's function: analyzing sleep, HRV, resting HR, and load structure against personal baselines, plus an overtraining audit. It distinguishes itself from siblings by explicitly claiming ownership of overtraining questions and pointing to garmin_brief for single-day go/no-go.

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?

It gives explicit trigger conditions: 'Call for tiredness, sleep, am I overtraining or getting sick, or when another tool flags recovery.' It also specifies what it does not cover (single-day go/no-go is garmin_brief), providing clear alternatives.

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

garmin_referenceA
Read-only

How a number was computed and whether to trust it: formula, inputs, whether each threshold is a population default or personally derived, and the caveats. No arguments for the index; metric='acwr' for one in depth.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNometrics_glossary
metricNoone metric name

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds meaningful context about what the output contains (formula, inputs, thresholds, caveats), which goes beyond the annotations and helps the agent understand what to expect.

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

Conciseness5/5

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

The description is two sentences long and front-loaded with the core purpose. It avoids redundancy and every phrase adds value, making it highly concise and well-structured.

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?

For a reference tool with an output schema and two optional parameters, the description provides sufficient context: what it computes, trustworthiness, and usage modes. It could be more explicit about how it relates to sibling tools like garmin_brief or garmin_fitness, but it is otherwise complete.

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

Parameters3/5

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

Schema description coverage is 50% (only 'metric' has a description). The description partially compensates by indicating that 'metric' specifies a single metric for in-depth info and that no arguments are needed for the index. However, the 'topic' parameter is not explained, leaving some ambiguity.

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

Purpose4/5

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

The description clearly explains that the tool provides reference information about how metrics are computed, including formulas, inputs, thresholds, and caveats. It is distinct from sibling tools which likely focus on data retrieval or summaries, though it lacks an explicit verb like 'returns' or 'provides'.

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?

The description gives direct usage guidance: 'No arguments for the index; metric="acwr" for one in depth.' This clarifies two modes of invocation. However, it does not explicitly compare with alternative sibling tools or state when not to use it.

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

garmin_set_profileA
Idempotent

Athlete context the watch cannot know: goal race (date; a distance, or a fixed-time event like 24h with a target distance), phase, weekly availability, intensity preference, LT1 override. Local only; only provided fields change. Injuries and illness go to garmin_log.

ParametersJSON Schema
NameRequiredDescriptionDefault
phaseNo
goal_timeNoH:MM:SS, distance races only
phase_weekNo
tid_targetNo
goal_distanceNo
goal_custom_kmNowith goal_distance='custom'
goal_race_dateNoYYYY-MM-DD
goal_target_kmNofor fixed-time events (6h/12h/24h)
lt1_hr_overrideNo
availability_daysNo
phase_total_weeksNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds valuable behavioral context: 'Local only' and 'only provided fields change' disclose that the tool operates on a local profile and performs partial updates without affecting unspecified fields. This goes beyond what annotations alone convey.

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

Conciseness5/5

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

The description is two sentences, with the core content front-loaded and no redundant phrases. Every clause adds information: the field list, the local/partial update semantics, and the sibling-tool exclusion. It is concise without sacrificing clarity.

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?

Given the tool's complexity (11 optional parameters) and the presence of an output schema, the description provides sufficient high-level context: what the profile is for, which fields are affected, and the boundary with garmin_log. It lacks detailed cross-parameter relationships, but those are partially captured in schema descriptions, and the local/partial update statement reduces risk of misuse.

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?

With only 36% schema description coverage, the description compensates by grouping parameters into semantic categories: goal race (date, distance, fixed-time), phase, weekly availability, intensity preference, LT1 override. It enriches the meaning of parameters like goal_target_km by explaining fixed-time events (e.g., '24h with a target distance'). However, not every parameter (e.g., phase_week, phase_total_weeks) is explicitly mentioned, though they fall under 'phase'.

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

Purpose4/5

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

The description states the resource ('athlete context the watch cannot know') and lists the specific fields that are set, distinguishing it from the sibling tool garmin_log. Though it lacks an explicit verb like 'set' or 'update', the tool name supplies that action and the description enumerates the profile attributes, making the purpose clear.

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?

The description gives explicit when-not-to-use guidance ('Injuries and illness go to garmin_log') and clarifies the scope of use ('Local only; only provided fields change'). It implies when to use the tool—when providing athlete context the watch cannot know—but does not explicitly state alternatives beyond the garmin_log exclusion.

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

garmin_syncA

Force a refresh and report freshness, or start a resumable historical backfill (backfill_days > 0, deepens sleep/HRV history). Use only if data looks stale — every other tool auto-refreshes.

ParametersJSON Schema
NameRequiredDescriptionDefault
backfill_daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

The description adds behavioral detail beyond annotations, such as the effect of backfill_days (deepens sleep/HRV history), the resumable nature of backfill, and that it reports freshness. While it doesn't discuss rate limits or side effects, it provides meaningful context for a mutation tool with minimal annotation coverage.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary action, and no unnecessary words. Every clause adds value: the backfill explanation, the resumable nature, and the usage warning.

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?

Given the presence of an output schema (noted in context) and the clarity of sibling relationships, the description covers the essential aspects: purpose, usage conditions, parameter semantics, and behavioral expectations. It is complete for a tool of this complexity.

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?

Even though schema coverage is 0%, the description explains the semantic of backfill_days: 'backfill_days > 0, deepens sleep/HRV history.' This compensates for the lack of parameter descriptions in the schema, though it doesn't mention the default or range (which are in the schema).

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?

The description states a specific verb and resource: 'Force a refresh and report freshness, or start a resumable historical backfill.' It clearly distinguishes this from siblings by noting that 'every other tool auto-refreshes,' implying this is the manual override.

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?

Explicit usage guidance is provided: 'Use only if data looks stale.' It also implicitly names the alternative (every other tool auto-refreshes), giving a clear when and when-not to use the tool.

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

garmin_weekA
Read-only

One week in session-level detail: load vs recent weeks, intensity distribution, a per-day session table with activity_ids, recovery summary, and plan compliance where a plan exists. Call for 'how was my week' or a specific week. Multi-week trajectory is garmin_load.

ParametersJSON Schema
NameRequiredDescriptionDefault
anchor_dateNoYYYY-MM-DD, its Mon-Sun week

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context by detailing the report's contents, including conditional plan compliance "where a plan exists," which helps the agent set expectations for the response.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the core purpose and content list, followed by usage guidance and sibling differentiation. Every sentence earns its place with no redundancy.

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 a read-only annotation, simple optional parameter fully described in the schema, and an output schema present, the description covers the key aspects: content, usage, and alternatives. It provides enough context for an agent to invoke the tool correctly.

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

Parameters3/5

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

The schema description for anchor_date is complete ("YYYY-MM-DD, its Mon-Sun week"), providing full parameter semantics. The description reinforces the idea of a specific week but doesn't add new format details, so the baseline of 3 is appropriate given 100% schema coverage.

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?

The description explicitly states the tool reports one week in session-level detail, enumerating specific content: load vs recent weeks, intensity distribution, per-day session table with activity_ids, recovery summary, and plan compliance. This clearly distinguishes it from siblings, especially garmin_load, which it explicitly names for multi-week trajectories.

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?

The description provides explicit usage guidance: "Call for 'how was my week' or a specific week," and also gives a clear alternative: "Multi-week trajectory is garmin_load." This tells the agent exactly when to use this tool and when to use a different one.

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

garmin_whats_changedA
Read-only

Call for 'anything I should know?', 'what's new?', 'catch me up', or after days away. Scans every tracked metric and returns ONLY statistically significant changes, ranked safety-first; says 'nothing notable' when nothing tripped. Today's readiness is garmin_brief.

ParametersJSON Schema
NameRequiredDescriptionDefault
since_daysNodefault 7

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and destructiveHint, and the description adds meaningful context: it scans all metrics, filters to statistically significant changes, ranks safety-first, and returns 'nothing notable' when nothing tripped. This goes beyond the minimal safety profile without contradicting annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with usage triggers and followed by behavioral details. Every sentence adds value; no fluff or redundancy.

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 a single optional parameter, read-only annotations, an output schema, and a clear purpose, the description covers all essential context. It also provides a fallback behavior and a pointer to a sibling tool, making it complete for an AI agent.

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

Parameters3/5

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

Schema coverage is 100% with detailed metadata for since_days (default, min, max). The description does not mention the parameter, but the schema fully documents it. This matches the baseline for high schema coverage.

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?

The description clearly states the tool scans every tracked metric and returns only statistically significant changes, ranked safety-first. It also distinguishes itself from siblings by explicitly noting that today's readiness is handled by garmin_brief, making its purpose unique.

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?

Explicitly provides when to use via trigger phrases ('anything I should know?', 'what's new?', 'catch me up', 'after days away') and mentions garmin_brief as an alternative for readiness. However, it doesn't explicitly state when not to use, stopping just 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.2.2
    • First observedgarmin_activities
    • First observedgarmin_activity
    • First observedgarmin_athlete
    • First observedgarmin_brief
    • First observedgarmin_fitness
    • First observedgarmin_load
    • First observedgarmin_log
    • First observedgarmin_raw
    • First observedgarmin_recovery
    • First observedgarmin_reference
    • First observedgarmin_set_profile
    • First observedgarmin_sync
    • First observedgarmin_week
    • First observedgarmin_whats_changed

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with explicit cross-references (e.g., garmin_brief owns today's readiness, garmin_recovery owns overtraining, garmin_load owns multi-week training dose). No two tools appear to do the same thing; even similar tools like garmin_activities/garmin_activity are distinguished by singular vs plural and description.

Naming Consistency4/5

All tools share the garmin_ prefix and lowercase snake_case, but the pattern mixes nouns (garmin_activity, garmin_week), verbs (garmin_sync), verb phrases (garmin_set_profile), and a question (garmin_whats_changed). Read vs write is somewhat predictable (nouns for queries, verbs for actions), but not uniform.

Tool Count5/5

14 tools is within the ideal 3-15 range and each tool covers a distinct aspect of Garmin data analysis: from daily brief to weekly summary, fitness trends, recovery, load, and raw data. The size feels justified for the domain.

Completeness4/5

The server covers the full workflow of an athletic coaching assistant: profile management, subjective logging, daily readiness, activity browsing and deep-dive, fitness/recovery/load analysis, week summaries, change detection, and reference/raw data escape hatches. Minor gaps exist (e.g., no direct plan editing or log deletion), but they are outside the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server that integrates Garmin Connect data with LLMs to provide personalized running analysis and training plans. It enables users to monitor performance metrics, manage training loads, and receive data-driven workout suggestions based on health indicators like VO2 Max and recovery status.
    43
    5
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.
    15
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    An MCP server that gives LLMs access to Garmin Connect data, including training, recovery, sleep, stress, VO2 Max, and running summaries for personalized fitness advice.
    14
    1
    MIT