Skip to main content
Glama
README.md
# 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.

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

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

## Installation & Running

```bash
# 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:

```json
{
  "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

```json
{
  "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

```json
{
  "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

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 issues