Skip to main content
Glama

livetrack-mcp

Servidor MCP autónomo que sondea Garmin LiveTrack, almacena series temporales en SQLite y activa el análisis de Claude cada 10 minutos a través de claude-runner.

Arquitectura

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

Diseño clave: livetrack-mcp es totalmente autónomo: no es necesario que una sesión de Claude permanezca activa durante la carrera. Claude se invoca como una función de análisis sin estado cada 10 minutos. Si claude-runner no está disponible temporalmente, el siguiente ciclo de análisis lo reintenta automáticamente.

Related MCP server: Garmin-Strava-mcp

Herramientas MCP

Herramienta

Descripción

start_tracking(url, race_config)

Iniciar el sondeo de una URL de LiveTrack

stop_tracking()

Detener el sondeo (también se detiene automáticamente al finalizar la carrera)

get_tracking_status()

Estado activo, tiempo transcurrido, tiempo de inactividad, errores de sondeo

get_timeseries(minutes=10)

Datos recientes de SQLite

update_thresholds(updates)

Actualizar umbrales de FC/potencia a mitad de carrera

trigger_analysis()

Análisis manual bajo demanda, omitiendo la programación

Endpoints HTTP personalizados

Endpoint

Método

Descripción

/control

POST

Actualizar umbrales a mitad de carrera (llamado por Claude mediante curl en la herramienta Bash)

/health

GET

Comprobación de estado: estado de seguimiento + estadísticas de almacenamiento

Uso de /control (desde el prompt de análisis de Claude)

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

Campos permitidos: hr_max, hr_min, power_max, power_min, cadence_min, run_hr_max, run_hr_min, run_cadence_min

Campos de race_config

Campo

Tipo

Predeterminado

Descripción

hr_max

int

—

Límite superior de FC en ciclismo (ppm)

hr_min

int

—

Límite inferior de FC en ciclismo

power_max

int

—

Límite superior de potencia ERG (vatios)

power_min

int

—

Límite inferior de potencia ERG

cadence_min

int

—

Cadencia mínima de ciclismo (rpm)

run_hr_max

int

—

Límite superior de FC en carrera

run_hr_min

int

—

Límite inferior de FC en carrera

run_cadence_min

int

—

Cadencia mínima de carrera (ppm)

poll_interval_secs

int

60

Frecuencia de sondeo de LiveTrack

analyze_interval_secs

int

600

Frecuencia de activación del análisis de Claude

analyze_window_min

int

10

Ventana de datos enviada a Claude (minutos)

Ejemplo de race_config para un triatlón completo

{
  "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
}

Detección de fin de carrera

El servidor se detiene automáticamente cuando:

  • No hay nuevos puntos de seguimiento durante ≥ 15 minutos (STALE_STOP_MIN)

  • Y el tiempo total transcurrido es ≥ 30 minutos (MIN_ELAPSED_MIN)

Esto gestiona el retraso de la URL de 24 horas de Garmin: la URL sigue siendo válida después de la carrera, pero los nuevos puntos de seguimiento dejan de llegar cuando el atleta termina. El mínimo de 30 minutos evita paradas falsas al inicio cuando los datos GPS son escasos.

Configuración (Variables de entorno)

Variable

Predeterminado

Descripción

PORT

38100

Puerto del servidor

HOST

0.0.0.0

Dirección de enlace

MCP_PATH

/mcp

Ruta del endpoint MCP

DB_PATH

/data/livetrack.db

Ruta de la base de datos SQLite

CLAUDE_RUNNER_URL

http://localhost:38095

URL base de claude-runner

RUNNER_WORKSPACE

training

Espacio de trabajo para tareas de claude-runner

LOG_LEVEL

INFO

Nivel de registro

OTEL_EXPORTER_OTLP_ENDPOINT

—

URL del colector OpenTelemetry (opcional)

Despliegue

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

Sesión típica (a través de Claude en el espacio de trabajo de entrenamiento)

# 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

Estructura del proyecto

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