NexRex
Server Details
Running training and coaching: activities, plans, recovery, rosters and plan drafts.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- NexRex
TDQS
Scored across 33 tools
Most tools have sharply distinct purposes and the descriptions actively disambiguate the close pairs (get_athlete_profile vs get_account_summary vs get_training_status; get_activities vs get_week_workouts; propose_workout_adjustment vs propose_plan_revision). The main soft spots are the cluster of roster/identity reads (find_athlete, get_coach_athletes, get_current_user, get_team_overview) and the several group reads (get_group_info, get_group_plan, list_group_plans), plus get_training_plan overlapping get_week_workouts for planned-workout reads, but the cross-references make selection feasible.
Nearly every tool is a clean snake_case verb_noun pair: get_*, list_*, create_*, edit_*, move_*, add_*, rescale_*, save_*, propose_*, approve_*, reject_*, assign_*, enroll_*, analyze_*, recommend_*. The only mild deviations (find_athlete instead of get_athlete) still follow a readable verb-first convention, and the draft-edit family is consistently suffixed with _draft_workout/_draft_week.
33 tools is heavy and above the comfortable band, though the domain is genuinely broad (identity, athlete analytics, plan reads, draft authoring, revision review, group management, enrollment). Several closely related draft mutations (edit_draft_workout, move_draft_workout, add_draft_test_race, rescale_draft_week) and the multiple coach/group read variants could be consolidated, so the surface feels padded rather than minimized.
Coverage is strong across the full lifecycle: draft creation, polling, editing, saving, catalog recommendation, enrollment, group template assignment, and a propose/approve/reject/list revision pipeline for live plans. Gaps remain around teardown and lookup: no unenroll/delete of an existing plan instance, no way to cancel or discard a draft, and no race catalog search (only get_race_info by id), which agents must work around.
Available Tools
33 toolsadd_draft_test_raceAdd a draft test raceADestructiveIdempotentInspect
Place a tune-up / test race on a day of the cached plan draft (defaults to a half-marathon), replacing whatever was scheduled there. Draft-only: changes the cached preview and nothing the athlete sees. Returns the refreshed plan; content_preview holds whole weeks from the first changed week and next_cursor continues in get_plan_draft. Only the account that created the draft can edit it.
Inputs: day (required), week (required), draft_id (required), athlete_id (required), +2 more. Returns: goal, draft, error, level, +44 more
analyze_performanceAnalyze performanceARead-onlyIdempotentInspect
Compute running performance from recorded activities with fixed rules (no AI): a metric such as 5K best time, tempo or Zone 2 average pace, long-run distance or interval count, over the last period_days and the window before it, for the connected account, one athlete or a group. Group scope ranks members and supports most-improved or top-K questions through trend_filter, sort_by and top_k. A coach with one group may omit group_id; with several, the result has status needs_group_choice with the group names and ids. Names in athlete_names that match no one or several members are reported while the rest are analysed.
Inputs: zone, scope, top_k, measure, +19 more. Returns: error, scope, groups, metric, +27 more
approve_plan_revisionApprove and apply a plan revisionADestructiveIdempotentInspect
Approve a pending plan revision and apply it, once the coach has reviewed its operations. Side effects: every operation is applied in order to the live plan, so the changed workouts appear on the athlete's calendar (for a group plan, on every member's); no push notification is sent. Returns per-operation results with status 'applied', or 'partially_applied' when an operation failed, including a group change whose member cascade could not be delivered; operations after a failure are skipped and never retried automatically. Approving a revision that is no longer pending changes nothing.
Inputs: revision_id (required). Returns: One plan revision with its operations and their results.
assign_group_planAssign a group training planADestructiveIdempotentInspect
Assign a saved Group Plan Template to a group, once the coach has confirmed the template, start date and member assignments. Side effects: creates a group plan, schedules its workouts on the calendar of every assigned member (by default every current member) and queues a Garmin workout sync for members with Garmin connected; members get no push notification. Needs a coach role and the group-training-plan feature. The result gives one enrollment outcome per member (accepted, refused with reason_code, unknown or not_attempted) and a create_command_id. Repeating the call with the same arguments or that create_command_id resumes the same group plan instead of creating a second one, so a retry after a timeout is safe.
Inputs: group_id (required), start_date (required), training_plan_id (required), plan_name, +3 more. Returns: name, error, status, created, +29 more
create_training_planDraft a training planAInspect
Draft a goal-based training plan from recent status and a race goal. Use it when no catalog plan fits (recommend_training_plans reports no_good_match) or a coach wants a custom plan. The caller's own athlete_id comes from get_current_user; the caller need not be in a coach roster. Draft-only: writes a cached draft, never the athlete's calendar, and uses one of the caller's daily draft allowances when generation starts. Returns promptly with queued/generating status; get_plan_draft polls progress and ready content. An uncharged allowance_limited result gives retry_at for the same handle. Identical inputs on this connection reuse an active/ready job until consumed or expired; terminal failure permits a new job and a new charge. Returns a draft_id for draft edits and save_training_plan (single-use, expires in 24h, usable only by this account); content_preview holds the first weeks and next_cursor continues in get_plan_draft. Pass exactly one of athlete_id or group_id; group_id drafts a Group Plan Template (saved with save_training_plan save_mode='template_only') from distance, weeks and target_time; race_id and race_date are ignored for groups. workout_preference reflects the coach's choice: 'ai_generate' (default) creates workouts, 'prefer_existing' reuses the org's workout library where it can, 'strict_existing' uses only library workouts and returns status no_existing_workouts when none match.
Inputs: level, weeks, race_id, distance, +7 more. Returns: goal, draft, error, level, +44 more
edit_draft_workoutEdit a draft workoutADestructiveIdempotentInspect
Edit one calendar day's session in the cached plan draft: change workout_sub_type, target_distance_km, target_pace_seconds_per_km, or coach_note; pass make_rest=true to clear the day to a rest day; editing an empty day creates a session. Draft-only: changes the cached preview and nothing the athlete sees. Returns the refreshed plan; content_preview holds whole weeks from the first changed week and next_cursor continues in get_plan_draft. Only the account that created the draft can edit it.
Inputs: day (required), week (required), draft_id (required), athlete_id (required), +5 more. Returns: goal, draft, error, level, +44 more
enroll_training_planEnroll in a catalog training planADestructiveIdempotentInspect
Enroll an athlete in an existing catalog training plan, once the athlete has confirmed the plan and start date. Side effects: every workout is scheduled on the athlete's calendar from start_date, the plan becomes their primary plan, a Garmin workout sync is queued when the athlete has Garmin connected, and when a coach enrolls an athlete the athlete gets an in-app notification. Repeating it changes nothing: an existing enrollment returns its plan_instance_id with already_enrolled=true.
Inputs: athlete_id (required), start_date (required), training_plan_id (required), long_run_preference, +1 more. Returns: error, status, message, privacy, +16 more
find_athleteFind an athleteARead-onlyIdempotentInspect
Look up athletes in the coach's organization by display name (partial match) or exact email. Returns matches with user_id, name and group names, to resolve a name before athlete tools or to answer which group an athlete is in; total_matches and truncated state any cap. Needs a coach role. No match means not in this roster, not that no account exists. get_current_user identifies the connected account.
Inputs: query (required). Returns: error, org_id, status, matches, +18 more
get_account_summaryAccount summaryARead-onlyIdempotentInspect
Get an athlete's racing record: saved personal bests per distance, race goals, completed race count with recent race results, lifetime training totals and profile basics. Use it for history questions (best 10K, races run this year, lifetime distance); get_athlete_profile covers current fitness, zones and active plans. Recent race results are completed activities, not catalog races, so get_race_info does not take their ids.
Inputs: athlete_id (required). Returns: Personal bests, goals, race history, lifetime stats and profile basics.
get_activitiesRecent activitiesARead-onlyIdempotentInspect
Get an athlete's activities from the last days, newest first: completed activities with their measurements (distance, duration, pace, heart rate, effort) and scheduled or skipped plan workouts. Use it for what the athlete did; get_week_workouts gives one calendar week of the plan for compliance. Filters by type, subtype and status. Returns up to limit rows, fewer when the page reaches the response size bound; next_cursor reads the next page with the same filters. Route maps and media are omitted, and a coach sees only what the athlete shares. Strength rows carry session_kg_loads in kilograms.
Inputs: athlete_id (required), days, limit, cursor, +3 more. Returns: error, status, filters, message, +15 more
get_athlete_profileAthlete profileARead-onlyIdempotentInspect
Get an athlete's current coaching profile: identity basics, race goals and monthly distance target, heart-rate and pace zones, personal bests, current fitness (CTL = chronic training load or fitness, ATL = acute load or fatigue, TSB = form, CTL minus ATL), health readings (null when never recorded), training volume, active plans and recent completed activities. Use it to coach from the athlete's present state; get_account_summary covers race history and lifetime totals, get_training_status load and readiness, and get_activities activity detail. Only fields the athlete shares with a coach are returned to that coach.
Inputs: athlete_id (required). Returns: error, status, message, privacy, +13 more
get_coach_athletesCoach athlete rosterARead-onlyIdempotentInspect
Get the coach's athlete roster, one row per athlete with basic info and attention flags, up to limit per page. Use it to pick or page through athletes; get_team_overview gives per-group totals and get_coach_weekly_report the stored report of a completed week. Flagged athletes come first, most severe first; total, needing_attention, urgent_count and watchlist_count cover the whole roster, and next_cursor reads the next page. Flags reflect plan compliance and absence, not physiological fatigue. Needs a coach or admin role. The coach may not be in this roster; get_current_user identifies the connected account.
Inputs: limit, cursor. Returns: count, error, total, org_id, +29 more
get_coach_weekly_reportCoach weekly reportARead-onlyIdempotentInspect
Read the coach's stored weekly report for a completed week: team stats, flagged buckets with per-athlete reasons and a compact roster, cut to the athletes the coach still coaches and what they share. available: false with a reason means no report exists for that week or reports are not enabled for this coach; get_coach_athletes and get_team_overview give live data.
Inputs: weeks_ago. Returns: error, stats, header, reason, +25 more
get_current_userCurrent NexRex accountARead-onlyIdempotentInspect
Identify the connected NexRex account: user_id, athlete_id, connection email, display name, roles and org_id. Takes no arguments and needs no coach role. Use it for 'who am I logged in as?' and before reading the account's own training: its athlete_id is the id athlete and plan tools take. A coach may not appear in their own athlete roster, so a roster miss says nothing about this account. org_id is the connection's organization context, not every membership; email is null when the connection supplied none.
Inputs: no named parameters. Returns: email, error, roles, org_id, +18 more
get_group_infoGroup detailsARead-onlyIdempotentInspect
Get a group's details and member ids, up to 200 ids per page; member_count covers the whole group and next_cursor reads the next page. list_group_plans lists the group's plans.
Inputs: group_id (required), cursor. Returns: error, group, status, members, +17 more
get_group_planGroup training planARead-onlyIdempotentInspect
Get one group plan: its summary and compact workout rows (workout_id, week, day, targets), the ids propose_plan_revision(scope='group') takes. Rows come in whole weeks up to a response-size page; next_cursor reads the following weeks.
Inputs: group_plan_instance_id (required), cursor. Returns: One group plan instance with a page of whole weeks of workouts.
get_nutrition_logNutrition logARead-onlyIdempotentInspect
Get an athlete's logged nutrition (Food Journey) over the last days: daily calorie and macro totals against targets, a day-by-day join of fueling with training and its rule-based flags (for example an under-fueled long-run day), and recent logged foods. Status no_data means nothing was logged in the window. A coach sees it only when the athlete shares training data.
Inputs: athlete_id (required), days. Returns: error, status, message, privacy, +24 more
get_plan_draftPlan draftARead-onlyIdempotentInspect
Poll a draft job created by this account and connection: queued/generating, allowance_limited with retry_at, failed or ready (pending draft) with goal, level, recommended start date, expiry, per-week summaries for the whole plan, and the workouts of whole weeks up to a response-size page; next_cursor from a draft result reads the following weeks. Read-only; drafts expire 24 hours after reservation and become unavailable once saved. A poll resumes an expired execution lease; after process loss progress may wait for the next poll. Only ready drafts can be edited or saved.
Inputs: draft_id (required), athlete_id (required), cursor. Returns: goal, draft, error, level, +47 more
get_race_infoRace detailsARead-onlyIdempotentInspect
Look up one race in the NexRex race catalog by its catalog race_id: name, date and timezone, type, distance and course format. Use it for details of an athlete's goal race before planning around it. Races an athlete has already run (get_account_summary race history) are results, not catalog entries; their name, date, distance and finish time are in that history.
Inputs: race_id (required). Returns: race, error, status, message, +14 more
get_race_predictionRace predictionARead-onlyIdempotentInspect
Predict an athlete's finish times for 5K, 10K, half marathon and marathon from their best recent race result, using VDOT (a running-fitness index derived from race performances). Returns the VDOT, the reference race it came from and one prediction per distance with a confidence: high when the VDOT and Riegel estimates agree within 5%, otherwise medium. Only road-running results at 5K to marathon count; without one the call fails with no prediction. A coach sees it only when the athlete shares training and pace data.
Inputs: athlete_id (required). Returns: vdot, error, status, message, +15 more
get_team_overviewTeam overviewARead-onlyIdempotentInspect
Get the current state of the coach's organization in one call: total athletes, each group with its group_id (used by get_group_info, list_group_plans and the other group tools) and member count, how many athletes need attention, and those athletes' flags and suggested actions. Use get_coach_athletes for the full per-athlete roster and get_coach_weekly_report for a completed week's report. Needs a coach or admin role.
Inputs: no named parameters. Returns: atl, ctl, tsb, date, +24 more
get_training_planTraining planARead-onlyIdempotentInspect
Without plan_id, list an athlete's training plans (summaries, optionally by status). With plan_id, read that plan's workouts with full prescriptions and the activities that completed them, in whole weeks up to a response-size page; next_cursor reads the following weeks. Strength workouts carry session_kg_loads in kilograms.
Inputs: athlete_id (required), cursor, status, plan_id. Returns: plan, count, error, plans, +16 more
get_training_statusTraining and recovery statusARead-onlyIdempotentInspect
Get an athlete's current load, readiness and injury-risk picture: CTL (fitness, 42-day training load), ATL (fatigue, 7-day load) and TSB (form, CTL minus ATL), fitness, fatigue and recovery scores, readiness with reason codes, the daily training status, 7- and 30-day rolling load and recovery metrics, the fitness trend and active plans. get_athlete_profile gives goals, zones and personal bests.
Inputs: athlete_id (required). Returns: as_of, error, status, message, +16 more
get_week_workoutsWeekly workoutsARead-onlyIdempotentInspect
Get the planned workouts of one calendar week (Monday to Sunday) from an athlete's active plan, with completion status, to check plan compliance or answer what is on the schedule. Use get_activities for what the athlete actually recorded over a longer window. When the athlete has several active plans and none is named, the result has status needs_plan_choice with active_plans.
Inputs: athlete_id (required), week_offset, week_start_date, plan_instance_id. Returns: count, error, reason, status, +26 more
list_group_plansGroup plan instancesARead-onlyIdempotentInspect
List a group's plans (group_plan_instance_id, name, template training_plan_id, start date, weeks, status, member and sub-group counts). get_group_plan reads one and propose_plan_revision(scope='group') changes it.
Inputs: group_id (required), status. Returns: count, error, status, message, +15 more
list_plan_revisionsList plan revisionsARead-onlyIdempotentInspect
List the coach's plan revisions with one status (default review_pending), newest first, up to limit per page. total counts every match and next_cursor reads the next page.
Inputs: limit, cursor, status. Returns: count, error, total, status, +15 more
move_draft_workoutMove a draft workoutADestructiveInspect
Move everything scheduled on one day of the cached plan draft to another day; if the destination day is occupied the two days swap. Draft-only: changes the cached preview and nothing the athlete sees. Returns the refreshed plan; content_preview holds whole weeks from the first changed week and next_cursor continues in get_plan_draft. Only the account that created the draft can edit it.
Inputs: to_day (required), to_week (required), draft_id (required), from_day (required), +2 more. Returns: goal, draft, error, level, +44 more
propose_plan_revisionPropose a plan revisionAIdempotentInspect
Propose a changeset of several workouts or weeks against one training plan, for example rebuilding a week or shifting a block. For a single workout whose load should change, propose_workout_adjustment fits. Nothing changes until approve_plan_revision applies it; group changes then reach every member.
scope='athlete' (plan_instance_id + athlete_id) — each operation is one of:
{op:'adjust', workout_id, changes:{...}} — changes allows: workout_name, status ('scheduled' or 'skipped' only), workout_type, workout_sub_type, day, target_distance_in_meters, target_duration_in_seconds, target_pace, target_pace_zone, target_complete_date, content_blocks. Applied like a calendar edit: a new target_complete_date moves the session and its week.
{op:'add', workout:{...}, target_complete_date} — workout requires workout_name and allows: workout_type, workout_sub_type, day, target_distance_in_meters, target_duration_in_seconds, target_pace, target_pace_zone, content_blocks. target_complete_date sits at the OPERATION level, not inside workout.
{op:'remove', workout_id}
scope='group' (plan_instance_id = group plan instance id; coach role and the group-training-plan feature required) also supports {op:'reschedule', workout_id, new_week, new_day}; group add requires workout_name, week (or week_number), day inside workout. Group adjust changes allows: workout_name, workout_description, workout_description_cards, workout_type, workout_sub_type, target_distance_in_meters, target_duration_in_seconds, content_blocks, session, is_group_workout, group_content, target_pace_zone, target_pace, day, attendance_enabled, attendance_rule, live_session_enabled, entry_kind, icon, clear_content_blocks (other keys are rejected).
Strength sessions: a strength workout with a structured session (sets, exercises, loads) derives its duration from that session and cannot carry content_blocks; to change its volume, edit the session in the workout editor (athlete adjust rejects a different target_duration_in_seconds). Changing workout_type away from strength drops the session.
Rules: target_complete_date is an epoch-SECONDS integer (milliseconds are accepted and auto-converted). An athlete workout does not accept week or status: week is derived from target_complete_date and status is system-managed. Completed workouts cannot be adjusted, moved or removed. An athlete with a coach may propose, but their coach approves. Re-proposing an already applied changeset is refused, and re-proposing a pending one returns the same revision. Example athlete add: {op:'add', workout:{workout_name:'Easy Run', workout_type:'run', target_distance_in_meters:6000, target_pace_zone:'Z1'}, target_complete_date:1781568000}. Workout reads return content_blocks as rows whose columns content_block_fields names (an interval's blocks column holds its nested steps as rows in the same columns), and a session shared by several rows as session_ref into session_definitions. As arguments, content_blocks is a list of block objects and session a session object.
Inputs: scope (required), reason (required), operations (required), plan_instance_id (required), +2 more. Returns: One plan revision with its operations and their results.
propose_workout_adjustmentPropose a workout adjustmentAIdempotentInspect
Propose a change to one scheduled workout's load (lighter, rest, an easy rebuild) for review. For changes across several workouts or weeks, propose_plan_revision fits. Propose-only: it records a review_pending adjustment and changes no plan until a reviewer approves it in NexRex. A coach's proposal goes to that coach's review queue; an athlete's proposal for themself goes to their assigned coach, or, with no coach, to the athlete's own pending adjustments. plan_instance_id must be one of the athlete's own plans. A strength workout with a structured session takes its duration from that session, so its target_duration_in_seconds is not adjustable. A repeated proposal for the same workout returns status deduped. Workout reads return content_blocks as rows whose columns content_block_fields names (an interval's blocks column holds its nested steps as rows in the same columns), and a session shared by several rows as session_ref into session_definitions. As arguments, content_blocks is a list of block objects and session a session object.
Inputs: reason (required), changes (required), athlete_id (required), workout_id (required), +5 more. Returns: error, reason, status, message, +25 more
recommend_training_plansRecommend catalog training plansARead-onlyIdempotentInspect
Rank existing NexRex catalog training plans for an athlete. Read-only and rule-based: matches each plan's distance, goal, length, weekly volume, level and days per week against the athlete's recent training, race prediction and primary race, and holds back every plan when injury or recovery signals say not to push. Returns candidates with reason_codes, reasons and gaps, missing_inputs that would sharpen the match, health_hold, and no_good_match when no catalog plan fits (create_training_plan drafts a custom plan).
Inputs: athlete_id (required), goal, top_k, distance, +3 more. Returns: error, status, message, privacy, +20 more
reject_plan_revisionReject a plan revisionADestructiveIdempotentInspect
Reject a pending plan revision when the coach decides against it. Nothing on any calendar changes and no one is notified; feedback is stored with the revision. Rejecting a revision that is no longer pending changes nothing.
Inputs: revision_id (required), feedback. Returns: One plan revision with its operations and their results.
rescale_draft_weekRescale a draft weekADestructiveInspect
Scale one week's total training volume in the cached plan draft, either to an absolute target_km or by percent_change (e.g. -15 for 15% lighter). Race entries stay fixed. Draft-only: changes the cached preview and nothing the athlete sees. Returns the refreshed plan; content_preview holds whole weeks from the first changed week and next_cursor continues in get_plan_draft. Only the account that created the draft can edit it.
Inputs: week (required), draft_id (required), athlete_id (required), target_km, +1 more. Returns: goal, draft, error, level, +44 more
save_training_planSave and assign a training planADestructiveIdempotentInspect
Save a previewed plan draft, once the coach or athlete has confirmed it. Side effects with save_mode='save_and_assign' (default, athletes only): every workout of the draft is scheduled on the athlete's calendar, the plan becomes their primary plan, a Garmin workout sync is queued when the athlete has Garmin connected, and when a coach saves for an athlete the athlete gets an in-app notification. save_mode='template_only' saves a Training Plan Template and changes no calendar; it is the only mode for group drafts, whose template assign_group_plan then assigns. Pass exactly one of athlete_id or group_id. A draft is single-use, expires 24 hours after drafting and only the account that drafted it can save it, so a repeated save changes nothing. previous_primary_plan, when present, is the earlier primary plan, which stays active but demoted; overlapping_workouts counts its upcoming workouts on days the new plan also schedules.
Inputs: draft_id (required), group_id, plan_name, save_mode, +4 more. Returns: error, weeks, status, message, +24 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Running coach: your AI reads your runs and recovery, and writes sessions to your watch or phone.
Running, trail and triathlon coach. Reads Strava, Garmin, COROS, Suunto, Polar. Adapts to your feel.
Your swim, run and ride training, explained. For coaches and athletes, computed from Garmin data.
Adaptive running coach MCP server — training data, plans, and recovery for AI assistants.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables reading Garmin sleep, HRV, resting heart rate, load, and activity data; maintaining a versioned training contract in D1; and writing structured workouts to a Garmin watch. It also supports protected injury rules and a training diary for symptoms and pain.PolyForm Noncommercial 1.0.0
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to create and manage multi-week running training plans, track workouts and activities, and pull calendar or CSV exports through the app's API. Supports plan generation with configurable goals, mileage, schedule, and intensity, plus updating workout status and recording completed runs.MIT
- AlicenseAqualityCmaintenanceTurns your own wearable data into coaching for hybrid fitness races by exposing readiness, running coach plans, fitness trends and training summaries as tools an agent can query. Keeps your data read-only at the provider and lets you log the station work and race profile your watch can't see in a local database.91MIT
- 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
Glama MCP Gateway
Add one secure layer between your agents and this server.