Skip to main content
Glama
jhoy1020

garmin-coach-mcp

by jhoy1020

garmin-coach-mcp

An MCP server that lets Claude read and answer questions about your Garmin Connect data — recent activities, per-set strength history, sleep and recovery, and simple trends — and optionally build workouts back onto your watch.

Same code, two ways to run it:

Mode

Where

Use it for

Setup

Local

Your PC, launched by Claude Code

Day-to-day at your desk

~2 min, free

Hosted

Azure Container Apps

Asking from your phone, PC off

~20 min, ~$5/mo

Local is the default: nothing listens on a socket, so nothing needs authenticating. Hosted is opt-in and sits behind Microsoft Entra sign-in.

Garmin's API is unofficial. This uses python-garminconnect, which is not sanctioned by Garmin and can break when they change their backend. Fine for personal use; don't build anything load-bearing on it.

Quick start

Local

git clone https://github.com/jhoy1020/garmin-coach-mcp.git
cd garmin-coach-mcp
./scripts/setup.sh          # or .\scripts\setup.ps1 on Windows

Creates the virtualenv, installs the package, runs the one-time Garmin login, and registers the server with Claude Code using this checkout's own path. Nothing to edit. Verify with python scripts/doctor.py, then restart Claude Code and ask it something.

Hosted — after the local setup works:

python scripts/deploy.py

Provisions Azure, registers the Entra application, seeds your Garmin token, and prints the connector URL.

Related MCP server: garth-mcp-server

What leaves your machine

  • Local mode: nothing. The server talks to Garmin directly from your PC. Your Garmin password is typed into a subprocess and never stored — only a refreshable token, in ~/.garminconnect.

  • Hosted mode: that token is uploaded to an Azure file share in your own subscription, and your Garmin data passes through your own container. Requests come from claude.ai's servers. See docs/security.md.

Tools

Read (9)

Tool

What it answers

garmin_status

Is the connection working? Whose account?

list_activities(limit, activity_type)

"Show my last N workouts"

get_activity(activity_id)

Detailed metrics for one activity

get_exercise_sets(activity_id)

Per-set exercise / reps / weight / est. 1RM

get_strength_history(exercise_name, weeks)

"Is my squat going up?"

get_recovery(date)

Sleep + daily stats + training readiness

get_trends(metric, weeks, sample_days)

Resting HR, steps, stress over time

suggest_next_weight(exercise_name, ...)

Progressive-overload recommendation

list_workouts(limit)

Saved workouts (name + id)

Write (3) — set GARMIN_COACH_READONLY=1 to drop these from the manifest entirely.

Tool

What it does

create_strength_workout(name, exercises, schedule_date)

Build a strength workout on Garmin (experimental)

schedule_workout(workout_id, date)

Put an existing workout on your calendar

delete_workout(workout_id)

Undo / remove a workout

Strength answers only have data if you log Strength activities with weights on your watch. create_strength_workout uses Garmin's unofficial workout schema — check the result in the Garmin Connect app and delete_workout if it's wrong.

Layout

src/garmin_coach_mcp/
  server.py            tool definitions + entry point
  config.py            settings; refuses to start on unsafe combinations
  http_app.py          SecretGate - the auth ladder for hosted requests
  oauth.py             validates Entra-issued tokens
  oauth_broker.py      a small OAuth 2.1 server (the path real clients use)
  ratelimit.py         token buckets for the unauthenticated endpoints
  garmin_client.py     cached, token-authenticated Garmin client
  analysis.py          strength-history and trend computations, argument clamps
  strength_workout.py  Garmin workout payload builder
  login.py             one-time interactive Garmin login
scripts/               setup, deploy, doctor, rotate, secret scanner
infra/                 Bicep for the hosted deployment
tests/                 109 tests
docs/                  setup, architecture, security, troubleshooting

Documentation

docs/local-setup.md

Run it on your PC

docs/remote-setup.md

Deploy to Azure with Microsoft sign-in

docs/architecture.md

How it's built and why

docs/security.md

Threat model, what protects what, rotating secrets

docs/troubleshooting.md

Organised by what you actually see

CLAUDE.md

Context for AI agents working on this repo

Scripts

Task

Command

Set up locally

python scripts/setup_local.py

Diagnose anything

python scripts/doctor.py (--remote, --json)

Deploy to Azure

python scripts/deploy.py

Register the Entra app

python scripts/entra_app.py

Upload the Garmin token

python scripts/seed_token.py

Rotate secrets

python scripts/rotate_secrets.py --help

Get the connector URL

python scripts/doctor.py --connector-url

Scan for secrets

python scripts/check_secrets.py

Configuration

.env.example documents every setting. The ones you are most likely to touch:

Variable

Default

Meaning

GARMIN_COACH_TRANSPORT

stdio

stdio or http

GARMIN_COACH_READONLY

off

Hide the three write tools entirely

GARMINTOKENS

~/.garminconnect

Where the Garmin OAuth token lives

GARMIN_COACH_TIMEZONE

your machine's

Container TZ; wrong value makes "today" wrong

GARMIN_COACH_ALLOWED_REDIRECT_HOSTS

claude.ai,claude.com + loopback

Hosts that may receive an authorization code

Hosted mode also needs the Entra values, which scripts/deploy.py sets for you — see docs/remote-setup.md for the name mapping between what you type and what the container reads.

config.py refuses to start on unsafe combinations rather than running half-secured: a partial Entra configuration, an http transport with no way to authenticate, a too-short secret, a non-https public URL, access logging alongside a URL secret, or a wildcard redirect-host allowlist without an explicit second opt-in.

Tests

python scripts/setup_local.py --dev    # installs pytest
python -m pytest

109 tests. The security-relevant ones are written to fail if the fix is reverted — the concurrency test genuinely serialises without the threadpool, and the rate-limiter test fails if the limiter key goes back to the spoofable leftmost X-Forwarded-For entry.

Contributing

python scripts/install_hooks.py enables the pre-commit scanner (setup does this for you). It blocks credentials and personal data — this repository is public, and the thing that actually needed cleaning up was absolute paths and resource names, not keys. CI runs the same checks.

Licence

MIT.

Available Tools

12 tools
create_strength_workoutA

Create a strength workout in Garmin Connect (and optionally schedule it).

EXPERIMENTAL: built from Garmin's unofficial workout schema. After creating, open the Garmin Connect app to confirm it looks right; use delete_workout to undo.

Args: name: Workout name shown on the watch / in Garmin Connect. exercises: List of exercises. Each item: {"name": "Bench Press", "sets": 3, "reps": 10, "weight_kg": 60, "rest_seconds": 90, "category": "BENCH_PRESS" (optional Garmin key)} schedule_date: Optional YYYY-MM-DD to place it on your Garmin calendar.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
exercisesYes
schedule_dateNo

TDQS

A4.5/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full burden. It discloses experimental status, advises confirming the result in the Garmin Connect app, and suggests delete_workout for rollback. While it doesn't detail permissions or side effects beyond creation, the experimental warning and safety net provide meaningful behavioral transparency.

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 efficiently structured: a one-line purpose, a concise experimental warning with actionable advice, and a well-formatted argument list. Every sentence adds value, and the example is directly useful without being verbose.

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

Completeness4/5

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

Given the tool's complexity (3 params, no output schema, no annotations), the description covers purpose, usage, parameters, and risk mitigation. It doesn't explain return values, but that's not critical for creation tools. The description is largely complete for an agent to invoke it safely.

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

Parameters5/5

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

Schema coverage is 0%, so the description fully compensates. It explains name (display location), exercises (with a detailed JSON example including optional category), and schedule_date (format and purpose). This goes far beyond the bare schema, giving the agent everything needed to construct valid arguments.

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

Purpose5/5

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

The description clearly states the verb ('Create') and resource ('strength workout in Garmin Connect'), and mentions optional scheduling. This distinguishes it from siblings like list_workouts and delete_workout, making the purpose unambiguous.

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

Usage Guidelines4/5

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

It provides usage context with the experimental warning and advises verifying in the app. It explicitly references delete_workout as an undo alternative, but does not fully contrast with schedule_workout or list_workouts. Still, the context is clear enough for an agent to decide when to use it.

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

delete_workoutA

Delete a saved Garmin workout (undo a created workout).

Args: workout_id: The workout's ID from list_workouts / create_strength_workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
workout_idYes

TDQS

A3.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention permanence, irreversibility, or potential impact on scheduled workouts, which are critical safety traits for a deletion 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?

The description is concise: two sentences and a single argument definition. Every word adds value, and no filler or redundancy exists.

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?

The tool is simple with one parameter and no output schema, so the core purpose and argument source are covered. However, the lack of any destructive-effect warning (e.g., permanence, effect on schedules) leaves an important gap for a deletion action.

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?

workout_id has 0% schema description coverage, and the description compensates by explaining where to get the ID ('from list_workouts / create_strength_workout'). It does not elaborate on format beyond the schema's string type, but for a single parameter this is sufficient.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Delete a saved Garmin workout', with a clarifying parenthetical 'undo a created workout'. It clearly distinguishes itself from sibling tools like create_strength_workout and list_workouts.

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 explains that workout_id comes from list_workouts or create_strength_workout, which instructs the agent on how to obtain the correct argument value. It does not explicitly discuss when not to use the tool or compare to alternatives, but no alternative delete tool exists among siblings.

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

garmin_statusA

Check that the Garmin connection works and show whose account is connected.

Use this first to confirm authentication before other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description bears full responsibility for behavioral disclosure. It states that the tool checks connection status and identifies the connected account, which are the key behaviors. It also implies authentication verification. Though it doesn't discuss error scenarios or side effects, the tool is simple and non-mutating, so the disclosure is adequate.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose, followed by usage guidance. Every word earns its place. No fluff or repetition.

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

Completeness5/5

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

The tool is extremely simple: zero parameters, no annotations, and an output schema exists (so return values don't need to be explained). The description covers both what it does and when to use it, making it complete for this complexity level.

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

Parameters4/5

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

The tool has zero parameters, and the schema correctly reflects that. The description adds no parameter information, but none is needed. Baseline for zero parameters is 4, and the description is in line with that.

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

Purpose5/5

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

The description clearly states the tool's function with specific verbs ('check', 'show') and resources ('Garmin connection', 'account'). It is distinct from sibling tools, which focus on data retrieval and workout management, making it obvious this is a connection/authentication status tool.

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

Usage Guidelines4/5

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

The description explicitly instructs to use this tool first before other tools to confirm authentication. While it doesn't name sibling alternatives, the 'use this first' directive provides clear contextual guidance, differentiating it from the rest of the suite.

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

get_activityA

Get detailed metrics for a single activity by its ID.

Args: activity_id: The activityId from list_activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

TDQS

A3.7/5.0
Behavior2/5

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

With no annotations, the description carries the full burden but only says 'Get detailed metrics', not disclosing what metrics are included, error behavior, or that it is a read-only 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 very short and front-loaded, with one sentence for purpose and one for argument, no waste.

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

Completeness3/5

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

Given the tool's simplicity, the description is adequate for a get-by-ID but lacks information about the output format and error cases, and no output schema exists to compensate.

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

Parameters4/5

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

The description adds crucial context by stating that activity_id is 'The activityId from list_activities', which is not in the schema, helping the agent understand how to obtain the ID.

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

Purpose5/5

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

The description states a specific verb 'Get' and resource 'detailed metrics for a single activity by its ID', clearly distinguishing from sibling tools like list_activities which lists multiple activities.

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 mentions that activity_id comes from list_activities, implying a prerequisite workflow, but does not explicitly state when to use this tool versus alternatives like get_exercise_sets or when not to use it.

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

get_exercise_setsA

Get the per-set strength breakdown (exercise, reps, weight, est. 1RM) for one activity.

Only meaningful for strength_training activities logged with sets on the watch.

Args: activity_id: The activityId of a strength workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It highlights a key constraint (activity must be strength_training with sets), which is a notable behavioral trait. However, it does not disclose potential error behavior, what happens if the activity lacks sets, or explicitly confirm the operation is read-only beyond the verb 'Get'. This leaves some transparency gaps.

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

Conciseness5/5

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

The description is efficiently structured: a one-sentence summary of the tool's purpose, a usage note about applicable activities, and a single parameter description. It is front-loaded and contains no unnecessary filler or repetition.

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

Completeness4/5

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

For a tool with one required parameter, no output schema, and no annotations, the description covers the essential aspects: what data is returned (per-set breakdown with fields) and when it is applicable (strength_training with sets). It does not explain edge-case behavior or error conditions, but for this level of complexity, the description is substantially complete.

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

Parameters4/5

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

The schema offers zero description coverage for the activity_id parameter, so the description's Args section is the primary source of meaning. It clarifies that the ID must correspond to a strength workout, adding context beyond the schema's mere 'Activity Id' title. This adequately compensates for the schema gap, though it could have included format or example guidance.

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

Purpose5/5

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

The description clearly states it retrieves per-set strength data (exercise, reps, weight, est. 1RM) for a single activity, using the specific verb 'Get'. It distinguishes itself from sibling tools like get_activity (which likely returns a summary) and get_strength_history (which likely returns history) by focusing on the per-set breakdown.

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

Usage Guidelines4/5

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

The description provides a clear usage condition: 'Only meaningful for strength_training activities logged with sets on the watch.' This tells the agent when to use it (for strength workouts with sets) and implicitly excludes other activity types. However, it does not explicitly name alternative tools or provide a 'use this instead of X' statement, so it stops short of a 5.

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

get_recoveryA

Get sleep, daily stats, and training readiness for one day (default today).

Args: date: YYYY-MM-DD. Defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden. It states what data is returned but does not disclose read-only behavior, timezone handling, authentication requirements, rate limits, or error behavior. The default-date behavior is mentioned, but other behavioral context is lacking.

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 extremely concise, front-loaded with the core purpose, and the args section is clean and readable. Every sentence earns its place with no repetition or filler.

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

Completeness3/5

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

The tool is simple with one optional parameter, and the description covers the essential input, but with no output schema the return structure of sleep, stats, and readiness is left undefined. Some caveats like timezone or data availability are missing, making this minimally adequate.

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

Parameters5/5

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

Schema coverage is 0% and the only parameter, date, is fully explained in the description with format (YYYY-MM-DD) and default semantics ('Defaults to today'). This adds significant meaning beyond the schema's bare default null.

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

Purpose5/5

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

The description clearly identifies the tool as retrieving sleep, daily stats, and training readiness for a specific day, with a default of today. This is a specific verb+resource+scope combination that distinguishes it from siblings like get_trends or get_activity.

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 gives parameter usage (date format and default) but provides no guidance on when to use this tool versus alternatives such as get_trends or garmin_status. No when-not-to-use or alternative recommendations are offered.

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

get_strength_historyA

Progressive-overload view: strength sets grouped by session over recent weeks.

Walks your recent strength_training activities, pulls their sets, and returns per-session weight x reps so you can see whether a lift is going up.

Args: exercise_name: Optional case-insensitive substring to filter to one lift (e.g. "bench", "squat"). Omit to include all exercises. weeks: How many weeks back to look (default 8). max_sessions: Cap on how many strength sessions to fetch (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
weeksNo
max_sessionsNo
exercise_nameNo

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 full burden. It states it 'walks' activities and 'returns' data, clearly indicating a read-only operation. However, it does not explicitly say it makes no modifications, though the nature of a history query makes that nearly implicit.

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 well-structured with a lead sentence followed by an Args block. It is slightly verbose but every sentence adds useful information. The front-loaded summary provides immediate clarity.

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

Completeness4/5

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

All parameters are optional and fully explained. The return value is summarized as 'per-session weight x reps', which is adequate for a no-output-schema tool. It could specify the exact structure (e.g., array of sessions) but the description is sufficiently complete for an agent to understand the tool's behavior.

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

Parameters5/5

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

The schema provides only default values and types with no descriptions. The description fully compensates by explaining every parameter: exercise_name as a case-insensitive substring filter, weeks as lookback window, and max_sessions as a cap. This adds clear semantic value beyond the schema.

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

Purpose5/5

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

The opening phrase 'Progressive-overload view: strength sets grouped by session over recent weeks' clearly states the tool's function and resource. It distinguishes itself from siblings like get_trends, get_exercise_sets, and list_activities by focusing on strength sessions and per-session aggregation.

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

Usage Guidelines4/5

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

The description clearly implies when to use it ('so you can see whether a lift is going up') and provides context, but it does not explicitly mention when not to use it or name alternatives. It gives a strong intended use case without exclusions or sibling comparisons.

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

list_activitiesA

List your most recent Garmin activities.

Args: limit: How many recent activities to return (default 10). activity_type: Optional Garmin type key filter, e.g. "running", "strength_training", "cycling". Omit for all types.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
activity_typeNo

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It implies a read-only operation but does not explicitly say so, nor does it disclose pagination, ordering details, or what fields are returned. The lack of behavioral detail beyond 'most recent' leaves important information undocumented.

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 extremely concise: a single-line summary followed by clear parameter explanations with examples. Every sentence earns its place, and the structure front-loads the core purpose.

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

Completeness3/5

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

This is a simple list tool with only two optional parameters, and the description covers the main purpose and parameter semantics. However, without an output schema or annotations, it does not describe the shape of the returned list (e.g., timestamps, distances), which could be useful for the agent to know. Overall it is adequate but slightly sparse.

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 input schema provides only type and defaults with 0% description coverage in the schema itself. The description compensates well by explaining 'limit' as 'How many recent activities to return' and providing concrete examples for activity_type (running, strength_training, cycling), which adds practical meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states 'List your most recent Garmin activities' with a specific verb and resource, and distinguishes from sibling tools like get_activity by focusing on listing multiple activities rather than retrieving a single one. The mention of 'most recent' also clarifies scope.

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

Usage Guidelines3/5

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

The description implies usage for browsing recent activities with optional filters, but does not explicitly state when to use this instead of alternatives like get_activity or list_workouts. The context is clear enough for a simple tool, but no exclusions or alternative references are provided.

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

list_workoutsA

List saved Garmin workouts (name + id), newest first.

Args: limit: How many workouts to return (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

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 transparency burden. It notably discloses that results are sorted newest first and contain only name and id, which gives the agent a clear expectation of the return format. While it doesn't explicitly state the operation is read-only, the verb 'List' conveys this, and the described behavior is consistent with that.

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

Conciseness5/5

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

The description is two concise sentences: the first states the core purpose and behavior, the second explains the only argument. Every word is functional, and it is front-loaded with the main intent. No unnecessary repetition or fluff.

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 list tool with one optional parameter and no output schema, the description covers the essential aspects: what is listed, the format, ordering, and parameter semantics. It could mention edge cases like an empty result set, but that is not critical for correct invocation. Overall, it is complete enough for the tool's simplicity.

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

Parameters4/5

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

The schema only provides the 'limit' parameter with a default of 20 and no textual description, so the description's explanation ('How many workouts to return') directly compensates for this. It adds meaning to the parameter beyond its name and default, which is sufficient for the single parameter.

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

Purpose5/5

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

The description clearly states the tool lists saved Garmin workouts, specifies the returned fields (name + id), and the ordering (newest first). This distinguishes it from sibling tools like list_activities, which would target a different resource. The verb 'List' and resource are specific, making the purpose unmistakable.

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

Usage Guidelines3/5

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

The description implies usage when a user needs to see saved workouts, but it does not explicitly mention alternatives or conditions when not to use it. Sibling tools exist, but no direct comparison or exclusion is provided beyond the inherent clarity of the resource name.

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

schedule_workoutA

Schedule an existing Garmin workout onto your calendar.

Args: workout_id: The workout's ID (from create_strength_workout or list_workouts). date: Target date, YYYY-MM-DD.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes
workout_idYes

TDQS

A3.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden. It states the action but does not disclose side effects, required permissions, return behavior, or failure modes. It also doesn't specify whether this modifies the calendar only or the workout itself.

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

Conciseness5/5

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

The description is concise, with one main sentence and a parameter list. No unnecessary words.

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 2-parameter tool, the description covers the core functionality and parameters. However, it lacks information about return values, error handling, or prerequisites beyond an existing workout ID, which a fully specified tool would include.

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 Args section explains both parameters beyond the schema: workout_id references how to obtain it, and date specifies the exact format (YYYY-MM-DD). This compensates for the 0% schema description coverage.

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

Purpose5/5

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

The description states a specific action: 'Schedule an existing Garmin workout onto your calendar.' This clearly distinguishes it from sibling tools that create, list, or delete workouts.

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

Usage Guidelines4/5

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

The description indicates this tool is for existing workouts, with workout_id sourced from create_strength_workout or list_workouts, providing a direct workflow. It does not explicitly list exclusions or alternative schedule tools, but the context is clear.

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

suggest_next_weightA

Recommend the next weight & reps for a lift using progressive overload.

Reads your recent strength history for the exercise and applies a double-progression rule. This is read-only (it does not change anything on Garmin).

Args: exercise_name: Case-insensitive substring of the lift, e.g. "bench", "squat". reps_low: Bottom of your target rep range (default 8). reps_high: Top of your target rep range (default 12). increment_kg: Weight jump when you graduate the range (default 2.5). weeks: How many weeks of history to consider (default 8).

ParametersJSON Schema
NameRequiredDescriptionDefault
weeksNo
reps_lowNo
reps_highNo
increment_kgNo
exercise_nameYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It explicitly states 'This is read-only (it does not change anything on Garmin)' and explains the double-progression rule, which adds valuable context. However, it does not disclose the output format, error behavior (e.g., missing history), or any other side effects, leaving notable gaps.

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

Conciseness5/5

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

The description is efficient: three introductory sentences covering purpose, method, and read-only nature, followed by a clean list of parameters. No filler or redundancy.

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?

The tool has 5 parameters, no annotations, and no output schema. The description explains the methodology and parameters well, but fails to describe what the output looks like (just 'recommend' with no structure) or edge cases (e.g., no history found). This makes it incomplete for an AI agent needing to handle responses robustly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. It explains each of the 5 parameters with meaningful context: exercise_name is a 'case-insensitive substring' with examples, reps_low/high define the 'target rep range', increment_kg is a 'weight jump', and weeks is 'how many weeks of history'. This goes far beyond the schema's types and defaults.

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

Purpose5/5

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

The description states a clear verb+resource: 'Recommend the next weight & reps for a lift using progressive overload.' It distinguishes itself from siblings like get_strength_history (reads history) and create_strength_workout (creates workouts) by focusing on recommendation logic.

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

Usage Guidelines4/5

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

The description clearly implies when to use the tool: when you need a weight/reps suggestion based on progressive overload and recent history. It notes it reads history, making the context clear. However, it does not explicitly name alternatives or state when not to use it, so it falls short of a 5.

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. 12 tool updatesv0.2.0
    • First observedcreate_strength_workout
    • First observeddelete_workout
    • First observedgarmin_status
    • First observedget_activity
    • First observedget_exercise_sets
    • First observedget_recovery
    • First observedget_strength_history
    • First observedget_trends
    • First observedlist_activities
    • First observedlist_workouts
    • First observedschedule_workout
    • First observedsuggest_next_weight

TDQS

A4.1/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct concern: status, activity retrieval, strength analysis, recovery trends, and workout management. Even the strength-related tools are clearly separated by scope (single activity vs. history vs. recommendation), so an agent can reliably select the right one.

Naming Consistency4/5

Most tools follow a verb_noun pattern (list_activities, get_activity, create_strength_workout, schedule_workout, delete_workout, suggest_next_weight), but garmin_status deviates from this pattern, making the naming slightly inconsistent overall.

Tool Count5/5

With 12 tools, the server is well-scoped for its purpose: it covers activity data, health metrics, strength analysis, and workout management without unnecessary redundancy or bloat.

Completeness4/5

The server covers the main coach workflows: reading activities, analyzing strength progression, suggesting next weights, and managing workouts. Minor gaps such as listing scheduled workouts or updating an existing workout are easy to work around and do not cripple the overall tool surface.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Personal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server that exposes Garmin Connect health and activity data (steps, sleep, stress, activities, etc.) via tools for querying, analysis, and visualization.
    17
    Apache 2.0