{"ok":true,"site":{"host":"corep.stonefish.dev","url":"https://corep.stonefish.dev/","type":"live","desc":"A local-first fitness tracker you and your AI agent operate together, over WebMCP.","tools":[{"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.","title":"Get today's workout","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"List training plans","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["active","paused","completed","archived"],"description":"Only return plans in this status."}},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get a plan in detail","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"plan_id":{"type":"string","description":"The plan to fetch."}},"required":["plan_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get the current streak","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get a progress summary","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get a training calendar","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"month":{"type":"string","description":"Month as \"YYYY-MM\". Defaults to the current month."}},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get workout history","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get one day of workouts","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"date":{"type":"string","description":"The day to look at, \"YYYY-MM-DD\"."}},"required":["date"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get badges","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get body measurement history","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"days":{"type":"integer","description":"How far back to read, in days. Defaults to 180."}},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get plan edit history","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"List starter plan templates","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Get app settings","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Create a training plan","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Create a plan from a template","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Update plan details","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Add an exercise to a plan","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Update an exercise target","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Switch the active phase","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"block_id":{"type":"string","description":"The phase to activate."}},"required":["block_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Log a workout","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Correct a logged workout","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Log body measurements","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Update app settings","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Check for new badges","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Delete a plan","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"plan_id":{"type":"string","description":"The plan to delete."}},"required":["plan_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Remove an exercise from a plan","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"exercise_id":{"type":"string","description":"The planned exercise to remove."}},"required":["exercise_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Delete a workout log","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"workout_id":{"type":"string","description":"The workout log to delete."}},"required":["workout_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Open a screen in the app","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Start a guided workout","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Open the plan editor","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"plan_id":{"type":"string","description":"Plan to edit. Omit to open a blank editor."}},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"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.","title":"Point at an exercise","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"exercise_id":{"type":"string","description":"The planned exercise to point at."}},"required":["exercise_id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Health & Education","favicon":"/favicons/corep.stonefish.dev.png","apiSurface":"spec","toolCount":31}}