Skip to main content
Glama

garmin-mcp

A local MCP server that exposes your Garmin Connect activity, health, and training data (activities, HRV, sleep, heart rate, stress, body battery, training readiness, HR/power zones, lactate threshold, FTP, VO2max, personal records, workouts, scheduled workouts, and training plans) as tools inside Claude Desktop.

It talks directly to the live Garmin Connect API via the garminconnect library. Data is read-only — nothing is ever written back to Garmin.

How auth works

Garmin login happens in two separate places on purpose:

  • scripts/setup_auth.py — an interactive script you run yourself in a terminal. It logs in with your email/password, prompts you for an MFA code if Garmin asks for one, and saves the resulting session token to ~/.garmin_mcp/tokens.

  • The MCP server (src/garmin_mcp/server.py), launched headlessly by Claude Desktop, only ever loads and silently refreshes that cached token. It never prompts for MFA — Claude Desktop gives it no terminal to prompt on, and blocking on stdin there would hang tool calls. If the cached session is missing or has expired, tool calls fail with an error telling you to re-run setup_auth.py.

Your Garmin password is stored in the macOS keychain (item/service garmin-mcp, viewable in Keychain Access), never written to a file. Only your Garmin login email (not secret) is saved, in ~/.garmin_mcp/config.json.

Related MCP server: garmin-connect-mcp-server

Setup

  1. Install dependencies:

    cd garmin_mcp
    uv sync
  2. Run the one-time interactive login:

    uv run python scripts/setup_auth.py

    Enter your Garmin Connect email and password (the password is then stored in the keychain for next time). Enter the MFA code when prompted. On success you'll see a confirmation and the token cache path.

  3. Register the server with Claude Desktop by editing ~/Library/Application Support/Claude/claude_desktop_config.json and adding (alongside any other mcpServers entries):

    {
      "mcpServers": {
        "garmin": {
          "command": "uv",
          "args": ["run", "--project", "/absolute/path/to/garmin_mcp", "garmin-mcp"]
        }
      }
    }
  4. Fully quit Claude Desktop (Cmd+Q, not just close the window) and reopen it. The tools/hammer icon should list the garmin tools.

Tools

Tool

Description

list_activities

Recent activities, most recent first (paginated, optional type filter)

get_activity

Full detail for one activity: summary + per-metric time series

get_activity_splits

Lap/split data for one activity

get_heart_rate

Daily resting HR + intraday HR timeline

get_daily_stats

Steps, calories, resting HR, distance, floors, intensity minutes

get_sleep

Sleep stages, duration, sleep score

get_hrv

Heart rate variability

get_body_battery

Body Battery energy reserve over a date range

get_stress

All-day stress level

get_training_readiness

Training Readiness score and contributing factors

get_training_status

Fitness trend, acute/chronic training load & ACWR, VO2max, and 4-week Load Focus breakdown

get_profile

Identity, unit prefs, personal settings (max HR, resting HR, weight, height, VO2max), HR zones and power zones per sport

get_lactate_threshold

Running lactate threshold: heart rate, power, and speed

get_cycling_ftp

Latest cycling Functional Threshold Power

get_ftp_history

Historic FTP for a sport over a date range

get_max_metrics

Max-metric data (e.g. VO2max) over a date range

get_resting_heart_rate

Daily resting heart rate trend over a date range

get_fitness_age

Garmin Fitness Age for a given date

get_personal_records

Personal records

list_workouts

Saved workout templates, most recent first (paginated)

get_workout

Full structure of one workout: segments, targets, intervals

get_scheduled_workouts

Calendar of workouts scheduled for a given month

get_scheduled_workout

Detail for one scheduled workout instance

list_training_plans

Training plans

get_training_plan

Details for a specific training plan

get_adaptive_training_plan

Details for a specific adaptive training plan

All date parameters take YYYY-MM-DD and default to today.

Troubleshooting

A tool call returns a "Garmin session error" / "run setup_auth.py" message. Your cached refresh token expired or was revoked (this happens occasionally, e.g. after a password change or long period of inactivity). Re-run:

uv run python scripts/setup_auth.py

Rate limited. Garmin Connect will occasionally rate-limit rapid requests; the underlying library retries transient failures automatically, but if you see a rate-limit error, wait a bit and try again.

Verifying the server directly, outside Claude Desktop:

uv run mcp dev src/garmin_mcp/server.py

opens the MCP Inspector so you can call each tool by hand and check its output/schema.

Project layout

garmin_mcp/
  pyproject.toml
  src/garmin_mcp/
    auth.py      # keychain + token-cache helpers
    server.py    # FastMCP server and tool definitions
  scripts/
    setup_auth.py  # interactive one-time/occasional login

Available Tools

25 tools
get_activityA

Get full detail for a single activity: summary plus per-metric time series (pace/HR/power/elevation, GPS-derived stats, etc.).

Args: activity_id: The Garmin activity ID, as returned by list_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It proactively discloses that the response includes summary data and per-metric time series, and lists representative metrics such as pace, HR, power, and elevation. It does not mention authorization or error behavior, but for a read-only GET-style tool this is reasonable.

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 compact and well-structured: the first sentence front-loads the purpose and output scope, and the Args line provides the needed parameter context. Every sentence earns its place with no filler.

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 one-parameter getter, the description provides the necessary input provenance and a useful high-level picture of the return value. The absence of an output schema makes the trailing 'etc.' slightly vague, but it does not block an agent from selecting and invoking the tool correctly.

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 0%, so the description must compensate for the schema. It fully does: it defines activity_id as 'the Garmin activity ID' and explains where to obtain it (list_activities). This is actionable and complete for the single required parameter.

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 ('Get') and resource ('full detail for a single activity'), and clarifies the content scope: summary plus per-metric time series. This distinguishes it from list_activities and narrower metric-specific siblings like get_activity_splits.

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 clearly frames when to use it: when complete detail for one activity is needed. It also tells the agent exactly where the activity_id comes from ('as returned by list_activities'), providing a concrete prerequisite. It does not explicitly discuss exclusions, but the context is clear.

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

get_activity_splitsA

Get lap/split data for a single activity.

Args: activity_id: The Garmin activity ID, as returned by list_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It signals a read-only operation via 'Get' and clarifies the input source as list_activities, but it does not disclose the response format, error behavior, or whether splits exist for all activities.

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. The purpose is front-loaded, and the only additional sentence provides necessary parameter context. Every part earns its place.

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

Completeness3/5

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

For a simple one-parameter getter, the description explains the scope and the source of the activity ID. However, because there is no output schema and no annotations, it leaves gaps around the shape of the returned lap/split data and possible edge cases.

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 description coverage is 0%, so the description must compensate. It does this by explaining activity_id as 'The Garmin activity ID, as returned by list_activities,' which adds real semantic meaning beyond the bare string schema. It is concise but sufficient for the single parameter.

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 a specific verb and resource: 'Get lap/split data for a single activity.' This clearly separates it from list_activities and get_activity by scope and data type, though it does not explicitly name sibling alternatives for differentiation.

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

Usage Guidelines3/5

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

The usage context is implied: use this tool when lap/split data for one activity is needed, and obtain the activity_id from list_activities. However, there is no explicit when-not-to-use guidance or comparison with related tools like get_activity.

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

get_adaptive_training_planB

Get details for a specific adaptive training plan.

Args: plan_id: The adaptive training plan ID, as returned by list_training_plans.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_idYes

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations, the description must communicate safety and behavioral traits. The verb 'Get' implies a read-only operation, but the description does not explicitly state that no data is modified, nor does it mention error behavior, permissions, or how the returned details are formatted. This is a minimal disclosure, comparable to the 'Update' example that also scored 2.

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 compact parts: a single-sentence summary and an Args line. There is no filler; every clause adds information, and the key instruction is front-loaded. It is well structured for quick parsing by an agent.

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

Completeness2/5

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

The tool has no output schema and no annotations, so the description should describe what 'details' are returned to let an agent know what to expect. It does not. It also omits any differentiation from the sibling `get_training_plan`, leaving the contextual space incomplete for a tool with that many siblings.

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 schema provides no description for `plan_id` (0% coverage), so the Args block is essential. It adds semantic meaning by explaining that the ID is 'as returned by list_training_plans', which tells the agent exactly where to obtain a valid value. This fully compensates for the schema gap for the single parameter.

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 opens with a clear verb and resource: 'Get details for a specific adaptive training plan.' This makes the core operation obvious. However, it does not explicitly distinguish this tool from the sibling `get_training_plan`; both appear to retrieve training plan details, so the differentiation relies entirely on the name.

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

Usage Guidelines3/5

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

The line 'plan_id: The adaptive training plan ID, as returned by list_training_plans' implies a workflow: first list plans, then get details for one. This gives a contextual hint about when the tool is used. It does not, however, state when to prefer this over `get_training_plan` or any exclusions, so guidance is only implicit.

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

get_body_batteryB

Get Body Battery (energy reserve) data over a date range.

Args: start_date: Start date as YYYY-MM-DD. Defaults to today. end_date: End date as YYYY-MM-DD. Defaults to start_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It offers date defaults but does not mention output format, granularity, timezone behavior, rate limits, or whether the data is read-only. 'Get' implies a read operation, but little else is disclosed.

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 main sentence is front-loaded and clear, followed by a compact parameter list. The content is appropriately sized for a simple two-parameter tool, though the 'Args:' block is somewhat mechanical.

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

Completeness3/5

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

For a low-complexity tool with no output schema, the description covers the invocation parameters reasonably well. However, it does not describe the shape or nature of the returned data, which an agent may need when deciding whether the tool satisfies the user's request.

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 description coverage is 0%, so the description must compensate. It adds meaningful semantics for both parameters: YYYY-MM-DD format, default start_date as today, and default end_date as start_date. This goes beyond the bare schema, which only provides nullable defaults.

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 a specific verb ('Get') and resource ('Body Battery (energy reserve) data') over a date range, which clearly distinguishes it from the surrounding health-metric siblings. It does not explicitly contrast with a closely related tool, but the resource naming is sufficiently unique.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus alternatives, nor are there exclusions or prerequisites. The context of sibling metric tools implies usage, but the description itself provides no explicit decision support.

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

get_cycling_ftpA

Get the athlete's latest cycling Functional Threshold Power (FTP).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only states the retrieval action and resource, but does not disclose return units, data source, availability conditions, or how 'latest' is determined. This is a minimal gap for a zero-param getter but still leaves behavioral detail unexplained.

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?

A single, directly worded sentence that immediately states the resource and scope. There is no filler or redundant information.

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

Completeness3/5

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

For a zero-parameter read-only getter, the description provides the essential meaning. However, it does not mention the expected return shape or units (e.g., watts), and with no output schema or annotations, an agent is left to infer those details.

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 and the schema coverage is 100%, so there is nothing about parameters to clarify. The description correctly implies no inputs are needed.

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 names a specific verb ('Get'), a specific resource (cycling FTP), and a specific scope ('latest'). It distinguishes this from sibling tools like get_ftp_history and get_lactate_threshold by specifying cycling and recency.

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

Usage Guidelines3/5

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

The usage is implied clearly: use this tool when the athlete's latest cycling FTP is needed. However, no explicit guidance is given about when to prefer alternatives such as get_ftp_history, get_lactate_threshold, or get_max_metrics.

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

get_daily_statsA

Get a day's overall stats summary: steps, calories, resting HR, distance, floors climbed, intensity minutes, etc.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It clearly indicates a read operation returning a summary of daily metrics, which is helpful, but it does not explain how missing data, invalid dates, or timezone effects are handled, and it does not define the response structure.

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 compact and front-loaded: one sentence defines the purpose and the Args section documents the only parameter. Every sentence adds useful information without redundancy or filler.

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

Completeness3/5

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

For a single-optional-parameter read tool, the description is adequate but has clear gaps: there is no output schema, no indication of return shape, and no mention of edge cases like dates with no recorded data. The 'etc.' leaves the metric list slightly open-ended, and 'today' is not timezone-qualified.

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?

The schema only exposes a nullable string parameter with a null default, providing no semantic meaning. The description compensates fully by specifying the exact date format (YYYY-MM-DD) and the effective default behavior ('Defaults to today'), which is essential for correct invocation.

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 states the verb ('Get') and resource ('a day's overall stats summary') and enumerates the included metrics, making the tool's function obvious. It is not a tautology and is easily distinguishable from sibling per-metric tools like get_heart_rate or get_sleep, though it does not explicitly name an alternative.

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

Usage Guidelines2/5

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

There is no explicit guidance about when to use this tool versus alternatives such as get_activity, get_resting_heart_rate, or list_activities. The phrase 'overall stats summary' implies aggregate daily usage, but the description does not state when not to use it or prefer a sibling.

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

get_fitness_ageA

Get the athlete's Garmin Fitness Age for the given date.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of revealing behavior. It correctly signals a read-only 'get' operation and discloses the default date behavior. It does not describe what happens when no fitness age data exists for the date, error cases, or the shape of the returned value.

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 compact and front-loaded with the purpose. The parameter documentation is minimal, precise, and useful. Every sentence earns its place, with no filler or redundant restatement.

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 low complexity and single optional parameter, the description is nearly complete. It lacks an explicit return type or error behavior, but for a simple dated getter this is a minor gap, especially since the purpose and parameter semantics are clear.

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 0%, so the description must fully clarify the parameter. It does: 'date_str: Date as YYYY-MM-DD. Defaults to today.' This adds format and default semantics that the input schema alone does not provide.

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 and resource: 'Get the athlete's Garmin Fitness Age' for a date. This clearly distinguishes it from the sibling tools, none of which are explicitly dedicated to fitness age. The resource and date context are unambiguous.

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

Usage Guidelines3/5

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

The description implies when to use the tool: whenever the athlete's fitness age is needed for a given date. It also clarifies that omitting the date defaults to today. However, it does not explicitly discuss alternatives, exclusions, or situations where another sibling tool would be preferred.

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

get_ftp_historyA

Get historic Functional Threshold Power for a sport over a date range.

Args: start_date: First date in the range, as YYYY-MM-DD. end_date: Last date in the range, as YYYY-MM-DD. sport: Garmin sport key, e.g. "RUNNING", "CYCLING". aggregation: One of "daily", "weekly", "monthly", "yearly".

ParametersJSON Schema
NameRequiredDescriptionDefault
sportNoCYCLING
end_dateYes
start_dateYes
aggregationNodaily

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden. It communicates a read-style operation and date constraints, but does not explain what the response contains, how aggregation affects results, timezone handling, or data availability. For a tool with no output schema, this is a notable gap.

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?

A single focused summary line is followed by a compact Args block with no filler. Every sentence contributes either the core purpose or a parameter detail, and the most important information is front-loaded.

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

Completeness3/5

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

For a simple retrieval tool with four parameters, the description adequately defines inputs and purpose. However, it does not describe the return shape or how aggregation alters the results, and with no output schema or annotations this leaves the agent with moderate uncertainty about what to expect.

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?

The input schema has 0% description coverage, but the Args block fully compensates by documenting all four parameters: date format for start_date and end_date, an example Garmin sport key for sport, and explicit allowed values for aggregation. This adds substantial meaning beyond the bare schema.

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?

Description opens with a specific verb 'Get' and a clear resource: historic Functional Threshold Power for a sport over a date range. It does not explicitly contrast itself with sibling get_cycling_ftp, but the word 'historic' and the date-range qualifier strongly distinguish it from a current-value query.

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

Usage Guidelines3/5

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

The purpose implies this tool is for historical FTP queries over date ranges, and the sibling name get_cycling_ftp hints at an alternative for current values. However, the description gives no explicit when-to-use guidance, exclusions, or named alternatives, so an agent must infer the correct selection.

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

get_heart_rateA

Get a day's heart rate data: resting HR and an intraday HR timeline.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are present, so the description must carry the behavioral burden. It does disclose the returned data (resting HR + intraday timeline) and the default-to-today behavior, but it omits details such as units, timezone handling, and response shape. This is adequate for a simple getter but not rich.

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 compact sentences plus a minimal Args block. The main purpose is front-loaded and every clause adds necessary information.

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 one optional parameter, no annotations, and no output schema, the description covers selection and invocation well. It falls slightly short on specifying the intraday timeline's structure and units, but the tool is simple enough that the agent can still act correctly.

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 0%, yet the description fully documents the only parameter: format (YYYY-MM-DD) and default (today). This completely compensates for the schema gap.

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 begins with a specific verb and resource: 'Get a day's heart rate data' and adds the exact contents ('resting HR and an intraday HR timeline'). This makes it easy to distinguish from the sibling get_resting_heart_rate, which would only cover resting HR.

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

Usage Guidelines3/5

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

The intended use—retrieving heart rate data for a day—is implied but never stated as a condition, and no alternatives are named. An agent must infer when to pick this over get_resting_heart_rate, get_daily_stats, or get_hrv.

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

get_hrvB

Get heart rate variability (HRV) data for the given date.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Get ... data' without indicating whether a daily summary, time series, or aggregated value is returned, nor mentioning availability, units, or timezone handling.

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 minimal and front-loaded, with the verb and resource in the first sentence and a compact Args block. Every word earns its place, and there is no redundant or tangential content.

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

Completeness3/5

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

For a simple one-parameter getter, the description is adequate for invoking the tool, but with no output schema and no annotations, it leaves the response shape undefined. A sentence describing the returned HRV data (e.g., daily value vs. series) would make it 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 description adds meaningful detail beyond the schema by specifying the date_str format as 'YYYY-MM-DD' and the default value 'today', compensating for the schema's null default and 0% description coverage. This fully clarifies the sole parameter.

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 a specific action ('Get') and resource ('heart rate variability data') with a date parameter, clearly naming HRV rather than a generic health metric. It does not explicitly differentiate from siblings like get_heart_rate or get_stress, but the subject matter is distinct enough.

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

Usage Guidelines2/5

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

No guidance is given about when to choose this tool over alternatives such as get_heart_rate or get_daily_stats. The description only explains what the tool does, not the selection context, leaving an agent to guess among many similar health-data getters.

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

get_lactate_thresholdA

Get running lactate threshold data (heart rate, power, and speed).

Args: latest: If True, return the latest lactate threshold info. If False, query a range instead (requires start_date). start_date: Start date as YYYY-MM-DD. Required if latest is False; ignored if latest is True. end_date: End date as YYYY-MM-DD. Defaults to today. Ignored if latest is True. aggregation: One of "daily", "weekly", "monthly", "yearly".

ParametersJSON Schema
NameRequiredDescriptionDefault
latestNo
end_dateNo
start_dateNo
aggregationNodaily

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the transparency burden. It does disclose that start_date is required for range queries and that start/end dates are ignored in latest mode, but it does not describe return shape, behavior with no data, or edge/error 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 front-loaded with a one-sentence purpose, followed by a compact argument list. Every line carries necessary information with no filler 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?

The conditional parameter logic is well covered, but the interaction of aggregation with latest mode is not specified. Since there is no output schema, the description is also light on return-structure details, though it at least names heart rate, power, and speed.

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 0%, and the description fully compensates. It explains every parameter in detail: latest, start_date format and requirements, end_date default and ignored condition, and aggregation allowed values. This gives meaning the schema entirely lacks.

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: 'Get running lactate threshold data (heart rate, power, and speed).' This clearly identifies what the tool does and distinguishes it from related siblings like get_cycling_ftp or generic fitness metrics.

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

Usage Guidelines3/5

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

The description explains the two modes (latest vs range) and their parameters, and it names prerequisites such as start_date being required for range queries. However, it never explicitly tells an agent when to choose this tool over sibling tools or when not to use it; tool selection is only implied by the word 'running.'

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

get_max_metricsA

Get max-metric data (e.g. VO2max) over a date range.

Args: start_date: Start date as YYYY-MM-DD. Defaults to today. end_date: End date as YYYY-MM-DD. Defaults to start_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. The verb 'Get' implies a read operation and the date range is stated, but there is no mention of return shape, units, error behavior, or safety confirmation. It is minimally transparent but leaves notable gaps.

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 purpose is front-loaded in a single clear sentence, followed by a compact argument list. Every sentence adds value, and there is no redundant or vague filler.

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 simple two-optional-parameter getter, the description is largely complete: it states the resource and fully documents parameter semantics. However, since there is no output schema and no annotations, the description could say a bit more about what the returned max-metric data looks like.

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?

The schema provides only property names and null defaults, so the description adds critical meaning: it specifies YYYY-MM-DD format and clarifies effective defaults ('start_date defaults to today', 'end_date defaults to start_date'). This fully compensates for the 0% schema description 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 states a specific verb ('Get'), a distinct resource ('max-metric data'), an example ('VO2max'), and a date-range qualifier. This clearly distinguishes it from sibling get_* tools like get_heart_rate or get_daily_stats by naming a unique metric category.

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?

It clearly tells an agent when to use this tool: when max-metric data over a date range is needed. However, it does not explicitly mention alternatives or exclusion cases, so it stops short of full routing guidance.

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

get_personal_recordsC

Get the athlete's personal records.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get' implies a read operation, but the description does not say whether the response is all-time personal records, how the records are computed, whether any permissions are needed, or what kind of data is returned. This is minimal disclosure for a tool with no annotation support.

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 a single sentence with no filler and front-loads the action. It is appropriately compact for a zero-parameter tool, though it sacrifices useful contextual information in favor of brevity.

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

Completeness2/5

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

There is no output schema, no annotations, and the tool belongs to a large family of similar getter tools. The one-sentence description leaves too much implicit: the return shape, the meaning of personal records, the range of activities covered, and how this differs from get_max_metrics. A more descriptive sentence could easily resolve these gaps.

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 and schema description coverage is 100%, so there are no parameter semantics for the description to add. The description's lack of parameter detail is not a deficiency because the input schema already fully defines the empty parameter set.

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

Purpose3/5

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

The description states a clear verb and resource: 'Get the athlete's personal records.' However, it adds little beyond the tool name and does not define what constitutes a personal record, such as whether it covers all activity types or all-time bests. It also does not distinguish this tool from siblings like get_max_metrics or get_activity, leaving the agent to guess the exact scope.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives. The description gives no context about whether it should be preferred for historical bests, individual activity record details, or summary metrics. An agent selecting among the many getter siblings receives no routing help.

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

get_profileA

Get the athlete's profile: identity/unit preferences, personal settings (including max HR, resting HR, weight, height, VO2max), configured heart rate zones per sport, and configured power zones per sport.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. 'Get' clearly signals a read-only, non-mutating operation, and the listed content adds useful context. However, it does not mention authentication needs, availability constraints, or how unconfigured zones are represented.

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 a single, well-structured sentence with an efficient colon-led list. It front-loads the verb and resource and every phrase adds meaningful detail without redundancy or filler.

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 no parameters and no output schema, the description does a solid job of enumerating the profile's contents: identity/unit preferences, personal settings, HR zones, and power zones. It is largely sufficient for a zero-parameter tool, though it leaves minor ambiguity about formatting and defaults for unconfigured zones.

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 baseline is 4 and the description does not need to parameter semantics. It adds value by explaining what the returned profile contains, which compensates for the absence of an output schema.

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 uses a specific verb ('Get') and a specific resource ('the athlete's profile') and enumerates the major content categories included. It is clear and distinct from activity-focused siblings, though it does not explicitly name a sibling to differentiate itself from.

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

Usage Guidelines3/5

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

The description implies when to use the tool by listing profile settings, HR zones, and power zones, which suggests this is for configuration/profile data rather than activity or daily metrics. It does not explicitly state when not to use it or name alternatives, so usage guidance is only implied.

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

get_resting_heart_rateA

Get the daily resting heart rate trend over a date range.

Args: start_date: Start date as YYYY-MM-DD. Defaults to today. end_date: End date as YYYY-MM-DD. Defaults to start_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
start_dateNo

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does reveal that the tool returns a daily trend over a date range, but it is silent about the return structure, units, or any edge-case behavior such as missing days. The read-only nature is only implicit in the verb 'Get'.

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 concise sentences state purpose, followed by a minimal Args list. Every sentence earns its place; no redundant filler.

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

Completeness3/5

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

For a tool with only two optional date parameters, the description covers invocation semantics well. However, with no output schema, it leaves the exact response format implicit ('trend'), and it does not mention what happens when no data exists for the range.

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?

The docstring defines both parameters with a concrete format (YYYY-MM-DD) and default behavior (start_date defaults to today; end_date defaults to start_date). The input schema only provides types and null defaults, so the description adds critical meaning not available elsewhere.

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 a specific verb ('Get') and resource ('daily resting heart rate trend over a date range'). This clearly distinguishes it from sibling tools like get_heart_rate or get_daily_stats, which target different data.

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

Usage Guidelines3/5

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

The description implies the appropriate scenario: requesting resting heart rate data aggregated by day over a specified range. However, it never explicitly states when to prefer this over siblings such as get_heart_rate or get_hrv, nor does it provide exclusions.

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

get_scheduled_workoutA

Get detail for one scheduled workout instance.

Args: scheduled_workout_id: The scheduled-workout ID, as returned by get_scheduled_workouts.

ParametersJSON Schema
NameRequiredDescriptionDefault
scheduled_workout_idYes

TDQS

A3.9/5.0
Behavior3/5

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

There are no annotations, so the description carries the burden of behavioral disclosure. It conveys a read-only fetch and adds the dependency on get_scheduled_workouts, but it does not describe error/not-found behavior, response contents beyond 'detail,' or side-effect assumptions. This is minimal but acceptable for a simple getter.

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 appropriately sized: a front-loaded one-line purpose statement followed by a compact parameter note. Every sentence earns its place, and there is no filler or repetition.

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 one-parameter, read-only getter, the description covers the operation and the source of the required ID. There is no output schema, so return structure is not documented, but 'detail' and the singular resource provide enough clarity for an agent to decide to call it. A minor gap is the lack of explicit error/return expectations.

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 schema only marks the parameter as a required string; the description adds that it is 'the scheduled-workout ID' and explicitly specifies its source as returned by get_scheduled_workouts. This is meaningful semantic information the schema does not provide, even though the exact format is not described.

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 uses a specific verb and resource: 'Get detail for one scheduled workout instance.' The word 'one' and 'instance' clearly separate this from the list-style sibling get_scheduled_workouts, and the name itself identifies the target. It doesn't explicitly contrast with get_workout, but the meaning is 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 Args section clearly states that scheduled_workout_id is 'as returned by get_scheduled_workouts,' establishing the correct precursor call and source of the ID. It doesn't state when to avoid this tool or compare it to alternatives like get_workout, but for a simple singular getter this is sufficient context.

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

get_scheduled_workoutsA

Get the calendar of workouts scheduled for a given month. This is the primary way to find out what's coming up next in training.

Args: year: Four-digit year, e.g. 2026. month: Month number, 1-12.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
monthYes

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations, the description must bear the full burden of behavioral transparency. It conveys a read-only retrieval action and describes the result as a 'calendar,' but it omits details such as response structure, ordering, timezone assumptions, or any access limitations. This is adequate but not rich.

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 compact and front-loaded with the tool's purpose, then immediately provides the parameter guidance. Every sentence adds value; there is no filler or repetition.

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 simple two-parameter read-only query, the description is largely complete: it states the resource, the month scope, and primary intended use. It could specify what a 'calendar' entry looks like, but with no output schema that is a minor gap rather than a blocking one.

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?

The input schema only defines bare integer fields with 0% description coverage, but the description's Args block adds crucial meaning: year must be a four-digit number with an example, and month must be 1-12. Both required parameters are fully clarified beyond the schema.

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 states the tool retrieves a calendar of scheduled workouts for a given month, which is a specific verb and resource. It is distinguishable from siblings like list_workouts by focusing on 'scheduled' workouts and a month-level calendar, though it does not explicitly name or contrast a sibling.

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?

It gives clear usage context: 'This is the primary way to find out what's coming up next in training.' This tells the agent when to reach for this tool, but it does not explicitly explain when not to use it or name alternatives.

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

get_sleepA

Get sleep data for the night ending on the given date: sleep stages, duration, sleep score, and related metrics.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It does disclose useful behavior: it returns sleep stages, duration, score, and related metrics, and defines the night boundary. However, it does not mention timezone handling, missing-data behavior, or any other edge-case behavior, leaving some behavioral ambiguity.

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 tight, front-loaded sentences with no filler. The main purpose and return contents come first, followed by the parameter detail in a compact Args block. Every sentence 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?

For a single-optional-parameter getter with no output schema, the description adequately covers purpose, return contents, date semantics, and parameter format. It stops slightly short of being fully complete by not addressing timezone sensitivity or what happens when no sleep data exists, but those are minor for this simple tool.

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 0%, but the description fully compensates by documenting date_str as 'Date as YYYY-MM-DD' and stating 'Defaults to today.' Despite the schema default being null, the description clarifies the effective default and format, which is exactly what an agent needs to invoke the tool correctly.

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 and resource: 'Get sleep data for the night ending on the given date' and enumerates the returned content (sleep stages, duration, sleep score, related metrics). No sibling tool overlaps with sleep data, so the purpose is 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 clearly frames when the tool applies: retrieving sleep data for a particular night, with date boundaries specified by 'night ending on the given date' and a default of today. No explicit exclusions or alternative-tool routing are needed since no sibling covers sleep, though the description could have been more explicit about 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.

get_stressA

Get all-day stress level data for the given date.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It usefully states that date_str defaults to today and specifies the YYYY-MM-DD format. However, it does not describe the response structure, timezone handling, or whether any date range limitations apply.

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 brief, front-loaded with the core purpose, and includes a clean Args section that adds parameter details without unnecessary prose. Every line earns its place.

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

Completeness3/5

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

This is a simple one-parameter getter with no output schema, so the description is mostly sufficient for invoking the tool. However, it does not clarify what the returned 'all-day stress level data' looks like (e.g., summary values, time series, units), which leaves some ambiguity in interpreting the result.

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?

Although the schema only defines date_str as a nullable string with no description, the tool description fully compensates by documenting the expected format (YYYY-MM-DD) and default behavior (today). For a single-parameter tool, this is complete and unambiguous.

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 ('Get'), a clear resource ('all-day stress level data'), and the date scope, which immediately distinguishes it from sibling tools like get_heart_rate or get_hrv. The term 'all-day' adds useful precision beyond the tool name alone.

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

Usage Guidelines2/5

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

The description does not explain when to use this tool versus alternatives such as get_daily_stats, get_hrv, or list_activities. It only implies usage by describing what the tool retrieves, with no exclusion criteria or guidance for selection.

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

get_training_planB

Get details for a specific training plan.

Args: plan_id: The training plan ID, as returned by list_training_plans.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_idYes

TDQS

B3.4/5.0
Behavior2/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It only restates the read-oriented verb 'Get' and provides no information about response contents, permissions, possible errors, or side effects. An agent must infer most behavioral traits from the tool name rather than the description.

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 tightly written: one sentence states the tool's purpose, and one sentence documents the parameter. There is no filler, repetition of the schema, or unnecessary elaboration.

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

Completeness3/5

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

For a simple one-parameter getter, the invocation path is adequately covered: the description identifies the parameter and its source. However, with no output schema and no guidance on how get_training_plan relates to get_adaptive_training_plan, the agent is left to infer response shape and when to choose this tool over a sibling.

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 schema provides no description for plan_id, and schema description coverage is 0%. The description compensates by explaining that plan_id is a training plan ID 'as returned by list_training_plans,' which is useful provenance for obtaining a valid value. This is sufficient for a single opaque ID parameter.

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 states the verb and resource: 'Get details for a specific training plan.' This distinguishes it from list_training_plans, which lists plans, and from other getters on different resources. However, it does not explicitly differentiate it from the similarly named get_adaptive_training_plan.

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

Usage Guidelines3/5

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

The description implies usage by saying plan_id is 'as returned by list_training_plans,' which tells the agent that listing plans first is the expected way to get an ID. It does not provide explicit when-to-use or when-not-to-use guidance or mention alternatives like get_adaptive_training_plan.

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

get_training_readinessA

Get Garmin's Training Readiness score and contributing factors for the given date.

Args: date_str: Date as YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
date_strNo

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that the tool retrieves a score and contributing factors, but does not mention what happens when no data exists for the date, whether the request can fail, or any timezone/freshness considerations. The behavior is implied to be a read, but not explicitly disclosed.

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 concise and front-loaded: the first sentence states the core purpose, and the Args section provides exactly the necessary parameter detail without redundancy. Every sentence 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?

For a simple tool with one optional parameter and no output schema, the description is mostly complete: it names the data being returned and documents the parameter. The main gap is the lack of behavior around missing data or invalid dates, but the tool's low complexity limits how much is needed.

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 description coverage is 0%, so the description must compensate. It does for the only parameter, date_str, by specifying the required format (YYYY-MM-DD) and default behavior (defaults to today). This adds meaningful semantics beyond the bare schema type.

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 operation ('Get'), the specific resource ('Garmin's Training Readiness score and contributing factors'), and the scope ('for the given date'). It is distinct from sibling tools like get_hrv or get_body_battery because it names the exact metric being retrieved.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives, nor any context about prerequisites, limitations, or exclusions. The only usage hint is the optional date parameter, which is more parameter documentation than usage guidance.

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

get_workoutA

Get the full structure of one workout: segments, targets, intervals.

Args: workout_id: The workout ID, as returned by list_workouts or get_scheduled_workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
workout_idYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral context. It communicates that this is a read operation returning structure details, but it does not mention error behavior, permission requirements, or whether the response could be partial. The 'Get' verb implies read-only, and the return contents are summarized, so it is minimally adequate.

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 compact and front-loaded. The first sentence states the purpose and output contents, and the Args block gives necessary parameter provenance without wasted words.

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 simple one-parameter read tool with no output schema, the description covers the essential details: what the tool returns and how to source the required ID. It lacks only deeper behavioral guarantees such as error handling or response verbosity, which are not critical for invoking it correctly.

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 schema only says workout_id is a required string, so the description must add meaning. It does: it explains the ID is 'as returned by list_workouts or get_scheduled_workout,' which tells the agent where to obtain a valid value. This compensates well for the 0% schema description 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 opens with a specific verb and resource: 'Get the full structure of one workout: segments, targets, intervals.' It clearly identifies what the tool returns and differentiates it from list_workouts by focusing on a single workout's detailed structure.

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 clear workflow context by stating that workout_id comes from list_workouts or get_scheduled_workout. It does not explicitly list exclusions or alternatives, but the intended call sequence is evident.

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

list_activitiesA

List recent Garmin activities, most recent first.

Args: limit: Maximum number of activities to return. start: Number of most-recent activities to skip (for pagination). activity_type: Optional Garmin activity type filter, e.g. "running", "cycling", "swimming". Leave unset to include all types.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
startNo
activity_typeNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses ordering, pagination via skip, and filtering behavior, which is useful. However, it does not define what 'recent' means, what fields each returned activity contains, or any limits or quirks of the result.

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 compact and front-loaded with the core behavior, followed by a clean Args block. Every line adds value and there is no redundant or promotional wording.

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

Completeness3/5

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

Given there is no output schema and no annotations, the description still omits the return shape and the time window of 'recent'. An agent can invoke the tool correctly but may be uncertain about what the response contains without further documentation.

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 0%, yet the description documents all three parameters clearly: limit as maximum count, start as pagination skip, and activity_type with concrete examples and the 'leave unset for all' behavior. This fully compensates for the sparse schema.

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 states it lists recent Garmin activities in reverse chronological order, using a specific verb and resource. It is distinct from singular get_activity, though it does not explicitly differentiate from list_workouts or other list-type siblings.

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

Usage Guidelines3/5

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

The description implies usage for browsing recent activities and explains pagination and filtering behavior, but it never states when to use this tool versus alternatives like get_activity or list_workouts. No explicit when-not guidance is provided.

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

list_training_plansB

List training plans.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. The verb 'list' implies a read-only retrieval, but the description does not specify return format, ordering, or whether the operation has any side effects. For a zero-parameter read-only list, this is minimally acceptable, though still thin.

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 one short sentence with no wasted words and is front-loaded. However, it largely restates the tool name, so it adds minimal new information beyond the name itself.

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

Completeness3/5

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

Given the tool's low complexity (no parameters, no output schema), the description is minimally viable but incomplete. It does not say what the returned list contains, whether it returns summaries or full plans, or if any special behavior applies. A bit more output detail would improve completeness.

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 and schema coverage is 100%, so there is no parameter information the description needs to add. The baseline of 4 for zero-parameter tools applies here.

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 'List training plans' states a clear verb and resource, so an agent can tell this tool retrieves a collection of training plans. It distinguishes well from get_training_plan and get_adaptive_training_plan, though it does not explicitly differentiate from list_activities or list_workouts beyond the resource name.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives such as get_training_plan, get_adaptive_training_plan, or list_workouts. The description only gives the basic action and leaves usage context entirely to inference.

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

list_workoutsA

List the athlete's saved workouts (templates), most recent first.

Args: limit: Maximum number of workouts to return. start: Number of most-recent workouts to skip (for pagination).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
startNo

TDQS

A4.1/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden. It does disclose the sort order ('most recent first') and scopes the operation to saved templates, and the verb 'List' implies a read-only operation. However, it does not explicitly state read-only behavior, side-effect-freeness, or any authentication or data-freshness considerations.

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 compact and front-loaded with the core purpose, followed by a clear Args section. Every sentence carries useful information, with no filler or repetition.

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 simple two-parameter list operation with no output schema, the description covers purpose, scope, ordering, and pagination semantics. It leaves some room for more context about the shape of returned workout objects, but nothing critical is missing for selecting and invoking the tool correctly.

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 0%, but the description fully compensates by explaining both parameters: 'limit: Maximum number of workouts to return' and 'start: Number of most-recent workouts to skip (for pagination).' This adds meaningful semantics beyond the schema's bare types and defaults.

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 verb and resource: 'List the athlete's saved workouts (templates), most recent first.' The parenthetical '(templates)' distinguishes this from list_activities and get_scheduled_workouts, while the ordering note adds concrete detail.

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

Usage Guidelines3/5

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

The phrase 'saved workouts (templates)' implies this tool is for listing saved template workouts rather than activities or scheduled workouts, but the description does not explicitly state when to choose this tool over siblings like list_activities, get_workout, or get_scheduled_workouts. Some inference is required, so it earns the implied-usage score rather than a higher one.

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. Dates show when Glama detected each change.

  1. 25 tool updatesv0.1.0
    • First observedget_activity
    • First observedget_activity_splits
    • First observedget_adaptive_training_plan
    • First observedget_body_battery
    • First observedget_cycling_ftp
    • First observedget_daily_stats
    • First observedget_fitness_age
    • First observedget_ftp_history
    • First observedget_heart_rate
    • First observedget_hrv
    • First observedget_lactate_threshold
    • First observedget_max_metrics
    • First observedget_personal_records
    • First observedget_profile
    • First observedget_resting_heart_rate
    • First observedget_scheduled_workout
    • First observedget_scheduled_workouts
    • First observedget_sleep
    • First observedget_stress
    • First observedget_training_plan
    • First observedget_training_readiness
    • First observedget_workout
    • First observedlist_activities
    • First observedlist_training_plans
    • First observedlist_workouts

TDQS

A3.6/5.0
Disambiguation4/5

Each tool targets a distinct Garmin data resource (activities, sleep, HRV, workouts, plans). A few metrics overlap—get_heart_rate vs get_resting_heart_rate and daily stats including resting HR—but descriptions clarify the unit (intraday day vs range trend). No two tools are truly interchangeable.

Naming Consistency5/5

All tools follow a consistent get_/list_ + noun pattern, with clear singular/plural distinctions like get_scheduled_workout vs get_scheduled_workouts. The few compound names (get_cycling_ftp, get_lactate_threshold) are readable and fit the pattern.

Tool Count3/5

25 tools is at the heavy end of the range; each represents a specific endpoint but the set could be streamlined (e.g., range-based metrics could share a generic pattern). Still, the count is justified by Garmin's many distinct data categories and remains navigable.

Completeness4/5

The read-side surface is broad: activities, daily wellness, training metrics, workouts, scheduled workouts, and training plans are all covered. Missing write/management operations (activity uploads, workout creation, plan enrollment) and some niche metrics keep it from a 5.

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

  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, single-user, read-only MCP server that gives Claude Code access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    This MCP server exposes Garmin Connect health data—sleep, heart rate, HRV, stress, VO2max, and activities—to Claude through local tools, enabling natural language queries, data syncing, and statistical analysis like correlations and night-out detection.
    MIT

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/sovnheim/garmin-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server