suunto-mcp
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, unsanctioned | Confirmed by static analysis of the Suunto Android app — not traffic capture. 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 them: it has no guide-creation capability at
all. It's a good read client for completed activity and wellness data, so with
SUUNTO_TRAINING_CONTEXT=suuntool this server shells out to it (argv array,
never a shell string) for one extra tool, get_recent_training — recent
workouts and recovery, unit-converted (recovery HR arrives in Hz, not BPM;
quality as a 0..1 fraction, not a percentage — both silent enough to pass an
inattentive review unconverted). It otherwise ships its own MCP server, so for
anything beyond that, run the two side by side rather than wrapping one in the
other.
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 suunto -- 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.
Configuration
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 |
|
|
| Path to |
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