Tool tree
gradeNot graded
fitness_get_todayAnswer
What the user is scheduled to do today, based on their active plans and the local weekday. Returns the exercises with their targets, plus whether today is a training day at all. Start here when the user asks what they should do now.
View tool JSON
{
"name": "fitness_get_today",
"kind": "answer",
"impl": "imperative",
"description": "What the user is scheduled to do today, based on their active plans and the local weekday. Returns the exercises with their targets, plus whether today is a training day at all. Start here when the user asks what they should do now.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_get_plansAnswer
All of the user's training plans with their phases and exercises. Optionally filter by status ("active", "paused", "completed", "archived"). Use this to find a plan id before editing anything.
View tool JSON
{
"name": "fitness_get_plans",
"kind": "answer",
"impl": "imperative",
"description": "All of the user's training plans with their phases and exercises. Optionally filter by status (\"active\", \"paused\", \"completed\", \"archived\"). Use this to find a plan id before editing anything.",
"inputSchema": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"active",
"paused",
"completed",
"archived"
],
"description": "Only return plans in this status."
}
},
"required": []
}
}fitness_get_planAnswer
One plan with every phase and exercise, including each exercise id. You need the exercise ids from here to update or remove individual movements.
View tool JSON
{
"name": "fitness_get_plan",
"kind": "answer",
"impl": "imperative",
"description": "One plan with every phase and exercise, including each exercise id. You need the exercise ids from here to update or remove individual movements.",
"inputSchema": {
"type": "object",
"properties": {
"plan_id": {
"type": "string",
"description": "The plan to fetch."
}
},
"required": [
"plan_id"
]
}
}fitness_get_streakAnswer
Current and longest streak. A streak counts only days the plan schedules — missing an unscheduled rest day never breaks it, and a scheduled day that has not happened yet does not either.
View tool JSON
{
"name": "fitness_get_streak",
"kind": "answer",
"impl": "imperative",
"description": "Current and longest streak. A streak counts only days the plan schedules — missing an unscheduled rest day never breaks it, and a scheduled day that has not happened yet does not either.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_get_progressAnswer
The full picture over the last N days: streak, completion rate, total workouts, recent pain notes, recent plan edits, and target-vs-actual for each exercise in the active phase. Read this before advising on whether to add load.
View tool JSON
{
"name": "fitness_get_progress",
"kind": "answer",
"impl": "imperative",
"description": "The full picture over the last N days: streak, completion rate, total workouts, recent pain notes, recent plan edits, and target-vs-actual for each exercise in the active phase. Read this before advising on whether to add load.",
"inputSchema": {
"type": "object",
"properties": {
"days": {
"type": "integer",
"description": "Window to summarise, in days. Defaults to 30."
},
"plan_id": {
"type": "string",
"description": "Restrict the exercise trends and edits to one plan."
}
},
"required": []
}
}fitness_get_calendarAction
Day-by-day training status for one month: which days were scheduled, which were trained, how complete each session was, and which carry notes.
View tool JSON
{
"name": "fitness_get_calendar",
"kind": "act",
"impl": "imperative",
"description": "Day-by-day training status for one month: which days were scheduled, which were trained, how complete each session was, and which carry notes.",
"inputSchema": {
"type": "object",
"properties": {
"month": {
"type": "string",
"description": "Month as \"YYYY-MM\". Defaults to the current month."
}
},
"required": []
}
}fitness_get_workoutsAnswer
Past workout logs, newest first, each with the exercises performed and how they went. Filter by date range or limit the count.
View tool JSON
{
"name": "fitness_get_workouts",
"kind": "answer",
"impl": "imperative",
"description": "Past workout logs, newest first, each with the exercises performed and how they went. Filter by date range or limit the count.",
"inputSchema": {
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "Earliest date to include, \"YYYY-MM-DD\"."
},
"end_date": {
"type": "string",
"description": "Latest date to include, \"YYYY-MM-DD\"."
},
"limit": {
"type": "integer",
"description": "Maximum number of logs. Defaults to 10."
}
},
"required": []
}
}fitness_get_workouts_onAnswer
Every workout logged on a specific date — a day can hold more than one. Use this to find a workout id before editing or deleting it.
View tool JSON
{
"name": "fitness_get_workouts_on",
"kind": "answer",
"impl": "imperative",
"description": "Every workout logged on a specific date — a day can hold more than one. Use this to find a workout id before editing or deleting it.",
"inputSchema": {
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "The day to look at, \"YYYY-MM-DD\"."
}
},
"required": [
"date"
]
}
}fitness_get_badgesAnswer
All nine badges and whether the user has earned each one, how many times, and the context of each award. Useful for encouragement and for telling them what is close.
View tool JSON
{
"name": "fitness_get_badges",
"kind": "answer",
"impl": "imperative",
"description": "All nine badges and whether the user has earned each one, how many times, and the context of each award. Useful for encouragement and for telling them what is close.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_get_body_metricsAnswer
Body measurements over time, oldest first. Units: weight in pounds (lbs); height, bust, waist and hips in centimetres; body fat as a percentage.
View tool JSON
{
"name": "fitness_get_body_metrics",
"kind": "answer",
"impl": "imperative",
"description": "Body measurements over time, oldest first. Units: weight in pounds (lbs); height, bust, waist and hips in centimetres; body fat as a percentage.",
"inputSchema": {
"type": "object",
"properties": {
"days": {
"type": "integer",
"description": "How far back to read, in days. Defaults to 180."
}
},
"required": []
}
}fitness_get_edit_historyAnswer
Every change made to exercise targets, by whom (the person or an agent) and why. Read this to understand what equipment the user actually has and how their load has been trending before suggesting a change.
View tool JSON
{
"name": "fitness_get_edit_history",
"kind": "answer",
"impl": "imperative",
"description": "Every change made to exercise targets, by whom (the person or an agent) and why. Read this to understand what equipment the user actually has and how their load has been trending before suggesting a change.",
"inputSchema": {
"type": "object",
"properties": {
"days": {
"type": "integer",
"description": "How far back to read, in days. Defaults to 14."
},
"plan_id": {
"type": "string",
"description": "Restrict to one plan."
}
},
"required": []
}
}fitness_get_templatesAction
The built-in starter plans a user can adopt in one step. Offer these when someone wants to begin but does not know what to do, then call fitness_create_plan_from_template.
View tool JSON
{
"name": "fitness_get_templates",
"kind": "act",
"impl": "imperative",
"description": "The built-in starter plans a user can adopt in one step. Offer these when someone wants to begin but does not know what to do, then call fitness_create_plan_from_template.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_get_settingsAnswer
The user's display name and what they call their coach. Read this to address them properly.
View tool JSON
{
"name": "fitness_get_settings",
"kind": "answer",
"impl": "imperative",
"description": "The user's display name and what they call their coach. Read this to address them properly.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_create_planAction
Build a complete training plan with phases and exercises. `schedule` sets which weekdays to train. Each phase holds an ordered list of exercises; the first phase becomes the active one. For strength work fill target_reps and target_weight; for holds like planks fill target_duration instead. Ask about injuries and available equipment before calling this.
View tool JSON
{
"name": "fitness_create_plan",
"kind": "act",
"impl": "imperative",
"description": "Build a complete training plan with phases and exercises. `schedule` sets which weekdays to train. Each phase holds an ordered list of exercises; the first phase becomes the active one. For strength work fill target_reps and target_weight; for holds like planks fill target_duration instead. Ask about injuries and available equipment before calling this.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Plan name."
},
"description": {
"type": "string",
"description": "What the plan is for and how to approach it."
},
"schedule": {
"type": "object",
"description": "Which weekdays to train, e.g. {\"mon\": true, \"wed\": true, \"fri\": true}. Omitted days are rest days.",
"properties": {
"mon": {
"type": "boolean"
},
"tue": {
"type": "boolean"
},
"wed": {
"type": "boolean"
},
"thu": {
"type": "boolean"
},
"fri": {
"type": "boolean"
},
"sat": {
"type": "boolean"
},
"sun": {
"type": "boolean"
}
}
},
"start_date": {
"type": "string",
"description": "Start date as \"YYYY-MM-DD\". Optional."
},
"blocks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Phase name, e.g. \"Foundation\" or \"Week 1-4\"."
},
"duration_days": {
"type": "integer",
"description": "How long this phase runs, in days. Optional."
},
"notes": {
"type": "string",
"description": "Notes about this phase."
},
"exercises": {
"type": "array",
"items": {
"type": "object",
"properties": {
"exercise_name": {
"type": "string",
"description": "Name of the movement, e.g. \"Goblet Squat\"."
},
"category": {
"type": "string",
"enum": [
"strength",
"cardio",
"mobility",
"stretch"
],
"description": "Defaults to \"strength\"."
},
"target_sets": {
"type": "integer",
"description": "Number of sets. Defaults to 3."
},
"target_reps": {
"type": "integer",
"description": "Reps per set. Use this for strength work; leave null for timed holds."
},
"target_weight": {
"type": "number",
"description": "Working weight in pounds (lbs). Null for bodyweight movements."
},
"target_duration": {
"type": "integer",
"description": "Seconds per set, for timed movements like planks or wall sits. Use instead of target_reps."
},
"rest_seconds": {
"type": "integer",
"description": "Rest between sets, in seconds. Defaults to 60."
},
"form_cues": {
"type": "string",
"description": "One short coaching cue shown during the set."
},
"notes": {
"type": "string",
"description": "Any extra note about this movement."
}
},
"required": [
"exercise_name"
]
}
}
},
"required": [
"name"
]
},
"description": "Phases, in order."
}
},
"required": [
"name"
]
}
}fitness_create_plan_from_templateAction
Adopt one of the built-in starter plans. The result is a normal, fully editable plan — adjust it afterwards with fitness_update_exercise. Call fitness_get_templates first to see the ids.
View tool JSON
{
"name": "fitness_create_plan_from_template",
"kind": "act",
"impl": "imperative",
"description": "Adopt one of the built-in starter plans. The result is a normal, fully editable plan — adjust it afterwards with fitness_update_exercise. Call fitness_get_templates first to see the ids.",
"inputSchema": {
"type": "object",
"properties": {
"template_id": {
"type": "string",
"description": "Template id from fitness_get_templates."
},
"name": {
"type": "string",
"description": "Override the plan name. Optional."
}
},
"required": [
"template_id"
]
}
}fitness_update_planAction
Change a plan's name, description, weekday schedule, status, or dates. Set status to "paused" when someone needs a break and "active" when they return — a paused plan stops counting toward streaks.
View tool JSON
{
"name": "fitness_update_plan",
"kind": "act",
"impl": "imperative",
"description": "Change a plan's name, description, weekday schedule, status, or dates. Set status to \"paused\" when someone needs a break and \"active\" when they return — a paused plan stops counting toward streaks.",
"inputSchema": {
"type": "object",
"properties": {
"plan_id": {
"type": "string",
"description": "The plan to change."
},
"name": {
"type": "string",
"description": "New name."
},
"description": {
"type": "string",
"description": "New description."
},
"schedule": {
"type": "object",
"description": "Which weekdays to train, e.g. {\"mon\": true, \"wed\": true, \"fri\": true}. Omitted days are rest days.",
"properties": {
"mon": {
"type": "boolean"
},
"tue": {
"type": "boolean"
},
"wed": {
"type": "boolean"
},
"thu": {
"type": "boolean"
},
"fri": {
"type": "boolean"
},
"sat": {
"type": "boolean"
},
"sun": {
"type": "boolean"
}
}
},
"status": {
"type": "string",
"enum": [
"active",
"paused",
"completed",
"archived"
],
"description": "New status."
},
"start_date": {
"type": "string",
"description": "Start date, \"YYYY-MM-DD\"."
},
"end_date": {
"type": "string",
"description": "End date, \"YYYY-MM-DD\"."
}
},
"required": [
"plan_id"
]
}
}fitness_add_exerciseAction
Append a movement to a phase of a plan. Get the block id from fitness_get_plan. For strength work set target_reps and target_weight; for timed holds set target_duration.
View tool JSON
{
"name": "fitness_add_exercise",
"kind": "act",
"impl": "imperative",
"description": "Append a movement to a phase of a plan. Get the block id from fitness_get_plan. For strength work set target_reps and target_weight; for timed holds set target_duration.",
"inputSchema": {
"type": "object",
"properties": {
"block_id": {
"type": "string",
"description": "The phase to add to."
},
"exercise": {
"type": "object",
"properties": {
"exercise_name": {
"type": "string",
"description": "Name of the movement, e.g. \"Goblet Squat\"."
},
"category": {
"type": "string",
"enum": [
"strength",
"cardio",
"mobility",
"stretch"
],
"description": "Defaults to \"strength\"."
},
"target_sets": {
"type": "integer",
"description": "Number of sets. Defaults to 3."
},
"target_reps": {
"type": "integer",
"description": "Reps per set. Use this for strength work; leave null for timed holds."
},
"target_weight": {
"type": "number",
"description": "Working weight in pounds (lbs). Null for bodyweight movements."
},
"target_duration": {
"type": "integer",
"description": "Seconds per set, for timed movements like planks or wall sits. Use instead of target_reps."
},
"rest_seconds": {
"type": "integer",
"description": "Rest between sets, in seconds. Defaults to 60."
},
"form_cues": {
"type": "string",
"description": "One short coaching cue shown during the set."
},
"notes": {
"type": "string",
"description": "Any extra note about this movement."
}
},
"required": [
"exercise_name"
]
}
},
"required": [
"block_id",
"exercise"
]
}
}fitness_update_exerciseAction
Change the targets on one planned movement. Every changed field is written to the edit history with your reason, and shown to the user next to that exercise — so always pass `reason`, phrased for them ("knee felt tight last session"). Only send the fields you are changing.
View tool JSON
{
"name": "fitness_update_exercise",
"kind": "act",
"impl": "imperative",
"description": "Change the targets on one planned movement. Every changed field is written to the edit history with your reason, and shown to the user next to that exercise — so always pass `reason`, phrased for them (\"knee felt tight last session\"). Only send the fields you are changing.",
"inputSchema": {
"type": "object",
"properties": {
"exercise_id": {
"type": "string",
"description": "The planned exercise to change."
},
"target_sets": {
"type": "integer",
"description": "New number of sets."
},
"target_reps": {
"type": "integer",
"description": "New reps per set."
},
"target_weight": {
"type": "number",
"description": "New working weight in pounds (lbs)."
},
"target_duration": {
"type": "integer",
"description": "New hold duration in seconds."
},
"rest_seconds": {
"type": "integer",
"description": "New rest between sets, in seconds."
},
"form_cues": {
"type": "string",
"description": "New coaching cue."
},
"notes": {
"type": "string",
"description": "New note."
},
"reason": {
"type": "string",
"description": "Why this is changing. Shown to the user in the plan view."
}
},
"required": [
"exercise_id"
]
}
}fitness_activate_blockAction
Make a phase of a plan the current one. Earlier phases are marked completed and later ones upcoming. Use this when the user has finished a block and is ready to progress.
View tool JSON
{
"name": "fitness_activate_block",
"kind": "act",
"impl": "imperative",
"description": "Make a phase of a plan the current one. Earlier phases are marked completed and later ones upcoming. Use this when the user has finished a block and is ready to progress.",
"inputSchema": {
"type": "object",
"properties": {
"block_id": {
"type": "string",
"description": "The phase to activate."
}
},
"required": [
"block_id"
]
}
}fitness_log_workoutAction
Record a completed workout. `date` defaults to today. For each movement record what was actually done, not what was planned — if they did fewer reps or dropped the weight, log that. Mark anything they skipped with skipped=true and a skip_reason. Put anything that hurt in pain_notes; it surfaces in progress summaries. Returns any badges this unlocks so you can congratulate them.
View tool JSON
{
"name": "fitness_log_workout",
"kind": "act",
"impl": "imperative",
"description": "Record a completed workout. `date` defaults to today. For each movement record what was actually done, not what was planned — if they did fewer reps or dropped the weight, log that. Mark anything they skipped with skipped=true and a skip_reason. Put anything that hurt in pain_notes; it surfaces in progress summaries. Returns any badges this unlocks so you can congratulate them.",
"inputSchema": {
"type": "object",
"properties": {
"exercises": {
"type": "array",
"items": {
"type": "object",
"properties": {
"exercise_name": {
"type": "string",
"description": "Name of the movement performed."
},
"plan_exercise_id": {
"type": "string",
"description": "The planned exercise this fulfils, when there is one. Links the log to the plan so progress trends work."
},
"actual_sets": {
"type": "integer",
"description": "Sets actually completed."
},
"actual_reps": {
"type": "integer",
"description": "Reps per set actually performed."
},
"actual_weight": {
"type": "number",
"description": "Weight actually used, in pounds (lbs)."
},
"actual_duration": {
"type": "integer",
"description": "Seconds held, for timed movements."
},
"difficulty": {
"type": "integer",
"description": "How hard it felt, 1 (easy) to 5 (maximal)."
},
"skipped": {
"type": "boolean",
"description": "True if the movement was skipped entirely."
},
"skip_reason": {
"type": "string",
"description": "Why it was skipped."
},
"notes": {
"type": "string",
"description": "Any note about this movement in this session."
}
},
"required": [
"exercise_name"
]
},
"description": "What was performed."
},
"date": {
"type": "string",
"description": "Date of the workout, \"YYYY-MM-DD\". Defaults to today."
},
"plan_id": {
"type": "string",
"description": "The plan this session belongs to, if any."
},
"block_id": {
"type": "string",
"description": "The phase this session belongs to, if any."
},
"mood_after": {
"type": "integer",
"description": "How they felt afterwards, 1 (bad) to 5 (great)."
},
"energy_before": {
"type": "integer",
"description": "Energy going in, 1 (flat) to 5 (fresh)."
},
"pain_notes": {
"type": "string",
"description": "Anything that hurt or felt off. Important — it drives future advice."
},
"general_notes": {
"type": "string",
"description": "Any other note about the session."
}
},
"required": [
"exercises"
]
}
}fitness_update_workoutAction
Fix an existing workout log — add a note they forgot, correct the weight, or replace the exercise list wholesale. Find the workout id with fitness_get_workouts_on. Passing `exercises` replaces the whole list, so include every movement, not just the changed one.
View tool JSON
{
"name": "fitness_update_workout",
"kind": "act",
"impl": "imperative",
"description": "Fix an existing workout log — add a note they forgot, correct the weight, or replace the exercise list wholesale. Find the workout id with fitness_get_workouts_on. Passing `exercises` replaces the whole list, so include every movement, not just the changed one.",
"inputSchema": {
"type": "object",
"properties": {
"workout_id": {
"type": "string",
"description": "The workout to correct."
},
"date": {
"type": "string",
"description": "Corrected date, \"YYYY-MM-DD\"."
},
"pain_notes": {
"type": "string",
"description": "Corrected pain notes."
},
"general_notes": {
"type": "string",
"description": "Corrected general notes."
},
"mood_after": {
"type": "integer",
"description": "Corrected mood, 1 to 5."
},
"exercises": {
"type": "array",
"items": {
"type": "object",
"properties": {
"exercise_name": {
"type": "string",
"description": "Name of the movement performed."
},
"plan_exercise_id": {
"type": "string",
"description": "The planned exercise this fulfils, when there is one. Links the log to the plan so progress trends work."
},
"actual_sets": {
"type": "integer",
"description": "Sets actually completed."
},
"actual_reps": {
"type": "integer",
"description": "Reps per set actually performed."
},
"actual_weight": {
"type": "number",
"description": "Weight actually used, in pounds (lbs)."
},
"actual_duration": {
"type": "integer",
"description": "Seconds held, for timed movements."
},
"difficulty": {
"type": "integer",
"description": "How hard it felt, 1 (easy) to 5 (maximal)."
},
"skipped": {
"type": "boolean",
"description": "True if the movement was skipped entirely."
},
"skip_reason": {
"type": "string",
"description": "Why it was skipped."
},
"notes": {
"type": "string",
"description": "Any note about this movement in this session."
}
},
"required": [
"exercise_name"
]
},
"description": "Replaces the entire exercise list."
}
},
"required": [
"workout_id"
]
}
}fitness_log_body_metricsAction
Record body measurements. Send only what was actually measured — nothing needs to be complete. Units: weight in pounds (lbs); height, bust, waist and hips in centimetres; body_fat as a percentage like 28.5. Logging the same date twice updates that day, overwriting only the fields you send.
View tool JSON
{
"name": "fitness_log_body_metrics",
"kind": "act",
"impl": "imperative",
"description": "Record body measurements. Send only what was actually measured — nothing needs to be complete. Units: weight in pounds (lbs); height, bust, waist and hips in centimetres; body_fat as a percentage like 28.5. Logging the same date twice updates that day, overwriting only the fields you send.",
"inputSchema": {
"type": "object",
"properties": {
"weight": {
"type": "number",
"description": "Weight in pounds (lbs)."
},
"height": {
"type": "number",
"description": "Height in centimetres."
},
"bust": {
"type": "number",
"description": "Bust in centimetres."
},
"waist": {
"type": "number",
"description": "Waist in centimetres."
},
"hips": {
"type": "number",
"description": "Hips in centimetres."
},
"body_fat": {
"type": "number",
"description": "Body fat percentage, e.g. 28.5."
},
"notes": {
"type": "string",
"description": "Any note about this measurement."
},
"date": {
"type": "string",
"description": "Date, \"YYYY-MM-DD\". Defaults to today."
}
},
"required": []
}
}fitness_update_settingsAction
Set what the app calls the user and what they call their coach. If the user tells you their name, or asks you to go by a particular name, record it here so the app greets them consistently.
View tool JSON
{
"name": "fitness_update_settings",
"kind": "act",
"impl": "imperative",
"description": "Set what the app calls the user and what they call their coach. If the user tells you their name, or asks you to go by a particular name, record it here so the app greets them consistently.",
"inputSchema": {
"type": "object",
"properties": {
"user_name": {
"type": "string",
"description": "The user's display name."
},
"coach_name": {
"type": "string",
"description": "What the coach is called in the UI."
},
"coach_tagline": {
"type": "string",
"description": "Small label above the coach's note on the home screen."
}
},
"required": []
}
}fitness_check_badgesAction
Re-run the badge checks and award anything newly earned. Logging a workout already does this, so you rarely need it on its own.
View tool JSON
{
"name": "fitness_check_badges",
"kind": "act",
"impl": "imperative",
"description": "Re-run the badge checks and award anything newly earned. Logging a workout already does this, so you rarely need it on its own.",
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}fitness_delete_planSensitive Action
Remove a training plan and its phases. The user must approve this in the app before it happens; you will get back whether they did. Workout history is kept — deleting a plan never erases what they actually did.
View tool JSON
{
"name": "fitness_delete_plan",
"kind": "transact",
"impl": "imperative",
"description": "Remove a training plan and its phases. The user must approve this in the app before it happens; you will get back whether they did. Workout history is kept — deleting a plan never erases what they actually did.",
"inputSchema": {
"type": "object",
"properties": {
"plan_id": {
"type": "string",
"description": "The plan to delete."
}
},
"required": [
"plan_id"
]
}
}fitness_delete_exerciseSensitive Action
Take a movement out of a plan. The user must approve it in the app first. Prefer fitness_update_exercise when the goal is to make something easier rather than remove it.
View tool JSON
{
"name": "fitness_delete_exercise",
"kind": "transact",
"impl": "imperative",
"description": "Take a movement out of a plan. The user must approve it in the app first. Prefer fitness_update_exercise when the goal is to make something easier rather than remove it.",
"inputSchema": {
"type": "object",
"properties": {
"exercise_id": {
"type": "string",
"description": "The planned exercise to remove."
}
},
"required": [
"exercise_id"
]
}
}fitness_delete_workoutSensitive Action
Erase a logged workout — for a duplicate or something logged by mistake. The user must approve it in the app first. This changes their streak, so prefer fitness_update_workout when the log is merely wrong.
View tool JSON
{
"name": "fitness_delete_workout",
"kind": "transact",
"impl": "imperative",
"description": "Erase a logged workout — for a duplicate or something logged by mistake. The user must approve it in the app first. This changes their streak, so prefer fitness_update_workout when the log is merely wrong.",
"inputSchema": {
"type": "object",
"properties": {
"workout_id": {
"type": "string",
"description": "The workout log to delete."
}
},
"required": [
"workout_id"
]
}
}fitness_navigateAction
Switch the app to a screen so the user is looking at what you are talking about. Do this before explaining something visual — send them to "calendar" when discussing consistency, "badges" when congratulating them.
View tool JSON
{
"name": "fitness_navigate",
"kind": "act",
"impl": "imperative",
"description": "Switch the app to a screen so the user is looking at what you are talking about. Do this before explaining something visual — send them to \"calendar\" when discussing consistency, \"badges\" when congratulating them.",
"inputSchema": {
"type": "object",
"properties": {
"tab": {
"type": "string",
"enum": [
"today",
"plan",
"calendar",
"body",
"badges"
],
"description": "today = home and next session; plan = the training plan; calendar = training history; body = measurements and charts; badges = the badge wall."
}
},
"required": [
"tab"
]
}
}fitness_start_sessionAction
Open the guided session flow so the user can start training right now — it walks them through each set with a rest timer. Use it when they say they are ready to work out. Defaults to today's scheduled session.
View tool JSON
{
"name": "fitness_start_session",
"kind": "act",
"impl": "imperative",
"description": "Open the guided session flow so the user can start training right now — it walks them through each set with a rest timer. Use it when they say they are ready to work out. Defaults to today's scheduled session.",
"inputSchema": {
"type": "object",
"properties": {
"plan_id": {
"type": "string",
"description": "Plan to train. Defaults to today's scheduled plan, or the active one."
},
"block_id": {
"type": "string",
"description": "Phase to train. Defaults to the active phase."
}
},
"required": []
}
}fitness_open_plan_editorAction
Open the plan editor for the user to fill in themselves, rather than building it for them. Use this when they want to make the choices — or when they ask for something you should not decide alone. Pass a plan_id to edit an existing plan, or omit it to start a blank one.
View tool JSON
{
"name": "fitness_open_plan_editor",
"kind": "act",
"impl": "imperative",
"description": "Open the plan editor for the user to fill in themselves, rather than building it for them. Use this when they want to make the choices — or when they ask for something you should not decide alone. Pass a plan_id to edit an existing plan, or omit it to start a blank one.",
"inputSchema": {
"type": "object",
"properties": {
"plan_id": {
"type": "string",
"description": "Plan to edit. Omit to open a blank editor."
}
},
"required": []
}
}fitness_highlight_exerciseAction
Scroll to an exercise in the plan view and flash it, so the user can see which movement you mean while you talk about it.
View tool JSON
{
"name": "fitness_highlight_exercise",
"kind": "act",
"impl": "imperative",
"description": "Scroll to an exercise in the plan view and flash it, so the user can see which movement you mean while you talk about it.",
"inputSchema": {
"type": "object",
"properties": {
"exercise_id": {
"type": "string",
"description": "The planned exercise to point at."
}
},
"required": [
"exercise_id"
]
}
}