Skip to main content
Glama
Garmin Connect MCP Server

Garmin Connect MCP Server

by sedoglia

Garmin Connect MCP Server

English | Italiano

TypeScript Node.js MCP License: MIT Version

PayPal


Un server Model Context Protocol (MCP) che connette Claude Desktop a Garmin Connect, permettendo di interrogare in linguaggio naturale i tuoi dati di attività fisica, metriche di salute, sonno e altro ancora.

📦 Ultima release: v4.6.0 — bundle .mcpb pronto da installare, con le note di rilascio, il file .sha256 per verificarlo e l'SBOM in formato CycloneDX.

📜 Cronologia delle versioni: tutte le modifiche dettagliate di ogni release — nuovi tool, correzioni, note di aggiornamento — sono nel CHANGELOG.


Strumenti

Il server espone 110 strumenti, raggruppati per argomento. I 26 contrassegnati con ✏️ scrivono sull'account Garmin; tutti gli altri leggono soltanto.

🏃 Attività

Elenco e ricerca

Strumento

Descrizione

list_recent_activities

Le attività più recenti in forma sintetica: nome, tipo, data, distanza, durata, velocità, FC, calorie, dislivello, passi ed effetto allenante. Con includeDetails il payload completo

get_activities_by_date

Le attività in un intervallo di date, filtrabili per tipo e ordinabili, con la stessa sintesi. Ne elenca al massimo limit (100 di default, 200 il tetto) e dichiara se l'intervallo ne contiene altre

count_activities

Conta le attività, su tutto lo storico o in un intervallo di date

get_activity_types

L'elenco dei tipi di attività riconosciuti da Garmin Connect

Dettaglio di una singola attività

Strumento

Descrizione

get_activity_details

Il dettaglio completo di un'attività: metriche di riepilogo, zone, dati GPS

get_activity_splits

Split e lap con passo, distanza e tempo di ciascuno

get_activity_typed_splits

Split tipizzati, più dettagliati dei normali (boulder, forza, multisport)

get_activity_hr_zones

Il tempo trascorso in ciascuna zona di frequenza cardiaca

get_activity_exercise_sets

I set di esercizi registrati in un'attività di forza

get_activity_weather

Le condizioni meteo durante l'attività

get_activity_comments

I commenti lasciati su un'attività (solo lettura: scriverli non è possibile via API, vedi Limitazioni note)

Creazione e modifica

Strumento

Descrizione

create_manual_activity ✏️

Inserisce a mano un'attività: nome, tipo, inizio, durata; distanza e calorie opzionali

upload_activity ✏️

Carica un file di attività in formato FIT, GPX o TCX

download_activity

Scarica un'attività in FIT, TCX, GPX, KML o CSV

set_activity_name ✏️

Rinomina un'attività

set_activity_type ✏️

Cambia il tipo di un'attività

set_activity_privacy ✏️

Imposta la privacy: public, private o subscribers ("solo connessioni"). Il livello attuale si legge da accessControlRuleDTO in get_activity_details

delete_activity ✏️

Elimina un'attività. L'operazione non è reversibile

Confronti e analisi di periodo

Strumento

Descrizione

compare_activities

Confronta da 2 a 5 attività: distanza, durata, velocità, FC, calorie, dislivello, passi, training effect

find_similar_activities

Cerca attività simili per tipo, distanza e durata (tolleranza 20%), dalla più simile; searchDepth allarga lo storico esaminato

analyze_training_period

Analisi di trend, volumi e ricorrenze di allenamento su un intervallo di date

get_progress_summary

Aggrega i progressi fra due date su distance, duration o calories

get_fitness_stats

Statistiche aggregate fra due date su distance, duration, elevationGain o movingDuration, raggruppate per tipo di attività

❤️ Salute e benessere

Riepiloghi giornalieri

Strumento

Descrizione

get_daily_summary

Riepilogo compatto del giorno: passi e obiettivo, calorie, distanza, piani, minuti di intensità, FC a riposo/minima/massima, stress, Body Battery

get_user_summary

Riepilogo utente di una data: passi, calorie, distanza, minuti attivi

get_health_metrics

Frequenza cardiaca e passi di una giornata in un'unica risposta

Passi, piani e minuti di intensità

Strumento

Descrizione

get_steps

Il totale dei passi di una data

get_steps_data

La serie dettagliata dei passi della giornata, con gli orari

get_daily_steps

Passi giornalieri su un intervallo: oltre i 28 giorni la richiesta viene spezzata automaticamente

get_floors

Piani saliti e scesi; con includeBreakdown anche i 96 intervalli da 15 minuti

get_intensity_minutes

Minuti di intensità moderata e vigorosa, per una data o un intervallo, con totale e obiettivo settimanali

Cuore e respiro

Strumento

Descrizione

get_heart_rate

Frequenza cardiaca della giornata: a riposo, massima e serie di valori

get_rhr_day

Frequenza cardiaca a riposo di un singolo giorno

get_hrv_data

Variabilità della frequenza cardiaca (HRV), indicatore di recupero

get_respiration_data

Frequenza respiratoria durante il giorno e durante il sonno

get_spo2_data

Saturazione di ossigeno nel sangue (SpO2)

Stress ed energia

Strumento

Descrizione

get_stress_data

Stress del giorno sulla scala 0-100: medio, massimo, minimo e secondi per fascia; con includeValues anche i singoli campioni da 3 minuti

get_all_day_stress

Lo stress ora per ora: media, massimo e fascia di ogni ora, più i totali del giorno. Risponde a quando lo stress è salito, dove get_stress_data risponde a quanto è stato

get_body_battery

Body Battery (0-100) su un intervallo di date, con i periodi di ricarica e di consumo

get_body_battery_events

Gli eventi che hanno inciso sulla Body Battery di una data: sonno, attività, pisolini

get_all_day_events

Tutti gli eventi della giornata, comprese le attività rilevate automaticamente

Sonno

Strumento

Descrizione

get_sleep_data

La notte: durata, fasi, punteggio e riepilogo. Le serie al minuto sono contate e non incluse; includeTimeSeries le inserisce nella risposta

get_sleep_movement

Movimenti durante il sonno e momenti di irrequietezza

Idratazione

Strumento

Descrizione

get_hydration

L'idratazione registrata in una data

add_hydration_data ✏️

Aggiunge millilitri all'idratazione del giorno; un valore negativo li sottrae

Peso e composizione corporea

Strumento

Descrizione

get_body_composition

Peso, BMI, grasso, massa muscolare e ossea su un periodo di days giorni, con la media del periodo

get_weigh_ins

Le pesate registrate in un intervallo di date

add_weigh_in ✏️

Registra una pesata. Peso e grasso corporeo vengono conservati; acqua, muscolo e osso sono accettati ma Garmin li scarta su una pesata manuale

delete_weigh_in ✏️

Elimina una pesata dal suo id (samplePk). date serve solo se la pesata è riferita a un giorno diverso da quello in cui è stata inserita

Pressione sanguigna

Strumento

Descrizione

get_blood_pressure

Le misurazioni di pressione in un intervallo di date, con la version che serve per cancellarle

set_blood_pressure ✏️

Registra una misurazione: sistolica, diastolica, pulsazioni, data e ora

delete_blood_pressure ✏️

Elimina una misurazione: servono la data e la version restituita da get_blood_pressure

Salute femminile

Strumento

Descrizione

get_menstrual_data

I dati del ciclo mestruale per una data

get_pregnancy_summary

Il riepilogo del monitoraggio della gravidanza

📈 Allenamento e performance

Stato di forma

Strumento

Descrizione

get_training_status

Stato di allenamento di una data: status e frase di feedback, VO2 max, trend, carico acuto e cronico, rapporto ACWR

get_training_readiness

Il punteggio di prontezza all'allenamento

get_endurance_score

L'Endurance Score calcolato sul carico recente

get_fitness_age

L'età fisica stimata da VO2 max e altre metriche

get_max_metrics

Le metriche di picco, VO2 max compreso

get_hill_score

L'Hill Score, la resa in salita, su un intervallo di date

get_performance_condition

La performance condition di una data. Garmin la registra per attività, quindi di norma si legge da get_activity_details

get_race_predictions

I tempi di gara previsti su 5K, 10K, mezza e maratona

Carico di allenamento

Strumento

Descrizione

get_training_load

Il bilanciamento mensile del carico (aerobico basso e alto, anaerobico) rispetto ai target. È una fotografia alla data finale, non un aggregato dell'intervallo

get_load_ratio

Il rapporto fra carico acuto e cronico, indicatore di rischio infortuni

Workout

Strumento

Descrizione

get_workouts

L'elenco dei workout salvati

get_workout_by_id

Il dettaglio di un singolo workout

create_workout ✏️

Crea un workout strutturato con riscaldamento, intervalli e defaticamento. Sport ammessi: running, cycling, walking, swimming, strength, cardio, yoga, pilates, hiit, mobility, rucking, other (non esiste hiking: usare walking o rucking)

update_workout ✏️

Modifica nome, descrizione o struttura di un workout

schedule_workout ✏️

Mette un workout in calendario a una data; restituisce l'id da usare per rimuoverlo

unschedule_workout ✏️

Toglie un workout dal calendario liberando la data, senza cancellare il workout

get_scheduled_workouts

I workout in calendario in un intervallo di date, con l'id che serve a rimuoverli

delete_workout ✏️

Elimina un workout, dopo averlo tolto dal calendario dove fosse già programmato

download_workout

Scarica un workout in formato FIT per sincronizzarlo sul dispositivo

Piani e percorsi

Strumento

Descrizione

get_training_plans

I piani di allenamento disponibili

get_training_plan_by_id

Il dettaglio di un piano di allenamento

get_courses

I percorsi salvati sull'account

👟 Equipaggiamento

Equipaggiamento

Strumento

Descrizione

get_all_gear

Tutto l'equipaggiamento con i rispettivi UUID, che servono a ogni altro tool gear

get_gear_stats

Le statistiche d'uso di un pezzo di equipaggiamento

get_gear_activities

Le attività in cui un pezzo di equipaggiamento è stato usato

update_gear ✏️

Aggiorna nome, marca, modello e limite di distanza. brandName e modelName finiscono nella stessa etichetta libera, perché marca e modello di catalogo sono un vocabolario che Garmin valida

delete_gear ✏️

Elimina un pezzo di equipaggiamento. L'operazione non è reversibile

link_gear_to_activity ✏️

Associa un pezzo di equipaggiamento a un'attività

remove_gear_from_activity ✏️

Toglie l'associazione fra equipaggiamento e attività

Cataloghi Garmin

Strumento

Descrizione

get_gear_types

I tipi di equipaggiamento previsti da Garmin (scarpe, bici, mazze da golf, altro)

get_gear_makes

Le marche riconosciute da Garmin, con la chiave da usare nel catalogo

Collezioni

Strumento

Descrizione

get_gear_collections

Le collezioni, cioè i gruppi di equipaggiamento usati insieme

get_gear_collection

Il dettaglio di una collezione: equipaggiamento contenuto e tipi di attività associati

create_gear_collection ✏️

Crea una collezione: servono nome e data di primo utilizzo

update_gear_collection ✏️

Aggiorna nome, equipaggiamento e tipi di attività di una collezione (le liste vengono sostituite)

delete_gear_collection ✏️

Elimina una collezione. L'equipaggiamento che conteneva resta

🏅 Obiettivi, badge e sfide

Obiettivi e record

Strumento

Descrizione

get_goals

Gli obiettivi impostati; senza status interroga tutti e tre gli stati e unisce i risultati

get_personal_records

I record personali: categoria, valore, data e, quando c'è, l'attività in cui è stato stabilito

Badge

Strumento

Descrizione

get_earned_badges

I badge conquistati con la data; includeDetails restituisce il record completo

get_available_badges

I badge conquistabili con categoria, difficoltà, punti e avanzamento; includeDetails per il record completo

get_in_progress_badges

I badge iniziati e non ancora completati

Sfide

Strumento

Descrizione

get_badge_challenges

Le sfide badge a cui ci si può iscrivere, senza paginazione

get_available_badge_challenges

Le stesse sfide di get_badge_challenges — è lo stesso endpoint — ma con paginazione (start, limit)

get_non_completed_badge_challenges

Le sfide badge non ancora completate

get_adhoc_challenges

Lo storico delle sfide ad hoc

get_in_progress_virtual_challenges

Le sfide virtuali in corso

⚙️ Profilo, dispositivi e credenziali

Profilo

Strumento

Descrizione

get_user_profile

Il profilo: nome visualizzato e i due id dell'account. profileId è quello con cui è indicizzato il resto dei dati (l'ownerId di un'attività, lo userProfilePK dei dati di benessere); id è un identificativo interno separato

request_reload ✏️

Chiede a Garmin di ricaricare i dati di una data: serve per le giornate vecchie che il servizio ha spostato fuori dalla cache

Dispositivi

Strumento

Descrizione

get_devices

I dispositivi Garmin registrati sull'account, con id, modello, seriale e firmware

get_device_settings

Le impostazioni di un singolo dispositivo

get_device_last_used

Il dispositivo che ha caricato dati più di recente

get_device_alarms

Le sveglie configurate: orario, giorni di ripetizione e stato. Senza deviceId le riporta di tutti i dispositivi

get_primary_training_device

Il dispositivo di allenamento primario e le priorità fra dispositivi

Credenziali

Strumento

Descrizione

setup_credentials ✏️

Salva email e password cifrate nel vault del sistema operativo e verifica subito l'accesso

check_credentials

Lo stato della configurazione: fonte attiva, archivio usato, sessione. Non restituisce mai la password

clear_credentials ✏️

Cancella credenziali cifrate e token OAuth e chiude la sessione


Related MCP server: garmin-mcp

Prerequisiti

  • Node.js 22.0 o superiore

  • npm 8.0 o superiore

  • Claude Desktop installato

  • Account Garmin Connect con credenziali valide

🚀 Installazione Rapida (Bundle Precompilato)

Passaggi:

Il vault del sistema operativo è già incluso. Dalla v4.3.2 il bundle porta con sé i binari di keytar per ogni piattaforma (darwin-x64, darwin-arm64, win32-x64, win32-ia32, linux-x64, linux-arm64): non c'è niente da installare a parte l'estensione. Sulle architetture senza binario, e sulle sessioni Linux senza keyring attivo, la chiave finisce in un file protetto; check_credentials dice quale dei due è in uso.

1. Scarica il bundle

Usa il browser oppure:

wget https://github.com/sedoglia/garmin-mcp-ts/releases/latest/download/garmin-mcp-ts.mcpb

2. Verifica l'integrità

Verifica l'integrità (opzionale ma consigliato):

wget https://github.com/sedoglia/garmin-mcp-ts/releases/latest/download/garmin-mcp-ts.mcpb.sha256
sha256sum -c garmin-mcp-ts.mcpb.sha256

Accanto al bundle ogni release pubblica anche garmin-mcp-ts.sbom.cdx.json, l'elenco completo delle dipendenze contenute nel bundle: vedi SBOM (Software Bill of Materials).

3. Installa l'estensione in Claude Desktop (Metodo Consigliato)

Installazione tramite Custom Desktop Extensions:

  1. Apri Claude Desktop

  2. Vai su Impostazioni (Settings)

  3. Seleziona la scheda Estensioni (Extensions)

  4. Clicca su Impostazioni Avanzate (Advanced settings) e trova la sezione Extension Developer

  5. Clicca su "Installa Estensione..." (Install Extension…)

  6. Seleziona il file .mcpb (garmin-mcp-ts.mcpb scaricato al passaggio 1)

  7. Segui le indicazioni a schermo per completare l'installazione

Nota: Questo è il metodo più semplice e consigliato. L'estensione sarà automaticamente integrata in Claude Desktop senza necessità di configurazione manuale.


4. Configura le Credenziali Garmin

Durante l'installazione Claude Desktop mostra due campi, Garmin Email e Garmin Password: compilali con le credenziali del tuo account Garmin Connect. La password viene conservata nel vault nativo del sistema operativo (Windows Credential Manager, macOS Keychain, Linux Secret Service) e non viene mai scritta in chiaro.

Puoi rivedere o modificare i due campi in qualsiasi momento da Impostazioni → Estensioni → garmin-mcp-ts.

In alternativa, dalla chat: apri una nuova chat su Claude Desktop e scrivi:

Configura le credenziali di accesso per Garmin

Rispondi al messaggio fornendo:

  • Utente: la tua email Garmin

  • Password: la tua password Garmin

Claude usa il tool setup_credentials, che cifra e salva le credenziali nel vault nativo del sistema operativo e verifica subito l'accesso a Garmin Connect. Non serve riavviare.

Nota: Le credenziali NON verranno salvate in file di testo. Saranno sempre crittografate e gestite dal vault nativo del SO. Se hai compilato i campi dell'estensione, quei valori hanno la precedenza su quanto salvato da setup_credentials: per cambiarli, modificali in Impostazioni → Estensioni.

Per verificare la configurazione in qualsiasi momento:

Controlla lo stato delle credenziali Garmin

5. Riavvia Claude Desktop

  • Chiudi completamente l'applicazione

  • Riapri Claude Desktop

  • Verifica in Impostazioni → Sviluppatore lo stato della connessione ✅

🚀 Installazione (clonando il repository con GIT)

1. Clona il Repository

git clone https://github.com/sedoglia/garmin-mcp-ts.git
cd garmin-mcp-ts

2. Installa le Dipendenze

npm install

keytar è una dipendenza opzionale: npm install lo compila o ne scarica il binario, e il vault nativo del sistema operativo viene usato senza altri passaggi. Se quel passaggio fallisce — è normale su una macchina senza toolchain di compilazione — il server ripiega su un file protetto e continua a funzionare; npm run check-encryption dice quale dei due è in uso.

3. Compila il Progetto

npm run build

4. Configura le Credenziali Garmin (Metodo Sicuro - Raccomandato)

Esegui lo script di setup per configurare le credenziali in modo sicuro:

npm run setup-encryption

Questo script:

  1. Crea una directory sicura nella home dell'utente

  2. Genera una chiave di encryption e la salva nel vault nativo del SO

  3. Chiede email e password Garmin

  4. Cripta e salva le credenziali in modo sicuro

Per verificare la configurazione:

npm run check-encryption

4b. Metodo Alternativo (Legacy)

In alternativa, puoi creare un file .env nella root del progetto:

GARMIN_EMAIL=tua.email@esempio.com
GARMIN_PASSWORD=la_tua_password_garmin

Nota sulla Sicurezza: Non commitare mai il file .env nel controllo versione. È già incluso in .gitignore. Si consiglia di usare il metodo sicuro sopra descritto.

Configurazione di Claude Desktop

Posizione del File di Configurazione

Il file di configurazione di Claude Desktop si trova in:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

Esempio di Configurazione

Aggiungi il server MCP Garmin al tuo claude_desktop_config.json:

{
  "mcpServers": {
    "garmin": {
      "command": "node",
      "args": ["C:\\percorso\\a\\garmin-mcp-ts\\dist\\index.js"]
    }
  }
}

Per macOS/Linux:

{
  "mcpServers": {
    "garmin": {
      "command": "node",
      "args": ["/percorso/a/garmin-mcp-ts/dist/index.js"]
    }
  }
}

Verifica della Configurazione

  1. Riavvia Claude Desktop dopo aver salvato la configurazione

  2. Cerca gli strumenti Garmin tra quelli disponibili (icona martello)

  3. Prova a chiedere: "Quali sono le mie attività recenti su Garmin?"

Esempi di Utilizzo

Interrogare le Attività Recenti

"Mostrami le mie ultime 5 attività Garmin"

"Quali attività ho fatto questa settimana?"

Ottenere Metriche di Salute

"Quali sono le mie metriche di salute per oggi?"

"Quanti passi ho fatto ieri?"

Analisi del Sonno

"Come ho dormito la scorsa notte?"

"Mostrami i dati del sonno del 10 dicembre"

Gestione Workout

"Mostrami i miei workout pianificati"

"Scarica il mio ultimo workout"

Training Readiness

"Qual è il mio Training Readiness di oggi?"

"Mostrami il mio Endurance Score"

Progressi e Statistiche

"Quanti km ho corso questo mese?"

"Mostrami il sommario dei miei progressi dell'ultimo mese"

Health Metrics Avanzati

"Qual è stata la mia frequenza cardiaca a riposo oggi?"

"Mostrami gli eventi di tutto il giorno per stress e body battery"

Salute Femminile

"Come influisce il mio ciclo mestruale sulla mia performance di allenamento?"

"In base al mio ciclo, quale tipo di allenamento dovrei fare?"

Gestione Equipaggiamento

"Mostrami tutto il mio equipaggiamento Garmin"

"Quali tipi di equipaggiamento posso gestire?"

"Crea una collezione 'Scarpe Running' e associala alle attività di corsa"

"Mostrami le mie collezioni di equipaggiamento"

Commenti e Privacy

"Mostrami i commenti sulla mia ultima attività"

"Imposta la mia ultima corsa come privata"

Metriche Training Avanzate

"Come sta andando il mio carico di allenamento questo mese?"

"Qual è il mio rapporto acuto/cronico? Sono a rischio infortuni?"

Analisi Attività

"Confronta le mie ultime 3 corse"

"Trova attività simili alla mia corsa di domenica scorsa"

"Analizza il mio allenamento dell'ultimo mese"

Test

Esegui i test con dati reali:

npm test

Lo script esercita 91 dei 110 tool contro il tuo account Garmin: tutti quelli di sola lettura, più il ciclo di vita completo di un workout (crea → modifica → schedula → togli dal calendario → elimina) e quello di una collezione gear. Restano fuori i tre tool delle credenziali e i tool che scrivono altri dati sull'account — pesate, pressione, idratazione, attività manuali, upload, modifiche all'equipaggiamento — che vanno provati a mano su dati che sei disposto a perdere.

Architettura

garmin-mcp-ts/
├── src/
│   ├── index.ts           # Punto di ingresso, gestione stdout/stderr
│   ├── garmin/
│   │   ├── client.ts      # Client API Garmin Connect (~3700 righe)
│   │   ├── auth.ts        # Login, sessione e rinnovo dei token OAuth
│   │   └── simple-login.ts # Utility standalone per provare il login
│   ├── mcp/
│   │   ├── server.ts      # Setup server MCP e gestori richieste
│   │   ├── tools.ts       # Definizioni strumenti e schemi (110 tool)
│   │   └── handlers.ts    # Logica implementazione strumenti
│   ├── utils/
│   │   ├── constants.ts   # Costanti dell'applicazione, nomi dei tool compresi
│   │   ├── credentials.ts # Risoluzione delle credenziali fra estensione, vault e .env
│   │   ├── errors.ts      # Classi di errore personalizzate
│   │   ├── logger.ts      # Utility di logging (solo stderr)
│   │   ├── stdio-guard.ts # Impedisce ad altro codice di scrivere su stdout e rompere il protocollo
│   │   └── secure-storage.ts # Storage cifrato e accesso al vault del SO
│   ├── test-tools.ts      # Suite che esercita i tool su un account reale (npm test)
│   └── test-oauth.ts      # Diagnostica del flusso OAuth
├── scripts/
│   ├── setup-encryption.ts  # Script interattivo per setup credenziali
│   ├── check-encryption.ts  # Script diagnostico per verificare encryption
│   ├── sync-manifest.ts     # Rigenera e verifica manifest.json dal codice
│   ├── fetch-keytar-prebuilds.mjs # Scarica i binari keytar di tutte le piattaforme
│   └── test-keytar.ts       # Script diagnostico per testare l'integrazione con Keytar
├── vendor/keytar/         # Binari keytar per piattaforma, inclusi nel bundle
├── dist/                  # Output JavaScript compilato
├── manifest.json          # Manifest MCPB del bundle (generato in parte da sync-manifest)
├── PRIVACY.md             # Privacy policy referenziata dal manifest
├── CHANGELOG.md           # Cronologia delle versioni (CHANGELOG_EN.md in inglese)
├── package.json
└── tsconfig.json

📦 Costruire il bundle .mcpb

Il bundle pubblicato viene costruito dal workflow Release, che allega .mcpb, .sha256 e l'SBOM CycloneDX a una release in bozza. Si attiva in due modi:

  • dal tag: git tag v4.3.1 && git push origin v4.3.1;

  • a mano: Actions → Release → Run workflow, indicando il tag da pubblicare. Se non esiste ancora, il workflow lo crea dal ramo selezionato; se esiste, costruisce quello che il tag contiene.

La release nasce in bozza. La casella publish la pubblica: lanciando di nuovo il workflow sullo stesso tag con quella casella spuntata, la bozza esistente viene pubblicata senza toccarne gli allegati.

Pubblicata la release, riporta in locale quello che gli utenti scaricano:

npm run fetch:release            # l'ultima release pubblicata
npm run fetch:release -- v4.6.0  # un tag preciso

Gli allegati finiscono in releases/ (ignorata da git), presi dalla release stessa e non da un pack locale, e il .mcpb viene verificato contro il suo .sha256. È il file da inviare alla directory MCP o da aprire in Claude Desktop per provare la build spedita; lo script vede solo le release pubblicate, una bozza non conta.

Le note della release stanno in .github/release-notes/<tag>.md. Se il file esiste il workflow lo usa come testo della release, altrimenti ripiega sull'elenco automatico delle pull request. Per correggere il testo di una release già pubblicata basta modificare il file e rilanciare il workflow: gli allegati non vengono toccati.

In entrambi i casi il workflow rifiuta di procedere se il tag non corrisponde alla versione dichiarata nel manifest. La versione è dichiarata in cinque punti, che vanno alzati insieme prima di taggare: package.json, manifest.json, SERVER_VERSION in src/utils/constants.ts (è quella che il server annuncia nell'handshake MCP) e, in entrambi i README, il badge e la riga della release qui sopra. I link di download puntano invece a releases/latest e non vanno mai toccati. Alzata la versione, rigenera anche l'SBOM con npm run sbom: il componente radice ne riporta il numero, e check:sbom fallirebbe in CI.

Per costruire il bundle in locale:

npm ci
npm run pack        # build + controllo manifest + validazione + pack

Il bundle esce nella radice del repository come garmin-mcp-ts.mcpb, con il suo .sha256 accanto, ed è lo stesso che pubblica la release. mcpb pack archivia node_modules così come lo trova, quindi impacchettare l'albero di sviluppo direttamente ci infilerebbe anche TypeScript, tsx ed esbuild: una quindicina di MB che nessun utente carica mai. Per evitarlo scripts/pack.mjs copia in una directory temporanea le sole dipendenze di produzione — le stesse che il workflow installa con npm ci --omit=dev — e impacchetta quella.

Se cambi, aggiungi o rimuovi un tool, rigenera l'elenco dichiarato nel manifest:

npm run sync:manifest

npm run check:manifest fa fallire la CI quando manifest e codice divergono: la directory MCP legge il manifest e la risposta di tools/list, e un disallineamento fra i due si scopre altrimenti solo in fase di review.

📋 SBOM (Software Bill of Materials)

Un SBOM è l'inventario formale di tutto ciò che compone un software: ogni dipendenza, diretta e transitiva, con versione, licenza e provenienza. Serve a rispondere in fretta a domande come «questa release contiene la libreria X nella versione vulnerabile?» senza dover ricostruire l'albero delle dipendenze a mano. GitHub ne dà una buona introduzione in What is an SBOM?.

Questo progetto pubblica il proprio SBOM in formato CycloneDX 1.6 (JSON), lo standard OWASP / ECMA-424 letto dalla maggior parte degli strumenti di analisi:

  • sbom.cdx.json nella radice del repository, che descrive il ramo main corrente;

  • garmin-mcp-ts.sbom.cdx.json allegato a ogni release, che descrive esattamente il bundle pubblicato accanto:

    wget https://github.com/sedoglia/garmin-mcp-ts/releases/latest/download/garmin-mcp-ts.sbom.cdx.json

L'SBOM elenca le sole dipendenze che finiscono nel bundle .mcpb — quelle di produzione, più keytar che è opzionale — risolte da package-lock.json. Per ogni componente riporta nome, versione, licenza dichiarata, Package URL (pkg:npm/axios@1.20.0) e l'hash SHA-512 del tarball npm; la sezione dependencies conserva l'albero, così si vede da quale dipendenza diretta arriva ciascuna transitiva. Le dipendenze di sviluppo (TypeScript, tsx, il packer, il generatore stesso) non compaiono, per la stessa ragione per cui non sono nel bundle: nessun utente le carica.

Il file è generato con @cyclonedx/cyclonedx-npm in modalità riproducibile: niente numero di serie né timestamp, quindi cambia solo quando cambia una dipendenza. Si rigenera con:

npm run sbom

npm run check:sbom fa fallire la CI quando sbom.cdx.json non corrisponde più al lockfile, esattamente come check:manifest per il manifest; anche il workflow di release lo verifica prima di allegarlo.

Per interrogarlo, qualunque strumento che legga CycloneDX va bene. Due esempi con scanner di vulnerabilità che lavorano direttamente sull'SBOM, senza bisogno di node_modules:

grype sbom:sbom.cdx.json
trivy sbom sbom.cdx.json

🔐 Architettura di Sicurezza

Il sistema di sicurezza utilizza un'architettura a due livelli per proteggere le credenziali:

Dove vengono salvati i dati

Sistema Operativo

Chiave di Encryption

Dati Criptati

Windows

Windows Credential Manager

%LOCALAPPDATA%\garmin-mcp\

macOS

Keychain (Face ID/Touch ID)

~/Library/Application Support/garmin-mcp/

Linux

Secret Service (D-Bus/GNOME)

~/.config/garmin-mcp/

Come funziona

  1. Chiave di Encryption: Una chiave AES-256 viene generata alla prima esecuzione e salvata nel vault nativo del SO

  2. Credenziali: Email e password vengono cifrate con AES-256-GCM e salvate in garmin-credentials.enc

  3. Token OAuth: I token vengono cifrati e salvati in garmin-tokens.enc per riutilizzo sessione

Perché è sicuro

  • La chiave non è mai su disco in chiaro: È nel vault hardware/software del SO

  • Se il repository viene esposto: I dati rimangono inutili senza la chiave

  • Se il PC viene clonato: I dati sono inaccessibili (la chiave rimane nel vault dell'utente originale)

  • Encryption forte: AES-256-GCM con IV casuale per ogni operazione

Fallback

Se keytar non è disponibile (vault nativo), il sistema usa un file .encryption.key con permessi ristretti (0o600) nella directory dati.

Verifica stato encryption

Per verificare lo stato completo dell'encryption e keytar:

npm run check-encryption

Per testare l'integrazione con keytar:

npm run test-keytar

⚠️ Limitazioni Note

Limitazioni API Garmin OAuth

Alcuni endpoint e funzionalità non sono disponibili tramite l'API OAuth pubblica di Garmin:

Commenti alle Attività

  • ✅ Lettura commenti (get_activity_comments): Funzionante

  • ❌ Scrittura commenti (add_activity_comment): NON SUPPORTATO dall'API OAuth

    • I commenti possono essere aggiunti solo tramite:

      • Web interface di Garmin Connect

      • App mobile Garmin Connect

      • NON disponibile via API OAuth

Privacy Attività

  • ✅ Impostare privacy (set_activity_privacy): Funzionante

    • ✅ public: Funziona correttamente

    • ✅ private: Funziona correttamente

    • ✅ subscribers: Funziona correttamente (è "solo connessioni" in Garmin Connect)

    • ❌ followers: NON SUPPORTATO - non è una chiave valida, restituisce 400. La chiave corretta è subscribers

    Il livello attuale si legge da accessControlRuleDTO in get_activity_details: leggerlo prima di modificarlo evita di sovrascrivere subscribers con public.

Gear Management

  • ✅ Lista gear (get_all_gear): Funzionante (via endpoint filterGear)

  • ✅ Aggiorna/elimina gear (update_gear, delete_gear): Funzionante (update_gear era rotto fino alla v4.5.3)

  • ❌ Creazione gear (create_gear): NON DISPONIBILE - l'endpoint esiste ma il suo payload non è documentato: risponde 500 senza indicare quale campo rifiuti

    • I gear possono essere creati solo tramite:

  • ✅ Collezioni gear (CRUD completo): Funzionante

Metriche Avanzate (Dipende dal Dispositivo)

Alcune metriche potrebbero non essere disponibili a seconda del modello di smartwatch:

Metrica

Dispositivi Supportati

Note

get_endurance_score

Solo dispositivi premium (Fenix 7+, Forerunner 955+)

Non disponibile su Instinct 2 Solar

get_training_readiness

Richiede rilevazione HRV notturna

Assente se il dispositivo non registra l'HRV

get_floors

Richiede barometro

Assente sui dispositivi senza altimetro barometrico

get_intensity_minutes

Tutti i dispositivi

—

get_training_load

Richiede 7+ giorni di dati

Snapshot alla data richiesta, non un aggregato del range

get_load_ratio

Richiede 4+ settimane consecutive

Calcolato su storico esteso

get_performance_condition

Durante attività

Garmin non la espone come metrica giornaliera: usare get_activity_details

Nota: Alcune metriche sono visibili nell'app Garmin Connect ma potrebbero non essere esposte tramite API OAuth.

Risoluzione dei Problemi

Problemi Comuni

Autenticazione Fallita

  1. Verifica che le tue credenziali Garmin siano corrette

  2. Controlla di poter accedere manualmente a connect.garmin.com

  3. Assicurati che non ci siano caratteri speciali nella password che potrebbero richiedere escape

Rate Limiting (Errore 429)

Garmin potrebbe bloccare temporaneamente le richieste se ne vengono fatte troppe in un breve periodo. Attendi qualche minuto e riprova.

Il Server Non Appare in Claude Desktop

  1. Controlla che il percorso a dist/index.js sia corretto e assoluto

  2. Verifica che la sintassi del JSON di configurazione sia valida

  3. Riavvia completamente Claude Desktop

  4. Controlla i log di Claude Desktop per eventuali errori

Visualizzare i Log

Il server produce informazioni diagnostiche su stderr. In Claude Desktop, controlla i log dell'applicazione:

  • Windows: %APPDATA%\Claude\logs\

  • macOS: ~/Library/Logs/Claude/

Crediti e Ringraziamenti

Questo progetto è stato ispirato e costruito sul lavoro di diversi progetti open-source:

Un ringraziamento speciale ai manutentori del pacchetto npm garmin-connect.

La storia completa del progetto, versione per versione, è nel CHANGELOG.

Contribuire

I contributi sono benvenuti! Sentiti libero di inviare una Pull Request.

  1. Fai il fork del repository

  2. Crea il tuo branch per la feature (git checkout -b feature/FunzionalitàIncredibile)

  3. Committa le tue modifiche (git commit -m 'Aggiunge una FunzionalitàIncredibile')

  4. Pusha il branch (git push origin feature/FunzionalitàIncredibile)

  5. Apri una Pull Request

Licenza

Questo progetto è rilasciato sotto Licenza MIT - vedi il file LICENSE per i dettagli.

Privacy Policy

Questo progetto rispetta la tua privacy. Per informazioni complete su come vengono gestiti i tuoi dati, consulta la nostra Privacy Policy.

  • Dati raccolti: Credenziali Garmin (email e password) e token OAuth

  • Archiviazione: Tutti i dati sono crittografati localmente con AES-256-GCM e salvati nel vault nativo del sistema operativo

  • Trasmissione: I dati vengono trasmessi solo ai server Garmin Connect per l'autenticazione e il recupero dei dati

  • Nessun server di terze parti: Non raccogliamo, non memorizziamo e non trasmettiamo i tuoi dati a server di terze parti

  • Controllo locale: Tutti i dati rimangono sul tuo dispositivo sotto il tuo controllo

Disclaimer

Questo progetto non è affiliato, approvato o connesso a Garmin Ltd. o alle sue sussidiarie. Garmin e Garmin Connect sono marchi registrati di Garmin Ltd.


Supporta lo Sviluppo

Se questo progetto ti è utile, considera di supportarlo con una donazione!

PayPal

English | Italiano | Segnala Problemi

Available Tools

110 tools
add_hydration_dataAdd Hydration DataB
Destructive

Add hydration/water intake data in milliliters.

Inputs: valueInMl (required), date, timestamp.

add_weigh_inAdd Weigh-InA
Destructive

Add a new weigh-in record. Weight and body fat are stored; the water, muscle and bone percentages are accepted but Garmin discards them on a manual entry, keeping them only for measurements a smart scale uploads.

Inputs: date (required), weight (required), bodyFatPercent, boneMassPercent, +2 more.

analyze_training_periodAnalyze Training PeriodA
Read-only

Comprehensive analysis of training trends, volume, and patterns over a date range.

Inputs: endDate (required), startDate (required).

check_credentialsCheck Garmin CredentialsA
Read-only

Report whether Garmin credentials are configured, which source they come from, where the encrypted data is stored and whether the session is authenticated. Never returns the password.

Inputs: no named parameters.

clear_credentialsClear Garmin CredentialsA
Destructive

Delete the encrypted credentials and OAuth tokens from secure storage and end the current session. Credentials supplied through the extension settings are not affected and must be cleared there.

Inputs: no named parameters.

compare_activitiesCompare ActivitiesA
Read-only

Compare 2-5 activities side by side: distance, duration, speed, heart rate, calories, elevation, steps and training effect.

Inputs: activityIds (required).

count_activitiesCount ActivitiesA
Read-only

Count the activities in Garmin Connect, over the whole history or over a date range.

Inputs: endDate, startDate.

create_gear_collectionCreate Gear CollectionB
Destructive

Create a new gear collection to group equipment used together (e.g., running kit, bike components). Requires a name and first use date.

Inputs: name (required), firstUseDate (required), activityTypes.

create_manual_activityCreate Manual ActivityC
Destructive

Create a manual activity entry in Garmin Connect.

Inputs: duration (required), startTime (required), activityName (required), activityType (required), +3 more.

create_workoutCreate WorkoutA
Destructive

Create a new structured workout in Garmin Connect. Supports complex interval workouts with warmup, cooldown, and repeat blocks.

Example for interval running workout: { "workoutName": "5x3min Intervals", "sportType": "running", "description": "Interval training", "workoutSegments": [{ "segmentOrder": 1, "sportType": "running", "workoutSteps": [ { "stepOrder": 1, "stepType": "warmup", "endCondition": "time", "endConditionValue": 600 }, { "stepOrder": 2, "stepType": "interval", "endCondition": "time", "endConditionValue": 180, "targetType": "pace" }, { "stepOrder": 3, "stepType": "recovery", "endCondition": "time", "endConditionValue": 120 }, { "stepOrder": 4, "stepType": "cooldown", "endCondition": "time", "endConditionValue": 600 } ] }] }

Inputs: sportType (required), workoutName (required), workoutSegments (required), description.

delete_activityDelete ActivityA
Destructive

Delete an activity from Garmin Connect. WARNING: This action cannot be undone.

Inputs: activityId (required).

delete_blood_pressureDelete Blood PressureA
Destructive

Delete a blood pressure reading. Use get_blood_pressure with the /all endpoint to find the version ID.

Inputs: date (required), version (required).

delete_gearDelete GearA
Destructive

Delete a piece of gear/equipment. WARNING: This cannot be undone.

Inputs: gearUUID (required).

delete_gear_collectionDelete Gear CollectionA
Destructive

Delete a gear collection. WARNING: This cannot be undone. The gear items in the collection will NOT be deleted.

Inputs: collectionUUID (required).

delete_weigh_inDelete Weigh-InA
Destructive

Permanently delete a single weigh-in record, identified by its weigh-in ID (the samplePk from get_weigh_ins or get_body_composition). The measurement cannot be recovered afterwards. Pass date when the weigh-in was back-dated to a day other than the one it was entered on.

Inputs: weighInId (required), date.

delete_workoutDelete WorkoutB
Destructive

Delete a workout from Garmin Connect.

Inputs: workoutId (required).

download_activityDownload ActivityA
Read-only

Download an activity in various formats (FIT, TCX, GPX, KML, CSV).

Inputs: activityId (required), format.

download_workoutDownload WorkoutA
Read-only

Download a workout in FIT format for syncing to a Garmin device.

Inputs: workoutId (required).

find_similar_activitiesFind Similar ActivitiesA
Read-only

Find activities similar to a reference activity by type, distance and duration (within 20% tolerance). Returns the closest matches first, each with its full metrics and a similarity score.

Inputs: activityId (required), limit, searchDepth.

get_activities_by_dateGet Activities by DateA
Read-only

Get all activities within a date range, optionally filtered by type. Each one is summarised the same way list_recent_activities summarises them.

Inputs: startDate (required), limit, endDate, sortOrder, +2 more.

get_activity_commentsGet Activity CommentsB
Read-only

Get all comments on an activity.

Inputs: activityId (required).

get_activity_detailsGet Activity DetailsA
Read-only

Get detailed information about a specific activity including splits, heart rate zones, and GPS data.

Inputs: activityId (required).

get_activity_exercise_setsGet Activity Exercise SetsA
Read-only

Get exercise sets from a strength training activity.

Inputs: activityId (required).

get_activity_hr_zonesGet Activity HR ZonesA
Read-only

Get time spent in each heart rate zone during an activity.

Inputs: activityId (required).

get_activity_splitsGet Activity SplitsA
Read-only

Get split/lap data for a specific activity including pace, distance, and time for each split.

Inputs: activityId (required).

get_activity_typed_splitsGet Activity Typed SplitsA
Read-only

Get typed splits for an activity (more detailed than regular splits, useful for bouldering, strength training, etc.).

Inputs: activityId (required).

get_activity_typesGet Activity TypesA
Read-only

Get all activity types available in Garmin Connect.

Inputs: no named parameters.

get_activity_weatherGet Activity WeatherC
Read-only

Get weather conditions during an activity.

Inputs: activityId (required).

get_adhoc_challengesGet Ad-hoc ChallengesC
Read-only

Get ad-hoc challenges history.

Inputs: no named parameters.

get_all_day_eventsGet All Day EventsA
Read-only

Get all daily events including auto-detected activities that may not have been recorded.

Inputs: date (required).

get_all_day_stressGet Stress by HourA
Read-only

Get the stress of a day hour by hour: average, maximum and stress band for each hour, plus the totals for the day. Use this to see when stress rose or fell; use get_stress_data for the day as a whole, and its includeValues for the individual three-minute samples.

Inputs: date.

get_all_gearGet All GearA
Read-only

Get complete list of all gear/equipment with their UUIDs. This solves the UUID problem - you can now discover all gear without needing to manually find UUIDs in the web interface.

Inputs: no named parameters.

get_available_badge_challengesGet Available Badge ChallengesB
Read-only

Get available badge challenges to join.

Inputs: limit, start.

get_available_badgesGet Available BadgesA
Read-only

Get all badges available to earn, as id, key, name, category, difficulty, points and, where set, the active window and progress. Set includeDetails for the full badge records.

Inputs: includeDetails.

get_badge_challengesGet Badge ChallengesB
Read-only

Get available badge challenges.

Inputs: no named parameters.

get_blood_pressureGet Blood PressureA
Read-only

Get blood pressure readings for a date range.

Inputs: endDate (required), startDate (required).

get_body_batteryGet Body BatteryA
Read-only

Get Body Battery energy level data for a date range. Body Battery tracks energy levels (0-100) throughout the day based on sleep, stress, and activity. Shows charged/drained periods and sleep quality impact.

Inputs: endDate, startDate.

get_body_battery_eventsGet Body Battery EventsA
Read-only

Get Body Battery events for a date (sleep, activities, naps that affected energy levels).

Inputs: date (required).

get_body_compositionGet Body CompositionA
Read-only

Get body composition measurements (weight, BMI, body fat, muscle and bone mass) over a period, plus the average across the period.

Inputs: days, endDate.

get_coursesGet CoursesA
Read-only

Get saved routes/courses from Garmin Connect.

Inputs: limit, start.

get_daily_stepsGet Daily StepsA
Read-only

Get daily step counts for a date range (max 28 days per request, auto-chunked for longer ranges).

Inputs: endDate (required), startDate (required).

get_daily_summaryGet Daily SummaryA
Read-only

Get a compact daily summary: steps and goal, calories, distance, floors, intensity minutes, resting/min/max heart rate, stress, body battery and time breakdown. Use get_heart_rate for the full heart rate series.

Inputs: date.

get_device_alarmsGet Device AlarmsA
Read-only

Get the alarms configured on a Garmin device, with time, repeat days and whether each one is on. Without a deviceId every registered device is reported.

Inputs: deviceId.

get_device_last_usedGet Device Last UsedA
Read-only

Get the Garmin device that uploaded data most recently, with its id, name and upload time.

Inputs: no named parameters.

get_devicesGet DevicesA
Read-only

List the Garmin devices registered on the account with their id, model, serial and firmware version. Use get_device_settings for the configuration of a single device.

Inputs: no named parameters.

get_device_settingsGet Device SettingsA
Read-only

Get settings for a specific Garmin device.

Inputs: deviceId (required).

get_earned_badgesGet Earned BadgesA
Read-only

Get all badges earned by the user, as id, key, name, category, difficulty, points and the date earned. Set includeDetails for the full badge records.

Inputs: includeDetails.

get_endurance_scoreGet Endurance ScoreB
Read-only

Get endurance score based on recent training load.

Inputs: date.

get_fitness_ageGet Fitness AgeA
Read-only

Get fitness age estimation based on VO2 max and other metrics.

Inputs: date.

get_fitness_statsGet Fitness StatsA
Read-only

Get aggregated fitness statistics between two dates.

Inputs: endDate (required), startDate (required), metric, groupByActivities.

get_floorsGet FloorsA
Read-only

Get the floors climbed and descended on a date. Returns the daily totals; set includeBreakdown to also get the 96 quarter-hour intervals behind them.

Inputs: date, includeBreakdown.

get_gear_activitiesGet Gear ActivitiesB
Read-only

Get activities where a specific piece of gear was used. Note: Requires the gear UUID from Garmin Connect web interface.

Inputs: gearUUID (required), limit.

get_gear_collectionGet Gear Collection DetailsA
Read-only

Get detailed information about a specific gear collection, including the gear items in the collection and associated activity types.

Inputs: collectionUUID (required).

get_gear_collectionsGet Gear CollectionsA
Read-only

Get all gear collections. Collections group gear items that are used together (e.g., running kit, bike components).

Inputs: no named parameters.

get_gear_makesGet Gear MakesA
Read-only

Get all available gear brands/makes (e.g., Nike, Adidas, ASICS, Brooks). Returns make names and primary keys.

Inputs: no named parameters.

get_gear_statsGet Gear StatsA
Read-only

Get usage statistics for a specific piece of gear. Note: Requires the gear UUID which can be found in Garmin Connect web interface URL.

Inputs: gearUUID (required).

get_gear_typesGet Gear TypesA
Read-only

Get all available gear/equipment types (e.g., Shoes, Bike, Golf Clubs, Other). Returns type names and primary keys used when creating gear.

Inputs: no named parameters.

get_goalsGet GoalsA
Read-only

Get user goals. Without a status every status is queried in turn and the results are merged, each goal carrying the status it was found under.

Inputs: status.

get_health_metricsGet Health MetricsA
Read-only

Get daily health metrics including heart rate data and step count for a specific date.

Inputs: date.

get_heart_rateGet Heart RateA
Read-only

Get detailed heart rate data for a specific date including resting HR, max HR, and HR zones.

Inputs: date.

get_hill_scoreGet Hill ScoreB
Read-only

Get hill score data indicating climbing/vertical performance.

Inputs: startDate (required), endDate.

get_hrv_dataGet HRV DataA
Read-only

Get Heart Rate Variability (HRV) data for a specific date. HRV measures the variation in time between heartbeats, indicating recovery and stress levels.

Inputs: date.

get_hydrationGet HydrationA
Read-only

Get daily hydration/water intake data for a specific date.

Inputs: date.

get_in_progress_badgesGet In-Progress BadgesA
Read-only

Get badges that are currently in progress (started but not completed).

Inputs: no named parameters.

get_in_progress_virtual_challengesGet In-Progress Virtual ChallengesA
Read-only

Get virtual challenges that are currently in progress.

Inputs: limit, start.

get_intensity_minutesGet Intensity MinutesA
Read-only

Get intensity minutes (moderate and vigorous) for a date, or for a date range when endDate is given, together with the weekly totals and goal.

Inputs: date, endDate.

get_load_ratioGet Load RatioB
Read-only

Get acute/chronic workload ratio indicating training balance and injury risk.

Inputs: date (required).

get_max_metricsGet Max MetricsC
Read-only

Get max metrics including VO2 max and related fitness data.

Inputs: date.

get_menstrual_dataGet Menstrual DataA
Read-only

Get menstrual cycle data for a specific date.

Inputs: date (required).

get_non_completed_badge_challengesGet Non-Completed Badge ChallengesA
Read-only

Get badge challenges that have not been completed yet.

Inputs: limit, start.

get_performance_conditionGet Performance ConditionA
Read-only

Get the performance condition score for a date. Garmin records this per activity rather than daily, so it is usually only available through get_activity_details.

Inputs: date (required).

get_personal_recordsGet Personal RecordsA
Read-only

Get all personal records (PRs). Each record carries a typeId identifying its category, its value, the date it was set and, for records set during an activity, that activity.

Inputs: no named parameters.

get_pregnancy_summaryGet Pregnancy SummaryB
Read-only

Get pregnancy tracking summary/snapshot data.

Inputs: no named parameters.

get_primary_training_deviceGet Primary Training DeviceB
Read-only

Get information about the primary training device and device priorities.

Inputs: no named parameters.

get_progress_summaryGet Progress SummaryB
Read-only

Get aggregated progress summary between two dates.

Inputs: endDate (required), startDate (required), metric.

get_race_predictionsGet Race PredictionsA
Read-only

Get predicted race times for 5K, 10K, half marathon, and marathon based on current fitness.

Inputs: no named parameters.

get_respiration_dataGet Respiration DataA
Read-only

Get respiration/breathing rate data for a specific date. Shows breaths per minute throughout the day and during sleep.

Inputs: date.

get_rhr_dayGet Resting Heart RateC
Read-only

Get resting heart rate for a specific day.

Inputs: date (required).

get_scheduled_workoutsGet Scheduled WorkoutsA
Read-only

List the workouts scheduled on the Garmin calendar in a date range, with the workoutScheduleId needed to unschedule them. Defaults to the next 12 months.

Inputs: endDate, startDate.

get_sleep_dataGet Sleep DataA
Read-only

Get a night of sleep: duration, sleep stages, quality score and the nightly summary. The per-minute series behind it (movement, heart rate, stress, body battery, HRV, respiration) are reported as counts only; set includeTimeSeries to inline them, or use the dedicated tool for the one series you need.

Inputs: date, includeTimeSeries.

get_sleep_movementGet Sleep MovementB
Read-only

Get movement data during sleep including restless moments.

Inputs: date (required).

get_spo2_dataGet SpO2 DataA
Read-only

Get SpO2 (blood oxygen saturation) data for a specific date. Shows pulse oximetry readings as percentage (typically 95-100% is normal).

Inputs: date.

get_stepsGet StepsB
Read-only

Get step count for a specific date. Returns the total number of steps recorded.

Inputs: date.

get_steps_dataGet Steps DataA
Read-only

Get detailed step data chart for a specific date with timestamps.

Inputs: date (required).

get_stress_dataGet Stress DataA
Read-only

Get stress for a date on the 0-100 scale (0-25 resting, 26-50 low, 51-75 medium, 76-100 high). Returns average/max/min and the seconds spent in each band; set includeValues to also get the ~460 three-minute samples. The average and maximum are the day figures Garmin itself reports, so they match the Connect app; the minimum and the band seconds are derived from the samples. Use get_all_day_stress for the same day broken down hour by hour.

Inputs: date, includeValues.

get_training_loadGet Training LoadA
Read-only

Get the monthly training load balance (low aerobic, high aerobic, anaerobic) against its target ranges. This is a snapshot taken on endDate, not an aggregate over the range.

Inputs: startDate (required), endDate.

get_training_plan_by_idGet Training Plan by IDB
Read-only

Get detailed information about a specific training plan.

Inputs: planId (required).

get_training_plansGet Training PlansB
Read-only

Get all available training plans.

Inputs: no named parameters.

get_training_readinessGet Training ReadinessB
Read-only

Get training readiness score indicating how prepared your body is for training.

Inputs: date.

get_training_statusGet Training StatusA
Read-only

Get the training status for a date: status and feedback phrase, VO2 max, fitness trend, acute and chronic training load and the acute/chronic workload ratio.

Inputs: date.

get_user_profileGet User ProfileA
Read-only

Get user profile information: display name, user name, full name and both account ids. profileId is the one other Garmin data is keyed by (the ownerId on an activity, the userProfilePK on wellness records); id is a separate internal identifier.

Inputs: no named parameters.

get_user_summaryGet User SummaryB
Read-only

Get comprehensive user activity summary for a specific date including steps, calories, distance, active minutes, and more.

Inputs: date (required).

get_weigh_insGet Weigh-InsA
Read-only

Get weigh-in records for a date range.

Inputs: endDate (required), startDate (required).

get_workout_by_idGet Workout by IDA
Read-only

Get detailed information about a specific workout by its ID.

Inputs: workoutId (required).

get_workoutsGet WorkoutsA
Read-only

Get list of scheduled/planned workouts from Garmin Connect.

Inputs: limit, start.

list_recent_activitiesList Recent ActivitiesA
Read-only

Get a list of recent activities from Garmin Connect. Each one is summarised: name, type, date, distance, duration, speed, heart rate, calories, elevation, steps and training effect. Use get_activity_details for one activity in full.

Inputs: limit, start, includeDetails.

remove_gear_from_activityRemove Gear from ActivityA
Destructive

Remove/unlink a piece of gear from an activity. Note: Requires the gear UUID from Garmin Connect web interface.

Inputs: gearUUID (required), activityId (required).

request_reloadRequest Data ReloadA
Destructive

Request reload of data for a specific date (useful for older data that was offloaded by Garmin).

Inputs: date (required).

schedule_workoutSchedule WorkoutA
Destructive

Schedule an existing workout on a specific date. Returns a workoutScheduleId that can be used to unschedule.

Inputs: date (required), workoutId (required).

set_activity_nameSet Activity NameA
Destructive

Change the name of an existing activity.

Inputs: name (required), activityId (required).

set_activity_privacySet Activity PrivacyA
Destructive

Change the privacy of an activity. "subscribers" is what Garmin Connect shows as "connections only". Read the current level from accessControlRuleDTO in get_activity_details before changing it.

Inputs: privacy (required), activityId (required).

set_activity_typeSet Activity TypeB
Destructive

Change the type/category of an existing activity.

Inputs: typeKey (required), activityId (required), typeId.

set_blood_pressureSet Blood PressureB
Destructive

Record a blood pressure reading.

Inputs: pulse (required), dateTime (required), systolic (required), diastolic (required), +1 more.

setup_credentialsSetup Garmin CredentialsA
Destructive

Store Garmin Connect credentials encrypted in the OS native vault and log in immediately. Use this when the server reports that credentials are missing or invalid. The password is encrypted at rest and never written to a plain text file.

Inputs: email (required), password (required).

unschedule_workoutUnschedule WorkoutA
Destructive

Remove a scheduled workout from the calendar. Use get_scheduled_workouts to look up a workoutScheduleId. delete_workout unschedules on its own, so this is only needed to free a date while keeping the workout.

Inputs: scheduleId (required).

update_gearUpdate GearC
Destructive

Update existing gear/equipment details.

Inputs: gearUUID (required), brandName, modelName, displayName, +1 more.

update_gear_collectionUpdate Gear CollectionA
Destructive

Update an existing gear collection. Can change name, add/remove gear items, or change associated activity types.

Inputs: collectionUUID (required), name, gearUUIDs, firstUseDate, +1 more.

update_workoutUpdate WorkoutA
Destructive

Update an existing workout (name, description, or structure).

Inputs: workoutId (required), description, workoutName, workoutSegments.

upload_activityUpload ActivityA
Destructive

Upload an activity file (FIT, GPX, TCX format) to Garmin Connect.

Inputs: filePath (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 110 tools

    Disambiguation3/5

    Many tools are distinct, but there is notable overlap among health metrics tools (get_steps, get_steps_data, get_daily_steps, get_health_metrics, get_daily_summary, get_user_summary) and stress tools (get_stress_data, get_all_day_stress). Descriptions help somewhat, but an agent could easily pick the wrong one for a given need.

    Naming Consistency4/5

    The vast majority follow a consistent get_/set_/add_/delete_/create_/update_ verb_noun pattern. Minor deviations like request_reload, setup_credentials, check_credentials, clear_credentials, and compare_activities/find_similar_activities are acceptable but break the strict pattern slightly.

    Tool Count2/5

    110 tools is far beyond the typical well-scoped server. While Garmin Connect has a broad API, this surface is sprawling and would be difficult for an agent to navigate efficiently. Many tools could be consolidated (e.g., multiple step/health summary tools).

    Completeness4/5

    The tool set covers an impressively wide range of Garmin Connect functionality: activities, workouts, devices, health metrics, gear, badges, challenges, and credentials. Minor gaps exist (e.g., no tool for updating device settings or managing challenges), but the core domains are well covered.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables Claude Desktop to access and analyze Garmin wearable health data including sleep, HRV, Body Battery, and activity metrics. Users can query their health trends, track recovery, and generate interactive HTML dashboards using natural language.
      9
      7
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Connects Garmin watch data to Claude Desktop, allowing users to ask natural language questions about their health and activity data from Garmin Connect.
      -
    • A
      license
      B
      quality
      B
      maintenance
      Enables users to analyze their own Garmin Connect data—activities, sleep, HRV, Body Battery, training readiness—directly inside Claude Desktop.
      13
      864 npm
      2
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Daash connects Garmin Connect to ChatGPT and Claude. Your assistant reads your runs, splits, sleep, HRV, Body Battery and recovery, and writes structured workouts and whole training plans to your Garmin calendar, so they're on your watch at the next sync. Free, hosted, open source. Works on free Claude.
      26
      5
      MIT