Hyrox Coach MCP
Connects read-only to a user's Garmin Connect account (one-time login with cached session tokens) to supply wearable data for coaching: readiness score, sleep, HRV, resting HR, Garmin Coach running plan (phase, today's run, week ahead with targets), fitness trends (VO2 max, race predictions, endurance/hill score, lactate threshold), running load vs tolerance, and training summaries. It also exposes Garmin-specific guidance on how to read its metrics and record sessions.
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., "@Hyrox Coach MCPshould I go hard today? check my readiness and sleep"
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.
Hyrox Coach MCP
A local MCP server that turns your own wearable data into coaching for hybrid fitness races (8 x 1 km runs, each followed by a functional station). Most coaching apps only understand running. This one reads your recovery, your running plan and your training trends, and remembers the station work your watch can't see.
Status: early prototype (v0.2). Garmin is the only working data source today; others are planned (see Data sources). The Garmin source uses the unofficial
garminconnectlibrary, which can break when Garmin changes its login, and may conflict with Garmin's terms of use. You use it with your own account at your own risk. Not affiliated with, endorsed by or sponsored by Garmin, Apple or HYROX; "HYROX" is a trademark of its respective owner and is used here only to describe the race format this tool helps you train for.Not medical advice. Stop and see a professional if you feel pain, illness or injury.
What it does
Tool | Answers |
| "Should I go hard today?" Readiness score, sleep, HRV, resting HR, last hard session, with a signal and reasons |
| Your wearable's running coach plan (Garmin Coach): phase, today's run and the week ahead with targets |
| "Am I improving?" VO2 max, predicted 5k/10k/half, endurance score, hill score, lactate threshold, aerobic efficiency, running load vs tolerance, station progress |
| Week-by-week runs, classes, load, load balance and acute:chronic ratio |
| Recent sessions and whether station notes were logged |
| Which wearable is connected and what it can supply |
| Saves what your watch can't see (sled weights, wall-ball sets, how it felt). Local only |
| Race date, division, goal, days to go, phase, station standards |
Everything is read-only toward your wearable account. Notes and your race profile live in a local
SQLite file (~/.hyrox-coach/coach.db). Responses are cached so agents don't hammer the provider.
Related MCP server: whoop-ai-mcp
Data sources
Pick the one that matches your watch. Each source declares what it can supply, and the tools say "not available" for the rest instead of failing. Station notes, the race profile and race planning work the same for everyone.
Source | Status | How it connects | Notes |
Garmin Connect | ✅ Available | One-time login in your terminal; session tokens cached locally | Full feature set, including Garmin Coach plan and fitness trends |
Apple Health (Apple Watch) | 🚧 Next | Import the Health app's Export All Health Data file ( | Apple has no cloud API. No coach plan or readiness score, so those will be estimated and labelled as such. HRV is not comparable with Garmin's |
Oura | 💡 Candidate | OAuth, personal use | Strongest on sleep, HRV and readiness. API terms to be checked first |
Polar | 💡 Candidate | OAuth (AccessLink) | Workouts, sleep, recovery. API terms to be checked first |
Whoop | 💡 Candidate | OAuth | Recovery, strain, sleep, workouts. API terms to be checked first |
Strava | ⛔ Not supported | n/a | Strava's API policy prohibits feeding its data to AI tools and MCP servers. If you use Strava, add Strava's official MCP next to this one |
Coros / Suunto | ⛔ Not planned | n/a | Partner-only or unofficial APIs (not verified). Via Strava is not an option, see above |
What each source can supply today and in the plan:
Capability | Garmin | Apple Health (planned) | Oura / Polar / Whoop (candidates) |
Activities | ✅ | ✅ | Varies by provider |
Sleep, HRV, resting HR | ✅ | ✅ | ✅ |
Readiness score | ✅ Garmin's own | Estimated by this tool | Provider's own (Oura, Whoop) |
Training load | ✅ | Estimated | Provider-specific |
Running coach plan | ✅ Garmin Coach | ❌ | ❌ |
Fitness trends (VO2 max, endurance score, race predictions) | ✅ | VO2 max only | Mostly ❌ |
Choose your source with hyrox-coach login --provider garmin, in ~/.hyrox-coach/config.toml
(provider = "garmin"), or with the HYROX_COACH_PROVIDER environment variable. List what's available with
hyrox-coach providers. See the design notes for the architecture
and the research behind this list.
How source-specific coaching works
The skill is provider-neutral: it holds the coaching method (routines, stations, training structure,
race strategy). Advice that depends on your watch, such as how to read its metrics, its traps and how to record
sessions on it, lives in a GUIDE.md for each source and is delivered by the get_data_source tool at the start of a
conversation. That way it works in any agent, not only ones that support skills, and one skill upload covers
every source. If a source has no running coach plan, the skill switches to planning the runs itself.
Adding a data source
Create
src/hyrox_coach/providers/<name>/with a provider that implementsProvider(base.py) and maps the source's data into the models in models.py. Declare itsCapabilitieshonestly.Add a
GUIDE.mdwith the required sections (see the Garmin guide as a model). A test fails if a provider has no guide or is missing a section.Register it in providers/init.py.
Add tests using small synthetic data, never real health data.
Setup
Requires Python 3.12+.
git clone https://github.com/ebertoburgos/hyrox-coach-mcp.git && cd hyrox-coach-mcp
python3 -m venv .venv
.venv/bin/pip install -e .Garmin
Log in once. You type your credentials in your own terminal; they are never stored, only the session
tokens Garmin returns (in ~/.garminconnect, readable only by you):
.venv/bin/hyrox-coach loginCheck what your watch and account provide:
.venv/bin/hyrox-coach doctorIf Garmin answers with 429 (rate limited), wait and try later. Don't retry logins in a loop.
Apple Health
Not available yet. It will need no login: you export your data from the Health app and point the tool at the file.
Upgrading from 0.1
The commands were renamed from hybrid-coach to hyrox-coach. The old names still work as aliases, so
existing MCP configs keep working, and your notes in ~/.hybrid-coach/ are copied to ~/.hyrox-coach/ on
first run. Python 3.12 is now required, so recreate your virtual environment with it.
Connect it to an agent
Claude Desktop
Add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows), using the absolute path to your clone:
{
"mcpServers": {
"hyrox-coach": {
"command": "/absolute/path/to/hyrox-coach-mcp/.venv/bin/hyrox-coach-mcp"
}
}
}Restart Claude Desktop (quit fully, then reopen). Then add the coaching playbook: zip skills/hyrox-coach/
and upload it in Settings > Capabilities > Skills, or paste its contents into a Project's instructions.
Claude Code
claude mcp add hyrox-coach -- /absolute/path/to/hyrox-coach-mcp/.venv/bin/hyrox-coach-mcpCopy skills/hyrox-coach/ into ~/.claude/skills/.
Other local MCP clients (Cursor, OpenAI Agents SDK, …)
Run .venv/bin/hyrox-coach-mcp as a stdio server.
ChatGPT
ChatGPT can only connect to hosted MCP servers, not local ones. A summary export you can upload to ChatGPT is planned (see Roadmap).
Getting better coaching out of it
Use your watch's running coach for your runs (Garmin Coach) if it has one. This tool plans around it instead of competing with it.
After a class or simulation, tell the agent what you did: "sled push 4x20 m at 125 kg, wall balls 3x20 unbroken, felt heavy". It saves this with the session. Station progress only exists if you log it.
Record simulations with a lap press at every run/station change. Normal classes can stay one HIIT activity.
Roadmap
Data sources
Apple Health provider:
export.xmlimport, plus optional automatic sync from an iOS export appEstimated readiness and training load for sources that don't provide them
Oura, Polar and Whoop, after checking each provider's API terms
Coaching tools
analyze_session: lap analysis for runs (pace fade, HR drift, coach-plan target compliance) and effort blocks inside HIIT classesget_week_plan: running plan plus classes on one calendar, with clash warningsget_race_outlook/build_race_plan: projected finish, weakest areas, per-run pacing, taper
Install and sharing
hyrox-coach setupwizard (pick a source, connect it, check it)One-click Claude Desktop install (
.mcpbbundle) anduvxinstall from PyPIListing in the official MCP Registry
hyrox-coach export: one markdown summary to upload to ChatGPT or any chat agent
License
MIT, see LICENSE.
Privacy
Your data stays on your machine: provider session tokens (Garmin: ~/.garminconnect), notes and cache in
~/.hyrox-coach/. The agent you connect will see the tool results, so the same privacy terms as that
agent apply. Health data is sensitive: never commit tokens, data/ exports, health export files or coach.db.
Available Tools
9 toolsget_coach_planBRead-only
The athlete's running coach plan from their wearable (Garmin Coach): phase (build/peak/taper), week number, event date, today's workout and upcoming workouts with targets (HR or pace), and run consistency since the plan started. The coach plan owns the runs; plan stations and classes around it.
| Name | Required | Description | Default |
|---|---|---|---|
| days_ahead | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real context beyond that: the data originates from the athlete's wearable (Garmin Coach) and functions as the source of truth for runs. It omits behavioral edge cases such as what happens when no plan exists or data is stale, but for a read-only getter this is adequate.
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 that leads with what the tool returns and follows with the enumerated payload. Dense but every clause carries information; the trailing ownership sentence is the only slightly indirect part.
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?
An output schema exists, so return-value explanation is not required, and the description correctly covers the data's origin. However, for a tool with an undocumented parameter and an open-world external data dependency, it should state the days_ahead window and the empty/no-plan case.
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 is one parameter, days_ahead (default 7), with 0% schema description coverage, and the description never mentions it. It refers to 'upcoming workouts' without tying that window to days_ahead, so an agent must guess at the parameter's semantics and defaults.
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?
Names a specific resource (Garmin Coach plan from the wearable) and enumerates its contents: phase, week number, event date, today's and upcoming workouts with HR/pace targets, and run consistency. An agent knows exactly what it gets. Sibling differentiation is only implicit via the note that 'the coach plan owns the runs; plan stations and classes around it' — no sibling tool is named.
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?
Usage is implied by the ownership statement ('plan stations and classes around it'), suggesting this is the anchor when planning other sessions. There is no explicit when-to-use/when-not, no mention of what to do if no coach plan is connected, and no routing to alternatives like get_training_summary or get_progress.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_sourceARead-only
Which wearable provider is connected, what it can supply (readiness, sleep, HRV, coach plan, fitness trends) and its coaching guidance: how to read this source's metrics, its traps and how to record sessions on it. Call this first in a conversation and follow the guidance when interpreting data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds meaningful behavioral context beyond them: the response is orientation/capability material, not raw data, and it should shape how later data is interpreted ('its traps and how to record sessions on it'). No pagination or freshness/rate details, but for a zero-arg meta tool that is minor.
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 what the tool reveals and followed by the call-first instruction. The parenthetical capability list is dense but each item earns its place by telling the agent what signals are available before it queries them.
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 an output schema present, return values need no explanation, and with zero parameters there are no argument gaps. An agent knows what it gets, when to call it, and how to use the result, which is everything needed for this orientation 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 tool takes zero parameters, so there are no semantics to document and the baseline is 4. The description correctly spends no space on arguments.
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?
Names a concrete resource and enumerates its contents specifically: connected wearable provider, its supported signals (readiness, sleep, HRV, coach plan, fitness trends), and its coaching guidance including traps and session recording. This clearly distinguishes it from siblings like get_readiness or get_coach_plan, which each return one slice of that 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?
'Call this first in a conversation and follow the guidance when interpreting data' gives an explicit sequencing rule and a downstream obligation, which is exactly the usage context an agent needs. It stops short of naming exclusions or contrasting with specific siblings, so it sits just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_progressARead-only
How the athlete is improving over the last N weeks, Garmin Coach style: VO2 max, predicted 5k/10k/half, endurance score (and HIIT vs running contribution), hill score, lactate threshold, aerobic efficiency on easy runs, running impact vs tolerance, plus station progress from logged notes. Each metric has a verdict (improving/stable/declining). Metrics the provider doesn't compute are listed as missing.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuine behavioral context beyond that: every metric carries an improving/stable/declining verdict, and metrics the provider does not compute are explicitly listed as missing, which tells the agent to expect partial results rather than treat gaps as 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?
The core purpose and time window are front-loaded in the first clause, and the long metric enumeration is dense but each item names a distinct return field, so it earns its space. Minor redundancy in the final sentences about verdicts and missing metrics.
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 an output schema present, the description need not spell out return structure, and it still previews the metric set and the verdict/missing-value conventions. The only gap is the thin treatment of the single input parameter's valid range.
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 is only one parameter and schema description coverage is 0%, so the description must carry the meaning of 'weeks'. It does define the semantics as the trailing window ('improving over the last N weeks'), but it gives no default, permitted range, or minimum lookback, leaving the agent to guess sensible values.
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 resource (athlete progress trends over the last N weeks) and enumerates the metrics returned — VO2 max, predicted race times, endurance/hill/lactate scores, running impact, station progress — which clearly separates it from readiness or training-summary tools. It stops short of naming a sibling, but the scope is 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?
Usage is implied by the 'improving over the last N weeks / Coach-style' framing, so an agent can infer this is the trend-analysis call rather than a point-in-time check. However, there is no explicit when-to-use versus get_readiness or get_training_summary, and no prerequisites or exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_race_profileCRead-only
Race date, days to go, current phase (build/peak/taper/race day), division and goal, plus the race format and station standards for the division.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing behavioral beyond that — notably it doesn't say what happens if no race has been set (empty result vs error) or note that data may be external/open-world.
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?
One compact sentence with no filler. It is front-loaded with the returned content rather than the action, which slightly weakens scanability, but there is no padding.
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?
An output schema exists, so the field enumeration is largely redundant with structured data, and the description leaves out the two things an agent most needs: what happens when no race profile exists and how this differs from set_race_profile. Adequate but with clear 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 tool takes zero parameters, so the baseline is 4; there is no parameter semantics to explain and nothing misleading is stated.
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 is a noun-phrase inventory of returned fields (race date, days to go, phase, division, goal, format, station standards) rather than a statement of what the tool does. Combined with the name get_race_profile the intent is inferable, and it implicitly contrasts with set_race_profile, but it never says 'returns the athlete's race profile' 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?
No guidance on when to call this versus get_coach_plan, get_readiness, or set_race_profile. It also doesn't state a precondition such as 'call after a race profile has been configured', which matters given set_race_profile exists as a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readinessARead-only
Recovery and readiness for a day (default today): the provider's readiness score and its limiting factors (if it has one), sleep, HRV vs baseline, resting HR, Body Battery, last hard session, and a signal (ready_for_hard / easy / rest_or_very_easy) with reasons. Pair it with get_coach_plan to decide today's session.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true). The description adds real value beyond them by disclosing the aggregation content, the default-to-today behavior, and the enumeration of the readiness signal values (ready_for_hard / easy / rest_or_very_easy) with reasons. It doesn't mention degraded cases such as missing provider data, which keeps it from a 5.
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 the purpose, then the enumerated payload and the pairing advice. Dense and largely waste-free, though the long comma-laden enumeration of fields is slightly harder to scan than a structured list.
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 an output schema present, return values needn't be explained, and annotations cover safety, so remaining burden is light. The description covers purpose, payload contents, and signal semantics well; the only gap is the accepted date format for the lone parameter.
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 single parameter has 0% schema description coverage, so the description must carry it. It does say the tool is 'for a day' and defaults to today, which explains intent and default behavior, but it never states the accepted format for 'day' (e.g., ISO date), leaving the only input partially specified.
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 resource and scope ('Recovery and readiness for a day, default today') and then enumerates the concrete data it returns: readiness score, limiting factors, sleep, HRV vs baseline, resting HR, Body Battery, last hard session. This is far more than the name restates and lets an agent distinguish it from get_training_summary or get_progress.
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 routes the agent: 'Pair it with get_coach_plan to decide today's session', which names the sibling and the downstream purpose. It gives clear context for use but no explicit when-not condition or exclusion rule, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_training_summaryBRead-only
Week-by-week training: run km and count, hybrid/class sessions, hours, training load, hard sessions, plus the provider's 4-week load balance and acute:chronic load ratio when available.
| Name | Required | Description | Default |
|---|---|---|---|
| weeks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds meaningful context by noting that load balance and acute:chronic ratio are only present 'when available,' which signals conditional/missing fields, but it says nothing about the provider dependency (openWorld) beyond that hint or about empty/partial results.
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, front-loaded with the core 'week-by-week training' payload and with the conditional metrics placed last. Dense but every clause maps to a returned field, so little is wasted; it reads as a fragment rather than a full 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?
Return values need no explanation given the output schema exists, and the description complements it by naming the notable metrics. For a read-only single-parameter tool that's close to sufficient, but the unexplained `weeks` semantics and absent sibling-routing guidance leave 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 single `weeks` parameter has 0% schema description coverage, so the description must compensate and largely doesn't — it never explains that `weeks` controls the lookback window (default 4). Worse, mentioning 'the provider's 4-week load balance' could mislead an agent into thinking that figure scales with the `weeks` argument.
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 enumerates the resource precisely: week-by-week run km and count, hybrid/class sessions, hours, training load, hard sessions, plus 4-week load balance and acute:chronic ratio. It's a noun-list rather than a verb phrase, so the action ('retrieve') is implied, but the content scope is clear enough to distinguish it from siblings like get_readiness or get_coach_plan.
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 indication of when to prefer this over get_progress, get_readiness, or get_coach_plan, and no prerequisites or exclusions are stated. An agent seeing overlapping-sounding siblings gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sessionsBRead-only
Recent sessions, newest first. kind filters to 'run', 'hybrid' (HIIT/classes/strength) or 'other'. has_note shows whether station details were logged.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| kind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint and openWorldHint already cover the safety profile, so the description's job is lighter; it does add ordering ('newest first') which is behavior the agent needs. However it introduces 'has_note' as if it were an available filter/output, which does not appear in the schema and could mislead an agent trying to use it. The 'days' window, which governs how far back 'recent' stretches, is never explained.
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 tight, front-loaded sentences with no filler; the core behavior and the interesting filter semantics come first. The dangling 'has_note' clause is the one sentence that doesn't earn its place, since the field isn't in the schema.
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?
An output schema exists, so return shape needn't be described. Still, for a two-parameter listing tool with zero schema descriptions, the missing explanation of 'days' and the phantom 'has_note' reference leave gaps an agent would have to guess around.
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 0%, so the description must compensate. It does good work on 'kind' by spelling out the accepted values ('run', 'hybrid' for HIIT/classes/strength, 'other') since no enums exist in the schema. But 'days' is completely unaddressed, leaving the recency window's meaning and default (14) unexplained.
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 plainly that this returns recent sessions in reverse-chronological order, which is a specific enough resource+scope for an agent to recognize a listing tool. Sibling tools (get_progress, get_training_summary) are summaries rather than raw session listings, but the description doesn't explicitly draw that line.
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 statement of when to call this versus get_progress or get_training_summary, and no prerequisites or exclusions. Usage must be inferred from the phrase 'recent sessions' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_session_noteA
Save what the athlete did in a session the wearable cannot see (stations, weights, reps, times, how it felt). Stored locally only, never sent to the wearable provider. Extract structured stations from what the athlete says; keep their own words in text. Defaults to today.
| Name | Required | Description | Default |
|---|---|---|---|
| day | No | ||
| text | Yes | ||
| stations | No | ||
| activity_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the write profile is known. The description adds genuinely useful non-schema context — storage is local-only and never sent to the wearable provider — but says nothing about whether writes are idempotent, what happens on duplicate day entries, or validation failures.
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 the purpose and the phone-only storage caveat before the extraction instruction. Dense but every clause carries information; 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?
An output schema exists, so return values need no explanation, and the write-safety story is covered by annotations plus the local-only note. The remaining gap is the unexplained activity_id parameter and the unstated format for day.
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?
Top-level schema coverage is effectively 0%: 'text' and 'activity_id' have no descriptions and 'day' has no format stated. The description rescues 'day' (defaults to today) and clarifies the text/stations split, but 'activity_id' — how to link a note to an existing session — is completely undocumented in both schema and 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?
Uses a specific verb (Save) with a clearly scoped resource (a session note for what the wearable cannot see), and explicitly distinguishes this from the wearable-sourced data that siblings like get_training_summary and list_sessions return.
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?
Gives concrete invocation guidance: extract structured stations from the athlete's words, keep verbatim text in 'text', and default to today when no day is given. No explicit when-not conditions or named alternatives, but the 'wearable cannot see' framing implicitly tells the agent which sessions this applies to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_race_profileA
Set the athlete's race details (stored locally). division: open_men, open_women, pro_men, pro_women, doubles_men, doubles_women, doubles_mixed. goal is free text, e.g. 'finish strong' or 'sub 1:30'. Only the fields given are changed.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| division | No | ||
| location | No | ||
| race_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description still adds real value: '(stored locally)' clarifies there is no remote side effect, and 'Only the fields given are changed' discloses merge semantics rather than replace semantics. It stops short of saying what happens to omitted fields on a fresh profile or whether any validation is applied to division.
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 purpose and storage note are front-loaded, then the parameter details follow in a tight sequence with no filler. The division list is long but earns its place since the schema carries no enum.
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?
An output schema exists so return values need no explanation, and the local-mutation nature is disclosed. However, for a four-parameter mutation with zero schema coverage, leaving race_date's format (ISO date? natural language?) and location's meaning unaddressed is a real gap an agent could stumble on.
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 0% and all four parameters are undocumented in the schema, so the description has to compensate. It does well for two of them (the full division enumeration, goal as free text with example values) and for null/omission behavior, but 'location' and especially 'race_date' get no format or constraint guidance at all.
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: 'Set the athlete's race details', and the sibling get_race_profile makes the write-vs-read split inferable from the verb alone. It doesn't explicitly name the sibling, but a competent agent can distinguish the two without opening a schema.
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?
Usage is implied by the mutation verb and by 'Only the fields given are changed', which tells the agent it can call it for partial updates. There is no explicit statement of when to prefer this over get_race_profile or when a profile must exist first, so the guidance is only adequate.
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.
9 tool updates
v0.2.0- First observed
get_coach_plan - First observed
get_data_source - First observed
get_progress - First observed
get_race_profile - First observed
get_readiness - First observed
get_training_summary - First observed
list_sessions - First observed
log_session_note - First observed
set_race_profile
TDQS
Scored across 9 tools
Each tool targets a distinct slice: readiness (daily recovery), coach_plan (upcoming runs), progress (long-term trends), training_summary (weekly load), sessions (recent log). There is mild overlap between get_progress and get_training_summary since both touch load/efficiency metrics, but descriptions make the split clear enough.
Consistent snake_case verb_noun pattern throughout: get_*, list_sessions, log_session_note, set_race_profile. The get/set pairing for race_profile is predictable and readable.
Nine tools is well-scoped for a hybrid-training coach. Each tool maps to a clear athlete-facing function with no filler.
The surface covers read paths across readiness, plan, progress, summaries and sessions, plus write paths for notes and race profile. Minor gaps: no explicit update/delete for logged session notes, and no way to remove or edit a race profile beyond overwrite-by-set.
Maintenance
Related MCP Connectors
Running coach: your AI reads your runs and recovery, and writes sessions to your watch or phone.
Your AI writes training plans that arrive as structured workouts on iPhone and Apple Watch.
AI coach for Garmin: builds training plans and structured workouts, synced straight to your watch.
Your Garmin, Oura, WHOOP, Hevy and 35 more fitness apps, queryable from your own AI.
Related MCP Servers
- AlicenseBqualityCmaintenanceTurns any AI assistant into a physiological AI running coach by abstracting fitness APIs and exposing 70+ structured analytical MCP tools based on endurance models.21MIT
- FlicenseNot gradedqualityAmaintenanceGrants AI assistants read-only access to your WHOOP recovery, sleep, HRV, strain, and workout history so you can ask natural-language questions about daily readiness, personal baselines, sleep debt, trends, and weekly reviews. It also rebuilds HYROX and triathlon sessions, tracks race load and readiness, and runs a local dashboard for auditing and correcting performance data.12 npm-
- AlicenseNot gradedqualityAmaintenanceEnables Claude, Codex, and GitHub Copilot to answer natural-language questions about WHOOP recovery, sleep, HRV, strain, and workouts using read-only access to personal health history, baselines, trends, and sleep debt. Also rebuilds HYROX and triathlon sessions, assesses race readiness, and serves a local performance dashboard.12 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables read-only access to WHOOP recovery, sleep, HRV, strain, workout, and race-performance data so assistants like Claude, Codex, and GitHub Copilot can answer personal health questions, compare trends against personal baselines, and audit HYROX or triathlon training with local, evidence-backed dashboards. Includes aggregate mode, local-only race logging, and verification tools for recomputing claims.12 npmMIT