dev. anatome/ anatome
by anatome.dev · remote · no sign-in to list tools · v2.6.0 · published by dev.anatome
Log workouts and meals by telling your AI. 873 exercises, muscle diagrams, food lookup.
36 tools: 3 can delete or cancel things, 14 change things and 19 only read.
Scanned Oct 21, 2026
- Deletes or cancels3Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things14Claude Code: ask: see these tools
- Only reads19Claude Code: allow: see these tools
6 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http anatome https://anatome.dev/mcpFindings
Matches of fixed checks, with the text they matched.
- Warnlog_workout
The server marks "log_workout" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_workout" says "log": a word for reading.
- Warnlog_meal
The server marks "log_meal" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_meal" says "log": a word for reading.
- Warnlog_water
The server marks "log_water" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_water" says "log": a word for reading.
- Warnlog_body_metric
The server marks "log_body_metric" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_body_metric" says "log": a word for reading.
- Warnlog_cardio
The server marks "log_cardio" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_cardio" says "log": a word for reading.
- Warnai_photo_macros
The server marks "ai_photo_macros" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "analyze": a word for reading.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
36 tools
Deletes or cancels 3Claude Code: deny
delete_mealDelete a logged meal by id (soft delete, 30-day recovery window).No findings
Why it is in this group
- The name "delete_meal" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a logged meal by id (soft delete, 30-day recovery window). Requires X-App-User-Id.
Annotations the server declares
- title: Delete meal
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
delete_workoutDelete a logged workout and its sets by id (soft delete, 30-day recovery window).No findings
Why it is in this group
- The name "delete_workout" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Delete a logged workout and its sets by id (soft delete, 30-day recovery window).
Annotations the server declares
- title: Delete workout
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
update_setsCorrect sets already logged, by set id (log_workout returns them).No findings
Why it is in this group
- The name "update_sets" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Correct 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.
Annotations the server declares
- title: Update sets
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
Changes things 14Claude Code: ask
ai_meal_planDraft a meal plan.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Draft a meal plan. Not medical advice. confirm:true required. Pass health constraints so the draft can honour them.
Annotations the server declares
- title: Ai meal plan
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
ai_parse_mealParse free-text meal description ('2 eggs and toast with butter') into structured items with grams + macros.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Parse free-text meal description ('2 eggs and toast with butter') into structured items with grams + macros.
Annotations the server declares
- title: Ai parse meal
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
ai_photo_macrosAnalyze a meal image and estimate foods + macros.1 finding
Why it is in this group
- The description's first verb is "analyze": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "ai_photo_macros" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "analyze": a word for reading.
Description, as the server wrote it Analyze 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).
Annotations the server declares
- title: Ai photo macros
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
ai_workout_planDraft a workout plan.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Draft a workout plan. Not medical advice. confirm:true required. Pass health constraints so the draft can honour them.
Annotations the server declares
- title: Ai workout plan
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
export_dataExport the signed-in user's data as JSON.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Export 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.
Annotations the server declares
- title: Export data
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
generate_muscle_imageRender an SVG diagram of the human body with muscles highlighted in arbitrary colors.No findings
Why it is in this group
- The name "generate_muscle_image" says "generate": a word for a change.
Description, as the server wrote it Render an SVG diagram of the human body with muscles highlighted in arbitrary colors. Returns SVG.
Annotations the server declares
- title: Generate muscle image
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
instantiate_routineSchedule the signed-in user's routine into planned workouts from start_date.No findings
Why it is in this group
- The description's first verb is "schedule": a word for a change.
Description, as the server wrote it Schedule the signed-in user's routine into planned workouts from start_date. Coach assignment of another user is REST-only.
Annotations the server declares
- title: Instantiate routine
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
log_body_metricLog a body measurement.1 finding
Why it is in this group
- The name "log_body_metric" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "log_body_metric" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_body_metric" says "log": a word for reading.
Description, as the server wrote it Log 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.
Annotations the server declares
- title: Log body metric
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
log_cardioLog a cardio activity (run/bike/swim/etc.) for the current app user.1 finding
Why it is in this group
- The name "log_cardio" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "log_cardio" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_cardio" says "log": a word for reading.
Description, as the server wrote it Log a cardio activity (run/bike/swim/etc.) for the current app user. Supports duration, distance, HR, power, calories.
Annotations the server declares
- title: Log cardio
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
log_mealLog a meal (calories + macros + optional ingredients) for the current app user.1 finding
Why it is in this group
- The name "log_meal" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "log_meal" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_meal" says "log": a word for reading.
Description, as the server wrote it Log a meal (calories + macros + optional ingredients) for the current app user.
Annotations the server declares
- title: Log meal
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
log_waterLog water intake (ml) for the current app user.1 finding
Why it is in this group
- The name "log_water" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "log_water" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_water" says "log": a word for reading.
Description, as the server wrote it Log water intake (ml) for the current app user.
Annotations the server declares
- title: Log water
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
log_workoutLog a workout with exercise sets (strength or cardio unified).1 finding
Why it is in this group
- The name "log_workout" says "log": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
Findings
- Warn
The server marks "log_workout" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_workout" says "log": a word for reading.
Description, as the server wrote it Log a workout with exercise sets (strength or cardio unified). Requires an app user context.
Annotations the server declares
- title: Log workout
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
update_mealCorrect a previously logged meal — name, macros, nutrients, portion, date or meal_type.No findings
Why it is in this group
- The name "update_meal" says "update": a word for a change.
Description, as the server wrote it Correct 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.
Annotations the server declares
- title: Update meal
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: false
upsert_profileUpsert the current app user's fitness profile.No findings
Why it is in this group
- The name "upsert_profile" says "upsert": a word for a change.
Description, as the server wrote it Upsert 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.
Annotations the server declares
- title: Upsert profile
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
Only reads 19Claude Code: allow
get_body_metricsList the current app user's body metrics / measurements (weight, height, bicep, body fat, etc.), most recent first.No findings
Why it is in this group
- The name "get_body_metrics" says "get": a word for reading.
Description, as the server wrote it List 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.
Annotations the server declares
- title: Get body metrics
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_cardio_activitiesList the current app user's cardio activities (most recent first).No findings
Why it is in this group
- The name "get_cardio_activities" says "get": a word for reading.
Description, as the server wrote it List the current app user's cardio activities (most recent first).
Annotations the server declares
- title: Get cardio activities
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_eventsWhat changed since a cursor, including DELETES, which a list read cannot show.No findings
Why it is in this group
- The name "get_events" says "get": a word for reading.
Description, as the server wrote it What 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.
Annotations the server declares
- title: Get events
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_exerciseFetch one exercise by name, id, or random.No findings
Why it is in this group
- The name "get_exercise" says "get": a word for reading.
Description, as the server wrote it Fetch one exercise by name, id, or random.
Annotations the server declares
- title: Get exercise
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
get_mealsList the current app user's meals for a date range.No findings
Why it is in this group
- The name "get_meals" says "get": a word for reading.
Description, as the server wrote it List the current app user's meals for a date range.
Annotations the server declares
- title: Get meals
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_muscle_recoveryPer-muscle 7-day recovery % (Fitbod parity) — the 'what should I train today?' input.No findings
Why it is in this group
- The name "get_muscle_recovery" says "get": a word for reading.
Description, as the server wrote it Per-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.
Annotations the server declares
- title: Get muscle recovery
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_nutrition_dailyPer-day calories, macros, fiber/sugar/sodium/alcohol, water, targets and adherence % over a date range (default: last 7 days).No findings
Why it is in this group
- The name "get_nutrition_daily" says "get": a word for reading.
Description, as the server wrote it Per-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.
Annotations the server declares
- title: Get nutrition daily
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_profileGet the current app user's fitness profile (height, weight, macro + water goals, diet, active sports).No findings
Why it is in this group
- The name "get_profile" says "get": a word for reading.
Description, as the server wrote it Get the current app user's fitness profile (height, weight, macro + water goals, diet, active sports). Requires an app user context.
Annotations the server declares
- title: Get profile
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_progressAny progression metric for the current user — pick one in `metric`.No findings
Why it is in this group
- The name "get_progress" says "get": a word for reading.
Description, as the server wrote it Any 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.
Annotations the server declares
- title: Get progress
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_routineFetch a single curated routine by slug with all days + slots fully expanded (exercises, sets, reps ranges, rest, superset groupings).No findings
Why it is in this group
- The name "get_routine" says "get": a word for reading.
Description, as the server wrote it Fetch 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.
Annotations the server declares
- title: Get routine
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_waterList the current app user's water intake entries for a date range.No findings
Why it is in this group
- The name "get_water" says "get": a word for reading.
Description, as the server wrote it List the current app user's water intake entries for a date range. Requires X-App-User-Id.
Annotations the server declares
- title: Get water
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
get_workoutsList the current app user's workouts (most recent first).No findings
Why it is in this group
- The name "get_workouts" says "get": a word for reading.
Description, as the server wrote it List the current app user's workouts (most recent first).
Annotations the server declares
- title: Get workouts
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
list_musclesList all 23 supported muscle slugs with anatomical names.No findings
Why it is in this group
- The name "list_muscles" says "list": a word for reading.
Description, as the server wrote it List all 23 supported muscle slugs with anatomical names.
Annotations the server declares
- title: List muscles
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
list_routinesBrowse the curated workout routine library (PPL, upper/lower, full-body, 5x5, etc.).No findings
Why it is in this group
- The name "list_routines" says "list": a word for reading.
Description, as the server wrote it Browse the curated workout routine library (PPL, upper/lower, full-body, 5x5, etc.). Filter by difficulty, goal, split_type, days_per_week. Returns minimal list.
Annotations the server declares
- title: List routines
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
lookup_barcodeLookup a food product by EAN/UPC barcode.No findings
Why it is in this group
- The name "lookup_barcode" says "lookup": a word for reading.
Description, as the server wrote it Lookup a food product by EAN/UPC barcode.
Annotations the server declares
- title: Lookup barcode
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
my_training_contextReturns a slice of the signed-in user's training picture.No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns 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.
Annotations the server declares
- title: My training context
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
resolve_exerciseResolve an exercise name into primary/secondary muscle layers for rendering.No findings
Why it is in this group
- The name "resolve_exercise" says "resolve": a word for reading.
Description, as the server wrote it Resolve an exercise name into primary/secondary muscle layers for rendering.
Annotations the server declares
- title: Resolve exercise
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
search_exercisesSearch 873 exercises by name with muscle/equipment/level filters.No findings
Why it is in this group
- The name "search_exercises" says "search": a word for reading.
Description, as the server wrote it Search 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`.
Annotations the server declares
- title: Search exercises
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
search_foodsSearch food products by name (Open Food Facts + USDA).No findings
Why it is in this group
- The name "search_foods" says "search": a word for reading.
Description, as the server wrote it Search food products by name (Open Food Facts + USDA). Returns macros per 100g.
Annotations the server declares
- title: Search foods
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 2.6.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http anatome https://anatome.dev/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__anatome__search_exercises",
"mcp__anatome__get_exercise",
"mcp__anatome__resolve_exercise",
"mcp__anatome__list_muscles",
"mcp__anatome__list_routines",
"mcp__anatome__get_routine",
"mcp__anatome__search_foods",
"mcp__anatome__lookup_barcode",
"mcp__anatome__get_workouts",
"mcp__anatome__get_meals",
"mcp__anatome__get_body_metrics",
"mcp__anatome__get_profile",
"mcp__anatome__get_cardio_activities",
"mcp__anatome__get_muscle_recovery",
"mcp__anatome__get_nutrition_daily",
"mcp__anatome__get_water",
"mcp__anatome__get_events",
"mcp__anatome__my_training_context",
"mcp__anatome__get_progress"
],
"ask": [
"mcp__anatome__generate_muscle_image",
"mcp__anatome__instantiate_routine",
"mcp__anatome__log_workout",
"mcp__anatome__log_meal",
"mcp__anatome__log_water",
"mcp__anatome__log_body_metric",
"mcp__anatome__upsert_profile",
"mcp__anatome__log_cardio",
"mcp__anatome__ai_parse_meal",
"mcp__anatome__ai_photo_macros",
"mcp__anatome__ai_meal_plan",
"mcp__anatome__ai_workout_plan",
"mcp__anatome__update_meal",
"mcp__anatome__export_data"
],
"deny": [
"mcp__anatome__delete_meal",
"mcp__anatome__update_sets",
"mcp__anatome__delete_workout"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as anatome. Review it before you use it.