Skip to main content
Glama

What you can ask

Ask your assistant anything about your Garmin data, in your own words and in any language. The assistant chooses the tools and can combine their data. Some examples:

  • Activities: "List my last 5 activities, with pace and heart rate."

  • Activities: "How much time did I spend in each HR zone on my runs this month?"

  • Activities: "How did my sessions named Tempo 5k and Long run change over the last 2 months?"

  • Laps: "Show the laps of my last run."

  • Strength: "Compare my sets of this week with the week before."

  • Strength: "Which muscles did I train most this week?"

  • Strength: "What was my heaviest squat set this month, and what 1RM does it suggest?"

  • Strength: "Which of my lifts have stalled over the last 6 weeks?"

  • Strength: "How long did I rest between sets in my last strength session?"

  • Strength: "How much weight did I lift in total in each strength session this month?"

  • Workouts: "Did I do the reps and rests my workout planned?"

  • Recovery: "How did I sleep this week, and how was my HRV?"

  • Recovery: "Show my steps, stress and Body Battery for the last 7 days."

  • Recovery: "Did my Body Battery recover overnight this week, and which days drained it most?"

  • Body: "How has my weight changed over the last 3 months?"

  • All together: "My run on Saturday felt hard. Compare it with my sleep and HRV of the nights before."

Related MCP server: garmin-mcp

Features

  • Official and read-only: uses the Garmin Connect Personal API, writes nothing back, and runs with npx.

  • All of your data: laps and strength sets from the original .FIT files, with the muscles of each set; HRV, sleep, heart rate, stress and Body Battery; garminGet for the other endpoints.

  • All stdio clients: Claude Desktop, Claude Code, Codex and the other MCP clients that use stdio. Tested with Claude Desktop and Claude Code.

  • A dashboard in less than a minute: your training load next to recovery, for you or for your coach, with your own widgets and languages. See Dashboard.

  • The dashboard in the chat: in Claude Desktop, ask "show my training dashboard" and the page opens in the reply, with new data. See Dashboard in the chat.

  • Coach prompts: a review of one run or one strength session against its planned workout, and a readiness check before a race. See Coach prompts.

Quick start

You need Node.js 22 or later (node --version shows the version) and a Garmin Connect account with access to the Personal API.

1. Create a personal API key

  1. Open Garmin Connect web at https://connect.garmin.com/app/settings/personalApiToken.

  2. Select Create Key, accept the terms, select the expiry (1 year at most) and select Create.

  3. Garmin shows the key only one time. Save it in a file that only you can read:

mkdir -p ~/.config/garmin-mcp
nano ~/.config/garmin-mcp/api-key      # paste the key and save
chmod 600 ~/.config/garmin-mcp/api-key

You can also give the key in the environment variable GARMIN_PERSONAL_API_KEY.

2. Connect your client

Claude Desktop: select Settings → Developer → Edit Config. Add a top-level mcpServers key next to the keys that the file has, not in preferences:

{
  "mcpServers": {
    "garmin-personal": {
      "command": "npx",
      "args": ["-y", "@indaco/garmin-personal-mcp@latest"]
    }
  }
}

Then quit Claude Desktop fully, including the tray icon, and start it again.

Claude Code: this command adds the server to all your projects:

claude mcp add garmin-personal --scope user -- npx -y @indaco/garmin-personal-mcp@latest
claude mcp list          # garmin-personal: ... ✔ Connected

Use --scope project to write a .mcp.json file that you can share in the current repository.

Codex: this command adds the server:

codex mcp add garmin-personal -- npx -y @indaco/garmin-personal-mcp@latest

You can also add it to ~/.codex/config.toml. The first npx download can take longer than the default start time, so set a longer one:

[mcp_servers.garmin-personal]
command = "npx"
args = ["-y", "@indaco/garmin-personal-mcp@latest"]
startup_timeout_sec = 60

Codex does not send your shell environment to the server. Use the key file, or add env = { GARMIN_PERSONAL_API_KEY = "..." } to the table.

Other clients (Gemini CLI, VS Code, Cursor and others): in the MCP configuration of the client, set the command npx and the arguments -y @indaco/garmin-personal-mcp@latest. Some clients do not show MCP prompts. In these clients, ask for the dashboard in your own words. The tools are the same.

3. Ask your assistant

Ask "list my last 5 activities". The first time that a garmin-personal tool asks for permission, answer Allow always in Claude Desktop. In Claude Code, use /permissions and add mcp__garmin-personal.

Tools

Tool

What it gives

listActivities

each activity with pace, HR, load and effect, by date, type or name

getActivity

the details of one activity

getActivityLaps

the laps of an activity, from its .FIT file

getActivitySets

the strength sets of an activity, with the muscles, from its .FIT file

getActivityWorkouts

the planned workout of an activity: steps, targets and notes

downloadActivityFit

saves the .FIT file of an activity in the data folder

getHrvRange

HRV during the night

getDailyHeartRate

the heart rate of a day, with the resting HR

getSleep

the sleep of a night, or of up to 14 nights: hours, phases, score and need

getWeight

weight and body composition for a range of dates

getBodyBattery

how Body Battery charged and drained, for up to 14 days

getHeartRateZones

your HR zones

getFitnessAge

fitness age against actual age

getDailySummary

steps, stress and Body Battery, for a day or a range

getDashboardData

all the dashboard data in one call, with the server's totals and a local cache

writeDashboard

writes the dashboard page

editDashboard

changes the layout, the custom widgets and the languages of the page

showDashboard

shows the dashboard inside the chat, in Claude Desktop

scheduleDashboardRefresh

updates a dashboard page automatically, at the times you say in your own words

garminGet

all other GET endpoints of the Personal API

Tools gives the endpoints, the details of each tool and the data that the Personal API does not have.

Dashboard

The server makes a training dashboard with these prompts. In Claude Desktop, the prompts are in the + menu of the message box, under garmin-personal. In Claude Code, they are slash commands: use the full name, /mcp__garmin-personal__<prompt>. The short form /garmin-personal:<prompt> can reach the assistant as the command name only, without the prompt.

Prompt

What it does

Claude Code example

training-dashboard

makes the page

/mcp__garmin-personal__training-dashboard 8

training-dashboard-update

adds the new data, your layout stays

/mcp__garmin-personal__training-dashboard-update

dashboard-setup

makes a page for you or for your coach, with only the sports and the data that you select

/mcp__garmin-personal__dashboard-setup

dashboard-widget

makes a new widget from your idea

/mcp__garmin-personal__dashboard-widget my longest ride

dashboard-language

adds a language to the page

/mcp__garmin-personal__dashboard-language German

The prompts remove all spaces around an argument, also the no-break space from a phone keyboard.

training-dashboard

The server writes the dashboard page from its template, and the assistant writes the coach notes. The page is one HTML file, garmin-dashboard.html in the data folder. It works offline.

Argument

Values

Default

weeks

1 to 52 (a larger value gives 52)

12

layout

preset, blank or freeform

preset

  • preset gives the built-in widgets on each board.

  • blank gives empty boards: you add the widgets that you want.

  • freeform lets the assistant design the whole page. This takes much longer, and each page looks different.

In Claude Code, the arguments are in order and separated by spaces: first weeks, then layout. You can also give only the layout: /mcp__garmin-personal__training-dashboard freeform.

The assistant gives you the path of the page and the command to open it. The page has a board for all your training, a Recovery board and a board for each sport. A missing value shows as "n/a".

When your runs repeat a name, for example the "Tempo Run" of a training plan, the assistant asks whether to compare those workouts across weeks. The default is no. A yes adds the Workout trend widget. The server downloads the laps of the last 8 runs of each workout once and keeps them, so the comparison grows with each update. See Page settings.

The dashboard guide tells about the title and the headline, the boards, the themes and languages, the units and the activity-name filter, and how to change the layout. The widget catalogue lists every widget.

training-dashboard-update

This prompt replaces the data and the coach notes of the page. Your layout, your custom widgets and your languages stay. Reload the page to see the new data.

Argument

Values

Default

weeks

the weeks to cover

the weeks of the page

path

the dashboard file, for example garmin-dashboard-coach.html (.html)

garmin-dashboard.html

In Claude Code: /mcp__garmin-personal__training-dashboard-update coach.html updates coach.html. A value that ends in .html is the file, also in the first place.

To update the page automatically, tell your assistant when, in your own words, for example "update my dashboard every Monday at 7". See Update the dashboard on a schedule.

dashboard-setup

The assistant asks you some questions, then writes a page with your answers. First, it asks who the page is for:

  • Personal: a page for you, with all your data.

  • Shared: a page for your coach or personal trainer. You select each type of data to include, for example HR zones yes, fitness age and sleep no.

Then the assistant asks for the file (any name or path), the title, the headline, the sports, the languages and the themes, and whether to compare the workouts that your runs repeat. The server writes only the data that you select into the file. Other data is not in the file, so you can send the file safely. A personal page and a shared page can be two files side by side. Each page keeps its settings on each update. The argument weeks is optional (default 12).

Page settings tells more.

dashboard-widget

This prompt makes a new widget from your idea, for example "my longest ride of each month". The assistant writes a small widget, and editDashboard stores it in the page and in your widget library (widgets.json in the data folder). The widget stays after each update, and each new page gets it too. The argument idea is required. The argument path is optional: it is the file of the page, for example coach.html. In Claude Code: /mcp__garmin-personal__dashboard-widget my longest ride each month coach.html. Reload the page to see the widget. Custom widgets tells more.

dashboard-language

This prompt adds a language to the dashboard. The assistant translates the texts of the page, and editDashboard stores them in the page. The argument language is optional: the default is the language of the conversation. The argument path is optional: it is the file of the page, for example coach.html. In Claude Code: /mcp__garmin-personal__dashboard-language German coach.html. A text without a translation shows in English. To remove an added language, ask your assistant to remove it: editDashboard with removeLanguages. Languages tells more.

Presets or freeform

In many setup guides for Claude and Garmin, Claude reads the data and writes the whole dashboard page. With a preset, the server writes the page from a tested template, and Claude writes only the coach notes. My measurements for a first build, with Claude Code and Opus (other clients and models give other times and costs):

First build

Time

Cost

Preset

34 s

$0.16

Claude writes the page

24 to 35 min

$6.6 to $9.2

For a design of your own, use layout = freeform: Claude writes the page, as in those guides.

Presets or freeform gives the measurements and the limits of the presets.

Dashboard in the chat

In Claude Desktop, the dashboard can open inside the chat, with its boards, charts and themes. You do not open a file or a browser. There is no prompt to run: ask in your own words, for example:

  • "Show my training dashboard in the chat."

  • "Show my dashboard in the chat for the last 26 weeks."

  • "Show garmin-dashboard-coach.html in the chat."

The assistant calls showDashboard. The tool reads new data from Garmin and shows your saved page, with its layout, custom widgets, languages and settings. It writes no file, and the page has no coach notes.

Client

What you get

Claude Desktop

the page in the chat (tested)

Claude Code, the Codex CLI and other terminal clients

a short text reply. Run training-dashboard to write the page as a file

Codex in the ChatGPT desktop app

not tested yet

The ChatGPT chat, Claude on the web

not available: they connect only to servers on the internet

The page in the chat is an MCP App. Other clients that show MCP Apps can also work, but they are not tested. Show the dashboard in the chat gives the limits.

Coach prompts

These prompts answer in the chat. They do not change a dashboard.

Prompt

What it does

Claude Code example

run-review

reviews one run as a coach

/mcp__garmin-personal__run-review

race-readiness

tells if you are ready for a race, with a plan for its pace

/mcp__garmin-personal__race-readiness 2026-11-15 half 1:45:00

strength-review

reviews one strength session as a coach

/mcp__garmin-personal__strength-review

A missing value shows as "n/a": the assistant does not estimate it.

run-review

The assistant compares the steps of the planned workout with the laps of the run: the target, what the lap did, and hit or miss. For intervals, it gives the fade from the first rep to the last. For a steady run, it gives the HR drift: the drop in distance per heartbeat from the first half to the second half. It ends with the sleep and HRV of the night after the run, and a short coach note.

Argument

Values

Default

activity

an activity id, or words of the activity name (Long Run)

the last run

race-readiness

The assistant reads the server's summary of 12 weeks (a writeDashboard preview, which writes nothing) and the laps of your long runs. It gives the days to the race, the weekly run distance and load, the long runs with their pace split and HR drift, and whether your load drops in the last 2 weeks (the taper). It predicts your race time from your best efforts of 5 km or more (Riegel, an estimate: the fastest prediction counts), compares it with your goal, and checks the HRV and sleep of the last 7 nights. It ends with a target pace for each quarter of the race.

Argument

Values

Default

date

the race date, yyyy-MM-dd

none: the assistant asks

distance

5k, 10k, half, marathon, or a distance

none: the assistant asks

goal

your goal time, for example 1:45:00

no goal: prediction only

In Claude Code, give the values in any order: a value in the form yyyy-MM-dd is the date, a value in the form 1:45:00 is the goal, and the other words are the distance. For example /mcp__garmin-personal__race-readiness half marathon 2026-11-15.

strength-review

The assistant compares the planned workout with the sets you did: the planned sets and reps of each exercise, what you did, and hit or miss. Garmin plans no weights, so the plan shows none. For each exercise it gives the top set and its estimated 1RM against the previous session of the same name, and the rep drop from the first set to the last at the same weight. It compares your rest with the planned rest, and ends with the sleep and HRV of the night after the session, and a short coach note.

Argument

Values

Default

activity

an activity id, or words of the activity name (Upper Body)

the last strength session

Configuration

All the settings are environment variables, and all of them are optional.

Variable

Default

Meaning

GARMIN_PERSONAL_API_KEY

not set

the personal API key. It has priority over the key file.

GARMIN_API_KEY_FILE

~/.config/garmin-mcp/api-key

the file with the API key

GARMIN_DATA_DIR

~/workspace/garmin-data

the data folder

GARMIN_BASE_URL

https://personal.connectapi.garmin.com

the Personal API host

To set a variable in Claude Desktop, add an env object next to args:

"env": { "GARMIN_DATA_DIR": "/absolute/path/to/garmin-data" }

In Claude Code, add --env GARMIN_DATA_DIR=/path/to/garmin-data to claude mcp add.

The data folder lists the files that the server keeps and its log.

Security

The server is read-only. It sends the API key only to the Garmin token endpoint, and it never logs or returns the key or the access token. It refuses a key that has spaces or line breaks in it, and it removes the key and the token from network error messages. If you saw your API key in a chat, revoke the key on the API key page and create a new one. No tool result has your Garmin user id, name or profile image, or the ids of your devices and daily records, also with raw and garminGet. Your .FIT files can have your GPS track, so keep the data folder private.

SECURITY.md tells how the server protects your data and how to report a vulnerability. Do not open a public issue for a vulnerability.

The Personal API is for personal use that is not commercial, under the terms of Garmin. Garmin does not endorse this project, and the project has no affiliation with Garmin.

Problems and solutions

Problem

Solution

The server does not start

Make sure that Node.js is version 22 or later: node --version.

Claude Desktop does not find npx

GUI apps do not read your shell profile. Use the absolute path of npx (which npx) as the command.

Changes have no effect

The client keeps the old server process. Restart the client: a new Claude Code session, or quit and start Claude Desktop again.

Which version runs

npx -y @indaco/garmin-personal-mcp@latest --version (or -v) prints the version and stops. --help (or -h) lists the commands.

Problems and solutions has more problems, the log files, and commands that test the key and the server.

Contributing

Read CONTRIBUTING.md. It tells how to run the server from source, and it has the commands, the test rules and the code map.

To build the website with its demo dashboard (a year of sample data), run pnpm build:all. The site is in dist-site/, and the demo in dist-site/demo/index.html.

Credits

The idea comes from apratico/garmin-mcp by Alessandro Praticò: a Java MCP server for the Garmin Personal API, where Claude writes the dashboard. I tested it in a fork, indaco/garmin-mcp, and then made this server as a different solution. It runs with npx, without Java, and it writes the dashboard page from a tested template.

This server uses the same key file as indaco/garmin-mcp and can share its data folder.

How this was built

AI agents in Claude Code wrote the code, tests and docs of this project. I chose the design, reviewed each change and tested the server with my own Garmin data. The rules that the agents follow are in AGENTS.md.

License

This project uses the MIT License. dist/index.js and the dashboard page include other libraries with their own licenses: THIRD-PARTY-NOTICES.md lists them.

Available Tools

19 tools
downloadActivityFitA

Download the ORIGINAL .FIT file of an activity and save it on the user's computer. Returns the absolute path of the saved .fit file (second-by-second HR, cadence, speed, laps).

NameRequiredDescriptionDefault
activityIdYesGarmin activity id

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose the key non-obvious trait: this is a disk-writing operation that saves a file to the user's machine and returns the absolute path. It also summarizes the payload contents. It omits overwrite behavior, whether the destination directory is fixed, and permission/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?

Two short sentences, front-loaded with the action and side effect, followed by the return value. No filler; every clause carries 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?

For a single-parameter, no-output-schema tool, the description covers the action, the side effect, and the return value, which is sufficient to call it correctly. It stops short of stating where the file lands or what happens on repeated downloads.

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

Parameters3/5

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

Only one parameter exists and schema description coverage is 100% ('Garmin activity id'), so the schema already fully documents it. The description adds no format, sourcing, or lookup guidance for activityId beyond what the schema provides.

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 ('Download the ORIGINAL .FIT file of an activity') and emphasizes 'ORIGINAL' plus 'save it on the user's computer', which separates it from metadata readers like getActivity or getActivityLaps. It does not explicitly name a sibling, so an agent must infer the boundary.

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?

Usage is implied: fetch the raw file when second-by-second data is needed locally, rather than the parsed summaries returned by getActivity/getActivityLaps. There is no explicit when-to-use / when-not-to-use statement or named alternative, leaving the routing to inference.

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

editDashboardA

Changes the layout, the custom widgets or the languages of the dashboard page (a page from the template; call writeDashboard first). Without arguments it only reads: the reply has the layout, the custom widgets, the missing texts of each language, the catalogue of built-in widgets and widgetApi, the guide to writing a custom widget. layout replaces the whole layout (the text of the page's 'Copy layout'); place adds widgets at the end of a board; widgets adds or replaces custom widgets by id and saves them in the widget library (/widgets.json), which every page from the template gets; removeWidgets removes them from this page and its boards, forgetWidgets also from the library. widgetTexts adds texts to custom widgets by id, language and key, e.g. {"longest-ride": {"de": {"title": "Längste Fahrt"}}}. languages adds page texts by key, e.g. {"de": {"title": "Training + Erholung"}}: keys and {placeholders} as in englishTexts: true; a text with "|" has a singular and a plural form. Missing texts show in English. removeLanguages removes languages that languages added.

NameRequiredDescriptionDefault
pathNoThe .html file; relative paths are inside the data dir
placeNo
layoutNoA whole layout: { base, boards: { all: [{ id, widget, type?, span, hidden? }] } }
widgetsNo
languagesNoTexts by language code and key
widgetTextsNoTexts of custom widgets by widget id, language code and key
englishTextsNoAlso return the English texts to translate
forgetWidgetsNoIds of custom widgets to remove from the library and from this page
removeWidgetsNoIds of custom widgets to remove from this page
removeLanguagesNoCodes of added languages, e.g. de

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses that `layout` replaces the entire layout, that `widgets` persists into <data-dir>/widgets.json and propagates to every page from the template, and that `forgetWidgets` is more destructive than `removeWidgets` (library plus page). It does not state reversibility, error behavior, or whether changes are saved atomically, which for a 10-parameter mutation tool is the remaining gap.

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

Conciseness4/5

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

Front-loaded with the verb and resource, then one clause per parameter. It is dense but nearly every sentence carries a distinct semantic or side-effect detail, though the inline JSON examples make it longer than strictly necessary for an agent that can read the schema.

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

Completeness5/5

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

For a 10-parameter, nested-object mutation tool with no output schema, the description covers the side effects of each parameter, the template/library propagation model, and — critically — what the argument-less read call returns (layout, widgets, missing texts, widget catalogue, widgetApi), substituting for the absent output schema.

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

Parameters4/5

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

Schema coverage is already 80%, but the description adds genuine meaning the schema cannot: add-vs-replace semantics for `place`/`layout`, page-vs-library scope for `removeWidgets`/`forgetWidgets`, and worked examples for `widgetTexts` and `languages` including the singular/plural "|" convention and the English fallback. Only `path` and `englishTexts` are left to the schema, which documents both.

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

Purpose5/5

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

States a specific verb and resource with scope: it edits the layout, custom widgets or languages of a dashboard page derived from a template. It also disambiguates from the sibling writeDashboard by naming it as a prerequisite, and it discloses the no-argument read mode, so an agent knows exactly what surface the tool covers.

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

Usage Guidelines4/5

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

Gives a concrete precondition ("a page from the template; call writeDashboard first") and clarifies that calling with no arguments is a read, not a write. What's missing is explicit guidance on when to choose editDashboard over writeDashboard/scheduleDashboardRefresh for a given change, so it stops just short of full when/when-not coverage.

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

garminGetA

Generic read-only GET on the Garmin Connect Personal API, for endpoints not covered by the other tools or when a query parameter name has to be adjusted. 'path' is relative and starts with '/', e.g. /fitnessage-service/fitnessage/v2/2026-10-25 . 'query' is an optional URL query string without '?', e.g. date=2026-10-25&foo=bar .

NameRequiredDescriptionDefault
pathYesRelative API path starting with /
queryNoQuery string, e.g. a=1&b=2

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 does the minimum safety work by declaring the call 'read-only GET'. But for an arbitrary-endpoint escape hatch it says nothing about authentication, rate limiting, error behavior on bad paths, or response shape, all of which matter more here than for a fixed-endpoint tool.

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

Conciseness5/5

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

Three sentences, each load-bearing: purpose, path format, query format. The format constraints are front-loaded before the examples, and there is no 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?

Only two parameters and no output schema, but this is a generic pass-through where an agent has no idea what comes back or what a failed call looks like. The description covers inputs thoroughly and is silent on return/error semantics, which is the remaining gap for a catch-all tool with zero annotation coverage.

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

Parameters4/5

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

Schema coverage is already 100%, so baseline is 3. The description exceeds that by adding format rules the schema omits: 'path' must be relative and start with '/', 'query' takes no leading '?', plus concrete examples of both. The example path and query string materially reduce malformed calls.

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

Purpose5/5

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

States a specific verb and resource ('read-only GET on the Garmin Connect Personal API') and immediately carves out its niche: endpoints not covered by the other tools. That positioning lets an agent distinguish it from the named get* siblings without opening any schema.

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

Usage Guidelines5/5

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

Gives two explicit selection conditions: the endpoint isn't covered by another tool, or a query parameter name must be adjusted. The 'not covered by the other tools' phrasing functions as an implicit 'when not to use' that routes the agent to the specialized siblings first.

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

getActivityA

Get the full detail of one activity (summary, metadata, splits/laps) as JSON.

NameRequiredDescriptionDefault
activityIdYesGarmin activity id

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 carries the full burden. 'Get' implies a read-only operation and the description discloses the main response components, but it does not state authentication requirements, error behavior for invalid IDs, or any rate-limit 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 a single efficient sentence with the core purpose and returned content front-loaded. There is no redundant or wasted text.

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 a fully documented schema and no output schema, the description is mostly complete: it identifies the resource and summarizes the return payload. The main omissions are sibling differentiation and how to obtain a valid activityId, which would improve completeness but are not critical to invoking the tool.

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

Parameters3/5

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

Schema coverage is 100%, and the single parameter is already documented in the schema as 'Garmin activity id'. The description adds no additional meaning, constraints, or examples beyond what the schema provides, so the baseline of 3 is appropriate.

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 the full detail of one activity. It also lists the returned contents (summary, metadata, splits/laps) and format (JSON), which helps distinguish it from listActivities. However, it does not explicitly differentiate itself from sibling activity tools such as getActivityLaps or getActivityWorkouts.

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?

Usage is implied by 'one activity' and the required activityId, suggesting it is for retrieving a single known activity. But the description gives no explicit when-to-use guidance, no alternatives, and no note that listActivities should be used to discover activity IDs.

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

getActivityLapsA

Laps of an activity as recorded by the watch (manual laps, auto-lap every km, or workout steps), read from the original .FIT file. One row per lap: distance (km), timer time, pace (min/km, foot sports) or speed (km/h), average/max HR, cadence (spm for running), ascent/descent, average power, running form (gctMs, vertRatioPct, vertOscCm, strideCm), intensity (active, interval, rest, recovery, warmup, cooldown; the auto laps of a free run can be interval), lap trigger, and the step of the planned workout (step: the reps of one drill share it). Use it for intervals and per-km splits; getActivity does not have them.

NameRequiredDescriptionDefault
activityIdYesGarmin activity id

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does substantial work: it discloses the data provenance (.FIT file), the output granularity (one row per lap), the generation modes (manual, auto-lap per km, workout step), and the units/interpretation of each metric. It does not mention whether the activity must be fully synced, authorization scope, or what happens for activities without lap data, which keeps it out of the top band.

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 purpose and the sibling contrast are front-loaded, and the long field enumeration is information-dense rather than filler. The parenthetical clarifications (units, intensity values, shared step across drill reps) each earn their place, though the run-on field list could be broken into readable groups.

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

Completeness5/5

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

There is no output schema, so the description must convey return shape — and it does, listing the row-per-lap structure and every significant column with units. For a single-parameter read tool, nothing an agent needs to call it and interpret the result is missing.

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

Parameters3/5

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

Only one parameter exists (activityId) and the schema documents it at 100% coverage as "Garmin activity id", so the baseline is 3. The description adds no further detail about the identifier's format or where to obtain it (e.g. from listActivities), so it does not rise above baseline.

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 resource (per-lap records of a single activity) read from the original .FIT file, and enumerates the concrete fields returned (distance, timer time, pace/speed, HR, cadence, form metrics, intensity, lap trigger, workout step). It also explicitly contrasts with getActivity, which lacks this data, so it is distinguishable from siblings without opening a schema.

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

Usage Guidelines5/5

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

It states the use case directly ("Use it for intervals and per-km splits") and names the alternative plus its limitation ("getActivity does not have them"), which tells the agent exactly when to route here versus the activity summary tool. Edge guidance on ambiguous semantics — e.g. auto laps of a free run may be labeled interval, and the reps of a drill share one step — further disambiguates interpretation.

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

getActivitySetsA

Strength training sets of an activity, read from the original .FIT file. One entry per exercise, in the order first done, with its movement category, its primary and secondary muscles (from Garmin's exercise catalogue) and its active sets: reps, weight (kg, absent when none was recorded), set time in seconds and the rest after the set (restSec). Exercise names are stable across sessions, so they can be used for per-exercise trends. Edits made later in Garmin Connect (renamed exercises, corrected reps or weights) are not in the .FIT file.

NameRequiredDescriptionDefault
activityIdYesGarmin activity id

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses data provenance (.FIT file), ordering (order first done), field-level null behavior (weight absent when none was recorded), unit conventions (kg, seconds), and a staleness caveat. It omits what happens for non-strength activities (empty result vs. error) and any auth/rate-limit context.

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?

Front-loaded with what is returned, then field details, then the caveat. Every sentence adds information — the catalogue source, unit conventions, and the .FIT-vs-Garmin-Connect distinction all affect how an agent interprets results.

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

Completeness4/5

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

No output schema and no annotations exist, so the description must convey the return shape, and it does so thoroughly: per-exercise entries, movement category, primary/secondary muscles, and per-set reps/weight/set time/restSec. The remaining gap is edge-case behavior for activities that are not strength training, which an agent would otherwise have to discover by trial.

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

Parameters3/5

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

Only one parameter (activityId) and schema coverage is 100%, so the schema already fully documents it. The description only implies the activity scoping via 'of an activity' and adds no format, sourcing, or validity detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific resource and scope: strength training sets of an activity, read from the original .FIT file, one entry per exercise. This is clearly distinguishable from siblings like getActivityLaps (laps), getActivityWorkouts (workout definitions) and getActivity (summary), so an agent can route without opening a schema.

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 establishes the key selection condition: data comes from the .FIT file, and later Garmin Connect edits (renamed exercises, corrected reps/weights) are not included. That tells an agent when this source is and isn't appropriate. It stops short of naming an alternative tool for the edited view or stating prerequisites (e.g. activity must be a strength activity).

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

getActivityWorkoutsA

The planned workout that an activity followed, as created in Garmin Connect: its steps in order, each with its intensity (warmup/active/rest/recovery/cooldown), its duration (time in seconds, reps, or open), its target (cadence, heart rate, pace, or open, with low and high values), the exercise for strength steps, and the coach's notes. A step with durationType REPEAT_UNTIL_STEPS_CMPLT repeats the steps from stepIndex durationValue up to it, targetValue times in all. Compare it with getActivitySets or getActivityLaps for plan against done. An empty list means the activity followed no planned workout. Null fields are left out.

NameRequiredDescriptionDefault
activityIdYesGarmin activity id

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations the description carries the full burden, and it delivers: it defines the return shape (ordered steps, intensity, duration type, targets, coach notes), documents the empty-list case, documents that null fields are omitted, and explains the non-obvious REPEAT_UNTIL_STEPS_CMPLT semantics. Missing only minor traits such as error behavior when activityId is invalid.

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

Conciseness4/5

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

Front-loaded with the resource definition, then fields, then the repeat-step special case, then the comparison hint. The enumerations of intensity/target values are dense but each earns its place; the REPEAT_UNTIL_STEPS_CMPLT sentence is long but necessary.

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

Completeness4/5

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

No output schema exists, so the description must explain returns — and it does, covering step structure, ordering, empty results, and omitted nulls. A user can invoke and interpret the tool from this alone; only the repeat-step wording is slightly hard to parse.

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

Parameters3/5

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

Schema coverage is 100% for the single activityId parameter, so the schema already defines it. The description adds no parameter-level guidance (e.g., where to obtain the id, whether the workout is keyed to a different id), so baseline 3 applies.

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?

Names the concrete resource (the planned workout an activity followed, as created in Garmin Connect) and what it contains, which is more specific than the tool name alone. It stops short of a clean verb-first statement ('Returns the planned workout for an activity'), but the intent is unambiguous and it distinguishes itself from the laps/sets 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?

Provides one situational hint: 'Compare it with getActivitySets or getActivityLaps for plan against done,' which implies this is the 'plan' side. It does not state when not to use it, or that the activity must exist / be synced, so usage is implied rather than spelled out.

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

getBodyBatteryA

Body Battery for up to 14 days, yyyy-MM-dd: for each day how much it charged and drained, its readings through the day, and the events that changed it (sleep, activities, stress, naps) with their impact.

NameRequiredDescriptionDefault
toDateYesTo date yyyy-MM-dd
fromDateYesFrom date yyyy-MM-dd

TDQS

A3.5/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 discloses the maximum date range (14 days) and the types of events included, but omits behavioral traits such as whether the operation is read-only, authentication requirements, rate limits, or error handling. This is a read tool, but the description does not explicitly confirm that.

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, front-loaded sentence that efficiently conveys the tool's purpose and output content. It is dense but not overly verbose, though it could be slightly more structured with bullet points.

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 simple two-parameter schema and no output schema, the description adequately explains what data is returned per day, including charge/drain, readings, and events. It covers the essential information an agent needs to call the tool correctly, though it could mention output format or error conditions.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description only reiterates the date format (yyyy-MM-dd) and the 14-day limit, adding no new meaning beyond what the schema provides.

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) and details the data returned per day, including charge/drain, readings, and events. It clearly distinguishes this tool as focused on Body Battery data, though it does not explicitly name sibling tools 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 description implies usage by specifying a date range up to 14 days and listing the data returned, but it offers no explicit guidance on when to choose this tool over alternatives like getDailySummary or getSleep. No exclusions or prerequisites are mentioned.

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

getDailyHeartRateB

Daily heart rate for one date (includes resting heart rate), yyyy-MM-dd.

NameRequiredDescriptionDefault
dateYesDate yyyy-MM-dd

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 behavioral burden. It discloses that results are daily and include resting heart rate, but it does not mention permissions, timezone/local-date behavior, no-data handling, or the returned data shape.

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 front-loaded sentence with no filler. Every component—resource, scope, included resting heart rate, and date format—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 with full schema coverage, the description is minimally adequate. However, with no output schema and no annotations, it could say more about the returned daily heart-rate structure and edge cases.

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

Parameters3/5

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

Schema description coverage is 100%, and the only parameter is already documented as a yyyy-MM-dd date. The description repeats the date format but adds no further semantics such as timezone or range constraints, so the baseline of 3 applies.

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/resource and scope: daily heart rate for one date, including resting heart rate. It is clear what the tool returns, but it does not explicitly distinguish itself from related siblings such as getHeartRateZones, getHrvRange, or getDailySummary.

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 one-date scope implies when the tool is applicable, but there is no explicit when-to-use or when-not-to-use guidance. It also does not name alternatives or explain how to choose between this and related heart-rate or daily-summary tools.

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

getDailySummaryA

Daily user summary (steps, calories, stress, body battery, resting HR) for one date, or for up to 14 days (fromDate and toDate; the range answer has Garmin's v2 field names), yyyy-MM-dd.

NameRequiredDescriptionDefault
dateNoDate yyyy-MM-dd
toDateNoLast date yyyy-MM-dd, with fromDate
fromDateNoFirst date yyyy-MM-dd, with toDate

TDQS

A4/5.0
Behavior3/5

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

No annotations exist, so the description carries the full burden: it does disclose two non-obvious behaviors — the hard 14-day range cap and that range responses use Garmin's v2 field names rather than the single-date shape. It omits whether this is strictly read-only, whether auth/existing Garmin session is required, and how errors surface for over-long ranges.

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 front-loaded sentence: purpose and metrics first, scope and parameters second, format notes parenthetically. No filler and nothing to cut.

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 zero required params, no annotations, and no output schema, the description does the necessary work by listing the returned metrics and flagging the differing range response shape. The residual gap is that 'Garmin's v2 field names' is not actionable without external docs and the mutual exclusivity of 'date' vs. fromDate/toDate is only implied.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the pairing requirement is framed as an either/or mode choice and the undocumented 14-day maximum is introduced. It still doesn't say what happens when both 'date' and the from/to pair are supplied.

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?

Names a specific resource ('Daily user summary') and enumerates the returned metrics (steps, calories, stress, body battery, resting HR), which distinguishes it from narrower siblings like getBodyBattery, getDailyHeartRate, and getSleep. The single-date vs. range scope is stated up front.

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?

It explains the two invocation modes ('for one date, or for up to 14 days') and which parameters select each, which is genuine usage context. However, it never says when to prefer this aggregate over the many sibling single-metric tools (getSleep, getBodyBattery, getDashboardData), so the agent still infers the choice.

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

getDashboardDataA

All the data of the training dashboard in one call: HR zones, fitness age, the activities of the last weeks weeks (compact summaries, with strength sets and laps where they apply), the activities of the weeks before for the period comparison, daily HRV, and the last 14 days of sleep and daily summaries, and units: the measurement system of the Garmin profile (metric, statute_us or statute_uk) that the page shows; the data itself is always metric; locale: the language of the Garmin profile, e.g. it or pt-BR. Keeps a local cache and fetches from Garmin only what is new since the last call, so a rebuild or an update needs few calls. sync in the result says what was fetched: Garmin calls, .FIT files downloaded (fitDownloads) and new activities. digest, first in the result: the server's totals for the whole period and for each Monday-Sunday week (sessions, km, hours, load), the training load of the last 7 and 28 days, best efforts, races and strength top sets; quote them instead of your own sums. For another date range, use the activities: each one is on its own line.

NameRequiredDescriptionDefault
weeksNoWeeks to cover, default 12, max 52
workoutsNoAlso the laps of the runs of each run name that repeats, to compare a workout across weeks: the last 8 (downloaded once) and older ones whose .FIT file is saved; default false

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden well: it discloses caching and incremental-fetch behavior, explains the `sync` result field, and clarifies that units/locale come from the Garmin profile while data remains metric. It does not state permissions or error behavior, but for a read-oriented aggregate tool this is substantial context.

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

Conciseness3/5

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

The description is front-loaded with the core purpose and contains no obvious fluff, but it is a dense, run-on set of clauses joined by semicolons that makes it harder to parse. It is appropriately sized for a complex aggregate tool, but the structure could be cleaner.

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 complex aggregate tool with no output schema, the description covers the major returned components (digest, sync, activities, sleep, HRV, units, locale) and caching behavior. It stops short of explaining the full response shape for activities, but provides enough to call and interpret the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents `weeks` and `workouts` thoroughly. The description reinforces the meaning of `weeks` in its data enumeration but adds little about the `workouts` parameter beyond what the schema already says.

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 that this tool returns all training-dashboard data in one call and enumerates the included data types (HR zones, fitness age, activities, HRV, sleep, summaries). It distinguishes itself implicitly from individual sibling tools by emphasizing the aggregate 'in one call' scope, though it does not explicitly name alternatives.

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?

It gives a helpful hint for retrieving another date range via activities, and explains caching behavior that favors using this tool for rebuilds or updates. However, it does not explicitly guide when to use this aggregate tool versus individual siblings like getHeartRateZones or getSleep.

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

getFitnessAgeB

Garmin fitness age for a date, yyyy-MM-dd: fitness age vs chronological age, the achievable fitness age, and its components (body fat, vigorous days and minutes per week, resting HR) with the targets Garmin suggests.

NameRequiredDescriptionDefault
dateYesDate yyyy-MM-dd

TDQS

B3.4/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. It usefully enumerates the returned values and components, but it does not disclose access requirements, data availability, or other operational context for the read operation.

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 front-loaded sentence with no wasted words. It prioritizes the main resource and then briefly explains the returned components.

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 a fully described schema, the description gives enough output context, including the key returned metrics, even though no output schema exists. The main gap is the absence of usage guidance relative to sibling tools.

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

Parameters3/5

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

Schema description coverage is 100%, so the single date parameter is already documented. The description repeats the yyyy-MM-dd format but adds no extra semantics such as timezone or valid date range, making the baseline score appropriate.

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 resource and scope: Garmin fitness age for a given date, including what the result compares and which components are returned. It is clearly distinct from metric siblings such as getSleep or getDailySummary, 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?

The description does not say when to use this tool versus alternatives, nor does it mention prerequisites or exclusions. Usage is only inferable from the tool name and the mention of a date parameter.

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

getHeartRateZonesB

Heart rate zones currently configured in Garmin Connect.

NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. 'Currently configured' usefully signals a read-only snapshot of stored settings rather than a mutation or a computed metric, but it does not state whether zones are default or user-customized, whether they are sport-specific, or on what basis zone boundaries are defined.

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?

A single tight sentence fragment with no filler, and the key discriminator ('currently configured') is front-loaded. It is arguably slightly too terse given the absence of annotations and an output schema, but nothing is wasted.

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?

With no annotations and no output schema, the description is the only source of behavioral context, and it omits the one thing an agent most needs: what comes back. Garmin zones vary by sport and by basis (%max, %LTHR, %reserve) and include zone boundaries, so leaving the return shape entirely unspecified is a real gap.

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 takes zero parameters and the schema is an empty object with full coverage, so there is nothing for the description to disambiguate. The description correctly implies no inputs are needed, so the baseline of 4 applies.

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?

Names a specific resource (heart rate zones) with a meaningful qualifier ('currently configured in Garmin Connect'), which implies a retrieval of stored settings rather than measured heart-rate samples. There is no explicit verb and no sibling is named, but an agent can still tell this apart from getDailyHeartRate based on the 'configured' framing.

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 on when to use this versus getDailyHeartRate, getHrvRange, or getFitnessAge—all of which surface heart-rate-related data. There are no prerequisites, no exclusions, and no statement that it takes no arguments and needs no user/sport selection.

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

getHrvRangeC

Daily HRV (overnight) summaries for a date range, yyyy-MM-dd.

NameRequiredDescriptionDefault
toDateYesTo date yyyy-MM-dd
fromDateYesFrom date yyyy-MM-dd

TDQS

C2.9/5.0
Behavior2/5

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

No annotations exist, so the description carries the full disclosure burden. It implies a read-only retrieval and states the data is daily/overnight, but says nothing about return shape, missing-data behavior, date-range limits, or whether ranges are inclusive.

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?

A single compact sentence with the resource and the date format front-loaded and no filler. It is telegraphic enough that it reads more like a fragment than a complete instruction.

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 two-parameter read tool with full schema coverage, the essentials are present, but with no output schema the agent gets no hint about the returned HRV fields or aggregation. Adequate but with a clear gap.

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

Parameters3/5

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

Schema coverage is 100%, with both fromDate and toDate documented as yyyy-MM-dd, so the description's format note is redundant rather than additive. Baseline 3 applies since the schema already does the work.

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?

Names a specific resource (daily overnight HRV summaries) and scope (date range), which clearly separates it from siblings like getSleep or getDailyHeartRate. It never explicitly contrasts itself with those siblings, keeping it short of a 5.

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 on when to use this versus getDailySummary, getSleep, or other date-range health tools, and no stated prerequisites. The date-range scope is implied by the parameter names rather than explained.

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

getSleepA

Sleep for one night (date: the morning you woke up), or for up to 14 nights (fromDate and toDate), yyyy-MM-dd, as one compact row per night: bedtime and wake (local HH:mm), hours of sleep, deep, light, REM and awake, the sleep score and its quality, the sleep need (hours), average heart rate, average and lowest SpO2, average respiration, awake count, average sleep stress and Garmin's feedback. Missing values are left out, and a night without sleep data has only its date. Set raw=true for Garmin's JSON.

NameRequiredDescriptionDefault
rawNoReturn Garmin's raw JSON instead of the summary
dateNoDate yyyy-MM-dd
toDateNoLast date yyyy-MM-dd, with fromDate
fromDateNoFirst date yyyy-MM-dd, with toDate

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and largely delivers: it discloses the 14-night cap, that output is one compact row per night, that missing values are omitted rather than nulled, and that a night without sleep data returns only its date. It doesn't mention auth requirements or rate limits, but for a read-only data getter the behavioral profile is unusually complete.

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 mode-selection information is front-loaded, and the long field enumeration earns its space because there is no output schema. The middle clause is dense and reads as a run-on, but nothing is redundant with structured fields.

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 output schema and no annotations, the description compensates by enumerating every returned field and the missing-data convention. The one gap is that all four parameters are optional, and the description never says what happens if no date arguments are passed.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: 'date' is defined as 'the morning you woke up' (a genuine disambiguation the schema does not make), and it explains that fromDate/toDate must be used as a pair. That goes beyond restating property descriptions.

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 names a specific verb ('Sleep') and resource (Garmin sleep data) and splits the two operating modes: a single night via 'date', or a range via 'fromDate'/'toDate'. The resource is unique among siblings (getActivity, getBodyBattery, getHrvRange), so confusion is unlikely, though no sibling is named explicitly to route an agent away.

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 states the condition for each mode: one night with 'date', up to 14 nights with 'fromDate' and 'toDate', and 'raw=true' for Garmin's JSON. It gives no exclusions or pointers to alternative tools, but the usage context is unambiguous.

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

getWeightA

Weight for a date range, yyyy-MM-dd: the latest weight of each day (with body fat, muscle and bone mass, BMI and body water when a scale records them), the average of the range, and the last weight before and the first after the range. Set includeAll=true for every entry of each day. Weight, muscle mass and bone mass are in grams.

NameRequiredDescriptionDefault
toDateYesTo date yyyy-MM-dd
fromDateYesFrom date yyyy-MM-dd
includeAllNoEvery weight entry of each day, not only the latest

TDQS

A3.9/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 disclosure burden and does well: it explains that each day's latest entry is returned, what extra scale metrics may accompany it, that an average and boundary weights are included, and the units used. It does not cover auth, rate limits, or no-data behavior, but it substantially describes the read behavior.

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 the core purpose and then packs in the important return-shape details without filler. Despite being dense, every clause contributes either scope, output composition, includeAll behavior, or units.

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

Completeness5/5

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

There is no output schema and no annotations, so the description must explain the return values, and it does so thoroughly: per-day latest entries, optional body-composition metrics, range average, adjacent boundary weights, includeAll behavior, and units. That is sufficient for an agent to invoke and interpret the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents fromDate, toDate, and includeAll. The description reinforces the date format and includeAll effect and adds unit context, but it does not add much parameter semantics beyond what the schema already provides.

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 identifies weight data over a date range and enumerates the returned components, so an agent can tell this is the weight-history tool. It lacks an explicit verb and does not explicitly contrast with siblings such as getDailySummary, but the resource-specific scope is still clear.

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?

It gives useful context for the date range and explains when to set includeAll=true, but it does not say when to use this tool instead of related body-composition or daily-summary tools. Usage is implied rather than explicitly guided.

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

listActivitiesA

List the user's Garmin activities (most recent first) as a compact summary: id, name, type, local start time, distance (km), moving duration, average pace, average/max heart rate, cadence, ascent; when Garmin has them: elapsed time (if longer than moving time), race flag, Garmin training load, aerobic/anaerobic training effect and label, seconds in HR zones 1-5, calories, moderate/vigorous intensity minutes, body battery change, steps, swim SWOLF, pool length, lengths and strokes, power, running form (stride, ground contact, vertical oscillation and ratio), grade-adjusted pace, best efforts (1k, mile, 5k, 10k, half, marathon) and run/walk segments. Dates are yyyy-MM-dd. Set raw=true for Garmin's full JSON.

NameRequiredDescriptionDefault
rawNoReturn Garmin's raw JSON instead of the summary
limitNoMax number of activities, default 20
namesNoActivity names (optional): keep only the activities whose name contains one of them, ignoring case
endDateNoEnd date yyyy-MM-dd (optional)
startDateNoStart date yyyy-MM-dd (optional)
activityTypeNoActivity type key (optional): a parent type such as running or cycling, or a subtype such as trail_running

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well on output behavior: it discloses ordering, that many fields are conditional ('when Garmin has them'), date format, and the raw JSON alternative. It omits anything about auth requirements, rate limits, or cost of large limits, which keeps it from a 5.

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

Conciseness3/5

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

The lead is well front-loaded with verb, resource, and ordering. However, the return-field enumeration runs long and reads as an exhaustive dump (SWOLF, strokes, best efforts, run/walk segments) rather than information that helps an agent decide or call correctly.

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?

There is no output schema, so enumerating the returned fields is genuinely necessary and mostly done. Filter semantics and the relationship to getActivity remain underspecified, but an agent can call this correctly with defaults from what is written.

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

Parameters3/5

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

Schema description coverage is 100%, so names, dates, activityType, limit, and raw are already documented. The description only repeats 'Dates are yyyy-MM-dd' and the raw=true behavior and adds no new filter semantics (e.g., how startDate/endDate and names interact). Baseline 3 applies.

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?

A specific verb and resource ('List the user's Garmin activities') plus ordering (most recent first) and a scope hint ('compact summary'). It implicitly contrasts with the detail-oriented sibling getActivity but never names it, so the agent must infer the boundary.

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?

Usage is only implied: 'compact summary' plus the raw=true escape hatch suggests this is the lightweight listing path versus a full single-activity fetch. There is no explicit statement of when to choose this over getActivity, nor guidance on combining date range, names, and activityType filters.

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

scheduleDashboardRefreshA

Turns on, changes or stops the automatic refresh of a dashboard page. Use it only when the user asks for it or says yes to the question of a dashboard prompt. A job in the scheduler of the computer (launchd, cron or Task Scheduler) replaces the data of the page at the given times, also with no assistant open. The refresh removes the coach notes, because old notes do not agree with new data. The computer must be on at that time. The page must exist (writeDashboard first). cron: convert what the user says, in any language, into a 5-field cron expression in local time: minute hour day-of-month month weekday, numbers only (0 = Sunday), e.g. "0 7 * * 1-5" for weekdays at 7. Two runs must be at least 1 hour apart. The cron is for all scheduled pages; path adds that page (default the main page); off stops the refresh of path, or of every page when no path is given. Without arguments it only reads. The reply has next, the next runs in local time: tell them to the user in their language, so they can check the schedule.

NameRequiredDescriptionDefault
offNoStop the refresh
cronNominute hour day-of-month month weekday, e.g. "0 7 * * *"; default 0 7 * * *
pathNoThe .html file; relative paths are inside the data dir

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does: it discloses that a real OS scheduler (launchd/cron/Task Scheduler) runs the job outside the assistant, that the machine must be powered on, that coach notes are destroyed on refresh, and that runs must be >=1 hour apart. These are exactly the side effects and constraints an agent must know before mutating state.

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?

Purpose and the user-consent rule are front-loaded, and nearly every sentence carries needed information. It is dense and long, and the trailing note about reporting `next` to the user is slightly tangential, but the cron semantics justify most of the length.

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

Completeness5/5

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

No output schema exists, yet the description explains the reply contains `next` with upcoming runs in local time and instructs the agent to relay them. Combined with prerequisites, side effects, and full parameter semantics, an agent can call this correctly without further inference.

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 already 100%, but the description goes well beyond it: it specifies cron as a 5-field local-time expression, numbers only, 0=Sunday, gives a worked example, states the 1-hour spacing rule, explains that cron applies globally while `path` scopes to one page (default main page), and that `off` without `path` stops every page.

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?

Opens with a specific verb triad and resource: 'Turns on, changes or stops the automatic refresh of a dashboard page.' That clearly separates it from writeDashboard/editDashboard, which author page content rather than scheduling.

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

Usage Guidelines5/5

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

Gives an explicit activation condition ('only when the user asks for it or says yes'), a prerequisite ('The page must exist (writeDashboard first)'), and a no-arg read-only mode. The agent knows both when to call it and when not to.

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

writeDashboardA

Writes the training dashboard page (default /garmin-dashboard.html) with the data of the last weeks weeks, and returns its path and a short digest of the data (totals, weekly sums, load, best efforts, races, strength top sets, HRV, recovery, fitness age, sync) for the coach notes. An existing page keeps all its code, layout and widgets: only its data is replaced. A page from an older template gets the new template and keeps its layout and widgets. Every page from the template also gets the custom widgets of the widget library (/widgets.json), not placed on a board. layout writes a new page from the template: preset (the default widgets) or blank (empty boards). page writes your own page code instead; it must contain /* garmin-data:start /null/ garmin-data:end */. A replaced page is kept as .bak. notes: at most 5 plain-text coach notes; the server escapes them. settings replace the page's settings (title, headline, sports, data to leave out, languages, themes); without them the page keeps its own. The page holds only the data, languages and themes they keep. pageLanguages in the result lists the languages of the page's Language menu, and settings the settings that the page keeps. missingProfileLanguage is the language of the Garmin profile when the page has no texts in it (it shows English); editDashboard languages adds it. missingWidgetTexts lists the custom widgets that miss texts in a language of the page, with those languages; editDashboard widgetTexts adds them. preview: true writes nothing: it returns the digest, the activities of each board and the settings of the page.

NameRequiredDescriptionDefault
pageNoYour own page code, with an empty garmin-data block, instead of the template
pathNoThe .html file; relative paths are inside the data dir
notesNoCoach notes, plain text; without notes the page has none
weeksNoWeeks to cover, default 12, max 52
layoutNoWrite a new page from the template with this layout
previewNoWrite nothing: return the digest, the activities of each board and the page settings
settingsNoThe page settings; replaces the page's own

TDQS

A4.2/5.0
Behavior5/5

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

With zero annotations the description carries the full burden and does so richly: states that only data is replaced on an existing page, that older-template pages get migrated while keeping layout, that a replaced page is kept as <file>.bak, that `notes` are server-escaped and capped at 5, and that `preview` writes nothing. This is exactly the mutation/overwrite/backup context an agent needs before a destructive write.

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

Conciseness3/5

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

Nearly every sentence carries information, but the text is a dense wall of backticked parameter references with no front-loading of the core use case beyond the first sentence and no bullet or grouping structure. It is readable only if parsed linearly, which hurts fast scanning.

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

Completeness5/5

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

No output schema exists, yet the description enumerates the digest contents (totals, weekly sums, load, best efforts, races, strength top sets, HRV, recovery, fitness age, sync) and explains result fields like `pageLanguages`, `settings`, `missingProfileLanguage` and `missingWidgetTexts` including the sibling call that fixes each. For a 7-param tool with a nested settings object, this is 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?

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: the `page` marker block requirement, `layout` preset-vs-blank semantics, `settings` replacing (not merging) the page's own values, and `weeks` default of 12. It stops short of elaborating several nested `settings` fields that the schema already covers.

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?

Opens with a specific verb and resource ('Writes the training dashboard page') plus its default path and return value (path + digest). It also distinguishes itself implicitly from editDashboard by referencing that sibling for languages/widgetTexts edits, though the read-only counterpart (getDashboardData) is never named to sharpen the boundary.

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

Usage Guidelines4/5

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

Gives clear selection logic for its own modes: `layout` vs `page`, `preview: true` for a dry run, and routing to editDashboard for `languages` and `widgetTexts`. It lacks explicit 'when not to use this / use getDashboardData instead' guidance, so the alternative for reading is left to inference.

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

Tool Schema Changelog

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

  1. 19 tool updates
    • First observeddownloadActivityFit
    • First observededitDashboard
    • First observedgarminGet
    • First observedgetActivity
    • First observedgetActivityLaps
    • First observedgetActivitySets
    • First observedgetActivityWorkouts
    • First observedgetBodyBattery
    • First observedgetDailyHeartRate
    • First observedgetDailySummary
    • First observedgetDashboardData
    • First observedgetFitnessAge
    • First observedgetHeartRateZones
    • First observedgetHrvRange
    • First observedgetSleep
    • First observedgetWeight
    • First observedlistActivities
    • First observedscheduleDashboardRefresh
    • First observedwriteDashboard

TDQS

A3.6/5.0

Scored across 19 tools

Disambiguation4/5

Most tools target clearly distinct resources or actions, especially the activity-detail tools and the health metric getters. There is some intentional overlap between the aggregate getDashboardData/garminGet tools and the specialized getters, and writeDashboard vs editDashboard could be confused at first glance, but the descriptions clarify their roles.

Naming Consistency4/5

Most names follow a predictable camelCase verb_noun pattern: getActivity, getSleep, listActivities, writeDashboard, editDashboard, scheduleDashboardRefresh. garminGet is an outlier in both prefix and verb-order convention, and downloadActivityFit is a slight deviation, but the set remains readable and mostly consistent.

Tool Count4/5

With 19 tools, the server is slightly above the typical 3-15 range, but the domain is broad: health metrics, activity detail, FIT files, dashboard generation, editing, and scheduling. Most tools have a clear purpose, so it is not excessively bloated.

Completeness4/5

The server covers core read paths for activities, sleep, HRV, heart rate, body battery, weight, fitness age, zones, and dashboard lifecycle operations, with garminGet as a read-only fallback for uncovered endpoints. Minor gaps remain, such as direct write/update operations for many health metrics and dashboard deletion/cleanup, but these are not major workflow blockers.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables reading and analyzing Garmin Connect data—activities, health metrics, FIT files, and challenges—through natural language, for AI assistants like Claude and ChatGPT.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Provides Claude Code and Claude Desktop with safe, read-only access to your local Garmin training data, readiness decisions, run details, and trends so you can get coaching advice in natural language.
    15
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Connects Garmin Connect to AI assistants, answering questions about training, sleep, HRV and recovery with metrics computed in code rather than guessed from raw JSON. Queries daily readiness, training load, activity FIT analysis and personal records through a self-hosted Cloudflare Worker with OAuth.
    9 npm
    7
    MIT