Skip to main content
Glama
danielmcewan

garmin-athletics-mcp

by danielmcewan

Garmin Athletics MCP

A private, read-only Model Context Protocol server that gives local Codex and Claude Desktop sessions access to athletics and wellness data from a Garmin Forerunner 55.

Security model

  • Runs locally over MCP stdio; it does not open a network port.

  • Uses the unofficial garminconnect package and can require maintenance if Garmin changes its private endpoints.

  • Accepts Garmin credentials only through the interactive admin login command.

  • Stores Garmin session tokens under the current Windows user profile, never in MCP configuration.

  • Exposes read-only MCP tools. Login, deletion, workout upload, scheduling, and account changes are not tools.

  • Stores normalized records in SQLite and does not archive raw Garmin API responses.

  • GPS routes are intentionally not fetched, stored, or exposed.

This project provides training context, not medical advice or diagnosis.

Related MCP server: DkwtMCP

What is implemented

The server exposes these read-only tools:

  • get_daily_health

  • get_recovery_snapshot

  • get_performance_metrics

  • list_workouts

  • get_workout_details (splits and metrics only; no GPS)

  • compare_latest_workout

  • get_athletics_trends

  • get_recent_athletics_trends

Every information request attempts a fresh Garmin fetch. Calls for the same data within 60 seconds are coalesced so a single agent response cannot hammer Garmin. If Garmin is unavailable, the response may use the timestamped local cache and includes a warning.

The Forerunner 55 provides running VO2 max, recovery time, race predictions, sleep, Body Battery, stress, heart rate, steps, calories, intensity minutes and workout data. Newer features such as HRV Status and Training Readiness are returned as unavailable when the account does not contain them; the server never fabricates substitutes.

Installation

Python 3.12 or newer is required.

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"
.\.venv\Scripts\python.exe -m pytest

This workspace already has Python 3.12, .venv, and the development dependencies installed.

First local login

Close screen-sharing or recording software before entering credentials. From PowerShell in this directory, run:

.\.venv\Scripts\garmin-athletics-admin.exe login

Enter the Garmin email, password and MFA code only in that local terminal. The command saves session tokens under:

C:\Users\dan\AppData\Local\GarminAthleticsMCP\tokens

The password and MFA code are not saved. Do not paste either into Codex, Claude, source files, MCP configuration, or chat.

Check the connection:

.\.venv\Scripts\garmin-athletics-admin.exe doctor

Import all eight months of history

After login, run:

.\.venv\Scripts\garmin-athletics-admin.exe backfill --days 245 --delay 2

The importer is conservative and resumable. Existing complete days are preserved, failures are reported, and rerunning the same command retries gaps. Use --force only when you intentionally want to re-fetch completed days.

Codex configuration

The repository includes .codex/config.toml. It launches this server through the project virtual environment and points it at the shared Windows-local data directory.

After login:

  1. Restart Codex or start a new task for this trusted workspace.

  2. Confirm the garmin_athletics MCP server appears.

  3. Ask: Use Garmin Athletics to show today's health data.

The OpenAI documentation MCP installer was blocked by Windows while this project was built, so the project configuration should be verified in the live Codex UI after restart.

Claude Desktop configuration

An example entry is available at config/claude_desktop_config.example.json.

Your existing Claude configuration is:

C:\Users\dan\AppData\Roaming\Claude\claude_desktop_config.json

Preserve its existing keys. Add the example's mcpServers object at the top level, then fully restart Claude Desktop. Do not replace the entire existing file with the example.

Useful prompts

  • Use Garmin Athletics to assess my recovery context today. Separate observed data from interpretation.

  • Compare my latest run with similar runs from the previous 90 days.

  • Show my running volume, pace and VO2 max trends for the last eight months.

  • Show the splits and heart-rate zones for workout 123456789.

Local administration

Check paths and authentication:

.\.venv\Scripts\garmin-athletics-admin.exe doctor

Delete the local SQLite database and tokens:

.\.venv\Scripts\garmin-athletics-admin.exe erase --yes

Deletion is intentionally unavailable through MCP. After erasing, rerun login to reconnect.

Development verification

.\.venv\Scripts\python.exe -m ruff check .
.\.venv\Scripts\python.exe -m pytest -vv

The tests use mocked Garmin responses. They do not require credentials or contact Garmin.

Troubleshooting

  • Authentication required: rerun the local login command.

  • 429 or throttling: stop retrying and wait before using doctor again.

  • Unsupported metric: confirm the Forerunner 55 actually records it; the server returns an availability marker.

  • Cached response: inspect source, served_at, fetched_at, and warning in the tool result.

  • Client cannot start server: verify the absolute Python path in the client configuration and restart the client.

See SECURITY.md and docs/ARCHITECTURE.md for the data boundary and implementation layout.

Available Tools

8 tools
compare_latest_workoutC

Compare the latest workout with median values from similar workouts.

ParametersJSON Schema
NameRequiredDescriptionDefault
lookback_daysNo

TDQS

C2.8/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 of disclosure. It implies a read-only comparison but does not explain what happens with insufficient data, how 'similar' is determined, or any side effects or limitations. The description adds no behavioral context beyond the plain operation.

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

Conciseness4/5

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

The description is a single, efficient sentence that front-loads the primary action ('Compare'). It is appropriately concise for a simple read operation, though it omits detail that would make it more complete.

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

Completeness2/5

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

The tool has no annotations, no output schema, and one poorly documented parameter. The description only states the core purpose, leaving ambiguity around the meaning of 'similar workouts' and the effect of lookback_days. It does not explain expected output or prerequisites, making it incomplete for an agent to decide if this tool fits the user's request.

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

Parameters1/5

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

The input schema has one parameter (lookback_days) with 0% schema description coverage, and the description does not mention this parameter at all. The agent cannot infer what 'lookback_days' controls or how it relates to 'similar workouts', so the description fails to compensate for the lack of schema documentation.

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 the specific verb 'Compare' and identifies the resource as 'the latest workout' against 'median values from similar workouts'. This clearly distinguishes it from sibling tools like list_workouts or get_workout_details, which are about retrieving data, not comparing.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus alternatives. It does not mention exclusions, alternatives, or the context in which a comparison is preferred. The agent is left to infer usage solely from the tool name and sibling list.

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

get_daily_healthA

Fetch sleep, heart rate, Body Battery, stress, steps, calories and related data for a day.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNotoday

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are present, so the description carries full responsibility. 'Fetch' indicates a read operation, but no other behavioral traits are disclosed—such as how daily data is aggregated, default timezone, or response shape. The phrase 'related data' is vague.

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 one sentence, front-loaded with the action, and lists all relevant metrics without filler. Every word earns its place.

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

Completeness4/5

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

For a simple one-parameter read tool with no output schema, the description sufficiently enumerates the returned data categories. It doesn't describe response format, but that is less critical given the tool's simplicity.

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

Parameters2/5

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

Schema coverage is 0% and the only parameter 'day' has no description. The text 'for a day' references the parameter but does not explain accepted date formats or the meaning of the default 'today'. This minimal addition does not fully compensate for the missing schema info.

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 ('Fetch') and names the exact data categories (sleep, heart rate, Body Battery, stress, steps, calories), clearly distinguishing it from sibling tools focused on recovery, performance, or 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 clearly conveys the scope: a broad daily health summary. This implies when to use it, but it does not explicitly rule out alternatives or name corner cases, 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_performance_metricsC

Fetch available VO2 max, recovery, race-prediction and training-status metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNotoday

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations, the description carries full responsibility for disclosing behavior. It only says 'available' metrics, which is vague, and does not state whether this is read-only, how the 'day' parameter affects results, or what happens if no data exists. No side effects or limitations are mentioned.

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

Conciseness5/5

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

The description is a single concise sentence that is front-loaded with the action and key metric types. It contains no filler words or redundant information, so every word earns its place.

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

Completeness2/5

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

The tool has a simple schema and no output schema, but the description still leaves gaps. It lists what metrics are fetched but not how the optional 'day' parameter modifies results, what 'available' means, or the response structure. Given the sibling tools, a sentence clarifying scope would improve completeness.

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

Parameters1/5

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

The schema has one parameter 'day' with no description (coverage 0%), and the tool description does not mention it at all. The name 'day' provides minimal meaning, but its format, allowed values, and effect on the fetched metrics are unexplained.

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

Purpose4/5

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

The description uses a specific verb 'Fetch' and lists concrete metric categories (VO2 max, recovery, race-prediction, training-status), clearly stating what the tool provides. It does not explicitly distinguish from siblings like get_recovery_snapshot, but the scope is well-defined.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description does not mention any context, prerequisites, or exclusions, leaving the agent to infer usage purely from the tool name and sibling list.

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

get_recovery_snapshotC

Fetch daily recovery and available performance context. Not medical advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNotoday

TDQS

C2.4/5.0
Behavior1/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It does not state that the operation is read-only, describe the return format, mention permissions, rate limits, or any side effects. 'Fetch' implies reading but conveys no explicit behavioral traits, and the disclaimer is not behavioral.

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 short and front-loaded with purpose, using only two sentences. The 'Not medical advice' disclaimer is somewhat tangential but adds important context for health-related data, so it earns its place without being wordy.

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

Completeness2/5

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

Given the tool's simplicity (one parameter, no output schema), the description covers the basic purpose but is incomplete for safe autonomous invocation. It lacks usage guidance, parameter explanation, and any behavioral context, making it minimally viable at best.

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

Parameters1/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 by explaining the 'day' parameter. The description does not mention the parameter at all, leaving the agent without information about how to specify day, format, or acceptable values beyond the schema's default.

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

Purpose4/5

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

The description clearly states the action ('Fetch') and the resource ('daily recovery and available performance context'), which conveys a specific purpose. However, it does not explicitly distinguish itself from sibling tools like get_daily_health or get_performance_metrics, so it falls short of a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus the sibling tools, and there are no alternatives or exclusions mentioned. The only additional line is a disclaimer ('Not medical advice'), which does not help with usage decisions.

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

get_workout_detailsA

Fetch workout splits and details without downloading GPS route data.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral transparency. It does reveal an important behavior: it excludes GPS route data, making clear what the tool does not return. However, it does not mention response format, pagination, or required permissions, but for a simple read operation this is arguably sufficient.

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

Conciseness5/5

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

A single concise sentence that states exactly what the tool does and what it intentionally omits. No filler or redundant information.

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

Completeness4/5

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

For a simple one-parameter tool with no output schema, the description adequately explains the tool's purpose and its scope. It tells the user what to expect (splits and details) and what not to expect (GPS route data). It could be more explicit about what 'details' include, but it is complete enough for basic usage.

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

Parameters2/5

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

Schema has only one parameter (activity_id) with zero description coverage. The description does not mention the parameter at all, relying entirely on the parameter name. Since schema coverage is 0%, the description should compensate but fails to explain the format, source, or how to obtain a valid activity_id (e.g., from list_workouts).

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 ('Fetch') and identifies the resource ('workout splits and details'). It also distinguishes the tool from siblings by explicitly stating 'without downloading GPS route data', making it clear this is for lightweight detail retrieval, not full route data.

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

Usage Guidelines4/5

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

The description provides clear usage context: use this tool when you need workout splits and details but do not need GPS route data. It implies a lightweight alternative to route-downloading tools, though it does not explicitly name alternatives or state when not to use it.

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

list_workoutsA

List read-only normalized workout summaries in a bounded date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
end_dateYes
start_dateYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses key traits: read-only operation and normalized summaries. However, it does not mention pagination, ordering, date format expectations, or behavior when no workouts exist in the range.

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

Conciseness5/5

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

The description is a single, focused sentence that front-loads the core purpose and key constraints. It contains no fluff or redundant information.

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

Completeness3/5

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

The description is adequate for a basic list tool but lacks details on output format, date formatting, limit semantics, and relationship to sibling tools. Given the absence of an output schema and annotations, more context is needed for full completeness.

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

Parameters3/5

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

The schema has 0% description coverage, so the description must compensate. It adds meaning to start_date and end_date by mentioning a bounded date range, but it does not explain the limit parameter or expected date formats, leaving the compensation incomplete.

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 read-only normalized workout summaries within a bounded date range. The verb 'list' and resource 'workout summaries' are specific, and it distinguishes from sibling tools like get_workout_details by focusing on summaries.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as get_workout_details or get_performance_metrics. The usage context is only implied by the name and description, with no explicit use cases or exclusions.

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. 8 tool updatesv0.1.0
    • First observedcompare_latest_workout
    • First observedget_athletics_trends
    • First observedget_daily_health
    • First observedget_performance_metrics
    • First observedget_recent_athletics_trends
    • First observedget_recovery_snapshot
    • First observedget_workout_details
    • First observedlist_workouts

TDQS

B3.2/5.0

Scored across 8 tools

Disambiguation3/5

Some tools have overlapping focus: get_recovery_snapshot and get_performance_metrics both include recovery data, while get_athletics_trends and get_recent_athletics_trends are similar except for time range. However, most tools have clearly distinct targets (daily health vs workouts vs trends).

Naming Consistency4/5

Most tools follow a consistent 'get_' or 'list_' verb+noun pattern, with 'compare_latest_workout' as a minor deviation. The naming is readable and predictable overall.

Tool Count5/5

Eight tools is well-scoped for an athletics data server, covering health, recovery, performance, workouts, and trends without bloat or sparseness.

Completeness4/5

The toolset covers the core read-only analytics domain well: daily health, recovery, performance metrics, workout listings/details/comparison, and trends. It lacks advanced features like fitness age or training load, but the main workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Local MCP server that connects Claude Desktop with Garmin and Apple Health data to read training and recovery, estimate heart rate and pace zones, analyze performance, and create structured workouts.
    22
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, single-user, read-only MCP server that gives Claude Code access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, read-only MCP server that gives Claude access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    MIT