createWorkout
ChatGPTIMPORTANT: Before calling this tool, you MUST first call the user-profile tool to retrieve the user's IANA timezone. Use that timezone to construct all date-time values with the correct UTC offset. Never assume a timezone or pass date-only strings without time and offset. Create a new workout for the authenticated user, or as a coach for an athlete in a training center by providing trainingCenterUuid and connectionId. The athlete must have granted coaching MCP access. Workout shape: • Top-level metadata: scheduling (scheduled_at), workout_type, optional name, and optional completion flags when explicitly relevant. Notes and RPE are the athlete's post-workout self-summary in the app—do not set them via this tool; leave them for the athlete. • drills: ordered list of in-water / structured work. Omit drills entirely for schedule-only sessions (e.g. strength, sauna, stretching, recovery blocks) where the plan is just date, type, and title. How prescriptions are usually built: • One drill ≈ one block (e.g. a main set, a secondary set, or a depth line). Chain multiple drills when the session has distinct phases; use the workout name to summarize the whole day at a glance. • Optional drill name and drill/element notes are for coach-facing instructions (how to run the block, cues, equipment). Element notes explain each piece to the athlete. • Pace and duration bounds: call the user-profile tool for disciplineSpeeds—per-discipline speeds in m/s for low, normal, and high pace (user-defined where set, merged with defaults). Use them to estimate dive or swim time from distance/depth, reason about interval load, and set realistic bounds on overall workout duration when authoring or reviewing a plan. Each drill: • elements: ordered segments for a single repetition—pool lengths, depth targets, static holds, or an "other" step with notes (e.g. breath-up / protocol cues). Every rep runs the full list in order; use multiple elements when one "rep" is a composed sequence, not only a single lap or dive. • reps: how many times to repeat that full element sequence. Intervals between reps use rest_type (see below)—not gaps between individual elements inside one rep. Discipline fields (set what matches the discipline): • Pool dynamics: distance (m), pace. Variants: no fins, monofin, bifins. • Static apnea: time (seconds), pace, optional static_apnea_goal: only 1 = contractions and 4 = general. Omit or use 4 for a plain timed hold. Contractions set (two elements in one rep): first element goal 1 = hold until contractions (open-ended phase); second element goal 4 with a duration (e.g. 30 seconds)—“after contractions, continue 30s”. At most two elements when contractions is used; keep contractions first. • Depth: depth (m) and the correct depth discipline (e.g. constant weight, bifins, CNF, FIM, hang), pace. Rest between repetitions (same drill, after each rep except the last rep): • rest_type "fixed" — fixed_rest_time in seconds (typical for pool interval training). • rest_type "dynamic" — dynamic_rest_option: dive_time (1×), twice_dive_time (2×), three_dive_time (3×) vs dive/hold duration; common on depth sessions with repeated dives. • rest_type "free_text" — free_text_label for a custom label shown to the athlete. • rest_type null — no rest between reps. Rest between drills (after a drill, before the next): • break_time is the pause in seconds after that drill before starting the next block. Set it whenever the athlete should recover between sections (e.g. moving from a long single effort to a rep scheme, or between pool sets). The last drill does not need a following break—still set break_time on earlier drills when the plan calls for it.
getAthleteWorkouts
ChatGPTIMPORTANT: Before calling this tool, you MUST first call the user-profile tool to retrieve the user's IANA timezone. Use that timezone to construct all date-time values with the correct UTC offset. Never assume a timezone or pass date-only strings without time and offset. Get workouts for athletes in the coach's training centers. Only includes athletes who have granted coaching MCP access. Respects each athlete's workout sharing date preference. Returns workouts grouped by athlete connection ID. How to read the JSON (not just raw keys): • The payload is an array of { connection_id, workouts }. Each connection_id identifies an athlete in the training center; workouts is that athlete's list for the range (most recently scheduled first). • Each workout object: uuid, scheduled_at (ISO), workout_type, optional name, labels, completed, is_competition; optional notes and rpe are the athlete's post-workout log when filled in—not coach plan text. • pool_length_meters: the pool length used for this workout in metres (e.g. 25, 50). Always present. Use this to convert laps to distance when pool_length_meters is needed (e.g. total metres swum = laps × pool_length_meters). • drills lists prescription blocks in order; an empty array is normal for schedule-only sessions (e.g. strength, sauna, stretching) with no in-water structure. • total_distance is meters; total_apnea_time and total_workout_duration are seconds (derived estimates from the drill structure and pace/discipline assumptions—not a stopwatch recording). • workoutTypes filter (if provided): pool — pool-training and/or pool disciplines inside drills; depth — depth-training and/or depth disciplines; static — static-only sessions; supporting — stretching, strength, other, sauna. workout_state (present when the athlete has started or completed the session in the app): • flatWorkout: the workout unrolled into a flat sequence of items for execution. Each item is either an exercise (the drill object with repIndex) or a rest (kind: "rest" with optional seconds or label). Exercise items do not carry a "kind" field—absence of "kind" means it is an exercise. • states: a map of exercise key → array of lap times in elapsed seconds. Keys follow the pattern used by the app to identify each exercise step. Each lap time is the duration recorded by the athlete's stopwatch for that lap. For pool disciplines use pool_length_meters to convert laps to distance: speed (m/s) = pool_length_meters / lap_time_seconds. For depth or static disciplines, the lap time is the total dive or hold duration. • Only exercises with at least one recorded lap appear in states—absent keys mean the athlete has not started that step. raw_wearable_data (present when a wearable device synced data for this workout): • An array of raw session objects uploaded from the athlete's wearable (e.g. Apple Watch). Each entry is the full raw JSON payload from the device. Use this data to cross-reference heart rate, HRV, SpO₂, or other sensor readings against the structured workout data. Workout shape: • Top-level metadata: scheduling (scheduled_at), workout_type, optional name, and optional completion flags when explicitly relevant. Notes and RPE are the athlete's post-workout self-summary in the app—do not set them via this tool; leave them for the athlete. • drills: ordered list of in-water / structured work. Omit drills entirely for schedule-only sessions (e.g. strength, sauna, stretching, recovery blocks) where the plan is just date, type, and title. How prescriptions are usually built: • One drill ≈ one block (e.g. a main set, a secondary set, or a depth line). Chain multiple drills when the session has distinct phases; use the workout name to summarize the whole day at a glance. • Optional drill name and drill/element notes are for coach-facing instructions (how to run the block, cues, equipment). Element notes explain each piece to the athlete. • Pace and duration bounds: call the user-profile tool for disciplineSpeeds—per-discipline speeds in m/s for low, normal, and high pace (user-defined where set, merged with defaults). Use them to estimate dive or swim time from distance/depth, reason about interval load, and set realistic bounds on overall workout duration when authoring or reviewing a plan. Each drill: • elements: ordered segments for a single repetition—pool lengths, depth targets, static holds, or an "other" step with notes (e.g. breath-up / protocol cues). Every rep runs the full list in order; use multiple elements when one "rep" is a composed sequence, not only a single lap or dive. • reps: how many times to repeat that full element sequence. Intervals between reps use rest_type (see below)—not gaps between individual elements inside one rep. Discipline fields (set what matches the discipline): • Pool dynamics: distance (m), pace. Variants: no fins, monofin, bifins. • Static apnea: time (seconds), pace, optional static_apnea_goal: only 1 = contractions and 4 = general. Omit or use 4 for a plain timed hold. Contractions set (two elements in one rep): first element goal 1 = hold until contractions (open-ended phase); second element goal 4 with a duration (e.g. 30 seconds)—“after contractions, continue 30s”. At most two elements when contractions is used; keep contractions first. • Depth: depth (m) and the correct depth discipline (e.g. constant weight, bifins, CNF, FIM, hang), pace. Rest between repetitions (same drill, after each rep except the last rep): • rest_type "fixed" — fixed_rest_time in seconds (typical for pool interval training). • rest_type "dynamic" — dynamic_rest_option: dive_time (1×), twice_dive_time (2×), three_dive_time (3×) vs dive/hold duration; common on depth sessions with repeated dives. • rest_type "free_text" — free_text_label for a custom label shown to the athlete. • rest_type null — no rest between reps. Rest between drills (after a drill, before the next): • break_time is the pause in seconds after that drill before starting the next block. Set it whenever the athlete should recover between sections (e.g. moving from a long single effort to a rep scheme, or between pool sets). The last drill does not need a following break—still set break_time on earlier drills when the plan calls for it.
getSkillsGuide
ChatGPTReturns the full Freediver Club MCP skills guide as Markdown. Call ths tool in case the skills guide is not available in the host. Call at the start of a planning or coaching session so tool usage, workout structure, pace rules, safety, and workflows are available. Read-only reference text; does not access user data.
getTrainingCenters
ChatGPTGet all training centers the authenticated coach manages, along with the athletes in each center who have granted coaching MCP access. Athletes who have not enabled the ALLOW_COACHING_MCP_ACCESS setting are excluded.
getWorkouts
ChatGPTIMPORTANT: Before calling this tool, you MUST first call the user-profile tool to retrieve the user's IANA timezone. Use that timezone to construct all date-time values with the correct UTC offset. Never assume a timezone or pass date-only strings without time and offset. Get the authenticated user's workouts within a date range. Returns full workout details including drills, elements, and calculated totals (distance, apnea time, duration). How to read the JSON (not just raw keys): • The payload is an array of workout objects, most recently scheduled first. • Each workout object: uuid, scheduled_at (ISO), workout_type, optional name, labels, completed, is_competition; optional notes and rpe are the athlete's post-workout log when filled in—not coach plan text. • pool_length_meters: the pool length used for this workout in metres (e.g. 25, 50). Always present. Use this to convert laps to distance when pool_length_meters is needed (e.g. total metres swum = laps × pool_length_meters). • drills lists prescription blocks in order; an empty array is normal for schedule-only sessions (e.g. strength, sauna, stretching) with no in-water structure. • total_distance is meters; total_apnea_time and total_workout_duration are seconds (derived estimates from the drill structure and pace/discipline assumptions—not a stopwatch recording). • workoutTypes filter (if provided): pool — pool-training and/or pool disciplines inside drills; depth — depth-training and/or depth disciplines; static — static-only sessions; supporting — stretching, strength, other, sauna. workout_state (present when the athlete has started or completed the session in the app): • flatWorkout: the workout unrolled into a flat sequence of items for execution. Each item is either an exercise (the drill object with repIndex) or a rest (kind: "rest" with optional seconds or label). Exercise items do not carry a "kind" field—absence of "kind" means it is an exercise. • states: a map of exercise key → array of lap times in elapsed seconds. Keys follow the pattern used by the app to identify each exercise step. Each lap time is the duration recorded by the athlete's stopwatch for that lap. For pool disciplines use pool_length_meters to convert laps to distance: speed (m/s) = pool_length_meters / lap_time_seconds. For depth or static disciplines, the lap time is the total dive or hold duration. • Only exercises with at least one recorded lap appear in states—absent keys mean the athlete has not started that step. raw_wearable_data (present when a wearable device synced data for this workout): • An array of raw session objects uploaded from the athlete's wearable (e.g. Apple Watch). Each entry is the full raw JSON payload from the device. Use this data to cross-reference heart rate, HRV, SpO₂, or other sensor readings against the structured workout data. Workout shape: • Top-level metadata: scheduling (scheduled_at), workout_type, optional name, and optional completion flags when explicitly relevant. Notes and RPE are the athlete's post-workout self-summary in the app—do not set them via this tool; leave them for the athlete. • drills: ordered list of in-water / structured work. Omit drills entirely for schedule-only sessions (e.g. strength, sauna, stretching, recovery blocks) where the plan is just date, type, and title. How prescriptions are usually built: • One drill ≈ one block (e.g. a main set, a secondary set, or a depth line). Chain multiple drills when the session has distinct phases; use the workout name to summarize the whole day at a glance. • Optional drill name and drill/element notes are for coach-facing instructions (how to run the block, cues, equipment). Element notes explain each piece to the athlete. • Pace and duration bounds: call the user-profile tool for disciplineSpeeds—per-discipline speeds in m/s for low, normal, and high pace (user-defined where set, merged with defaults). Use them to estimate dive or swim time from distance/depth, reason about interval load, and set realistic bounds on overall workout duration when authoring or reviewing a plan. Each drill: • elements: ordered segments for a single repetition—pool lengths, depth targets, static holds, or an "other" step with notes (e.g. breath-up / protocol cues). Every rep runs the full list in order; use multiple elements when one "rep" is a composed sequence, not only a single lap or dive. • reps: how many times to repeat that full element sequence. Intervals between reps use rest_type (see below)—not gaps between individual elements inside one rep. Discipline fields (set what matches the discipline): • Pool dynamics: distance (m), pace. Variants: no fins, monofin, bifins. • Static apnea: time (seconds), pace, optional static_apnea_goal: only 1 = contractions and 4 = general. Omit or use 4 for a plain timed hold. Contractions set (two elements in one rep): first element goal 1 = hold until contractions (open-ended phase); second element goal 4 with a duration (e.g. 30 seconds)—“after contractions, continue 30s”. At most two elements when contractions is used; keep contractions first. • Depth: depth (m) and the correct depth discipline (e.g. constant weight, bifins, CNF, FIM, hang), pace. Rest between repetitions (same drill, after each rep except the last rep): • rest_type "fixed" — fixed_rest_time in seconds (typical for pool interval training). • rest_type "dynamic" — dynamic_rest_option: dive_time (1×), twice_dive_time (2×), three_dive_time (3×) vs dive/hold duration; common on depth sessions with repeated dives. • rest_type "free_text" — free_text_label for a custom label shown to the athlete. • rest_type null — no rest between reps. Rest between drills (after a drill, before the next): • break_time is the pause in seconds after that drill before starting the next block. Set it whenever the athlete should recover between sections (e.g. moving from a long single effort to a rep scheme, or between pool sets). The last drill does not need a following break—still set break_time on earlier drills when the plan calls for it.
updateWorkout
ChatGPTIMPORTANT: Before calling this tool, you MUST first call the user-profile tool to retrieve the user's IANA timezone. Use that timezone to construct all date-time values with the correct UTC offset. Never assume a timezone or pass date-only strings without time and offset. Update an existing workout. Only provided fields are changed. The user must be the workout owner or the coach who created it. When editing an athlete's workout, the athlete must have granted coaching MCP access. Workout shape: • Top-level metadata: scheduling (scheduled_at), workout_type, optional name, and optional completion flags when explicitly relevant. Notes and RPE are the athlete's post-workout self-summary in the app—do not set them via this tool; leave them for the athlete. • drills: ordered list of in-water / structured work. Omit drills entirely for schedule-only sessions (e.g. strength, sauna, stretching, recovery blocks) where the plan is just date, type, and title. How prescriptions are usually built: • One drill ≈ one block (e.g. a main set, a secondary set, or a depth line). Chain multiple drills when the session has distinct phases; use the workout name to summarize the whole day at a glance. • Optional drill name and drill/element notes are for coach-facing instructions (how to run the block, cues, equipment). Element notes explain each piece to the athlete. • Pace and duration bounds: call the user-profile tool for disciplineSpeeds—per-discipline speeds in m/s for low, normal, and high pace (user-defined where set, merged with defaults). Use them to estimate dive or swim time from distance/depth, reason about interval load, and set realistic bounds on overall workout duration when authoring or reviewing a plan. Each drill: • elements: ordered segments for a single repetition—pool lengths, depth targets, static holds, or an "other" step with notes (e.g. breath-up / protocol cues). Every rep runs the full list in order; use multiple elements when one "rep" is a composed sequence, not only a single lap or dive. • reps: how many times to repeat that full element sequence. Intervals between reps use rest_type (see below)—not gaps between individual elements inside one rep. Discipline fields (set what matches the discipline): • Pool dynamics: distance (m), pace. Variants: no fins, monofin, bifins. • Static apnea: time (seconds), pace, optional static_apnea_goal: only 1 = contractions and 4 = general. Omit or use 4 for a plain timed hold. Contractions set (two elements in one rep): first element goal 1 = hold until contractions (open-ended phase); second element goal 4 with a duration (e.g. 30 seconds)—“after contractions, continue 30s”. At most two elements when contractions is used; keep contractions first. • Depth: depth (m) and the correct depth discipline (e.g. constant weight, bifins, CNF, FIM, hang), pace. Rest between repetitions (same drill, after each rep except the last rep): • rest_type "fixed" — fixed_rest_time in seconds (typical for pool interval training). • rest_type "dynamic" — dynamic_rest_option: dive_time (1×), twice_dive_time (2×), three_dive_time (3×) vs dive/hold duration; common on depth sessions with repeated dives. • rest_type "free_text" — free_text_label for a custom label shown to the athlete. • rest_type null — no rest between reps. Rest between drills (after a drill, before the next): • break_time is the pause in seconds after that drill before starting the next block. Set it whenever the athlete should recover between sections (e.g. moving from a long single effort to a rep scheme, or between pool sets). The last drill does not need a following break—still set break_time on earlier drills when the plan calls for it.
user-profile
ChatGPTGet the authenticated user's profile preferences: IANA timezone, preferred UI language, and resolved discipline speeds. All speed values in disciplineSpeeds are in meters per second (m/s): low, normal, and high pace per freediving discipline (merged with defaults when the user has not customized a discipline). Use disciplineSpeeds when planning or estimating workout duration from distance, depth, and pace (same basis as app totals).