Skip to main content
Glama

update_athlete_profile

Destructive

Edit the athlete's profile — FTP (watts), running threshold pace, max/threshold HR, power/pace/HR zone boundaries, AND the about-you fields (birthdate, sex, heightCm, weightKg, weeklyHours, availableDays 0=Mon..6=Sun, experience). Every field is OPTIONAL: pass only what changes; everything else is preserved (safe partial update). Confirm new numbers with the athlete before writing (a changed FTP/weight moves every target). To set custom zones pass a sport's zoneBounds (5 strictly-ascending upper bounds) — that flips it to Manual; pass autoZones:true to revert. Same for hrZoneBounds/autoHrZones. Setting birthdate refreshes the age-based HRmax estimate unless maxHr was set manually — writing a sport's maxHr marks it manual, and autoMaxHr:true hands it back to the estimate. Server-validated; rejects an invalid edit instead of writing a broken profile. Only touches the profile, never the calendar or library. Read with get_athlete_profile first.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ftpNocycling FTP, watts
runNorunning thresholds + zones
sexNo
sftNothe athlete's CYCLING submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. The standard protocol (Science to Sport, what intervals.icu detects) is about 110% of FTP for 3 min (sec 180) — get_fatigue_tests proposes it — agree it with them, and do not change it mid-season — a new value starts a new baseline.
bikeNocycling thresholds + zones
sftRunNothe athlete's RUNNING fatigue test: about 105% of threshold speed for 3 min (sec 180), frozen for the season, on a treadmill or a flat loop, then a minute of walking — get_fatigue_tests sport:"running" proposes it. null = stop tracking.
controlNowhat they TRAIN BY per sport (Profile "You train by"): the signal you judge and speak in — not the watch's default (running hr also sets runByHr); null = back to what their files show. Only when they say so.
cssPaceNoSWIM threshold — critical swim speed, seconds per 100 m. Confirm it with the athlete before writing: without it swims carry no load, and with a wrong one every swim in their history is mis-scored. From a 400 m + 200 m time trial: (400-200)/(t400-t200) m/s.
runByHrNotrue = runs default to HR targets on the watch (= control.running "hr")
thrPaceNorunning threshold pace, seconds per km
dayCheckNoa subscriber's "Day check" (Profile → Assistant): the assistant's own short look at today or tomorrow when the gym log or check-in gives a reason — false turns it off. Only when they ask.
heightCmNo
weightKgNokg — enables W/kg and body-mass fuelling
autoMaxHrNotrue = go back to the age-based HRmax estimate. Writing a sport's maxHr flips this to manual on its own.
birthdateNoYYYY-MM-DD (age is derived); setting it refreshes the age-based HRmax estimate unless maxHr was set manually (maxHrAuto:false — read it back in get_athlete_profile)
experienceNotraining age → ramp aggressiveness
powerMeterNofalse = no power meter: ride targets show as HR + RPE; prescribe by HR and feel
weeklyHoursNotypical training hours/week
availableDaysNoweekdays free to train, 0=Mon..6=Sun
suggestReviewsNopost-session reviews (Profile → Assistant). For a Blocks Unlimited subscriber this is "Automatic reviews": Blocks reviews a finished training session on its own (20 min+, up to 2 a day, none at night) — false turns that off. For everyone else it is the offer of a review after a key session. Only when they ask.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / dayCheck
      Added value: +{
      +  "description": "a subscriber's \"Day check\" (Profile → Assistant): the assistant's own short look at today or tomorrow when the gym log or check-in gives a reason — false turns it off. Only when they ask.",
      +  "type": "boolean"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / suggestReviews
      Added value: +{
      +  "description": "post-session reviews (Profile → Assistant). For a Blocks Unlimited subscriber this is \"Automatic reviews\": Blocks reviews a finished training session on its own (20 min+, up to 2 a day, none at night) — false turns that off. For everyone else it is the offer of a review after a key session. Only when they ask.",
      +  "type": "boolean"
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / control
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "what they TRAIN BY per sport (Profile \"You train by\"): the signal you judge and speak in — not the watch's default (running hr also sets runByHr); null = back to what their files show. Only when they say so.",
      +  "properties": {
      +    "cycling": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "power",
      +            "hr",
      +            "rpe",
      +            "breath",
      +            "lactate"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "running": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "pace",
      +            "hr",
      +            "rpe",
      +            "breath",
      +            "lactate"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "swim": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "pace",
      +            "rpe"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / runByHr / description
      Previous value: -"true = runs default to HR targets"New value: +"true = runs default to HR targets on the watch (= control.running \"hr\")"
  4. Changed1 schema field changed
    • changedInput schema / properties / runByHr / description
      Previous value: -"true = run targets go out as HR, not pace"New value: +"true = runs default to HR targets"
  5. Changed2 schema fields changed
    • changedInput schema / properties / powerMeter / description
      Previous value: -"false = the athlete rides WITHOUT a power meter — cycling targets display as HR + RPE; prescribe rides by heart rate and feel, not watts"New value: +"false = no power meter: ride targets show as HR + RPE; prescribe by HR and feel"
    • addedInput schema / properties / runByHr
      Added value: +{
      +  "description": "true = run targets go out as HR, not pace",
      +  "type": "boolean"
      +}
  6. Changed2 schema fields changed
    • changedInput schema / properties / sft / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "sec": {
      -        "description": "hold duration in seconds, e.g. 180",
      -        "maximum": 900,
      -        "minimum": 120,
      -        "type": "integer"
      -      },
      -      "watts": {
      -        "description": "absolute watts, frozen for the season — never a % of FTP",
      -        "maximum": 700,
      -        "minimum": 60,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "watts",
      -      "sec"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "sec": {
      +        "description": "hold duration in seconds, e.g. 180",
      +        "maximum": 900,
      +        "minimum": 120,
      +        "type": "integer"
      +      },
      +      "watts": {
      +        "description": "their bike SFT (fatigue test): ~110% FTP × 3 min by protocol, frozen for the season; get_fatigue_tests proposes it. null = off",
      +        "maximum": 700,
      +        "minimum": 60,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "watts",
      +      "sec"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / sftRun / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "pace": {
      -        "description": "seconds per km, frozen for the season",
      -        "maximum": 600,
      -        "minimum": 150,
      -        "type": "integer"
      -      },
      -      "sec": {
      -        "description": "hold duration in seconds",
      -        "maximum": 900,
      -        "minimum": 120,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "pace",
      -      "sec"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "pace": {
      +        "description": "their running SFT: ~105% of threshold speed × 3 min, treadmill or flat loop. null = off",
      +        "maximum": 600,
      +        "minimum": 150,
      +        "type": "integer"
      +      },
      +      "sec": {
      +        "description": "hold duration in seconds",
      +        "maximum": 900,
      +        "minimum": 120,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "pace",
      +      "sec"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  7. Changed1 schema field changed
    • changedInput schema / properties / sftRun / description
      Previous value: -"the athlete's RUNNING fatigue test: the same pace for the same minutes in the warm-up, on a treadmill or a flat loop, then a minute of walking — get_fatigue_tests sport:\"running\" works the pace out from their running. null = stop tracking."New value: +"the athlete's RUNNING fatigue test: about 105% of threshold speed for 3 min (sec 180), frozen for the season, on a treadmill or a flat loop, then a minute of walking — get_fatigue_tests sport:\"running\" proposes it. null = stop tracking."
  8. Changed1 schema field changed
    • changedInput schema / properties / sft / description
      Previous value: -"the athlete's CYCLING submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that END near 85-90% of their max HR — over 3 min heart rate has not plateaued, so that is usually around FTP, not below it (get_fatigue_tests works it out from their riding) — agree it with them, and do not change it mid-season — a new value starts a new baseline."New value: +"the athlete's CYCLING submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. The standard protocol (Science to Sport, what intervals.icu detects) is about 110% of FTP for 3 min (sec 180) — get_fatigue_tests proposes it — agree it with them, and do not change it mid-season — a new value starts a new baseline."
  9. Changed2 schema fields changed
    • changedInput schema / properties / sft / description
      Previous value: -"the athlete's submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that END near 85-90% of their max HR — over 3 min heart rate has not plateaued, so that is usually around FTP, not below it (get_fatigue_tests works it out from their riding) — agree it with them, and do not change it mid-season — a new value starts a new baseline."New value: +"the athlete's CYCLING submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that END near 85-90% of their max HR — over 3 min heart rate has not plateaued, so that is usually around FTP, not below it (get_fatigue_tests works it out from their riding) — agree it with them, and do not change it mid-season — a new value starts a new baseline."
    • addedInput schema / properties / sftRun
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "pace": {
      +          "description": "seconds per km, frozen for the season",
      +          "maximum": 600,
      +          "minimum": 150,
      +          "type": "integer"
      +        },
      +        "sec": {
      +          "description": "hold duration in seconds",
      +          "maximum": 900,
      +          "minimum": 120,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "pace",
      +        "sec"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "the athlete's RUNNING fatigue test: the same pace for the same minutes in the warm-up, on a treadmill or a flat loop, then a minute of walking — get_fatigue_tests sport:\"running\" works the pace out from their running. null = stop tracking."
      +}
  10. Changed1 schema field changed
    • changedInput schema / properties / sft / description
      Previous value: -"the athlete's submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that end near 85-90% of their max HR (roughly threshold or a little under for 3 min), agree it with them, and do not change it mid-season — a new value starts a new baseline."New value: +"the athlete's submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that END near 85-90% of their max HR — over 3 min heart rate has not plateaued, so that is usually around FTP, not below it (get_fatigue_tests works it out from their riding) — agree it with them, and do not change it mid-season — a new value starts a new baseline."
  11. Changed1 schema field changed
    • addedInput schema / properties / sft
      Added value: +{
      +  "anyOf": [
      +    {
      +      "properties": {
      +        "sec": {
      +          "description": "hold duration in seconds, e.g. 180",
      +          "maximum": 900,
      +          "minimum": 120,
      +          "type": "integer"
      +        },
      +        "watts": {
      +          "description": "absolute watts, frozen for the season — never a % of FTP",
      +          "maximum": 700,
      +          "minimum": 60,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "watts",
      +        "sec"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "the athlete's submaximal fatigue test (SFT): the fixed load they hold in the warm-up, which get_fatigue_tests then finds in every ride. null = stop tracking. Pick watts that end near 85-90% of their max HR (roughly threshold or a little under for 3 min), agree it with them, and do not change it mid-season — a new value starts a new baseline."
      +}
  12. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources