Skip to main content
Glama

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 garminconnect library, 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

get_readiness

"Should I go hard today?" Readiness score, sleep, HRV, resting HR, last hard session, with a signal and reasons

get_coach_plan

Your wearable's running coach plan (Garmin Coach): phase, today's run and the week ahead with targets

get_progress

"Am I improving?" VO2 max, predicted 5k/10k/half, endurance score, hill score, lactate threshold, aerobic efficiency, running load vs tolerance, station progress

get_training_summary

Week-by-week runs, classes, load, load balance and acute:chronic ratio

list_sessions

Recent sessions and whether station notes were logged

get_data_source

Which wearable is connected and what it can supply

log_session_note

Saves what your watch can't see (sled weights, wall-ball sets, how it felt). Local only

set_race_profile / get_race_profile

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 (export.xml), parsed offline. Optional automatic sync with an iOS export app

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

  1. Create src/hyrox_coach/providers/<name>/ with a provider that implements Provider (base.py) and maps the source's data into the models in models.py. Declare its Capabilities honestly.

  2. Add a GUIDE.md with the required sections (see the Garmin guide as a model). A test fails if a provider has no guide or is missing a section.

  3. Register it in providers/init.py.

  4. 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 login

Check what your watch and account provide:

.venv/bin/hyrox-coach doctor

If 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-mcp

Copy 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.xml import, plus optional automatic sync from an iOS export app

  • Estimated 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 classes

  • get_week_plan: running plan plus classes on one calendar, with clash warnings

  • get_race_outlook / build_race_plan: projected finish, weakest areas, per-run pacing, taper

Install and sharing

  • hyrox-coach setup wizard (pick a source, connect it, check it)

  • One-click Claude Desktop install (.mcpb bundle) and uvx install from PyPI

  • Listing 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 tools
get_coach_planB
Read-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.

NameRequiredDescriptionDefault
days_aheadNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_sourceA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_progressA
Read-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.

NameRequiredDescriptionDefault
weeksNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_profileC
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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_readinessA
Read-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.

NameRequiredDescriptionDefault
dayNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_summaryB
Read-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.

NameRequiredDescriptionDefault
weeksNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_sessionsB
Read-only

Recent sessions, newest first. kind filters to 'run', 'hybrid' (HIIT/classes/strength) or 'other'. has_note shows whether station details were logged.

NameRequiredDescriptionDefault
daysNo
kindNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
dayNo
textYes
stationsNo
activity_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
goalNo
divisionNo
locationNo
race_dateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 9 tool updatesv0.2.0
    • First observedget_coach_plan
    • First observedget_data_source
    • First observedget_progress
    • First observedget_race_profile
    • First observedget_readiness
    • First observedget_training_summary
    • First observedlist_sessions
    • First observedlog_session_note
    • First observedset_race_profile

TDQS

A3.7/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

Nine tools is well-scoped for a hybrid-training coach. Each tool maps to a clear athlete-facing function with no filler.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Grants 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 npm
    MIT