Skip to main content
Glama
limited

Garmin Open MCP

by limited

Garmin Open MCP

CI

An unofficial, free, self-hosted bridge from Garmin Connect to MCP clients and ChatGPT mobile.

Not affiliated with or endorsed by Garmin. This project uses undocumented Garmin Connect consumer endpoints. They can change or stop working without notice.

Features

  • Interactive Garmin login with MFA through python-garminconnect

  • Garmin credentials are discarded after login; session tokens are stored with private filesystem permissions

  • Local SQLite cache for health summaries and activities

  • 11 focused MCP tools over Streamable HTTP or stdio

  • REST/OpenAPI adapter for ChatGPT GPT Actions on iOS and Android

  • Static single-user API key protecting remote endpoints

  • Docker, systemd, and native Python deployment options

Related MCP server: garth-mcp-server

Quick start

Requires Python 3.12+ and uv.

git clone <repository-url> garmin-open-mcp
cd garmin-open-mcp
uv sync
uv run garmin-open-mcp init
uv run garmin-open-mcp login
uv run garmin-open-mcp sync --days 7
uv run garmin-open-mcp serve

Open http://localhost:8000.

Private data defaults to:

~/.local/share/garmin-open-mcp/
├── api-key
├── garmin.sqlite3
└── tokens/

Override it with GARMIN_MCP_DATA_DIR.

CLI

garmin-open-mcp init
garmin-open-mcp login
garmin-open-mcp logout
garmin-open-mcp status --verify
garmin-open-mcp doctor
garmin-open-mcp sync --days 7
garmin-open-mcp show-api-key
garmin-open-mcp serve
garmin-open-mcp stdio

The login command accepts the Garmin password only in the local terminal. The password is not written to config, logs, or SQLite. Garmin session token files are set to mode 0600 where the platform supports it.

MCP

Local stdio

{
  "mcpServers": {
    "garmin": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/garmin-open-mcp",
        "run",
        "garmin-open-mcp",
        "stdio"
      ]
    }
  }
}

Remote Streamable HTTP

Endpoint:

https://your-server.example/mcp

Send the key printed by garmin-open-mcp show-api-key as either:

Authorization: Bearer YOUR_KEY

or:

X-API-Key: YOUR_KEY

The initial release uses a static single-user bearer key, not a full OAuth authorization server. MCP clients that cannot supply custom authorization headers should use stdio or the REST/GPT Actions adapter.

ChatGPT mobile setup

Custom MCP servers are not currently available directly in the ChatGPT mobile app. The included OpenAPI adapter exposes the same service to a private custom GPT:

  1. Deploy this server at a stable HTTPS URL.

  2. On ChatGPT web, create a GPT.

  3. Add an Action and import https://your-server.example/openapi.json.

  4. Select API key authentication.

  5. Configure a custom header named X-API-Key.

  6. Enter the value from garmin-open-mcp show-api-key.

  7. Use https://your-server.example/privacy as the privacy-policy URL.

  8. Keep the GPT private, save it, then open it from ChatGPT on iOS or Android.

Suggested GPT instructions are in GPT_INSTRUCTIONS.md.

REST API

Interactive docs are at /docs. Useful endpoints include:

GET  /api/v1/status
POST /api/v1/sync
GET  /api/v1/day/{day}
GET  /api/v1/sleep/{day}
GET  /api/v1/activities
GET  /api/v1/activities/{activity_id}
GET  /api/v1/training/{day}
GET  /api/v1/body
GET  /api/v1/trends
GET  /api/v1/compare
GET  /api/v1/recent

All /api/v1 endpoints require X-API-Key.

MCP tools

  • garmin_connection_status

  • garmin_sync

  • garmin_get_day

  • garmin_get_sleep

  • garmin_list_activities

  • garmin_get_activity

  • garmin_get_training_status

  • garmin_get_body_metrics

  • garmin_get_trends

  • garmin_compare_periods

  • garmin_recent_overview

The MVP is read-only with respect to Garmin. garmin_sync writes only to the local cache.

Configuration

Environment variable

Default

Purpose

GARMIN_MCP_DATA_DIR

~/.local/share/garmin-open-mcp

Private data and token directory

GARMIN_MCP_HOST

0.0.0.0

Bind address

GARMIN_MCP_PORT

8000

HTTP port

GARMIN_MCP_PUBLIC_URL

unset

Public HTTPS URL and MCP Host allowlist

GARMIN_MCP_API_KEY

generated file

Override the single-user API key

GARMIN_MCP_MAX_SYNC_DAYS

31

Maximum days per sync

GARMIN_MCP_LOG_LEVEL

INFO

Log level

Set GARMIN_MCP_PUBLIC_URL when deploying remotely. MCP DNS-rebinding protection allows the hostname from this URL plus local development hosts.

Docker

Login once using a mounted data directory, then start the service:

docker compose run --rm garmin-open-mcp login
docker compose run --rm garmin-open-mcp sync --days 7
docker compose up -d

Development

uv sync --dev
uv run ruff check .
uv run ruff format --check .
uv run pytest

Tests use fake Garmin responses and never contact Garmin.

Troubleshooting

Login prints mobile+cffi returned 429

python-garminconnect tries several login strategies. Garmin may rate-limit one or more strategies by IP address while a later widget or portal strategy still succeeds. If the command ends with Connected: and garmin-open-mcp status --verify reports connected: true, the saved session is valid.

Do not repeatedly run login after success. Normal server requests load and refresh the saved token session instead of performing another password login. If every strategy is rate-limited and no token is saved, stop retrying and wait for Garmin's cooldown.

Security model

  • This is designed as a single-user service.

  • Do not publish your API key or commit the data directory.

  • Do not make a GPT containing your API key public.

  • Put the service behind HTTPS.

  • Back up the SQLite database only if you are comfortable storing a copy of health data.

  • Logout deletes Garmin session tokens but leaves cached health data. Delete the data directory to erase everything.

See SECURITY.md for reporting vulnerabilities.

License

MIT. See LICENSE.

Available Tools

11 tools
garmin_compare_periodsA
Read-onlyIdempotent

Compare daily averages for two locally cached date ranges.

ParametersJSON Schema
NameRequiredDescriptionDefault
first_endYes
second_endYes
first_startYes
second_startYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations by specifying that the tool operates on 'locally cached' data (no live fetch) and computes 'daily averages' (aggregation behavior). The annotations already cover read-only, idempotent, and non-destructive traits, so this additional cache/aggregation context earns a 4.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no wasted words. It efficiently communicates the core function and key constraint, earning a perfect score for conciseness.

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?

Considering the moderate complexity (4 params, output schema present, strong annotations), the description is minimally adequate. It covers the purpose and a key behavioral constraint, but lacks usage guidance and parameter detail. The output schema and annotations reduce the burden, so a 3 is appropriate.

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?

With 0% schema description coverage, the description must compensate. It does clarify that there are 'two date ranges', which maps to the four parameters, but it does not explain parameter formats, inclusion/exclusion semantics, or date syntax. Param names are somewhat self-explanatory, but the description adds minimal depth beyond 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 uses a specific verb ('Compare') and a clear resource ('daily averages for two locally cached date ranges'), making the tool's function immediately understandable. It also distinguishes itself from sibling tools like garmin_get_day and garmin_get_trends by focusing on comparison rather than retrieval.

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 explicit guidance is provided on when to use this tool versus alternatives. The phrase 'locally cached' hints at a prerequisite but does not explain when comparison is appropriate or how it relates to other Garmin tools. There are no exclusions or alternative recommendations.

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

garmin_connection_statusA
Read-onlyIdempotent

Check whether a Garmin session exists and when data was last synchronized.

ParametersJSON Schema
NameRequiredDescriptionDefault
verifyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, setting a safety baseline. The description adds behavioral context by specifying what is checked (session existence and last sync time), which is more specific than the annotations alone. No contradiction exists, and the description enriches understanding of the tool's non-mutating behavior.

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

Conciseness5/5

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

The description is a single concise sentence that is front-loaded with the primary action ('Check whether...'), avoiding any wasted words. It directly conveys the tool's purpose without redundancy.

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

Completeness4/5

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

Given the tool's simplicity (one optional param, no required fields, strong annotations, and an output schema), the description covers the core purpose well. However, the unexplained 'verify' parameter and the lack of mention of the return format (though output schema exists) leave a minor completeness gap.

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?

The input schema has one optional boolean parameter 'verify' with default false and 0% schema description coverage. The description does not mention 'verify' at all, failing to explain its purpose or effect, such as whether it forces a live check. This is a significant gap for a 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 checks whether a Garmin session exists and when data was last synchronized, using a specific verb ('Check') and resource ('Garmin session'). This distinguishes it from sibling tools like garmin_sync (which performs synchronization) and garmin_get_day (which retrieves day data), making its 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 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 alternatives, nor does it mention prerequisites or exclusions. The sibling list offers context but the description itself does not direct the agent toward the appropriate use case.

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

garmin_get_activityA
Read-onlyIdempotent

Get one activity. Samples are capped and omitted unless explicitly requested.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo
activity_idYes
include_samplesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which cover safety and idempotency. The description adds specific behavioral nuance about sample capping and the need for explicit request, which is valuable context beyond the annotations.

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 just two sentences, front-loaded with the main purpose and free of any filler. Every word earns its place, achieving high clarity with minimal length.

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?

While an output schema exists, the description leaves gaps: 'capped' is vague without a specific limit, and the refresh parameter is never mentioned. For a simple tool, it is adequate but not fully complete, especially given the 0% schema coverage.

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?

With 0% schema description coverage, the description must compensate. It explains include_samples ('unless explicitly requested') but gives no detail about activity_id or refresh. activity_id is obvious from the name, but refresh remains undocumented, so the description only partially covers parameter semantics.

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 'Get one activity' uses a specific verb and resource, clearly distinguishing it from sibling tools like list_activities or get_day. The phrase 'Samples are capped and omitted unless explicitly requested' further specifies the tool's scope and behavior.

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 makes it clear that this tool retrieves a single activity, which inherently differentiates it from list-focused siblings. It also hints at the need to request samples explicitly, but it does not explicitly state when to avoid using it or name alternative tools.

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

garmin_get_body_metricsB
Read-onlyIdempotent

Get body composition and blood-pressure data for a date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo
end_dateYes
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the tool's safety profile. The description adds the date-range scope and clarifies data type but does not disclose additional behaviors like caching, rate limits, or data freshness. Some context is added, but not substantially beyond annotations.

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 of 11 words, front-loaded with the action and resource type. There is no redundancy or filler, and the structure is optimal for a simple read operation.

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 3 parameters and an output schema, and annotations cover safety. The description is adequate for the core purpose but omits usage guidelines, the refresh parameter's meaning, and any differentiation from sibling tools. These gaps make it minimally complete for effective tool invocation.

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 description coverage is 0%, and the description only implies a date range via 'for a date range'. It does not explain the required start_date and end_date parameters or the optional refresh parameter, which remains ambiguous. The description fails to compensate for the lack of schema descriptions, leaving parameter meaning largely undisclosed.

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

Purpose4/5

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

The description clearly states the verb 'get' and the resource 'body composition and blood-pressure data' with a date-range scope. This distinguishes it from sibling Garmin tools like sleep or activity retrieval, though it does not explicitly name alternatives. Purpose is specific, but sibling differentiation is implicit rather than explicit.

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 alternatives such as garmin_get_day or garmin_get_trends. It only states what the tool does, with no mention of use cases, exclusions, or preferred scenarios. This leaves the agent without clear decision support for tool selection.

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

garmin_get_dayA
Read-onlyIdempotent

Get a consolidated health summary for one YYYY-MM-DD date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYes
refreshNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, and openWorld hints, so the safety profile is covered. The description adds that the summary is 'consolidated' but does not disclose behavior like the refresh parameter effect, caching, or whether it aggregates from multiple Garmin endpoints. It adds some context but not rich detail.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. Every word contributes to conveying the tool's core purpose and date format.

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 and the presence of an output schema (which documents return values), this is borderline adequate. However, the unexplained 'refresh' parameter and lack of guidance on when to use this tool vs. more specific ones leave meaningful gaps. It is minimal but incomplete.

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?

The schema has 0% description coverage, and the description only hints at the 'day' parameter via 'YYYY-MM-DD date'. The 'refresh' boolean parameter is completely undocumented in both schema and description, leaving significant ambiguity. The description does not compensate for the missing parameter semantics.

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 precisely identifies the tool as retrieving a 'consolidated health summary' for a specific single date ('YYYY-MM-DD'). This clearly distinguishes it from sibling tools like garmin_get_sleep or garmin_get_activity, which focus on individual data types.

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 conveys clear usage context: this is for a one-day consolidated overview. It does not explicitly name alternatives or exclusions, but the scope ('one date' + 'consolidated') implies when it's appropriate. This meets the 'clear context, no exclusions' level.

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

garmin_get_sleepA
Read-onlyIdempotent

Get sleep stages and available sleep metrics for one YYYY-MM-DD date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYes
refreshNo
include_rawNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the specific output (sleep stages and metrics) but does not disclose behaviors like refresh semantics or whether include_raw affects the response. With annotations present, the added value is modest, so a 3 is appropriate.

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 sentence that is front-loaded with the action and resource. It is concise and every word contributes meaning, with no redundancy or filler.

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?

While the output schema covers return values, the description fails to explain two of the three parameters, particularly the boolean flags. For a tool with multiple parameters and low schema coverage, this is a significant gap that hinders autonomous selection and invocation. The description is not complete enough for an agent to use it correctly without additional assumptions.

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 description coverage is 0%, so the description must compensate. It explains 'day' as a YYYY-MM-DD date, but 'refresh' and 'include_raw' are completely unexplained. This leaves the agent without critical information on how these boolean flags alter behavior.

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 action (Get), the resource (sleep stages and available sleep metrics), and the scope (one YYYY-MM-DD date). This differentiates it from sibling tools like garmin_get_activity or garmin_get_body_metrics, which focus on other data types.

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 implies usage for retrieving sleep data for a single date, which is clear context. However, it does not explicitly mention alternatives or when not to use this tool. The clarity of the purpose provides sufficient guidance for most cases.

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

garmin_get_training_statusA
Read-onlyIdempotent

Get Garmin training status and readiness for one YYYY-MM-DD date.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYes
refreshNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds modest context about the single-date scope, but does not disclose behaviors like caching, refresh semantics, or data availability expectations.

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 sentence, front-loaded with the action and resource, with no wasted words. Every word adds value and the structure is immediately scannable.

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 (2 params, annotations provide safety, output schema exists), and the description covers the core purpose. However, it leaves gaps around the 'refresh' parameter and what exactly 'training status and readiness' entails, which could matter for an agent selecting this tool.

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

Parameters3/5

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

The description provides the date format 'YYYY-MM-DD' for the required 'day' parameter, adding meaning beyond the bare schema type. However, the optional 'refresh' parameter is not mentioned at all, and schema description coverage is 0%, so the description only partially compensates.

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 'Get' and the specific resource 'Garmin training status and readiness' for a single date. This distinguishes it from sibling tools like garmin_get_day or garmin_get_sleep, making its 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 Guidelines3/5

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

The description implies usage for a specific date ('for one YYYY-MM-DD date'), but does not explicitly state when to choose this tool over alternatives or provide exclusions. Sibling tools exist for other metrics, but no direct comparison is given.

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

garmin_list_activitiesA
Read-onlyIdempotent

List activities in an inclusive date range using YYYY-MM-DD dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
refreshNo
end_dateYes
start_dateYes
activity_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the inclusive date range and YYYY-MM-DD format but does not disclose behaviors like refresh semantics or limit handling. With strong annotations, this is adequate but minimal.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no redundant words. It conveys the essential action and key parameter semantics efficiently.

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 moderate complexity (5 params, 2 required) and the presence of an output schema and strong annotations, the description covers the core usage adequately. However, optional parameters like refresh and activity_type are not described, so it is not fully complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It clarifies start_date and end_date as inclusive and formatted YYYY-MM-DD, which is valuable for the required params. However, limit, refresh, and activity_type remain unexplained, leaving only partial compensation.

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 a specific action (List) and resource (activities) with a defined scope (inclusive date range). This distinguishes it from sibling tools like garmin_get_activity (single activity) and garmin_get_day (daily summary).

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool—listing activities over a specified date range. It does not explicitly mention alternatives or exclusions, but the purpose is evident enough to guide selection among siblings.

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

garmin_recent_overviewB
Read-onlyIdempotent

Return cached trends and activities for the most recent number of days.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds the behavioral trait that data is 'cached', implying it may not be live and could require a sync via garmin_sync, which is valuable context beyond the annotations.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that efficiently conveys the core purpose. No unnecessary words or repetition, and every phrase adds meaning.

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?

While the description is brief, it covers the basic function for a simple read-only tool with rich annotations and an output schema. However, it does not clarify what 'cached' means in practice (e.g., staleness, sync implications) or how the response combines trends and activities, leaving some contextual gaps.

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 description coverage is 0%, and the description only loosely references 'most recent number of days' without explaining that the 'days' parameter controls the window or that it defaults to 7. For a single optional parameter, the description does not sufficiently 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.

Purpose4/5

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

The description clearly states the verb 'Return' and resource 'cached trends and activities' with a time scope of 'most recent number of days'. It distinguishes from siblings like garmin_get_trends and garmin_list_activities by indicating a combined overview of both trends and activities, though it does not explicitly name alternatives.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus siblings. The description only states what it returns, but does not mention when to prefer this over garmin_get_trends or garmin_list_activities, nor any exclusions or prerequisites.

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

garmin_syncA
Read-onlyIdempotent

Synchronize recent Garmin daily summaries and activities into the local cache.

Use sparingly because Garmin's unofficial API can rate-limit frequent requests.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

The description adds a behavioral warning about rate-limiting on Garmin's unofficial API, which is not covered by the annotations. It also specifies the scope of data synchronized. The annotations already indicate the tool is read-only, idempotent, and non-destructive, so the description complements these without contradiction.

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 short sentences with no redundant information. It front-loads the purpose and then adds a necessary caution, making it well-structured and concise.

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 simplicity (one optional parameter), the presence of rich annotations, and an output schema, the description covers the core functionality and a key operational concern. It doesn't explicitly state that this tool should be called before using getter tools, but that is implied by its role among siblings. Overall, it is sufficiently complete.

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?

The description does not mention the 'days' parameter, and the schema has no description for it (0% coverage). The tool's single parameter name is somewhat self-explanatory, but the description fails to explain how it controls the synchronization range (e.g., 'recent' could mean different values). This is a clear gap that the description should have filled.

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 a specific action: synchronize recent Garmin daily summaries and activities into the local cache. It includes a verb, resource, and destination, distinguishing it from sibling tools that focus on reading/querying 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 advises to 'use sparingly' due to potential rate limiting, which is a clear usage instruction. However, it does not explicitly name alternative tools or mention when not to use this tool, though the group of sibling tools suggests it is for populating the cache for later reads.

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. 11 tool updatesv0.1.0
    • First observedgarmin_compare_periods
    • First observedgarmin_connection_status
    • First observedgarmin_get_activity
    • First observedgarmin_get_body_metrics
    • First observedgarmin_get_day
    • First observedgarmin_get_sleep
    • First observedgarmin_get_training_status
    • First observedgarmin_get_trends
    • First observedgarmin_list_activities
    • First observedgarmin_recent_overview
    • First observedgarmin_sync

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct resource or operation: connection status, sync, day summary, sleep, activities list/get, training status, body metrics, trends, period comparison, and recent overview. Even the cached-data tools are clearly separated by their analytical purpose.

Naming Consistency5/5

All tools follow a consistent garmin_ prefix with a verb_noun structure (check, sync, get, list). The naming pattern is uniform and predictable, making it easy to infer what each tool does.

Tool Count5/5

At 11 tools, the server is well-scoped for a health-data integration. It covers core data access, activity management, analytics, and connection handling without unnecessary bloat or gaps.

Completeness4/5

The surface covers major Garmin data domains: daily summary, sleep, activities, body metrics, training status, and cached data analysis. Minor gaps exist (e.g., no explicit hydration or intraday detail endpoints), but the core workflows are complete.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers