garmin-coach-mcp
This server enables Claude to read and analyze your Garmin Connect data, and optionally create or manage workouts.
Read & Analysis
Connection status & account info
List recent activities (filter by type) and retrieve detailed metrics for any activity
Per-set strength data (exercises, reps, weight, estimated 1RM) and strength history trends
Recovery snapshot: sleep, daily stats, training readiness
Health trends: time series for resting HR, steps, stress, body battery, etc.
Progressive overload suggestions based on history
Write Capabilities (disable with GARMIN_COACH_READONLY=1)
List, create, schedule, and delete workouts (strength)
Schedule existing workouts onto your calendar
Delete workouts (e.g., to undo experimental creations)
Integrates with Garmin Connect to read activity data (recent activities, per-set strength history, sleep, recovery, trends) and optionally create, schedule, and delete strength workouts on the user's Garmin watch.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@garmin-coach-mcphow was my sleep and recovery today?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 WindowsCreates 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.pyProvisions 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 |
| Is the connection working? Whose account? |
| "Show my last N workouts" |
| Detailed metrics for one activity |
| Per-set exercise / reps / weight / est. 1RM |
| "Is my squat going up?" |
| Sleep + daily stats + training readiness |
| Resting HR, steps, stress over time |
| Progressive-overload recommendation |
| Saved workouts (name + id) |
Write (3) — set GARMIN_COACH_READONLY=1 to drop these from the manifest entirely.
Tool | What it does |
| Build a strength workout on Garmin (experimental) |
| Put an existing workout on your calendar |
| Undo / remove a workout |
Strength answers only have data if you log Strength activities with weights on your watch.
create_strength_workoutuses Garmin's unofficial workout schema — check the result in the Garmin Connect app anddelete_workoutif 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, troubleshootingDocumentation
Run it on your PC | |
Deploy to Azure with Microsoft sign-in | |
How it's built and why | |
Threat model, what protects what, rotating secrets | |
Organised by what you actually see | |
Context for AI agents working on this repo |
Scripts
Task | Command |
Set up locally |
|
Diagnose anything |
|
Deploy to Azure |
|
Register the Entra app |
|
Upload the Garmin token |
|
Rotate secrets |
|
Get the connector URL |
|
Scan for secrets |
|
Configuration
.env.example documents every setting. The ones you are most likely to touch:
Variable | Default | Meaning |
|
|
|
| off | Hide the three write tools entirely |
|
| Where the Garmin OAuth token lives |
| your machine's | Container |
|
| 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 pytest109 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 toolscreate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| exercises | Yes | ||
| schedule_date | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workout_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | ||
| max_sessions | No | ||
| exercise_name | No |
TDQS
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.
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.
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.
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.
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.
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.
get_trendsA
Time series of a daily health metric to answer 'how am I trending?'.
Args: metric: One of resting_hr, steps, calories, stress, body_battery_high, body_battery_low, floors_climbed. weeks: How many weeks back to sample (default 8, max 26). sample_days: Sampling interval in days (default 7 = weekly). The series is capped at 60 points; a finer interval over a long window is widened automatically rather than making hundreds of requests.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | ||
| metric | Yes | ||
| sample_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses important behavior: the series is 'capped at 60 points' and a finer interval over a long window is 'widened automatically rather than making hundreds of requests.' This goes beyond basic functionality and helps the agent understand rate-limit avoidance and auto-adjustment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and every sentence adds value. It starts with a clear one-sentence summary, then lists each parameter in a readable format with defaults and constraints. No wasteful phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, parameters, and key behavioral caveats. However, it does not describe the output shape of the time series, which would be helpful given there is no output schema. Still, it is reasonably complete for a simple read tool with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It lists allowed values for 'metric', explains 'weeks' with default and max, and explains 'sample_days' with default and the 60-point cap rationale. This adds significant meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Time series of a daily health metric to answer how am I trending?' This is a specific verb (return time series) and resource (daily health metric trends). It lists the exact allowed metrics, distinguishing it from sibling tools that focus on individual activities or recovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool by framing it around answering 'how am I trending?' and is distinct from siblings like get_activity or get_recovery. It does not explicitly mention alternatives or exclusions, but the context is clear enough for an agent to know 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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| activity_type | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| workout_id | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No | ||
| reps_low | No | ||
| reps_high | No | ||
| increment_kg | No | ||
| exercise_name | Yes |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.2.0- First observed
create_strength_workout - First observed
delete_workout - First observed
garmin_status - First observed
get_activity - First observed
get_exercise_sets - First observed
get_recovery - First observed
get_strength_history - First observed
get_trends - First observed
list_activities - First observed
list_workouts - First observed
schedule_workout - First observed
suggest_next_weight
TDQS
Scored across 12 tools
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.
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.
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.
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
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
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
MCP server wrapping the Tesla Fleet API and TeslaMate API
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for Garmin Connect that provides read-only access to daily health metrics, activities, workouts, and body composition data.32MIT
- AlicenseNot gradedqualityCmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.63MIT
- AlicenseNot gradedqualityCmaintenancePersonal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.1MIT
- AlicenseAqualityDmaintenanceMCP server that exposes Garmin Connect health and activity data (steps, sleep, stress, activities, etc.) via tools for querying, analysis, and visualization.17Apache 2.0