Skip to content

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.

Deletes · 3Changes · 14

36 tools: 3 can delete or cancel things, 14 change things and 19 only read.

Scanned Oct 21, 2026

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/mcp

Findings

Matches of fixed checks, with the text they matched.

6 warn
  • The server marks "log_workout" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_workout" says "log": a word for reading.

    What this check looks for
  • The server marks "log_meal" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_meal" says "log": a word for reading.

    What this check looks for
  • The server marks "log_water" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_water" says "log": a word for reading.

    What this check looks for
  • The server marks "log_body_metric" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_body_metric" says "log": a word for reading.

    What this check looks for
  • The server marks "log_cardio" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_cardio" says "log": a word for reading.

    What this check looks for
  • The server marks "ai_photo_macros" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "analyze": a word for reading.

    What this check looks for

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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "analyze": a word for reading.

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_body_metric" says "log": a word for reading.

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_cardio" says "log": a word for reading.

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_meal" says "log": a word for reading.

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_water" says "log": a word for reading.

      What this check looks for
    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.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "log_workout" says "log": a word for reading.

      What this check looks for
    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/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.