Skip to main content
Glama

Personal Garmin MCP

Un servidor MCP local para crear y programar entrenamientos estructurados en Garmin Connect mediante endpoints no oficiales de Garmin.

Este es un proyecto personal experimental. Garmin puede cambiar los endpoints, limitar la frecuencia de las solicitudes o revocar una sesión sin previo aviso. No expongas el servidor a Internet sin añadir una autenticación adicional.

Features

  • verifica una sesión guardada de Garmin;

  • previsualiza el JSON de Garmin sin realizar cambios;

  • crea entrenamientos y opcionalmente los añade al calendario;

  • lista la biblioteca de entrenamientos y el calendario;

  • lee actividades completadas, resúmenes compactos y métricas de vueltas/segmentos;

  • lee los datos disponibles de sueño, HRV, Body Battery, Training Readiness y Training Status;

  • elimina entrenamientos y quita entrenamientos del calendario;

  • admite correr, ciclismo, caminar y senderismo;

  • admite pasos por tiempo, distancia y lap button;

  • admite repeticiones de intervalos;

  • admite objetivos de ritmo, frecuencia cardíaca, potencia y cadencia;

  • requiere confirm=true para cada cambio.

Related MCP server: Garmin Connect MCP

Installation

Docker Compose — recomendado

El uso local requiere Docker con soporte de Compose. Construye la imagen desde la raíz del repositorio:

docker compose build

La compilación instala las dependencias de Python con uv estrictamente desde uv.lock.

Ejecuta el inicio de sesión interactivo una vez. La contraseña y el código MFA se introducen directamente en el contenedor y no se almacenan. Los tokens OAuth se guardan en el volumen nombrado privado garmin-mcp_garmin_tokens:

docker compose --profile login run --rm garmin-login

Inicia el servidor MCP:

docker compose up -d garmin-mcp
docker compose ps

El endpoint está disponible en http://127.0.0.1:8000/mcp. Para usar un puerto local diferente:

GARMIN_MCP_PORT=8765 docker compose up -d garmin-mcp

Ver los registros o detener el servidor:

docker compose logs -f garmin-mcp
docker compose down

docker compose down conserva los tokens de Garmin. Ejecutar docker compose down -v elimina el volumen y sus tokens.

Instalación local sin Docker

Se requieren Python 3.12+ y uv.

cd /path/to/garmin-mcp
uv sync --extra dev

Inicio de sesión de una sola vez

uv run garmin-mcp-login

El script solicita interactivamente una dirección de correo electrónico, una contraseña y un código MFA cuando es necesario. La contraseña no se almacena. Los tokens OAuth se guardan en .garmin-tokens/garmin_tokens.json con permisos restringidos. El directorio ya está incluido en .gitignore.

Para almacenar los tokens en otro lugar:

export GARMIN_TOKEN_DIR=/safe/private/path/garmin-tokens
uv run garmin-mcp-login

MCP local sobre stdio

export GARMIN_TOKEN_DIR=/safe/private/path/garmin-tokens
uv run garmin-mcp

Ejemplo de configuración de cliente MCP:

{
  "mcpServers": {
    "garmin": {
      "command": "/absolute/path/to/garmin-mcp/.venv/bin/garmin-mcp",
      "env": {
        "GARMIN_TOKEN_DIR": "/safe/private/path/garmin-tokens"
      }
    }
  }
}

HTTP transmisible para ChatGPT

export GARMIN_MCP_TRANSPORT=streamable-http
export GARMIN_MCP_HOST=127.0.0.1
export GARMIN_MCP_PORT=8000
export GARMIN_TOKEN_DIR=/safe/private/path/garmin-tokens
uv run garmin-mcp

Endpoint: http://127.0.0.1:8000/mcp.

ChatGPT debe poder alcanzar el endpoint a través de HTTPS. Se puede usar un túnel protegido para pruebas personales. No expongas este MVP directamente a Internet: intencionalmente no incluye un servidor de recursos OAuth separado para el acceso al propio servidor MCP.

Ejemplo de argumento preview_workout

{
  "workout": {
    "name": "6 x 800",
    "sport": "running",
    "description": "Controlled intervals",
    "blocks": [
      {
        "steps": [
          {
            "step_type": "warmup",
            "duration_type": "time",
            "duration_value": 900
          }
        ]
      },
      {
        "repeat": 6,
        "steps": [
          {
            "step_type": "interval",
            "duration_type": "distance",
            "duration_value": 800,
            "target_type": "pace_seconds_per_km",
            "target_low": 250,
            "target_high": 260
          },
          {
            "step_type": "recovery",
            "duration_type": "time",
            "duration_value": 120
          }
        ]
      },
      {
        "steps": [
          {
            "step_type": "cooldown",
            "duration_type": "time",
            "duration_value": 600
          }
        ]
      }
    ]
  }
}

Los valores de ritmo se especifican en segundos por kilómetro: 250 = 4:10/km y 260 = 4:20/km. El servidor los convierte a los valores de m/s que usa Garmin Connect.

Después de previsualizar, llama a create_workout con el mismo objeto, una fecha en formato YYYY-MM-DD y confirm=true.

Contexto de entrenamiento de solo lectura

El servidor expone herramientas compactas de solo lectura para adaptar planes futuros al trabajo completado:

  • list_activities lista las actividades en un rango de fechas inclusivo, con un filtro opcional de tipo de actividad de Garmin;

  • get_activity_summary devuelve métricas de planificación para una actividad;

  • get_activity_splits devuelve métricas compactas de vueltas e intervalos;

  • get_recovery_status agrega los datos disponibles de sueño, HRV, Body Battery, Training Readiness y Training Status para una fecha.

Las respuestas de actividad omiten intencionalmente las coordenadas GPS y los detalles del propietario. Las métricas de recuperación varían según el dispositivo Garmin, la cuenta y la fecha. Una fuente faltante se devuelve como no disponible y no hace que falle toda la solicitud de recuperación.

Comprobaciones

uv run --extra dev pytest
uv run --extra dev ruff check .

Las pruebas unitarias no contactan con Garmin y no requieren credenciales.

Limitaciones importantes

  • Esto no es una API oficial de Garmin Training.

  • Los inicios de sesión frecuentes pueden recibir respuestas HTTP 429; reutiliza los tokens guardados.

  • Los tokens proporcionan acceso a Garmin Connect y deben protegerse como una contraseña.

  • Si la creación se realiza correctamente pero la programación falla, la herramienta devuelve created_not_scheduled y workout_id; el entrenamiento creado permanece en la biblioteca.

  • Antes del uso regular, prueba un entrenamiento sencillo en Garmin Connect y en el modelo de reloj específico.

Available Tools

11 tools
connection_statusA
Read-onlyIdempotent

Verify that saved Garmin tokens can authenticate.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

The description adds context beyond the annotations by specifying that it verifies saved tokens, implying it reports on token validity. The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to restate safety. It effectively covers the purpose of a non-destructive check but does not detail what happens if tokens are invalid or what the output format is, though output schema exists.

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 gets straight to the point. No unnecessary words or repetition, making it easy to parse.

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?

As a simple status-check tool with no parameters, an output schema, and no complex behavior, the description is sufficient to understand its function. It could potentially clarify what the return value indicates (e.g., boolean or error) but the output schema likely covers that. It's adequately complete for its simplicity.

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

Parameters4/5

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

With zero parameters, the schema provides no semantic information, but the description adds minimal meaning by stating that saved tokens are the subject. Since there are no parameters to describe, a baseline of 4 is appropriate, as the description doesn't need to explain parameters.

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 tool's purpose: verifying that saved Garmin tokens can authenticate. It uses the specific verb 'Verify' and identifies the resource ('saved Garmin tokens'), which distinguishes it from sibling tools that handle workouts and activities. However, it doesn't explicitly differentiate from siblings that may also perform authentication checks.

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 tool is for checking connection status, which is a typical diagnostic step before other operations, but the description does not explicitly state when to use it or when not to use it. The context is implied: checking token validity, but there are no explicit exclusions or guidance on alternatives.

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

create_workoutA

Create a Garmin workout and optionally schedule it on YYYY-MM-DD.

Call with confirm=false for a non-mutating confirmation response. Set confirm=true only after the user explicitly approves the preview and date.

NameRequiredDescriptionDefault
confirmNo
workoutYes
schedule_dateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false (write operation) but the description adds valuable nuances: confirm=false produces a non-mutating response while confirm=true performs the actual creation. The 'only after the user explicitly approves' instruction adds safety-relevant context beyond what structured annotations provide. No contradiction with 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?

Two sentences, front-loaded with the core purpose first, then the confirm flow. Zero filler, every sentence earns its place. The critical safety caveat (only confirm=true after explicit approval) is positioned right after the purpose.

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 output schema exists (so return values needn't be described), this is nearly complete. The confirm flow and date format are covered. The workout structure is handled by the extensively documented nested $defs in the schema itself. Could marginally benefit from an explicit mention of what the confirmation response contains, but the rich nested schema compensates.

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

Parameters4/5

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

Schema description coverage is 0% for top-level params, so the description must compensate. It explains confirm (false=non-mutating preview, true=actual create) and schedule_date format (YYYY-MM-DD). The workout param semantics are left to the rich nested $defs, which carry their own extensive descriptions (target units, duration semantics, zone constraints). Good compensation for the coverage gap.

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?

Clear verb+resource stated upfront: "Create a Garmin workout and optionally schedule it on YYYY-MM-DD." The optional scheduling behavior is immediately clear and distinguishes it from sibling tools like list_workouts, preview_workout, and delete_workout.

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

Usage Guidelines4/5

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

The description explicitly prescribes the two-phase usage flow: call with confirm=false for a non-mutating confirmation, then confirm=true only after explicit user approval. This tells the agent when it's safe to execute. It doesn't explicitly contrast with the sibling preview_workout tool for when to choose one over the other, but the confirm flow itself is usable guidance.

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

delete_workoutA
DestructiveIdempotent

Permanently delete a workout template after explicit confirmation.

NameRequiredDescriptionDefault
confirmNo
workout_idYes

Output 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 destructiveHint and idempotentHint, but the description adds the non-reversible nature ('permanently') and the requirement for 'explicit confirmation', which clarifies that the confirm parameter must be set. This adds valuable context beyond the annotations, though it does not discuss edge cases or side effects.

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, direct sentence with no wasted words. It is front-loaded with the action and outcome, making it easy to scan quickly.

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 simplicity of the tool (2 params) and the presence of an output schema, the description covers the key action and the confirmation gate. Annotations provide safety hints. It does not elaborate on the return value, but that is handled by the output schema. The only gap is explicitly tying the 'confirmation' to the confirm parameter, but overall it is adequate.

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 explain parameters but only mentions 'explicit confirmation' (likely the confirm boolean). It does not describe workout_id at all or the need for it. This is insufficient compensation for the missing 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 a specific verb ('delete') and resource ('workout template'), and adds 'permanently' to clarify scope, distinguishing it from tools like unschedule_workout. It clearly states what the tool does without ambiguity.

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 on when to use this tool vs alternatives. While 'permanently delete' implies it is for removing a template, it does not contrast with siblings like unschedule_workout or mention prerequisites (e.g., confirmation flag must be true). The confirmation requirement is hinted but not explicitly framed as a usage condition.

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

get_activity_splitsA
Read-onlyIdempotent

Get compact lap and interval metrics for one completed Garmin activity.

NameRequiredDescriptionDefault
activity_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate a read-only, idempotent, non-destructive operation. The description adds meaningful context beyond this: the tool returns 'compact' metrics and is intended only for 'completed' activities, which informs expectations about response size and eligibility constraints.

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 with no filler. It front-loads the primary action ('Get') and includes relevant qualifiers ('compact', 'one completed') that matter for tool selection.

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

Completeness5/5

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

With one simple parameter, strong annotations, and an output schema, the description provides enough context for proper tool selection and invocation. It explains the core purpose and key constraint without unnecessary detail.

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%, but the single parameter activity_id is self-explanatory and the description reinforces that it refers to a completed Garmin activity. However, the description does not explain the ID format or source, so it only partially compensates for the lack of parameter 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 a specific verb ('Get') and resource ('compact lap and interval metrics') with a clear scope ('one completed Garmin activity'). It distinguishes itself from sibling tools like get_activity_summary by focusing on laps/splits rather than overall summary 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 phrase 'for one completed Garmin activity' conveys a clear condition for use, implying this tool is appropriate when the activity is finished and the user needs lap/interval-level details. It does not explicitly mention alternatives, but the context is clear enough to avoid obvious misuse compared to siblings.

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

get_activity_summaryA
Read-onlyIdempotent

Get compact summary metrics for one completed Garmin activity.

NameRequiredDescriptionDefault
activity_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description adds the 'completed' and 'compact summary' scoping, but does not disclose behavior for missing IDs, incomplete activities, or response details beyond what the output schema provides.

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?

Single compact sentence, front-loaded with verb and resource, no filler.

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

Completeness4/5

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

With output schema present and a single required integer param, the description is almost sufficient. It could add a pointer to list_activities for obtaining valid IDs, but for a simple read-only summary tool it is complete enough.

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 description should carry the parameter burden. It only implies activity_id refers to a completed Garmin activity; it doesn't explain where the ID comes from (e.g., list_activities) or any constraints.

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?

Description uses a specific verb ('Get') and names the resource ('one completed Garmin activity') with output scope ('compact summary metrics'). This distinguishes it from siblings like list_activities and get_activity_splits, which are list/split-oriented.

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

Usage Guidelines4/5

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

It clearly narrows use to a single completed activity, but it does not explicitly contrast with sibling tools or state when not to use it. That context can be inferred from sibling names but not stated.

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

get_recovery_statusA
Read-onlyIdempotent

Get available sleep, HRV, Body Battery, readiness, and training status for a date.

NameRequiredDescriptionDefault
dateYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description's verb 'Get available' aligns with read-only semantics and adds the sense of availability (i.e., possibly missing data for some metrics on the date). It doesn't contradict annotations, and given the strong annotation coverage, a 4 reflects that the description adds appropriate context about what the response covers (list of metrics).

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 purpose. It avoids redundancy with the title and annotations, contains zero filler, and all words add value.

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 presence of an output schema (which likely specifies the return structure of metrics) and strong annotations (read-only, idempotent, non-destructive), the description is not required to detail return values or side effects. However, it leaves a gap regarding date format expectations, which is especially important given the single parameter. Overall, it's minimally complete for a simple retrieval tool but could be improved.

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 there is only one parameter ('date'). The description does not elaborate on the date format, such as YYYY-MM-DD or whether it refers to a specific day in a local timezone. In the absence of any schema description, the description should compensate by providing parameter details; it fails to do so, leaving the agent to infer the format.

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 tool retrieves recovery-typed metrics ('sleep, HRV, Body Battery, readiness, and training status') for a specified date, using a specific verb ('Get available'). While it lists multiple metric domains, its resource (recovery status for a date) is distinct from sibling tools which focus on workouts, activities, and connections; however, it could more explicitly differentiate from the exhaustive list tools like list_activities.

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

Usage Guidelines3/5

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

The description implies usage is per-date retrieval of recovery metrics but offers no explicit guidance on when to prefer this over siblings (e.g., when to use get_activity_summary instead). The singular date parameter hints at point-in-time queries, but no contrast with list_* tools or alternatives is provided.

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

list_activitiesA
Read-onlyIdempotent

List completed Garmin activities in an inclusive YYYY-MM-DD date range.

Returns compact planning metrics and omits GPS coordinates and owner details. activity_type is an optional Garmin type key such as running or cycling.

NameRequiredDescriptionDefault
limitNo
end_dateNo
start_dateYes
activity_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and idempotentHint, so no duplication needed. The description adds useful behavioral context beyond annotations: it returns compact metrics, omits GPS and owner details, and uses an inclusive date range. This adds value 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?

Two concise sentences front-load the purpose and add key details. No fluff, every word earns its place. The structure is clear and efficient.

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 availability of an output schema and rich annotations, the description is adequate for a list tool. It covers the core purpose, date inclusivity, and notable omissions. However, it could be more complete by mentioning pagination or limit behavior, and by explicitly contrasting with sibling detail tools.

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 the date range inclusivity and gives an example for activity_type, but does not mention the 'limit' parameter at all, and implicitly treats start_date/end_date as a pair without specifying which are required. Over half of the parameters remain unexplained.

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

Purpose5/5

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

The description clearly states it lists completed Garmin activities within an inclusive date range. It distinguishes itself from siblings like get_activity_summary or get_activity_splits by focusing on listing rather than details, and from list_workouts by specifying 'activities' instead of 'workouts'.

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 high-level list of activities) but does not explicitly mention alternatives or when not to use this tool. Comments about omitting GPS and owner details hint at limitations but do not direct the user to sibling tools like get_activity_summary for richer data.

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

list_scheduled_workoutsB
Read-onlyIdempotent

List Garmin calendar entries for a year and month.

NameRequiredDescriptionDefault
yearYes
monthYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the context of Garmin calendar entries and month scoping, but does not disclose any further behavioral details such as pagination or return semantics.

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 or redundancy. It communicates the tool's purpose efficiently and earns its place.

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

Completeness3/5

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

With annotations and an output schema present, the description does not need to document return values or safety. However, it lacks clarification about how 'calendar entries' relates to 'scheduled workouts' and how this differs from sibling tools like list_workouts, leaving some ambiguity for tool selection.

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 mentions 'year and month' without adding constraints, valid ranges, or formatting expectations. The property names and titles already convey most of the semantics, so the description adds little beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('List') and identifies a clear resource ('Garmin calendar entries') scoped by year and month. This distinguishes it from sibling tools like list_workouts and list_activities, which target different data sets.

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 list_workouts or list_activities. It states what it lists but does not explain the intended use case or exclude other tools.

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

list_workoutsA
Read-onlyIdempotent

List workout templates from the user's Garmin Connect library.

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds the library/template scope but does not disclose pagination, ordering, or limit behavior beyond what the schema implies.

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 wording. Every word contributes to identifying the tool's purpose and scope.

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 read-only list operation with rich annotations and an output schema, the description is mostly sufficient. It could be slightly more complete by noting the limit parameter's behavior, but it is adequate given the low complexity.

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 description coverage is 0%, so the description should compensate for the limit parameter, but it does not. The parameter name and default provide partial clues, yet no added meaning about limiting results or pagination is offered.

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 ('List'), names the exact resource ('workout templates'), and scopes it to 'the user's Garmin Connect library.' This clearly distinguishes the tool from siblings like list_scheduled_workouts and list_activities.

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 context by specifying 'workout templates' as opposed to scheduled workouts or activities, which implies appropriate use. However, it does not explicitly name alternatives or state when not to use this tool.

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

preview_workoutA
Read-onlyIdempotent

Validate and preview Garmin JSON without changing Garmin Connect.

NameRequiredDescriptionDefault
workoutYes

Output 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, so the safety profile is well covered. The description adds the explicit 'without changing Garmin Connect' statement, which reinforces the no-side-effect behavior, but it does not add further behavioral details such as what 'preview' returns or whether it communicates with Garmin at all. This is adequate but not rich given 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 of nine words with no filler or repetition. Every word earns its place, and the key safety qualifier appears at the end without burying the primary purpose.

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 rich input schema, existing annotations, and available output schema, the description captures the essential selection and invocation context: validate/preview a workout payload and do not modify Garmin Connect. It could slightly expand on what 'preview' entails, but the overall tool context is sufficiently complete for an agent to use it correctly alongside the structured metadata.

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 only parameter is 'workout', which has no top-level description, and the tool description does not explain how to construct it. However, the nested $defs in the input schema thoroughly document the workout structure, and the phrase 'Garmin JSON' clarifies the conceptual payload. The description adds general context but relies on the schema for meaningful 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 uses a specific verb pair ('Validate and preview') and names the resource ('Garmin JSON'), while explicitly stating the non-mutating nature ('without changing Garmin Connect'). This clearly distinguishes it from mutation siblings like create_workout, delete_workout, and unschedule_workout, and from read-only listing tools like list_workouts.

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

Usage Guidelines4/5

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

The phrase 'without changing Garmin Connect' strongly implies this tool is for safe dry-run validation/preview before performing an actual mutation, providing clear context for when to use it. It does not explicitly name alternatives or state when not to use it, but the intended usage is evident from the contrast with mutation siblings.

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

unschedule_workoutA
DestructiveIdempotent

Remove a scheduled workout from the calendar without deleting its template.

NameRequiredDescriptionDefault
confirmNo
scheduled_workout_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark the tool as destructive and non-read-only, so the description's job is lighter. It adds meaningful beyond-annotation context by specifying that the template survives the removal. However, it does not disclose whether the action is reversible or how the confirm parameter influences behavior, so it is not fully transparent.

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, well-structured sentence that leads with the primary action and immediately clarifies the most important distinction. Every word contributes meaning; there is no fluff, redundancy, or unnecessary qualification.

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

Completeness3/5

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

For a destructive action with a confirmation parameter, the description is minimal but directionally correct. It explains the core operation and distinguishes it from deletion, but it leaves gaps around the confirm parameter, preconditions, and irreversibility. The abundance of sibling tools like list_workouts and delete_workout would have benefited from more explicit placement, but the current text is adequate for a straightforward unscheduling action.

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 should carry the burden of explaining parameter semantics. It does not mention either scheduled_workout_id or confirm. While the ID name is self-explanatory, the confirm boolean's purpose and necessity are entirely unexplained, leaving a gap for the agent.

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 'Remove' with a specific resource ('a scheduled workout from the calendar') and adds the crucial qualifier 'without deleting its template,' which distinguishes this tool from the sibling delete_workout. This is a specific and non-tautological statement of purpose.

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 phrase 'without deleting its template' provides clear contextual guidance: use this to remove a calendar entry while preserving the template. It implies the alternative of delete_workout for full deletion, but it does not explicitly name that sibling or state when not to use this tool in broader terms.

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 observedconnection_status
    • First observedcreate_workout
    • First observeddelete_workout
    • First observedget_activity_splits
    • First observedget_activity_summary
    • First observedget_recovery_status
    • First observedlist_activities
    • First observedlist_scheduled_workouts
    • First observedlist_workouts
    • First observedpreview_workout
    • First observedunschedule_workout

TDQS

A4/5.0

Scored across 11 tools

Disambiguation4/5

The tools are generally distinct: connection_status, preview_workout, list/workout types, get_activity_summary vs splits, recovery, and create/delete/unschedule. There is slight overlap between list_workouts and list_scheduled_workouts, but descriptions clarify that one is templates and the other is calendar entries. The naming also helps distinguish them.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern: connection_status, preview_workout, list_workouts, list_scheduled_workouts, list_activities, get_activity_summary, get_activity_splits, get_recovery_status, create_workout, delete_workout, unschedule_workout. The pattern is uniform and predictable.

Tool Count5/5

With 11 tools, the server covers a reasonable scope for a Garmin integration: connection check, workout preview/CRUD, activity listing/retrieval, and recovery status. Each tool serves a distinct function, and the count is within the typical range for a domain-specific server.

Completeness5/5

The surface appears complete for common Garmin workflows: managing workouts (create, delete, unschedule), viewing activities (list, summary, splits), checking recovery, and verifying connection. It includes both list and get operations, plus scheduling. There is a minor gap for updating workouts, but that may be acceptable given the preview/confirm workflow. Overall, it covers the primary user needs.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Personal MCP server for interacting with your Garmin Connect data. Exposes 62 tools across 11 domains including activities, health, training, and workouts.
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Exposes personal Garmin Connect data to MCP-capable clients like Claude and Gemini. Enables querying daily stats, heart rate, sleep, activities, and managing workouts.
    16
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Provides read-only access to your Garmin Connect health data, including sleep, HRV, body battery, stress, training readiness, and activities, through an MCP server.
    2
    14
    -