aim
Chat forgets your training, AIm doesn't.
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.
How to connect
How to connect aim to Claude
The server address to paste into Claude settings:
https://aim--aim-journal.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect aim to ChatGPT
The server address to paste into ChatGPT settings:
https://aim--aim-journal.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect aim to Cursor
The server address to paste into Cursor settings:
https://aim--aim-journal.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
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. |