Trainbud
Provides tools for querying Garmin Connect fitness data, including workouts, sleep, heart rate, recovery, body composition, stress, and VO2 max trends.
TrainBud
Talk to your training data.
TrainBud is an open-source MCP server that connects your Garmin Connect fitness data to Claude, Cursor, and other AI assistants. Ask about workouts, sleep, heart rate, recovery, and body composition in plain English — privately, on your machine.
Disclaimer: TrainBud is an unofficial community project. It is not affiliated with, endorsed by, or sponsored by Garmin Ltd. Garmin Connect is a trademark of Garmin Ltd.
Try it
Once connected to your MCP client, ask things like:
"What did I do today?"
"How's my sleep been this week?"
"Am I recovered enough to train hard tomorrow?"
"Is my resting heart rate trending down?"
See examples/prompts.md for more ideas.
Related MCP server: Garmin MCP
Why TrainBud
Private — credentials stay in your local
.env; data is cached on your machineLocal-first — SQLite cache, session tokens in
.trainbud/Works everywhere — Windows, macOS, Linux (Node.js 20+)
Any MCP client — Claude Desktop, Cursor, and other stdio-compatible clients
Smart fetching — batched API calls and automatic re-auth when sessions expire
Quick start
npx trainbud setupThe setup wizard walks you through credentials, authentication, and connecting Cursor or Claude Desktop — no MCP config editing required. Then restart your MCP client and ask it what you did today.
To keep trainbud on your PATH instead of typing npx every time:
npm install -g trainbud
trainbud setupNeeds Node 20+. Full walkthrough: QUICKSTART.md
git clone https://github.com/Zsadigzade/trainbud.git
cd trainbud
npm install
npm run build
npm link # puts `trainbud` on your PATH; undo with `npm unlink -g trainbud`
trainbud setupWithout npm link, every trainbud <command> in this README is
node dist/index.js <command> run from the repo root. If dist/ does not exist yet,
run npm run build first.
Claude Code plugin (recommended)
Install as a Claude Code plugin — skills and MCP server in one step:
/plugin marketplace add Zsadigzade/trainbud
/plugin install trainbud@trainbudSet credentials, then restart Claude Code:
export GARMIN_EMAIL="your@email.com"
export GARMIN_PASSWORD="yourpassword"Command | What it does |
| First-time setup and diagnostics |
| Ask about workouts, sleep, recovery, HR, stress, VO2 max |
Plugin files live in plugin/. See plugin/README.md.
Claude Code skills (in-repo)
This repo also ships project skills in .claude/skills/ for development without installing the plugin:
Command | What it does |
| Install, authenticate, configure MCP, run live check |
| Ask about workouts, sleep, recovery, HR, stress, VO2 max |
Open the repo in Claude Code (claude in this directory) — skills load automatically.
To use skills in every project without the plugin, copy them to ~/.claude/skills/.
After setup, restart your MCP client and try /trainbud with "What did I do today?"
Dashboard
trainbud serve hosts a dashboard at /dashboard. It is phone-first, because the
pairing flow is: you are standing next to the watch holding a phone when you approve a
code.
It shows what stands out today against your own baselines, this week against last week, and resting heart rate and sleep plotted against your own 30-day median — all read from the local history store, so it paints instantly and works even when your Connect session has expired. A break in a line is a day with no measurement, not a zero.
It is also where you tell TrainBud who it is talking to:
Setting | What it changes |
Name, units, primary sport, weekly goal | Every renderer, and what the AI is told about you |
Thresholds | Where green becomes amber and amber becomes red — on the watch too |
Watch cards | Which cards appear on the wrist and in what order, live on the next sync |
AI model, tone, answer length | How the Ask card and the daily insight sound |
Your own Ask questions | Up to five, 32 characters each. They lead the watch's Ask menu; the rest of the slots stay generated from what fired |
Monthly spending cap | Optional. Refuses an Ask past the cap instead of spending past it |
Privacy | Local feature counters, on by default, with a delete button |
Usage. TrainBud runs on your own AI provider key, so every question and every daily insight is charged to you. The dashboard shows the tokens and cost per call, the month to date, and a 30-day chart. A model this build has no published price for is recorded with its cost left unknown rather than as zero — a call priced at zero would make a cap that can never trip.
Nothing on this page leaves your machine. There is no endpoint to send it to.
Garmin watch widget (Connect IQ)
View recovery, sleep, activity, stress, and VO2 max on your Garmin watch via a Connect IQ widget in ciq/.
Requires: trainbud serve running + HTTPS tunnel (same setup as web AI).
Start the server and tunnel:
trainbud serve cloudflared tunnel --url http://127.0.0.1:3847Build and sideload the widget — see ciq/README.md
In Garmin Connect Mobile → Connect IQ → TrainBud settings, set:
Server URL — your tunnel URL (e.g.
https://abc.trycloudflare.com)
Open the widget on your watch — it shows a pairing code. Approve it in the dashboard (
/dashboard?token=YOUR_API_KEY) to complete setup. The dashboard swaps that token for a session cookie and drops it from the URL, so the address bar is safe to screenshot afterwards.
The glance shows recovery and sleep from the last cached summary, so it renders without
waiting on the network. Open it and tap or swipe to cycle through the cards you left switched on in the dashboard. The watch
calls GET /api/watch — a compact JSON summary, not the full MCP protocol.
Connect to Claude Desktop
Edit claude_desktop_config.json:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"trainbud": {
"command": "node",
"args": ["C:/path/to/trainbud/dist/index.js", "start"],
"env": {
"GARMIN_EMAIL": "your@email.com",
"GARMIN_PASSWORD": "yourpassword"
}
}
}
}With trainbud on your PATH (npm install -g trainbud, or npm link from a clone),
point the client at the command instead of a path:
{
"mcpServers": {
"trainbud": {
"command": "trainbud",
"args": ["start"]
}
}
}Restart your MCP client, then start asking questions.
Tools
Tool | What it answers |
| Your most recent workout — distance, pace, HR, elevation |
| Activities between two dates |
| Sleep duration, stages, score, awakenings |
| Resting, max, and average HR over time |
| Recovery score from HRV, sleep, stress, resting HR |
| Weight, body fat, and muscle mass trends |
| Daily stress averages and trends |
| VO2 max fitness trends over time |
| Combined weekly summary (activities, sleep, recovery, stress) |
| What stands out against your own 28-day baselines, not a population average |
| This week against last, the load forecast, sleep debt, and your next race |
| Record a goal, a race and its date, an injury, or a note |
| What is on record about you, on any date |
| How a session actually felt — RPE, soreness, mood |
CLI
trainbud setup # Interactive first-time setup (recommended)
trainbud serve # Remote HTTP MCP for web AI (claude.ai, ChatGPT)
trainbud check # Live diagnostics against all tools
trainbud doctor # What the watch would see: public URL, AI key, history depth
trainbud backfill # Pull Garmin history into the local store (resumable)
trainbud findings # What stands out against your own baselines
trainbud start # Start the MCP server (stdio)
trainbud auth # Force re-authentication
trainbud cache clear # Clear cached data
trainbud devices # List paired watches
trainbud devices revoke <id> # Take one watch's access away
trainbud status # Show session and cache status
trainbud --version # Print versionEvery one of these also works as npx trainbud <command> without installing anything.
Troubleshooting: trainbud: command not found
Either use npx trainbud <command>, or install it globally with
npm install -g trainbud. Running from a clone instead? Run npm link once from the
repo root, or call the built entry point directly with node dist/index.js doctor
(after npm run build).
Configuration
Variable | Default | Description |
| — | Garmin Connect email |
| — | Garmin Connect password |
|
| Session token storage |
|
| Log file path |
|
| SQLite cache database |
|
| Activity cache TTL (seconds) |
|
| Sleep cache TTL (seconds) |
|
| Stats cache TTL (seconds) |
| auto-generated | Bearer token for HTTP MCP ( |
|
| Bind host for HTTP server |
|
| Bind port for HTTP server |
Security & privacy
Credentials live only in your local
.envfile — never sent to a third partySession tokens in
.trainbud/session.jsonare as sensitive as a passwordTool errors are sanitized before reaching the AI client
Uses the unofficial
garmin-connectnpm package (not Garmin's enterprise OAuth API)MFA is not supported by the underlying library — disable MFA or use an app-specific password
The server binds
127.0.0.1by default. It is only reachable from the internet if you point a tunnel at it, and every route except/healthneeds the API keyThe dashboard takes the key once, on
/dashboard?token=…, then trades it for anHttpOnlysession cookie and redirects to a clean URL — so the key does not sit in your address bar, your history, or a screenshotA paired watch holds a token scoped to that watch, minted at pairing and stored on the server as a SHA-256 hash.
trainbud deviceslists them,trainbud devices revoke <id>takes one away — without logging out the dashboard,/mcp, or your other watches. A watch paired before 0.5.2 holds the API key itself; re-pair it to swap that for a scoped tokenEvery response carries
Content-Security-Policy,X-Content-Type-Options,X-Frame-OptionsandReferrer-Policy, including the 401s. HSTS is sent only on a request that actually arrived over TLS, so the loopback dashboard stays reachable
What TrainBud is not
Not a hosted service. There is no TrainBud account and no TrainBud server. You run it, on your machine, against your own Garmin credentials
Not an official Garmin integration. It drives an unofficial library against the Connect web API. Garmin can change that API without notice, and does
Not MFA-compatible. If your Connect account has MFA on, this will not log in
Not free to ask. The AI features run on your own Anthropic key and are billed to you. The dashboard meters every call and can refuse past a cap you set
Troubleshooting
Issue | Fix |
Authentication failed | Verify |
MFA enabled on account | Disable MFA or use an app-specific password |
Stale data | Run |
Rate limited | Wait 60 seconds; cached responses are used when available |
Watch shows "Not a TrainBud server" or error -400 | Your public URL is answering with something that is not TrainBud's JSON — usually a tunnel that is down. Run |
Watch shows "Watch not authorised" | The API key changed since the watch paired. Pair it again from the dashboard |
Watch shows "AI not set up" | AI is bring-your-own-key. Paste an Anthropic key into the dashboard |
No sleep/HR data | Ensure your Garmin device has synced to Garmin Connect |
Server won't start | Check that |
Development
npm install
npm run build
npm test # 551 tests via the Node test runner
npm run lint
npm run dev # Start with auto-reloadUse .nvmrc with nvm/fnm for Node 20. If your project path contains #, use npm test instead of npm run test:vitest.
See CONTRIBUTING.md and docs/VAULT.md for architecture and design notes (Obsidian vault, outside this repo).
Roadmap
VO2 max trends
Stress levels
Training insights
Workout comparison
Docker image
License
MIT — see LICENSE.
Garmin Connect is a trademark of Garmin Ltd. This project is not affiliated with Garmin Ltd.
Available Tools
14 toolsget_activities_rangeA
Returns Garmin activities within an ISO 8601 date range.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | End date in ISO 8601 format | |
| start_date | Yes | Start date in ISO 8601 format |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden; 'Returns' indicates a read operation, and the date-range constraint is stated. However, it does not disclose ordering, inclusivity of endpoints, timezone handling, pagination, or response format, leaving some ambiguity.
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?
A single sentence with the verb and resource front-loaded and no filler. It is appropriately sized for a two-parameter read tool.
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 definition is complete enough for a simple date-range query, especially with schema-covered parameters. Yet the lack of output schema and absence of any note about ordering, pagination, or range limits leaves the return contract underspecified.
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 describes both parameters as ISO 8601 strings with 100% coverage, so the baseline applies. The description reinforces the date-range concept but adds no parameter-level detail 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?
The description states a clear verb ('Returns'), a specific resource ('Garmin activities'), and a scope ('within an ISO 8601 date range'). It is distinct from siblings like get_latest_activity or get_week_review, though it does not explicitly name 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?
The description implies when to use the tool: when activities in a date range are needed. It offers no explicit when-not-to-use guidance or comparison to sibling tools, so the usage context is present but not fully developed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_body_compositionC
Returns weight, body fat, and muscle mass trends over a time period.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
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 of behavioral disclosure. It only says 'returns' trends, implying a read operation, but it doesn't disclose how trends are computed, whether data is aggregated or raw, how the time period is bounded, or what happens when no data is available. This is minimal and insufficient without annotation support.
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 single, focused sentence with no wasted words. The core capability is front-loaded and easy to parse. However, it omits details about the time period parameter, which affects completeness more than conciseness; as a concise statement it works well.
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 tool with one parameter and no annotations or output schema, the description is incomplete for correct invocation. The agent does not know what 'days' means, how to specify the time period, or what the returned trends look like. Sibling tools don't provide this context. The description leaves critical 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?
The only parameter 'days' has no schema description (0% coverage), and the description never mentions it. While the name 'days' hints at a time period, the description's 'over a time period' is not explicitly linked to the parameter. The agent cannot determine the parameter's meaning, default, or units from the 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?
The description states a specific verb ('Returns') and a distinct resource ('weight, body fat, and muscle mass trends over a time period'). This clearly identifies the tool's purpose and differentiates it from sibling trend tools like get_heart_rate_trends or get_vo2_max_trends by the metrics involved, though it doesn't explicitly name 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?
There is no guidance on when to use this tool versus the many sibling tools. It doesn't mention that it should be used for body composition metrics specifically, or provide any exclusions or conditions. The agent must rely on the tool name and description to infer its use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_findingsA
Returns what stands out in the user's stored history against their own 28-day baselines: resting heart rate elevation, sleep debt, HRV trend breaks, and training load ratio. Prefer this over reading raw metrics when asked how things are going.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 clearly conveys that the tool performs baseline comparison over a 28-day window and returns highlighted anomalies rather than raw numbers. It does not mention output format or side effects, but 'Returns' strongly implies a read-only operation and the behavioral details given are valuable.
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 deliver both the tool's core behavior and usage guidance with no filler. The key output categories are front-loaded, and the preference statement earns its place by helping the agent decide when to invoke this tool.
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 zero-input analysis tool, the description covers what it returns, the comparison basis, and the preferred usage scenario. It lacks an explicit output schema or example, but the enumerated finding types give sufficient context for an agent to understand the tool's role among many siblings.
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 and schema coverage is 100%, so there is nothing for the description to add about parameter meaning. Per the baseline for zero-parameter tools, a 4 is appropriate; the description does not need to compensate for any schema gaps.
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 what stands out') and a clear resource ('user's stored history against their own 28-day baselines'). It enumerates concrete signals—resting heart rate elevation, sleep debt, HRV trend breaks, training load ratio—which separates it from sibling tools that return raw metrics. The preference statement further distinguishes it from raw metric retrieval tools.
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 to prefer this tool over reading raw metrics when asked how things are going. This gives a clear contextual trigger and an implicit alternative. It does not name specific sibling tools or list exclusion cases, but the guidance is actionable enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_heart_rate_trendsB
Returns resting, max, and average heart rate trends over a time period.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
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 of behavioral disclosure. It only says 'Returns' trends, which hints at a read operation, but it does not describe what 'over a time period' means, whether the days parameter is required, what default behavior occurs, or any units or granularity.
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 single focused sentence with no wasted words. It is front-loaded with the core output type, though it sacrifices useful detail for brevity.
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 is the only source of context, and it leaves key decisions unclear. An agent cannot confidently determine how to set the days parameter, what the returned trend data looks like, or whether calling without parameters is valid.
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 0%, and the description does not explicitly connect the 'days' parameter to the time period or explain its semantics. The phrase 'over a time period' is vague and does not clarify whether days is optional, what the range is, or what happens when it is omitted.
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 ('Returns') and a specific resource ('resting, max, and average heart rate trends'), making the tool's function immediately clear. It is distinguishable from sibling tools like get_vo2_max_trends or get_sleep_data because it names heart rate metrics explicitly.
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 implies this tool should be used when heart rate trend data is needed, but it gives no explicit guidance on when to choose it over sibling tools like get_vo2_max_trends or get_recovery_status. There are no exclusions or alternative-routing hints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_activityA
Returns the most recent Garmin activity with distance, duration, pace, and heart rate stats.
| 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 carries the full burden. It discloses the returned stats, but does not mention edge cases (e.g., no activities found), time zone handling, or that this is a read-only operation. For a simple getter this is adequate but not rich.
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 single sentence that front-loads the action and resource, then lists the specific stats. Every word earns its place; 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 zero-parameter read tool, the description covers the core function well. However, it lacks differentiation from siblings and does not explain how 'most recent' is determined or what the output format is. Output schema is absent, so more return detail would help.
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 the description need not explain parameter semantics. The baseline of 4 applies because there are no parameter details to add.
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'), a specific resource ('most recent Garmin activity'), and the key stats (distance, duration, pace, heart rate). This clearly distinguishes it from siblings like get_activities_range by scoping to a single, latest 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?
No guidance is given on when to use this tool versus alternatives such as get_activities_range or get_week_review. The 'most recent' wording implies a use case, but there is no explicit context or exclusion, which is a notable gap given the large sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recovery_statusB
Combines HRV, sleep, stress, and resting heart rate into a recovery score and training recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| hrv_weight | No | ||
| sleep_weight | No | ||
| stress_weight | No | ||
| resting_hr_weight | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It states what metrics are combined but does not disclose default weighting behavior, whether the weights are optional, whether the operation is read-only, or what the training recommendation contains.
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 single sentence that front-loads the core computation and output. Every phrase contributes meaning, and there is no filler or 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?
There is no output schema and no annotations, so the description must stand alone. It omits important invocation details such as what happens when no weights are supplied, how the recovery score is scaled, and what the training recommendation looks like.
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 0%, and the parameter names already reveal the four metrics. The description adds only that these are combined, without explaining weight semantics, valid ranges, defaults, or whether calling with no parameters is meaningful.
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 ('Combines') and clearly identifies the resource: HRV, sleep, stress, and resting heart rate produce a recovery score and training recommendation. This distinguishes it from sibling tools like get_sleep_data or get_stress_levels, which return individual data streams.
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 implies use when an aggregate recovery assessment is needed, but it does not explicitly state when to prefer this tool over overlapping siblings like get_training_insights or get_week_review. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleep_dataB
Returns sleep duration, quality score, stage breakdown, and interruptions for recent nights.
| Name | Required | Description | Default |
|---|---|---|---|
| nights | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It does convey that the tool returns data for 'recent nights' and implies a read-only operation, but it fails to explain default behavior, how far back 'recent' reaches, or whether the 'nights' parameter controls the time window.
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 single, front-loaded sentence that lists concrete output components, which is efficient and easy to parse. However, the brevity comes at the cost of missing crucial parameter and usage details.
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 one optional parameter, no output schema, and no annotations, so the description must supply essential context. It lists return fields but leaves the meaning of 'nights' and the default behavior unspecified, making correct invocation uncertain when a specific night count is requested.
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 0% and the description does not explain the meaning or effect of the 'nights' parameter. The phrase 'recent nights' hints at a time window but never links it to the parameter, leaving the agent unable to determine how to request a specific number of nights.
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 'Returns' and a precise resource: sleep duration, quality score, stage breakdown, and interruptions. It clearly distinguishes this tool from sibling tools focused on heart rate, stress, recovery, and other non-sleep metrics.
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 provides no guidance on when to choose this tool over siblings like get_recovery_status or get_week_review, nor does it mention any exclusions or prerequisites. Usage must be inferred entirely from the tool name and output list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stress_levelsC
Returns daily stress averages and trends from Garmin Connect.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It does not mention the role of the 'days' parameter, any default time range, whether the data is read-only, or what 'trends' entails. The description is essentially a purpose statement and lacks behavioral depth.
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 single concise sentence with no filler, and the core action is front-loaded. It is appropriately brief for a simple read tool, though it sacrifices useful detail for brevity.
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 annotations, no output schema, and one undocumented optional parameter. The description does not explain how 'days' influences the result, what the response looks like, or any sensible defaults. An agent cannot reliably invoke this tool correctly without additional information.
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 0%, and the description does not mention the 'days' parameter at all. The only parameter is left completely undocumented, so an agent has no basis to infer its meaning, constraints, or default behavior from the 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?
The description states a specific verb ('Returns'), a clear resource ('daily stress averages and trends'), and the data source ('Garmin Connect'). It is unambiguous about what the tool does, though it does not explicitly differentiate itself from sibling tools like get_heart_rate_trends or get_week_review.
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?
No guidance is given on when to use this tool versus alternatives or what context it is appropriate for. The description only states what it returns; there are no conditions, exclusions, or references to sibling tools that might be more suitable for related queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_training_insightsC
Returns a combined weekly training summary: latest activity, recent workouts, sleep, recovery, and stress.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral context on its own. It does indicate a read-only retrieval ('Returns') and lists the data domains, which is helpful. However, it does not explain how the 'weekly' window is determined, how the optional 'days' parameter affects results, or any aggregation behavior, leaving the agent with incomplete behavioral 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?
The description is a single, front-loaded sentence that immediately conveys the outcome and organizes the included metrics in a scannable list. There is no fluff or repetition, though it could have briefly addressed the 'days' parameter without sacrificing conciseness.
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 having only one optional parameter, the tool lacks an output schema and annotations, and it sits among many overlapping sibling tools (get_week_review, get_sleep_data, get_recovery_status, get_stress_levels). The description fails to explain how 'days' shapes the request or how this summary differs from get_week_review, leaving significant gaps for correct invocation and routing.
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 only parameter, 'days', is completely undocumented in both the schema and the description (0% schema description coverage). The description never mentions 'days' or explains its relationship to the weekly summary, such as whether it overrides the default week or controls look-back. The agent must guess from the parameter name alone, so the description adds zero semantic value.
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 a combined weekly training summary and enumerates the included components (latest activity, recent workouts, sleep, recovery, stress). This gives a specific, understandable purpose, but it does not explicitly distinguish it from the similarly named sibling get_week_review.
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 implies this tool is for a high-level weekly overview by combining multiple metrics, but it provides no explicit when-to-use or when-not-to-use guidance. It does not mention that individual getters like get_sleep_data or get_recovery_status are better for focused queries, nor does it route to get_week_review for a possibly different weekly review.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_contextA
Returns the goals, races, injuries and notes on record for the user. Read this before giving training advice.
| Name | Required | Description | Default |
|---|---|---|---|
| on_date | No | ISO date to evaluate against | |
| include_closed | No | Include entries that have ended |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the behavioral disclosure burden. It clearly indicates this is a read-only retrieval operation via 'Returns,' which is basic transparency. Yet it does not explain the effect of optional parameters such as on_date or the default exclusion of include_closed, nor mention any edge behavior, leaving some ambiguity about what 'on record' means over time.
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 consists of two tightly written sentences: the first states the return value and the second gives a practical usage directive. There is no filler or redundancy, and the most important 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?
For a fairly simple read-only tool with fully documented optional parameters, the description covers the core return content and the primary use case in enough depth that an agent can decide to call it. It stops just short of being complete because it does not clarify how date-scoped queries behave or distinguish its output from sibling tools like get_week_review, but the absence of nested objects and output schema keeps the need low.
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 documents both parameters with 100% coverage, so a baseline score of 3 applies. The description adds no additional context about how on_date or include_closed influence the returned records; the agent must rely solely on the schema's short property descriptions.
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 ('Returns') and a concrete resource list ('goals, races, injuries and notes on record for the user'), which tells an agent exactly what data is exposed. The additional directive 'Read this before giving training advice' clarifies the tool's intended role in the coaching workflow and sets it apart from the sibling data-retrieval tools by naming its unique content categories.
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 second sentence, 'Read this before giving training advice,' provides an explicit, actionable trigger for when this tool should be called, which is strong guidance. However, it does not contrast this tool with alternatives such as get_findings or get_training_insights, nor state conditions when this tool should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vo2_max_trendsA
Returns VO2 max fitness trends over time from Garmin Connect.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
'Returns' indicates a non-mutating read operation, which is the main behavioral trait. With no annotations, the description could add caveats about data freshness, availability, or authorization, but for a simple read tool this is a minimal but acceptable disclosure.
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?
A single front-loaded sentence with no filler. Every word adds useful information: the action, the metric, the time dimension, and the data source.
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 high-level return value is stated, but without an output schema or annotations the description does not specify result granularity or default behavior for omitted `days`. It is minimally viable yet leaves a clear gap in how an agent should interpret or parameterize the call.
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 documents only the type and bounds of `days`, and the description does not explain what `days` controls (such as lookback window or aggregation period), nor what omitting it returns. With 0% schema-description coverage, the description fails to compensate.
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 ('Returns'), a precise resource ('VO2 max fitness trends over time'), and a source ('Garmin Connect'). This clearly distinguishes the tool from sibling metrics such as get_heart_rate_trends and get_body_composition.
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 implies the use case: call when VO2 max trend data is needed. However, it offers no explicit comparison to sibling tools, no conditions, and no when-not-to-use guidance, leaving alternative selection to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_week_reviewA
Returns this training week against the previous one — sessions, training load, sleep, resting heart rate, HRV and stress — plus where the acute:chronic load ratio lands if next week repeats this one, a sleep debt and consistency read against the user's own baseline, and the next race on record. Prefer this over reading individual metrics when asked how the week or the block is going, whether to back off, or what to do next week.
| 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 carries the full burden of behavioral disclosure. 'Returns' clearly indicates a read operation, and the description transparently explains the projection condition ('if next week repeats this one') and that outputs are compared against the user's own baseline. It does not explicitly state side effects, but none are expected for a no-parameter read-only review.
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 return value and contains no filler, but the first sentence is a long list of metrics that is somewhat dense. Both sentences earn their place; it is concise but slightly heavy in one breath.
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?
There is no output schema and no annotations, so the description must explain the return content and usage context on its own. It does so thoroughly, covering the comparison, projections, baseline reads, and the next race, making the tool's behavior sufficiently complete 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?
There are zero parameters, so the baseline is 4. The description correctly avoids inventing parameter details and instead focuses on what the tool returns, which is the only relevant semantic content.
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 ('Returns') and a clear resource ('this training week against the previous one'), then enumerates the exact metrics included. This distinguishes it from sibling per-metric getters like get_sleep_data, get_heart_rate_trends, and get_stress_levels.
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 states when to prefer this tool: when asked how the week or block is going, whether to back off, or what to do next week. It also contrasts it with reading individual metrics, giving an agent a clear decision rule for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_subjectiveA
Records how a day or session actually felt, rated 1-10: perceived effort (rpe), soreness, or mood. Garmin has no equivalent.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date the rating is for | |
| kind | Yes | Which rating this is | |
| note | No | Optional free-text detail | |
| value | Yes | A rating from 1 to 10 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It communicates the core behavior—recording a rated subjective feeling—and clarifies the scale and categories, but it does not disclose whether entries overwrite or append, whether authorization is needed, or what response is returned. For a simple logging tool, this is adequate but not richly transparent.
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 two sentences with no filler. It front-loads the action and scope, lists the distinct rating types, and the 'Garmin has no equivalent' note is a useful differentiator rather than unnecessary detail.
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: four parameters, two required, an enum, and no output schema. The description covers what is being logged, which values are valid, and why this tool exists separately from Garmin-derived siblings. It stops short of describing expected return/confirmation behavior or date defaulting, but these are minor for a basic logging call.
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, but the description adds value by mapping 'rpe' to perceived effort, explaining that values range 1-10, and tying the rating to a day or session. This gives the enumerated 'kind' and numeric 'value' parameters practical 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?
The description uses a specific verb ('Records') and resource ('how a day or session actually felt'), and enumerates the exact rating kinds and scale. This clearly distinguishes it from the sibling get_* tools, which all retrieve Garmin 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?
The description provides clear context: this is for subjective self-reported ratings, not objective Garmin measurements, and explicitly notes Garmin has no equivalent. It does not spell out 'when not to use' or name alternative logging tools, but among the provided siblings there is no direct alternative, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remember_contextA
Records something about the user that Garmin does not know: a goal, a race and its date, an injury, or a free-form note. Use this whenever the user mentions one in passing.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What sort of thing this is | |
| text | Yes | What to remember, in the user's own words where possible | |
| effective_to | No | ISO date this stops being true | |
| effective_from | No | ISO date this became true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does convey the core write side effect and the non-Garmin scope, but it does not mention overwriting behavior, retention, how effective dates interact with the stored memory, or what happens after recording. This is adequate but only partially transparent.
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 with no filler. The purpose is front-loaded and the trigger is stated in the second sentence. Every sentence contributes useful information without repeating schema details.
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 low-complexity four-parameter write tool, the schema already documents the parameters and the description covers why and when to use it. The main gap is that the optional effective_from/effective_to fields are never connected to the 'race and its date' example, and there is no mention of the expected confirmation or return behavior, but this is not blocking.
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. The description's enumerated examples mirror the kind enum and add no real meaning beyond what the schema already provides, and it says nothing about the optional effective_from and effective_to fields beyond what the schema states.
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 ('Records') with a clearly scoped resource ('something about the user that Garmin does not know') and enumerates the exact kinds of things it stores. This distinguishes it from the read-only getter siblings and clarifies that it is a write/memory operation.
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 gives an explicit trigger: use it whenever the user mentions one of these things in passing. However, it does not name alternatives or state when not to use it, so an agent is not fully guided on routing between this, log_subjective, and get_user_context.
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. Dates show when Glama detected each change.
14 tool updates
v0.5.2- First observed
get_activities_range - First observed
get_body_composition - First observed
get_findings - First observed
get_heart_rate_trends - First observed
get_latest_activity - First observed
get_recovery_status - First observed
get_sleep_data - First observed
get_stress_levels - First observed
get_training_insights - First observed
get_user_context - First observed
get_vo2_max_trends - First observed
get_week_review - First observed
log_subjective - First observed
remember_context
TDQS
Several high-level tools overlap heavily: get_week_review, get_training_insights, get_findings, and get_recovery_status all summarize training, sleep, recovery, and recommendations. An agent could easily pick the wrong one for a general 'how am I doing' question, despite the preferential language in the descriptions.
Most tools follow a clean get_<domain> snake_case pattern, with get_activity, get_sleep, get_stress, and similar names making behavior predictable. The exceptions like remember_context and log_subjective are still clear actions, but get_findings and get_training_insights are slightly vaguer in what they return.
At 14 tools, the count is within a reasonable range for a fitness-data assistant. However, several aggregate summary tools overlap enough that a few could be consolidated, making the set slightly heavier than necessary.
The server covers the core domains well: activities, sleep, heart rate, recovery, body composition, stress, VO2 max, user context, and subjective logs. Minor gaps exist around updating or deleting stored context/logs and writing/planning workouts, but the read-side coaching surface is largely complete.
Maintenance
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
MCP-Native LLM Orchestration Agent
Private health and fitness analytics through a secure remote MCP connection.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceConnects Garmin Connect data to MCP-compatible clients, providing access to fitness activities, health metrics, and training plans. It supports advanced features like headless 2FA and automated MFA retrieval to enable seamless health data interaction through natural language.1MIT
- AlicenseBqualityAmaintenanceLocal-first MCP server that connects AI agents to your Garmin sleep, HRV, Body Battery, stress, training readiness and activities, keeping tokens on your machine.4271911MIT
- AlicenseAqualityBmaintenanceA Model Context Protocol (MCP) server for Garmin Connect integration. Access your activities, health data, training metrics, and more through Claude and other LLMs.2261MIT
- AlicenseNot gradedqualityCmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.63MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Zsadigzade/trainbud'
If you have feedback or need assistance with the MCP directory API, please join our Discord server