Skip to main content
Glama

MCP Logger

A Python/uv + FastMCP server for logging workouts, nutrition, and body metrics. Single-user local SQLite database with stdio MCP interface.

  • this was entirely vibe coded

Features

  • Workouts: Flexible workout -> exercises[] -> sets[] structure with tags, notes, RPE/RIR, distances, unilateral sides, etc.

  • Nutrition: Cronometer/MyFitnessPal-style logging with meals and OpenNutrition-backed food snapshots.

  • Body Metrics: Weight and customizable skinfold tracking.

  • Search: Cross-domain search across all data.

Related MCP server: aiTrainer

Tools

Workout Tools

  • log_workout - Log a complete workout with exercises and sets

  • get_workouts - Query workouts with filters (date range, type, tag)

  • get_last_workout - Get most recent workout by type or tag

  • get_exercise_history - Get history for a specific exercise

Nutrition Tools

  • upsert_nutrition_day - Create/update a nutrition day

  • upsert_meal - Create/update a meal within a day

  • add_or_update_meal_item - Add/update food item (use with OpenNutrition MCP)

  • get_nutrition_day - Get complete day with meals, items, and totals

  • get_nutrition_days_summary - Get summaries for a date range

  • delete_meal_item, delete_meal, delete_nutrition_day - Delete operations

Body Metrics Tools

  • log_body_metrics - Log weight and skinfolds

  • get_body_metrics - Get body metrics with skinfolds

  • search_logs - Search across workouts, nutrition, and body data

Installation & Running

# Install dependencies
uv pip install -e .

# Run the MCP server (stdio interface)
uv run python -m src.main

MCP Config Example

Add to your MCP configuration:

{
  "mcpServers": {
    "logger": {
      "command": "uv",
      "args": ["run", "python", "-m", "src.main"],
      "cwd": "/path/to/mcp-logger"
    }
  }
}

Nutrition Workflow with OpenNutrition MCP

  1. AI uses OpenNutrition MCP to search for foods (search-food-by-name, get-food-by-id)

  2. AI computes macros for the desired serving size

  3. AI calls add_or_update_meal_item with food_id and calculated macros

Workout Planning

The AI can call get_last_workout or get_exercise_history to retrieve past sessions, then generate suggested workouts. Progression logic lives in the client AI, not this server.

Database

Data is stored in mcp_logger.db (SQLite) in the project root.

Example Usage

Log a Workout with Exercises

{
  "date_time": "2026-01-06T18:30:00",
  "workout_type": "Strength",
  "tags": ["olympic", "speed"],
  "notes": "Great session",
  "exercises": [
    {
      "name": "Power Clean",
      "category": "Olympic Lift",
      "notes": "From blocks",
      "sets": [
        { "reps": 3, "weight_lbs": 185 },
        { "reps": 2, "weight_lbs": 195 },
        { "reps": 1, "weight_lbs": 205 }
      ]
    },
    {
      "name": "Sprint Starts",
      "category": "Sprint",
      "notes": "3 point stance",
      "sets": [{ "reps": 6, "distance_yards": 20 }]
    },
    {
      "name": "Single Leg Box Jumps",
      "category": "Plyometric",
      "notes": "5 sets of 2 each leg",
      "sets": [{ "reps": 10, "side": "both" }]
    }
  ]
}

Set Fields

Each set can include:

  • reps: Number of repetitions (int or float)

  • weight_kg / weight_lbs: Weight in kg or lbs

  • distance_m / distance_yards: Distance for running/rowing

  • duration_s: Duration in seconds

  • side: "left", "right", or "both" (for unilateral exercises)

  • rpe: Rate of Perceived Exertion (1-10)

  • rir: Reps In Reserve (0-5)

  • is_warmup: Boolean for warmup sets

  • set_index: Manual set ordering (defaults to order inserted)

Log Body Metrics

{
  "date": "2026-01-06",
  "body_weight_kg": 85.5,
  "skinfolds": {
    "chest": 12,
    "abdomen": 18,
    "thigh": 15,
    "tricep": 10,
    "subscapular": 14,
    "suprailiac": 16,
    "midaxillary": 11
  },
  "notes": "Morning measurement"
}

MCP-logger

Available Tools

17 tools
add_exerciseB

Add an exercise to an existing workout.

Args: workout_id: ID of the workout to add exercise to name: Name of the exercise category: Optional category (e.g., 'Squat', 'Push', 'Pull') notes: Optional notes about the exercise

Inputs: workout_id (required), name (required), category, notes. Returns: object

add_or_update_meal_itemA

Add or update a food item within a meal.

The AI should first use OpenNutrition MCP to find food_id and get macros, then call this tool with the calculated values for the serving quantity.

Inputs: date (required), meal_name (required), food_id (required), food_name (required), +11 more. Returns: object

add_setB

Add a set to an existing exercise.

Args: exercise_id: ID of the exercise to add set to reps: Number of repetitions weight_kg: Weight in kilograms weight_lbs: Weight in pounds distance_m: Distance in meters distance_yards: Distance in yards duration_s: Duration in seconds side: 'left', 'right', or 'both' for unilateral exercises rpe: Rate of Perceived Exertion (1-10) rir: Reps In Reserve (0-5) is_warmup: Whether this is a warmup set

Inputs: exercise_id (required), reps, weight_kg, weight_lbs, +7 more. Returns: object

delete_mealC

Delete a meal and optionally its items.

Inputs: meal_id (required), delete_items. Returns: object

delete_meal_itemC

Delete a meal item.

Inputs: item_id (required). Returns: object

delete_nutrition_dayB

Delete a nutrition day and optionally cascade to meals/items.

Inputs: date (required), cascade. Returns: object

get_body_metricsC

Get body metrics with skinfolds.

Inputs: from_date, to_date, limit, offset. Returns: object

get_exercise_historyB

Get history of a specific exercise across workouts.

Inputs: exercise_name (required), from_date, to_date, limit. Returns: object

get_last_workoutC

Get the most recent workout matching type or tag.

Inputs: workout_type, tag. Returns: object

get_nutrition_dayB

Get a complete nutrition day with meals and items.

Inputs: date (required). Returns: object

get_nutrition_days_summaryC

Get nutrition summaries for a date range.

Inputs: from_date, to_date, limit, offset. Returns: object

get_workoutsC

Query workouts with various filters.

Inputs: from_date, to_date, workout_type, tag, +3 more. Returns: object

log_body_metricsB

Log body weight and skinfold measurements.

Args: date: Date in YYYY-MM-DD format body_weight_kg: Body weight in kilograms (optional) skinfolds: Dictionary of skinfold measurements in mm (optional). Can be a single site like {"abdomen": 10} or multiple sites like {"chest": 12, "abdomen": 18, "thigh": 15}. Common sites: abdomen, chest, thigh, tricep, subscapular, suprailiac, midaxillary notes: Optional notes about the measurement

Example: Single belly skinfold: {"abdomen": 10} Multiple sites: {"chest": 12, "abdomen": 18, "thigh": 15}

Inputs: date (required), body_weight_kg, skinfolds, notes. Returns: object

log_workoutB

Log a complete workout with exercises and sets.

Returns the fully logged workout with all exercises and sets for confirmation.

Args: date_time: ISO datetime string (e.g., "2026-01-06T18:30:00") workout_type: Optional type/category for the workout tags: Optional list of tags (e.g., ["legs", "sprint"]) notes: Optional notes for the workout exercises: List of exercises with sets. Each exercise should have: - name: str (required) - category: Optional[str] - notes: Optional[str] - sets: List of sets with fields like reps, weight_kg, weight_lbs, distance_yards, side, etc.

Inputs: date_time (required), workout_type, tags, notes, +1 more. Returns: object

search_logsC

Search across workouts, nutrition days, and body metrics.

Inputs: query (required), domains, from_date, to_date, +1 more. Returns: object

upsert_mealC

Create or update a meal within a nutrition day.

Inputs: date (required), name (required), order_index. Returns: object

upsert_nutrition_dayC

Create or update a nutrition day entry.

Inputs: date (required), notes. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 17 tools

    Disambiguation4/5

    Most tools have distinct purposes targeting specific domains (workouts, nutrition, body metrics), but some overlap exists. For example, 'log_workout' and 'add_exercise' both handle exercise logging, which could cause confusion about when to use each. However, the descriptions clarify that 'log_workout' is for complete workouts while 'add_exercise' is for incremental updates.

    Naming Consistency4/5

    The naming follows a consistent verb_noun pattern throughout (e.g., 'add_exercise', 'get_workouts', 'log_body_metrics'), with only minor deviations. The main inconsistency is 'search_logs' (verb_noun) versus 'get_exercise_history' (verb_adjective_noun), but overall the pattern is clear and predictable.

    Tool Count4/5

    With 17 tools, the count is slightly high but reasonable for a comprehensive fitness and nutrition logging server. It covers workouts, nutrition, and body metrics, so each tool generally earns its place, though some consolidation might improve coherence (e.g., combining delete operations).

    Completeness5/5

    The tool set provides complete CRUD/lifecycle coverage for workouts, nutrition days, meals, and body metrics. It includes creation (log_workout, upsert_nutrition_day), retrieval (get_workouts, get_nutrition_day), updates (add_exercise, upsert_meal), and deletion (delete_meal, delete_nutrition_day), with no obvious gaps for the domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Local-first nutrition tracker MCP server for Hermes, enabling food, alias, recipe, and meal log management with SQLite persistence.
      -
    • F
      license
      A
      quality
      D
      maintenance
      Personal workout coach MCP server that logs exercises in natural language, tracks progress with SQLite, and provides coaching signals like estimated 1RM and volume trends.
      6
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      A personal health and fitness MCP server that provides tools for managing profile data, goals, body measurements, nutrition, workouts, sleep, check-ins, life events, analytics, and coach memories via Supabase Postgres.
      1
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Self-hosted fitness tracking MCP server that gives AI assistants access to your nutrition, training, weight, sleep, and accomplishment data via 77 tools and 5 resources. Enables natural-language logging and querying of personal health metrics through Claude or ChatGPT.
      12 npm
      1
      BSD 2-Clause "Simplified"