MCP App Store
Lifestyle
Kenso icon

Kenso

by Zenmonkeys Digital LLC

Overview

Kenso helps users inspect current training, workout history, recovery, nutrition, body metrics, programs, and personal records through ChatGPT. With user confirmation and the right OAuth scopes, it can also create or adjust private workout programs, log workouts, stage imports, complete sessions, discard staged imports, and save durable coaching preferences in the user's Kenso account.

Tools

adjust_program

ChatGPT
WRITE TOOL — proposes changes to a user's program (add/remove/swap/update exercises). Returns a proposal for the user to confirm — does NOT mutate the program directly. Confirm changes with the user before invoking. Action types — PICK CAREFULLY: - add: introduce a NEW exercise that isn't currently in the workout. Example: "Add calves to my Pull day" (no calf exercise present) → add with exerciseName='Standing Calf Raise', targetSets=3, targetReps='12-15'. - remove: drop an existing exercise from the workout. Example: "Take cable curls off Pull day" → remove with exerciseName='Cable Curl'. - swap: replace exercise A with exercise B in-place. Example: "Swap squats for hack squat" → swap with exerciseName='Barbell Back Squat', newExerciseName='Hack Squat'. Sets/reps copy over unless explicitly changed. - update: change targetSets or targetReps on an exercise that's ALREADY in the workout. Example: "Add a 4th set to RDLs" → update with exerciseName='Barbell Romanian Deadlift', targetSets=4. "Move bench to 6-8" → update with targetReps='6-8'. Common mistake to AVOID: "add a set to X" / "add a 4th set to Y" — this is update with new targetSets, NOT add. Use add only when introducing an exercise that isn't yet in the workout. Defaults to the active program; pass programId to target a specific one. Exercise names must be exact Kenso library names (verify via lookup_exercise first). Returns a proposal — the user must approve in-app before changes apply.

adjust_program

ChatGPT
WRITE TOOL — proposes changes to a user's program (add/remove/swap/update exercises). Returns a proposal for the user to confirm — does NOT mutate the program directly. Confirm changes with the user before invoking. Action types — PICK CAREFULLY: - add: introduce a NEW exercise that isn't currently in the workout. Example: "Add calves to my Pull day" (no calf exercise present) → add with exerciseName='Standing Calf Raise', targetSets=3, targetReps='12-15'. - remove: drop an existing exercise from the workout. Example: "Take cable curls off Pull day" → remove with exerciseName='Cable Curl'. - swap: replace exercise A with exercise B in-place. Example: "Swap squats for hack squat" → swap with exerciseName='Barbell Back Squat', newExerciseName='Hack Squat'. Sets/reps copy over unless explicitly changed. - update: change targetSets or targetReps on an exercise that's ALREADY in the workout. Example: "Add a 4th set to RDLs" → update with exerciseName='Barbell Romanian Deadlift', targetSets=4. "Move bench to 6-8" → update with targetReps='6-8'. Common mistake to AVOID: "add a set to X" / "add a 4th set to Y" — this is update with new targetSets, NOT add. Use add only when introducing an exercise that isn't yet in the workout. Defaults to the active program; pass programId to target a specific one. Exercise names must be exact Kenso library names (verify via lookup_exercise first). Returns a proposal — the user must approve in-app before changes apply.

create_workout_program

ChatGPT
WRITE TOOL — generates a complete workout program preview and persists it. Requires explicit user agreement before invocation. Use for: - "Build me a new program" / "Make me a routine" / "Generate a program" - "I want to start a new mesocycle / block" - After gathering goal, level, days per week, and split (do NOT call before) Prerequisites: confirm with the user — goal (Strength / Hypertrophy / Athletic / Fat Loss / General Fitness), experience level, days per week, preferred split, progression strategy. If recommending specific exercises in the conversation, pass them via specificExercises so they're locked in. Use canonical Kenso names (verify via lookup_exercise first) — unknown names are rejected.

create_workout_program

ChatGPT
WRITE TOOL — generates a complete workout program preview and persists it. Requires explicit user agreement before invocation. Use for: - "Build me a new program" / "Make me a routine" / "Generate a program" - "I want to start a new mesocycle / block" - After gathering goal, level, days per week, and split (do NOT call before) Prerequisites: confirm with the user — goal (Strength / Hypertrophy / Athletic / Fat Loss / General Fitness), experience level, days per week, preferred split, progression strategy. If recommending specific exercises in the conversation, pass them via specificExercises so they're locked in. Use canonical Kenso names (verify via lookup_exercise first) — unknown names are rejected.

discard_import_draft

ChatGPT
WRITE TOOL (destructive) — throws away a staged workout import draft. Confirm with the user before invoking. Use for: - "Cancel that import" / "Delete the draft" / "Throw it out" - "Never mind, don't import those" Idempotent (already-discarded drafts return discarded=false with a note). The raw upload may still live until expiry, but the parsed/normalized draft is dropped permanently.

discard_import_draft

ChatGPT
WRITE TOOL (destructive) — throws away a staged workout import draft. Confirm with the user before invoking. Use for: - "Cancel that import" / "Delete the draft" / "Throw it out" - "Never mind, don't import those" Idempotent (already-discarded drafts return discarded=false with a note). The raw upload may still live until expiry, but the parsed/normalized draft is dropped permanently.

get_body_weight_trend

ChatGPT
SOURCE OF TRUTH for the user's body weight direction. Weight is logged daily — always pull fresh rather than recalling earlier numbers. Use for: - "What's my weight doing?" / "What's my scale trend?" - "Am I losing/gaining too fast?" / "How much have I lost this month?" - "Is my cut / bulk working?" / "Is nutrition pacing right?" - Whenever validating a nutrition outcome (proactively pull alongside get_nutrition) Returns daily body weight (last 30 days), latest reading, recent-7d vs prior-7d averages. Returns available=false for external MCP/REST clients in v1 (lives only on iOS client until v1.1 sync ships).

get_body_weight_trend

ChatGPT
SOURCE OF TRUTH for the user's body weight direction. Weight is logged daily — always pull fresh rather than recalling earlier numbers. Use for: - "What's my weight doing?" / "What's my scale trend?" - "Am I losing/gaining too fast?" / "How much have I lost this month?" - "Is my cut / bulk working?" / "Is nutrition pacing right?" - Whenever validating a nutrition outcome (proactively pull alongside get_nutrition) Returns daily body weight (last 30 days), latest reading, recent-7d vs prior-7d averages. Returns available=false for external MCP/REST clients in v1 (lives only on iOS client until v1.1 sync ships).

get_exercise_catalog

ChatGPT
Browse the Kenso exercise library filtered by muscle and/or equipment. Returns canonical exercises with form tips and tier ratings (S/A/B/C; S is best). Use for: - "What exercises can I do for chest / back / quads?" - "What are good alternatives to leg press?" / "Suggest a swap for X" - "What dumbbell exercises hit triceps?" / equipment-constrained recommendations - Picking exercises before building a program (use with create_workout_program) ALWAYS filter by muscle or equipment — the unfiltered catalog is too large. Prefer S/A-tier when recommending. For a single specific exercise's full detail, use get_exercise_detail.

get_exercise_catalog

ChatGPT
Browse the Kenso exercise library filtered by muscle and/or equipment. Returns canonical exercises with form tips and tier ratings (S/A/B/C; S is best). Use for: - "What exercises can I do for chest / back / quads?" - "What are good alternatives to leg press?" / "Suggest a swap for X" - "What dumbbell exercises hit triceps?" / equipment-constrained recommendations - Picking exercises before building a program (use with create_workout_program) ALWAYS filter by muscle or equipment — the unfiltered catalog is too large. Prefer S/A-tier when recommending. For a single specific exercise's full detail, use get_exercise_detail.

get_exercise_detail

ChatGPT
Fetch the full library entry for a single exercise: form tip, cues, common mistake, tier rating, equipment, muscles worked, progression defaults. Use for: - "How do I do RDL / X exercise?" / "Show me form cues" - "What's a common mistake on X?" / "What's the setup for Y?" - "What's the tier / rating of X?" / "Is X a good exercise?" - Looking up progression defaults (rep range, target sets, load step) when building a program Accepts exerciseLibraryId (preferred) or name (case-insensitive). For browsing many exercises by muscle/equipment, use get_exercise_catalog.

get_exercise_detail

ChatGPT
Fetch the full library entry for a single exercise: form tip, cues, common mistake, tier rating, equipment, muscles worked, progression defaults. Use for: - "How do I do RDL / X exercise?" / "Show me form cues" - "What's a common mistake on X?" / "What's the setup for Y?" - "What's the tier / rating of X?" / "Is X a good exercise?" - Looking up progression defaults (rep range, target sets, load step) when building a program Accepts exerciseLibraryId (preferred) or name (case-insensitive). For browsing many exercises by muscle/equipment, use get_exercise_catalog.

get_exercise_progression

ChatGPT
SOURCE OF TRUTH for a specific lift's history and current PR. Always call this rather than recalling earlier numbers — weights change every session and your memory of "the user benched 225" is stale within a week. Call this whenever the user asks: - "How's my bench/squat/deadlift going?" / "What's my PR on X?" - "What did I lift last time on bench?" / "Show me my last few bench sessions" - "Am I plateauing on X?" / "Am I making progress on Y?" - "Show me every set of my last 10 bench presses" → use includeSets=true Accepts partial / generic names. If the user says "bench press" and matches multiple variants (Barbell Bench Press, Smith Machine Bench Press, etc.), the tool resolves to the variant the user has actually LOGGED most recently — no need for the user to be precise. If the user wants a different variant, returns candidates so you can pick. Returns weight × rep history per session + estimated 1RM. With includeSets=true, also returns every working set (weight, reps, RPE). IMPORTANT: currentPR.weight is the estimated 1RM (Brzycki, RPE-adjusted via RIR when RPE was logged), NOT the heaviest single set. currentPR.reps is the reps from the heaviest-weight set used to compute the 1RM, NOT the reps at the estimated 1RM. Don't describe currentPR as "lifted X for 1 rep" unless reps actually equals 1.

get_exercise_progression

ChatGPT
SOURCE OF TRUTH for a specific lift's history and current PR. Always call this rather than recalling earlier numbers — weights change every session and your memory of "the user benched 225" is stale within a week. Call this whenever the user asks: - "How's my bench/squat/deadlift going?" / "What's my PR on X?" - "What did I lift last time on bench?" / "Show me my last few bench sessions" - "Am I plateauing on X?" / "Am I making progress on Y?" - "Show me every set of my last 10 bench presses" → use includeSets=true Accepts partial / generic names. If the user says "bench press" and matches multiple variants (Barbell Bench Press, Smith Machine Bench Press, etc.), the tool resolves to the variant the user has actually LOGGED most recently — no need for the user to be precise. If the user wants a different variant, returns candidates so you can pick. Returns weight × rep history per session + estimated 1RM. With includeSets=true, also returns every working set (weight, reps, RPE). IMPORTANT: currentPR.weight is the estimated 1RM (Brzycki, RPE-adjusted via RIR when RPE was logged), NOT the heaviest single set. currentPR.reps is the reps from the heaviest-weight set used to compute the 1RM, NOT the reps at the estimated 1RM. Don't describe currentPR as "lifted X for 1 rep" unless reps actually equals 1.

get_hrv_trend

ChatGPT
SOURCE OF TRUTH for the user's HRV trajectory. HRV shifts daily; always pull fresh rather than recalling. Use for: - "How's my HRV?" / "Is my HRV trending up or down?" - "Am I chronically stressed?" / "Is this fatigue acute or chronic?" - "Is autonomic recovery limiting me?" - Reasoning about whether one bad day is acute (1-day dip) or chronic (multi-week trend) Returns morning-median HRV daily for the last 14 days (in-app) / 30 days (external), plus recent-7d vs prior-7d averages. External clients derive from recovery snapshots (per-workout-day granularity) until v1.1 health_daily_metrics ships.

get_hrv_trend

ChatGPT
SOURCE OF TRUTH for the user's HRV trajectory. HRV shifts daily; always pull fresh rather than recalling. Use for: - "How's my HRV?" / "Is my HRV trending up or down?" - "Am I chronically stressed?" / "Is this fatigue acute or chronic?" - "Is autonomic recovery limiting me?" - Reasoning about whether one bad day is acute (1-day dip) or chronic (multi-week trend) Returns morning-median HRV daily for the last 14 days (in-app) / 30 days (external), plus recent-7d vs prior-7d averages. External clients derive from recovery snapshots (per-workout-day granularity) until v1.1 health_daily_metrics ships.

get_import_draft

ChatGPT
Inspect a staged workout import draft before the user commits it. Use for: - "Show the import draft" / "Review what will be imported" - "What's in the draft?" / "Any conflicts on the import?" - Iterating with the user after stage_workout_import before they commit/cancel Returns the staged sessions, any conflicts (duplicates, unknown exercises), createdAt, expiresAt (drafts auto-expire 24h after staging).

get_import_draft

ChatGPT
Inspect a staged workout import draft before the user commits it. Use for: - "Show the import draft" / "Review what will be imported" - "What's in the draft?" / "Any conflicts on the import?" - Iterating with the user after stage_workout_import before they commit/cancel Returns the staged sessions, any conflicts (duplicates, unknown exercises), createdAt, expiresAt (drafts auto-expire 24h after staging).

get_meso_summary

ChatGPT
SOURCE OF TRUTH for active mesocycle / training block progress. Sessions and PRs accumulate continuously — pull fresh rather than recalling. Use for: - "How's this block / mesocycle going?" / "How many sessions in?" - "How many PRs this block?" / "What did I hit in this meso?" - "How much volume have I done on this program?" - "What's left in this meso?" Defaults to the active program. Returns sessions completed since meso start, total volume + sets, PRs achieved during the block, per-workout completion counts, and a kensoSays summary line.

get_meso_summary

ChatGPT
SOURCE OF TRUTH for active mesocycle / training block progress. Sessions and PRs accumulate continuously — pull fresh rather than recalling. Use for: - "How's this block / mesocycle going?" / "How many sessions in?" - "How many PRs this block?" / "What did I hit in this meso?" - "How much volume have I done on this program?" - "What's left in this meso?" Defaults to the active program. Returns sessions completed since meso start, total volume + sets, PRs achieved during the block, per-workout completion counts, and a kensoSays summary line.

get_next_workout

ChatGPT
SOURCE OF TRUTH for the user's next scheduled workout. Pulls live from their CURRENT active program — do not infer the next workout from conversational memory, because the user may have switched programs or completed sessions since you last spoke. Call this whenever the user asks: - "What's my next workout?" / "What's up next?" / "What am I doing tomorrow?" - "What's today's workout?" (after get_today_summary, if they want the exercise list) - "What exercises am I doing?" / "What's on deck?" - "What day of my program am I on?" Returns workout name, day index within the program rotation, total days in rotation, and the full exercise list (name, primary muscle, target sets, target rep range, exercise_library_id). Returns null if no active program.

get_next_workout

ChatGPT
SOURCE OF TRUTH for the user's next scheduled workout. Pulls live from their CURRENT active program — do not infer the next workout from conversational memory, because the user may have switched programs or completed sessions since you last spoke. Call this whenever the user asks: - "What's my next workout?" / "What's up next?" / "What am I doing tomorrow?" - "What's today's workout?" (after get_today_summary, if they want the exercise list) - "What exercises am I doing?" / "What's on deck?" - "What day of my program am I on?" Returns workout name, day index within the program rotation, total days in rotation, and the full exercise list (name, primary muscle, target sets, target rep range, exercise_library_id). Returns null if no active program.

get_nutrition

ChatGPT
SOURCE OF TRUTH for the user's diet, calories, and macros. Always pull fresh — don't recall earlier intake numbers, daily totals shift continuously. Use for: - "How are my calories?" / "Am I eating enough?" / "What did I eat yesterday?" - "How's my protein intake?" / "Am I hitting my macros?" - "Is my cut / bulk on track?" / "Am I in a deficit?" - Whenever fueling could explain recovery or performance dips (proactively pull this) Returns 14-day daily averages and yesterday. Returns available=false when nutrition tracking isn't connected — mention once and move on. External MCP/REST clients currently get available=false (data lives on the iOS client until the v1.1 sync ships).

get_nutrition

ChatGPT
SOURCE OF TRUTH for the user's diet, calories, and macros. Always pull fresh — don't recall earlier intake numbers, daily totals shift continuously. Use for: - "How are my calories?" / "Am I eating enough?" / "What did I eat yesterday?" - "How's my protein intake?" / "Am I hitting my macros?" - "Is my cut / bulk on track?" / "Am I in a deficit?" - Whenever fueling could explain recovery or performance dips (proactively pull this) Returns 14-day daily averages and yesterday. Returns available=false when nutrition tracking isn't connected — mention once and move on. External MCP/REST clients currently get available=false (data lives on the iOS client until the v1.1 sync ships).

get_program_building_blocks

ChatGPT
Preflight for designing a new Kenso program. Returns the full exercise library (names + ids + muscle + equipment + tier), canonical rep ranges, allowed program/split/level enums, and the structure schema. Use for: - Always call ONCE before save_program_structure — saves you from guessing names that won't match the library - "What rep ranges does Kenso support?" / "What's the structure schema?" - Filter by muscle when designing a single workout day to keep payload small Use this once → design the program → call save_program_structure.

get_program_building_blocks

ChatGPT
Preflight for designing a new Kenso program. Returns the full exercise library (names + ids + muscle + equipment + tier), canonical rep ranges, allowed program/split/level enums, and the structure schema. Use for: - Always call ONCE before save_program_structure — saves you from guessing names that won't match the library - "What rep ranges does Kenso support?" / "What's the structure schema?" - Filter by muscle when designing a single workout day to keep payload small Use this once → design the program → call save_program_structure.

get_program_detail

ChatGPT
SOURCE OF TRUTH for a program's template structure: workouts, exercises, prescriptions (sets × reps × rest × progression). Always call this rather than recalling earlier conversation — the user can edit their program at any time and template-from-memory goes stale fast. Use for: - "What's in my program?" / "Show me Lower A" / "What are my prescribed sets?" - "Walk me through my routine" / "What's the structure?" - "What's my progression set up as?" / "What's the rep range for X?" Returns the program TEMPLATE, not what the user actually logged. When the user trains, they can swap exercises (Pendulum Squat → Linear Leg Press) or add freestyle exercises on top. To see what was actually logged, use get_workout_session for a specific sessionId. Template-vs-actual divergence is normal — don't treat it as a bug.

get_program_detail

ChatGPT
SOURCE OF TRUTH for a program's template structure: workouts, exercises, prescriptions (sets × reps × rest × progression). Always call this rather than recalling earlier conversation — the user can edit their program at any time and template-from-memory goes stale fast. Use for: - "What's in my program?" / "Show me Lower A" / "What are my prescribed sets?" - "Walk me through my routine" / "What's the structure?" - "What's my progression set up as?" / "What's the rep range for X?" Returns the program TEMPLATE, not what the user actually logged. When the user trains, they can swap exercises (Pendulum Squat → Linear Leg Press) or add freestyle exercises on top. To see what was actually logged, use get_workout_session for a specific sessionId. Template-vs-actual divergence is normal — don't treat it as a bug.

get_recent_summary

ChatGPT
SOURCE OF TRUTH for the last N days of training (default 14). Volume, intensity, and signal anomalies all shift with each session — pull fresh, don't recall. Call this whenever the user asks: - "How was my last week / two weeks?" / "What's my recent volume?" - "Am I hitting enough sets?" / "How's my training the last X days?" - "What muscles have I hit recently?" / "Did I do enough chest/back/legs?" - "Any red flags in my last 2 weeks?" / "Have my signals shifted?" Returns sessions, volume + hard sets per muscle, volume Δ vs prior window, signal anomalies (HRV / RHR / sleep / RPE trend), plus a kensoSays paragraph. For today specifically use get_today_summary; for longer-term (6+ weeks) use get_trend_summary.

get_recent_summary

ChatGPT
SOURCE OF TRUTH for the last N days of training (default 14). Volume, intensity, and signal anomalies all shift with each session — pull fresh, don't recall. Call this whenever the user asks: - "How was my last week / two weeks?" / "What's my recent volume?" - "Am I hitting enough sets?" / "How's my training the last X days?" - "What muscles have I hit recently?" / "Did I do enough chest/back/legs?" - "Any red flags in my last 2 weeks?" / "Have my signals shifted?" Returns sessions, volume + hard sets per muscle, volume Δ vs prior window, signal anomalies (HRV / RHR / sleep / RPE trend), plus a kensoSays paragraph. For today specifically use get_today_summary; for longer-term (6+ weeks) use get_trend_summary.

get_recovery_status

ChatGPT
SOURCE OF TRUTH for whether the user is recovered enough to train hard today. Recovery shifts daily based on sleep, HRV, and training load — do NOT answer from memory or assume yesterday's state still applies. Call this whenever the user asks: - "Am I recovered?" / "How recovered am I?" / "Should I push today?" - "Should I lift?" / "Should I rest?" / "Should I back off?" - "How's my readiness?" / "How am I feeling?" (when in training context) - "Am I overreaching?" / "Am I tired?" / "Am I fresh?" Returns readiness score (0-100), bucket (green/yellow/red), human-readable reasons, recent RPE trend, training frequency, rep dropoff, days since last session. HealthKit biometrics (HRV, sleep, resting HR) are also threaded into the readiness score when the user has them connected. For an even broader picture that also includes today's planned workout, use get_today_summary instead.

get_recovery_status

ChatGPT
SOURCE OF TRUTH for whether the user is recovered enough to train hard today. Recovery shifts daily based on sleep, HRV, and training load — do NOT answer from memory or assume yesterday's state still applies. Call this whenever the user asks: - "Am I recovered?" / "How recovered am I?" / "Should I push today?" - "Should I lift?" / "Should I rest?" / "Should I back off?" - "How's my readiness?" / "How am I feeling?" (when in training context) - "Am I overreaching?" / "Am I tired?" / "Am I fresh?" Returns readiness score (0-100), bucket (green/yellow/red), human-readable reasons, recent RPE trend, training frequency, rep dropoff, days since last session. HealthKit biometrics (HRV, sleep, resting HR) are also threaded into the readiness score when the user has them connected. For an even broader picture that also includes today's planned workout, use get_today_summary instead.

get_signal_insights_summary

ChatGPT
SOURCE OF TRUTH for which recovery/lifestyle signals personally matter most for THIS user. Computed from their own session correlations — not a generic recommendation. Pull fresh; the correlations update as they log more sessions. Use for: - "What affects my performance most?" / "What matters for my recovery?" - "Is sleep or HRV more important for me?" / "What signal should I prioritize?" - "Why does Kenso weight X heavily?" Returns the personalized "What Matters For You" findings (sleep, HRV, resting HR, rest days, etc. ranked by correlation strength), plus a kensoSays headline. Returns available=false when there are fewer than 4 sessions with recovery snapshots.

get_signal_insights_summary

ChatGPT
SOURCE OF TRUTH for which recovery/lifestyle signals personally matter most for THIS user. Computed from their own session correlations — not a generic recommendation. Pull fresh; the correlations update as they log more sessions. Use for: - "What affects my performance most?" / "What matters for my recovery?" - "Is sleep or HRV more important for me?" / "What signal should I prioritize?" - "Why does Kenso weight X heavily?" Returns the personalized "What Matters For You" findings (sleep, HRV, resting HR, rest days, etc. ranked by correlation strength), plus a kensoSays headline. Returns available=false when there are fewer than 4 sessions with recovery snapshots.

get_sleep_detail

ChatGPT
SOURCE OF TRUTH for the user's sleep — nightly stages and trend. Sleep changes every night; always pull fresh. Use for: - "How's my sleep?" / "How did I sleep this week?" - "What's my deep / REM sleep?" / "Am I getting enough deep sleep?" - "Is sleep hurting my recovery / performance?" (proactive pull when readiness is low) - "What's my sleep trend?" Returns total / deep / REM / core hours per night (last 7 in-app, last 14 for external). The recovery summary already includes total sleep — call this when stage breakdown or sleep-as-limiter matters. Stage breakdown is only available from the iOS client; MCP/REST clients get total hours only until v1.1 ships health_daily_metrics.

get_sleep_detail

ChatGPT
SOURCE OF TRUTH for the user's sleep — nightly stages and trend. Sleep changes every night; always pull fresh. Use for: - "How's my sleep?" / "How did I sleep this week?" - "What's my deep / REM sleep?" / "Am I getting enough deep sleep?" - "Is sleep hurting my recovery / performance?" (proactive pull when readiness is low) - "What's my sleep trend?" Returns total / deep / REM / core hours per night (last 7 in-app, last 14 for external). The recovery summary already includes total sleep — call this when stage breakdown or sleep-as-limiter matters. Stage breakdown is only available from the iOS client; MCP/REST clients get total hours only until v1.1 ships health_daily_metrics.

get_steps_trend

ChatGPT
SOURCE OF TRUTH for the user's daily activity and NEAT outside of training. Steps update continuously through the day; pull fresh rather than recalling. Use for: - "How active am I?" / "What are my steps?" / "Am I hitting my step goal?" - "Is my NEAT low?" / "Am I sedentary outside of training?" - Fat-loss activity context (cross-reference with get_nutrition + get_body_weight_trend) - "Did I move enough today?" Returns daily step count (last 7 days), today's steps, recent-3d vs prior-4d averages, weekly average. External MCP/REST clients get available=false in v1 — daily HealthKit sync (v1.1) will populate server-side.

get_steps_trend

ChatGPT
SOURCE OF TRUTH for the user's daily activity and NEAT outside of training. Steps update continuously through the day; pull fresh rather than recalling. Use for: - "How active am I?" / "What are my steps?" / "Am I hitting my step goal?" - "Is my NEAT low?" / "Am I sedentary outside of training?" - Fat-loss activity context (cross-reference with get_nutrition + get_body_weight_trend) - "Did I move enough today?" Returns daily step count (last 7 days), today's steps, recent-3d vs prior-4d averages, weekly average. External MCP/REST clients get available=false in v1 — daily HealthKit sync (v1.1) will populate server-side.

get_strength_score

ChatGPT
SOURCE OF TRUTH for the user's strength + hypertrophy state. Call this fresh whenever the user asks about strength, muscle growth, weekly volume, or whether they're training enough — numbers shift with every logged session. Call this whenever the user asks: - Strength: "How strong am I?" / "Am I getting stronger?" / "Has my strength gone up this month?" - Balance: "Which muscles are lagging?" / "Where am I weakest?" - Muscle progress: "How's my back/chest/legs progressing?" - Hypertrophy / volume: "Am I training X enough?" / "How many sets did I do this week?" / "Am I in the MAV range?" / "Should I add more sets?" / "Am I overreaching?" Returns TWO complementary lenses: 1. STRENGTH SCORE — overallScore, change28d, per-muscle breakdown, weekly history. Scale is unbounded, normalized to user's baseline (100 = baseline). Glutes=222 means "222% of baseline." 2. HYPERTROPHY (muscleWeeklyHardSets) — per-muscle effective hard sets per week (RPE≥7, fractional 0.5× secondaries), last 8 weeks. Use with MEV/MAV/MRV landmarks to answer volume questions. Bands: Below MEV → recommend more sets; In MAV → growth zone; Approaching MRV → fatigue mounting; Over MRV → deload. Also returns: statusLabel, trendInsight, kensoSays (one-line summary including current week's hypertrophy snapshot), trend, nearPeak. Treat statusLabel as a snapshot — it can label a muscle "Needs Attention" even when its 28d trend is positive (label is threshold-based, not trajectory-aware in v1).

get_strength_score

ChatGPT
SOURCE OF TRUTH for the user's strength + hypertrophy state. Call this fresh whenever the user asks about strength, muscle growth, weekly volume, or whether they're training enough — numbers shift with every logged session. Call this whenever the user asks: - Strength: "How strong am I?" / "Am I getting stronger?" / "Has my strength gone up this month?" - Balance: "Which muscles are lagging?" / "Where am I weakest?" - Muscle progress: "How's my back/chest/legs progressing?" - Hypertrophy / volume: "Am I training X enough?" / "How many sets did I do this week?" / "Am I in the MAV range?" / "Should I add more sets?" / "Am I overreaching?" Returns TWO complementary lenses: 1. STRENGTH SCORE — overallScore, change28d, per-muscle breakdown, weekly history. Scale is unbounded, normalized to user's baseline (100 = baseline). Glutes=222 means "222% of baseline." 2. HYPERTROPHY (muscleWeeklyHardSets) — per-muscle effective hard sets per week (RPE≥7, fractional 0.5× secondaries), last 8 weeks. Use with MEV/MAV/MRV landmarks to answer volume questions. Bands: Below MEV → recommend more sets; In MAV → growth zone; Approaching MRV → fatigue mounting; Over MRV → deload. Also returns: statusLabel, trendInsight, kensoSays (one-line summary including current week's hypertrophy snapshot), trend, nearPeak. Treat statusLabel as a snapshot — it can label a muscle "Needs Attention" even when its 28d trend is positive (label is threshold-based, not trajectory-aware in v1).

get_today_summary

ChatGPT
PRIMARY ENTRYPOINT for any question about the user's current training state: today's workout, readiness, recovery, what to train, whether to push or back off, recent signal anomalies. This is the SOURCE OF TRUTH for live state — prefer this tool over conversational memory or earlier-in-thread inferences, because the user's program, recovery, and biometrics change between conversations. Call this FIRST when the user asks any of: - "What's my workout today?" / "What should I train?" / "What's on the plan?" - "Am I recovered?" / "How am I doing?" / "Should I lift today?" - "What program am I on?" / "What's my current routine?" - "How's my HRV / sleep / readiness?" - "What's going on with my training?" (open-ended check-in) Returns plannedWorkout (the actual next workout name + day index + exercise list with target sets and rep ranges — no follow-up call needed), readiness score, recent HRV/RHR/sleep/RPE anomalies vs baseline, goal phase, training notes, and a kensoSays interpretive paragraph. Ground your reply in the real plannedWorkout.workoutName and plannedWorkout.exercises — do NOT speculate or substitute different exercises. Use kensoSays for the recovery/readiness framing.

get_today_summary

ChatGPT
PRIMARY ENTRYPOINT for any question about the user's current training state: today's workout, readiness, recovery, what to train, whether to push or back off, recent signal anomalies. This is the SOURCE OF TRUTH for live state — prefer this tool over conversational memory or earlier-in-thread inferences, because the user's program, recovery, and biometrics change between conversations. Call this FIRST when the user asks any of: - "What's my workout today?" / "What should I train?" / "What's on the plan?" - "Am I recovered?" / "How am I doing?" / "Should I lift today?" - "What program am I on?" / "What's my current routine?" - "How's my HRV / sleep / readiness?" - "What's going on with my training?" (open-ended check-in) Returns plannedWorkout (the actual next workout name + day index + exercise list with target sets and rep ranges — no follow-up call needed), readiness score, recent HRV/RHR/sleep/RPE anomalies vs baseline, goal phase, training notes, and a kensoSays interpretive paragraph. Ground your reply in the real plannedWorkout.workoutName and plannedWorkout.exercises — do NOT speculate or substitute different exercises. Use kensoSays for the recovery/readiness framing.

get_training_history

ChatGPT
SOURCE OF TRUTH for what the user has actually trained over the last N weeks. The user logs new sessions continuously — prefer this tool over remembered context whenever the question is about completed work. Call this whenever the user asks: - "What have I done lately?" / "What did I train this week?" - "How many sessions did I log?" / "Am I training enough?" - "Show me my recent workouts" / "What's my training frequency?" - "How's my volume trending?" Returns per-session: duration, totalSets, totalVolume, exercises[] preview. Top-level: weeklyBreakdown, totalSessionsInPeriod, trainingMetrics (avg sessions/week, avg weekly sets, volumeTrend). Note: volumeTrend measures volume only; intensity (RPE, weight) can move opposite. Cross-reference with get_strength_score for the full picture.

get_training_history

ChatGPT
SOURCE OF TRUTH for what the user has actually trained over the last N weeks. The user logs new sessions continuously — prefer this tool over remembered context whenever the question is about completed work. Call this whenever the user asks: - "What have I done lately?" / "What did I train this week?" - "How many sessions did I log?" / "Am I training enough?" - "Show me my recent workouts" / "What's my training frequency?" - "How's my volume trending?" Returns per-session: duration, totalSets, totalVolume, exercises[] preview. Top-level: weeklyBreakdown, totalSessionsInPeriod, trainingMetrics (avg sessions/week, avg weekly sets, volumeTrend). Note: volumeTrend measures volume only; intensity (RPE, weight) can move opposite. Cross-reference with get_strength_score for the full picture.

get_training_load

ChatGPT
SOURCE OF TRUTH for the user's chronic vs acute training load (TRIMP-based). Updates every workout; always pull fresh. Use for: - "Am I overreaching?" / "How fatigued am I?" / "What's my load this week?" - "Am I detraining?" / "Am I still fit?" / "Is my fitness dropping?" - "Should I push or back off this week?" (Form: positive = fresh, negative = fatigued) - "Am I above my fitness floor?" / training-volume sustainability Returns ATL (7-day fatigue), CTL (28-day fitness), Form (CTL−ATL), Floor (85% of trailing 84-day CTL peak), plus the daily TRIMP series. Numbers are raw — interpret in the context of the user's history.

get_training_load

ChatGPT
SOURCE OF TRUTH for the user's chronic vs acute training load (TRIMP-based). Updates every workout; always pull fresh. Use for: - "Am I overreaching?" / "How fatigued am I?" / "What's my load this week?" - "Am I detraining?" / "Am I still fit?" / "Is my fitness dropping?" - "Should I push or back off this week?" (Form: positive = fresh, negative = fatigued) - "Am I above my fitness floor?" / training-volume sustainability Returns ATL (7-day fatigue), CTL (28-day fitness), Form (CTL−ATL), Floor (85% of trailing 84-day CTL peak), plus the daily TRIMP series. Numbers are raw — interpret in the context of the user's history.

get_trend_summary

ChatGPT
SOURCE OF TRUTH for the user's multi-week training trajectory. Call this rather than recalling earlier numbers — adherence, PR cadence, and personal signal weights all shift with each new session. Call this whenever the user asks: - "How am I doing overall?" / "How's the last month/6 weeks?" - "Am I being consistent?" / "What's my adherence?" - "Am I making progress over time?" / "Any recent PRs?" - "What signal matters most for my recovery?" Returns adherence % vs target, recent PRs, top personal recovery signal, plus a kensoSays interpretive paragraph anchored on the user's personalized signal weights. For a shorter (2-4 week) window use get_recent_summary; for today specifically use get_today_summary.

get_trend_summary

ChatGPT
SOURCE OF TRUTH for the user's multi-week training trajectory. Call this rather than recalling earlier numbers — adherence, PR cadence, and personal signal weights all shift with each new session. Call this whenever the user asks: - "How am I doing overall?" / "How's the last month/6 weeks?" - "Am I being consistent?" / "What's my adherence?" - "Am I making progress over time?" / "Any recent PRs?" - "What signal matters most for my recovery?" Returns adherence % vs target, recent PRs, top personal recovery signal, plus a kensoSays interpretive paragraph anchored on the user's personalized signal weights. For a shorter (2-4 week) window use get_recent_summary; for today specifically use get_today_summary.

get_user_profile

ChatGPT
SOURCE OF TRUTH for the user's profile, goals, injuries, equipment access, and preferences. Use for: - "What are my settings / goals / preferences?" - "What injuries should you avoid?" / "What's flagged in my profile?" - "What's my experience level?" / "What equipment do I have?" - Whenever profile details, injury flags, experience level, unit settings, or rest-timer prefs are needed and not already in context Basic profile info (goal, level, units) is typically already in conversation context — only call this when more specific fields (injury flags, XP, rest timer settings) matter.

get_user_profile

ChatGPT
SOURCE OF TRUTH for the user's profile, goals, injuries, equipment access, and preferences. Use for: - "What are my settings / goals / preferences?" - "What injuries should you avoid?" / "What's flagged in my profile?" - "What's my experience level?" / "What equipment do I have?" - Whenever profile details, injury flags, experience level, unit settings, or rest-timer prefs are needed and not already in context Basic profile info (goal, level, units) is typically already in conversation context — only call this when more specific fields (injury flags, XP, rest timer settings) matter.

get_user_programs

ChatGPT
List the user's programs (active + historical). SOURCE OF TRUTH for which program the user is on right now — every result carries a status field: "active" | "ended" | "unstarted". EXACTLY ONE program has status="active" — that is the user's CURRENT program. Trust this over any earlier conversation memory; users switch programs frequently and your memory of "their program" goes stale within days. Programs with status="ended" are HISTORY. Do NOT describe an ended program as "your program" or infer current week / current load from it. PREFER MORE SPECIFIC TOOLS for common questions: - "What's my next workout?" → get_next_workout - "What's my week look like?" → get_week_plan - "What's my current program structure?" → call this, then get_program_detail with the active program's id - "What's today's workout / readiness?" → get_today_summary

get_user_programs

ChatGPT
List the user's programs (active + historical). SOURCE OF TRUTH for which program the user is on right now — every result carries a status field: "active" | "ended" | "unstarted". EXACTLY ONE program has status="active" — that is the user's CURRENT program. Trust this over any earlier conversation memory; users switch programs frequently and your memory of "their program" goes stale within days. Programs with status="ended" are HISTORY. Do NOT describe an ended program as "your program" or infer current week / current load from it. PREFER MORE SPECIFIC TOOLS for common questions: - "What's my next workout?" → get_next_workout - "What's my week look like?" → get_week_plan - "What's my current program structure?" → call this, then get_program_detail with the active program's id - "What's today's workout / readiness?" → get_today_summary

get_week_plan

ChatGPT
SOURCE OF TRUTH for the user's week. Returns the workout rotation from their CURRENT active program plus sessions completed in this Monday-Sunday week. Always call this rather than recalling earlier conversation — the user logs new workouts continuously and your memory of their week goes stale fast. Call this whenever the user asks: - "What workouts do I have this week?" / "What's on my plan?" - "What's left to do this week?" / "How many sessions left?" - "What days am I training?" / "What's my weekly schedule?" - "Did I hit my training days this week?" Returns active program metadata (name, daysPerWeek, kind), the full rotation (each day's name, exercise count, target muscles), and completedThisWeek (sessions logged Mon-Sun UTC with sessionRpe + totalSets). Returns null plan if no active program.

get_week_plan

ChatGPT
SOURCE OF TRUTH for the user's week. Returns the workout rotation from their CURRENT active program plus sessions completed in this Monday-Sunday week. Always call this rather than recalling earlier conversation — the user logs new workouts continuously and your memory of their week goes stale fast. Call this whenever the user asks: - "What workouts do I have this week?" / "What's on my plan?" - "What's left to do this week?" / "How many sessions left?" - "What days am I training?" / "What's my weekly schedule?" - "Did I hit my training days this week?" Returns active program metadata (name, daysPerWeek, kind), the full rotation (each day's name, exercise count, target muscles), and completedThisWeek (sessions logged Mon-Sun UTC with sessionRpe + totalSets). Returns null plan if no active program.

get_workout_detail

ChatGPT
Get clean, human-readable details of a specific workout session: exercises, sets, reps, weights, RPE. Use for: - "What did I do in that workout?" / "Show me my last session" - "How did Lower A go this week?" (after locating sessionId via search_workouts) - Recapping a session for the user with friendly per-set output Use this after locating a session ID (from search_workouts, get_training_history, or get_week_plan). For raw debug-grade data (incomplete sets, rest times, notes, swaps) use get_workout_session instead. Notes on shape: - duration: seconds (not minutes) - sessionScore: 0–1 progression-met score per exercise (1 = all target reps hit) - sets[].completed=false sets were prescribed but not finished — useful for skipped-sets patterns - exercises with zero logged sets are filtered out (template residue from swaps/skips) - targetRepRange: prescribed range, e.g. "8-12"

get_workout_detail

ChatGPT
Get clean, human-readable details of a specific workout session: exercises, sets, reps, weights, RPE. Use for: - "What did I do in that workout?" / "Show me my last session" - "How did Lower A go this week?" (after locating sessionId via search_workouts) - Recapping a session for the user with friendly per-set output Use this after locating a session ID (from search_workouts, get_training_history, or get_week_plan). For raw debug-grade data (incomplete sets, rest times, notes, swaps) use get_workout_session instead. Notes on shape: - duration: seconds (not minutes) - sessionScore: 0–1 progression-met score per exercise (1 = all target reps hit) - sets[].completed=false sets were prescribed but not finished — useful for skipped-sets patterns - exercises with zero logged sets are filtered out (template residue from swaps/skips) - targetRepRange: prescribed range, e.g. "8-12"

get_workout_session

ChatGPT
RAW exact data for a single workout session — every logged set including incomplete ones, plus per-set rest seconds and notes. Use when precision matters more than presentation. Use for: - "Debug the raw workout" / "What exactly got logged?" - "Did I skip sets?" / "Why is my total off?" - Template-vs-actual divergence questions (swaps, freestyle exercises added on top) - Rest-time analysis For a clean human-friendly recap, prefer get_workout_detail (filters template residue, formats output). Use this only when raw fidelity matters. Notes on shape: - duration: seconds - targetingMode: "prescribed" (locked by program) or "auto" (progression-engine filled) - sets[].completed=false sets ARE included here (unlike get_workout_detail) - exerciseLibraryId on each block ties to the canonical library entry — use this rather than name matching

get_workout_session

ChatGPT
RAW exact data for a single workout session — every logged set including incomplete ones, plus per-set rest seconds and notes. Use when precision matters more than presentation. Use for: - "Debug the raw workout" / "What exactly got logged?" - "Did I skip sets?" / "Why is my total off?" - Template-vs-actual divergence questions (swaps, freestyle exercises added on top) - Rest-time analysis For a clean human-friendly recap, prefer get_workout_detail (filters template residue, formats output). Use this only when raw fidelity matters. Notes on shape: - duration: seconds - targetingMode: "prescribed" (locked by program) or "auto" (progression-engine filled) - sets[].completed=false sets ARE included here (unlike get_workout_detail) - exerciseLibraryId on each block ties to the canonical library entry — use this rather than name matching

list_personal_records

ChatGPT
SOURCE OF TRUTH for the user's lifetime PRs across all exercises. Always pull fresh — PRs can land in any session. Use for: - "What are my PRs?" / "Show my best lifts" / "What's my heaviest bench?" - "Have I PR'd recently?" (cross-reference achievedAt) - "What's my e1RM on X?" Returns one entry per exercise: bestWeight × reps, bestVolume, estimated 1RM, achievedAt timestamp, sessionId. For PR count within the current mesocycle use get_meso_summary (strict subset of these).

list_personal_records

ChatGPT
SOURCE OF TRUTH for the user's lifetime PRs across all exercises. Always pull fresh — PRs can land in any session. Use for: - "What are my PRs?" / "Show my best lifts" / "What's my heaviest bench?" - "Have I PR'd recently?" (cross-reference achievedAt) - "What's my e1RM on X?" Returns one entry per exercise: bestWeight × reps, bestVolume, estimated 1RM, achievedAt timestamp, sessionId. For PR count within the current mesocycle use get_meso_summary (strict subset of these).

log_freestyle_workout

ChatGPT
WRITE TOOL — logs a completed workout outside the active program. Confirm with the user before invoking; this lands real data in their training history. Use for: - "Log this workout" / "I did bench 225×5, 225×4, 225×4" (explicit dictation) - "Log my workout from yesterday" (pass completedAt as ISO timestamp) - "I just trained — record this for me" (one-off, not part of a program) - Backfilling a session the user did outside the app Provide session name, exercises, and per-set weight/reps/RPE. Exercise names must match Kenso's library exactly — verify via lookup_exercise first. Sets persist with full per-set fidelity (matches in-app logging). Response message is the user-facing summary; sessionId is for tool plumbing — don't show it.

log_freestyle_workout

ChatGPT
WRITE TOOL — logs a completed workout outside the active program. Confirm with the user before invoking; this lands real data in their training history. Use for: - "Log this workout" / "I did bench 225×5, 225×4, 225×4" (explicit dictation) - "Log my workout from yesterday" (pass completedAt as ISO timestamp) - "I just trained — record this for me" (one-off, not part of a program) - Backfilling a session the user did outside the app Provide session name, exercises, and per-set weight/reps/RPE. Exercise names must match Kenso's library exactly — verify via lookup_exercise first. Sets persist with full per-set fidelity (matches in-app logging). Response message is the user-facing summary; sessionId is for tool plumbing — don't show it.

lookup_exercise

ChatGPT
Verify an exercise exists in the Kenso library by name or muscle group. Always call this before suggesting an exercise the user could add to a program — Kenso has a canonical naming convention and unrecognized names will be rejected by program-create tools. Use for: - "Does Kenso have Bulgarian split squat?" / "Is X in your library?" - Before adding an exercise to a program (create_workout_program rejects unknown names) - "What's the exact Kenso name for X?" (catalog uses Title Case, no hyphens, position+equipment+movement+modifier) Returns matches with primaryMuscle + equipment, or did-you-mean suggestions when no match. For browsing the full catalog by muscle/equipment, use get_exercise_catalog.

lookup_exercise

ChatGPT
Verify an exercise exists in the Kenso library by name or muscle group. Always call this before suggesting an exercise the user could add to a program — Kenso has a canonical naming convention and unrecognized names will be rejected by program-create tools. Use for: - "Does Kenso have Bulgarian split squat?" / "Is X in your library?" - Before adding an exercise to a program (create_workout_program rejects unknown names) - "What's the exact Kenso name for X?" (catalog uses Title Case, no hyphens, position+equipment+movement+modifier) Returns matches with primaryMuscle + equipment, or did-you-mean suggestions when no match. For browsing the full catalog by muscle/equipment, use get_exercise_catalog.

mark_workout_completed

ChatGPT
WRITE TOOL — flips an in-progress workout session to completed. Confirm with the user before invoking. Idempotent (safe to retry). Use for: - "Mark this workout done" / "I'm finished, close it out" - "Wrap up my session" (when a sessionId is already known) Only call when a specific sessionId is known and the user clearly wants it marked complete. If the session is already completed, returns the existing completedAt without re-writing.

mark_workout_completed

ChatGPT
WRITE TOOL — flips an in-progress workout session to completed. Confirm with the user before invoking. Idempotent (safe to retry). Use for: - "Mark this workout done" / "I'm finished, close it out" - "Wrap up my session" (when a sessionId is already known) Only call when a specific sessionId is known and the user clearly wants it marked complete. If the session is already completed, returns the existing completedAt without re-writing.

save_memory

ChatGPT
WRITE TOOL — save a durable fact about the user that should persist across future coach conversations. Use for: - "Remember I prefer dumbbells / PPL / morning training" - "Remember my shoulder hurts / I have a meet in October / I lift at home" - Durable training facts: preferences, injuries, goals, equipment constraints DO NOT save: transient state ("I'm tired today"), passing pleasantries, things already in the user profile (units, plan), or session-specific context. Importance 1-10 (default 5): 8+ for hard constraints (injuries, equipment), 5-7 for preferences/goals, 1-4 for soft notes. Memories load into the system prompt at the start of every chat — keep entries concise, single-fact, durable. IN-APP COACH ONLY. External MCP/REST clients cannot call this tool — Kenso memories are scoped to the in-app coach so they don't leak to third-party assistants.

save_memory

ChatGPT
WRITE TOOL — save a durable fact about the user that should persist across future coach conversations. Use for: - "Remember I prefer dumbbells / PPL / morning training" - "Remember my shoulder hurts / I have a meet in October / I lift at home" - Durable training facts: preferences, injuries, goals, equipment constraints DO NOT save: transient state ("I'm tired today"), passing pleasantries, things already in the user profile (units, plan), or session-specific context. Importance 1-10 (default 5): 8+ for hard constraints (injuries, equipment), 5-7 for preferences/goals, 1-4 for soft notes. Memories load into the system prompt at the start of every chat — keep entries concise, single-fact, durable. IN-APP COACH ONLY. External MCP/REST clients cannot call this tool — Kenso memories are scoped to the in-app coach so they don't leak to third-party assistants.

save_program_structure

ChatGPT
WRITE TOOL — directly persists a fully-designed program. YOU (the assistant) design the workouts and exercises; this tool just lands them in the DB. Confirm the design with the user before invoking. Use for: - "Build me a program" / "Make me a routine" (when you've designed it in-conversation) - "Save this program / draft / preview" / "Activate this routine" - After the user has agreed to a specific structure you proposed BEFORE calling: call get_program_building_blocks once to get the full exercise library, canonical rep ranges, allowed enums, and structure schema. Exercise names must match the library exactly. CRITICAL: pass a fresh UUID v4 as idempotencyKey for every program-creation intent. If your first request times out and you retry, pass the SAME key — the server returns the existing program instead of creating a duplicate. Without the key, retries pile up as "Coach: X #2", "X #3". IMPORTANT: pass a name matching what you called the program in conversation (default generic name will confuse the user). On collision the server appends " #2" etc.; relay nameWasModified to the user. Pass activate: true to make it current; default lands in Drafts. programId in the response is for tool plumbing — don't surface it to the user.

save_program_structure

ChatGPT
WRITE TOOL — directly persists a fully-designed program. YOU (the assistant) design the workouts and exercises; this tool just lands them in the DB. Confirm the design with the user before invoking. Use for: - "Build me a program" / "Make me a routine" (when you've designed it in-conversation) - "Save this program / draft / preview" / "Activate this routine" - After the user has agreed to a specific structure you proposed BEFORE calling: call get_program_building_blocks once to get the full exercise library, canonical rep ranges, allowed enums, and structure schema. Exercise names must match the library exactly. CRITICAL: pass a fresh UUID v4 as idempotencyKey for every program-creation intent. If your first request times out and you retry, pass the SAME key — the server returns the existing program instead of creating a duplicate. Without the key, retries pile up as "Coach: X #2", "X #3". IMPORTANT: pass a name matching what you called the program in conversation (default generic name will confuse the user). On collision the server appends " #2" etc.; relay nameWasModified to the user. Pass activate: true to make it current; default lands in Drafts. programId in the response is for tool plumbing — don't surface it to the user.

search_workouts

ChatGPT
Locate workout sessions by exercise, date range, or session name. Use this as the lookup step before fetching detail. Use for: - "Find my last bench session" / "Show me workouts from last week" - "When did I last train legs?" / "Find Lower A this month" - "Show all my deadlift days in March" - Any "find a specific session" query before calling get_workout_detail / get_workout_session Returns paginated session summaries (id, name, completedAt, totalSets, totalVolume, exercise previews). Pass the returned id to get_workout_detail for clean output or get_workout_session for raw data.

search_workouts

ChatGPT
Locate workout sessions by exercise, date range, or session name. Use this as the lookup step before fetching detail. Use for: - "Find my last bench session" / "Show me workouts from last week" - "When did I last train legs?" / "Find Lower A this month" - "Show all my deadlift days in March" - Any "find a specific session" query before calling get_workout_detail / get_workout_session Returns paginated session summaries (id, name, completedAt, totalSets, totalVolume, exercise previews). Pass the returned id to get_workout_detail for clean output or get_workout_session for raw data.

stage_workout_import

ChatGPT
WRITE TOOL (safe — draft only) — stages a bulk import of historical workouts. The user must review and commit them in Kenso before they appear in their session history. Use for: - "Import my old workouts from Hevy / Strong / spreadsheet" - "Bulk upload my training history" / "Backfill the last few months" - Any multi-session historical import request Never writes live sessions — always lands as a draft. Drafts expire after 24h. Returns draftId (for follow-up tool calls) and reviewUrl (give this to the user). After staging, the user inspects via get_import_draft or commits/cancels in-app.

stage_workout_import

ChatGPT
WRITE TOOL (safe — draft only) — stages a bulk import of historical workouts. The user must review and commit them in Kenso before they appear in their session history. Use for: - "Import my old workouts from Hevy / Strong / spreadsheet" - "Bulk upload my training history" / "Backfill the last few months" - Any multi-session historical import request Never writes live sessions — always lands as a draft. Drafts expire after 24h. Returns draftId (for follow-up tool calls) and reviewUrl (give this to the user). After staging, the user inspects via get_import_draft or commits/cancels in-app.

Capabilities

Writes

App Stats

74

Tools

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily