Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.endurancetools/garmin-mcp

NPM · GARMIN-MCP-SERVER

Unofficial Garmin Connect server: training load, form, HRV readiness and workouts for your watch

Available components

+3 this week 71 Trust /100

Last scanned (24 minutes ago)

Scores higher than 42% of npm servers

Category Health and Science

Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security90
  • No malware found by supply-chain analysis.Pass
  • CVE check failed: a known high-severity CVE affects tar 7.4.3, reached via garmin-mcp-auth > cuimp > tar. A fixed version is available. View diagnostics → Fail
  • No install/post-install scripts declared.Pass
  • 9 of 37 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 7 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability74
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 4351 tokens (~174/item across 25 items; 20 tools + 5 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
  • Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage85
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 49% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 20 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 22 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Oct 26 +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.

  • 20 Oct 26 +1

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

  • 18 Oct 26 +1

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

  • 16 Oct 26 +16
    • Stability: 0.03 → unverified ▼ security
    • Tool safety: pass → unverified ▼ security
    • Malware scan: unverified → pass ▲ security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: 100 → unverified ▼ functional
    • Package version: 0.4.0 → 0.4.1 functional
  • 15 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Stability: unverified → 0.03 ▲ functional
    • Package version: 0.3.1 → 0.4.0 functional
  • 14 Oct 26 +31
    • Injection markers: unverified → pass ▲ security
    • First check of Judged manipulation: pass security
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • Tool coverage: unverified → 100 ▲ functional
    • Schema quality: unverified → 100 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • Security disclosure: fail → pass ▲ functional
    • First check of Schema quality: fail functional
    • First check of Tool coverage: 49 functional
    • First check of Destructive annotations: pass functional
    • First check of Schema quality: fail functional
    • First check of Schema quality: good functional
    • First check of Tool coverage: 100 functional
    • Package version: 0.3.0 → 0.3.1 functional
  • 13 Oct 26 +8
    • CVE-2026-59871 affects this package: high ▼ security
    • CVE-2026-53655 affects this package: high ▼ security
    • CVE-2026-59873 affects this package: high ▼ security
    • CVE-2026-24842 affects this package: high ▼ security
    • CVE-2026-29786 affects this package: high ▼ security
    • CVE-2026-23950 affects this package: high ▼ security
    • CVE-2026-73566 affects this package: high ▼ security
    • CVE-2026-59874 affects this package: high ▼ security
    • CVE-2026-59875 affects this package: high ▼ security
    • CVE-2026-26960 affects this package: high ▼ security
    • CVE-2026-23745 affects this package: high ▼ security
    • CVE-2026-31802 affects this package: high ▼ security
    • Known CVEs: unverified → fail ▼ security
    • Dependency health: unverified → 0.91 ▲ functional
    • Package version: 0.2.0 → 0.3.0 functional
  • 12 Oct 26 28

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 24 Oct 2026 · Analysed npm/garmin-mcp-server@0.4.1

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Vulnerabilities 12 findings
ID CVE Severity Vector Fix available
GHSA-23hp-3jrh-7fpw CVE-2026-59873 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes
GHSA-34x7-hfp2-rc4v CVE-2026-24842 high CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:L/A:N yes
GHSA-83g3-92jg-28cx CVE-2026-26960 high CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N yes
GHSA-8qq5-rm4j-mr97 CVE-2026-23745 high yes
GHSA-8x88-c5mf-7j5w CVE-2026-59874 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes
GHSA-9ppj-qmqm-q256 CVE-2026-31802 high yes
GHSA-gvwx-54wh-qm9j CVE-2026-59875 medium CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L yes
GHSA-qffp-2rhf-9h96 CVE-2026-29786 high yes
GHSA-r292-9mhp-454m CVE-2026-73566 high CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H yes
GHSA-r6q2-hw4h-h46w CVE-2026-23950 high CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:H/A:L yes
GHSA-vmf3-w455-68vh CVE-2026-53655 medium yes
GHSA-w8wr-v893-vjvp CVE-2026-59871 medium CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L yes

Background: What a vulnerability scan can and cannot prove →

Dependencies 37 packages
Packages resolved 37
Deprecated 1
Stale 8
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 20 exposed · ~3,962 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
create_workout ~442

Save a new structured workout to Garmin Connect (then use schedule_workouts to put it on the calendar so it syncs to the watch). Pass exactly one of: `preset` for a standard session from a few parameters (run_intervals, walk_run, easy_z2, strength_circuit); `definition` for anything else (typed steps with duration and target, nestable repeats); `garmin_json` only to copy an existing Garmin workout JSON. Errors name the bad field, e.g. steps[2].steps[0].target. Call with dry_run: true first, show the steps to the user and save only after they agree. dry_run saves nothing and does not contact Garmin: it returns the readable steps and the estimated duration (time steps, plus distance steps at the middle of their pace range; steps with neither are listed in estimate_note, and for garmin_json that carries its own estimate the note says it was taken from there).

NameTypeReqDescription
definitionobject–Typed workout. Example: {"name":"6x400m","sport":"running","steps":[{"kind":"warmup","duration":{"type":"time","seconds":600}},{"kind":"repeat","count":6,"steps":[{"kind":"interval","duration":{"type…
dry_runboolean–true: only show the steps and estimated duration, save nothing
garmin_jsonobject–Raw Garmin workout JSON with workoutName, sportType and workoutSegments
preset––Ready-made workout filled in from a few parameters. Example: {"name":"run_intervals","params":{"repeats":6,"work_meters":400,"work_target":{"type":"pace","min_per_km_fast":"3:50","min_per_km_slow":"4…
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

download_activity_file ~118

Save an activity as a file on this machine and return its path: fit (original device file), gpx, tcx, kml or csv (laps). Use when the user wants the file itself, e.g. to import elsewhere.

NameTypeReqDescription
formatstring––
idintegeryes–
output_dirstring–Subdirectory of the download directory (GARMIN_FIT_DOWNLOAD_DIR or <data dir>/downloads), e.g. "races"; default the download directory itself. Paths outside it are rejected
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

garmin_sync ~253

Download data from Garmin Connect into the local cache. Read tools already download missing data by themselves, so call this only when the user asks to sync/refresh or to pre-load a range, or when a tool returned meta.sync_hint (auto fetch turned off) and the user agreed; pass the hint's scope/from/to. Days already stored are skipped. Long ranges run in the background in 7-day chunks with pauses and a daily request cap to stay gentle with Garmin; this waits at most 20 s and reports progress (also in garmin://sync-status). Example: {"scope":"health","from":"2026-09-01","to":"2026-09-30"}.

NameTypeReqDescription
forceboolean–Re-download days that are already stored
fromstring–Start date; default: 7 days before `to`
scopestring–all | activities | health (daily summary, sleep, HRV, weight) | training (status, readiness, VO2max) | reference (profile, gear, devices, activity types, workouts, calendar months of from..to, also i…
tostring–End date; default: today
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_activities ~186

List workouts/activities (runs, rides, swims, strength...) as dense summaries: id, date, type, name, duration, distance, pace or speed, HR, training load. Use for "what did I do last week", finding an activity id, or comparing sessions. For one activity in depth use get_activity; for weekly/monthly totals use get_period_summary. Example: {"from":"2026-10-01","type":"running","limit":10}.

NameTypeReqDescription
cursorstring–next_cursor from the previous page
fromstring––
limitinteger––
sortstring––
tostring––
typestring–Garmin type key, e.g. running, trail_running, cycling, lap_swimming, strength_training; partial match. All keys: resource garmin://activity-types
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_activity ~174

Details of one activity by id. detail="summary" (default) for the overview incl. description, RPE and feel; "splits" adds laps; "hr_zones" adds time in HR zones; "power_zones" adds time in power zones (power meter); "weather" adds temperature, wind and conditions during the activity; "exercise_sets" adds strength sets (exercise, reps, weight, rest); "full" adds all of these plus the raw second-by-second stream (HR, pace, GPS...) paginated with next_cursor, 50 KB per page - only when the user needs raw samples.

NameTypeReqDescription
cursorstring–For detail="full": next_cursor of the previous page
detailstring––
idintegeryesActivity id from get_activities
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_body_composition ~54

Weigh-ins (kg, body fat %, muscle mass, BMI) in a range with change and trend. Default range: last 90 days.

NameTypeReqDescription
fromstring––
tostring––
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_devices ~53

Garmin devices on the account with model, firmware, last sync time and settings (time/date format, units, tones, move and heart-rate alerts, pulse ox during sleep, number of alarms). Comes from the reference sync.

Input schema present but exposes no named parameters.

NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_gear ~47

Shoes, bikes and other gear with total distance, usage since, notes and status. include_activities adds the last 10 activities per item.

NameTypeReqDescription
include_activitiesboolean––
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_load ~512

Own transparent load model (TSS per activity from power, else pace, else heart rate, else session RPE, with date-dependent thresholds), not Garmin's EPOC load; for Garmin's status and CTL/ATL/TSB from Garmin's load (`garmin_load_model`) use get_training_status. Returns CTL/ATL/TSB, ACWR, monotony and strain on `to` (`latest`), warning `flags`, ISO weeks per sport (sessions, hours, km, TSS, hrTSS, Garmin load, hours in Z1-2/Z3/Z4-5), the 3-zone intensity split against LT1/LTHR of the last 28 days (Z1/Z2/Z3 minutes and %; answers time below LT1, % in Z1, polarisation) and the thresholds used. include_series adds the daily curve, include_activities TSS/IF/load_source/EF per activity, include_efficiency the monthly EF trend, both with aerobic decoupling (Pa:Hr/Pw:Hr, % EF drop from first to second half) of sessions of 60+ min below LTHR with downloaded laps, include_by_sport CTL/ATL/TSB/ACWR per sport group (`by_sport`, plus run_ctl… columns in the series) next to the total, which stays the default. Example: {"from":"2026-09-01","to":"2026-09-30","include_activities":true}.

NameTypeReqDescription
flagsobject–Own flag thresholds, any of (default): acwr_high 1.5, acwr_warn 1.3, acwr_low 0.8, monotony_high 2, tsb_low -30, tsb_fresh 15, week_jump_pct 15, z1_min_pct 75, rpe_calibration 0.23, hr_method zones,…
fromstring–Default: 27 days before `to`
include_activitiesboolean––
include_by_sportboolean––
include_efficiencyboolean––
include_seriesboolean––
sourcestring–auto: power, pace, HR, then RPE per activity; hrtss: HR only; garmin_load: Garmin activity training load
tostring–Default: today
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_period_summary ~326

Training week or month at a glance: sessions and volume per sport, time in the Garmin HR zones 1-5 (for the 3-zone Z1/Z2/Z3 split against LT1/LTHR, e.g. time below LT1 or polarisation, use get_load), active vs rest days, longest and hardest session, `garmin_load_model` at the end (CTL/ATL/TSB from Garmin's daily training load (EPOC); the own TSS model is get_load), and only avg/min/max of sleep, HRV, resting HR, steps, stress and body battery plus average daily kcal. Day-by-day values and other metrics (calorie totals, intensity minutes, floors, respiration, SpO2) come from query_health, weight from get_body_composition. Weeks run Monday-Sunday. Period "range" gives the same for any from..to up to 366 days, e.g. a training block: {"period":"range","from":"2026-08-04","to":"2026-09-28"}. `complete` is true when the period is over and all its data is in the cache; `training` is left out while its activities are not. Example: {"period":"week","anchor_date":"2026-10-08"}.

NameTypeReqDescription
anchor_datestring–week/month: any date inside the period; default today
fromstring–range only, required
periodstring––
tostring–range only, required
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_readiness ~315

Morning GO/MODIFY/REST decision from HRV, resting HR, sleep hours and load; pass `rules` to use your own thresholds. Each signal has its value, reference, rating (ok, yellow, red; unknown when data is missing) and a readable detail; plus rules_used and a recommendation. Garmin's own scores (Training Readiness, Body Battery, stress; sleep score in the sleep value) are shown as info, not counted. REST needs a red pair (hrv with rhr or sleep, load with hrv, rhr or sleep), a single red or 2 yellow give MODIFY; decision_rule "count" instead gives REST at decision_red_min reds. Use for "how am I today" or "can I do a hard session". Example: {"date":"2026-10-12"}.

NameTypeReqDescription
datestring–Morning to judge; default today
rulesobject–Own thresholds, any of (default): hrv_red_base_factor 0.9, hrv_red_mean28_factor 0.85, hrv_yellow_weekly_factor 0.9, rhr_red_delta 5, rhr_yellow_delta 3, sleep_h_red 6, sleep_h_yellow 7, acwr_red 1.5…
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_sleep ~82

Sleep for one night ({"date":"2026-10-08"}, the morning date) with stages, score, SpO2, respiration and overnight HRV; or for a range ({"from","to"}) a per-night table with averages and trends.

NameTypeReqDescription
datestring––
fromstring––
tostring––
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_thresholds ~162

Thresholds the analytics use on `date` (default today): per param its value, the date it applies since and its source (garmin-auto from the Garmin profile, test, manual, import), by_sport (run, bike, swim: LTHR and LT1 with a note when a fallback, default or approximation), HRmax and the 28-day resting HR. zones has the HR and power zone floors per sport from the Garmin profile (method, HRmax/rest/LTHR or FTP used, fetched date; current, not historical). history adds every recorded row. Example: {"param":"lthr_run","history":true}.

NameTypeReqDescription
datestring––
historyboolean––
paramstring––
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_training_status ~184

Fitness and fatigue: VO2max (running/cycling) with trend, training readiness, remaining recovery time, Garmin training status (productive, maintaining, ...), Garmin acute/chronic load and load focus (aerobic low/high, anaerobic vs. targets), and `garmin_load_model`: CTL/ATL/TSB from Garmin's daily training load (EPOC); the own TSS model (power, pace, HR) is get_load. `metrics` holds race predictions (5k to marathon), endurance and hill score, fitness age, personal records and heat/altitude acclimation as of the newest training sync on or before `to`. Set include_series for the daily load curve.

NameTypeReqDescription
fromstring–Default: 28 days before `to`
include_seriesboolean––
tostring––
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

get_workout ~38

Steps of a saved workout in readable form (warm-up, repeats, targets in pace/HR/power).

NameTypeReqDescription
idintegeryes–
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

list_workouts ~234

For "my next race", "what is planned this week" or "which workouts do I have": the saved workout library (`workouts`), scheduled workouts (`upcoming_schedule`) and races or events the user added or subscribed to (`upcoming_events`: date, title, distance, start time, location; `race`/`primary` present only when true, `primary` marks the goal race of an active training plan). The calendar covers `from` to `to` (default: today and the next 60 days); any range works, past or future, and months not in the cache yet are downloaded on the way. Example: {"from":"2027-03-01","to":"2027-05-31"} for races next spring.

NameTypeReqDescription
fromstring–Calendar start; default today (or 60 days before `to` when `to` is in the past)
limitinteger––
sportstring–e.g. running, cycling, strength_training
tostring–Calendar end; default 60 days after `from`
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

query_health ~267

For "how did I sleep this week", "calories and intensity minutes this week", "steps yesterday" or any single health metric over days: a table per day or per ISO week plus summary with averages, totals, min/max and 7/28-day trend. Metrics: steps, resting_hr, hrv, sleep, stress, body_battery, respiration, spo2, intensity_minutes, calories, floors. steps also returns the daily distance in km, resting_hr the daily min/max HR, hrv the Garmin HRV status and baseline range, floors the floors climbed, calories the kcal burned (total, active) and eaten (calories_consumed_kcal, absent without food log entries). Ask for several metrics in one call (e.g. calories and intensity_minutes together). Use get_sleep for sleep stages of particular nights. Example: {"metrics":["hrv","resting_hr","sleep"],"from":"2026-07-01","to":"2026-09-30","granularity":"week"}.

NameTypeReqDescription
fromstring–Default: 7 days before `to`
granularitystring–"week" for ranges longer than ~3 weeks
metricsarrayyes–
tostring–Default: today
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

schedule_workouts ~147

Put saved workouts on the Garmin calendar (they then sync to the watch), or take them off it. `unschedule` takes schedule_id values (from list_workouts upcoming_schedule or an earlier schedule_workouts result); the workout stays in the library, only the calendar entry goes. Unschedule only what the user asked to remove. Unscheduling runs first, so moving a workout is one call. Returns a result per item. Examples: {"items":[{"date":"2026-10-10","workout_id":123}]}, {"unschedule":[456]}.

NameTypeReqDescription
itemsarray––
unschedulearray–schedule_id values of calendar entries to remove
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

set_threshold ~219

Record a field test result (LTHR, LT1, HRmax, FTP…) effective from a date; ask the user before saving. Stored in the local database only, never sent to Garmin; a row with the same date, param and source stays as it is (added false). A backdated row recomputes earlier activities from its date on (the first garmin-auto row is the Garmin profile as of its first download). Returns the row and the value in effect today. Example: {"date":"2026-10-11","param":"lthr_run","value":171,"note":"30 min TT"}.

NameTypeReqDescription
datestringyesDay of the test, not in the future
notestring––
paramstringyesHeart rates in bpm, ftp_w/run_ftp_w in W, css_s_per_100m in s per 100 m, run_threshold_pace_s_per_km in s per km
sourcestring––
valuenumberyes–
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

update_activity ~149

Change an activity in Garmin Connect: name, type (Garmin type key such as "trail_running"; valid keys in resource garmin://activity-types), description (notes), rpe (0-10 perceived effort) or feel (0 very weak, 25 weak, 50 normal, 75 strong, 100 very strong). Only call when the user asked for the change. Returns the activity after the edit.

NameTypeReqDescription
descriptionstring––
feel–––
idintegeryes–
namestring––
rpenumber––
typestring–Garmin type key from garmin://activity-types, e.g. trail_running
NameTypeReqDescription
dataobjectyes–
meta–yes–

No examples provided.

Install

How do I install the io.github.endurancetools/garmin-mcp server?

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

npm · garmin-mcp-server

# add to Claude Code
claude mcp add endurancetools-garmin-mcp -- npx -y garmin-mcp-server
Common questions

What is the io.github.endurancetools/garmin-mcp server?

io.github.endurancetools/garmin-mcp is listed in the public MCP registry as io.github.endurancetools/garmin-mcp. Unofficial Garmin Connect server: training load, form, HRV readiness and workouts for your watch. This page covers its npm package (garmin-mcp-server).

Is the io.github.endurancetools/garmin-mcp server safe to use?

io.github.endurancetools/garmin-mcp scores 71 out of 100 on VerifyMCP. We recorded 12 known advisories against it as of 24 October 2026. It declares no install or post-install scripts. 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 io.github.endurancetools/garmin-mcp server expose?

io.github.endurancetools/garmin-mcp exposes 20 tools: garmin_sync, get_activities, get_activity, update_activity, download_activity_file, and 15 more. Their descriptions and schemas cost roughly 3,962 tokens of context every time the server is loaded.

Is the io.github.endurancetools/garmin-mcp server still maintained?

io.github.endurancetools/garmin-mcp is still listed as active in the MCP registry. We last reached this channel on 24 October 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 io.github.endurancetools/garmin-mcp server under?

io.github.endurancetools/garmin-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.