DocsSupport

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_exercise is an op of edit_program_day; patch_session_exercise, add_session_exercise and revert_session_patch are ops of the new edit_session.
  • swap_sessions is move_session with swap_with.
  • propose_replacements is renamed propose_exercises and gains mode: "add" (exercises to add to a session, from the named muscles or else the groups the session does not train).
  • search_memories is removed: get_athlete_profile returns every memory with its id (memories, memories_truncated).
  • get_periodization_context is removed: get_athlete_profile returns the same facts under periodization.

New tool

  • edit_session { date, program_id?, day_index?, name?, ops }: the ops of edit_program_day (swap, set, add, remove, move, group) plus reset, on one date's session. The first change keeps a copy of that date's session, so later template edits no longer reach it; reset puts the plan back. An add on a date with no session creates a one-off session (day_index 7) of the active program covering the date, else of no program (program_id 0 on every read). A name on a template-day session is ignored.

Results

  • Every result is { success, error_code?, <facts>, suggested_tool?, written? } with at most one sentence in message (error on a failure). instruction is gone from every tool, and refusals carry error_code (was code on reschedule_program and generate_smart_program).
  • Every write carries written: { program_ids, dates }.
  • get_athlete_profile: profile holds every athlete field, null where unset, measurements included, weightKg and heightCm as numbers; onboardingCompleted and missing are gone. It gains memories (every memory with its id, newest first, up to 200), memories_truncated and periodization (the former get_periodization_context output; weeks_since_last_deload counts only a deload program that has ended).
  • save_athlete_profile returns { success, profile } (no onboardingCompleted, missing or message).
  • 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 most limit (new input, default 200, max 1000). Every program carries status and is_current; the default listing leaves drafts out. phase_type is the phase stored on the program (the filter enum is general | strength | hypertrophy | deload | endurance). Rows carry a plain exercise_name and a separate equipment (was "Name - Equipment"), and no flat rpe (rpe_per_set is normalized). Dates are YYYY-MM-DD; an unnamed day reads Day <day_index + 1>.
  • get_activity_logs_raw: rows ordered (date desc, act_inst_id desc); next_cursor is "<YYYY-MM-DD>:<act_inst_id>" (a bare date is still accepted); e1rm is null when no set qualifies; no flat rpe; plain exercise_name plus equipment.
  • get_day_session is date-first: all inputs optional; output { date, sessions, filtered_out }. With date, the sessions the calendar shows that day; without, the template day of program_id and day_index, drafts included. A date changed by edit_session shows its changed session (swapped_from, added_for_date).
  • generate_smart_program: loses volume_warnings, instruction and picker_fallback; gains message, sessions_on_unavailable_days and exclusion_violations; wishes_without_effect lists every freeform wish and the notes verbatim; program names are always Phase <n> · <phase or program_name>[ · Week <x>]. Failures carry GENERATION_FAILED, DRAFT_SAVE_FAILED or STALE_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_session success gains now_on; a session already on the target answers changed: false. swap_rotation_weeks this_week lists the dates it left as planned in skipped. revert_session_move gains logs: { carried, kept } and logs_left (the logs an undo of a copy or a week inversion leaves on the date it had placed the session on), and its written.program_ids names every program of the batch.
  • delete_memory returns deleted.

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 answers changed: 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_session and swap_rotation_weeks with NOT_SCHEDULED (edit_session ignores a named draft); an avoided exercise refuses with AVOIDED_EXERCISE unless user_requested_exercise: true; an exercise already on the day refuses a swap with DUPLICATE_ON_DAY and is reported in not_added on an add.

Inputs

  • generate_smart_program: new sets_per_exercise (2 to 6) and program_name (at most 40 characters); region_emphases[] is a discriminated union keyed by muscle, each with its sub_region enum (the aliases middle, back, hams are gone; an invalid pair fails validation); day_type_overrides[].weekday is optional and never rejected (more sessions than training days grows the week); regenerate_attempt is accepted and ignored; notes reads like a freeform wish.
  • prepare_user_program: new phase (stored on the program, read by the prescription fill).
  • commit_program_draft arc_update and update_program days_per_week, rotation_pair_id, rotation_index are accepted and ignored.
  • search_exercises loses exclude_program_day; muscle: "traps" reads dorsals_traps.
  • log_activity sets holds up to 20 sets.
  • save_athlete_profile weightKg is a number (a numeric string still coerces).
  • save_constraint: set_equipment: [] leaves the whitelist unchanged; new clear_equipment: true lifts it.
  • Every date is a YYYY-MM-DD calendar date checked by the server (no JSON-schema pattern).
  • 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 "", 0 or [] 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_profile volumeIndicator.
  • destructiveHint: true on edit_program_day, edit_session, move_session, swap_rotation_weeks and reschedule_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.

On this page