googlarz/suunto-mcp

googlarz/suunto-mcp

от googlarz
Suunto MCP — сервер для подключения тренировочных данных с часов Suunto к ИИ Claude. Спрашивайте о своих забегах на естественном языке, получайте точные цифры без дашбордов. Помогает бегунам анализировать тренировки через диалог.

Suunto MCP

Suunto MCP

CI npm License: MIT suunto-mcp MCP server

Ask Claude anything about your training. Suunto MCP connects your Suunto watch data to Claude so you can just talk to your data instead of clicking through dashboards.

Built by a Suunto user who wanted to ask "how was my last long run?" and get a real answer with numbers — and to feed live training data into a personal AI coach.

🏃 For regular Suunto users: Suunto's API docs say access is for commercial partners only — that's not the full picture. Private users get access too. It just takes 3–4 weeks for approval after you apply. Submit, wait, enjoy. Don't let that disclaimer stop you. ✅


What you can do

Once it's set up, just ask:

  • "How many kilometers did I run this month?"
  • "Compare my last three long runs — has my heart-rate drift improved?"
  • "How did my heart rate hold up set by set in last night's gym session?"
  • "What's my average resting HR trend over the last two weeks?"
  • "Summarize my training week in the style of a coaching report."
  • "I've been feeling off — how do my recovery scores compare to last month?"
  • "Find every workout where I averaged above 160 bpm."
  • "Which of my runs this year had the most elevation?"

Часто задаваемые вопросы

Инструменты были проиндексированы:
delete_guideидемпотентныйвнешний мир

Безвозвратно удаляет один SuuntoPlus Guide из аккаунта пользователя по id. Использует list_guides, чтобы найти id. Удаляет его из каталога Suunto app / apizone; не залезает в часы, чтобы открепить копию, уже синхронизированную туда. Операция записи (необратимая).

Удаляет руководство SuuntoPlus

Параметры
  • guideIdstringобязательный

    Идентификатор guide, полученный из list_guides или из предыдущего ответа push_*_guide.

export_routeтолько чтениевнешний мир

Экспортирует сохранённый маршрут Suunto в виде строки GPX 1.1 XML. Подходит для импорта в навигационные приложения (Komoot, Strava, Garmin Connect и т.д.). Используйте list_routes, чтобы найти допустимые ID маршрутов. Только для чтения.

Экспортирует маршрут в GPX.

Параметры
  • routeIdstringобязательный

    ID маршрута, возвращённый list_routes.

export_workout_gpxтолько чтениевнешний мир

НЕДОСТУПЕН - API-шлюз Suunto сейчас отклоняет этот эндпоинт (/v2/workout/exportGpx) с ошибкой 401 OperationNotFound на аккаунте, на котором его тестировали (сентябрь 2026), поэтому вызов падает с ошибкой 'endpoint unavailable'; проблема не в аутентификации. Возвращал бы GPS-маршрут тренировки в виде строки XML GPX 1.1. Оставлен, чтобы инструмент снова заработал, если Suunto восстановит эндпоинт. Только чтение.

Экспортирует тренировку в GPX.

Параметры
  • workoutKeystringобязательный

    Непрозрачная строка, которую присваивает сервер и возвращает list_workouts. Угадать или собрать её вручную нельзя: сначала всегда получай её через list_workouts. Передача неверного ключа выбрасывает SuuntoNotFoundError.

generate_daily_digestидемпотентныйвнешний мир

Строит цветовой ежедневный дайджест здоровья (шаги, сон, баланс восстановления, HRV и модель тренировочной нагрузки) за одну дату и дописывает его в markdown в файл истории. В API Suunto нет эндпоинтов fitness/fatigue, поэтому инструмент вычисляет CTL (42-дневная тренированность), ATL (7-дневная усталость) и TSB (форма) из tss.trainingStressScore каждой тренировки, используя стандартные экспоненциальные постоянные времени, и сохраняет текущие значения в локальном sidecar-файле (переменная окружения SUUNTO_DIGEST_AVERAGES_PATH, по умолчанию ~/.suunto-mcp/averages.json), так как больше их негде хранить. Там же отслеживаются базовые значения скользящего среднего (по всем дням на текущий момент) для каждой метрики, с отдельной корзиной базовой линии для «party nights» (>20 000 шагов), чтобы они не искажали среднее по обычным дням. Требует подписок на Sleep и Recovery API в apizone, чтобы разделы сна и восстановления заполнялись - для разделов без подписки подставляет текст «no data», а не выдаёт ошибку. Операция записи (обновляет sidecar-файл и дописывает в файл истории).

Формирует ежедневную сводку о состоянии здоровья.

Параметры
  • datestringобязательный

    Календарная дата YYYY-MM-DD для сводки. Используйте вчерашнюю дату или более раннюю - данные за сегодня обычно неполные, пока часы не синхронизируются.

  • seedAtlnumber

    То же, что и seedCtl, но для Fatigue (ATL). Используется только при самом первом запуске digest за всё время.

  • seedCtlnumber

    Используется только при самом первом запуске дайджеста (если нет предыдущего sidecar file). Привязывает начальное значение Fitness (CTL) к числу, отображаемому на часах пользователя, вместо холодного старта с 0. Запрашивает у пользователя отображаемое на его часах значение Fitness, если это его первый дайджест.

get_daily_activityтолько чтениевнешний мир

Возвращает замеры активности 24/7 за один локальный календарный день (00:00-23:59 по локальному времени, которое часы проставили на каждом замере) из API /247samples, в виде обычного массива из { timestamp (ISO 8601 со смещением UTC), entryData: { HR (bpm), StepCount, EnergyConsumption (джоули, как в get_daily_activity_statistics) } } - 144 строки за полный день, по одной каждые 10 минут (138 или 150 в дни перевода часов). День без синхронизированных данных возвращает []. Для диапазона дат используйте list_daily_activity. Требует подписки на 24/7 Activity API на apizone. Только для чтения.

Получает ежедневную активность

Параметры
  • datestringобязательный

    Календарная дата в формате YYYY-MM-DD (локальный день, по локальному времени, которое часы проставили на каждом замере). Данные приходят, когда часы синхронизируются, поэтому данные за сегодня обычно неполные: API отвечает 200 с пустым или частичным payload для сегодняшней даты и будущих дат, а не ошибкой (подтверждено вживую). Для полных результатов используйте вчерашнюю дату или более раннюю.

get_daily_activity_statisticsтолько чтениевнешний мир

Возвращает суммарное число шагов за день и расход энергии (в джоулях) из API /247 за указанный диапазон даты и времени. Ответ - массив объектов AggregatedActivityData, у каждого есть Name ('stepcount' или 'energyconsumption'), Aggregation ('sum') и массив Sources с Samples по каждому устройству, где указаны TimeISO8601 и Value. Окно должно быть меньше 28 дней (ровно 28 отклоняется). Samples с null в Value означают, что за этот день данные не синхронизировались. Каждый дневной Sample помечен местным полуднем (TimeISO8601 вида 2026-09-27T12:00:00+02:00); замечено, что окно в один день (startdate = enddate = D) возвращает samples за D и за следующий день, поэтому выбирайте samples по дате в TimeISO8601, а не суммируйте ответ. Предпочитайте этот инструмент вместо list_daily_activity, когда нужны итоги, а не внутридневные временные ряды. Только чтение.

Получает ежедневную статистику активности.

Параметры
  • enddatestringобязательный

    Дата и время окончания в формате ISO-8601, те же формы, что и startdate (например, 2026-04-27T23:59:59). Должны отстоять от startdate менее чем на 28 дней.

  • startdatestringобязательный

    Дата и время начала в формате ISO-8601, со смещением UTC или без него (например, 2026-04-01T00:00:00 или 2026-04-01T00:00:00+02:00). Смещение, записанное как +0200, в том виде, в каком его выводит date +%z, переписывается в +02:00, потому что Suunto отклоняет первый вариант.

get_daily_snapshotтолько чтениевнешний мир

Один вызов на вопрос «как прошёл этот день и ночь перед ним»: агрегация, которую остальные инструменты перекладывают на вызывающего. Вывод: { date, sleepNightOf, sleep, recovery, activity, workouts, errors }. sleep описывает НОЧЬ, ПРИВЕДШУЮ К этой дате (sleepNightOf = предыдущая дата, то есть сны, начавшиеся между полуднем предыдущего дня и полуднем этой даты): { main (самый длинный сон, не помеченный как дрёма: sleepId, bedtimeStart, bedtimeEnd, durationS, deepS, lightS, remS, score, avgHrv, hrAvg, hrMin, spo2Max, latencyS, wasoS, wakeBeforeOffBedS - все длительности в секундах: время до засыпания, бодрствование после засыпания, бодрствование в постели до подъёма), otherNights (остальные не-дрёмы, когда часы разбили ночь на части), nightSleepS (сумма main + otherNights, null, когда их нет), naps }. Suunto помечает любой сон короче примерно 3 часов как дрёму, поэтому короткая ночь попадает в naps, а main остаётся null. recovery охватывает локальный календарный день: { samples, low: { balance, at }, high, first, last, morning: { balance, at } (замер, ближайший к bedtimeEnd основного сна - значение при пробуждении), atBedtime: { balance, at } (ближайший к его bedtimeStart, который приходится на предыдущий локальный день), оба null, когда нет основного сна или нет замера в пределах часа, stressStateSamples (замеры по StressState) } или null, если данных нет. low - самый низкий balance за день, необязательно ночью (после вечерней тренировки он может упасть вечером). activity: { steps, energyKcal } за локальный день: energyKcal - это энергия из дневной статистики, переведённая из джоулей; реальные дни дают около 700-1,500 ккал, заметно ниже расхода в покое, так что похоже на АКТИВНУЮ энергию, а не на общий расход (с часами не сверялось). Значение равно null, а не 0, когда у Suunto нет замера за эту дату. workouts: тренировки за день (по их собственной локальной дате) с { workoutKey, activityId, startLocal, totalTimeS, kcal, hrAvg, hrMax, tss (метод по HR), guide, hasLaps } - передайте workoutKey с hasLaps в get_workout_laps. Каждая секция...

Получает ежедневный снимок

Параметры
  • datestringобязательный

    Локальный календарный день YYYY-MM-DD (первый день, когда указан to). Для полного дня берите вчера или более раннюю дату; данные за сегодня неполные, пока часы не синхронизируются, а ночь, которая перешла в сегодня, может ещё продолжаться.

  • tostring

    Необязательный последний день диапазона (включительно, не более 14 дней от date). Тогда результат такой: { from, to, days: [по одной записи на каждый день, в форме выше, без ошибок], errors } - один запрос на секцию для всего диапазона, поэтому лучше использовать его, а не вызывать это раз в день.

get_recoveryтолько чтениевнешний мир

Возвращает образцы recovery-balance из API /247samples за один локальный календарный день (00:00-23:59 по локальному времени, которое часы проставили на каждом образце), как обычный массив из { timestamp (ISO 8601 со смещением UTC), entryData: { Balance (0.0-1.0 баланс восстановления), StressState (0=Invalid, 1=Relaxing, 2=Active, 3=Passive, 4=Stressful) } } - 48 получасовых строк за полный день (46 или 50 в дни перевода часов). День без данных о восстановлении возвращает []. Для диапазона дат использует list_recovery. Требует подписку Recovery API на apizone; без неё возвращает 404. Только для чтения.

Получает восстановление

Параметры
  • datestringобязательный

    Календарная дата в формате YYYY-MM-DD (локальный день, по локальному времени, которое часы проставили на каждом замере). Данные приходят, когда часы синхронизируются, поэтому данные за сегодня обычно неполные: API отвечает 200 с пустым или частичным payload для сегодняшней даты и будущих дат, а не ошибкой (подтверждено вживую). Для полных результатов используйте вчерашнюю дату или более раннюю.

get_sleepтолько чтениевнешний мир

Возвращает записи о сне за одну ночь из API /247samples. Дата означает НОЧЬ этой даты: каждый сон, начавшийся между 12:00 (полуднем) этого дня и 12:00 следующего дня, по местному времени, которое часы проставили на записи сна, - так что отбой в 23:00, 00:30 и 03:00 относится к одной и той же дате, а дневной сон записывается вместе с ночью после него. Поэтому прошлая ночь идёт под вчерашней датой. Обычный массив, по одной строке на сон - Suunto пересылает сон каждый раз, когда его правит, и сохраняется только самая длинная версия - из { timestamp (= BedtimeStart, ISO 8601 со смещением UTC), entryData: { SleepId, IsNap, BedtimeStart, BedtimeEnd, Duration (с), DeepSleepDuration, LightSleepDuration, REMSleepDuration (с), SleepQualityScore, AvgHRV (мс), HRAvg, HRMin (уд/мин), … } }. IsNap равен true для любого сна короче примерно 3 часов, в любое время суток, и может переключиться, пока сон ещё записывается, - так что он помечает и короткий фрагмент разорванной ночи; не отбрасывайте строки только по IsNap. В одной ночи может быть несколько строк (разорванная ночь или сон рядом с ней): строки не объединяются, поэтому решайте по BedtimeStart и Duration, какие из них относятся друг к другу. Возвращает [], когда в этом окне не начался ни один сон, например для сегодняшней даты до наступления ночи. Для диапазона используйте list_sleep. Требует подписки на Sleep API в apizone; без неё возвращает 404. Только чтение.

Get Sleep

Параметры
  • datestringобязательный

    Дата YYYY-MM-DD ночи, а НЕ дата пробуждения: сессии сна, начавшиеся между полуднем этой даты и полуднем следующего дня (по местному времени, которое часы проставили на каждом замере), так что время отхода ко сну вскоре после полуночи, даже 03:00, всё ещё относится к предыдущей дате. Сон прошлой ночи находится под вчерашней датой, а не под сегодняшней; сегодняшняя дата пуста, пока не начнётся сон этой ночи.

get_upload_statusтолько чтениевнешний мир

Опрашивает статус обработки загрузки тренировки, запущенной upload_workout. Возвращает статус (например, 'Queued', 'Processing', 'Processed', 'Error') и workoutKey, когда обработка завершается. Используйте возвращённый workoutKey с get_workout для получения полной информации.

Получает статус загрузки тренировки.

Параметры
  • uploadIdstringобязательный

    ID загрузки, который возвращает upload_workout.

get_workoutтолько чтениевнешний мир

Возвращает базовую сводку по одной тренировке (около 1.6 КБ): те же скалярные поля, что и у элемента list_workouts (times, distance, energy, hrdata, tss/tssList, recoveryTime), плюс extensionTypes, список потоков данных, которые Suunto хранит для этой тренировки. Она НЕ включает круги, зоны пульса или другие данные расширений. Для кругов и времени в зонах используйте get_workout_laps, для данных уровня записей - get_workout_fit. Выбрасывает SuuntoNotFoundError, если workoutKey имеет неверный формат (не 24 шестнадцатеричных символа) или не существует. Используйте list_workouts, чтобы найти допустимые значения workoutKey. Только для чтения.

Получает тренировку

Параметры
  • workoutKeystringобязательный

    Непрозрачная строка, назначаемая сервером, которую возвращает list_workouts. Угадать или собрать её нельзя - всегда сначала находите её через list_workouts. Если передать неверный ключ, выбрасывается SuuntoNotFoundError.

get_workout_fitтолько чтениевнешний мир

Скачивает бинарный FIT-файл тренировки из Suunto и возвращает его разобранным в JSON. По умолчанию (full=false): компактная сводка { sport, total_distance_km, avg_heart_rate, training_effect, laps (только СЧЁТЧИК, а не сами круги), records_sample: { first, middle, last (по одной записи), count } }. Установите full=true, чтобы получить все разобранные записи FIT и круги: с форматированием, около 550 КБ для силовой тренировки с 35 кругами, так что результат обычно уходит в файл. Для данных по отдельным кругам используйте get_workout_laps (около 2,5 КБ); full=true нужен только тогда, когда требуются данные уровня записей. Неизвестный workoutKey здесь падает с ошибкой 403 Forbidden (на остальных инструментах тренировок - not-found). Только чтение.

Получает FIT-данные тренировки

Параметры
  • fullboolean

    false (по умолчанию): возвращает компактную сводку. true: возвращает все разобранные записи FIT.

  • workoutKeystringобязательный

    Непрозрачная строка, назначаемая сервером, которую возвращает list_workouts. Её нельзя угадать или сконструировать - всегда сначала находите её через list_workouts.

get_workout_lapsтолько чтениевнешний мир

Возвращает ручные круги одной тренировки в виде компактной таблицы плюс её поля тренировочной нагрузки: так можно прочитать обратно управляемую тренировку в зале подход за подходом (push_strength_guide записывает один круг на подход и на отдых; push_workout_guide - один круг на упражнение и один на отдых между упражнениями). Сессия из push_interval_guide переключается автоматически, и ожидается, что она не записывает ручных кругов (не проверено), поэтому должна вернуть пустую таблицу. Около 2,5 КБ для силовой сессии на 35 кругов против ~550 КБ для get_workout_fit full=true. Вывод: { workoutKey, activityId, startTime (epoch ms), totalTimeS, guide: { id, name } | null (гайд, который выполнялся, как его записал Suunto - не ищется в list_guides, потому что гайды часто удаляют потом), tss: [{ method (пока встречались: 'HR', 'MET'), value }], pte, peakEpoc, recoveryTime (из расширения summary тренировки; единицы не проверены, и он может отличаться от recoveryTime, который несут list_workouts и get_workout), hrZoneTimeS: [zone1..zone5 в секундах], feeling (ответ на вопрос часов 'How was it?', передаётся как есть от Suunto; null, если пропущен), lapCount, checks: [{ code, detail }], laps: { cols, rows } }. checks перечисляет причины не доверять чтению таблицы по позициям (пусто, когда всё чисто): 'duplicate-rest' (одна и та же метка отдыха два раза подряд - пропущен круг подхода или отдых разбит), 'no-session-complete' (управляемая таблица без последнего круга - сессия закончилась раньше, кнопки заблокированы или часы перезагружены), 'unlabelled-laps' (у некоторых кругов нет метки гайда), 'no-heart-rate' (ни у одного круга нет пульса, например в режиме батареи Tour). laps.cols = [i (нумерация с 1), startOffsetS (от начала тренировки), durationS, hrAvg, hrMax, hrMin (bpm), kcal, kind, label]; каждая строка - массив в этом порядке. label - текст шага гайда, активного во время круга (строки соединены через ' | '), или null, если гайд не выполнялся. kind равен 'rest', когда label содержит 'Next:' в начале или после '·' (круг отдыха между подходами читается как 'Next: set k/S', или '<restSec>s target ·…

Получает круги тренировки

Параметры
  • workoutKeystringобязательный

    24-символьный workoutKey, который возвращает list_workouts. Всё остальное приводит к ошибке not-found, а Suunto не вызывается.

get_workout_samplesтолько чтениевнешний мир

НЕДОСТУПЕН - API-шлюз Suunto сейчас отклоняет этот эндпоинт (/v2/workout/samples) с ошибкой 401 OperationNotFound на аккаунте, на котором его тестировали (сентябрь 2026), поэтому вызов падает с ошибкой 'endpoint unavailable'. Проблема не в аутентификации. Для данных уровня записей (пульс и прочее) используйте get_workout_fit с full=true, а для отрезков - get_workout_laps. Инструмент оставлен, чтобы он снова заработал, если Suunto вернёт эндпоинт. Только чтение.

Получает образцы тренировок

Параметры
  • workoutKeystringобязательный

    Непрозрачная строка, которую присваивает сервер и возвращает list_workouts. Угадать или собрать её вручную нельзя: сначала всегда получай её через list_workouts. Передача неверного ключа выбрасывает SuuntoNotFoundError.

list_daily_activityтолько чтениевнешний мир

Возвращает образцы активности 24/7 из API /247samples для локальных календарных дней [from, to] включительно (по местному времени, которое часы проставили на каждом образце), упорядоченные хронологически, в виде простого массива из { timestamp (ISO 8601 со смещением UTC), entryData: { HR (bpm), StepCount, EnergyConsumption (джоули, как в get_daily_activity_statistics) } }. Дни без синхронизированных данных просто отсутствуют. get_daily_activity используется для одного дня, а get_daily_activity_statistics - для агрегированных дневных итогов по шагам/энергии. Требуется подписка на 24/7 Activity API в apizone. Только для чтения.

Перечисляет ежедневную активность

Параметры
  • fromstringобязательный

    Дата начала в формате YYYY-MM-DD, включительно. Должна быть ≤ to. Дни без синхронизированных данных молча пропускаются, а не отдают 404.

  • tostringобязательный

    Конечная дата в формате YYYY-MM-DD, включительно. Будущие даты принимаются, но записей не дают. Лучше указывать около 3-7 дней: за день набегает ~15 КБ, так что 30 дней дают ~450 КБ (для подсчёта за более длительный период используйте get_daily_activity_statistics).

list_guidesтолько чтениевнешний мир

Возвращает все SuuntoPlus Guides (из push_workout_guide/push_interval_guide/push_strength_guide) в аккаунте пользователя, сначала самые новые. Каждый элемент включает id, name, description, owner, localDate и usage. Используйте id с delete_guide или с параметром guideId инструмента push_*_guide, чтобы обновить существующий гайд, а не создавать новый. Только для чтения.

Выводит список руководств SuuntoPlus

Параметры

Без параметров.

list_recoveryтолько чтениевнешний мир

Возвращает образцы баланса восстановления из API /247samples за локальные календарные дни [from, to] включительно (по местному времени, которое часы проставили на каждом образце), в хронологическом порядке, в виде простого массива { timestamp (ISO 8601 со смещением UTC), entryData: { Balance (0.0-1.0, баланс восстановления), StressState (0=Invalid, 1=Relaxing, 2=Active, 3=Passive, 4=Stressful) } }. Дни без данных о восстановлении просто отсутствуют. Для одного дня используйте get_recovery. Требует подписки Recovery API на apizone; без неё возвращает 404. Только для чтения.

Выводит список восстановлений

Параметры
  • fromstringобязательный

    Дата начала в формате YYYY-MM-DD, включительно. Должна быть ≤ to. Дни без данных о восстановлении молча пропускаются, а не отдаются как 404.

  • tostringобязательный

    Дата окончания в формате YYYY-MM-DD, включительно. Будущие даты принимаются, но не дают записей. Лучше около 14 дней или меньше: один день даёт ~4 КБ вывода.

list_routesтолько чтениевнешний мир

Возвращает все маршруты, сохранённые в аккаунте Suunto пользователя. Каждый маршрут: id, описание, видимость, расстояние (м), начальные/конечные координаты, количество путевых точек. Используйте export_route, чтобы получить GPX-трек для навигации. Только для чтения.

Перечисляет маршруты

Параметры

Без параметров.

list_sleepтолько чтениевнешний мир

Возвращает сны для ночей с [from] по [to] включительно из API /247samples, упорядоченные хронологически по времени отхода ко сну. Дата означает НОЧЬ этой даты: каждый сон, начавшийся между 12:00 (полуднем) этого дня и 12:00 следующего дня, в местном времени, которое часы зафиксировали для этого сна, так что моменты отхода ко сну 23:00, 00:30 и 03:00 относятся к одной и той же дате, а дневной сон записывается в ночь после него. Поэтому прошлая ночь записывается под вчерашней датой. Те же строки, что и в get_sleep, одна на сон (правки схлопнуты): { timestamp (= BedtimeStart, ISO 8601 с смещением UTC), entryData: { SleepId, IsNap, BedtimeStart, BedtimeEnd, Duration (s), DeepSleepDuration, LightSleepDuration, REMSleepDuration (s), SleepQualityScore, AvgHRV (ms), HRAvg, HRMin (bpm), … } }. Ночи без записанного сна просто отсутствуют. Для одной ночи служит get_sleep. Требует подписки Sleep API на apizone; возвращает 404 без неё. Только для чтения.

Выводит список sleep

Параметры
  • fromstringобязательный

    Первая дата отхода ко сну в формате YYYY-MM-DD, включительно (дата, когда человек лёг спать, а не когда проснулся: см. get_sleep). Должна быть ≤ to. Ночи без записанного сна молча пропускаются, а не отдают 404.

  • tostringобязательный

    Последняя дата отхода ко сну YYYY-MM-DD, включительно (дата, когда человек лёг спать, а не когда проснулся, см. get_sleep). Будущие даты принимаются, но не дают записей. Лучше использовать диапазоны ≤ 30 дней для быстрого отклика.

list_subscriptionsтолько чтениевнешний мир

НЕДОСТУПНО - API-шлюз Suunto сейчас отклоняет этот эндпоинт (/v2/subscriptions) с ошибкой 401 OperationNotFound на аккаунте, на котором его тестировали (сентябрь 2026), поэтому вызов падает с ошибкой 'endpoint unavailable', а не возвращает список. Возвращал бы активные webhook-подписки в виде массива { id, eventType, callbackUrl, createdAt }. Оставлен, чтобы инструмент снова заработал, если Suunto восстановит эндпоинт. Только для чтения.

Выводит список подписок на вебхуки.

Параметры

Без параметров.

list_workoutsтолько чтениевнешний мир

Возвращает последние тренировки пользователя Suunto, отсортированные от новых к старым (Workout API v3). Каждый элемент: workoutKey (строковый идентификатор), activityId (числовой код активности - отдельного человекочитаемого поля 'sport' нет; если нужно название вида спорта, используйте get_workout_fit и смотрите session.sport в разобранном FIT-файле), startTime (эпоха в мс), totalTime (с), totalDistance (м), totalAscent (м), totalDescent (м), energyConsumption (килокалории, не 'totalCalories'), hrdata: { avg, max } (пульс на тренировке - hrdata.max это общий максимальный пульс аккаунта, для пикового значения именно этой тренировки берите hrdata.workoutMaxHR). Автоматически перелистывает страницы пагинацией по offset, пока не достигнет limit или пока тренировки не закончатся. Каждый элемент также содержит SummaryExtension (включая apps[]: запущенное руководство SuuntoPlus, если оно было) и IntensityExtension (время в пульсовых зонах). Для таблицы кругов одной тренировки используйте get_workout_laps. Только чтение.

Выводит список тренировок

Параметры
  • limitinteger

    Максимальное количество возвращаемых тренировок (1-1000). По умолчанию: 25. Пагинация по страницам API выполняется автоматически; при значении 1 возвращается только одна последняя тренировка.

  • sincestring

    Нижняя граница startTime в формате ISO 8601 (включительно). Фильтрует по времени начала тренировки; пропустите, чтобы получить данные за всё время. Пагинация работает автоматически, поэтому since не влияет на размер страницы.

  • untilstring

    Верхняя граница startTime в формате ISO 8601 (включительно). Пропустите, чтобы включить тренировки вплоть до текущего момента. Комбинируйте с since, чтобы задать конкретный интервал.

push_interval_guideвнешний мир

Отправляет интервальный/кардио-гид (разминка, рабочие интервалы по времени или дистанции, восстановления, опциональные повторы) в аккаунт Suunto пользователя через SuuntoPlus Guide Cloud API. В отличие от push_workout_guide (ручной круг на каждое упражнение), интервальные сегменты автоматически переключаются по прошедшему времени или дистанции - без ручного вмешательства во время бега или заезда. Каждый сегмент может показывать целевой диапазон пульса рядом с текущим пульсом. Требует, чтобы переменная окружения SUUNTO_APP_NAME точно совпадала с именем приложения, зарегистрированным на apizone.suunto.com. Та же оговорка по доставке, что и у push_workout_guide: появляется после следующей обычной синхронизации приложения Suunto на телефоне, без мгновенной отправки. Операция записи.

Отправляет руководство по интервалам на часы.

Параметры
  • blocksobject[]обязательный

    Упорядоченный список блоков. Блок с times>1 повторяет свои сегменты как единое целое (например, 4x[interval,recovery]) - внутрь него помещайте только те сегменты, которые повторяются; warmup/cooldown идут в своих отдельных блоках с times=1 до и после.

  • datestringобязательный

    Дата сессии YYYY-MM-DD.

  • guideIdstring

    Если указано, обновляет это существующее руководство, а не создаёт новое.

  • titlestringобязательный

    Короткое название сессии, которое показывается в приложении Suunto, например '4x4 VO2max'.

push_strength_guideвнешний мир

Отправляет руководство по силовой тренировке в аккаунт пользователя Suunto через SuuntoPlus Guide Cloud API - это инструмент для занятий в зале. Для каждого упражнения: подготовительный шаг (секундомер со свободным темпом, показывающий раскладку по блинам, если она задана, иначе вес/подходы, плюс название упражнения и пульс в реальном времени; нажатие lap запускает упражнение), затем при lapGranularity 'perSet' (по умолчанию) каждый подход - отдельный шаг, завершаемый нажатием lap, и каждый отдых между подходами - отдельный шаг с надписью 'Next: set k/S'. restMode 'countdown' (по умолчанию) отсчитывает restSec вниз и автоматически переходит к следующему подходу с вибрацией; 'stopwatch' считает вверх и ждёт нажатия lap. lapGranularity 'perExercise' даёт один шаг на упражнение после его подготовки, без отдыха между подходами и без lap на каждый подход. Каждая подготовка, подход и отдых - это отдельный lap, а руководство заканчивается дополнительным шагом 'Session complete', так что сессия perSet записывает 2 × (общее число подходов) + 1 lap. Считывает их обратно после тренировки с помощью get_workout_laps - его метки и есть тексты шагов. Требует, чтобы SUUNTO_APP_NAME точно совпадал с именем приложения, зарегистрированным на apizone.suunto.com. Без guideId новое руководство создаётся при каждом вызове (см. list_guides / delete_guide, чтобы прибраться); с guideId это руководство перезаписывается. Живой отправки на часы нет: руководство появится после следующей обычной синхронизации приложения Suunto на телефоне. Операция записи.

Видеоруководство по силе жима

Параметры
  • datestringобязательный

    Дата сессии YYYY-MM-DD.

  • exercisesobject[]обязательный
  • guideIdstring

    Если указано, обновляет это существующее руководство, а не создаёт новое.

  • lapGranularityenum

    'perSet' (по умолчанию, рекомендуется): один шаг на подход плюс один на отдых, поэтому круги привязываются к каждому подходу/отдыху отдельно - нужно, чтобы считывать пульс и длительность по каждому подходу из синхронизированной тренировки. 'perExercise': вместо этого один шаг на всё упражнение, как в push_workout_guide - короче список Guide, грубее данные.

  • restModeenum

    Отдых между подходами. 'countdown' (по умолчанию): отсчитывает вниз от restSec и автоматически переходит к следующему подходу. 'stopwatch': отсчитывает вверх и ждёт нажатия lap - темп задаёт пользователь. Не действует при lapGranularity 'perExercise' (нет отдыха между подходами). Перед упражнениями/между упражнениями всегда секундомер, который идёт в темпе пользователя.

  • titlestringобязательный

    Короткое название сессии, отображаемое в приложении Suunto, например 'Push A'.

push_workout_guideвнешний мир

Отправляет текстовую пошаговую инструкцию для тренировки в аккаунт пользователя Suunto через SuuntoPlus Guide Cloud API. Каждое упражнение становится отдельным шагом, который переключается нажатием кнопки круга на часах. Требует, чтобы переменная окружения SUUNTO_APP_NAME точно совпадала с именем приложения, зарегистрированным на apizone.suunto.com. Прямой отправки на сами часы нет - доставка зависит от обычной синхронизации приложения Suunto на телефоне. При тестировании инструкция появлялась на часах после следующей обычной синхронизации, вручную закреплять ничего не требовалось; если она не появилась, проверьте приложение Suunto в разделе SuuntoPlus Guides и закрепите её там. Для занятий в зале лучше использовать push_strength_guide: он записывает один круг на подход и на отдых, а get_workout_laps может их прочитать. Операция записи.

Отправляет руководство по тренировке на часы

Параметры
  • datestringобязательный

    Дата сессии YYYY-MM-DD.

  • exercisesobject[]обязательный
  • guideIdstring

    Если указано, обновляет это существующее руководство, а не создаёт новое.

  • titlestringобязательный

    Короткое название сессии, отображаемое в приложении Suunto, например 'Push A'.

upload_routeвнешний мир

Импортирует GPX-файл как маршрут в аккаунт пользователя Suunto (он появляется в библиотеке маршрутов приложения Suunto со статусом PRIVATE, а затем его можно синхронизировать с часами для навигации). Укажите абсолютный путь к .gpx-файлу. Каждый элемент <rte> или <trk> в файле становится отдельным маршрутом; имя маршрута берётся из его <name> (или <desc>), а путевые точки создаются из элементов <wpt> с теми же координатами, что и точки маршрута, и из точек маршрута, у которых есть имя или тип. Активности маршрута берутся из аргумента activities, а НЕ из содержимого GPX (по умолчанию [1] = бег). Возвращает { count, routes: [{ id, name, activities, segments }], check: { verified, watchEnabled, distanceM, pointsInFile, pointsInRoute, note? } }. Импорты ставятся в очередь по одному с короткой паузой, и каждый маршрут считывается обратно из Suunto (количество точек сверяется с файлом), так что множество одновременных вызовов безопасно; рассчитывайте примерно на 3 с на маршрут. verified:false вместе с note означает, что импорт прошёл, но обратное считывание не совпало - сообщите об этом пользователю вместо того, чтобы отчитываться об успехе. Маршрут нельзя удалить через этот сервер - удалите его в приложении Suunto. Требует Route API в подписке Suunto (list_routes показывает существующие маршруты). Операция записи.

Импортирует маршрут GPX

Параметры
  • activitiesinteger[]

    ID видов активности Suunto, для которых подходит маршрут (1 = бег; остальные ID есть в Suunto's Activities.pdf на apizone). Показывается в деталях маршрута в приложении. Необязательный.

  • filePathstringобязательный

    Абсолютный путь к файлу .gpx на диске.

upload_workoutвнешний мир

Загружает файл тренировки в аккаунт Suunto пользователя. Укажите абсолютный путь к файлу на диске. Файл отправляется в Suunto и появляется в приложении после обработки (обычно через несколько секунд). Возвращает uploadId, который можно опрашивать с помощью get_upload_status. Собственная документация Suunto по API загрузки утверждает, что для этого эндпоинта сейчас поддерживается только .fit (бинарный) - путь .gpx здесь всё ещё принимается (отправляется как application/gpx+xml) на случай, если это изменится, но считайте его непроверенным; используйте .fit для тренировки, которая должна гарантированно появиться. Операция записи.

Загружает файл тренировки

Параметры
  • commentstring

    Более длинные заметки для тренировки. Необязательно.

  • descriptionstring

    Короткое название тренировки, отображаемое в приложении Suunto. Необязательно.

  • filePathstringобязательный

    Абсолютный путь к файлу .fit или .gpx на диске.

  • privacyenum

    Видимость. DEFAULT использует настройку аккаунта по умолчанию.

0.19.2основная
0.19.1
0.19.0
0.18.1
0.18.0
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.1-rc.0
0.14.4
0.14.1

Выберите клиент, чтобы установить googlarz/suunto-mcp:

Любой клиент

Конфиг добавления MCP сервера стандартный, обычно он не меняется вообще, поэтому подходит практически к любому ИИ клиенту, поддерживающему MCP.

{
  "mcpServers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}
CursorCursor

Перейдите по ссылке и сервер автоматически будет добавлен в Cursor. Либо откройте/создайте файл ~/.cursor/mcp.json(%USERPROFILE%\.cursor\mcp.json на Windows) и добавьте конфиг сервера:

{
  "mcpServers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}
VS Code

Создайте .vscode/mcp.json в проекте (ключ верхнего уровня — servers):

{
  "servers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}

Либо добавьте сервер через терминал:

code --add-mcp "{\"name\":\"googlarz-suunto-mcp-rcw6pxwpot\",\"type\":\"stdio\",\"command\":\"npx\",\"args\":[\"-y\",\"suunto-mcp\"],\"env\":{\"SUUNTO_CLIENT_ID\":\"your-client-id\",\"SUUNTO_CLIENT_SECRET\":\"your-client-secret\",\"SUUNTO_SUBSCRIPTION_KEY\":\"your-subscription-key\"}}"
ClaudeClaude Desktop

Откройте Settings → Developer → Edit Config — это откроет файл claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Впишите сервер и полностью перезапустите Claude Desktop:

{
  "mcpServers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}
Claude CodeClaude Code

Добавьте сервер одной командой в терминале:

claude mcp add googlarz-suunto-mcp-rcw6pxwpot --env SUUNTO_CLIENT_ID=your-client-id --env SUUNTO_CLIENT_SECRET=your-client-secret --env SUUNTO_SUBSCRIPTION_KEY=your-subscription-key -- npx -y suunto-mcp

Либо через JSON-конфиг:

claude mcp add-json googlarz-suunto-mcp-rcw6pxwpot "{\"command\":\"npx\",\"args\":[\"-y\",\"suunto-mcp\"],\"env\":{\"SUUNTO_CLIENT_ID\":\"your-client-id\",\"SUUNTO_CLIENT_SECRET\":\"your-client-secret\",\"SUUNTO_SUBSCRIPTION_KEY\":\"your-subscription-key\"}}"
CodexCodex

Добавьте сервер командой в терминале:

codex mcp add googlarz-suunto-mcp-rcw6pxwpot --env SUUNTO_CLIENT_ID=your-client-id --env SUUNTO_CLIENT_SECRET=your-client-secret --env SUUNTO_SUBSCRIPTION_KEY=your-subscription-key -- npx -y suunto-mcp

Либо вручную в ~/.codex/config.toml(%USERPROFILE%\.codex\config.toml на Windows):

[mcp_servers.googlarz-suunto-mcp-rcw6pxwpot]
command = "npx"
args = ["-y", "suunto-mcp"]

[mcp_servers.googlarz-suunto-mcp-rcw6pxwpot.env]
SUUNTO_CLIENT_ID = "your-client-id"
SUUNTO_CLIENT_SECRET = "your-client-secret"
SUUNTO_SUBSCRIPTION_KEY = "your-subscription-key"
PerplexityPerplexity

MCP доступен подписчикам Perplexity Pro / Max / Enterprise. Локальные серверы — только в приложении для macOS.

  1. Откройте Настройки аккаунта → Connectors.
  2. Установите вспомогательное приложение PerplexityXPC (один раз).
  3. Нажмите Add Connector → вкладка Simple.
  4. В поле Server Name укажите googlarz/suunto-mcp, а в поле команды запуска — строку ниже:
npx -y suunto-mcp

Нажмите Save и дождитесь статуса Running.

WindsurfWindsurf

Откройте Windsurf Settings → Cascade → MCP Servers или отредактируйте файл ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}
ClineCline

В панели Cline нажмите иконку MCP Servers → Configure → Configure MCP Servers (или отредактируйте ~/.cline/mcp.json) и добавьте сервер:

{
  "mcpServers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}
Continue

Создайте файл в .continue/mcpServers/ (например googlarz-suunto-mcp-rcw6pxwpot.yaml) или добавьте блок в config.yaml. MCP работает только в режиме agent:

mcpServers:
  - name: googlarz-suunto-mcp-rcw6pxwpot
    command: npx
    args:
      - "-y"
      - "suunto-mcp"
    env:
      SUUNTO_CLIENT_ID: your-client-id
      SUUNTO_CLIENT_SECRET: your-client-secret
      SUUNTO_SUBSCRIPTION_KEY: your-subscription-key
Zed

Выполните agent: add context server или откройте настройки (zed: open settings file) и добавьте сервер в объект context_servers:

{
  "context_servers": {
    "googlarz-suunto-mcp-rcw6pxwpot": {
      "command": "npx",
      "args": [
        "-y",
        "suunto-mcp"
      ],
      "env": {
        "SUUNTO_CLIENT_ID": "your-client-id",
        "SUUNTO_CLIENT_SECRET": "your-client-secret",
        "SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key"
      }
    }
  }
}

Похожие MCP-сервера

r-huijts/strava-mcp

r-huijts/strava-mcp

от r-huijts

MCP сервер для доступа к Strava через ИИ. Спрашивайте данные на естественном языке: анализируйте тренировки, смотрите пробеги, исследуйте сегменты. Помогает спортсменам работать с фитнес-статистикой без лишних действий.

TypeScript⭐ 500
csjoblom/musclesworked-mcp

csjoblom/musclesworked-mcp

от csjoblom

MCP сервер для API musclesworked.com: предоставляет данные о 856 упражнениях и 65 мышцах с детальным разбиением на первичные, вторичные и стабилизирующие. Помогает анализировать тренировки, находит...

TypeScript⭐ 4
XWeaponX7/rundida-mcp

XWeaponX7/rundida-mcp

от xweaponx7

MCP сервер для бегунов: 92 калькулятора RunDida, руководства, марафоны, расчеты темпа, времени, дистанции. Позволяет AI-ассистентам прогнозировать результаты и рассчитывать зоны пульса.

JavaScript⭐ 1
khaoss85/arvo-mcp

khaoss85/arvo-mcp

от khaoss85

MCP сервер arvo-mcp даёт AI-ассистенту доступ к фитнес-трекеру Arvo: записывайте тренировки, отслеживайте личные рекорды и анализируйте прогресс тела через Claude Desktop или Cursor.

TypeScript⭐ 3
JamsusMaximus/trainingpeaks-mcp

JamsusMaximus/trainingpeaks-mcp

от jamsusmaximus

MCP сервер для управления тренировками в TrainingPeaks через AI-ассистентов. Создавайте интервальные структуры, управляйте календарем и отслеживайте фитнес-тренды без API-ключей. Аутентификация через cookie из браузера. Полезен спортсменам и тренерам.

Python⭐ 182
Milofax/xert-mcp

Milofax/xert-mcp

от milofax

MCP сервер для интеграции Claude с платформой XERT. Позволяет получать фитнес-подпись и тренировочный статус, список тренировок и активностей, загружать FIT-файлы. Идеален для велосипедистов и тренеров.

TypeScript⭐ 5
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин