opengym-conector
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
opengym-conector
Conector MCP remoto para o openGym. Cada pessoa da instância gera um link pessoal e cola no Claude (conector personalizado) ou no ChatGPT (modo desenvolvedor). A partir daí dá para planejar treinos, registrar o que fez e analisar o progresso conversando, e tudo é gravado pela API oficial do openGym, então aparece em todos os aparelhos da pessoa como se tivesse sido feito no app.
Licença e código do openGym
Este projeto é AGPL-3.0-or-later (texto em LICENSE), porque reaproveita código do openGym, que é AGPL-3.0:
upstream: https://github.com/DuarteSantos8/openGym, tag v1.4.1, commit
464355ef43d4c8f8a4e0bb6db9c2af7f240593b5;o código do openGym não está copiado neste repositório:
scripts/baixar-opengym.mjsfaz um clone esparso da tag (pastasmcp,frontend/src/lib,frontend/src/exercise-names), confere o hash do commit e grava em./upstream, no build da imagem ou antes dos testes;um único arquivo do openGym é substituído:
mcp/src/state.js, pela versão em src/upstream-patch/state.js. O original lê./data/state-<uid>.jsondo disco; o nosso recebe o estado lido da API a cada requisição (AsyncLocalStorage) e mantém todos os exports e o mesmodefaultsShape(). Nenhum outro arquivo do upstream é alterado;tudo que é usado do upstream está listado em src/upstream.js.
Pela seção 13 da AGPL, quem usa o conector pela rede tem de poder obter o código-fonte. Publique
este repositório e defina SOURCE_URL: as páginas passam a mostrar o link "código-fonte".
Related MCP server: FitCoach MCP
Variáveis de ambiente
Variável | Padrão | Para quê |
| obrigatória | URL interna da API do openGym, por exemplo |
| obrigatória | URL pública do conector, por exemplo |
|
| porta HTTP do container (o TLS fica no Traefik) |
|
| onde fica |
|
| define o "hoje" de treinos e pesagens, como o relógio do aparelho |
| vazio | link do código-fonte exibido nas páginas (AGPL) |
Como um amigo conecta
No navegador, entra no site do openGym com a conta dele.
Configurações › Conta (a linha com o nome dele) › Parear o aplicativo. Aparece um código de 8 letras, que vale 5 minutos e só pode ser usado uma vez. (Rótulos conferidos no pacote pt-BR do openGym v1.4.1:
Settings= Configurações,Account= Conta,Pair the mobile app= Parear o aplicativo. O item só aparece no site, não dentro do app de celular pareado.)Abre
PUBLIC_URL/conectar, cola o código e recebe o link pessoalPUBLIC_URL/mcp/<chave>.Claude: Configurações › Conectores › Adicionar conector personalizado (Add custom connector), cola o link; na conversa, ativa no botão +. ChatGPT: Configurações › Apps › Configurações avançadas › Modo desenvolvedor; cria um conector com o link e autenticação "Sem autenticação" (No authentication).
Para cancelar: Sair de todos os dispositivos no openGym invalida o token, e o conector passa a responder com erro pedindo para conectar de novo.
Ferramentas
Leitura (as nove do MCP oficial do openGym, sem alteração, todas com readOnlyHint: true):
list_routines, get_routine, preview_session, get_week_plan, list_workouts,
get_workout, get_bodyweight, estimate_1rm, muscle_balance.
Novas:
Ferramenta | O que faz | Anotações |
| busca na biblioteca do app (~5600) e nos personalizados, por nome em inglês ou pt-BR, músculo, equipamento | leitura |
| cria rotina (séries, reps, faixa, carga em kg, descanso, regra de progressão); recusa nome repetido | escrita |
| renomeia, troca a lista de exercícios (mantendo nota, aquecimento e progressão de quem continua) e a progressão | escrita, |
| apaga a rotina e tira dos dias da semana, como o app | escrita, |
| põe rotinas nos dias da semana fixa; em modo rodízio recusa e explica, a menos que | escrita, idempotente |
| registra treino já feito pelo caminho "Registrar um treino anterior" do app; repetição idêntica não duplica | escrita, idempotente |
| pesagem do dia; dia que já tem pesagem é corrigido | escrita, idempotente |
Pesos entram em kg e são convertidos com as funções do app quando o perfil está em lb.
Como a sincronização é respeitada
O openGym mescla aparelhos campo a campo, com carimbo por mudança e registro de remoções
(deleted, edited, _f, _ts; frontend/src/lib/sync-merge.js). Cada gravação do conector
(src/sincronizar.js) faz o que o update() e o doPush() do app fazem
(frontend/src/store/useStore.js):
GET /api/data(documento,reve_wid), sem cache entre chamadas;aplica a operação numa cópia, com as funções do próprio app (
deleteRoutine,chooseFixedWeek,buildCombinedEntries,buildCompletedWorkout,completeBackfill,rebuildPrHistory,refillAfter, ...);carimba com
stampChange(anterior, novo)do app e põe o tempo em_ts;PUT /api/datacombaseRev,baseWidestamped: true;no 409 a API devolve o documento atual e a operação é reaplicada sobre ele, até 3 vezes. Gravações do mesmo perfil passam por uma fila, então o 409 só vem de outro aparelho.
Os testes provam com o mergeStates do app que um aparelho com cópia velha mantém as gravações do
conector e que nada apagado (por ele ou pelo conector) volta.
Segurança
A chave pessoal são 32 bytes aleatórios (base64url) e só existe no link. No disco,
conexoes.jsonguardasha256(chave)para achar o registro e o token do openGym cifrado com AES-256-GCM, numa chave derivada por HKDF da própria chave pessoal. O arquivo vazado sozinho não abre nenhum token.O link funciona como senha (é um bearer na URL). Quem tiver o link lê e altera os treinos daquela pessoa, e só dela. A página avisa isso.
Nunca vão para o log: chave, token, código de pareamento, corpo de requisição. Atenção ao Traefik: se o access log estiver ligado, ele grava o caminho
/mcp/<chave>. Desligue o access log desse roteador ou filtre o caminho.Limites: 60 pedidos MCP por minuto por link, 10 pareamentos por minuto por endereço (último item do
X-Forwarded-For), corpo MCP até 1 MB.O token do openGym vale 90 dias (
SESSION_DAYS); passados ~40, o conector consultaGET /api/meno máximo uma vez por hora e guarda o token novo que a API devolve depois de 45."Sair de todos os dispositivos" no openGym encerra todos os links da pessoa.
Rodando junto do openGym (compose)
O conector precisa estar na mesma rede Docker do serviço api do openGym (porta 3000):
services:
conector:
build: ./opengym-conector
restart: unless-stopped
depends_on:
- api
environment:
OPENGYM_API: http://api:3000
PUBLIC_URL: https://ia.gym.bruxo.app
DATA_DIR: /data
PORT: "8787"
TZ: America/Sao_Paulo
# SOURCE_URL: https://endereco-publico-deste-repositorio
volumes:
- conector-data:/data
labels:
- traefik.enable=true
- traefik.http.routers.opengym-ia.rule=Host(`ia.gym.bruxo.app`)
- traefik.http.routers.opengym-ia.entrypoints=https
- traefik.http.routers.opengym-ia.tls=true
- traefik.http.services.opengym-ia.loadbalancer.server.port=8787
volumes:
conector-data:Se o openGym estiver em outro projeto compose, ligue os dois a uma rede externa em comum e use o
nome do container da API em OPENGYM_API. Prefira volume nomeado: o processo roda como node
(uid 1000), e um bind mount precisa pertencer a esse uid.
Desenvolvimento
npm ci
npm testnpm test baixa o openGym v1.4.1 com api/ (npm ci --omit=optional dentro dela), sobe
api/server.js de verdade na porta 3999 numa pasta temporária, cria o perfil sem navegador (como
os testes do próprio openGym: db.json semeado e sessão assinada com o secret), gera um código
de pareamento, pareia, chama cada ferramenta pelo cliente MCP do SDK e confere no GET /api/data.
CONECTOR_RAIZ=<pasta> roda o mesmo teste contra uma cópia montada como a imagem Docker.
This server cannot be deployed
Maintenance
Related MCP Connectors
Calorie, workout and body-weight log inside ChatGPT and Claude. Log meals by text, photo or voice.
Connect ChatGPT or Claude to your Gym Plus account to log and review workouts with AI coaching.
Chat forgets your workouts. AIm remembers them for Claude and ChatGPT: sets, weights, 1RM, volume.
Talk to your own gym log. Reps: Gym Workout Log (repsworkout.com) is a workout log for iPhone and Android. Connect it to Claude, ChatGPT or any MCP client to read your workout history, PRs, lift progression, weekly summaries, routines and training plan, and to save routines and plans after you confirm them. It never logs a workout for you and can’t delete your history. Sign in with an e-mail code, Apple or Google; new users can create a free account while connecting, then get the app to log workouts.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables workout tracking and coaching within Claude conversations, managing exercise configs, logs, streaks, and health metrics via an MCP server with PostgreSQL.-
- FlicenseNot gradedqualityAmaintenanceEnables Claude or ChatGPT to act as a personalized fitness coach with persistent goals, conversational workout logging, and weekly generated training plans.-
- AlicenseBqualityBmaintenanceEnables AI assistants to read, log, edit, and analyze workouts, routines, body weight, media, and personal records on a self-hosted openGym instance through its own HTTP API. Writes are scoped to requested changes with automatic backups and conflict detection, and tools are grouped into read, write, delete, and admin permission tiers.7413 npm1AGPL 3.0
- FlicenseNot gradedqualityAmaintenanceEnables Claude and other AI assistants to query workouts, build structured intervals, manage calendars, track fitness trends, and control training through natural conversation without official API approval.-