Montres COROS¶
Une montre COROS se branche directement au coach par le MCP officiel de COROS : pas de compte tiers, une seule connexion pour toutes les IA. Tout ce qui est marqué « constaté » ci-dessous a été vérifié par nous sur un compte réel (montre COROS PACE 4 Pro), entre le 22 et le 23 octobre 2026.
Une autre montre — Camille passe à une montre COROS : le MCP officiel par un relais local et une seule connexion pour toutes les IA, le même bilan matinal avec une récupération COROS nommée sans conversion, les séances envoyées à la montre après un « oui », la fiche Pace Strategy à recopier le jour J, et les limites dites franchement.
En bref¶
| État | |
|---|---|
| Connexion (une fois, pour toutes les IA) | ✅ ./install.sh --source coros (source de données) ou --coros (montre seule) |
| Envoyer les séances de course, trail et vélo à la montre | ✅ cibles FC et allure personnelles |
| Modifier une séance envoyée | ✅ |
| Supprimer ou déplacer une séance | ❌ dans l'app COROS (aucun outil dans le MCP) |
| Parcours et Pace Strategy de course | ❌ dans l'app COROS ; le coach prépare la fiche à recopier (arc_coros_workout.py pace-strategy) |
| Renforcement structuré | ✅ vos séances types, créées une fois dans l'app, planifiées par le coach |
| Allure seuil COROS (contrôle de la vitesse critique) | ✅ |
| Lire activités, tours, santé, récupération | ✅ |
| FIT et analyses fines (zones, GAP, découplage, montées, foulée) | ✅ download_fit.py --source coros, identifiant coros_activity_id |
Source de données coros : activités et santé enregistrées, bilan matinal, synchronisation quotidienne |
✅ ./install.sh --source coros |
Surveillance ([sync].mode = "watch") : synchronisation dès qu'une séance ou la nuit arrive |
✅ sans IA, par le relais |
| Splits par km | ✅ calculés depuis le FIT (arc_index.py splits c<LabelId>), comme pour toutes les sources |
| FC de récupération, matériel par séance, pesées | ❌ absents du MCP COROS |
Deux façons de brancher la montre¶
./install.sh --source coros |
./install.sh --coros |
|
|---|---|---|
| Pour qui | votre montre est une COROS | votre source de données reste une autre |
Activités et santé enregistrées (activities/, medical/), bilan matinal, synchronisation quotidienne, surveillance |
✅ comme avec Garmin | ❌ lectures pendant la conversation seulement |
| Séances envoyées à la montre | ✅ destination principale | ✅ |
--source coros implique --coros (le relais est la source de données) ; --no-coros lui
est refusé. Il installe aussi un petit environnement Python dédié à la lecture des FIT
(~/.local/share/ai-running-coach/fit-reader, fitparse), puisque garmin-mcp n'est plus là.
Installation : une seule connexion pour toutes les IA¶
./install.sh --source coros # ou --coros pour la montre seule
- Une seule connexion. L'installeur lance
python3 scripts/arc_coros_auth.py login(en interactif seulement) : le navigateur s'ouvre, vous autorisez l'accès à votre compte COROS, c'est tout. Sans navigateur sur la machine (serveur, SSH) :arc_coros_auth.py login --deviceaffiche une adresse et un code à valider depuis votre téléphone. Les jetons vont dans~/.config/ai-running-coach/coros/(dossier 700, fichiers 600) et ne sont jamais affichés. - Toutes les IA. Le serveur
corosest déclaré dans la config de chaque client (Claude Code, Copilot, Cursor, OpenCode, Gemini, Windsurf) : c'est un relais local,scripts/arc_coros_mcp.py, qui transmet au MCP officiel de COROS avec ces jetons. Aucun client ne fait de connexion OAuth ; les outils et les réponses sont ceux de COROS, sans réécriture. - Renouvellement automatique. Le jeton d'accès vit 30 jours ; le relais le renouvelle quand il reste moins de 7 jours (ou après un refus), sous verrou, car COROS remplace aussi le jeton de rafraîchissement à chaque fois. Constaté : rafraîchissement forcé (nouveaux jetons, 30 jours), et relais avec un jeton d'accès refusé → rafraîchi puis 34 outils listés (33 depuis le 23/10). Pas encore mesurés : la durée de vie du jeton de rafraîchissement et le sort de l'ancien après rotation.
- Jamais d'écriture sans vous. Pendant la synchronisation sans tête, le relais passe en lecture seule et les 7 outils d'écriture sont refusés par leur nom, quelle que soit l'IA qui la lance.
- Vérifier :
python3 scripts/arc_coros_auth.py status(sans réseau),verify(appel réel du MCP), ou/coach-doctor(contrôlecoros_connection). Retirer :./install.sh --no-coros(ne touche jamais une entréecorosajoutée à la main), puisarc_coros_auth.py logout.
Vous aviez ajouté le serveur à la main (claude mcp add … coros https://mcpeu.coros.com/mcp) ?
Retirez-le (claude mcp remove coros), sinon il masque le relais : Claude Code donne la
priorité à une entrée locale sur celle du projet, et vous auriez deux connexions.
Envoyer les séances à la montre¶
Le coach envoie les séances validées au calendrier COROS (skill
coros-workout-scheduling) ; l'app COROS les
synchronise sur la montre. En interactif seulement, après votre « oui » explicite.
- Cibles personnelles : plages FC en bpm et allure sur le plat calculées depuis votre
profil (
arc_workout_targets.py), mises au format COROS parscripts/arc_coros_workout.py section, contrôlées parvalidateavant l'envoi. Jamais les zones de COROS, qu'une montre neuve n'a pas encore calibrées. - Pas de doublon : le calendrier est lu avant chaque envoi ; une séance déjà présente est mise à jour, jamais recréée. Un seul chemin vers la montre : si un autre service envoie déjà vos séances au calendrier COROS, coupez cet envoi, sinon chaque séance apparaît deux fois.
- Relue après envoi : la séance relue doit être identique à celle envoyée.
Constaté :
- Création (
createScheduledWorkout) : 40 min à 137-149 bpm puis 4 × 100 m + 1 min de récupération, relue à l'identique (COROS y ajoute son estimation de durée, de distance et de charge), affichée sur la montre après synchronisation. - Modification (
updateScheduledWorkout) : la séance entière est remplacée (durée, FC, nom, description), relue à l'identique, sans doublon. - Trail : pas de cible de durée en trail. Une séance prescrite en minutes passe en étapes libres (« Manuel » dans l'app, bouton Tour, cible FC gardée, durée écrite dans la consigne) ou en séance de course ; le coach vous demande une fois ce que vous préférez. COROS ne donne alors ni durée, ni distance, ni charge estimées.
- Montée : une répétition « 30 m de D+ » s'affiche « 30 m » avec l'icône de montée.
- Suppression, déplacement : aucun outil. Le coach vous dit quelle séance retirer dans l'app COROS.
Règles du schéma (lues dans la description de l'outil, appliquées par
arc_coros_workout.py validate) : course, trail et vélo seulement ; pas de cible de
durée en trail (distance, D+ ou libre) ; un seul format d'intensité par étape (zone,
pourcentage ou valeurs absolues) ; allure en s/km entières ; groupes de 1 à 20
répétitions, sans imbrication ; dates d'aujourd'hui à aujourd'hui + 90 jours.
idInPlan, l'identifiant rendu, est un petit compteur (« 1 », « 2 »), qui ne commence
pas toujours à 1 et n'est pas unique : une séance se désigne par sa date et son
idInPlan.
Renforcement : vos séances types¶
Le MCP ne sait ni créer, ni lire, ni modifier une séance de renforcement (« COROS sport
type 4 (Strength) cannot be expressed by MCP »). Il sait en revanche planifier une
séance de votre bibliothèque COROS, renforcement compris (scheduleWorkout). D'où le
partage :
- Vous, une fois : vous créez dans l'app COROS une séance type par renforcement que le coach vous donne (en général 1 à 3, à refaire au changement de phase). Le coach peut vous en recopier la fiche (exercices, tours, répétitions ou maintiens, par côté) ; les repos qu'il ne précise pas sont à votre choix.
- Le coach retrouve la séance (
queryWorkoutLibrary), vous la propose pour la date prévue et la planifie après votre « oui ».
Constaté sur deux séances créées dans l'app (« Renfo lombaires », « Renfo descentes ») :
queryWorkoutLibraryles liste avec leur durée estimée et leur nombre de séries ;queryWorkoutDetailsne rend que le nom et le sport : le coach ne voit pas les exercices, seule l'app (ou la montre) fait foi ;scheduleWorkouta posé « Renfo descentes » sur une date ;queryTrainingSchedulel'a relue comme « Standalone workout (scheduled from the workout library) », et la séance est arrivée sur la montre avec ses exercices ;- la date reçoit une copie figée : modifier ensuite la séance type ne la change pas, et le MCP ne peut pas modifier la copie. Finissez les retouches avant que le coach planifie ; supprimer ou déplacer se fait dans l'app ;
- dans l'app, un côté = un exercice à part (ou une seule entrée « par côté »), les tours sont un bloc « Répéter N fois », un exercice peut rester hors du bloc. Noms du catalogue en français : « Crunch », « Chien d'oiseau » (bird-dog), « Couché sur le dos Pont des fessiers », « Extension mollets debout », « Gainage latéral », « Étirement du chat et de la vache ». Le curl-up de McGill n'a pas d'équivalent exact : « Crunch » avec une note (tenir 10 s, une jambe pliée, mains sous les lombaires).
Ce que le MCP lit¶
Activités (relevées le 22 octobre 2026, première séance) :
querySportRecords: une ligne par séance, aveclabelIdetsportType(codes d'activité : 100 course, 102 trail…), horodatages de début et de fin, durée, distance, allure, FC moyenne, calories, coordonnées de départ.LabelIdest un entier de 18 chiffres (481221836600803431). Le champ « Location » contient le nom de l'activité (celui de la séance planifiée quand elle en vient, sinon le titre, par exemple « Cusy Course ») : jamais un lieu fiable ;getActivityDetail: texte, résumé seulement (allure, allure ajustée à la pente, FC moyenne, cadence, longueur de pas, puissance, D+/D−, calories, charge, effets aérobie/anaérobie, effort perçu). Pas de FC de récupération, pas de matériel ;queryActivityLapData: JSON avec des libellés de colonnes en chinois, plusieurs découpages (type10 = par km, 2 = étapes de la séance, 11 = tous les 5 km, -1 = total). Unités relevées : distance en cm, temps en s, allure en s/km, vitesse en km/h × 100, temps de contact en ms, oscillation en mm, longueur de pas en cm. Le découpage « par km » repart de zéro à chaque étape de la séance planifiée : sur la séance du 22/10, un tour de 194,85 m à la fin des 40 min, puis un tour par ligne droite et par récupération. Ce ne sont donc pas des splits au km réguliers ; les splits sont calculés depuis le FIT (arc_index.py splits) ;queryActivityFitFileDownloadUrls(labelId, sportType): une URL de fichier FIT standard (produit « COROS PACE 4 Pro », 3 786 points : FC, allure, altitude, GPS, puissance, temps de contact, oscillation, longueur de pas), lisible parfitparseet par la normalisation du projet sans changement. COROS annonce 50 fichiers par jour au plus. Constaté le 23/10 :sportTypeest exigé mais pas vérifié (100 et 102 rendent le même fichier) ; l'URL pointe vers le stockage de COROS et se télécharge sans authentification (le projet ne l'affiche jamais) ; une demande par plage de dates a été refusée par le serveur (« Tool call anomalies detected »), d'où une demande parlabelId.
Le FIT dans le projet : download_fit.py <c+LabelId> --json --source coros (skill
fit-download) passe par le relais, avec nos jetons, puis écrit la copie normalisée
activities/fit/c<LabelId>.json. Une séance au contrat porte coros_activity_id
("c481221836600803431") et start_time. Constaté sur la séance du 22/10 : zones, allure
ajustée à la pente, découplage, montées (1 montée de 123 m à 558 m/h) calculés comme pour
une séance Garmin. Les montées d'une séance COROS sont numérotées par son heure de départ :
le LabelId de 18 chiffres dépasse les entiers que le tableau de bord sait manipuler.
Santé et récupération (relevées le 23 octobre 2026, avant la fin de la première nuit) :
queryRestingHeartRate(days): une ligne par jour,2026-10-22: 66 bpm, ouNo data; ne prend qu'un nombre de jours, pas de date ;queryDailyHealthData(days): en-têteResting HR: 68 bpm | HRV Baseline: 42 ms, puis par jour pas, calories, temps d'exercice, stress moyen ;queryRecoveryStatus:Recovery: 96%, un niveau (Heavy training allowed) et le temps estimé avant récupération complète (9h). Sans donnée :Recovery: -1% / Level: Unknown— une valeur absente, pas un score ;-
querySleepOverviewetquerySleepHrv: datés par le jour du réveil (la nuit qui finit le matin de D est rangée sous D). Nuit pas encore terminée :Sleep Score: 0avec « Sleep detail for this day is not available yet » (0 = absent, pas un score) et « No data found ». Nuit complète (relevée le 24/10/2026) :Sleep Score: 72,Daily Sleep: 5h 29min (incl. naps),Main Sleep (asleep): 4h 47min,Main Sleep Period (incl. awake),Sleep metrics scope: daily, ratios de phases en % (profond, léger, paradoxal, éveil),Awake Time,Main Sleep Window: 2026-10-24 04:45 - 2026-10-24 09:38, puis les siestes (Naps Total (asleep),Nap Window).querySleepHrvrendHRV Avg: 23 msseul tant que la ligne de base n'existe pas, puis la série brute (un point toutes les 5 à 15 minutes, horodatage Unix,timezoneen quarts d'heure). -
queryMenstruationCycles: sur un compte sans saisie, plage interrogée (30 jours avant, 365 après), « No cycle includes today », durées habituelles (7 jours de règles, cycle de 28 jours, valeurs par défaut) et « No menstrual cycle data found ». Jamais une phase à déduire de ces durées par défaut.
Forme : queryFitnessAssessmentOverview rend VO2max, niveau de course, allure seuil
(Threshold Pace 4:12 /km le 22/10) et prédictions, en texte. L'allure seuil sert au
contrôle de la vitesse critique (arc_coros_workout.py threshold, nommée « allure seuil
COROS »), jamais comme cible.
Pace Strategy (plan de course)¶
Le Pace Strategy de COROS guide l'allure section par section le jour de la course : allure cible du segment en cours, avance ou retard sur le temps visé, compte à rebours avant chaque ravito (article d'aide COROS, relu le 23 octobre 2026). Il se crée uniquement dans l'app COROS (Profil → Pace Strategy), sur une distance ou, pour le trail, sur une route de votre bibliothèque. Aucun des outils du MCP ne crée, n'importe ni ne lit une route ou un Pace Strategy : le coach ne peut pas le faire à votre place. COROS le dit lui-même : sa page « Build on COROS MCP » (mise à jour le 20 octobre 2026) liste « No GPX route import/export » parmi les limites du MCP.
Pas de fichier de temps de passage non plus. Certains formats portent des temps prévus : un parcours
TCX ou FIT avec horodatages (le « Virtual Partner » de Garmin les suit), ou un GPX avec <time> sur
chaque point. Chez COROS, une route s'importe en GPX standard, par l'app (ou synchronisée depuis Strava,
Komoot) ; rien dans sa documentation n'indique que les horodatages du GPX servent : la route sert à la
navigation, l'allure prévue passe par le Pace Strategy.
Il vous prépare en revanche ce qu'il faut y saisir, depuis le plan de course du course-strategist :
python3 scripts/arc_coros_workout.py pace-strategy --plan planning/<plan>.md --text
- Temps cible du scénario choisi (par défaut celui du temps visé du plan ;
--scenariopour un autre). - Temps d'arrêt à chaque ravito, à saisir aux points de passage de la route ; l'arrivée n'en a pas.
- Nos allures par segment (modèle personnel, chaleur, nuit, technicité, altitude). COROS découpe ses propres segments et calcule leur allure d'après la pente et son estimation de votre forme : ne corrigez (« Expand and Edit ») que ceux qui s'écartent nettement des nôtres.
Les temps sont exactement ceux du plan (mêmes temps de passage, arrêts compris). Dans l'app :
- importez le GPX enrichi par le
course-strategist(ravitos en points de passage) ; dans Explore, vérifiez que chaque ravito est un point de passage avec alerte, sinon l'app ne propose pas de temps aux points de passage (la conservation des points de passage à l'import n'a pas encore été vérifiée par le projet) ; - Profil → Pace Strategy → + → Route → cette route, puis le temps cible ;
- le temps d'arrêt de chaque point de passage ;
- les segments qui s'écartent de la fiche ;
- à moins de 3 jours de la course, l'heure de départ (météo par section) ;
- sauvegardez et synchronisez ; le jour J : mode Trail Run → Pace Strategy.
En complément, le coach peut pousser l'allure de course sur la montre sous forme de séance structurée (une étape par section, cible FC ou allure d'effort), par le MCP : utile pour tenir l'effort, mais sans carte ni prévision d'arrivée.
Le bilan matinal avec COROS¶
Avec --source coros, le bilan matinal est le même triptyque qu'avec Garmin, au niveau de
[health].morning_check :
| Garmin | COROS | Enregistré dans medical/AAAA-MM-JJ_health.md |
|---|---|---|
| HRV nocturne | querySleepHrv (évaluation officielle du jour) |
hrv_overnight_ms |
| FC de repos | queryRestingHeartRate |
resting_hr_bpm |
| Training Readiness | récupération COROS (queryRecoveryStatus) |
provider_scores (recovery, 0-100) |
| Score de sommeil | score de sommeil COROS (querySleepOverview) |
provider_scores (sleep, 0-100) |
- Nommer, jamais convertir. Le coach dit « récupération COROS 96 % », jamais « Training Readiness », et ne la compare jamais aux seuils Garmin. C'est un état actuel, mis à jour en continu : il ne prouve jamais que la nuit a été lue.
- Jour du réveil. La nuit du 22 au 23 est datée du 23.
- Nuit pas encore calculée.
Sleep Score: 0, HRV « No data found », FC de reposNo data: la nuit n'est pas encore arrivée chez COROS. La première nuit avec une nouvelle montre n'est jamais publiée : le 23/10/2026, l'app COROS elle-même affichait « Il n'y a pas de données de sommeil pour le moment », et le MCP n'a jamais rien rendu. Les nuits suivantes arrivent après la synchronisation du téléphone (le 24/10, nuit vue par la surveillance entre 12 h 15 et 12 h 30, juste après la synchronisation). La synchronisation sans tête n'écrit alors aucun fichier santé et réessaie au passage suivant ; en conversation, le coach le dit et décide sur la charge et votre ressenti. - Ligne de base HRV : environ 5 nuits avec la montre selon COROS ; avant, « ligne de base COROS en construction ».
- Sommeil principal seulement.
python3 scripts/arc_coros_sleep.py --date D(réponse dequerySleepOverviewsur l'entrée standard) rend les clés à recopier : la durée est celle du sommeil principal, les siestes ne sont jamais additionnées, et les ratios de phases ne sont pas convertis en secondes (COROS ne dit pas s'ils couvrent la sieste). - Nuit coupée en deux. COROS peut découper une nuit continue en sommeil principal + « sieste ».
Le 24/10/2026, une personne à côté s'est réveillée vers 9 h 40 : COROS a noté 04:45 – 09:38 puis
une sieste 11:30 – 12:15, alors que l'athlète a dormi d'une traite (la série HRV n'a aucun trou).
Quand une sieste commence moins de 3 h après la fin du sommeil principal, le script lève
split_suspected: le coach donne les deux morceaux et vous demande ce qu'il en est (votre réponse prime), la synchronisation le signale dans le résumé, et ce sommeil court ne fait jamais passer le verdict à l'orange ou au rouge à lui seul.
Correspondance Garmin ↔ COROS¶
Ce que la source coros lit, outil par outil. La table de référence des agents (avec les
règles de persistance) est dans skills/data-source-mapping/SKILL.md, « Correspondance des outils — Garmin ↔ COROS ».
| Besoin | Outil garmin |
Outil coros |
Note |
|---|---|---|---|
| Activités récentes | get_activities_by_date |
querySportRecords(startDate, endDate, sportTypeCodes…) |
Texte : une entrée par séance, LabelId + SportType (100 course, 101 tapis, 102 trail, 104 randonnée…), horodatages, durée, distance, allure, FC moyenne, calories. « Location » = nom de l'activité, jamais location. |
| Détail d'une activité | get_activity |
getActivityDetail |
Texte résumé : allure, allure ajustée à la pente, FC, cadence, puissance, D+/D−, calories, charge, effort perçu. Pas de FC de récupération ni de matériel : omis, jamais inventés. |
| Tours | get_activity_splits |
queryActivityLapData |
Distances en cm, libellés en chinois. Le découpage « par km » repart à chaque étape de la séance planifiée : jamais recopié dans splits. |
| FIT | get_activity_fit_data |
queryActivityFitFileDownloadUrls |
Par download_fit.py --source coros, jamais par l'IA ; 50 fichiers par jour. |
| Identifiant au contrat | garmin_activity_id |
coros_activity_id |
"c" + LabelId, avec start_time. |
| HRV nocturne | get_hrv_data |
querySleepHrv |
Jour du réveil. HRV Avg (plus plage normale et ligne de base une fois construites), puis la série brute. |
| FC de repos | get_rhr_day |
queryRestingHeartRate(days) |
AAAA-MM-JJ: N bpm ou No data ; nombre de jours seulement, pas de date. |
| Sommeil | get_sleep_data |
querySleepOverview |
Jour du réveil ; Sleep Score: 0 = nuit pas encore disponible, pas un score. Lu par arc_coros_sleep.py : sommeil principal seul, nuit coupée signalée. |
| Readiness | get_training_readiness |
queryRecoveryStatus |
Récupération COROS : Recovery: N%, un niveau, un temps avant récupération complète ; -1% = absent. État actuel seulement (pas d'historique). Toujours nommée « récupération COROS N % », jamais « Training Readiness », jamais comparée aux seuils Garmin. |
| Cycle menstruel (opt-in) | get_menstrual_data_for_date |
queryMenstruationCycles |
Sans saisie : « No menstrual cycle data found », aucune phase. |
| Seuil lactique | — | queryFitnessAssessmentOverview |
Allure seuil COROS, arc_coros_workout.py threshold. |
| Calendrier, push | get_scheduled_workouts, schedule_workouts |
queryTrainingSchedule, createScheduledWorkout, updateScheduledWorkout |
Voir « Envoyer les séances à la montre ». |
| Matériel, pesées, FC de récupération, nutrition | get_gear, get_daily_weigh_ins… |
aucun équivalent | Indisponibles, dits comme tels. |
Les outils (relevés le 22 octobre 2026, revus le 23)¶
34 outils le 22 octobre (27 en lecture, 7 en écriture), 33 le 23 : COROS a retiré
analyzeActivityDetail (analyse rédigée d'une séance, jamais utilisée par le projet).
| Famille | Outils |
|---|---|
| Activités | querySportRecords, getActivityDetail, queryActivityLapData, queryCustomActivityLapData (analyzeActivityDetail : retiré le 23/10) |
| FIT | downloadActivityFitFiles, queryActivityFitFileDownloadUrls |
| Santé | querySleepHrv, querySleepOverview, queryRestingHeartRate, queryAvgHeartRate, queryDailyHealthData, queryHealthCheckTimeSeries, queryStressLevel, queryStressTimeSeries, queryRecoveryStatus, queryMenstruationCycles |
| Forme et charge | queryTrainingLoadAssessment, queryFitnessAssessmentOverview |
| Profil | queryUserInfo, queryDevices |
| Calendrier (lecture) | queryTrainingSchedule, queryScheduledWorkoutDetails, queryTrainingPlanLibrary, queryTrainingPlanDetails, queryWorkoutLibrary, queryWorkoutDetails |
| Calendrier (écriture) | createScheduledWorkout, updateScheduledWorkout, scheduleWorkout, createSingleWorkout, updateWorkoutDetails, createTrainingPlan, updateTrainingPlan |
Le projet n'utilise pas createTrainingPlan / updateTrainingPlan (le plan vit dans
planning/), ni createSingleWorkout / updateWorkoutDetails (une séance type n'est
pas nécessaire pour mettre une séance de course à une date).
Détails techniques¶
Adresse. https://mcp.coros.com/mcp (l'URL publiée par COROS) déclare dans ses
métadonnées OAuth la ressource https://mcpeu.coros.com/mcp (instance européenne) ; les
clients qui exigent la correspondance, comme Claude Code, doivent utiliser directement
l'URL régionale.
OAuth. Métadonnées publiées (/.well-known/oauth-protected-resource/mcp,
/.well-known/oauth-authorization-server) : enregistrement dynamique de client
(/connect/register, client public sans secret), code + PKCE S256, jeton de
rafraîchissement et connexion par code d'appareil (device_code). Portées
openid mcp.tools offline_access. Le projet enregistre son propre client
(« ai-running-coach ») : ses jetons ne touchent pas à ceux d'une IA connectée à la
main. Jeton d'accès : JWT de 30 jours ; le rafraîchissement rend un nouveau jeton
d'accès et un nouveau jeton de rafraîchissement (rotation constatée).
API Partenaires de COROS : hors de portée. Elle a ce qui manque au MCP (route/push en GPX/KML,
plans d'entraînement poussés, webhooks, synchronisation dans les deux sens), mais elle est réservée aux
plateformes établies : société enregistrée, base d'utilisateurs démontrée, contrat (page « Partner API
Access », mise à jour le 12 octobre 2026). Pas pour un projet personnel ; COROS renvoie ceux-là vers le
MCP.
API privée de COROS : non utilisée. Le jeton du MCP y est refusé (1019 « Access
token is invalid », sonde en lecture seule). Les seules fonctions qu'elle aurait
ajoutées (suppression d'une séance, création de renforcement) restent dans l'app COROS.
Le projet n'utilise jamais la connexion par e-mail et mot de passe de cette API, ni le
projet communautaire cygnusb/coros-mcp qui
s'en sert.
Références¶
- Page COROS : https://coros.com/stories/coros-metrics/c/mcp-testing
- Revue de presse : https://the5krunner.com/2026/05/13/coros-mcp-ai-data/
- Premier audit du MCP (3 octobre 2026, avant tout accès authentifié) : issue #168
- Pace Strategy : https://support.coros.com/hc/en-us/articles/47115766323348-Pace-Strategy
- Build on COROS MCP (limites du MCP) : https://support.coros.com/hc/en-us/articles/53181619102996
- Partner API Access : https://support.coros.com/hc/en-us/articles/53181766856724
- Import de routes : https://support.coros.com/hc/en-us/articles/24181489692436
