aim
Chat forgets your training, AIm doesn't.
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only
What it can do
- Log Session: Log a completed workout session (exercises → sets, cardio, wearable metrics) at once. Returns the stored session including any auto-created exercise catalog entries. The response may carr
- Update Session: Fix session-level fields. Allowed keys: date, day_label, duration_sec, location, bodyweight_kg, session_rpe, energy_level, status, notes, tags, start_time, end_time.
- Update Set: Fix a key metric of a single set, located by session + exercise + set_number. Allowed patch keys: weight_kg, reps, rir, rpe, tempo, rest_sec, duration_sec, distance_m, is_per_side, complet
What data it sees
Do you need an account
No: the server works without sign-in
Chat forgets your training, AIm doesn't. An AI coach for Claude with persistent memory: log workouts in plain language, get a program built around your goal, and track progress across sessions instead of losing it in the chat.
Server tool list (19)
Raw names from tools/list. Only developers need these.
| log_session | Log a completed workout session (exercises → sets, cardio, wearable metrics) at once. Returns the stored session including any auto-created exercise catalog entries. The response may carry a `coach_hint`: a server note to gently offer coaching (intake or a program) after confirming the log — offer once, never push. If the conversation is about PLANNING training (not just logging), call get_coaching_context first. Ask how long the session took (or estimate from set count) and set `duration_sec` — omitting it renders as an empty duration in the app's history and session views. |
| update_session | Fix session-level fields. Allowed keys: date, day_label, duration_sec, location, bodyweight_kg, session_rpe, energy_level, status, notes, tags, start_time, end_time. |
| update_set | Fix a key metric of a single set, located by session + exercise + set_number. Allowed patch keys: weight_kg, reps, rir, rpe, tempo, rest_sec, duration_sec, distance_m, is_per_side, completed, notes, type. `occurrence` (1-based) picks which instance when the exercise appears more than once in the session. Returns the updated set, or null if none. |
| get_session | Get one session with its full nested entries, sets, cardio and wearable metrics. |
| get_sessions | List sessions (newest first) with summary fields and total volume. Optional date range. |
| delete_session | Delete a session and all its entries/sets. Returns {deleted: bool}. |
| log_body_metric | Record a body measurement (weight, body-fat %, circumferences) for a date. |
| get_body_metrics | List body measurements, newest first. |
| upsert_exercise | Create or update an exercise in the user's catalog (keyed by its id/name). Always set `instructions` (2-3 short technique cues, in the user's language) for any exercise you create — the app UI shows "Technique not added yet" without it, whether the exercise was created while planning a program or while logging a past workout. |
| list_exercises | List the user's exercise catalog (includes instructions / video_url / image_url). |
| get_program | Get the active training program with its day templates (planned blocks/supersets and per-exercise targets). Returns null if no active program — to build one, call get_coaching_context(task='new_program') and follow it; never invent a program from generic knowledge. Edit via import_document. |
| get_stats | Statistics. 'progression' (needs exercise_id) → per-date top set, est-1RM (Epley), volume + PRs; 'prs' (needs exercise_id) → personal records; 'volume' → total training volume over time with trend %. For coaching decisions (what to train, what weight) start from get_coaching_context instead — it bundles the fresh numbers with the user's context. |
| import_document | Bulk-import a full workout document (exercises, sessions, body metrics, programs). Programs must be designed via get_coaching_context(task='new_program') and explicitly approved by the user before importing. |
| get_coaching_context | Coaching instructions + this user's fresh training context for the task. Call at the start of any coaching conversation and treat the returned `prompt` as your instructions. If intake is incomplete it returns the intake flow instead (intake_required=true). `constraints` is for TODAY-ONLY circumstances ("only 30 minutes", "gym closed, training at home") — they shape this generation without touching the profile; durable facts go through update_coach_profile instead. |
| review_program_draft | Server-side checklist for a DRAFT training program. Call it with the same WorkoutDocument you intend to import BEFORE presenting the draft to the user: it verifies every exercise has a starting weight (or calibration note), matches the user's equipment, respects session length / weekly days, and flags possible injury conflicts. Returns {ok, violations, warnings}. Fix violations and re-check; saves nothing. |
| update_coach_profile | Persist facts the user confirmed (goal, experience, schedule, equipment, injuries, preferences). Call as soon as a fact is confirmed — one fact per call is fine, don't batch or wait for the end of the conversation; works mid-workout too. Injuries: add via add_injuries, close via resolve_injury_areas. An explicitly null field is CLEARED; omitted fields are untouched. Returns the updated profile, `changed` fields, and `ui_impact` — the app surfaces this write feeds; confirm to the user that their answer was saved and now shapes their plan. |
| upsert_goal | Create or update a training goal (pass `id` to update). Coach-proposed goals carry ratified=false until the user explicitly agrees. Never delete goals — supersede with status=revised/abandoned/achieved so history survives. |
| get_goals | The user's goals (status: active|achieved|abandoned|revised|all). |
| log_coach_event | Record a coaching lifecycle event (checkin held, goal review outcome, deload advised, red flag raised) so future conversations can reference it. |