Changelog
Contract changes of the GymUp MCP server, newest first.
The server follows SemVer: a removed or renamed tool, a reshaped output or a tightened input is a major version; a new tool or an additive input a minor one; a description-only change a patch.
13.0.1
The server instructions say that ask_question and the [CONTEXT] message prefix, which some tool descriptions mention, exist only in the in-app chat. OAuth discovery is also served at the origin root: https://gymup.ai/.well-known/oauth-authorization-server and https://gymup.ai/.well-known/oauth-protected-resource.
13.0.0
Released 2026-10-14. Clients that hard-code tool names: propose_replacements is now propose_exercises, swap_sessions is move_session with swap_with, and the session edit tools are ops of edit_session.
The server now decides less and reports more: tools state facts, refuse only for ownership, validity and retry, and leave the judgement to the host model.
Tools removed or renamed
patch_program_exerciseis an op ofedit_program_day;patch_session_exercise,add_session_exerciseandrevert_session_patchare ops of the newedit_session.swap_sessionsismove_sessionwithswap_with.propose_replacementsis renamedpropose_exercisesand gainsmode: "add"(exercises to add to a session, from the namedmusclesor else the groups the session does not train).search_memoriesis removed:get_athlete_profilereturns every memory with its id (memories,memories_truncated).get_periodization_contextis removed:get_athlete_profilereturns the same facts underperiodization.
New tool
edit_session { date, program_id?, day_index?, name?, ops }: the ops ofedit_program_day(swap,set,add,remove,move,group) plusreset, on one date's session. The first change keeps a copy of that date's session, so later template edits no longer reach it;resetputs the plan back. Anaddon a date with no session creates a one-off session (day_index7) of the active program covering the date, else of no program (program_id0 on every read). Anameon a template-day session is ignored.
Results
- Every result is
{ success, error_code?, <facts>, suggested_tool?, written? }with at most one sentence inmessage(erroron a failure).instructionis gone from every tool, and refusals carryerror_code(wascodeonreschedule_programandgenerate_smart_program). - Every write carries
written: { program_ids, dates }. get_athlete_profile:profileholds every athlete field,nullwhere unset,measurementsincluded,weightKgandheightCmas numbers;onboardingCompletedandmissingare gone. It gainsmemories(every memory with its id, newest first, up to 200),memories_truncatedandperiodization(the formerget_periodization_contextoutput;weeks_since_last_deloadcounts only a deload program that has ended).save_athlete_profilereturns{ success, profile }(noonboardingCompleted,missingormessage).get_programs: summary output is{ programs, total, truncated, drafts_hidden }(was a bare array); rows output is{ rows, total, truncated, drafts_hidden }, newest program first, at mostlimit(new input, default 200, max 1000). Every program carriesstatusandis_current; the default listing leaves drafts out.phase_typeis the phase stored on the program (the filter enum isgeneral | strength | hypertrophy | deload | endurance). Rows carry a plainexercise_nameand a separateequipment(was"Name - Equipment"), and no flatrpe(rpe_per_setis normalized). Dates areYYYY-MM-DD; an unnamed day readsDay <day_index + 1>.get_activity_logs_raw: rows ordered(date desc, act_inst_id desc);next_cursoris"<YYYY-MM-DD>:<act_inst_id>"(a bare date is still accepted);e1rmisnullwhen no set qualifies; no flatrpe; plainexercise_nameplusequipment.get_day_sessionis date-first: all inputs optional; output{ date, sessions, filtered_out }. Withdate, the sessions the calendar shows that day; without, the template day ofprogram_idandday_index, drafts included. A date changed byedit_sessionshows its changed session (swapped_from,added_for_date).generate_smart_program: losesvolume_warnings,instructionandpicker_fallback; gainsmessage,sessions_on_unavailable_daysandexclusion_violations;wishes_without_effectlists every freeform wish and the notes verbatim; program names are alwaysPhase <n> · <phase or program_name>[ · Week <x>]. Failures carryGENERATION_FAILED,DRAFT_SAVE_FAILEDorSTALE_CONSTRAINTS(now only for an unreadable stored value).propose_exercises:{ success, confidence, options, none_fits, replaced }; each option carries its probability. Refusals:NO_CANDIDATES,NO_CANDIDATES_WITH_EQUIPMENT,NOT_ON_DAY,UNKNOWN_EXERCISE.move_sessionsuccess gainsnow_on; a session already on the target answerschanged: false.swap_rotation_weeksthis_weeklists the dates it left as planned inskipped.revert_session_movegainslogs: { carried, kept }andlogs_left(the logs an undo of a copy or a week inversion leaves on the date it had placed the session on), and itswritten.program_idsnames every program of the batch.delete_memoryreturnsdeleted.
Refusals removed
- Session dates:
PAST_DATE,SAME_DATE,PAST_TARGET,WEEK_OVERFLOW,SOURCE_AMBIGUOUS,SOURCE_IS_PLACED,ALREADY_ON_TARGET,WEEK_HAS_MOVES,WEEK_HAS_LOGS,NOT_ACTIVE_ON_DATE,NO_ACTIVE_PROGRAM. - Edits:
OUT_OF_POOL_REPLACEMENT,OUT_OF_PROPOSAL_LIST,NOOP_REPLACEMENT(a no-op change answerschanged: false),TYPE_MISMATCH(a swap onto the other training type takes the coach's row shape),FOREIGN_MUSCLE_FOR_DAY,SWAP_ON_ADDED_EXERCISE. - A program off the calendar (a draft, or undated) refuses
move_sessionandswap_rotation_weekswithNOT_SCHEDULED(edit_sessionignores a named draft); an avoided exercise refuses withAVOIDED_EXERCISEunlessuser_requested_exercise: true; an exercise already on the day refuses a swap withDUPLICATE_ON_DAYand is reported innot_addedon an add.
Inputs
generate_smart_program: newsets_per_exercise(2 to 6) andprogram_name(at most 40 characters);region_emphases[]is a discriminated union keyed bymuscle, each with itssub_regionenum (the aliasesmiddle,back,hamsare gone; an invalid pair fails validation);day_type_overrides[].weekdayis optional and never rejected (more sessions than training days grows the week);regenerate_attemptis accepted and ignored;notesreads like a freeform wish.prepare_user_program: newphase(stored on the program, read by the prescription fill).commit_program_draftarc_updateandupdate_programdays_per_week,rotation_pair_id,rotation_indexare accepted and ignored.search_exerciseslosesexclude_program_day;muscle: "traps"readsdorsals_traps.log_activitysetsholds up to 20 sets.save_athlete_profileweightKgis a number (a numeric string still coerces).save_constraint:set_equipment: []leaves the whitelist unchanged; newclear_equipment: truelifts it.- Every date is a
YYYY-MM-DDcalendar date checked by the server (no JSON-schemapattern). - An optional field never carries a JSON-schema constraint that rules out the placeholder a strict call sends: optional enums and flags take
null, and"",0or[]read as absent where they cannot be a value (a profile field, a program id, a page cursor, a set count).
Descriptions and annotations
- Every description says what the call does, its scope and its inputs, with at most one hint; the import recipe, consent rules and card copy left them (consent now rides only the in-app chat). The volume levels live in
save_athlete_profilevolumeIndicator. destructiveHint: trueonedit_program_day,edit_session,move_session,swap_rotation_weeksandreschedule_program.- The server instructions are three lines plus the MCP facts.
12.6.0
The muscle id enums (save_constraint add_avoid_muscles / remove_avoid_muscles, generate_smart_program muscle_exclusions) gain lowerbody_hip_flexors, delts_rotator_cuff and pecs_serratus.
12.5.5
generate_smart_program pinned_unplaced gains the reason day_full: a placed favorite the per-day row target dropped because its day held more pins than rows.
12.5.4
patch_session_exercise description: a prescription change advised for the session on screen is offered as a card and applied on the yes.
12.5.3
patch_session_exercise refuses a swap aimed at an exercise added for that date (SWAP_ON_ADDED_EXERCISE), and propose_replacements answers the same for an added target and NOT_ON_DAY for one removed for the date.
12.5.2
New tool add_session_exercise: one exercise into one date's session, placed and prescribed by the coach.
12.5.1
New tool propose_replacements: the server-ranked replacement options.
12.5.0
patch_session_exercise takes remove: one exercise out of one date's session.
12.4.0
New tool swap_sessions: one batch that exchanges two dates' sessions.
12.3.0
search_exercises and get_day_session rows carry movement_pattern, mechanic and force.
11.6.3 and 11.6.2
generate_smart_program descriptions drop the copy-previous-ids retry instruction; exclude_exercise_ids is explicit-ask only, widened server-side to same-name rows.
11.5.0 and 11.4.0
generate_smart_program day_type_overrides widens to legs, pull, push, upper, lower, arms; weekday becomes optional; the success carries applied_day_types.