suunto-mcp
This MCP server enables authoring, compiling, and managing SuuntoPlus™ Guides (structured workouts) for Suunto watches. Key capabilities include:
Preview workouts (
preview_workout): Compile and validate workouts without uploading. Detects unit conversions, truncated titles, and validation errors. Workouts can include step roles (warmup, work, rest, recovery, cooldown, other), durations (time, distance, manual lap), intensity targets (pace, speed, heart rate with % of max or LTHR, power with % FTP, cadence), nested repeats (up to 100 reps), per-step skip control (allowSkip), sports/activities, date, descriptions, and closing messages. Requires athlete profile data (max HR, threshold HR, FTP, rest HR, threshold pace) for percentage-based targets.List workouts (
list_workouts): Retrieve stored guides with optional pagination (limit,offset) and time filtering (sinceas epoch ms).Describe the backend (
describe_backend): Check whether the active backend isfile,cloud, orprivate, and see which operations it supports.Create, update, and delete workouts (require
--allow-writeand--allow-destructiveflags respectively; tools are hidden if not permitted).Multiple backends: File (default, generates local
guide.zip), cloud API (needs subscription key and OAuth), and private mobile API (reuses suuntool session).Safety tiers: Read-only by default; write and destructive actions are only available when explicitly enabled. Unauthorized tools are not listed.
Athlete profile support: Manage parameters needed for relative intensity targets (e.g., max HR, threshold HR, FTP, rest HR, threshold pace).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@suunto-mcpcompile my interval workout and preview how it will look on my Suunto"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
suunto-mcp
An MCP server for authoring and managing structured workouts (SuuntoPlus™ Guides) on Suunto, designed so the transport can be swapped without touching the workout model.
Not affiliated with or endorsed by Suunto Oy.
Why it's built this way
There are three possible ways to get a structured workout onto a Suunto watch, and they differ enough that the transport has to be a replaceable part:
Path | Status | Notes |
Cloud API ( | Documented, needs a subscription key | The sanctioned path. Contract fully captured in docs/cloud-api.md. |
Private mobile API ( | Fully mapped and live-verified, reads and writes, unsanctioned | Confirmed by static analysis of the Suunto Android app, then exercised for real: create → duplicate-externalId 409 → update → delete, all against a live account. Full write-up in docs/private-guides-api.md. Genuinely undocumented; needs no new credential — reuses a |
Local zip | Works today | Emit a validated |
suuntool deliberately isn't one of these paths: it has no guide-creation
capability at all. What it does have is a good, read-only MCP server of its
own — suuntool mcp — for completed activity and wellness data, comments,
reactions, and profile info. This server doesn't wrap or re-expose any of
that: run the two side by side as separate MCP configs
(claude mcp add suunto-mcp -- ... and claude mcp add suuntool -- suuntool mcp)
rather than have this one duplicate a surface suuntool already covers better.
The private backend's use of suuntool's session file (below) is credential
reuse, not functionality overlap — it's the reason suuntool is a prerequisite
for the private backend either way, so adding its own MCP server alongside
this one costs nothing extra.
Its exit codes double as this server's own error taxonomy: codes 2–7
(USAGE/NETWORK/AUTH_EXPIRED/SERVER/NOT_FOUND/FORBIDDEN) are
numerically identical on both, so a session that has expired in suuntool's own
session.json surfaces through the same code as an expired Cloud API token.
Related MCP server: coros-training-mcp
The interesting part
The guide format is a display format, not a training format. It has no step
roles, no percentages, no nesting, and a 13-character title budget. So the domain
model is what a coach would write, and src/compile lowers it:
roles (
warmup/work/rest/…) → titles, notifications and lap marksdurations → a per-step
triggerplus a matching countdown fieldevery duration/distance trigger grants lap-skip by default — a compound
{type:"or", triggers:[base, {type:"manualLap"}]}pluscreateManualLap:true, confirmed live against a real Runna guide after a user reported this compiler's own workouts couldn't be skipped early. Opt a step out withallowSkip: falseto lock it instead.pace ranges → m/s, with the bounds inverted (4:15–4:25 /km is 3.77–3.92 m/s)
cadence → Hertz (180 spm is 3.0)
%HRmax/%FTP→ absolutes, resolved from the athlete profilenested repeats → flattened, keeping the outer block so the step budget survives
every string truncated and charset-sanitised for the watch display
Correctness is anchored on Suunto's own published sample guide, which is stored
verbatim in test/fixtures/ and used two ways: to prove the format model accepts
real Suunto output, and as the compiler's target.
Layout
src/domain/ workout model, guide wire format, validator, limits, activity IDs
src/compile/ the lowering compiler, unit conversions, externalId hashing
src/package/ zip packing (manifest.json + guide.json + icon.png)
src/backends/ the GuideBackend port and its implementations
src/mcp/ MCP server
scripts/ APK acquisition and static analysis for the RE track
docs/ captured API contracts and RE findingsRunning it
Tool tiers follow suuntool's: read-only by default, --allow-write to create and
update, --allow-destructive on top of that to delete. Gating happens at
registration, so a tool you have not permitted is absent from the listing
entirely rather than present and always refusing.
claude mcp add --scope user suunto-mcp -e SUUNTO_MCP_BACKEND=private -- node /path/to/suunto-mcp/dist/mcp/main.js --allow-writeTier | Tools |
read |
|
|
|
|
|
preview_workout compiles and validates without uploading, and returns the
warnings — start there.
For completed-activity and recovery data, add suuntool's own MCP server as a
separate config rather than expecting this one to cover it:
claude mcp add --scope user suuntool -- suuntool mcpConfiguration
Variable | Purpose |
|
|
| Where the file backend writes; defaults under |
| Creator name. Must match the OAuth app name for the Cloud API |
|
|
| Static bearer token, for trying the API by hand |
| Enables refresh of the 24h token |
| Athlete profile, needed only for |
Configuration is validated at startup and a bad config is a hard exit — an MCP server that starts and then fails every call is much harder to diagnose.
Development
pnpm install
pnpm test
pnpm typecheckReverse-engineering track
scripts/pull-apk.sh # pull the APK off a connected Android device
scripts/analyze-apk.sh # stage 1: fast dex string scan
scripts/analyze-apk.sh 2 # stage 2: full jadx decompile, only if neededapk/ and capture/ are git-ignored and must stay that way — captures contain
session keys and account identifiers.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server for interacting with the Wahoo Cloud API to manage workouts, routes, training plans, and power zones. It enables users to list, retrieve, and create fitness data through secure OAuth 2.0 authentication.Last updated97GPL 3.0
- Alicense-qualityDmaintenanceRunning-first MCP server for COROS that allows authoring, editing, and scheduling running workouts, plus accessing sleep, HRV, training load, and activity exports.Last updatedMIT
- Flicense-qualityBmaintenanceA multi-platform fitness MCP server that syncs data from Garmin, Strava, Google Fit, and Suunto into a local DuckDB database and provides analytics tools via MCP.Last updated1
- Flicense-qualityCmaintenanceA personal health and fitness MCP server that provides tools for managing profile data, goals, body measurements, nutrition, workouts, sleep, check-ins, life events, analytics, and coach memories via Supabase Postgres.Last updated1
Related MCP Connectors
MCP server for Zooza — class scheduling, attendance, and booking for activity businesses.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/adepssimius/suunto-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server