Zero-LLM-Math sports science calculators (Hyrox, 1RM/RPE, Zone 2, MEV/MRV) & workout ledger.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional for all 7 public science calculators; Bearer stg_ath_... token from https://struggl.singandclap.com/connect for personal ledger sync
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Audit this week's effective hard sets across 17 muscle groups (1.0x prime mover, 0.5x synergist, RPE >= 6 gating) against evidence-based MEV / MAV / MRV weekly volume landmarks.
This tool takes no arguments.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http struggl https://struggl.singandclap.com/mcp
Headers
Authorization (optional, not in the config above): Optional for all 7 public science calculators; Bearer stg_ath_... token from https://struggl.singandclap.com/connect for personal ledger syncAudit this week's effective hard sets across 17 muscle groups (1.0x prime mover, 0.5x synergist, RPE >= 6 gating) against evidence-based MEV / MAV / MRV weekly volume landmarks.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Read the authenticated athlete's biometric profile (bodyweight, height, sex, primary modality, training phase, weekly time budget) and upcoming race goals. Requires Bearer token.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the athlete's completed and planned training sessions over the last `days` days (1–90, default 14) or on a specific `date` (YYYY-MM-DD). Call before prescribing today's workout.
| Argument | Type | Description |
|---|---|---|
| date | string | Optional single calendar date (YYYY-MM-DD). |
| days | integer | Rolling window in days (1–90). Ignored if `date` is provided. |
{
"type": "object",
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Optional single calendar date (YYYY-MM-DD)."
},
"days": {
"type": "integer",
"default": 14,
"maximum": 90,
"minimum": 1,
"description": "Rolling window in days (1–90). Ignored if `date` is provided."
}
},
"additionalProperties": false
}Public calculator (NO token needed): post-race or simulation Hyrox diagnostic — compares actual 8x1 km run splits and 8 functional station times against empirical compromised pacing targets and P25-P75 station variance benchmarks to pinpoint exact time leaks.
| Argument | Type | Description |
|---|---|---|
| run_times | array | Optional 8 actual 1 km run splits as MM:SS strings. |
| station_times | object | Optional station split times (MM:SS) keyed by station name (e.g. skierg, sled_push, sled_pull, burpees, row, farmers_carry, lunges, wall_balls). |
| total_run_time | string | Optional total 8 km running time as MM:SS or H:MM:SS if individual splits are unavailable. |
| actual_finish_time | string | Optional official finish time as H:MM:SS. |
| standalone_5k_time* | string | Standalone open 5 km time as MM:SS (e.g. '22:30'). |
{
"type": "object",
"required": [
"standalone_5k_time"
],
"properties": {
"run_times": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 8,
"minItems": 8,
"description": "Optional 8 actual 1 km run splits as MM:SS strings."
},
"station_times": {
"type": "object",
"description": "Optional station split times (MM:SS) keyed by station name (e.g. skierg, sled_push, sled_pull, burpees, row, farmers_carry, lunges, wall_balls).",
"additionalProperties": {
"type": "string"
}
},
"total_run_time": {
"type": "string",
"description": "Optional total 8 km running time as MM:SS or H:MM:SS if individual splits are unavailable."
},
"actual_finish_time": {
"type": "string",
"description": "Optional official finish time as H:MM:SS."
},
"standalone_5k_time": {
"type": "string",
"description": "Standalone open 5 km time as MM:SS (e.g. '22:30')."
}
},
"additionalProperties": false
}Public calculator (NO token needed): compute Hyrox 8x1 km compromised run splits, target pace band, estimated total race time, and Riegel 10k/Half/Marathon predictions from a 5 km time.
| Argument | Type | Description |
|---|---|---|
| goal | string | Optional target Hyrox finish time as H:MM:SS (e.g. '1:15:00'). |
| five_k* | string | Standalone 5 km time as MM:SS (e.g. '21:30'). |
{
"type": "object",
"required": [
"five_k"
],
"properties": {
"goal": {
"type": "string",
"description": "Optional target Hyrox finish time as H:MM:SS (e.g. '1:15:00')."
},
"five_k": {
"type": "string",
"description": "Standalone 5 km time as MM:SS (e.g. '21:30')."
}
},
"additionalProperties": false
}Public calculator (NO token needed): compute all 8 compromised Hyrox 1 km lap splits (with preceding station fatigue multipliers, Pro/Doubles offsets, and Lap 1 overpacing blow-up cost) from a standalone 5K time using STRUGGL's 200,000-finisher decay model.
| Argument | Type | Description |
|---|---|---|
| division | string | |
| goal_time | string | Optional target Hyrox finish time as H:MM:SS (e.g. '1:18:00'). |
| standalone_5k_time* | string | Standalone open 5 km time as MM:SS (e.g. '21:30'). |
| cns_penalty_sec_per_km | integer | Extra sled/CNS peripheral fatigue penalty in seconds per km (0–35). |
{
"type": "object",
"required": [
"standalone_5k_time"
],
"properties": {
"division": {
"enum": [
"open_men",
"open_women",
"pro_men",
"pro_women",
"doubles"
],
"type": "string",
"default": "open_men"
},
"goal_time": {
"type": "string",
"description": "Optional target Hyrox finish time as H:MM:SS (e.g. '1:18:00')."
},
"standalone_5k_time": {
"type": "string",
"description": "Standalone open 5 km time as MM:SS (e.g. '21:30')."
},
"cns_penalty_sec_per_km": {
"type": "integer",
"default": 0,
"maximum": 35,
"minimum": 0,
"description": "Extra sled/CNS peripheral fatigue penalty in seconds per km (0–35)."
}
},
"additionalProperties": false
}Public calculator (NO token needed): audit a weekly hybrid training schedule for AMPK-mTOR concurrent training interference (<3h high / 3-6h moderate window), 36h long-run glycogen depletion before legs, 48h heavy hinge recovery before speed runs, back-to-back quality runs, and Seiler 80/20 polarization.
| Argument | Type | Description |
|---|---|---|
| priority | string | Optional training block priority ('strength' or 'endurance'). |
| sessions* | array | Ordered or unordered weekly strength & endurance sessions. |
{
"type": "object",
"required": [
"sessions"
],
"properties": {
"priority": {
"enum": [
"strength",
"endurance"
],
"type": "string",
"description": "Optional training block priority ('strength' or 'endurance')."
},
"sessions": {
"type": "array",
"items": {
"type": "object",
"required": [
"start",
"type"
],
"properties": {
"id": {
"type": "string"
},
"type": {
"enum": [
"strength",
"endurance"
],
"type": "string"
},
"hinge": {
"type": "boolean",
"default": false
},
"start": {
"type": "string",
"description": "ISO 8601 datetime string (e.g. '2026-10-19T07:00:00')."
},
"max_test": {
"type": "boolean",
"default": false
},
"modality": {
"type": "string",
"default": "run",
"description": "e.g. 'run', 'row', 'bike', 'skierg', 'weights'."
},
"explosive": {
"type": "boolean",
"default": false
},
"intensity": {
"enum": [
"light",
"moderate",
"heavy",
"easy",
"hard"
],
"type": "string",
"default": "moderate"
},
"lower_body": {
"type": "boolean",
"default": false
},
"distance_km": {
"type": "number",
"minimum": 0
},
"duration_min": {
"type": "number",
"default": 60,
"maximum": 600,
"minimum": 1
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1,
"description": "Ordered or unordered weekly strength & endurance sessions."
}
},
"additionalProperties": false
}Record one COMPLETED exercise into the athlete's STRUGGL ledger (with duplicate-write protection, automatic PR tracking, and 17-muscle weekly volume accounting). Call once per exercise.
| Argument | Type | Description |
|---|---|---|
| rpe | number | Session RPE (1–10). When omitted in STRUGGL's stateful ledger, inferred deterministically from the athlete's rolling 30-day e1RM capacity envelope. |
| date | string | Workout date YYYY-MM-DD (defaults to today). |
| reps | integer | |
| sets | integer | |
| comments | string | |
| exercise* | string | Exercise name (e.g. 'Back Squat', 'Zone 2 Run', 'SkiErg Intervals'). |
| weight_kg | number | External load in kg (added load for pull-ups/dips/chin-ups). |
| distance_km | number | |
| duration_min | number | |
| exercise_type | string |
Schedule one PLANNED exercise on the athlete's STRUGGL training calendar for `date` (YYYY-MM-DD). Only schedule when the athlete asks for it; call once per exercise.
| Argument | Type | Description |
|---|---|---|
| rpe | number | Session RPE (1–10). When omitted in STRUGGL's stateful ledger, inferred deterministically from the athlete's rolling 30-day e1RM capacity envelope. |
| date* | string | Target calendar date YYYY-MM-DD. |
| reps | integer | |
| sets | integer | |
| comments | string | |
| exercise* | string | |
| weight_kg | number | |
| distance_km | number | |
| duration_min | number | |
| exercise_type | string |
Public calculator (NO token needed): convert a reference set (weight x reps @ RPE) into piecewise Wathan e1RM, Zourdos RIR/RPE working weight (accounting for bodyweight on pull_up/chin_up/dip), exact gym barbell plate pairs per side, and Tanaka + Karvonen Heart Rate Reserve Zone 2 bpm (eliminating the 16–23 bpm error of 220-Age).
| Argument | Type | Description |
|---|---|---|
| age | integer | |
| sex | string | |
| lift | string | |
| max_hr | integer | Optional measured HRmax (defaults to Tanaka 208 - 0.7 * age). |
| ref_rpe | number | |
| rest_hr | integer | |
| ref_reps | integer | |
| target_rpe | number | |
| target_reps | integer | |
| bar_weight_kg | number |
Public calculator (NO token needed): compute piecewise Wathan e1RM, bodyweight/sex/age-adjusted strength score, tier (untrained -> elite), and kg needed for the next tier from one set.
| Argument | Type | Description |
|---|---|---|
| age | integer | |
| sex* | string | |
| lift* | string | |
| reps* | integer | |
| weight_kg* | number | Load lifted in kg (ADDED load for dip, pull_up, chin_up). |
| bodyweight_kg* | number | Athlete bodyweight in kg (added into total system load for dip, pull_up, chin_up; pulled automatically when signed in to STRUGGL). |
{
"type": "object",
"required": [
"lift",
"weight_kg",
"reps",
"bodyweight_kg",
"sex"
],
"properties": {
"age": {
"type": "integer",
"maximum": 90,
"minimum": 13
},
"sex": {
"enum": [
"male",
"female"
],
"type": "string"
},
"lift": {
"enum": [
"back_squat",
"front_squat",
"deadlift",
"sumo_deadlift",
"bench_press",
"incline_bench_press",
"dip",
"overhead_press",
"pull_up",
"chin_up",
"barbell_row"
],
"type": "string"
},
"reps": {
"type": "integer",
"maximum": 20,
"minimum": 1
},
"weight_kg": {
"type": "number",
"maximum": 500,
"minimum": 0,
"description": "Load lifted in kg (ADDED load for dip, pull_up, chin_up)."
},
"bodyweight_kg": {
"type": "number",
"maximum": 200,
"minimum": 35,
"description": "Athlete bodyweight in kg (added into total system load for dip, pull_up, chin_up; pulled automatically when signed in to STRUGGL)."
}
},
"additionalProperties": false
}Public calculator (NO token needed): audit a weekly lifting split across all 17 muscle groups using fractional set accounting (1.0x primary mover, 0.5x secondary synergist, RPE >= 6 hard-set filter) against Schoenfeld & Pelland MEV / MAV / MRV landmarks.
| Argument | Type | Description |
|---|---|---|
| entries* | array | Weekly movement entries mapped to curated biomechanics archetypes. |
{
"type": "object",
"required": [
"entries"
],
"properties": {
"entries": {
"type": "array",
"items": {
"type": "object",
"required": [
"archetype",
"sets"
],
"properties": {
"rpe": {
"type": "number",
"default": 8,
"maximum": 10,
"minimum": 5,
"description": "Average set RPE (sets < RPE 6.0 are filtered out as warm-ups)."
},
"sets": {
"type": "integer",
"maximum": 60,
"minimum": 0,
"description": "Total weekly sets for this movement."
},
"archetype": {
"enum": [
"horizontal_press",
"incline_press",
"chest_fly",
"vertical_press",
"lateral_raise",
"vertical_pull",
"horizontal_row",
"shrug_carry",
"biceps_curl",
"triceps_extension",
"squat_lunge",
"hip_hinge",
"leg_isolation",
"hip_abduction_adduction",
"calves",
"core_abs",
"neck_work"
],
"type": "string",
"description": "Curated biomechanics movement archetype key."
},
"frequency_days": {
"type": "integer",
"default": 2,
"maximum": 7,
"minimum": 1,
"description": "Days per week this movement is trained."
}
},
"additionalProperties": false
},
"maxItems": 25,
"minItems": 1,
"description": "Weekly movement entries mapped to curated biomechanics archetypes."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
{
"type": "object",
"required": [
"exercise"
],
"properties": {
"rpe": {
"type": "number",
"maximum": 10,
"minimum": 1,
"description": "Session RPE (1–10). When omitted in STRUGGL's stateful ledger, inferred deterministically from the athlete's rolling 30-day e1RM capacity envelope."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Workout date YYYY-MM-DD (defaults to today)."
},
"reps": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"sets": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"comments": {
"type": "string",
"maxLength": 500
},
"exercise": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Exercise name (e.g. 'Back Squat', 'Zone 2 Run', 'SkiErg Intervals')."
},
"weight_kg": {
"type": "number",
"maximum": 500,
"minimum": 0,
"description": "External load in kg (added load for pull-ups/dips/chin-ups)."
},
"distance_km": {
"type": "number",
"maximum": 500,
"exclusiveMinimum": 0
},
"duration_min": {
"type": "number",
"maximum": 1440,
"exclusiveMinimum": 0
},
"exercise_type": {
"enum": [
"strength",
"endurance",
"mobility",
"other"
],
"type": "string",
"default": "strength"
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"exercise",
"date"
],
"properties": {
"rpe": {
"type": "number",
"maximum": 10,
"minimum": 1,
"description": "Session RPE (1–10). When omitted in STRUGGL's stateful ledger, inferred deterministically from the athlete's rolling 30-day e1RM capacity envelope."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Target calendar date YYYY-MM-DD."
},
"reps": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"sets": {
"type": "integer",
"maximum": 50,
"minimum": 1
},
"comments": {
"type": "string",
"maxLength": 500
},
"exercise": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"weight_kg": {
"type": "number",
"maximum": 500,
"minimum": 0
},
"distance_km": {
"type": "number",
"maximum": 500,
"exclusiveMinimum": 0
},
"duration_min": {
"type": "number",
"maximum": 1440,
"exclusiveMinimum": 0
},
"exercise_type": {
"enum": [
"strength",
"endurance",
"mobility",
"other"
],
"type": "string",
"default": "strength"
}
},
"additionalProperties": false
}| bodyweight_kg | number |
| ref_weight_kg | number | Reference set load in kg (ADDED belt load for pull_up, chin_up, dip). |
{
"type": "object",
"properties": {
"age": {
"type": "integer",
"default": 30,
"maximum": 90,
"minimum": 14
},
"sex": {
"enum": [
"male",
"female"
],
"type": "string",
"default": "male"
},
"lift": {
"enum": [
"back_squat",
"front_squat",
"deadlift",
"sumo_deadlift",
"bench_press",
"incline_bench_press",
"dip",
"overhead_press",
"pull_up",
"chin_up",
"barbell_row"
],
"type": "string",
"default": "bench_press"
},
"max_hr": {
"type": "integer",
"maximum": 230,
"minimum": 130,
"description": "Optional measured HRmax (defaults to Tanaka 208 - 0.7 * age)."
},
"ref_rpe": {
"type": "number",
"default": 8.5,
"maximum": 10,
"minimum": 5
},
"rest_hr": {
"type": "integer",
"default": 52,
"maximum": 110,
"minimum": 32
},
"ref_reps": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1
},
"target_rpe": {
"type": "number",
"default": 8,
"maximum": 10,
"minimum": 5
},
"target_reps": {
"type": "integer",
"default": 8,
"maximum": 20,
"minimum": 1
},
"bar_weight_kg": {
"type": "number",
"default": 20,
"maximum": 25,
"minimum": 10
},
"bodyweight_kg": {
"type": "number",
"default": 78,
"exclusiveMaximum": 220,
"exclusiveMinimum": 35
},
"ref_weight_kg": {
"type": "number",
"default": 100,
"maximum": 500,
"minimum": 0,
"description": "Reference set load in kg (ADDED belt load for pull_up, chin_up, dip)."
}
},
"additionalProperties": false
}