dev.anatome/anatome
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Log workouts and meals by telling your AI. 873 exercises, muscle diagrams, food lookup.
| Author | dev.anatome |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 3003 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"anatome": {
"url": "https://anatome.dev/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (36)
search_exercisesread-onlySearch 873 exercises by name with muscle/equipment/level filters. Rows are lean (name, ext_id, equipment, level, muscles) — enough to pick one; get_exercise returns instructions and media. Paginates: pass next_cursor back as `cursor`.
Parameters:
q(required) — stringlevel— stringlimit— numbercursor— string — next_cursor from the previous response. Omit for the first page.fields— string — Extra fields, comma-separated, or `all`.muscle— stringequipment— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
get_exerciseread-onlyFetch one exercise by name, id, or random.
Parameters:
id— stringname— stringrandom— boolean
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
resolve_exerciseread-onlyResolve an exercise name into primary/secondary muscle layers for rendering.
Parameters:
exercise(required) — string
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
list_musclesread-onlyList all 23 supported muscle slugs with anatomical names.
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
generate_muscle_imageRender an SVG diagram of the human body with muscles highlighted in arbitrary colors. Returns SVG.
Parameters:
layers(required) — arrayview— stringgender— string
Hints: read-only no · destructive no · idempotent no · open-world yes
list_routinesread-onlyBrowse the curated workout routine library (PPL, upper/lower, full-body, 5x5, etc.). Filter by difficulty, goal, split_type, days_per_week. Returns minimal list.
Parameters:
goal— stringlimit— numberdifficulty— stringsplit_type— stringdays_per_week— number
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
get_routineread-onlyFetch a single curated routine by slug with all days + slots fully expanded (exercises, sets, reps ranges, rest, superset groupings). The 'give me a full program' tool.
Parameters:
slug(required) — string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
instantiate_routineSchedule the signed-in user's routine into planned workouts from start_date. Coach assignment of another user is REST-only.
Parameters:
routine_id(required) — stringstart_date(required) — string — YYYY-MM-DDcadence_days— numberidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
search_foodsread-onlySearch food products by name (Open Food Facts + USDA). Returns macros per 100g.
Parameters:
q(required) — stringlocale— stringpage_size— number
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
lookup_barcoderead-onlyLookup a food product by EAN/UPC barcode.
Parameters:
barcode(required) — string
Hints: read-only yes · destructive not declared · idempotent yes · open-world yes
log_workoutLog a workout with exercise sets (strength or cardio unified). Requires an app user context.
Parameters:
date(required) — stringsets— arraytitle— stringprimary_sport— stringidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
get_workoutsread-onlyList the current app user's workouts (most recent first).
Parameters:
limit— numberdate_to— stringdate_from— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
log_mealLog a meal (calories + macros + optional ingredients) for the current app user.
Parameters:
date(required) — stringname(required) — stringcalories(required) — numberfats— numbercarbs— numberprotein— numbermeal_type— stringidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
get_mealsread-onlyList the current app user's meals for a date range.
Parameters:
date_to— stringdate_from— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
log_waterLog water intake (ml) for the current app user.
Parameters:
date(required) — stringamount_ml(required) — numberidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
log_body_metricLog a body measurement. metric_type: weight (kg), height (cm), body_fat (%), muscle_mass (kg), waist/chest/bicep/forearm/hip/thigh/calf/neck/shoulder (cm), bmi, resting_hr (bpm). Logging weight enables bodyweight-inclusive volume analytics.
Parameters:
date(required) — stringmetric_type(required) — stringvalue(required) — numberunit(required) — stringnotes— stringidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
get_body_metricsread-onlyList the current app user's body metrics / measurements (weight, height, bicep, body fat, etc.), most recent first. Filter by metric_type (e.g. 'weight', 'bicep') and/or a date range. Requires an app user context.
Parameters:
to— stringfrom— stringlimit— numbermetric_type— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
upsert_profileUpsert the current app user's fitness profile. Set `timezone` first: every daily total, streak and adherence window is bucketed by it and defaults to UTC. `weight` doubles as the fallback bodyweight for bodyweight-inclusive volume when no dated weight metric exists.
Parameters:
goal— stringheight— number — cmweight— number — kglanguage— stringtimezone— string — IANA zone name, e.g. 'Europe/Warsaw'.diet_type— stringunit_system— stringactive_sports— arraymeals_per_day— numberdaily_fats_goal— numberdaily_carbs_goal— numberdaily_fiber_goal— number — g/day to reachdaily_sugar_limit— number — g/day to stay underdaily_calorie_goal— numberdaily_protein_goal— numberdaily_sodium_limit— number — mg/day to stay underdaily_water_goal_ml— number
Hints: read-only no · destructive no · idempotent yes · open-world no
get_profileread-onlyGet the current app user's fitness profile (height, weight, macro + water goals, diet, active sports). Requires an app user context.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
log_cardioLog a cardio activity (run/bike/swim/etc.) for the current app user. Supports duration, distance, HR, power, calories.
Parameters:
date(required) — stringsport(required) — stringnotes— stringtitle— stringavg_hr— numbercalories— numberdistance_m— numberidempotency_key— stringduration_seconds— number
Hints: read-only no · destructive no · idempotent no · open-world no
get_cardio_activitiesread-onlyList the current app user's cardio activities (most recent first).
Parameters:
limit— numberdate_to— stringdate_from— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
ai_parse_mealParse free-text meal description ('2 eggs and toast with butter') into structured items with grams + macros.
Parameters:
text(required) — stringlocale— string
Hints: read-only no · destructive no · idempotent no · open-world yes
ai_photo_macrosAnalyze a meal image and estimate foods + macros. Pass exactly one of image_url or image_base64. Vision model, capped separately from the text AI budget (free tier 1/mo).
Parameters:
image_url— string — Public URL of the image. Mutually exclusive with image_base64.image_base64— string — Base64-encoded image bytes, no data: prefix. Mutually exclusive with image_url.
Hints: read-only no · destructive no · idempotent no · open-world yes
ai_meal_planDraft a meal plan. Not medical advice. confirm:true required. Pass health constraints so the draft can honour them.
Parameters:
days(required) — numberconfirm(required) — booleangoal— stringhealth— objectdiet_type— stringdaily_calories— number
Hints: read-only no · destructive no · idempotent no · open-world yes
ai_workout_planDraft a workout plan. Not medical advice. confirm:true required. Pass health constraints so the draft can honour them.
Parameters:
days_per_week(required) — numberconfirm(required) — booleangoal— stringhealth— objectexperience— string
Hints: read-only no · destructive no · idempotent no · open-world yes
get_muscle_recoveryread-onlyPer-muscle 7-day recovery % (Fitbod parity) — the 'what should I train today?' input. Recommends fresh muscles. Pass include_bodyweight=true to add the user's bodyweight to bodyweight exercises so recovery reflects real load.
Parameters:
include_bodyweight— boolean — If true, add the user's bodyweight to bodyweight exercises (requires a logged weight or profile.weight).
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
get_nutrition_dailyread-onlyPer-day calories, macros, fiber/sugar/sodium/alcohol, water, targets and adherence % over a date range (default: last 7 days). The 'how am I tracking today?' tool. Requires X-App-User-Id.
Parameters:
date_to— string — YYYY-MM-DD (defaults to the user's today, in their timezone)date_from— string — YYYY-MM-DD
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
get_waterread-onlyList the current app user's water intake entries for a date range. Requires X-App-User-Id.
Parameters:
date— stringdate_to— stringdate_from— string
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
update_mealCorrect a previously logged meal — name, macros, nutrients, portion, date or meal_type. Pass only the fields you want to change. Requires X-App-User-Id.
Parameters:
meal_id(required) — stringdate— stringfats— numbername— stringcarbs— numberfiber— numbersugar— numbersodium— number — mgalcohol— number — g of ethanolprotein— numbercalories— numbermeal_type— stringsaturated_fat— numberidempotency_key— string
Hints: read-only no · destructive no · idempotent no · open-world no
delete_mealdestructiveDelete a logged meal by id (soft delete, 30-day recovery window). Requires X-App-User-Id.
Parameters:
meal_id(required) — string
Hints: read-only no · destructive yes · idempotent no · open-world no
update_setsdestructiveCorrect sets already logged, by set id (log_workout returns them). Relabel the exercise, fix weight/reps/rpe, mark completed, add notes, or delete. Selection and change are separate, so a subset can be relabelled. Adding a set is log_workout, not this.
Parameters:
set_ids(required) — arrayrpe— numberreps— numbernotes— stringdelete— booleanweight— numberexercise— string — Catalog name, ext_id, or the user's own words for a custom movement.completed— boolean
Hints: read-only no · destructive yes · idempotent no · open-world no
delete_workoutdestructiveDelete a logged workout and its sets by id (soft delete, 30-day recovery window).
Parameters:
workout_id(required) — string
Hints: read-only no · destructive yes · idempotent no · open-world no
export_dataread-onlyExport the signed-in user's data as JSON. Pass `domains` (e.g. meals,workouts) or confirm:true for a full copy. Identity comes from the token, never a caller-supplied user id.
Parameters:
confirm— boolean — Required true for a full dump when domains is omitted.domains— string — Comma-separated subset, e.g. 'meals,workouts'.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
get_eventsread-onlyWhat changed since a cursor, including DELETES, which a list read cannot show. Returns {seq, entity, id, action}. Pass the last seq back as `since` on the next call to receive only entries after it; omit `since` for a first sync. seq is a global counter: gaps in your feed are other accounts' events, not lost data. Judge completeness from has_more, not seq.
Parameters:
limit— numbersince— string — Cursor from the previous call's last seq. Omit for a first sync.entities— string — Optional comma-separated filter, e.g. 'workout,meal'.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
my_training_contextread-onlyReturns a slice of the signed-in user's training picture. Default domains are workouts and today's nutrition. Pass `domains` to add checkin, notes or profile, or `domains=all`. Identity comes from the token, not a caller-supplied user id.
Parameters:
domains— string — Comma-separated subset. Accepted: workouts, nutrition, checkin, notes, profile, or 'all'. Default: workouts,nutrition.workout_limit— number
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
get_progressread-onlyAny progression metric for the current user — pick one in `metric`. training_load is acute:chronic (>1.5 ramping too fast, <0.8 detraining); muscle_recovery is per-muscle freshness; correlate takes metric_a vs metric_b. Only completed sets count.
Parameters:
metric(required) — stringto— string — YYYY-MM-DDdays— number — training_load windowfrom— string — YYYY-MM-DDsport— string — training_load and cardio_prsbucket— stringmethod— string — training_load: auto | power | hr | rpewindow— number — weight_trend smoothing windowgoal_id— string — goal_trajectoryexercise— string — Required for prs; optional filter for volume, one_rep_max and compare_periods.group_by— string — volume onlymetric_a— string — correlatemetric_b— string — correlateinclude_bodyweight— boolean — Add the user's bodyweight to bodyweight exercises (pull-ups, dips). prs, volume and muscle_recovery.
Hints: read-only yes · destructive not declared · idempotent yes · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.