Skip to main content
Glama

livetrack-mcp

Autonomer MCP-Server, der Garmin LiveTrack abruft, Zeitreihen in SQLite speichert und alle 10 Minuten via claude-runner eine Claude-Analyse auslöst.

Architektur

Garmin LiveTrack URL
    │
    │  (poll every 60 s)
    ▼
livetrack-mcp (port 38100)
    ├── poller.py      — fetch trackpoints from Garmin API
    ├── store.py       — SQLite time-series persistence (/data/livetrack.db)
    ├── tracker.py     — asyncio scheduling + race-end detection
    └── analyzer.py    — build prompt, call claude-runner
         │
         │  POST /run (fire-and-forget)
         ▼
    claude-runner (port 38095)
         │
         │  claude -p <analysis prompt>
         ▼
    Claude (sonnet)
         ├── analyze timeseries
         ├── curl POST /control if thresholds need adjustment
         └── mcp__telegram__send_message → coaching push

Hauptdesign: livetrack-mcp ist vollständig autonom — während des Rennens muss keine Claude-Sitzung aktiv bleiben. Claude wird alle 10 Minuten als zustandslose Analysefunktion aufgerufen. Sollte claude-runner vorübergehend nicht verfügbar sein, wird der nächste Analysezyklus automatisch wiederholt.

Related MCP server: Garmin-Strava-mcp

MCP-Tools

Tool

Beschreibung

start_tracking(url, race_config)

Startet das Abrufen einer LiveTrack-Freigabe-URL

stop_tracking()

Stoppt das Abrufen (wird auch bei Rennende automatisch gestoppt)

get_tracking_status()

Aktiver Status, verstrichene Zeit, Stagnationszeit, Abruffehler

get_timeseries(minutes=10)

Aktuelle Daten aus SQLite

update_thresholds(updates)

Aktualisiert HR/Leistungsschwellen während des Rennens

trigger_analysis()

Manuelle Analyse auf Abruf, umgeht den Zeitplan

Benutzerdefinierte HTTP-Endpunkte

Endpunkt

Methode

Beschreibung

/control

POST

Aktualisiert Schwellenwerte während des Rennens (aufgerufen von Claude via curl im Bash-Tool)

/health

GET

Gesundheitsprüfung — Tracking-Status + Speicherstatistiken

/control Verwendung (aus dem Analyse-Prompt von Claude)

curl -sf -X POST http://localhost:38100/control \
  -H 'Content-Type: application/json' \
  -d '{"power_max": 150}'

Zulässige Felder: hr_max, hr_min, power_max, power_min, cadence_min, run_hr_max, run_hr_min, run_cadence_min

race_config Felder

Feld

Typ

Standard

Beschreibung

hr_max

int

—

Radsport-HF-Obergrenze (bpm)

hr_min

int

—

Radsport-HF-Untergrenze

power_max

int

—

ERG-Leistungsobergrenze (Watt)

power_min

int

—

ERG-Leistungsuntergrenze

cadence_min

int

—

Minimale Trittfrequenz (U/min)

run_hr_max

int

—

Lauf-HF-Obergrenze

run_hr_min

int

—

Lauf-HF-Untergrenze

run_cadence_min

int

—

Minimale Laufschrittfrequenz (spm)

poll_interval_secs

int

60

Häufigkeit des LiveTrack-Abrufs

analyze_interval_secs

int

600

Häufigkeit der Claude-Analyse

analyze_window_min

int

10

Datenfenster, das an Claude übergeben wird (Minuten)

Beispiel race_config für einen kompletten Triathlon

{
  "race_name": "CT2026",
  "race_type": "triathlon",
  "hr_max": 144,
  "hr_min": 115,
  "power_max": 165,
  "cadence_min": 82,
  "run_hr_max": 152,
  "run_hr_min": 125,
  "run_cadence_min": 165,
  "poll_interval_secs": 60,
  "analyze_interval_secs": 600,
  "analyze_window_min": 10
}

Erkennung des Rennendes

Der Server stoppt automatisch, wenn:

  • Keine neuen Trackpoints für ≥ 15 Minuten vorhanden sind (STALE_STOP_MIN)

  • UND die gesamte verstrichene Zeit ≥ 30 Minuten beträgt (MIN_ELAPSED_MIN)

Dies berücksichtigt die 24-Stunden-URL-Verzögerung von Garmin: Die URL bleibt nach dem Rennen gültig, aber neue Trackpoints kommen nicht mehr an, wenn der Athlet das Ziel erreicht hat. Das 30-Minuten-Minimum verhindert falsche Stopps zu Beginn, wenn GPS-Daten spärlich sind.

Konfiguration (Umgebungsvariablen)

Variable

Standard

Beschreibung

PORT

38100

Server-Port

HOST

0.0.0.0

Bind-Adresse

MCP_PATH

/mcp

MCP-Endpunktpfad

DB_PATH

/data/livetrack.db

SQLite-Datenbankpfad

CLAUDE_RUNNER_URL

http://localhost:38095

claude-runner Basis-URL

RUNNER_WORKSPACE

training

Arbeitsbereich für claude-runner-Aufgaben

LOG_LEVEL

INFO

Protokollierungsebene

OTEL_EXPORTER_OTLP_ENDPOINT

—

OpenTelemetry-Collector-URL (optional)

Bereitstellung

cd ~/ai-platform/mcps

# Build and start
docker compose up -d --build livetrack-mcp

# Logs
docker compose logs -f livetrack-mcp

# Restart
docker compose restart livetrack-mcp

# Health check
curl http://localhost:38100/health

Typische Sitzung (via Claude im Trainings-Arbeitsbereich)

# Start tracking
use_mcp_tool livetrack-mcp start_tracking \
  url="https://livetrack.garmin.com/session/.../token/..." \
  race_config={"hr_max": 144, "power_max": 165, "run_hr_max": 152}

# Check status
use_mcp_tool livetrack-mcp get_tracking_status

# Manual analysis trigger
use_mcp_tool livetrack-mcp trigger_analysis

# Stop (or let it auto-stop)
use_mcp_tool livetrack-mcp stop_tracking

Projektstruktur

livetrack_mcp/
├── Dockerfile
├── pyproject.toml
├── README.md
└── src/livetrack_mcp/
    ├── __init__.py
    ├── __main__.py
    ├── otel.py        # OpenTelemetry setup
    ├── poller.py      # Garmin LiveTrack URL parsing + HTTP fetch
    ├── store.py       # SQLite time-series (sqlite3 + asyncio.to_thread)
    ├── tracker.py     # Scheduling (asyncio.create_task) + race-end detection
    ├── analyzer.py    # Prompt builder + claude-runner caller
    └── server.py      # FastMCP tools + /control + /health

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.
    21
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Local MCP server that connects Claude Desktop with Garmin and Apple Health data to read training and recovery, estimate heart rate and pace zones, analyze performance, and create structured workouts.
    22
    MIT