# Run Coach (npm · garmin-mcp-app)

Garmin data with interactive charts: daily briefing, training trends, workout planning. Unofficial.

- Trust score: 90/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `garmin-mcp-app`: 90/100 (this document), [markdown](https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app.md), [page](https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app)

## Channel facts

- Registry: `npm`
- Package: `garmin-mcp-app`
- Version: `0.11.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to chenhunghan/garmin-mcp-app).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 4877 tokens (~65/item across 74 items; 73 tools + 1 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 73/100
  - Stability observed for 22 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 96/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 88% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete-workout" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 74 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the Run Coach MCP server?

Run Coach runs locally as an npm package, launched with npx -y garmin-mcp-app. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add chenhunghan-garmin-mcp-app -- npx -y garmin-mcp-app
```

### Cursor

```json
{
  "mcpServers": {
    "chenhunghan-garmin-mcp-app": {
      "command": "npx",
      "args": [
        "-y",
        "garmin-mcp-app"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "chenhunghan-garmin-mcp-app": {
      "command": "npx",
      "args": [
        "-y",
        "garmin-mcp-app"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add chenhunghan-garmin-mcp-app -- npx -y garmin-mcp-app
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "chenhunghan-garmin-mcp-app": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "garmin-mcp-app"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add chenhunghan-garmin-mcp-app --command npx --arg -y --arg garmin-mcp-app
```

### Hermes

```yaml
mcp_servers:
  chenhunghan-garmin-mcp-app:
    command: "npx"
    args: ["-y", "garmin-mcp-app"]
```

### Netclaw

```json
{
  "McpServers": {
    "chenhunghan-garmin-mcp-app": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "garmin-mcp-app"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add chenhunghan-garmin-mcp-app -t stdio -c npx -a -y garmin-mcp-app
```

### Other

```json
{
  "mcpServers": {
    "chenhunghan-garmin-mcp-app": {
      "command": "npx",
      "args": [
        "-y",
        "garmin-mcp-app"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 90, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 89, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-02 (score 74, −14)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 4367 → 4877
- [functional] Package version: 0.9.1 → 0.11.0

### 2026-10-31 (score 88, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 87, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-22 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (73)

### `garmin-check-auth` (~20 tokens)

Check Garmin Auth

Check if the user is authenticated with Garmin Connect

### `garmin-get-login-key` (~24 tokens)

Get Garmin Login Key

Issue a single-use public key for encrypting the Garmin password

### `garmin-login` (~47 tokens)

Garmin Login

Log in to Garmin Connect with email and an encrypted password

Input parameters:

- `email` (string, required)
- `encryptedPassword` (string, required): Password encrypted with the key from garmin-get-login-key

### `garmin-submit-mfa` (~27 tokens)

Submit Garmin MFA

Submit MFA verification code for Garmin Connect login

Input parameters:

- `code` (string, required)

### `garmin-logout` (~20 tokens)

Garmin Logout

Log out of Garmin Connect and clear saved tokens

### `get-steps` (~59 tokens)

Get Steps

Get step count data from Garmin Connect. Supports a single date or a date range.

Input parameters:

- `date` (string, required): Start date in YYYY-MM-DD format
- `endDate` (string): End date in YYYY-MM-DD format (defaults to date)

### `get-heart-rates` (~124 tokens)

Get Heart Rates

Get heart rate data (resting, min/max, intraday samples) for a day, or for each day from date to endDate in one call. The chart shows the days ending at the last requested date.

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format (the first day when endDate is given)
- `endDate` (string): Optional last day (YYYY-MM-DD, max 14 days) to get every day in the range in ONE call. Prefer this over calling the tool once per day: each call shows its own chart.

### `get-sleep` (~122 tokens)

Get Sleep

Get sleep data (stages, score, HRV, breathing) for a day, or for each day from date to endDate in one call. The chart shows the days ending at the last requested date.

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format (the first day when endDate is given)
- `endDate` (string): Optional last day (YYYY-MM-DD, max 14 days) to get every day in the range in ONE call. Prefer this over calling the tool once per day: each call shows its own chart.

### `get-stress` (~120 tokens)

Get Stress

Get stress data (average, max, intraday levels) for a day, or for each day from date to endDate in one call. The chart shows the days ending at the last requested date.

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format (the first day when endDate is given)
- `endDate` (string): Optional last day (YYYY-MM-DD, max 14 days) to get every day in the range in ONE call. Prefer this over calling the tool once per day: each call shows its own chart.

### `get-activities` (~42 tokens)

Get Activities

Get recent activities from Garmin Connect

Input parameters:

- `limit` (number): Max results (default 20)
- `start` (number): Start index (default 0)

### `get-training-readiness` (~49 tokens)

Get Training Readiness

Get training readiness score (0-100) and breakdown (sleep, HRV, recovery, stress) for a given date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-training-status` (~42 tokens)

Get Training Status

Get training status including acute/chronic load, ACWR, and load status for a given date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-hrv` (~62 tokens)

Get HRV

Get heart rate variability data (nightly avg, weekly avg, baseline, status) for a date range

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-body-battery` (~53 tokens)

Get Body Battery

Get daily body battery charged/drained values for a date range

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-activity-details` (~34 tokens)

Get Activity Details

Get full details for a specific Garmin activity by ID

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-splits` (~80 tokens)

Get Activity Splits

Get splits (pace, HR, cadence) for a specific activity. Returns the laps recorded by the watch (lapDTOs); when the activity was recorded as a single lap (auto-lap off), also per-km splits computed from the time series (kmSplits).

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-hr-zones` (~39 tokens)

Get Activity HR Zones

Get heart rate time-in-zones breakdown for a specific activity

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-vo2-max` (~52 tokens)

Get VO2 Max

Get VO2 Max trend data for a date range

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-race-predictions` (~31 tokens)

Get Race Predictions

Get predicted race times for 5K, 10K, half marathon, and marathon

### `get-training-context` (~64 tokens)

Get Training Context

Collects comprehensive training context for workout planning: recent running activities, sleep, HRV, training readiness, body battery, VO2 max, and training status. Use this before planning a workout.

Input parameters:

- `date` (string, required): Reference date (YYYY-MM-DD), typically today

### `list-workouts` (~103 tokens)

List Workouts

List the user's saved/custom workouts (structured workouts they created, e.g. 'LT', 'Tempo 5K', '4x1km'). Use this whenever the user refers to a workout by name, then get-workout for its steps.

Input parameters:

- `limit` (number): Max results (default 20)
- `name` (string): Only workouts whose name contains this text (case-insensitive)
- `start` (number): Start index (default 0)

### `get-workout` (~52 tokens)

Get Workout

Get a saved workout's steps (warm-up, intervals, targets) by ID. To find a workout by name, call list-workouts first.

Input parameters:

- `workoutId` (string|number, required): Garmin workout ID

### `create-workout` (~316 tokens)

Create Workout

Create a workout from raw Garmin workout JSON. Prefer create-structured-workout, which builds this JSON from a simple step list and avoids format mistakes; use this only for something it can't express.

Workout structure:
\- sportType: { sportTypeId: 1, sportTypeKey: 'running' } for running
\- workoutSegments: array of segments, each with segmentOrder and workoutSteps
\- Each step uses type "ExecutableStepDTO" for regular steps, "RepeatGroupDTO" for repeat groups
\- Common step structure: { stepOrder, stepType, endCondition, endConditionValue, targetType, targetValueLow, targetValueHigh }

Step types: warmup, cooldown, interval, rest, recovery, repeat
End conditions: time (seconds), distance (meters), lap.button (manual lap)
Target types: heart.rate.zone (1-5), pace.zone, speed.zone, no.target

Example - 5x1000m intervals:
\- Warmup: 15min easy (endCondition: time, endConditionValue: 900)
\- Repeat group (numberOfIterations: 5):
  \- Interval: 1000m (endCondition: distance, endConditionValue: 1000)
  \- Recovery: 90s jog (endCondition: time, endConditionValue: 90)
\- Cooldown: 10min easy (endCondition: time, endConditionValue: 600)

Input parameters:

- `workout` (object, required): Workout object following Garmin workout JSON structure

### `create-structured-workout` (~405 tokens)

Create Structured Workout

Create a workout on Garmin Connect from a simple step list, and optionally put it on the calendar (scheduleDate). Use this instead of create-workout. The app shows the new workout's steps.

Example: 5x1km intervals on a Tuesday
{ "name": "5x1km @ 4:00", "sport": "running", "scheduleDate": "2026-10-06",
  "steps": [
    { "type": "warmup", "duration": { "seconds": 900 }, "target": { "hrZone": 2 } },
    { "repeat": 5, "steps": [
      { "type": "run", "duration": { "meters": 1000 }, "target": { "pace": { "fast": "3:55", "slow": "4:05" } } },
      { "type": "recovery", "duration": { "seconds": 90 } } ] },
    { "type": "cooldown", "duration": { "seconds": 600 }, "target": { "hrZone": 1 } } ] }

An easy run is a single { "type": "run", "duration": { "seconds": 2700 }, "target": { "hrZone": 2 } } step. Base targets on the user's own zones and recent paces (get-training-context).

Input parameters:

- `description` (string): Optional workout description
- `name` (string, required): Workout name, e.g. "Easy 45 min" or "5x1km @ 4:00"
- `scheduleDate` (string): Optional YYYY-MM-DD: also put the workout on the user's Garmin calendar that day
- `sport` (string, required): Sport
- `steps` (array, required): Steps in order. A step is { type, duration?, target? }; a repeat is { repeat: n, steps: [...] }.

### `update-workout` (~44 tokens)

Update Workout

Update an existing workout on Garmin Connect

Input parameters:

- `workout` (object, required): Workout object following Garmin workout JSON structure
- `workoutId` (string|number, required): Garmin workout ID

### `delete-workout` (~55 tokens)

Delete Workout

Delete a workout from Garmin Connect, with every calendar entry it has. To take one scheduled workout off the calendar and keep the workout, use unschedule-workout.

Input parameters:

- `workoutId` (string|number, required): Garmin workout ID

### `schedule-workout` (~50 tokens)

Schedule Workout

Schedule a workout on a specific calendar date in Garmin Connect

Input parameters:

- `date` (string, required): Date to schedule the workout (YYYY-MM-DD)
- `workoutId` (string|number, required): Garmin workout ID

### `unschedule-workout` (~100 tokens)

Unschedule Workout

Remove one scheduled workout from the Garmin calendar; the workout itself and its other dates are kept. scheduleId is the calendar entry's ID, not the workout's: workoutScheduleId from schedule-workout or create-structured-workout, or scheduleId from show-training-week. To move a workout to another day, unschedule it, then schedule-workout on the new date.

Input parameters:

- `scheduleId` (string|number, required): Calendar schedule entry ID

### `get-daily-summary` (~45 tokens)

Get Daily Summary

Daily totals: steps, calories, distance, floors, intensity minutes, stress and body battery for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-respiration` (~41 tokens)

Get Respiration

Breathing rate (breaths/min) through the day and during sleep for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-spo2` (~36 tokens)

Get Pulse Ox

Blood oxygen saturation (SpO2) readings for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-intensity-minutes` (~41 tokens)

Get Intensity Minutes

Moderate/vigorous intensity minutes for a date and the running weekly total vs goal

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-floors` (~34 tokens)

Get Floors

Floors climbed and descended through the day for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-resting-heart-rate` (~50 tokens)

Get Resting Heart Rate

Daily resting heart rate over a date range

Input parameters:

- `endDate` (string): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-body-battery-events` (~42 tokens)

Get Body Battery Events

Events that charged or drained body battery (sleep, activities, stress) for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-hydration` (~34 tokens)

Get Hydration

Water intake vs goal and sweat loss for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-body-composition` (~36 tokens)

Get Body Composition

Weight, BMI, body fat and muscle mass for a date

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-weigh-ins` (~48 tokens)

Get Weigh-ins

All weigh-ins over a date range

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-weekly-steps` (~51 tokens)

Get Weekly Steps

Weekly step totals for the weeks ending at a date

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `weeks` (integer): Number of weeks (default 12)

### `get-weekly-stress` (~51 tokens)

Get Weekly Stress

Weekly average stress for the weeks ending at a date

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `weeks` (integer): Number of weeks (default 12)

### `get-weekly-intensity-minutes` (~53 tokens)

Get Weekly Intensity Minutes

Weekly intensity minutes vs goal over a date range

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-endurance-score` (~64 tokens)

Get Endurance Score

Endurance score for a date, or weekly stats when endDate is given (a single date often has no data)

Input parameters:

- `endDate` (string): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-hill-score` (~62 tokens)

Get Hill Score

Hill score (strength + endurance on climbs) for a date, or weekly stats when endDate is given

Input parameters:

- `endDate` (string): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-running-tolerance` (~55 tokens)

Get Running Tolerance

Running load tolerance over a date range

Input parameters:

- `aggregation` (string)
- `endDate` (string, required): End date in YYYY-MM-DD format
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-lactate-threshold` (~50 tokens)

Get Lactate Threshold

The user's latest lactate threshold measurement (heart rate and pace), a physiological metric detected by the watch. Not a saved workout: for workouts named like 'LT' use list-workouts.

### `get-cycling-ftp` (~20 tokens)

Get Cycling FTP

Latest cycling functional threshold power (FTP)

### `get-heart-rate-zones` (~19 tokens)

Get Heart Rate Zones

Configured heart rate zones per sport

### `get-fitness-age` (~33 tokens)

Get Fitness Age

Fitness age vs chronological age and what drives it

Input parameters:

- `date` (string, required): Date in YYYY-MM-DD format

### `get-personal-records` (~31 tokens)

Get Personal Records

Personal records (fastest 1K/5K/10K, longest run, etc.)

### `get-progress-summary` (~59 tokens)

Get Progress Summary

Totals per activity type over a date range for a metric

Input parameters:

- `endDate` (string, required): End date in YYYY-MM-DD format
- `metric` (string)
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-activities-by-date` (~88 tokens)

Get Activities by Date

Activities between two dates, optionally filtered by type (e.g. running, cycling)

Input parameters:

- `activityType` (string): Activity type key, e.g. running
- `endDate` (string): End date in YYYY-MM-DD format
- `limit` (integer)
- `start` (integer)
- `startDate` (string, required): Start date in YYYY-MM-DD format

### `get-activity-typed-splits` (~35 tokens)

Get Activity Typed Splits

Run/walk/rest splits of an activity

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-weather` (~28 tokens)

Get Activity Weather

Weather during an activity

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-exercise-sets` (~37 tokens)

Get Activity Exercise Sets

Strength-training sets, reps and weights of an activity

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-chart-data` (~57 tokens)

Get Activity Chart Data

Time series (HR, pace, cadence, elevation...) of an activity, downsampled

Input parameters:

- `activityId` (string|number, required): Garmin activity ID
- `maxPoints` (integer): Max samples (default 200)

### `get-activity-gear` (~36 tokens)

Get Activity Gear

Gear (e.g. shoes) used for an activity

Input parameters:

- `activityId` (string|number, required): Garmin activity ID

### `get-activity-types` (~16 tokens)

Get Activity Types

All Garmin activity type keys

### `get-user-settings` (~33 tokens)

Get User Settings

User settings: units, sleep schedule, physiological data (age, weight, height, HR zones, lactate threshold)

### `get-devices` (~13 tokens)

Get Devices

Registered Garmin devices

### `get-primary-training-device` (~21 tokens)

Get Primary Training Device

Device used as the source of training status and metrics

### `get-last-used-device` (~15 tokens)

Get Last Used Device

Most recently synced device

### `get-gear` (~20 tokens)

Get Gear

All gear (shoes, bikes) with usage

### `get-goals` (~20 tokens)

Get Goals

Goals by status

Input parameters:

- `status` (string)

### `get-training-plans` (~16 tokens)

Get Training Plans

Available and active training plans

### `get-calendar` (~40 tokens)

Get Calendar

Calendar for a month: scheduled workouts, activities and events

Input parameters:

- `month` (integer, required): Month, 1-12
- `year` (integer, required)

### `get-daily-briefing` (~275 tokens)

Daily Briefing

Morning briefing: how the user is today, framed against their own baselines. Use for 'how am I today', 'morning briefing', 'daily check-in', 'should I train today', 'am I recovered'. Returns training readiness (with its limiting factors), last night's sleep (score, duration vs Garmin's optimal, stages), HRV (vs 7-night avg and the balanced range), body battery (vs at wake), resting HR (vs 7-day avg), stress, steps vs goal, training status, the last activity and the past 7 days' volume. Each metric has value, unit, a named baseline, delta and a neutral status (from Garmin's own status fields where it has one); missing metrics carry a reason. After calling it: give a short, warm briefing that leads with the 1–2 numbers that matter most today, then 2–3 concrete, personal suggestions grounded in the numbers (e.g. intensity or duration of today's session, bedtime, recovery), and one thing to watch. Say what you're unsure about (missing metrics, a single bad night vs a trend). Don't restate every number: the app already shows them.

Input parameters:

- `date` (string): Day to brief on (YYYY-MM-DD), defaults to today in the user's time zone

### `show-training-week` (~106 tokens)

Training Week

Show a Monday-Sunday training week: workouts scheduled on the Garmin calendar (with their steps and estimated duration/distance), activities completed, and a weekly summary (planned vs done, planned and completed volume). Call it after creating/scheduling a week of workouts to show the user the plan, or to review how a week went.

Input parameters:

- `startDate` (string): Any day of the week to show (YYYY-MM-DD); the week starts on its Monday. Default: this week.

### `show-performance-dashboard` (~436 tokens)

Performance Dashboard

Show how key health and fitness metrics trend over 4 weeks to 1 year, one small chart per metric on a shared time range. Use it for trends, progress and comparing metrics over time: "is my fitness improving?", "how has my HRV changed?", "why did my resting HR go up in March?" (pick a range/endDate that covers the period).

Metrics (max 4): restingHR, hrv (nightly avg, with Garmin's baseline band), vo2max, sleepScore, sleepDuration (h), steps (per day), stress (avg), bodyBattery (daily high), intensityMinutes (weekly, vigorous counted double), trainingLoad (acute load with Garmin's optimal range), weight (kg, only if the user weighs in). Points are daily for 4w/12w and weekly means for 26w/52w.

Each metric has a summary: end = current level (mean of the last 7 days, or the latest week), mean = the period's average, vsMean/vsMeanPct = current level vs that average (the headline comparison; % omitted when the average is near zero), min/max with dates, start = the first 7 days/week (often unrepresentative, e.g. a new watch still calibrating or load ramping up from zero, so don't quote start→end percentages), and trend (direction of a least-squares fit; "flat" = fitted change under 3% of the mean). The chart only shows the data: interpret it for the user — what changed, how the metrics relate (e.g. HRV vs resting HR vs training load vs sleep), and gaps in the data. Don't over-read small changes.

Input parameters:

- `endDate` (string): Last day shown, YYYY-MM-DD (default today)
- `metrics` (array): Metrics to show (max 4), default restingHR, hrv, vo2max, sleepScore
- `range` (string): Time range ending at endDate: 4, 12, 26 or 52 weeks (default 12w)

### `show-run-replay` (~119 tokens)

Show Run Replay

Open an interactive 3D replay of a run: a runner follows the GPS track over the terrain while pace, heart rate (zones), cadence, elevation/grade, power, running dynamics and weather play back over time, with pause, fast-forward and scrubbing. Use when the user wants to replay, relive, watch or review a run as a whole. Returns a short summary of the run; the view renders the time series.

Input parameters:

- `activityId` (string|number): Garmin activity ID (default: the most recent run)

### `garmin-get-run-replay` (~76 tokens)

Get Run Replay Data

Time series of an activity for the 3D replay view (GPS, elevation, HR, cadence, speed, power, running dynamics), plus laps, weather and HR zones

Input parameters:

- `activityId` (string|number): Garmin activity ID (default: the most recent run)
- `maxPoints` (integer)

### `garmin-run-map-settings` (~50 tokens)

Run Replay Map Settings

Read or change whether the run replay fetches real elevation (AWS Terrain Tiles) and map data (OpenStreetMap) for the area around a run

Input parameters:

- `realMap` (boolean)

### `garmin-get-run-map` (~71 tokens)

Get Run Map

Real elevation and OpenStreetMap features (roads, land cover, water, buildings) around an activity's GPS track, for the 3D replay. Only when the real map setting is on.

Input parameters:

- `activityId` (string|number): Garmin activity ID (default: the most recent run)

### `garmin-get-replay-asset` (~68 tokens)

Get Replay Asset

One file of the 3D replay's asset pack (scanned materials, sky light, models, running motion; CC0), base64-encoded. Served from a local cache, downloaded once from the app's GitHub release.

Input parameters:

- `file` (string, required)

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app#diagnostics

## Score history

- 2026-11-05: 90
- 2026-11-04: 90
- 2026-11-03: 89
- 2026-11-02: 74
- 2026-11-01: 88
- 2026-10-31: 88
- 2026-10-30: 87
- 2026-10-29: 87
- 2026-10-28: 87
- 2026-10-27: 86
- 2026-10-26: 86
- 2026-10-25: 85
- 2026-10-24: 85
- 2026-10-23: 84
- 2026-10-22: 84
- 2026-10-21: 83
- 2026-10-20: 83
- 2026-10-19: 82
- 2026-10-18: 82
- 2026-10-17: 81
- 2026-10-16: 81
- 2026-10-15: 80
- 2026-10-14: 80
- 2026-10-13: 49
- 2026-10-12: 49
- 2026-10-11: 34

## Common questions

### What is the Run Coach MCP server?

Run Coach is an MCP server listed in the public MCP registry as io.github.chenhunghan/garmin-mcp-app. Garmin data with interactive charts: daily briefing, training trends, workout planning. Unofficial. This page covers its npm package (garmin-mcp-app).

### Is the Run Coach MCP server safe to use?

Run Coach scores 90 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Run Coach MCP server expose?

Run Coach exposes 73 tools: garmin-check-auth, garmin-get-login-key, garmin-login, garmin-submit-mfa, garmin-logout, and 68 more. Their descriptions and schemas cost roughly 4,867 tokens of context every time the server is loaded.

### Is the Run Coach MCP server still maintained?

Run Coach is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Run Coach MCP server under?

Run Coach declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/garmin-mcp-app
- Socket report: https://socket.dev/npm/package/garmin-mcp-app
- Repository: https://github.com/chenhunghan/garmin-mcp-app
- Changelog RSS feed: https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app.xml
- Changelog JSON feed: https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app.json
- HTML version of this page: https://verifymcp.io/servers/chenhunghan-garmin-mcp-app/garmin-mcp-app
