check_athlete_workout
ChatGPTCheck a workout written in Simma's workout format against one athlete's pool and thresholds. Returns each mistake with the path to it, or the workout read back as plain lines with its totals and whether it can be sent to that athlete's watch. Changes nothing.
check_my_workout
ChatGPTCheck a workout written in Simma's workout format against the athlete's own pool and thresholds. Returns each mistake with the path to it, or the workout read back as plain lines with its totals and whether it can be sent to a watch. Changes nothing.
check_send_safety
ChatGPTReport which safety gates are active for send_draft in this client. Run it before relying on send_draft: the strongest gate — asking the coach directly before each send — only exists if the client supports MCP elicitation, and the server cannot know that until a client connects. By default this reads what the client declared, which is a claim rather than proof. Pass probe: true to actually raise a throwaway confirmation prompt and find out whether it works. A client can advertise the capability and still fail to show anything, and only a probe catches that.
create_goal
ChatGPTAdd a goal for the athlete: an event with a date and one target per discipline. A goal with one target takes that discipline; more than one makes it a multi-discipline goal. Each target needs a distance or a time. Confirm with the coach before calling this.
create_my_goal
ChatGPTAdd a goal for the athlete: an event with a date and one target per discipline. A goal with one target takes that discipline; more than one makes it a multi-discipline goal. Each target needs a distance or a time. Confirm with the athlete before calling this.
delete_goal
ChatGPTRemove a goal permanently. Prefer update_goal with status completed or archived when the goal happened or was abandoned — that keeps the history the context builder reads. Delete only for mistakes, and confirm with the coach first.
delete_my_goal
ChatGPTRemove a goal permanently. Prefer update_my_goal with status completed or archived when the goal happened or was abandoned — that keeps the history the context builder reads. Delete only for mistakes, and confirm with the athlete first.
discard_draft
ChatGPTDelete a draft that was never sent. Use it to clear a draft the coach decided against, or one you created and no longer need — otherwise it stays in the thread indefinitely. Drafts only. A message that has been sent cannot be deleted, and should not be: removing it would not unsend the email, but it would break the routing that delivers the athlete's reply back into the thread and erase the record of what was actually said.
find_my_sessions_by_shape
ChatGPTEvery session in a window with its pacing shape, plus a roll-up. Answers "which of my swims faded in the main set this month" or "am I negative-splitting more often" from summaries Simma computed when each activity was saved — no lap data is read or averaged here. Two views per session. mainSet is the longest segment and is what a coach means by "did you fade". session is every lap including warm-up and cool-down. Prefer mainSet; mention session only when the two disagree and it matters. Shapes: negative_split (back half faster by >2%), even (within -2..+3%), faded (+3..8%), faded_hard (>8%). fadePercent is positive when they slowed. structure: opening_burst or two_paced means the set had two regimes and the shape was judged on the steady block; do not describe a two-paced set as fading. lapsExcludedAsDeviceErrors counts laps faster than physically possible that were set aside: a miscounting watch, not the athlete. Sessions with too few laps to judge are listed with shape null.
find_sessions_by_shape
ChatGPTEvery session in a window with its pacing shape, plus a roll-up. Answers questions like "which swims faded in the main set this month" or "is she negative-splitting more often" from summaries Simma computed when each activity was saved — no lap data is read or averaged here. Two views per session. mainSet is the longest segment (a swim's main set, the ride itself) and is what a coach means by "did they fade". session is every lap including warm-up and cool-down, so a structured swim often reads faded there while the main set was even or negative. Prefer mainSet; mention session only when the two disagree and it matters. Shapes: negative_split (back half faster by >2%), even (within -2..+3%), faded (+3..8%), faded_hard (>8%). fadePercent is positive when they slowed. paceVariationPercent is lap-to-lap consistency. lapSource: splits means the laps were derived from the pace series at the stated distance because no lap button was pressed — say so if you quote a lap number. Sessions with too few laps to judge are listed with shape null so you can see they existed; do not read anything into them. structure: opening_burst or two_paced means the set had two regimes — sprints then steady, or fast/easy alternating — and the shape was judged on the steady block; rawShape is what a naive whole-set split would say. Do not describe a two-paced set as fading. lapsExcludedAsDeviceErrors counts laps faster than physically possible that were set aside before judging: a miscounting watch, not an athlete.
get_activity_detail
ChatGPTFull detail for one activity, including every lap and the split structure. Large series (GPS traces, heart-rate and pace graphs, elevation profiles, stroke analytics) are summarised rather than inlined. Use this to discuss a specific session. Values are metric. The document carries an imperial copy of each display tile, which is dropped here because it is the same data converted — it was a third of a ride's payload. Check the coach's or athlete's preferredUnits (get_coach_profile, get_athlete_profile) and convert when speaking to someone who uses imperial; do not report kilometres to a coach who works in miles.
get_activity_trace
ChatGPTOne processed trace of an activity as a table ready to chart: heart_rate (bpm over time), elevation (elevation, distance, grade and speed over time), pace (minutes per km for every 100 m), cadence (steps per minute running, revolutions per minute cycling), power (watts, rides and runs on a power-capable watch), stroke_rate (a pool swim's strokes, stroke rate, distance per stroke and speed for every length, or an open-water swim's stroke rate over time), elevation_segments (each climb, descent and flat with distance, gain, speed, heart rate and pace) or stroke_analytics (each swim lap with set, stroke, pace per 100 m and any stroke features the watch app records). columns names each value in a row and units says what it is in, once. Rows are as fine as one answer can hold: resolution says how many points Simma has and which were returned; segment and lap tables are never thinned but continue from nextFromSec when long. For full resolution on part of a long session, pass fromSec and toSec. available lists the traces this activity has. These are Simma's processed series computed from the watch file, not the file itself. The route itself (GPS) is not shared with assistants. Use with the activity detail: its laps share this clock. Leave laps flagged suspect out of pace. Leave activityId out for the athlete's most recent activity.
get_athlete_context
ChatGPTThe richest single view of an athlete, and the right starting point before writing anything to them. Returns three weeks of activity bucketed by week with per-sport volume, training load with 7-day deltas and trend, per-sport training status, goals with days-to-event, the linked training plan, and pre-computed notable flags. Every number here was computed by Simma against this athlete's own history. Treat the flags and figures as established fact: do not re-derive averages, recompute percentages, or second-guess a severity. A flag carries a machine name, a severity, the sentence a coach would say, and the values behind it — and sometimes a context line that changes the reading entirely, such as a load spike that is a return from a break rather than overreaching. Read the context line before characterising a flag. Prefer this over assembling your own picture from list_athlete_activities.
get_athlete_physiology
ChatGPTSleep, HRV, resting heart rate and stress for one athlete. Daily physiology from the athlete's Garmin watch: nightly HRV, sleep (duration, stages, Garmin's sleep score), resting heart rate and all-day stress, one row per calendar date, plus a summary that compares the last 7 days with the athlete's own window. Read coverage first: it says how many nights actually carry a reading, and a watch not worn to bed produces nothing. The readings are measurements against the person's own recent days, not medical findings; report them as such and do not diagnose. Garmin's Health API reaches back about 30 days, so the window is capped there in practice.
get_athlete_profile
ChatGPTOne athlete's profile and coaching relationship: name, contact, preferred units, pool length, self-rated ability by sport, and threshold values (swim/run pace, cycling power) that Simma's load model scores against. Also returns any linked Google training plan and a summary of the last 12 weeks of activities. Use this for who the athlete is; use get_training_status for how they are going.
get_athlete_stats
ChatGPTAggregate statistics and training form for one athlete over a window, including fitness/fatigue/form history and active goals. Use for trends over weeks rather than individual sessions.
get_coach_inbox
ChatGPTEvery athlete conversation with at least one message, most recent first, with the last message and unread count for each. Answers "who is waiting on me" across the whole roster in one call, rather than get_messages per athlete.
get_coach_profile
ChatGPTThe signed-in coach's own record: name, business name, public slug, invite code, and the voice settings Simma applies when drafting athlete emails (tone of voice, coaching instructions, sign-off). Read these before helping write anything so the wording matches what Simma itself would send.
get_messages
ChatGPTRecent coach/athlete message thread, newest first. Useful for what has already been said before drafting anything new.
get_my_activity_detail
ChatGPTFull detail for one activity, including every lap and the split structure. Large series (GPS traces, heart-rate and pace graphs, elevation profiles, stroke analytics) are summarised rather than inlined; get_my_activity_trace returns them to chart (the GPS route is not shared). For analysis of a session, also fetch the traces in traces.recommended and combine them. Values are metric. Check preferredUnits from get_my_profile and convert when speaking to someone who uses imperial.
get_my_activity_trace
ChatGPTOne processed trace of an activity as a table ready to chart: heart_rate (bpm over time), elevation (elevation, distance, grade and speed over time), pace (minutes per km for every 100 m), cadence (steps per minute running, revolutions per minute cycling), power (watts, rides and runs on a power-capable watch), stroke_rate (a pool swim's strokes, stroke rate, distance per stroke and speed for every length, or an open-water swim's stroke rate over time), elevation_segments (each climb, descent and flat with distance, gain, speed, heart rate and pace) or stroke_analytics (each swim lap with set, stroke, pace per 100 m and any stroke features the watch app records). columns names each value in a row and units says what it is in, once. Rows are as fine as one answer can hold: resolution says how many points Simma has and which were returned; segment and lap tables are never thinned but continue from nextFromSec when long. For full resolution on part of a long session, pass fromSec and toSec. available lists the traces this activity has. These are Simma's processed series computed from the watch file, not the file itself. The route itself (GPS) is not shared with assistants. Use with the activity detail: its laps share this clock. Leave laps flagged suspect out of pace. Leave activityId out for the most recent activity.
get_my_context
ChatGPTThe richest single view of the athlete's own training, and the right starting point for any question about how it is going. Three weeks of activity bucketed by week with per-sport volume, training load with 7-day deltas and trend, per-sport training status, goals with days-to-event, the linked training plan, and pre-computed notable flags. Every number was computed by Simma against this athlete's own history. Treat the flags and figures as established fact: do not re-derive averages, recompute percentages, or second-guess a severity. A flag carries a machine name, a severity, the sentence a coach would say, and the values behind it — and sometimes a context line that changes the reading entirely. Read the context line before characterising a flag. This is the athlete's own view: their coach's private notes are not in it and cannot be requested through this server.
get_my_messages
ChatGPTMessages the athlete has received from their coach, newest first. Useful for what has already been said before replying.
get_my_physiology
ChatGPTThe athlete's own sleep, HRV, resting heart rate and stress. Daily physiology from the athlete's Garmin watch: nightly HRV, sleep (duration, stages, Garmin's sleep score), resting heart rate and all-day stress, one row per calendar date, plus a summary that compares the last 7 days with the athlete's own window. Read coverage first: it says how many nights actually carry a reading, and a watch not worn to bed produces nothing. The readings are measurements against the person's own recent days, not medical findings; report them as such and do not diagnose. Garmin's Health API reaches back about 30 days, so the window is capped there in practice.
get_my_profile
ChatGPTThe signed-in athlete's own record: name, preferred units, pool length, self-rated ability by sport, the threshold values (swim/run pace, cycling power or speed) Simma's load model scores against, body mass, whether the thresholds are locked against auto-estimation, and the ids of their coaches. Start here. Everything else on this server is about this person.
get_my_progress
ChatGPTAggregate statistics and training form over a window: fitness, fatigue and form history, distance comparisons, and sport-specific statistics. Use for trends over weeks rather than individual sessions.
get_my_training_status
ChatGPTPer-sport training status for the athlete: form score and zone, trend, detected pattern, days since last activity, session count and flags. Simma's own training-load model — prefer it over inferring load from raw activities.
get_sign_out_instructions
ChatGPTHow to sign this assistant out of Simma, or switch to a different Simma account. Nothing is changed by calling this; it returns the steps and a sign-out link. Use it when the person asks to log out, disconnect, or sign in as someone else.
get_training_status
ChatGPTPer-sport training status for one athlete: form score and zone, trend, detected pattern, days since last activity, session count and flags. This is Simma's own training-load model — prefer it over inferring load from raw activities.
get_workout_format
ChatGPTThe rules and worked examples for Simma's workout format: a sport, then an ordered list of steps and repeat blocks, each step with an intent, one length and at most one target. Read this before writing a workout to check or send. Use it to turn a session from a training plan, or one you have designed with the person, into a structured workout a watch can run.
join_coach
ChatGPTJoin a coach's squad with the invite code they gave the athlete. From then on that coach reads the athlete's training and can message them. If the athlete already has a coach of their own, Simma refuses and returns switchRequired with the current coach named and what leaving them means. Entering a second code almost always means changing coach, so put that to the athlete plainly: the current coach loses access, and their notes and any plan they linked go with them. Only with the athlete's explicit yes call again with replace: true; the athlete is asked to confirm directly where the client can do that, and the switch joins the new coach before removing the old so nothing can leave them coachless. Joining a coach from the Simma house account needs no confirmation; it simply happens.
leave_coach
ChatGPTDisconnect from one of the athlete's coaches. That coach loses access to the athlete's training, and their notes and any plan they linked go with the relationship; the athlete's own activities and goals stay. With no other coach left, the athlete lands on Simma's house coach account automatically. The house coach itself cannot be left. Cannot be undone from here: rejoining needs the coach's invite code. Get the athlete's explicit agreement first; where the client supports it they are also asked directly and the call stops if they decline.
link_my_training_plan
ChatGPTAttach a Google Docs or Sheets URL as the athlete's training plan. Simma reads it (read-only) when building context, so plan-versus-actual comparison becomes possible, and the athlete's coach sees the same link. The document must first be shared with Simma's service account; if it is not, this returns the address to share it with — relay that rather than retrying. Replaces any plan already linked. Confirm first.
link_training_plan
ChatGPTAttach a Google Docs or Sheets URL as the athlete's training plan. Simma reads it (read-only) when building coaching context, so plan-versus-actual comparison becomes possible. The document must first be shared with Simma's service account; if it is not, this returns the address to share it with — relay that to the coach rather than retrying. Replaces any plan already linked.
list_athlete_activities
ChatGPTList an athlete's activities, newest first, trimmed to summary fields. Prefer a date window (weeks/months/days) over paging. Use get_activity_detail for the full breakdown of a single session.
list_athlete_goals
ChatGPTAn athlete's goals — event name, discipline, date, days until event, target time and notes. Use alongside training status to judge whether load suits the time to race.
list_athletes
ChatGPTList the coach's athletes with their current training status, last activity, active goals and unread message count. Start here — it returns the athleteId needed by every other tool. Includes a per-athlete status such as overreaching, monitor, disengaged, quiet, welcome-back or recovering. Quiet means past their own usual gap between sessions with nothing this week — due, not yet disengaged. Paged: returns up to limit athletes (default 50) and a nextCursor when there are more. Pass it back as cursor to continue; a page can be shorter than the limit and still carry a cursor, so keep going until nextCursor is absent. Most rosters fit in one page.
list_my_activities
ChatGPTThe athlete's activities, newest first, trimmed to summary fields. Prefer a date window (weeks/months/days) over paging. Use get_my_activity_detail for the full breakdown of a single session.
list_my_coaches
ChatGPTWho coaches this athlete, with specialty and when they connected. An athlete with no coach of their own is attached to Simma's house coach account, which will appear here; that account can read their training data, and the athlete should know that.
list_my_goals
ChatGPTThe athlete's goals — event name, discipline, date, target time and notes. Use alongside training status to judge whether load suits the time to race.
remove_athlete
ChatGPTEnd the coaching relationship with an athlete. They keep every activity and goal and land on Simma's house coach account; what goes is this coach's access to their training, the coach's private notes on them, and any training plan linked for them. The message thread stays stored but is no longer reachable from this roster. Cannot be undone from here: the athlete would need to join again with the coach's invite code. Get the coach's explicit agreement naming the athlete first; where the client supports it the coach is also asked directly and the call stops if they decline. Never remove several athletes from one approval.
reply_to_coach
ChatGPTSend a message from the athlete to their coach, into the same thread the coach's emails arrive from. This is the one action on this server that makes anything visible to another person: nothing the athlete says to you reaches Simma or their coach except what goes through here. Read the exact text back to the athlete and get their explicit agreement before calling this — pass confirm: true only once they have said yes to those words. Where the client supports it, the athlete is also asked directly in a prompt showing the message; if they decline there, nothing is sent. Sending cannot be undone. Pass coachId only when the athlete has more than one coach; list_my_coaches gives the ids.
save_draft
ChatGPTStore a message you have written to an athlete as a draft. Nothing is sent — the draft appears in Simma where the coach can read, edit and send it, and it is what send_draft takes. Read get_coach_profile first: the coach's tone of voice, coaching instructions and sign-off are what Simma itself writes with, and a draft that ignores them will not sound like them. Ground the content in get_athlete_context rather than in your own reading of the raw numbers. Returns the stored draft including the sk that send_draft needs.
send_draft
ChatGPTSend a saved draft to the athlete as a real email, immediately. This cannot be undone or recalled, and it arrives under the coach's name — the athlete has no way to tell it was written with an assistant. Show the coach the exact subject and body and get their explicit agreement before calling. Do not send on a vague instruction, and never batch sends across several athletes from a single approval. Where the client supports it, the coach is also asked to confirm directly and the send stops if they decline. confirmSubject and confirmBody must match the stored draft exactly, so a stale or mistaken sk cannot send a different message than the one that was approved. Take all three values from save_draft or get_messages rather than from memory.
send_workout_to_athlete_watch
ChatGPTSend a workout in Simma's workout format to one athlete's Garmin watch, on the coach's instruction. The workout is added to the athlete's Garmin workout library, where they pick it on the watch; it is not scheduled on a date, and nothing already in Garmin is changed. Check it first and read the outline back to the person in plain words. Where the client supports it they are also asked directly, and the call stops if they decline. If Garmin refuses, its own message is returned.
send_workout_to_my_watch
ChatGPTSend a workout in Simma's workout format to the athlete's own Garmin watch. The workout is added to the athlete's Garmin workout library, where they pick it on the watch; it is not scheduled on a date, and nothing already in Garmin is changed. Check it first and read the outline back to the person in plain words. Where the client supports it they are also asked directly, and the call stops if they decline. If Garmin refuses, its own message is returned.
unlink_my_training_plan
ChatGPTDetach the linked Google Doc or Sheet. Simma stops reading it; the document itself is untouched. Confirm with the athlete first.
unlink_training_plan
ChatGPTDetach the linked Google Doc or Sheet. Simma stops reading it; the document itself is untouched. Confirm with the coach first.
update_athlete_notes
ChatGPTSet the coach's private notes on an athlete, or the specialty the coach works with them on. Notes are the coach's own memory of the athlete — training background, constraints, what they respond to — and are included in get_athlete_context, so what you write here shapes future drafts. notes replaces the whole text: read get_athlete_profile first and carry forward what should stay.
update_athlete_profile
ChatGPTSet an athlete's thresholds, ability levels, units, pool length, name, body mass or date of birth. Only the fields you pass change. Thresholds are what every training-load number is scored against, so a wrong one reshapes the athlete's whole history: read get_athlete_profile first, state the old and new value to the coach, and confirm before calling this. Units are the ones a coach speaks in — pace as M:SS, speed in km/h — and are converted to what Simma stores. Cycling threshold power comes from a power meter (95% of best 20-minute power is the usual estimate); threshold speed is the fallback for riders without one and is the whole basis of their load, so set it with care. Body mass only affects the climbing term of the speed-based cycling estimate; it is safe to ask the athlete for. ftpLocked stops Simma's own auto-estimation from overwriting a threshold the coach has set deliberately. Birthdate is worth asking for: without it every heart-rate zone is derived from a default age of 40. It changes zones on activities processed from now on, not ones already stored.
update_coach_profile
ChatGPTEdit the signed-in coach's own profile: business name, public slug, and the voice settings Simma applies when drafting athlete emails (tone of voice, coaching instructions, sign-off). Only the fields you pass change; pass at least one. Read get_coach_profile first for the current values and confirm the change with the coach before calling this — the voice settings shape every draft Simma writes for them from then on. signOff is rendered verbatim at the end of each email; use a newline to separate the closing phrase from the name. The slug must be unique across coaches — a 409 means it is already taken.
update_goal
ChatGPTEdit one of the athlete's goals: rename it, move the date, change the discipline or targets, add notes, or mark it completed or archived. Only the fields you pass change. Read list_athlete_goals first for the goalId and the current values, and confirm the change with the coach before calling this — it writes straight to the athlete's record. targets replaces the whole list, so include every target you want to keep. Distances are metres as a string; times are H:MM:SS.
update_my_goal
ChatGPTEdit one of the athlete's goals: rename it, move the date, change the discipline or targets, add notes, or mark it completed or archived. Only the fields you pass change. Read list_my_goals first for the goalId and the current values, and confirm the change with the athlete before calling this. targets replaces the whole list, so include every target you want to keep. Distances are metres as a string; times are H:MM:SS.
update_my_profile
ChatGPTSet the athlete's own thresholds, ability levels, units, pool length, name, body mass or date of birth. Only the fields you pass change. Thresholds are what every training-load number is scored against, so a wrong one reshapes their whole history: read get_my_profile first, state the old and new value, and confirm with the athlete before calling this. Units are the ones a person speaks in — pace as M:SS, speed in km/h — and are converted to what Simma stores. ftpLocked stops Simma's own auto-estimation from overwriting a threshold set deliberately, such as one from a lab test. Birthdate is worth asking for: without it every heart-rate zone is derived from a default age of 40. It changes zones on activities processed from now on, not ones already stored.
check_athlete_workout
Claudecheck_my_workout
Claudecheck_send_safety
Claudecreate_goal
Claudecreate_my_goal
Claudedelete_goal
Claudedelete_my_goal
Claudediscard_draft
Claudefind_my_sessions_by_shape
Claudefind_sessions_by_shape
Claudeget_activity_detail
Claudeget_activity_trace
Claudeget_athlete_context
Claudeget_athlete_physiology
Claudeget_athlete_profile
Claudeget_athlete_stats
Claudeget_coach_inbox
Claudeget_coach_profile
Claudeget_messages
Claudeget_my_activity_detail
Claudeget_my_activity_trace
Claudeget_my_context
Claudeget_my_messages
Claudeget_my_physiology
Claudeget_my_profile
Claudeget_my_progress
Claudeget_my_training_status
Claudeget_sign_out_instructions
Claudeget_training_status
Claudeget_workout_format
Claudejoin_coach
Claudeleave_coach
Claudelink_my_training_plan
Claudelink_training_plan
Claudelist_athlete_activities
Claudelist_athlete_goals
Claudelist_athletes
Claudelist_my_activities
Claudelist_my_coaches
Claudelist_my_goals
Clauderemove_athlete
Claudereply_to_coach
Claudesave_draft
Claudesend_draft
Claudesend_workout_to_athlete_watch
Claudesend_workout_to_my_watch
Claudesign_out
Claudeunlink_my_training_plan
Claudeunlink_training_plan
Claudeupdate_athlete_notes
Claudeupdate_athlete_profile
Claudeupdate_coach_profile
Claudeupdate_goal
Claudeupdate_my_goal
Claudeupdate_my_profile
Claude