Suunto MCP
The Suunto MCP server bridges Suunto's API with the Model Context Protocol, letting AI assistants access and analyze your Suunto training and health data through natural language.
Workout Tools:
list_workouts— Browse recent workouts (optionally filtered by date range), returning sport, duration, distance, HR, and caloriesget_workout— Fetch the full summary for a specific workoutget_workout_samples— Retrieve time-series data (HR, speed, altitude, power, cadence, GPS)get_workout_fit— Download and parse a FIT file into structured JSON (session totals, laps, records)export_workout_gpx— Export a workout's GPS track as GPX for maps, Strava, or route planners
Health & Activity Tools:
get_daily_activity/list_daily_activity— Steps, calories, and daily HR for a day or date rangeget_sleep/list_sleep— Sleep stages, duration, and score for a night or date rangeget_recovery/list_recovery— Recovery score, HRV, and stress for a day or date range
Webhook Management:
list_subscriptions— View active webhook subscriptions on your Suunto account
AI Integration:
Exposes MCP Resources for ambient context: most recent workout, today's sleep/recovery/activity, and weekly training summary
Handles authentication token refresh, API retries, auto-pagination, and binary FIT file decoding automatically
Data flows directly between your machine and Suunto's API, with tokens stored locally for privacy
Allows exporting workout GPX tracks that can be imported into Strava for route planning, mapping, and activity sharing.
Click on "Deploy 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 MCPHow many kilometers did I run this month?"
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
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?"
"Pull the GPX of yesterday's trail run and write a short journal entry."
"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?"
Claude figures out what data to pull. You just ask.
It's not just read-only either — Claude can push things to your watch too:
"Plan tonight's gym session and send it to my watch."
"Upload yesterday's Garmin export as a Suunto workout."
"Export my last route as GPX so I can share it."
See What you can push to your watch below.
Related MCP server: Garmin MCP Server
🤖 Don't want to do this yourself? Let Claude Code install it
If you already have Claude Code, you don't need to run a single terminal command. Just open it and say:
"Please install and set up suunto-mcp from https://github.com/googlarz/suunto-mcp"
Claude Code will clone the repo, run all the install commands, and add everything to your Claude Desktop config — on its own. That's exactly how this project's author set it up: no manual terminal work.
Three things stay yours no matter what, by design, not because of missing tooling:
Creating the apizone.suunto.com account — Claude can't create accounts on your behalf.
The apizone web form (naming your app, revealing your subscription key) — it's your account session; Claude tells you exactly where to click, but can't click there for you.
Clicking "Authorize" during login — that's OAuth working as intended. An app that could approve its own access wouldn't be secure.
Claude will tell you exactly what to do and when for each of these.
If you want to do it manually, keep reading.
What you need
Before starting, make sure you have:
A Suunto watch synced to the Suunto app (any modern model — Race, Vertical, 9 Peak, 5 Peak, Ocean, etc.)
Claude Desktop (or another MCP-compatible AI app)
Node.js — free, download here, choose the "LTS" version
Git — free, download here
~5 min to submit + 3–4 week wait for Suunto approval + ~15 min to install
Once it's done, you never redo it.
Setup
Prefer one guided walkthrough with a pacing choice up front (fast path vs. explained-step-by-step) and a proper explanation of how syncing works? See GETTING_STARTED.md. What follows here is the same steps in reference form.
The setup has three parts:
Register with Suunto's developer portal — tells Suunto your app is allowed to read your data
Install and configure — gets the software running on your computer
Connect to Claude — lets the AI find and use it
Part 1: Register with Suunto's developer portal (~5 min to submit, then wait 3–4 weeks)
Suunto has a free developer portal called apizone where you register apps that can access your data. You'll create an account, subscribe to the data plan, and register a small "app" — don't worry, there's nothing to build, it's just a name and a password you make up.
Step 1: Create your apizone account
Go to apizone.suunto.com and sign up or sign in.
Use the same email you use for the Suunto app. If you have a Sports Tracker account, that works too — it's the same login system.
Step 2: Subscribe to the Developer API
After signing in, follow the How to start guide — it walks you through subscribing to the Developer API. This is free and gives you access to your workout history.
Heads up: Suunto's website states that API access is only for commercial partners — ignore that. Private users do get access, it just takes 3–4 weeks for the subscription to be approved. Submit it and wait. It will come through.
You may see other products like "Sleep API", "Recovery API", "Daily Activity API". Skip those for now — the Developer API is enough to get started. You can add the others later if you want sleep and recovery data in Claude.
⏳ Stop here and wait. Once you've subscribed, Suunto needs to approve your request. This takes 3–4 weeks. You'll get an email when it's done. Come back to Steps 3–4 only after your subscription shows as Active in your apizone profile.
Step 3: Register your app (do this after approval)
You're going to tell Suunto: "I have a small program, here's its name and a secret password — please let it read my data."
Go to your apizone profile page
Scroll down to OAuth application settings
Fill in the form:
Field
What to enter
App name
suunto-mcp(or anything you like)Client secret
Make up a unique password — something only you'd know, e.g.
alice-suunto-2026with your own name. Write it down. Don't use this exact example.Redirect URI
http://localhost:8421/callback— copy this exactlyClick Save
After saving, the form shows a Client ID — a long code that Suunto generated for you. Copy it.
What are these three things? — Client ID: your app's username, generated by Suunto — Client Secret: your app's password, chosen by you — Redirect URI: where Suunto sends you back after you approve access — must match exactly, typos break it
The Client Secret is never shown again after you save. If you forget it, just set a new one in the same form.
Step 4: Get your subscription key (do this after approval)
The subscription key is a second passcode that goes on every data request. Here's how to find it:
Still on the apizone profile page
Scroll to the Subscriptions section
Your Developer API subscription is listed there. Next to it you'll see a Primary Key — click the button next to it to reveal it, then copy the key.
Save all three values before continuing — you'll need them in Part 2:
Client ID (from the OAuth app form above)
Client Secret (the password you made up)
Subscription Key (from the Subscriptions section)
Part 2: Install and configure (~10 min, after Suunto approves you)
Used the "Let Claude Code install it" option above? Claude already ran every command below — skip to Part 3. These steps are for anyone doing it by hand.
Step 5: Download the code
Open Terminal on Mac (press ⌘Space and type "Terminal") or Command Prompt on Windows. Then run these commands one at a time:
git clone https://github.com/googlarz/suunto-mcp
cd suunto-mcp
npm install
npm run buildThis downloads the code, installs what it needs, and builds it. Takes 1–2 minutes. If you see any errors, check the Troubleshooting section.
Step 6: Add your credentials
You'll create a file called .env in the suunto-mcp folder and put your three values in it. Even if Claude is doing the rest of this for you, type these three values in yourself rather than pasting them into the chat — keeps them out of your conversation history.
On Mac:
cp .env.example .env
open -e .envThis copies the template and opens it in TextEdit. Replace each placeholder with your actual values, then save and close.
On Windows:
copy .env.example .env
notepad .envThe file looks like this — replace the parts after the = signs:
SUUNTO_CLIENT_ID=your-client-id-here
SUUNTO_CLIENT_SECRET=your-client-secret-here
SUUNTO_SUBSCRIPTION_KEY=your-subscription-key-hereSave and close the file.
Only if you want to push guided workouts to your watch (see What you can push), add one more line:
SUUNTO_APP_NAME=your-app-name-here— it must exactly match the app name you registered on apizone.suunto.com in Step 3, or the watch will reject the upload. Not needed for anything else.
Step 7: Pair your Suunto account
npm run authHere's exactly what happens:
① Terminal — you see a long URL printed and the message "Opening Suunto authorization in your browser…"
② Browser opens — Suunto's login page appears. It looks identical to the Suunto app login: email + password fields at the top, then "Sign in with Apple" and "Sign in with Facebook" below. Sign in with whichever you use.
③ Permissions screen — after logging in, a screen appears asking you to approve access for "suunto-mcp". It lists what the app will be able to read (your workouts). Click Authorize.
④ Browser confirmation — the page shows: "Suunto MCP connected. You can close this tab."
⑤ Terminal confirmation — prints: "Paired successfully. Tokens saved."
Done — you won't need to do this again. The connection stays active and renews itself automatically.
Browser didn't open automatically? Copy the long URL from the terminal and paste it into your browser manually.
Step 8: Check everything is working
npm run doctorThis runs a health check. You should see output like:
Suunto MCP — health check
✓ Node version 20.18.0 (require ≥ 20)
✓ Credentials client_id, client_secret, subscription_key set
✓ Network reachability reachable
✓ Pairing paired (user: your-username), token expires in 47 min
✓ API probe (workouts) received 1 workoutIf any line shows ✗, the message tells you exactly what to fix. Resolve any issues before moving on.
Part 3: Connect to Claude Desktop (~5 min)
Used the "Let Claude Code install it" option? This part is done too — Claude edited your config directly. Restart Claude Desktop and jump to Step 11.
Now you'll tell Claude Desktop where to find Suunto MCP.
Step 9: Open the Claude config file
Open this file in a text editor (create it if it doesn't exist yet):
Mac:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Quick way on Mac — run this in Terminal:
mkdir -p ~/Library/Application\ Support/Claude && open -e ~/Library/Application\ Support/Claude/claude_desktop_config.jsonQuick way on Windows — run this in Command Prompt:
notepad "%APPDATA%\Claude\claude_desktop_config.json"(If it asks "file not found — create it?", click Yes.)
Step 10: Add Suunto MCP
First, find the actual path to the suunto-mcp folder. In Terminal, while inside the folder, run:
pwdIt'll print something like /Users/yourname/suunto-mcp. Copy that.
Now paste the following into the config file. Replace /Users/yourname/suunto-mcp with the path you got from pwd, and replace the credential placeholders with your actual values.
If the file already has other servers configured, don't replace the whole file — just add the
"suunto"section alongside them. The structure must be valid JSON, so keep all the curly braces balanced. When in doubt, compare your file to the example below.If the file is empty, paste the whole block as-is.
{
"mcpServers": {
"suunto": {
"command": "node",
"args": ["/Users/yourname/suunto-mcp/dist/index.js"],
"env": {
"SUUNTO_CLIENT_ID": "your-client-id",
"SUUNTO_CLIENT_SECRET": "your-client-secret",
"SUUNTO_SUBSCRIPTION_KEY": "your-subscription-key",
"SUUNTO_APP_NAME": "your-app-name"
}
}
}
}SUUNTO_APP_NAME is only needed if you want to push guided workouts to your watch — leave it out (or delete that line) if you're only asking Claude about your data.
Save the file.
Step 11: Test it
Three things, in order — this is the only part of setup nothing can do for you:
Quit Claude Desktop completely. Not just closing the window — ⌘Q on Mac, or right-click the icon in the taskbar → Quit on Windows. Config changes only load on a fresh start.
Reopen Claude Desktop.
Ask it:
"What was my most recent workout?"
If Claude answers with your actual sport, date, and distance — you're done. If it doesn't, don't guess — go to Troubleshooting.
Example conversation
You: Compare my last three long runs. Has my heart-rate drift improved?
Claude: Looking up your workouts…
Found 3 runs over 90 minutes in the last 6 weeks:
• Apr 12 — 22.4 km, 2h09, avg HR 148, last-30min drift +6 bpm
• Apr 19 — 24.0 km, 2h21, avg HR 144, last-30min drift +4 bpm
• Apr 26 — 25.1 km, 2h28, avg HR 142, last-30min drift +2 bpm
Drift is trending down despite slightly longer runs — your aerobic
base is improving. Pace at the same HR is also ~3 s/km faster.What data is available
Category | What you can ask about | Requires |
Workouts | Any recorded activity — runs, hikes, rides, swims, ski tours. Distance, time, heart rate, pace, elevation, GPS route, power. | Developer API (already subscribed) |
Sleep | Sleep duration, stages (light/deep/REM), sleep score. | Sleep API subscription on apizone |
Recovery | HRV, recovery status, stress balance. | Recovery API subscription on apizone |
Daily activity | Steps, calories, 24/7 heart rate. | Daily Activity API subscription on apizone |
To add sleep, recovery, or daily activity: go back to apizone.suunto.com, find each product, and subscribe. Then run npm run doctor to confirm they're active.
What you can push to your watch
Suunto MCP isn't read-only. Claude can also send things back to your account:
You want to | Ask Claude | Requires |
Get a gym plan on your wrist | "Plan today's workout and send it to my watch" |
|
Upload a workout from another device | "Upload this FIT file as a Suunto workout" | — |
Grab a saved route as GPX | "Export my Sunday route as GPX" | — |
Guided workouts show up as a SuuntoPlus Guide: exercise name and weight/reps on screen, lap button advances to the next one, a stopwatch (not a countdown) between exercises with a preview of what's next, a vibrate when a new exercise starts, and a "session complete" screen at the end. There's no live push to the watch itself — it appears after your phone's next normal Suunto app sync, same as any other watch data.
This pairs naturally with a coaching workflow: describe your goals, equipment, and current lifts to Claude, and it can write a real progressive program and push each session directly — see Pairs well with health-skill below for recovery-aware programming.
Daily health digest
Ask Claude "generate my daily digest for yesterday" and it writes a color-coded markdown summary — steps, sleep, recovery balance, HRV, and a training-load model (Fitness/Fatigue/Form) — appended to SUUNTO_HISTORY.md.
Fitness (CTL), Fatigue (ATL), and Form (TSB) aren't Suunto API fields — there's no endpoint for them. They're computed here from each workout's real tss.trainingStressScore using standard 42-day/7-day exponential decay, the same math training-load tools like TrainingPeaks use. The running values persist in ~/.suunto-mcp/averages.json (override with SUUNTO_DIGEST_AVERAGES_PATH) since there's nowhere else to keep them.
A few things worth knowing before you rely on it:
CTL/ATL start at 0 on first use and take 4–6 weeks to converge to a realistic number — there's no API to read your watch's own displayed Fitness/Fatigue. To skip the cold-start, tell Claude the numbers off your watch on your very first digest ("my watch shows Fitness 42, Fatigue 38, seed the digest with those") — or pass
--seed-ctl 42 --seed-atl 38on the CLI. Only works on the first-ever digest; ignored after that.TSB colors match your watch's own legend (🔵 Optimal >+10, 🟢 Balanced 0 to +10, 🟡 Compromised −10 to 0, 🔴 Strained <−10) — not an invented scale.
Ramp rate (this week's CTL vs. 7 days ago) has its own scale: 🔴 above +8/week means you're loading too fast — real injury risk, not just "good progress." 🟢 +3 to +8 is building well, 🟡 −2 to +2 is holding steady, 🟠 below −2 means fitness is slipping.
Recovery Balance is reported as morning (the lowest point overnight) vs. peak (the highest point that day) — they use different color scales, since peak is naturally higher than the overnight low.
HRV below your normal range for 2+ days in a row, or morning recovery below 65% for 2+ days in a row, adds a note to check your blood pressure — sustained low HRV/recovery is a real physiological signal worth a second data point on.
Rolling baselines track each metric separately, with a separate bucket for "party nights" (>20,000 steps) so an outlier day doesn't skew your normal-day average.
Run dates in chronological order. Baselines are "as of whenever this ran," not "as of the calendar date" — backfilling an old missed date after a later one will make that day's baseline comparison slightly off. Fine for the normal daily-scheduled use; worth knowing if you're catching up on missed days.
Requires Sleep and Recovery API subscriptions on apizone for those sections to populate — without them, the digest still generates, those sections just say "no data" instead of erroring.
CLI: suunto-mcp daily-digest 2026-04-20 [--seed-ctl 42 --seed-atl 38]. MCP tool: generate_daily_digest.
Troubleshooting
Always run npm run doctor first — it pinpoints most problems automatically.
What you see | What it means | How to fix it |
Claude returns an error or nothing | Something isn't connected yet | Run |
Empty workout list | Watch hasn't synced recently | Open the Suunto app on your phone and wait for the sync to complete |
"Not authenticated" | The pairing step didn't finish | Run |
You logged in but nothing happened | The browser tab closed or timed out before Suunto confirmed | Close all Suunto tabs and run |
"Token request failed" or "400 error" | Client Secret or Redirect URI don't match apizone | Go to apizone → profile → OAuth application settings and confirm both values match exactly |
"401" error on every request | Subscription key is wrong or incomplete | Go to apizone → profile → Subscriptions, reveal and re-copy the Primary Key |
"403 Forbidden" on workouts | Developer API subscription isn't active | Sign in to apizone and confirm it's listed as Active |
Sleep / recovery / activity returns "not found" | Those need separate subscriptions | Go to apizone and subscribe to the Sleep, Recovery, or Daily Activity API |
Got an SSL error after Apple sign-in | Known Suunto quirk with Apple login | Close the error tab, go back to the auth URL the terminal printed, and continue |
"State mismatch" error | A second auth flow started before the first finished | Close all auth-related tabs and run |
| Node.js version too old or not installed | Run |
Terminal says "EADDRINUSE" or port in use | Something else is using port 8421 | Restart your computer, or run |
Guide upload fails with an "owner" error |
| Check apizone → your app → confirm the exact name, fix the env var, restart Claude |
Pushed a guide but it's not on the watch | Watch hasn't synced with your phone yet | Open the Suunto app and let it sync; it should appear without any extra steps |
FAQ
Is this safe? Will Suunto lock my account? Suunto built this API specifically for people to connect their own tools — it's explicitly allowed. You're using it exactly as intended.
Is my data leaving my computer? Your data travels directly between your computer and Suunto's servers. Suunto MCP is just the bridge. When Claude asks about your workouts, it goes: Claude → Suunto MCP (on your machine) → Suunto's servers → back. No third-party services see your data.
Which Suunto watches work? Any watch that syncs to the Suunto app: Race, Vertical, 9 Peak Pro, 9 Peak, 5 Peak, Wing, Ocean, and older models. If it appears in your Suunto app, it works here.
Do I need to do anything when I record a new workout? No. Just ask Claude — it always pulls live data from Suunto.
What if I want to disconnect and stop using this? See Disconnecting below. You can fully revoke access in under a minute.
Can I use this with AI apps other than Claude? Yes — anything that supports MCP: Claude Code, Cursor, Windsurf, and others.
My Suunto app username is different from my email — which do I use? Use your email address to sign in to apizone. Your username will appear once you're authenticated.
Privacy
All data flows directly between your computer and Suunto's servers. No third-party servers, no analytics.
Your login credentials are stored locally at
~/.suunto-mcp/tokens.json— not uploaded anywhere.Suunto shows your connected app as "suunto-mcp" in apizone → profile → Authorized applications. You can revoke it there at any time.
The AI only sees data it explicitly requests for your question — not your entire history at once.
Disconnecting
To fully remove access:
Log in to apizone.suunto.com → profile → Authorized applications → remove suunto-mcp. Suunto immediately stops honoring the connection.
Delete local credentials:
rm -f ~/.suunto-mcp/tokens.jsonRemove the
"suunto"block from your Claude config and restart Claude.
Pairs well with health-skill
If you use googlarz/health-skill — a Claude skill for symptom triage and health Q&A — Suunto MCP gives it a live feed of your training, sleep, and recovery data. Together they can answer questions like "given my recovery scores this week, should I keep tomorrow's interval session?" with real numbers.
The same combination works for planning, not just Q&A: Claude can check your actual HRV and sleep before writing a session, scale it back on a bad recovery day instead of a generic one, and push the result straight to your watch with push_workout_guide. Ask for it directly — "check my recovery and plan today's gym session" — no extra setup beyond having both connected.
For the full version — real progressive-overload programming that persists week to week instead of a one-off ask — install googlarz/gym-skill: /gym setup once, then /gym plan//gym today//gym log//gym review going forward.
Advanced
Edit ~/.claude/mcp_config.json and add the same "suunto" block from Step 10. Then run claude mcp list to verify it's loaded.
After building, you can query Suunto data directly without Claude:
suunto-mcp list-workouts --limit 10
suunto-mcp get-workout <workoutKey>
suunto-mcp export-workout-gpx <workoutKey> > route.gpx
suunto-mcp get-sleep 2026-04-20
suunto-mcp list-recovery --from 2026-04-01 --to 2026-04-30All output is JSON — pipe into jq for filtering.
npm run webhookStarts an HTTP receiver on port 8422 that logs workout events as they arrive. Expose it to the internet (cloudflared, ngrok, your own server) and register the URL in apizone → webhooks.
Set SUUNTO_WEBHOOK_SECRET to the notification secret you configure in apizone's OAuth application settings. Without it, the receiver accepts any POST to its URL as genuine — since this endpoint is exposed to the internet, anyone who finds it could inject forged events. With it set, every request is verified against Suunto's X-HMAC-SHA256-Signature header and rejected with 401 if it doesn't match.
Most users can skip this whole section — asking Claude on demand is simpler.
To store your Suunto login tokens in your OS keychain (macOS Keychain, Windows Credential Manager) instead of a file:
SUUNTO_TOKEN_STORAGE=keychain npm install @napi-rs/keyring
SUUNTO_TOKEN_STORAGE=keychain npm run authClaude picks the right tool automatically — you don't need to know these. For the curious:
Workouts
Tool | What it does |
| Recent workouts, filter by date or sport |
| Full summary for one workout |
| Time-series: HR, pace, altitude, power, GPS per second |
| Raw FIT file decoded to structured data |
| GPX route export for maps, Strava, route planning |
24/7 health (requires individual product subscriptions on apizone)
Tool | What it does |
| Steps, calories, daily heart rate |
| Sleep stages, duration, score |
| Recovery score, HRV, stress balance |
| Aggregated daily stats over a date range |
Routes
Tool | What it does |
| Saved routes on your account |
| Export a route as GPX |
Uploads & guided workouts (write — send data back to your account)
Tool | What it does |
| Upload a FIT file as a new workout — Suunto's own docs say only FIT is currently supported for this endpoint, despite what you might read elsewhere |
| Check whether an upload finished processing |
| Push a structured workout (exercises, weights, rest, notifications) as a SuuntoPlus Guide — requires |
| Push an auto-advancing interval/cardio guide (timed or distance-based segments, target HR ranges) — requires |
Other
Tool | What it does |
| Active webhook subscriptions on your account |
Credits
Suunto APIzone — for opening their API to everyone
Model Context Protocol — the standard this speaks
fit-file-parser— FIT binary decoding
License
MIT — use it, fork it, improve it.
Available Tools
20 toolsexport_routeA
Exports a saved Suunto route as a GPX 1.1 XML string. Suitable for import into navigation apps (Komoot, Strava, Garmin Connect, etc.). Use list_routes to discover valid route IDs. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| routeId | Yes | Route ID returned by list_routes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It explicitly states the operation is read-only, specifies the response as a GPX 1.1 XML string, and avoids implying side effects. It does not describe failure behavior for an invalid route ID, but this is minor for a simple read-only export.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding useful information: what the tool does, where the output is applicable, and how to obtain a valid input. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only export tool with no output schema and no annotations, the description gives enough to select and use it correctly: target resource, output format, input source, and safe behavior. It could mention error outcomes, but that is not essential for initial invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents routeId as 'Route ID returned by list_routes.' The description adds a similar hint, but no significant new semantic value beyond what the schema provides. With 100% schema description coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Exports') with a clear resource ('a saved Suunto route') and names the output format ('GPX 1.1 XML string'). It is also implicitly differentiated from the sibling export_workout_gpx, which targets workouts rather than routes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs the agent to use list_routes to discover valid route IDs and states that the export is suitable for import into navigation apps. It does not explicitly enumerate when to choose this over export_workout_gpx, but the route/workout distinction makes the appropriate context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_workout_gpxA
Returns the workout's GPS route as a GPX 1.1 XML string (not JSON). Each trackpoint contains lat, lon, elevation, and timestamp. Suitable for direct import into Strava, Komoot, Google Earth, or any GPX-compatible tool. Returns a valid but empty GPX document if the workout has no GPS data. Use get_workout_samples for numeric time-series (HR, power, cadence) instead of GPS. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| workoutKey | Yes | Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses that the tool is read-only, returns empty GPX if no GPS data, and the output is an XML string. This adequately covers behavioral aspects, though some details like internal processing are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, front-loaded with the primary action, each sentence adding unique value: format, content, empty case, alternative, and read-only nature. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description fully explains the return format, content details, edge case (empty GPX), and provides usage context and sibling differentiation. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description does not need to add parameter details. The description does not mention the parameter, but the schema itself is sufficient. Baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns the GPS route as a GPX XML string (not JSON), specifies the format and contents of trackpoints, and differentiates from sibling tools like get_workout_samples.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (for GPS route export) and when not to use (for numeric time-series), and provides the alternative tool get_workout_samples. Also mentions compatibility with common GPS tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_daily_digestA
Builds a color-coded daily health digest (steps, sleep, recovery balance, HRV, and a training-load model) for one date and appends it as markdown to a history file. Suunto's API has no fitness/fatigue endpoints, so this computes CTL (42-day fitness), ATL (7-day fatigue), and TSB (form) from each workout's tss.trainingStressScore using standard exponential time constants, persisting the running values in a local sidecar file (SUUNTO_DIGEST_AVERAGES_PATH env var, default ~/.suunto-mcp/averages.json) since there's nowhere else to store them. Rolling 28-day baselines per metric are also tracked there, with a separate baseline bucket for 'party nights' (>20,000 steps) so those don't skew the normal-day average. Requires Sleep and Recovery API subscriptions on apizone for the sleep/recovery sections to populate — falls back to 'no data' text for sections without a subscription rather than erroring. Write operation (updates the sidecar file and appends to the history file).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Calendar date YYYY-MM-DD to summarize. Use yesterday or earlier — Suunto syncs once daily, so today's data is usually incomplete. | |
| seedAtl | No | Same as seedCtl but for Fatigue (ATL). Only used on the very first digest ever run. | |
| seedCtl | No | Only used on the very first digest ever run (no prior sidecar file). Anchors the starting Fitness (CTL) value to the number shown on the user's watch instead of cold-starting at 0. Ask the user for their watch's displayed Fitness value if this is their first digest. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that this is a write operation updating a sidecar file and a history file, names the sidecar path and env var, explains the CTL/ATL/TSB computation, rolling baselines, party-night bucket, and subscription fallback — far beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but almost every sentence carries distinguishing information — side effects, state persistence, calculus, subscription requirements. It front-loads the core purpose and append behavior first. It could be tightened slightly, but it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with 100% schema coverage and no output schema, the description covers everything an agent needs: what to do, when to call, prerequisite subscription, computation, storage side effects, and first-run behavior. Nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters. The description adds key nuance: seedAtl and seedCtl only matter on the first digest, seedCtl should be anchored to the user's watch value, and the date should be yesterday or earlier. That adds value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Builds a color-coded daily health digest') and clearly distinguishes it from sibling read-only tools like get_daily_activity or get_sleep by explaining it computes and appends a markdown history file rather than just returning API data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use yesterday or earlier, notes today's data is usually incomplete, and explains that Sleep/Recovery API subscriptions are needed for those sections. It also says what falls back to 'no data' if subscriptions are missing, giving the agent clear when-to-call guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_activityA
Returns the 24/7 activity time-series samples for one calendar day from the /247samples API. Each sample includes a timestamp (ISO8601) and activity metrics such as steps and HR. Days without synced data return an empty payload. Use list_daily_activity to fetch a date range. Requires 24/7 Activity API subscription on apizone. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Calendar date YYYY-MM-DD. Suunto syncs once daily, so today's data is usually incomplete — but the API responds 200 with an empty or partial payload for today/future dates, it does not throw SuuntoNotFoundError (confirmed live). Use yesterday or earlier for complete results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it states the tool is read-only, requires a specific subscription ('24/7 Activity API subscription'), and discloses empty-payload behavior for days without synced data. The schema adds even more behavioral detail about 200 responses instead of errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: the core return value, sample contents, empty-result behavior, alternative tool, subscription requirement, and safety profile. It is front-loaded with the most important information and has no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an exhaustive schema description, the description covers everything needed to select and invoke it correctly: what it returns, when to expect empty data, how to get date ranges, the subscription requirement, and its read-only nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the 'date' parameter including format, pattern, examples, and behavioral caveats. The description adds no additional parameter-specific semantics beyond mentioning that the tool covers one calendar day, which is appropriate given the schema's richness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Returns'), a specific resource ('24/7 activity time-series samples for one calendar day'), and even cites the underlying API ('/247samples API'). It also lists sample contents (timestamp, steps, HR), making it clearly distinguishable from siblings like get_daily_activity_statistics and list_daily_activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use list_daily_activity to fetch a date range', giving the agent a clear alternative condition. The schema further provides concrete usage guidance: use yesterday or earlier for complete results and expect empty/partial payloads for today or future dates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_activity_statisticsA
Returns aggregated daily step count and energy consumption (joules) from the /247 API for the given datetime range. Response is an array of AggregatedActivityData objects, each with a Name ('stepcount' or 'energyconsumption'), Aggregation ('sum'), and Sources array containing per-device Samples with TimeISO8601 and Value. Maximum fetch interval is 28 days. Samples with null Value indicate no data synced for that day. Prefer this tool over list_daily_activity when you need totals rather than intraday time-series. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| enddate | Yes | End datetime in ISO-8601 format (e.g. 2026-04-30T23:59:59). Must be within 28 days of startdate. | |
| startdate | Yes | Start datetime in ISO-8601 format (e.g. 2026-04-01T00:00:00). Data is stored in UTC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully bears the burden. It states the tool is read-only, describes the response structure, and discloses behavioral traits like maximum interval and null value meaning. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences clearly convey purpose, response format, usage guidance, and read-only nature. No redundancy, but could potentially be slightly more concise by merging response format details. Still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (2 params, no output schema, no annotations), the description covers all necessary context: what the tool does, what it returns, constraints, and differentiation from siblings. It is complete for a retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add parameter-specific information beyond what is already in the schema (ISO-8601, UTC, 28-day constraint). The response structure description is helpful but not directly about parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns aggregated daily step count and energy consumption from the /247 API for a datetime range. It specifies the verb ('Returns') and resource, and distinguishes from sibling list_daily_activity by noting preference when totals are needed vs intraday time-series.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to prefer this tool over list_daily_activity (for totals) and notes the maximum fetch interval of 28 days. It also explains that null Value indicates no synced data, providing clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recoveryA
Returns recovery and HRV time-series samples from the /247samples API for one calendar day. Each sample: { timestamp (ISO8601), Balance (0.0–1.0 recovery balance), StressState (0=Invalid, 1=Relaxing, 2=Active, 3=Passive, 4=Stressful) }. Days without recovery data return an empty payload. Use list_recovery for a date range. Requires Recovery API subscription on apizone; returns 404 without it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Calendar date YYYY-MM-DD. Suunto syncs once daily, so today's data is usually incomplete — but the API responds 200 with an empty or partial payload for today/future dates, it does not throw SuuntoNotFoundError (confirmed live). Use yesterday or earlier for complete results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral disclosure. It reveals the 404-without-subscription behavior, empty payloads for days without data, the read-only nature, and the exact sample fields and enum meanings, going well beyond a minimal statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, output format, empty behavior, alternative tool, subscription requirement, and read-only status. The description is compact, front-loaded with the main action, and contains no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with a detailed input schema, the description provides all necessary behavioral context: what is returned, what an empty payload means, what happens without a subscription, and where to go for a date range. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already thoroughly documents the date parameter including format, examples, and the useful caveat about today's incomplete data. The tool description adds scope context ('one calendar day') but does not materially improve parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns recovery and HRV time-series samples from the /247samples API') and clearly scopes it to one calendar day. The output sample structure is described, and it is distinguishable from the sibling list_recovery by its single-day scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names list_recovery as the alternative for date-range queries, making the single-day use case clear. It also states the subscription requirement and the empty-payload behavior, giving agents concrete conditions for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleepA
Returns sleep time-series samples from the /247samples API for one calendar day: { timestamp (ISO8601), totalSleep (s), deepSleep (s), lightSleep (s), remSleep (s), awake (s), efficiency (%), sleepScore }. Days without recorded sleep return an empty payload. Use list_sleep for a date range. Requires Sleep API subscription on apizone; returns 404 without it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date YYYY-MM-DD the person went to bed (bedtime), NOT the wake-up date — a bedtime shortly after midnight still counts as the previous date. To get 'last night's sleep' as of right now, use yesterday's date, not today's. Suunto syncs once daily — use yesterday or earlier for reliable results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and delivers: read-only status, empty payload for days without data, and 404 on missing subscription. These behaviors go beyond the schema and materially affect invocation expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with purpose and output fields, then edge cases, alternatives, and prerequisites. Every sentence adds distinct value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description enumerates all returned fields, making the response shape predictable. It covers empty results, error conditions (404), subscription requirements, read-only nature, and points to the sibling tool for broader queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% detailed description coverage of the date parameter, including format, meaning, and sync caveats. The tool description adds little beyond confirming 'one calendar day', so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Returns sleep time-series samples from the /247samples API for one calendar day'), which precisely defines scope. It also lists the exact returned fields and explicitly contrasts with sibling list_sleep, making the tool's distinct role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly directs users to list_sleep for date ranges, and the date parameter schema provides rich context on when to use which date (bedtime semantics, sync cadence). It also discloses a hard prerequisite: Sleep API subscription, with 404 behavior without it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upload_statusA
Polls the processing status of a workout upload initiated by upload_workout. Returns status (e.g. 'Queued', 'Processing', 'Processed', 'Error') and the workoutKey once processing completes. Use the returned workoutKey with get_workout for full detail.
| Name | Required | Description | Default |
|---|---|---|---|
| uploadId | Yes | Upload ID returned by upload_workout. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add useful behavioral context: 'polls' implies transient, non-destructive repeated reads, and the status examples ('Queued', 'Processing', 'Processed', 'Error') plus the delayed appearance of workoutKey clarify when the poll is complete. However, it does not disclose behavior for an invalid/unknown uploadId or whether there is any terminal retry/error pattern, which is a noticeable gap for an unannotated polling tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying useful cargo: purpose, return shape, and downstream routing. No filler, and the main verb and context are front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required string parameter), has no annotations, and no output schema. The description compensates well by specifying the status enum and the workoutKey result, plus the follow-up step with get_workout. The only gaps are edge-case behavior for invalid upload IDs or polling termination decisions, which are minor for a tool this small.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the input schema already explains uploadId as 'Upload ID returned by upload_workout.' The description merely repeats this provenance ('initiated by upload_workout') without adding new syntax, format, or lifecycle details, so it does not raise the value above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('polls') and resource ('processing status of a workout upload'), and explicitly ties it to upload_workout as its origin. This clearly distinguishes it from get_workout and other siblings by framing it as the polling stage in an upload workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The workflow is explicitly laid out: this poller follows upload_workout ('initiated by upload_workout') and its output is consumed by get_workout ('Use the returned workoutKey with get_workout for full detail'). This gives the agent exact when-to-use context and routes it to the correct next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutA
Returns the full summary for one workout: all fields Suunto exposes including laps, HR zones, training-effect score, and sport-specific metrics (pace zones for running, power for cycling, etc.). Throws SuuntoNotFoundError if the workoutKey does not exist. Use list_workouts to discover valid workoutKey values. For second-by-second time-series (HR, pace, GPS) use get_workout_samples instead. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| workoutKey | Yes | Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It declares read-only behavior, clearly states the error condition, and lists the types of data returned. This is sufficient for an agent to understand the tool's behavior without surprises.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences), front-loaded with the main purpose, and every sentence adds value. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description explains return content (laps, HR zones, training-effect, sport-specific), mentions error handling, and references related tools. It is complete for a simple retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, but the description adds significant context: the opaque nature of workoutKey, requirement to discover via list_workouts, and the specific error on invalid key. This goes beyond the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns the full summary for one workout, listing specific fields (laps, HR zones, training-effect, sport-specific metrics). It distinguishes from siblings like get_workout_samples and list_workouts by specifying what this tool does versus alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to use list_workouts to discover valid workoutKey values and directs to get_workout_samples for time-series data. Also warns that invalid key throws SuuntoNotFoundError, providing clear when-to-use and when-not-to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workout_fitA
Downloads the workout's binary FIT file from Suunto and returns it parsed to JSON. Default (full=false): compact summary { sport, total_distance_km, avg_heart_rate, training_effect, laps, records_sample: { first, middle, last (one record each), count } }. Set full=true to receive every parsed FIT record — responses are often >100 KB for long workouts. Use the default for analysis and summaries; full=true only when raw record-level data is required. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | false (default): return compact summary. true: return all parsed FIT records. | |
| workoutKey | Yes | Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, and it does well: it states read-only behavior, describes the compact vs full response modes, and warns that responses can exceed 100 KB. It doesn't cover failure modes or authentication, but the key behavioral traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then efficiently explains both modes and gives a clear recommendation. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since there is no output schema, the description appropriately explains the default return shape and characterizes full mode as raw record-level data with a size caveat. It could detail the full-mode record schema more, but it provides enough for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by spelling out the compact summary fields and quantifying the full-mode response size, which helps the agent choose correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it downloads the workout's binary FIT file from Suunto and parses it to JSON. This clearly distinguishes it from nearby siblings like get_workout, get_workout_samples, and export_workout_gpx.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance on when to use full=false versus full=true and warns about large responses in full mode. It stops short of explicitly contrasting with sibling tools, so it doesn't earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workout_samplesA
Returns the time-series sample stream for one workout. Each sample: timestamp (ms), heartRate (bpm), speed (m/s), altitude (m), power (W), cadence, latitude, longitude. Sampled at the device's recording interval (typically 1 s). Long workouts (>2 h) may return thousands of records — use get_workout_fit with full=false for a compact summary instead. Throws SuuntoNotFoundError if the key is invalid. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| workoutKey | Yes | Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature, error thrown (SuuntoNotFoundError), sampling rate, and data volume caveat for long workouts, all beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, followed by field list, caveat, alternative, and error condition. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description explains the output contents and key behaviors. It could explicitly state the output is a list, but the context is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a description for workoutKey, but the description adds crucial context about the key's origin and discoverability, enhancing understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns time-series sample streams for one workout, listing all fields and distinguishing it from get_workout_fit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (detailed data) and when not (long workouts), and suggests an alternative tool (get_workout_fit with full=false).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_daily_activityA
Returns 24/7 activity time-series samples from the /247samples API for the date range [from, to] inclusive, ordered chronologically by timestamp. Each sample: { timestamp (ISO8601), steps, HR, and other activity metrics }. Days without synced data are omitted. Use get_daily_activity for a single day or get_daily_activity_statistics for aggregated daily step/energy totals. Requires 24/7 Activity API subscription on apizone. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness. | |
| from | Yes | Start date YYYY-MM-DD, inclusive. Must be ≤ to. Days without synced data are silently omitted, not 404. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. States read-only, omits days without synced data, accepts future dates with no entries, and confirms chronological ordering. Lacks details on rate limits or pagination, but sufficient for basic understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus one for alternatives/requirements. No redundant words, front-loaded with core functionality. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simplicity (2 params, no output schema), description covers return structure, ordering, and data omission. Could mention sample frequency or additional metrics, but still adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with both parameters having detailed descriptions (date format, constraints, behavior like silent omission). Description adds minimal extra meaning beyond schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns 24/7 activity time-series samples with verb 'returns' and specifies resource, scope, and ordering. Distinguishes from siblings get_daily_activity (single day) and get_daily_activity_statistics (aggregated).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use siblings for single day or aggregated totals. Also mentions required subscription, providing clear usage context. No ambiguous phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recoveryA
Returns recovery and HRV time-series samples from the /247samples API for the date range [from, to] inclusive, ordered chronologically by timestamp. Each entry: { timestamp (ISO8601), Balance (0.0–1.0 recovery balance), StressState (0=Invalid, 1=Relaxing, 2=Active, 3=Passive, 4=Stressful) }. Days without recovery data are omitted. Use get_recovery for a single day. Requires Recovery API subscription on apizone; returns 404 without it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | End date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness. | |
| from | Yes | Start date YYYY-MM-DD, inclusive. Must be ≤ to. Days without recovery data are silently omitted, not 404. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, but description fully discloses behavior: chronological order, omission of days without data, future dates accepted but yield no entries, and subscription requirement. Marks read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each adding value. Front-loaded with main action, followed by output format, sibling reference, error conditions, and optimization tip.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete without output schema: includes output structure, enum meanings, API source, and prerequisite. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage; description adds context: days without data silently omitted for 'from', future dates accepted with no entries and responsiveness hint for 'to'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns recovery and HRV time-series samples for a date range, ordered chronologically. Distinguishes from sibling 'get_recovery' for single day.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use get_recovery for a single day', mentions subscription requirement and 404 error, and advises preferring ranges ≤30 days.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_routesA
Returns all routes saved in the user's Suunto account. Each route: id, description, visibility, distance (m), start/end coordinates, waypoint count. Use export_route to get the GPX track for navigation. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description correctly carries the disclosure burden by stating the operation is read-only and specifying what data will be returned. It does not discuss pagination or edge cases like an empty route list, but for a read-only list operation this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the core result, lists return fields, and flags the main alternative in one compact statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list operation, the description fully defines behavior, output contents, read-only nature, and how to get track data. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to clarify. The baseline 4 applies because the description fully covers the no-input behavior and return fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Returns) and resource (routes saved in the user's Suunto account), and enumerates the exact fields returned. It is clearly distinguishable from siblings like list_workouts and export_route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs agents to use export_route when navigation data is needed, establishing a clear alternative and condition. It doesn't contrast with list_workouts, but the resource is clearly route-specific.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sleepA
Returns sleep time-series samples from the /247samples API for the date range [from, to] inclusive, ordered chronologically by timestamp. Each entry: { timestamp (ISO8601), totalSleep (s), deepSleep (s), lightSleep (s), remSleep (s), awake (s), efficiency (%), sleepScore }. Nights without recorded sleep are omitted. Use get_sleep for a single night. Requires Sleep API subscription on apizone; returns 404 without it. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Last bedtime date YYYY-MM-DD, inclusive (the date the person went to bed, not woke up — see get_sleep). Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness. | |
| from | Yes | First bedtime date YYYY-MM-DD, inclusive (the date the person went to bed, not woke up — see get_sleep). Must be ≤ to. Nights without recorded sleep are silently omitted, not 404. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly: read-only, inclusive date bounds, omission of nights without recorded sleep, field-level output shape, and subscription-derived 404 behavior are all disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: purpose, output shape, edge case, sibling alternative, prerequisite, and safety hint are each handled in one sentence. There is no filler or repetition, and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description compensates by enumerating every returned field with units. It also covers omissions, subscription dependency, read-only nature, and the correct alternative tool—everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both from and to already have detailed descriptions covering format, inclusive bedtime-date semantics, ordering constraints, future-date behavior, and range-size guidance. The description adds little per-parameter meaning beyond reaffirming inclusivity, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns sleep time-series samples'), the API source (/247samples), the date-range scope, and chronological ordering. It also explicitly distinguishes itself from the sibling get_sleep, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative ('Use get_sleep for a single night'), states the subscription prerequisite, and documents the failure mode ('returns 404 without it'). The schema additionally advises ranges ≤ 30 days, giving clear practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscriptionsA
Returns all active webhook subscriptions on this Suunto account as an array of { id, eventType, callbackUrl, createdAt }. Returns an empty array if no webhooks are registered. Use to audit which event types are already wired before adding new subscriptions. Requires Subscriptions API product on apizone. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description adequately discloses read-only behavior, empty array response, and a prerequisite (Subscriptions API product). Lacks details on authentication or rate limits, but sufficient for this simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each providing essential information: output format, empty state, and usage guidance. No redundant or missing words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no annotations or output schema, the description fully covers purpose, behavior, and usage context, enabling an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so no parameter documentation is needed. The description adds value by specifying the output structure and usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns all active webhook subscriptions as an array with specific fields (id, eventType, callbackUrl, createdAt), distinguishing it from sibling tools focused on workouts, activities, sleep, and recovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using the tool to audit existing subscriptions before adding new ones, and notes it is read-only. Does not explicitly mention alternatives or when not to use, but the context is clear given the specialized functionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workoutsA
Returns the user's recent Suunto workouts ordered newest-first (Workout API v3). Each item: workoutKey (string id), activityId (numeric activity code — there is no separate plain-language 'sport' field; use get_workout_fit for the parsed FIT file's session.sport if a sport name is needed), startTime (epoch ms), totalTime (s), totalDistance (m), totalAscent (m), totalDescent (m), energyConsumption (joules, not 'totalCalories'), hrdata: { avg, max } (workout heart rate — hrdata.max is the account's overall max HR, use hrdata.workoutMaxHR for this specific workout's peak). Auto-paginates with offset-based pagination until limit is reached or no more workouts exist. Use get_workout for full detail (laps, HR zones, sport-specific metrics) on a single result. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of workouts to return (1–1000). Defaults to 25. Pagination is automatic across API pages; set to 1 for the single most-recent workout. | |
| since | No | ISO 8601 lower bound on startTime (inclusive). Filters on workout start time; omit for all time. Pagination is automatic so since does not affect page size. | |
| until | No | ISO 8601 upper bound on startTime (inclusive). Omit to include workouts up to the present. Combine with since to target a specific window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden — and it delivers. It declares read-only status, documents newest-first ordering, discloses automatic offset-based pagination, and adds critical field-level caveats: activityId is numeric with no plain-language sport field, energyConsumption is in joules not 'totalCalories', and hrdata.max is the account overall max HR rather than the workout peak (hrdata.workoutMaxHR). These are exactly the behaviors that would cause silent data misinterpretation if omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~130 words) but every clause earns its place: field enumeration with units, three disambiguation caveats that prevent wrong data interpretation, sibling routing, pagination semantics, and a read-only declaration. The core purpose is front-loaded in the first sentence, and the density is justified because each caveat prevents a distinct class of agent error. Nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must document the return contract itself — and it does, listing all response fields with units (workoutKey, activityId, startTime, totalTime, totalDistance, totalAscent, totalDescent, energyConsumption, hrdata avg/max/workoutMaxHR). It covers pagination, ordering, read-only safety, and directs to siblings for missing detail. The only minor blemish is listing hrdata as '{ avg, max }' before referencing workoutMaxHR, but the caveat text resolves it; nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents limit/since/until thoroughly. The description adds marginal but real value by explaining the offset-based pagination mechanism and its termination condition ('until limit is reached or no more workouts exist'), which clarifies how limit interacts with paging beyond the schema's 'Pagination is automatic' note. This nudges it above baseline without the description carrying the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb, resource, and scope: 'Returns the user's recent Suunto workouts ordered newest-first (Workout API v3).' It goes further than most by enumerating the exact response fields, which makes the tool unmistakable, and it explicitly distinguishes itself from get_workout (full detail on a single result) and get_workout_fit (sport name lookup). An agent could not confuse this with a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description routes the agent to alternatives under specific conditions: 'use get_workout_fit for the parsed FIT file's session.sport if a sport name is needed' and 'Use get_workout for full detail (laps, HR zones, sport-specific metrics) on a single result.' It also explains when pagination stops ('until limit is reached or no more workouts exist'), giving the agent a clear decision procedure for list vs. detail calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
push_interval_guideA
Pushes an interval/cardio guide (warmup, timed or distance-based work intervals, recoveries, optional repeats) to the user's Suunto account via the SuuntoPlus Guide Cloud API. Unlike push_workout_guide (manual lap-per-exercise), interval segments auto-advance by elapsed time or distance — hands-off during a run or ride. Each segment can show a target heart-rate range alongside live HR. Requires SUUNTO_APP_NAME env var to exactly match the app name registered on apizone.suunto.com. Same delivery caveat as push_workout_guide: appears after the phone's next normal Suunto app sync, no live push. Write operation.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Session date YYYY-MM-DD. | |
| title | Yes | Short session name shown in the Suunto app, e.g. '4x4 VO2max'. | |
| blocks | Yes | Ordered list of blocks. A block with times>1 repeats its segments as a unit (e.g. 4x[interval,recovery]) — put only the segments that repeat inside it; warmup/cooldown go in their own times=1 blocks before/after. | |
| guideId | No | If provided, updates this existing guide instead of creating a new one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden, and it does so thoroughly. It discloses the write nature, the auto-advance mechanism, the target-HR display capability, the environmental prerequisite, and the 'no live push' delivery caveat. These are exactly the behavioral traits an agent needs to anticipate correct behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose, differentiation, behavior, requirements, and caveat are each handled in direct, memorable sentences. No sentence is wasted or merely repeats schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high schema coverage and absent annotations, the description adds the missing behavioral context: it explains the async sync behavior, the write operation, and the most important execution constraint (environment variable match). It does not discuss error conditions or update-via-guideId side effects, but those are secondary for a tool with this clear schema and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 4 parameters with 100% coverage, so the baseline for this dimension is 3. The description goes beyond by explaining the practical meaning of the parameters: durationSec/distanceM drive auto-advance, and targetHrMin/targetHrMax can appear live alongside the segment display. This contextual layer helps the agent understand how parameter choices affect device behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Pushes an interval/cardio guide ... to the user's Suunto account via the SuuntoPlus Guide Cloud API.' It also explicitly differentiates itself from push_workout_guide by contrasting auto-advancing interval segments with manual lap-per-exercise, making its purpose and distinct role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states its context and alternative: interval/cardio guides with auto-advance should go here, while manual lap-by-lap guides belong to push_workout_guide. It also gives practical usage constraints, like the SUUNTO_APP_NAME environment variable requirement and the after-sync delivery behavior, helping the agent decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
push_workout_guideA
Pushes a text-step workout guide to the user's Suunto account via the SuuntoPlus Guide Cloud API. Each exercise becomes one step, advanced by a lap-button press on the watch. Requires SUUNTO_APP_NAME env var to exactly match the app name registered on apizone.suunto.com. There is no live push to the watch itself — delivery depends on the phone's normal Suunto app sync. In testing it showed up on the watch after the next ordinary sync with no manual pinning needed; if it doesn't appear, check the Suunto app under SuuntoPlus Guides and pin it there. Write operation.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Session date YYYY-MM-DD. | |
| title | Yes | Short session name shown in the Suunto app, e.g. 'Push A'. | |
| guideId | No | If provided, updates this existing guide instead of creating a new one. | |
| exercises | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that delivery depends on normal Suunto app sync, there's no direct live push to the watch, and the guide may need manual pinning in the Suunto app if it doesn't appear. It also notes it's a write operation. However, it doesn't discuss failure modes, rate limits, or whether a guideId update is destructive to existing data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a bit lengthy but every sentence contributes context: the API used, the step conversion, env var requirement, and sync behavior. It could be tightened slightly but is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description lacks a clear contrast with push_interval_guide, but the context of the SuuntoPlus Guide Cloud API and sync behavior is sufficiently explained. There is no output schema, so the return value is not described, but for an async API push that might be acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description adds meaning to the exercises parameter by explaining each exercise becomes one step and is advanced by a lap-button press, and it interprets the detail field as a display string. However, with 75% schema coverage, the guideId parameter is documented in the schema but the description adds little beyond stating it updates an existing guide. The date and title are already well described by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: pushing a text-step workout guide to the user's Suunto account via the SuuntoPlus Guide Cloud API. It distinguishes itself from siblings like push_interval_guide and upload_workout by explicitly mentioning it pushes a text-step workout guide and describing the exercise-to-step conversion. This provides a clear verb, resource, and conceptual model.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool, especially noting the env var requirement and behavior around syncing. However, it doesn't explicitly contrast with push_interval_guide for choosing which guide type to push. Usage context is fairly clear (a workout guide), though not as definitive as listing alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_workoutA
Uploads a workout file to the user's Suunto account. Provide the absolute path to the file on disk. The file is pushed to Suunto and appears in the app after processing (usually a few seconds). Returns an uploadId you can poll with get_upload_status. Suunto's own upload API docs state only .fit (binary) is currently supported for this endpoint — a .gpx path is still accepted here (sent as application/gpx+xml) in case that changes, but treat it as unverified; use .fit for a workout that must reliably show up. Write operation.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | No | Longer notes for the workout. Optional. | |
| privacy | No | Visibility. DEFAULT uses the account's default setting. | DEFAULT |
| filePath | Yes | Absolute path to the .fit or .gpx file on disk. | |
| description | No | Short workout title shown in the Suunto app. Optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description explicitly labels the call 'Write operation,' describes the async processing delay, and states that the file appears in the Suunto app shortly after upload. It also discloses the .gpx risk and the uploadId return value, though it omits duplicate/failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence contributes: core action, file-path requirement, async behavior and return value, and file-format caveat. It is front-loaded with the action and stays within a focused paragraph with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must convey the return value, and it does by naming uploadId and pointing to get_upload_status. It also covers processing delay and file-format caveats, leaving an agent with enough information to invoke the tool and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters, so the baseline is 3; the description adds real value by explaining the absolute-path requirement, the .fit/.gpx distinction, and the MIME used for .gpx. This extra guidance helps agents choose a correct value for the required filePath parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action — 'Uploads a workout file to the user's Suunto account' — and names the artifact, destination, and follow-up. The explicit 'Write operation' label and returned uploadId make it easy to distinguish from the read/list/export siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides workflow guidance: the returned uploadId should be polled via get_upload_status, and it steers users to .fit for reliability rather than .gpx. It does not explicitly enumerate when not to use this tool versus sibling upload tools, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.14.4- Changed
get_daily_activity1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Calendar date YYYY-MM-DD. Suunto syncs once daily — today or future dates typically return SuuntoNotFoundError; use yesterday or earlier for reliable results."New value: +"Calendar date YYYY-MM-DD. Suunto syncs once daily, so today's data is usually incomplete — but the API responds 200 with an empty or partial payload for today/future dates, it does not throw SuuntoNotFoundError (confirmed live). Use yesterday or earlier for complete results."
- Changed
get_recovery1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Calendar date YYYY-MM-DD. Suunto syncs once daily — today or future dates typically return SuuntoNotFoundError; use yesterday or earlier for reliable results."New value: +"Calendar date YYYY-MM-DD. Suunto syncs once daily, so today's data is usually incomplete — but the API responds 200 with an empty or partial payload for today/future dates, it does not throw SuuntoNotFoundError (confirmed live). Use yesterday or earlier for complete results."
2 tool updates
v0.14.1- Changed
get_sleep1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Wake-up date YYYY-MM-DD. Keyed to the morning the session ended, not when it started. Suunto syncs once daily — use yesterday or earlier for reliable results."New value: +"Date YYYY-MM-DD the person went to bed (bedtime), NOT the wake-up date — a bedtime shortly after midnight still counts as the previous date. To get 'last night's sleep' as of right now, use yesterday's date, not today's. Suunto syncs once daily — use yesterday or earlier for reliable results."
- Changed
list_sleep2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"First wake-up date YYYY-MM-DD, inclusive. Must be ≤ to. Nights without recorded sleep are silently omitted, not 404."New value: +"First bedtime date YYYY-MM-DD, inclusive (the date the person went to bed, not woke up — see get_sleep). Must be ≤ to. Nights without recorded sleep are silently omitted, not 404." - changed
Input schema / properties / to / descriptionPrevious value: -"Last wake-up date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness."New value: +"Last bedtime date YYYY-MM-DD, inclusive (the date the person went to bed, not woke up — see get_sleep). Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness."
7 tool updates
v0.14.0- Added
export_route - Added
generate_daily_digest - Added
get_upload_status - Added
list_routes - Added
push_interval_guide - Added
push_workout_guide - Added
upload_workout
1 tool update
v0.10.0- Added
get_daily_activity_statistics
11 tool updates
v0.9.2- Changed
export_workout_gpx1 field changed- changed
Input schema / properties / workoutKey / descriptionPrevious value: -"Unique workout identifier from list_workouts."New value: +"Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError."
- Changed
get_daily_activity1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Calendar date YYYY-MM-DD. Example: 2026-04-20."New value: +"Calendar date YYYY-MM-DD. Suunto syncs once daily — today or future dates typically return SuuntoNotFoundError; use yesterday or earlier for reliable results."
- Changed
get_recovery1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Calendar date YYYY-MM-DD. Example: 2026-04-20."New value: +"Calendar date YYYY-MM-DD. Suunto syncs once daily — today or future dates typically return SuuntoNotFoundError; use yesterday or earlier for reliable results."
- Changed
get_sleep1 field changed- changed
Input schema / properties / date / descriptionPrevious value: -"Wake-up date YYYY-MM-DD. Example: 2026-04-20."New value: +"Wake-up date YYYY-MM-DD. Keyed to the morning the session ended, not when it started. Suunto syncs once daily — use yesterday or earlier for reliable results."
- Changed
get_workout1 field changed- changed
Input schema / properties / workoutKey / descriptionPrevious value: -"Unique workout identifier from list_workouts."New value: +"Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError."
- Changed
get_workout_fit1 field changed- changed
Input schema / properties / workoutKey / descriptionPrevious value: -"Unique workout identifier from list_workouts."New value: +"Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first."
- Changed
get_workout_samples1 field changed- changed
Input schema / properties / workoutKey / descriptionPrevious value: -"Unique workout identifier from list_workouts."New value: +"Opaque server-assigned string returned by list_workouts. Not guessable or constructable — always discover via list_workouts first. Passing an invalid key throws SuuntoNotFoundError."
- Changed
list_daily_activity2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date YYYY-MM-DD, inclusive. Example: 2026-04-01."New value: +"Start date YYYY-MM-DD, inclusive. Must be ≤ to. Days without synced data are silently omitted, not 404." - changed
Input schema / properties / to / descriptionPrevious value: -"End date YYYY-MM-DD, inclusive. Example: 2026-04-30."New value: +"End date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness."
- Changed
list_recovery2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"Start date YYYY-MM-DD, inclusive. Example: 2026-04-01."New value: +"Start date YYYY-MM-DD, inclusive. Must be ≤ to. Days without recovery data are silently omitted, not 404." - changed
Input schema / properties / to / descriptionPrevious value: -"End date YYYY-MM-DD, inclusive. Example: 2026-04-30."New value: +"End date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness."
- Changed
list_sleep2 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"First wake-up date YYYY-MM-DD, inclusive. Example: 2026-04-01."New value: +"First wake-up date YYYY-MM-DD, inclusive. Must be ≤ to. Nights without recorded sleep are silently omitted, not 404." - changed
Input schema / properties / to / descriptionPrevious value: -"Last wake-up date YYYY-MM-DD, inclusive. Example: 2026-04-30."New value: +"Last wake-up date YYYY-MM-DD, inclusive. Future dates are accepted but produce no entries. Prefer ranges ≤ 30 days for responsiveness."
- Changed
list_workouts3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of workouts to return (1–1000). Defaults to 25."New value: +"Maximum number of workouts to return (1–1000). Defaults to 25. Pagination is automatic across API pages; set to 1 for the single most-recent workout." - changed
Input schema / properties / since / descriptionPrevious value: -"ISO 8601 lower bound on startTime (inclusive). Example: 2026-04-01T00:00:00Z."New value: +"ISO 8601 lower bound on startTime (inclusive). Filters on workout start time; omit for all time. Pagination is automatic so since does not affect page size." - changed
Input schema / properties / until / descriptionPrevious value: -"ISO 8601 upper bound on startTime (inclusive)."New value: +"ISO 8601 upper bound on startTime (inclusive). Omit to include workouts up to the present. Combine with since to target a specific window."
7 tool updates
v0.9.1- Changed
get_daily_activity3 fields changed- added
Input schema / properties / date / examplesAdded value: +[ + "2026-04-20" +] - added
Input schema / properties / date / maxLengthAdded value: +10 - added
Input schema / properties / date / minLengthAdded value: +10
- Changed
get_recovery3 fields changed- added
Input schema / properties / date / examplesAdded value: +[ + "2026-04-20" +] - added
Input schema / properties / date / maxLengthAdded value: +10 - added
Input schema / properties / date / minLengthAdded value: +10
- Changed
get_sleep3 fields changed- added
Input schema / properties / date / examplesAdded value: +[ + "2026-04-20" +] - added
Input schema / properties / date / maxLengthAdded value: +10 - added
Input schema / properties / date / minLengthAdded value: +10
- Changed
list_daily_activity6 fields changed- added
Input schema / properties / from / examplesAdded value: +[ + "2026-04-01" +] - added
Input schema / properties / from / maxLengthAdded value: +10 - added
Input schema / properties / from / minLengthAdded value: +10 - added
Input schema / properties / to / examplesAdded value: +[ + "2026-04-30" +] - added
Input schema / properties / to / maxLengthAdded value: +10 - added
Input schema / properties / to / minLengthAdded value: +10
- Changed
list_recovery6 fields changed- added
Input schema / properties / from / examplesAdded value: +[ + "2026-04-01" +] - added
Input schema / properties / from / maxLengthAdded value: +10 - added
Input schema / properties / from / minLengthAdded value: +10 - added
Input schema / properties / to / examplesAdded value: +[ + "2026-04-30" +] - added
Input schema / properties / to / maxLengthAdded value: +10 - added
Input schema / properties / to / minLengthAdded value: +10
- Changed
list_sleep6 fields changed- added
Input schema / properties / from / examplesAdded value: +[ + "2026-04-01" +] - added
Input schema / properties / from / maxLengthAdded value: +10 - added
Input schema / properties / from / minLengthAdded value: +10 - added
Input schema / properties / to / examplesAdded value: +[ + "2026-04-30" +] - added
Input schema / properties / to / maxLengthAdded value: +10 - added
Input schema / properties / to / minLengthAdded value: +10
- Changed
list_workouts2 fields changed- added
Input schema / properties / since / examplesAdded value: +[ + "2026-04-01T00:00:00Z" +] - added
Input schema / properties / until / examplesAdded value: +[ + "2026-04-30T23:59:59Z" +]
11 tool updates
v0.9.0- Changed
export_workout_gpx2 fields changed- added
Input schema / properties / workoutKey / descriptionAdded value: +"Unique workout identifier from list_workouts." - added
Input schema / properties / workoutKey / minLengthAdded value: +1
- Changed
get_daily_activity3 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Calendar date YYYY-MM-DD. Example: 2026-04-20." - added
Input schema / properties / date / formatAdded value: +"date" - added
Input schema / properties / date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
get_recovery3 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Calendar date YYYY-MM-DD. Example: 2026-04-20." - added
Input schema / properties / date / formatAdded value: +"date" - added
Input schema / properties / date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
get_sleep3 fields changed- changed
Input schema / properties / date / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Wake-up date YYYY-MM-DD. Example: 2026-04-20." - added
Input schema / properties / date / formatAdded value: +"date" - added
Input schema / properties / date / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
get_workout2 fields changed- added
Input schema / properties / workoutKey / descriptionAdded value: +"Unique workout identifier from list_workouts." - added
Input schema / properties / workoutKey / minLengthAdded value: +1
- Changed
get_workout_fit3 fields changed- changed
Input schema / properties / full / descriptionPrevious value: -"If true, returns ALL parsed records (large). Default false returns a summary + sampled records."New value: +"false (default): return compact summary. true: return all parsed FIT records." - added
Input schema / properties / workoutKey / descriptionAdded value: +"Unique workout identifier from list_workouts." - added
Input schema / properties / workoutKey / minLengthAdded value: +1
- Changed
get_workout_samples2 fields changed- added
Input schema / properties / workoutKey / descriptionAdded value: +"Unique workout identifier from list_workouts." - added
Input schema / properties / workoutKey / minLengthAdded value: +1
- Changed
list_daily_activity6 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"YYYY-MM-DD (inclusive)"New value: +"Start date YYYY-MM-DD, inclusive. Example: 2026-04-01." - added
Input schema / properties / from / formatAdded value: +"date" - added
Input schema / properties / from / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / to / descriptionPrevious value: -"YYYY-MM-DD (inclusive)"New value: +"End date YYYY-MM-DD, inclusive. Example: 2026-04-30." - added
Input schema / properties / to / formatAdded value: +"date" - added
Input schema / properties / to / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
list_recovery6 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Start date YYYY-MM-DD, inclusive. Example: 2026-04-01." - added
Input schema / properties / from / formatAdded value: +"date" - added
Input schema / properties / from / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / to / descriptionPrevious value: -"YYYY-MM-DD"New value: +"End date YYYY-MM-DD, inclusive. Example: 2026-04-30." - added
Input schema / properties / to / formatAdded value: +"date" - added
Input schema / properties / to / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
list_sleep6 fields changed- changed
Input schema / properties / from / descriptionPrevious value: -"YYYY-MM-DD"New value: +"First wake-up date YYYY-MM-DD, inclusive. Example: 2026-04-01." - added
Input schema / properties / from / formatAdded value: +"date" - added
Input schema / properties / from / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / to / descriptionPrevious value: -"YYYY-MM-DD"New value: +"Last wake-up date YYYY-MM-DD, inclusive. Example: 2026-04-30." - added
Input schema / properties / to / formatAdded value: +"date" - added
Input schema / properties / to / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
list_workouts8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max workouts to return."New value: +"Maximum number of workouts to return (1–1000). Defaults to 25." - added
Input schema / properties / limit / maximumAdded value: +1000 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / since / descriptionPrevious value: -"ISO 8601 datetime — only workouts on/after this time."New value: +"ISO 8601 lower bound on startTime (inclusive). Example: 2026-04-01T00:00:00Z." - added
Input schema / properties / since / formatAdded value: +"date-time" - changed
Input schema / properties / until / descriptionPrevious value: -"ISO 8601 datetime — only workouts on/before this time."New value: +"ISO 8601 upper bound on startTime (inclusive)." - added
Input schema / properties / until / formatAdded value: +"date-time"
12 tool updates
v0.1.0- First observed
export_workout_gpx - First observed
get_daily_activity - First observed
get_recovery - First observed
get_sleep - First observed
get_workout - First observed
get_workout_fit - First observed
get_workout_samples - First observed
list_daily_activity - First observed
list_recovery - First observed
list_sleep - First observed
list_subscriptions - First observed
list_workouts
TDQS
Scored across 20 tools
Most tools are clearly separated by resource (routes, workouts, sleep, recovery, activity) and action (list/get/export/upload/push). The only mild ambiguity is between get_workout_samples and get_workout_fit, both returning detailed workout data, but their descriptions clarify time-series vs. parsed FIT records.
The naming follows a consistent verb_noun pattern: list_*, get_*, export_*, upload_*, push_*. Minor deviations include generate_daily_digest (verb_noun but not resource-oriented) and get_upload_status (get_ + noun, consistent enough). Overall predictable and readable.
20 tools is on the higher end but justified by the breadth of Suunto's APIs (workouts, routes, 24/7 activity, sleep, recovery, guides, uploads). Each tool maps to a distinct endpoint or operation, so none feel redundant. Slightly heavy but within a reasonable range for a multi-domain fitness platform.
The surface covers the main Suunto domains well: routes (list/export), workouts (list/get/samples/fit/gpx/upload/status), daily activity (single/range/statistics), sleep, recovery, and guide pushing. Minor gaps: no workout deletion, no route creation, no subscription management beyond listing, and no direct watch messaging. But core read/write workflows are complete.
Maintenance
Related MCP Connectors
Connect Claude to your Intervals.icu watch data for fitness, workout review, and plan writing.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server for Polar Signals Cloud continuous profiling platform, enabling AI assistants to analyze CPU performance, memory usage, and identify optimization opportunities in production systems.9-
- FlicenseNot gradedqualityDmaintenanceEnables ChatGPT to access and analyze personal Garmin health data including daily steps, heart rate, calories, sleep duration, and body battery levels. Collects data via webhook from Garmin devices and provides health insights through natural language queries.2-
- AlicenseAqualityNot gradedmaintenanceEnables interaction with Siemens Polarion requirements management system through natural language. Supports authentication, project management, work item queries, document access, and requirements analysis.9MIT
- AlicenseNot gradedqualityFmaintenanceConnects WHOOP fitness data to Claude Desktop, enabling natural language queries about workouts, recovery, sleep patterns, and physiological cycles with secure OAuth authentication and local data storage.150 npm27MIT