Skip to main content
Glama

garmin_smart_trainer_mcp

MCP local que deixa o Claude Code publicar treinos no Intervals.icu, que sincroniza com o Garmin Connect dos atletas. Você conversa ("monta a semana da atleta1"), aprova, e o treino chega no relógio.

Claude Code ──stdio──▶ intervals-mcp ──HTTPS──▶ Intervals.icu ──▶ Garmin Connect ──▶ relógio
     │
     └── lê o contexto dos atletas numa pasta local, fora deste repo

O que o MCP pode fazer

Ferramenta

O que faz

Permissão no Claude Code

listar_atletas

apelidos autorizados

livre

listar_treinos

treinos e provas de um período (até 90 dias)

livre

atividades_recentes

resumo do que foi feito (até 42 dias): duração, FC, carga, zonas, RPE

livre

criar_treino

publica um treino (hoje até +120 dias)

pede confirmação

atualizar_treino

altera um treino criado pelo MCP

pede confirmação

apagar_treino

apaga um treino futuro criado pelo MCP

pede confirmação

Travas no código:

  • URL da API fixa (https://intervals.icu), sem seguir redirecionamento com a chave.

  • Só atletas listados em INTERVALS_ATHLETES.

  • Alterar/apagar só vale para treinos que o próprio MCP criou (external_id com prefixo tmcp-). Treinos criados pela atleta ou por outro app ficam intocáveis.

  • Não lê bem-estar (sono, HRV, peso), streams ou GPS. Notas do calendário não são listadas.

Related MCP server: garmin-claude-mcp

Setup (uma vez por máquina)

Pré-requisitos: Claude Code e uv (curl -LsSf https://astral.sh/uv/install.sh | sh). O uv instala o Python se precisar.

git clone https://github.com/andrecccruz/garmin_smart_trainer_mcp.git
cd garmin_smart_trainer_mcp
uv sync

cp .env.example .env && chmod 600 .env
# edite .env: INTERVALS_API_KEY e INTERVALS_ATHLETES

cp .claude/settings.local.example.json .claude/settings.local.json
# edite o caminho da pasta de contexto

mkdir -p ~/treinos-contexto
cp -r contexto-exemplo/atleta1 ~/treinos-contexto/<apelido>   # e preencha

Teste sem rede: uv run pytest.

Primeiro uso real: deixe INTERVALS_DRY_RUN=1, abra claude na pasta, aprove o MCP intervals quando ele perguntar e peça para listar e simular um treino. Depois mude para 0 e publique um treino curto no seu próprio calendário para conferir que chega no Garmin.

Uso no dia a dia

cd garmin_smart_trainer_mcp && claude
> monta a próxima semana da atleta1

O fluxo completo (ler contexto → ver calendário e atividades → propor → aprovar → publicar → registrar no plano.md) está no CLAUDE.md.

Lado da atleta (uma vez)

  1. Conta no Intervals.icu com o Garmin conectado em Settings → Connections, marcando Baixar atividades e Carregar treinos planejados. As atividades precisam vir do Garmin: as importadas do Strava não ficam acessíveis pela API.

  2. Aceitar você como treinador no Intervals. Com isso a sua API key passa a funcionar para o athlete ID dela. Ela não precisa te passar nenhuma credencial e pode revogar quando quiser.

  3. Te passar o athlete ID (começa com i, está na URL do perfil).

Rodar isolado com Podman (opcional)

podman build -t intervals-mcp:latest -f Containerfile .

Troque o .mcp.json por:

{
  "mcpServers": {
    "intervals": {
      "command": "podman",
      "args": [
        "run", "-i", "--rm",
        "--read-only", "--tmpfs", "/tmp",
        "--cap-drop=ALL", "--security-opt=no-new-privileges",
        "--memory=256m", "--pids-limit=64",
        "--env-file", "${CLAUDE_PROJECT_DIR:-.}/.env",
        "localhost/intervals-mcp:latest"
      ]
    }
  }
}

Rootless, sem daemon, filesystem só leitura, sem capabilities. O container nasce quando a sessão do Claude Code abre e morre quando fecha. Depois de mudar o código, rode o podman build de novo.

Segurança

  • .env e .claude/settings.local.json ficam fora do Git (.gitignore). O .claude/settings.json também nega ao Claude ler o .env.

  • Hook de pre-commit com gitleaks + bloqueio de .env e pastas de atleta: uvx pre-commit install.

  • Se a chave vazar: Intervals → Settings → Developer → gerar nova, e atualizar o .env. Commit com chave é vazamento mesmo depois de apagado; o histórico do Git é permanente.

  • A API key do Intervals não tem escopo granular: trate como senha.

Licença

MIT.

Available Tools

6 tools
apagar_treinoA
Destructive

Apaga UM treino futuro criado por este MCP. Só chame depois que o usuário confirmar.

Inputs: atleta (required), evento_id (required). Returns: object

atividades_recentesA
Read-only

Resumo das atividades concluídas nos últimos N dias (1 a 42): duração, FC, carga, tempo em zonas de FC, RPE.

Atividades importadas do Strava não aparecem pela API; a atleta precisa sincronizar pelo Garmin.

Inputs: atleta (required), dias. Returns: result

atualizar_treinoA

Altera um treino criado por este MCP (data, nome, esporte e/ou texto). Campos omitidos ficam como estão.

Só chame depois que o usuário aprovar a alteração.

Inputs: atleta (required), evento_id (required), data, nome, +2 more. Returns: object

criar_treinoA

Publica um treino planejado no calendário do atleta. Ele sincroniza com o Garmin.

data: AAAA-MM-DD (hoje até 120 dias à frente). esporte: Ride, Run, Swim, WeightTraining etc. texto: treino na sintaxe do Intervals.icu, um passo por linha começando com '-'. Só chame depois que o usuário aprovar o treino.

Inputs: data (required), nome (required), texto (required), atleta (required), +1 more. Returns: object

listar_atletasA
Read-only

Lista os apelidos de atletas autorizados neste MCP.

Inputs: no named parameters. Returns: result

listar_treinosA
Read-only

Lista treinos planejados e provas no calendário do atleta entre duas datas (AAAA-MM-DD, até 90 dias).

'criado_pelo_mcp' indica se o treino pode ser alterado/apagado por este MCP.

Inputs: de (required), ate (required), atleta (required). Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 6 tools

    Disambiguation5/5

    Each tool targets a distinct resource+action pair: listing athletes, listing workouts, and the create/update/delete lifecycle for workouts are clearly separated, with recent activities being the only read-only metrics tool. Descriptions reinforce the boundaries (e.g., only MCP-created workouts can be updated/deleted), leaving no realistic misselection risk.

    Naming Consistency4/5

    Five tools follow a clean Portuguese verb_noun pattern (listar_atletas, listar_treinos, criar_treino, atualizar_treino, apagar_treino) with consistent singular/plural handling by resource. atividades_recentes is a noun-only outlier, but the deviation is minor and still readable.

    Tool Count5/5

    Six tools is well-scoped for an athlete calendar integration: two read/list tools, a full workout mutation set, and one activity summary tool. Every tool earns its place with no redundancy or filler.

    Completeness4/5

    Workout coverage is complete for the lifecycle (create, list, update, delete) plus athlete listing and completed-activity summaries, so core agent workflows have no dead ends. Minor gaps exist: no way to fetch a single workout's full details or drill into an individual activity beyond the recent summary.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables Claude to read recent training activities and wellness signals such as sleep, HRV, and resting heart rate, then design structured workouts that are written to an intervals.icu calendar and synced onward to Garmin Connect and the user's watch. Also supports listing, editing, and deleting planned workouts.
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables Claude to read recent activities and wellness data (sleep, HRV, resting heart rate) and to create, update, or delete structured planned workouts through intervals.icu, which syncs them to Garmin Connect and onto the user's watch.
      MIT