Hi 👋
I'm using the MCP tools (create-routine, update-routine) to programmatically build routines with rep ranges. After creating them, I noticed that rep ranges don't display in the Hevy app — I see blank REPS columns instead of
the REP RANGE column, even though rep_range values are correctly set on each set.
Root Cause
After investigating, I found that the public API rejects the input_modifier field:
PUT /v1/routines/{id}
Body: { "routine": { "exercises": [{ "input_modifier": "rep-range", ... }] } }
Response:
{"error": "\"routine.exercises[0].input_modifier\" is not allowed"}
I intercepted the Hevy web app's requests via DevTools and discovered that the internal API (PUT /routine/{id}) uses an input_modifier: "rep-range" field on each exercise to toggle between REPS and REP RANGE display modes. Without
it, the app defaults to REPS mode and my rep range values are invisible.
Impact
Any routine created through the MCP tools that uses rep ranges will appear to have blank rep fields in the app. The data is stored correctly server-side, but the UI won't render it because input_modifier was never set. I had to go
back and patch all 20 of my routines via the internal API to fix this.
Expected Behavior
Ideally one of:
- The public API accepts input_modifier: "rep-range" on exercises
- The API automatically infers input_modifier: "rep-range" when rep_range is set on any set
- The MCP tool handles this transparently
Workaround
I'm currently working around this by using the internal Hevy web API directly via curl after creating routines through MCP:
Some other differences I noticed between the internal and public API formats:
- Internal uses indicator instead of type for set types (warmup/normal/failure/dropset)
- Internal requires index on each set
- Internal auth uses Bearer session token + x-api-key: shelobs_hevy_web
Steps to Reproduce
- Create a routine via the MCP create-routine tool with sets that have rep_range values
- Open the routine in the Hevy app
- Observe that the REPS column is shown (not REP RANGE) and values appear blank
- Edit the same routine from the Hevy web UI, add input_modifier: "rep-range" via the internal API
- Observe that rep ranges now display correctly
Hi 👋
I'm using the MCP tools (
create-routine,update-routine) to programmatically build routines with rep ranges. After creating them, I noticed that rep ranges don't display in the Hevy app — I see blank REPS columns instead ofthe REP RANGE column, even though
rep_rangevalues are correctly set on each set.Root Cause
After investigating, I found that the public API rejects the
input_modifierfield:PUT /v1/routines/{id}
Body: { "routine": { "exercises": [{ "input_modifier": "rep-range", ... }] } }
Response:
{"error": "\"routine.exercises[0].input_modifier\" is not allowed"}I intercepted the Hevy web app's requests via DevTools and discovered that the internal API (PUT /routine/{id}) uses an input_modifier: "rep-range" field on each exercise to toggle between REPS and REP RANGE display modes. Without
it, the app defaults to REPS mode and my rep range values are invisible.
Impact
Any routine created through the MCP tools that uses rep ranges will appear to have blank rep fields in the app. The data is stored correctly server-side, but the UI won't render it because input_modifier was never set. I had to go
back and patch all 20 of my routines via the internal API to fix this.
Expected Behavior
Ideally one of:
Workaround
I'm currently working around this by using the internal Hevy web API directly via curl after creating routines through MCP:
Some other differences I noticed between the internal and public API formats:
Steps to Reproduce