AIm
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| log_sessionA | 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 |
| update_sessionA | 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_setA | 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. |
| get_sessionA | Get one session with its full nested entries, sets, cardio and wearable metrics. |
| get_sessionsA | List sessions (newest first) with summary fields and total volume. Optional date range. |
| delete_sessionA | Delete a session and all its entries/sets. Returns {deleted: bool}. |
| log_body_metricA | Record the user's body weight, body-fat % or circumferences for one day.
Use it whenever the user states a current measurement; training goes to log_session,
and reading measurements back is get_body_metrics. The app's weight tile and charts
and the coaching context read these entries, not the profile's bodyweight field.
One entry per date, and recording the same date again ADDS to it: send only what the
user just told you. Fields you leave out keep their stored value, new |
| get_body_metricsA | List body measurements, newest first. |
| upsert_exerciseA | Create or update an exercise in the user's catalog (keyed by its id/name).
Prefer a pool exercise: call search_exercise_pool first and pass its |
| search_exercise_poolA | Search the curated global exercise pool — THE place to pick exercises from when
building a program or a workout. Filter by |
| list_exercisesA | List THIS USER's own exercise catalog — what they have actually trained, with their
logged metadata (instructions / video_url / image_url / pool_slug). Optional filters:
|
| get_programA | 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_statsA | Statistics for ONE exercise, or for training as a whole. exercise_id is REQUIRED for kind='progression' and kind='prs' (they are per-exercise) and is ignored for kind='volume' (whole-training-volume over time). Calling progression/prs without it is an error, not a whole-library default — if the user did not name an exercise, pick its id from list_exercises first, or use kind='volume'. 'progression' → per-date top set, est-1RM (Epley), volume + PRs; 'prs' → 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_documentA | 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. Any active program in the document is validated server-side (the same checklist as review_program_draft) before anything is saved; a response with ok=false and a violations list means nothing was written — fix each one and call import_document again. |
| get_coaching_contextA | Coaching instructions + this user's fresh training context for the task. Call at the
start of any coaching conversation and treat the returned |
| review_program_draftA | 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_profileA | 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, |
| upsert_goalA | Create or update a training goal (pass Any exercise_id MUST be an id from the user's catalog (check list_exercises; create via upsert_exercise first if genuinely new) — unknown ids are rejected, and a synonymous duplicate would split the exercise's history. Set review_date on every ratified goal (~4 weeks out, or the deadline if sooner) so check-ins have an anchor; calibrate milestone targets ~5-10% beyond the user's current number for an 8-12 week horizon. Set featured=true on the ONE goal that should be the user's single featured goal in the app — this automatically un-features any other active goal. Never set featured on a frequency goal (the server rejects it); those live in the adherence widget only, never the featured-goal card. When a milestone looks achieved, don't silently transition it — tell the user and ask whether to keep maintaining that level or set a new target, then call upsert_goal twice: mark the old goal status=achieved (also set featured=false, though the server defends this too) and create the new goal with supersedes_goal_id=<old goal's id> and featured=true. This is a decision the user makes with you in conversation, never something the app decides on its own. Coach-proposed goals carry ratified=false until the user explicitly agrees. Never delete goals — supersede with status=revised/abandoned/achieved so history survives. |
| get_goalsA | The user's goals (status: active|achieved|abandoned|revised|all). |
| log_coach_eventA | Append a dated milestone to the user's coaching history: a check-in held, a goal reviewed or achieved, a deload advised, a red flag raised, intake started or finished, the profile changed. Call it at the end of the step the coaching prompt names (for example type='checkin' after a check-in), not for ordinary chat, logged workouts (log_session) or goal edits themselves (upsert_goal). Each call adds a new entry, so do not repeat one. The history is kept with the user's data export; no tool reads it back, so it does not replace saving facts through update_coach_profile or upsert_goal. Returns the stored event. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| next_workout | Plan today's workout with the AIm coach |
| new_program | Build a full training program with the AIm coach |
| weekly_review | Review this training week with the AIm coach |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
Each tool targets a distinct resource/action: logging vs reading vs updating sessions, body metrics, exercises, programs, goals, and coaching context. Close neighbors like search_exercise_pool vs list_exercises and get_stats vs get_coaching_context are explicitly differentiated in their descriptions.
Tool names follow a consistent verb-first snake_case convention: log_*, get_*, update_*, upsert_*. Exceptions like import_document, review_program_draft, and search_exercise_pool still follow the verb_noun pattern and do not break the overall consistency.
20 tools is above the typical lean range, but the coaching/training domain is broad—covering sessions, body metrics, exercises, programs, goals, coaching context, and stats—and each tool has a distinct job. It is slightly heavy but not bloated.
Core workflows are covered: log/read/update/delete sessions, log/read body metrics, create/search/list exercises, get/create programs, manage goals and coach profile, plus stats and import/review. Minor gaps exist (no delete for body metrics, no read-back for coaching events, no dedicated single-exercise fetch), but agents can work around them.