LibreLink MCP Server
# LibreLink MCP Server - Fixed for API v4.16.0
๐ฌ๐ง [English](README.en.md) | ๐ฎ๐น [Italiano](README.md)
๐ฉธ Server MCP per accedere ai dati glicemici FreeStyle Libre tramite Claude Desktop.
**Questa รจ una versione corretta** che supporta le modifiche API introdotte l'8 ottobre 2025:
- โ
Supporto per la versione API 4.16.0+
- โ
Header `Account-Id` obbligatorio (SHA256 hash dell'userId)
- โ
Gestione automatica del redirect regionale
- โ
Refresh automatico del token
- โ
Storage sicuro delle credenziali con crittografia AES-256-GCM
- โ
Chiavi di crittografia salvate nel keychain del sistema operativo (Keytar)
- โ
Fallback automatico a file `.encryption.key` se Keytar non disponibile
- โ
Persistenza sicura dei token JWT
- โ
**v1.3.0**: Supporto completo per tutte le 13 regioni LibreLinkUp
- โ
**v1.4.0**: Aggiornamento dipendenze di sicurezza (13 vulnerabilitร risolte), MCP SDK 1.29.0, richiede Node.js 20+
- โ
**v1.5.0**: 8 vulnerabilitร risolte, MCP SDK 1.30.0, richiede Node.js 22+
- โ
**v1.5.1**: 5 vulnerabilitร risolte (hono, qs), axios 1.20.0
- โ
**v1.6.0**: `get_glucose_stats` riporta la finestra temporale effettivamente coperta (`data_coverage`), manifest del bundle completo, bundle senza devDependencies
## ๐ Prerequisiti
- **Node.js**: Versione 22.0.0 o superiore
- **Account LibreLinkUp**: Account attivo con dati condivisi
- **Sensore**: FreeStyle Libre 2 o 3 attivo
- **Claude Desktop**: Per l'integrazione MCP
## ๐ Installazione Rapida (Bundle Precompilato)
### Passaggi:
### 1. Installa Keytar (Raccomandato per sicurezza massima)
Per utilizzare il vault nativo del sistema operativo (Windows Credential Manager, macOS Keychain, Linux Secret Service), installa `keytar`:
```bash
npm install keytar
```
> **Nota:** Se `keytar` non puรฒ essere installato, il sistema userร automaticamente un file criptato come fallback.
### 2. Scarica il bundle
Usa il browser oppure:
```bash
wget https://github.com/sedoglia/librelink-mcp-server/releases/download/v1.6.0/librelink-mcp-server.mcpb
```
### 3. Verifica l'integritร
Verifica l'integritร (opzionale ma consigliato):
```bash
wget https://github.com/sedoglia/librelink-mcp-server/releases/download/v1.6.0/librelink-mcp-server.mcpb.sha256
sha256sum -c librelink-mcp-server.mcpb.sha256
```
### 4. 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` (`librelink-mcp-server.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.
---
### 5. Configura le Credenziali LibreLink (Metodo Sicuro - Raccomandato)
Apri una **nuova chat su Claude Desktop** e scrivi il seguente prompt:
```
Configura le credenziali di accesso per LibreLink
```
Rispondi al messaggio fornendo:
- **Utente:** la tua email LibreLink
- **Password:** la tua password LibreLink
L'estensione provvederร automaticamente a criptare e salvare le credenziali in modo sicuro nel vault nativo del sistema operativo (Windows Credential Manager, macOS Keychain, Linux Secret Service).
> **Nota:** Le credenziali NON verranno salvate in file di testo. Saranno sempre crittografate e gestite dal vault nativo del SO.
### 6. 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
```bash
# Clona il repository
git clone https://github.com/sedoglia/librelink-mcp-server.git
cd librelink-mcp-server
```
### 2. Installa le Dipendenze
```bash
# Installa dipendenze
npm install
```
### 3. Installa Keytar
Keytar richiede alcune dipendenze di sistema per funzionare:
**Windows**: Nessuna dipendenza aggiuntiva richiesta (usa Windows Credential Manager)
**macOS**: Nessuna dipendenza aggiuntiva richiesta (usa Keychain)
**Linux** (Debian/Ubuntu):
```bash
sudo apt-get install libsecret-1-dev gnome-keyring
```
**Linux** (Fedora/RHEL):
```bash
sudo dnf install libsecret-devel gnome-keyring
```
```bash
# Installa Keytar
npm install keytar
```
### 4. Compila il Progetto
```bash
# Compila TypeScript
npm run build
```
### 5. Configura le credenziali
```bash
npm run configure
```
Ti verrร chiesto:
- **Email**: Email del tuo account LibreLinkUp
- **Password**: Password del tuo account
- **Regione**: Una delle 13 regioni supportate (vedi sotto)
- **Range target**: Valori glicemici target (default: 70-180 mg/dL)
### Regioni Supportate
| Codice | Regione |
|--------|---------|
| AE | Emirati Arabi Uniti |
| AP | Asia Pacifico |
| AU | Australia |
| CA | Canada |
| CN | Cina |
| DE | Germania |
| EU | Europa (default) |
| EU2 | Europa 2 |
| FR | Francia |
| JP | Giappone |
| LA | America Latina |
| RU | Russia |
| US | Stati Uniti |
Le credenziali vengono salvate in modo sicuro:
- **Crittografia**: AES-256-GCM con salt e IV casuali
- **Chiave di crittografia**: Salvata nel keychain del sistema operativo
- **Token JWT**: Persistito in modo sicuro per evitare login ripetuti
### 6. Testa la connessione
```bash
npm run test:connection
```
### 7. Configura Claude Desktop
Aggiungi al file di configurazione di Claude Desktop:
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
```json
{
"mcpServers": {
"librelink": {
"command": "node",
"args": ["C:/percorso/librelink-mcp-server/dist/index.js"]
}
}
}
```
### 8. Riavvia Claude Desktop
Riavvia Claude Desktop per caricare il server MCP.
## ๐ Strumenti MCP Disponibili
| Strumento | Descrizione |
|-----------|-------------|
| `get_current_glucose` | Lettura glicemica attuale con trend |
| `get_glucose_history` | Storico glicemico (default: 24 ore) |
| `get_glucose_stats` | Statistiche: media, GMI, time-in-range |
| `get_glucose_trends` | Analisi pattern: dawn phenomenon, stabilitร |
| `get_sensor_info` | Info sensore attivo |
| `configure_credentials` | Configura credenziali LibreLinkUp |
| `configure_ranges` | Imposta range target personalizzati |
| `validate_connection` | Testa la connessione |
| `get_session_status` | Stato della sessione di autenticazione |
| `clear_session` | Pulisce la sessione e forza re-autenticazione |
## ๐ฌ Esempi di Utilizzo
Una volta integrato con Claude Desktop, puoi chiedere:
- *"Qual รจ la mia glicemia attuale?"*
- *"Mostrami lo storico glicemico delle ultime 6 ore"*
- *"Calcola il mio time-in-range di questa settimana"*
- *"Analizza i miei pattern glicemici"*
- *"Ho il fenomeno dell'alba?"*
## ๐ Output di Esempio
### Lettura Attuale
```json
{
"current_glucose": 105,
"timestamp": "2025-12-06T16:30:00.000Z",
"trend": "Flat",
"status": "Normal",
"color": "green"
}
```
### Statistiche
```json
{
"analysis_period_days": 7,
"data_coverage": {
"from": "2026-09-12T10:46:28.000Z",
"to": "2026-09-12T22:01:32.000Z",
"hours_covered": 11.3,
"hours_requested": 168,
"note": "Only 11.3 of the requested 168 hours are available: LibreLinkUp returns roughly the last 12 hours of readings. Statistics below describe that window only."
},
"average_glucose": 112.5,
"glucose_management_indicator": 5.94,
"time_in_range": {
"target_70_180": 85.2,
"below_70": 2.1,
"above_180": 12.7
},
"variability": {
"standard_deviation": 28.4,
"coefficient_of_variation": 25.2
}
}
```
Il blocco `data_coverage` indica la finestra temporale realmente coperta dalle letture: LibreLinkUp restituisce solo le ultime ~12 ore, quindi le statistiche descrivono quella finestra anche quando si richiedono piรน giorni.
## ๐ Sicurezza e Privacy
### Posizioni di Storage
I file di configurazione sono salvati in posizioni specifiche per ogni sistema operativo:
| Sistema | Percorso |
|---------|----------|
| Windows | `%LOCALAPPDATA%\librelink-mcp\` |
| macOS | `~/Library/Application Support/librelink-mcp/` |
| Linux | `~/.config/librelink-mcp/` |
### Architettura di Sicurezza
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Storage Chiave di Crittografia โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ OPZIONE 1 (Preferita): OS Keychain via Keytar โโ
โ โ - Windows: Credential Manager โโ
โ โ - macOS: Keychain โโ
โ โ - Linux: Secret Service (libsecret) โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโคโ
โ โ OPZIONE 2 (Fallback): File .encryption.key โโ
โ โ - Permessi 0o600 (solo proprietario) โโ
โ โ - Usato se Keytar non disponibile โโ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ [Percorso specifico per OS]/librelink-mcp/ โ
โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
โ โ credentials.enc โ โ token.enc โ โ
โ โ (AES-256-GCM) โ โ (AES-256-GCM) โ โ
โ โ - email โ โ - JWT token โ โ
โ โ - password โ โ - expiration โ โ
โ โโโโโโโโโโโโโโโโโโโโโ โ - userId โ โ
โ โ - accountId โ โ
โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
โ โ config.json โ โ
โ โ (non sensibile) โ โโโโโโโโโโโโโโโโโโโโโโ โ
โ โ - region โ โ .encryption.key โ โ
โ โ - targetLow/High โ โ (fallback, 0o600) โ โ
โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### Caratteristiche di Sicurezza
- **Crittografia AES-256-GCM**: Le credenziali sono crittografate con algoritmo AES-256 in modalitร GCM con authentication tag
- **Salt e IV casuali**: Ogni operazione di crittografia usa salt e IV unici
- **Chiavi nel Keychain (preferito)**: La chiave master รจ salvata nel keychain del sistema operativo:
- Windows: Credential Manager
- macOS: Keychain
- Linux: Secret Service (libsecret)
- **Fallback file-based**: Se Keytar non รจ disponibile (es. LM Studio, ambienti senza moduli nativi), la chiave viene salvata in `.encryption.key` con permessi restrittivi (0o600)
- **Token persistenti**: I JWT token sono salvati crittografati per evitare login ripetuti
- **Migrazione automatica**: Le credenziali dalla vecchia versione vengono migrate automaticamente e le password in chiaro eliminate
- **Permessi file**: Automaticamente impostati a 600 (solo utente)
- **Nessun tracking**: Zero telemetria
- **Elaborazione locale**: Nessun dato inviato a server esterni
## ๐งพ SBOM (Software Bill of Materials)
Il progetto pubblica un [SBOM](https://github.com/resources/articles/what-is-an-sbom-software-bill-of-materials) in formato [CycloneDX](https://cyclonedx.org/) 1.6: l'inventario completo, leggibile da macchina, di tutto il codice di terze parti che gira sul tuo dispositivo quando usi il server.
- **File**: [`sbom.cdx.json`](sbom.cdx.json) nella radice del repository; รจ incluso anche dentro il bundle `.mcpb` e allegato a ogni [release GitHub](https://github.com/sedoglia/librelink-mcp-server/releases).
- **Contenuto**: le sole dipendenze di produzione (quelle che finiscono nel bundle), dirette e transitive, con versione, licenza, [Package URL](https://github.com/package-url/purl-spec), hash SHA-512 del tarball npm e grafo delle dipendenze. Le devDependencies (`typescript`, `@types/*`) sono escluse perchรฉ non vengono distribuite.
- **Generazione**: prodotto da [`@cyclonedx/cyclonedx-npm`](https://github.com/CycloneDX/cyclonedx-node-npm) a partire dal solo `package-lock.json`, in modalitร riproducibile (senza timestamp nรฉ numero di serie): lo stesso lockfile produce sempre lo stesso inventario, quindi un diff sull'SBOM segnala esclusivamente un cambio di dipendenze.
- **Allineamento garantito**: la CI rigenera l'SBOM a ogni push e PR (`npm run sbom:check`) e fallisce se non coincide con quello committato, cosรฌ il file su `main` descrive sempre il lockfile corrente. Chi aggiorna una dipendenza deve quindi rilanciare `npm run sbom` e committare il risultato insieme a `package-lock.json`; sulle PR di Dependabot lo fa in automatico il workflow `dependabot-sbom.yml`.
Per rigenerarlo o per usarlo con uno scanner di vulnerabilitร (es. [Grype](https://github.com/anchore/grype), [OSV-Scanner](https://github.com/google/osv-scanner), [Dependency-Track](https://dependencytrack.org/)):
```bash
npm run sbom
grype sbom:sbom.cdx.json
```
## โ ๏ธ Fix API v4.16.0 (Ottobre 2025)
### Il Problema
L'8 ottobre 2025, Abbott ha reso obbligatori:
1. Header `version` con valore minimo `4.16.0`
2. Header `Account-Id` contenente l'hash SHA256 dell'userId
### La Soluzione
Questo fork genera automaticamente l'`Account-Id` dopo il login:
```typescript
import { createHash } from 'crypto';
// L'userId viene dalla risposta del login
const userId = loginResponse.data.user.id;
const accountId = createHash('sha256').update(userId).digest('hex');
// L'header viene aggiunto a tutte le richieste autenticate
headers['Account-Id'] = accountId;
```
## ๐ Troubleshooting
### Errore 403 con `minimumVersion`
```json
{"data":{"minimumVersion":"4.16.0"},"status":920}
```
**Soluzione:** Stai usando una versione vecchia. Usa questo fork aggiornato.
### Errore `RequiredHeaderMissing`
**Soluzione:** L'header `Account-Id` non viene inviato. Usa questo fork che lo include automaticamente.
### Nessuna connessione trovata
**Soluzioni:**
1. Apri l'app LibreLinkUp e accetta i nuovi Termini e Condizioni
2. Verifica che qualcuno stia condividendo i dati con te
3. Controlla di usare le credenziali LibreLinkUp (non LibreLink)
### Errore di autenticazione
**Soluzioni:**
1. Verifica email e password
2. Prova ad accedere dall'app ufficiale LibreLinkUp
3. Controlla la regione (EU vs US, ecc.)
### Errore Keytar/Keychain
Se riscontri errori con il keychain:
1. Assicurati che il servizio keychain del sistema sia attivo
2. Su Linux, installa `libsecret-1-dev` e `gnome-keyring`
3. Se Keytar non รจ disponibile, il sistema userร automaticamente il fallback file-based (`.encryption.key` nella directory dati)
4. Il fallback รจ completamente trasparente e le credenziali rimangono crittografate con AES-256-GCM
## ๐ Struttura Progetto
```
librelink-mcp-server/
โโโ src/
โ โโโ index.ts # Server MCP principale
โ โโโ librelink-client.ts # Client API con fix v4.16.0
โ โโโ glucose-analytics.ts # Analisi e statistiche
โ โโโ config.ts # Gestione configurazione
โ โโโ configure.ts # Tool CLI configurazione
โ โโโ secure-storage.ts # Storage sicuro con Keytar
โ โโโ types.ts # Definizioni TypeScript
โโโ scripts/
โ โโโ smoke-test.mjs # Smoke test MCP senza credenziali (CI)
โ โโโ sbom-check.mjs # Verifica che l'SBOM coincida col lockfile (CI)
โ โโโ pack.mjs # Build del bundle .mcpb di release
โโโ manifest.json # Manifest del bundle .mcpb
โโโ sbom.cdx.json # SBOM CycloneDX delle dipendenze di produzione
โโโ test-real-connection.js # Test connessione
โโโ test-secure-storage.js # Test modulo sicurezza
โโโ package.json
โโโ tsconfig.json
โโโ README.md
```
## ๐ฆ Pubblicare una release (per i maintainer)
Il numero di versione รจ dichiarato in sei file, che devono cambiare insieme: `package.json`, `package-lock.json`, `manifest.json` (il bundle `.mcpb`), `src/index.ts` (costruttore `Server` e banner di avvio) e i due README (riga di changelog + URL di download del bundle).
1. **Branch e bump**
```bash
git checkout -b release/X.Y.Z
npm version X.Y.Z --no-git-tag-version # package.json + package-lock.json
```
Poi aggiorna a mano `manifest.json`, `src/index.ts`, `README.md` e `README.en.md`.
2. **Verifica**
```bash
npm run typecheck && npm run build
npm run pack
npm audit --audit-level=moderate
```
`npm run pack` compila, reinstalla le sole dipendenze di produzione, esegue lo smoke test su quell'albero (che controlla anche che la versione riportata via MCP coincida con `package.json`), rigenera `sbom.cdx.json`, impacchetta `releases/librelink-mcp-server.mcpb` con il relativo `.sha256` e infine ripristina le devDependencies. Cosรฌ il bundle non contiene mai `typescript` o `@types/*`, e l'SBOM (che riporta la nuova versione e le dipendenze aggiornate) va committato insieme al bump.
3. **Pull request** con il template dedicato (le PR ordinarie e quelle di Dependabot non lo usano):
```bash
gh pr create --template release.md
```
Il merge su `main` richiede la CI verde.
4. **Tag e release** dopo il merge:
```bash
git checkout main && git pull --ff-only
git tag -a vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
npm run pack
gh release create vX.Y.Z releases/librelink-mcp-server.mcpb releases/librelink-mcp-server.mcpb.sha256 sbom.cdx.json \
--title "LibreLink MCP Server vX.Y.Z" --latest --notes-file NOTE.md
```
5. **Controllo finale**: scarica gli asset pubblicati e verifica il checksum, esattamente come farร un utente.
```bash
gh release download vX.Y.Z -p 'librelink-mcp-server.mcpb*'
sha256sum -c librelink-mcp-server.mcpb.sha256
```
## ๐ Privacy Policy
Questo server MCP rispetta la tua privacy. Ecco un riepilogo:
- **Elaborazione locale**: Tutti i dati vengono elaborati esclusivamente sul tuo dispositivo
- **Crittografia**: Credenziali protette con AES-256-GCM, chiavi nel keychain OS
- **Nessun tracking**: Zero telemetria, analytics o condivisione con terze parti
- **Comunicazione sicura**: Solo con API LibreLinkUp ufficiali di Abbott
๐ **[Leggi la Privacy Policy completa](PRIVACY_POLICY.md)**
## ๐ Licenza
MIT License
## ๐ Crediti
- Fork originale: [amansk/librelink-mcp-server](https://github.com/amansk/librelink-mcp-server)
- Documentazione API: [khskekec/libre-link-up-http-dump](https://gist.github.com/khskekec/6c13ba01b10d3018d816706a32ae8ab2)
- MCP Protocol: [Anthropic](https://modelcontextprotocol.io)
- Secure Storage: [Keytar](https://github.com/atom/node-keytar)
## โ Supporta il Progetto
Se questo progetto ti รจ utile, considera di fare una donazione per supportarne lo sviluppo:
[](https://paypal.me/sedoglia)
---
**Disclaimer**: Questo รจ un progetto non ufficiale, non affiliato con Abbott o FreeStyle Libre. Usalo responsabilmente e consulta sempre i professionisti sanitari per decisioni mediche.
TDQS
Scored across 10 tools
Tools mostly have distinct purposes, but validate_connection and get_session_status both address authentication status, and get_glucose_stats and get_glucose_trends are related analytics. Descriptions help differentiate them, but some overlap remains.
All tool names use snake_case with a consistent verb_noun pattern (get_, configure_, clear_, validate_). No mixing of conventions.
10 tools is well-scoped for a glucose monitoring server, covering sensor info, authentication, readings, analytics, and configuration without redundancy.
Core lifecycle is covered: configure, authenticate, read current/historical glucose, analytics, and clear session. Minor gap: no tool to retrieve currently configured target ranges or credential settings, though those can be inferred.