MCP tool reference

22 tools: 14 read, 8 write. Generated from the server’s tool definitions, so this page always matches tools/list.

Every example call is a complete JSON-RPC request to POST https://fitaio.app/mcp. Results show the structuredContent field; the response also carries a one-line text summary.

Read tools

get_profile

Get profile. Read tool. Idempotent.

The account this key belongs to: display name, height in cm, birth date, gender and fitness goal (cut, recomp, bulk, maintain).

Arguments

No arguments.

Example call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_profile",
    "arguments": {}
  }
}

Example result

The structuredContent of the response.

{
  "id": "u_5d8e",
  "display_name": "Alex",
  "email": "alex@example.com",
  "height_cm": 181,
  "birth_date": "1994-03-12",
  "gender": "male",
  "goal": "recomp",
  "created_at": "2026-04-02T09:12:00Z"
}

list_workouts

List workouts. Read tool. Idempotent.

Logged workouts, newest first, with every exercise and set. Filter with since and until (RFC 3339). Volume is kg x reps over completed non-warm-up sets.

Arguments

ArgumentTypeRequiredDescription
sincestring (date-time)noInclusive lower bound, RFC 3339.
untilstring (date-time)noExclusive upper bound, RFC 3339.
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "list_workouts",
    "arguments": {
      "since": "2026-09-15T00:00:00Z",
      "limit": 2
    }
  }
}

Example result

The structuredContent of the response.

{
  "workouts": [
    {
      "id": "wk_9f2c",
      "title": "Push",
      "notes": "",
      "started_at": "2026-09-18T17:00:00Z",
      "duration_seconds": 3420,
      "volume_kg": 2940,
      "plan_id": "pl_1a2b",
      "plan_name": "Lean Cut PPL",
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "name": "Barbell Bench Press",
          "muscle_group": "Chest",
          "notes": "",
          "superset_id": null,
          "sets": [
            {
              "type": "warmup",
              "weight_kg": 40,
              "reps": 10,
              "completed": true,
              "rpe": null
            },
            {
              "type": "working",
              "weight_kg": 80,
              "reps": 8,
              "completed": true,
              "rpe": 8
            },
            {
              "type": "working",
              "weight_kg": 80,
              "reps": 8,
              "completed": true,
              "rpe": 8.5
            },
            {
              "type": "working",
              "weight_kg": 80,
              "reps": 7,
              "completed": true,
              "rpe": 9
            }
          ]
        },
        {
          "exercise_id": "overhead-press",
          "name": "Overhead Press",
          "muscle_group": "Shoulders",
          "notes": "",
          "superset_id": null,
          "sets": [
            {
              "type": "working",
              "weight_kg": 50,
              "reps": 8,
              "completed": true,
              "rpe": 8
            },
            {
              "type": "working",
              "weight_kg": 50,
              "reps": 8,
              "completed": true,
              "rpe": 8
            },
            {
              "type": "working",
              "weight_kg": 50,
              "reps": 6,
              "completed": true,
              "rpe": 9
            }
          ]
        }
      ],
      "created_at": "2026-09-18T18:02:11Z",
      "updated_at": "2026-09-18T18:02:11Z"
    },
    {
      "id": "wk_9f2b",
      "title": "Pull",
      "notes": "",
      "started_at": "2026-09-16T17:00:00Z",
      "duration_seconds": 3420,
      "volume_kg": 1950,
      "plan_id": "pl_1a2b",
      "plan_name": "Lean Cut PPL",
      "exercises": [
        {
          "exercise_id": "deadlift",
          "name": "Deadlift",
          "muscle_group": "Back",
          "notes": "",
          "superset_id": null,
          "sets": [
            {
              "type": "working",
              "weight_kg": 130,
              "reps": 5,
              "completed": true,
              "rpe": 8
            },
            {
              "type": "working",
              "weight_kg": 130,
              "reps": 5,
              "completed": true,
              "rpe": 8
            },
            {
              "type": "working",
              "weight_kg": 130,
              "reps": 5,
              "completed": true,
              "rpe": 9
            }
          ]
        }
      ],
      "created_at": "2026-09-18T18:02:11Z",
      "updated_at": "2026-09-18T18:02:11Z"
    }
  ],
  "next_cursor": null
}

get_workout

Get workout. Read tool. Idempotent.

One workout by id, with exercises, sets, weights in kg, reps, RPE and duration.

Arguments

ArgumentTypeRequiredDescription
workout_idstringyes

Example call

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "get_workout",
    "arguments": {
      "workout_id": "wk_9f2c"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "wk_9f2c",
  "title": "Push",
  "notes": "",
  "started_at": "2026-09-18T17:00:00Z",
  "duration_seconds": 3420,
  "volume_kg": 2940,
  "plan_id": "pl_1a2b",
  "plan_name": "Lean Cut PPL",
  "exercises": [
    {
      "exercise_id": "barbell-bench-press",
      "name": "Barbell Bench Press",
      "muscle_group": "Chest",
      "notes": "",
      "superset_id": null,
      "sets": [
        {
          "type": "warmup",
          "weight_kg": 40,
          "reps": 10,
          "completed": true,
          "rpe": null
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 8,
          "completed": true,
          "rpe": 8.5
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 7,
          "completed": true,
          "rpe": 9
        }
      ]
    },
    {
      "exercise_id": "overhead-press",
      "name": "Overhead Press",
      "muscle_group": "Shoulders",
      "notes": "",
      "superset_id": null,
      "sets": [
        {
          "type": "working",
          "weight_kg": 50,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 50,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 50,
          "reps": 6,
          "completed": true,
          "rpe": 9
        }
      ]
    }
  ],
  "created_at": "2026-09-18T18:02:11Z",
  "updated_at": "2026-09-18T18:02:11Z"
}

get_exercise_history

Exercise history. Read tool. Idempotent.

Every session in which the user performed one exercise, newest first, with the best set and its estimated one-rep max. Use search_exercises to find the exercise_id.

Arguments

ArgumentTypeRequiredDescription
exercise_idstringyes
sincestring (date-time)noInclusive lower bound, RFC 3339.
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tools/call",
  "params": {
    "name": "get_exercise_history",
    "arguments": {
      "exercise_id": "barbell-bench-press",
      "limit": 2
    }
  }
}

Example result

The structuredContent of the response.

{
  "exercise": {
    "id": "barbell-bench-press",
    "name": "Barbell Bench Press"
  },
  "sessions": [
    {
      "workout_id": "wk_9f2c",
      "started_at": "2026-09-18T17:00:00Z",
      "sets": [
        {
          "type": "warmup",
          "weight_kg": 40,
          "reps": 10,
          "completed": true,
          "rpe": null
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 8,
          "completed": true,
          "rpe": 8.5
        },
        {
          "type": "working",
          "weight_kg": 80,
          "reps": 7,
          "completed": true,
          "rpe": 9
        }
      ],
      "best_set": {
        "weight_kg": 80,
        "reps": 8,
        "estimated_1rm_kg": 101.3
      }
    },
    {
      "workout_id": "wk_9e10",
      "started_at": "2026-09-11T17:00:00Z",
      "sets": [
        {
          "type": "working",
          "weight_kg": 77.5,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 77.5,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 77.5,
          "reps": 8,
          "completed": true,
          "rpe": 8
        }
      ],
      "best_set": {
        "weight_kg": 77.5,
        "reps": 8,
        "estimated_1rm_kg": 98.2
      }
    }
  ],
  "next_cursor": null
}

search_exercises

Search exercises. Read tool. Idempotent.

Search the exercise catalogue by name, muscle group or equipment. Returns ids to use in log_workout, create_routine and create_training_plan.

Arguments

ArgumentTypeRequiredDescription
querystringnoPart of the exercise name.
muscle_groupstring: Chest, Back, Legs, Shoulders, Arms, Core, Full bodyno
equipmentstring: Barbell, Dumbbell, Cable, Machine, Bodyweight, Kettlebell, Bandno
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 5,
  "method": "tools/call",
  "params": {
    "name": "search_exercises",
    "arguments": {
      "query": "bench",
      "muscle_group": "Chest",
      "limit": 1
    }
  }
}

Example result

The structuredContent of the response.

{
  "exercises": [
    {
      "id": "barbell-bench-press",
      "name": "Barbell Bench Press",
      "muscle_group": "Chest",
      "equipment": "Barbell",
      "instructions": "Lie on the bench, unrack, lower the bar to mid-chest, press.",
      "images": [
        "https://fitaio.app/app/assets/exercises/barbell-bench-press-0.jpg"
      ],
      "level": "intermediate",
      "mechanic": "compound",
      "force": "push",
      "category": "strength",
      "secondary_muscles": [
        "Shoulders",
        "Arms"
      ]
    }
  ],
  "next_cursor": null
}

list_routines

List routines. Read tool. Idempotent.

Saved routines: reusable single-day templates with exercises, sets, reps and target weights.

Arguments

ArgumentTypeRequiredDescription
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 6,
  "method": "tools/call",
  "params": {
    "name": "list_routines",
    "arguments": {
      "limit": 10
    }
  }
}

Example result

The structuredContent of the response.

{
  "routines": [
    {
      "id": "rt_77",
      "name": "Push day",
      "focus": "Chest & Shoulders",
      "use_count": 6,
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "name": "Barbell Bench Press",
          "muscle_group": "Chest",
          "equipment": "Barbell",
          "sets": 4,
          "reps": 8,
          "weight_kg": 80,
          "note": ""
        },
        {
          "exercise_id": "overhead-press",
          "name": "Overhead Press",
          "muscle_group": "Shoulders",
          "equipment": "Barbell",
          "sets": 3,
          "reps": 8,
          "weight_kg": 50,
          "note": ""
        }
      ],
      "created_at": "2026-09-01T08:05:00Z"
    }
  ],
  "next_cursor": null
}

list_training_plans

List training plans. Read tool. Idempotent.

Weekly training plans, newest first, including which one is active.

Arguments

ArgumentTypeRequiredDescription
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "list_training_plans",
    "arguments": {
      "limit": 10
    }
  }
}

Example result

The structuredContent of the response.

{
  "plans": [
    {
      "id": "pl_1a2b",
      "name": "Lean Cut PPL",
      "summary": "Four training days that keep strength up while cutting toward 78 kg.",
      "progression": "Add 2.5 kg to compound lifts when every set hits the top of the rep range.",
      "days_per_week": 4,
      "active": true,
      "source": "ai",
      "days": [
        {
          "weekday": 1,
          "label": "Push",
          "focus": "Chest & Shoulders",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "barbell-bench-press",
              "name": "Barbell Bench Press",
              "muscle_group": "Chest",
              "equipment": "Barbell",
              "sets": 4,
              "reps": 8,
              "weight_kg": 80,
              "note": ""
            },
            {
              "exercise_id": "overhead-press",
              "name": "Overhead Press",
              "muscle_group": "Shoulders",
              "equipment": "Barbell",
              "sets": 3,
              "reps": 8,
              "weight_kg": 50,
              "note": ""
            }
          ]
        },
        {
          "weekday": 2,
          "label": "Pull",
          "focus": "Back & Biceps",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "deadlift",
              "name": "Deadlift",
              "muscle_group": "Back",
              "equipment": "Barbell",
              "sets": 3,
              "reps": 5,
              "weight_kg": 130,
              "note": ""
            }
          ]
        },
        {
          "weekday": 3,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        },
        {
          "weekday": 4,
          "label": "Legs",
          "focus": "Quads & Posterior",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "barbell-squat",
              "name": "Barbell Squat",
              "muscle_group": "Legs",
              "equipment": "Barbell",
              "sets": 4,
              "reps": 6,
              "weight_kg": 105,
              "note": ""
            }
          ]
        },
        {
          "weekday": 5,
          "label": "Upper",
          "focus": "Full upper body",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "pull-up",
              "name": "Pull-Up",
              "muscle_group": "Back",
              "equipment": "Bodyweight",
              "sets": 4,
              "reps": 8,
              "weight_kg": 0,
              "note": ""
            }
          ]
        },
        {
          "weekday": 6,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        },
        {
          "weekday": 7,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        }
      ],
      "history": [
        {
          "at": "2026-09-01T08:00:00Z",
          "kind": "created",
          "detail": "Generated by the coach"
        }
      ],
      "created_at": "2026-09-01T08:00:00Z",
      "updated_at": null
    }
  ],
  "next_cursor": null
}

get_training_plan

Get training plan. Read tool. Idempotent.

One weekly plan with its seven days and every exercise.

Arguments

ArgumentTypeRequiredDescription
plan_idstringyes

Example call

{
  "jsonrpc": "2.0",
  "id": 8,
  "method": "tools/call",
  "params": {
    "name": "get_training_plan",
    "arguments": {
      "plan_id": "pl_1a2b"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "pl_1a2b",
  "name": "Lean Cut PPL",
  "summary": "Four training days that keep strength up while cutting toward 78 kg.",
  "progression": "Add 2.5 kg to compound lifts when every set hits the top of the rep range.",
  "days_per_week": 4,
  "active": true,
  "source": "ai",
  "days": [
    {
      "weekday": 1,
      "label": "Push",
      "focus": "Chest & Shoulders",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "name": "Barbell Bench Press",
          "muscle_group": "Chest",
          "equipment": "Barbell",
          "sets": 4,
          "reps": 8,
          "weight_kg": 80,
          "note": ""
        },
        {
          "exercise_id": "overhead-press",
          "name": "Overhead Press",
          "muscle_group": "Shoulders",
          "equipment": "Barbell",
          "sets": 3,
          "reps": 8,
          "weight_kg": 50,
          "note": ""
        }
      ]
    },
    {
      "weekday": 2,
      "label": "Pull",
      "focus": "Back & Biceps",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "deadlift",
          "name": "Deadlift",
          "muscle_group": "Back",
          "equipment": "Barbell",
          "sets": 3,
          "reps": 5,
          "weight_kg": 130,
          "note": ""
        }
      ]
    },
    {
      "weekday": 3,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    },
    {
      "weekday": 4,
      "label": "Legs",
      "focus": "Quads & Posterior",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "barbell-squat",
          "name": "Barbell Squat",
          "muscle_group": "Legs",
          "equipment": "Barbell",
          "sets": 4,
          "reps": 6,
          "weight_kg": 105,
          "note": ""
        }
      ]
    },
    {
      "weekday": 5,
      "label": "Upper",
      "focus": "Full upper body",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "pull-up",
          "name": "Pull-Up",
          "muscle_group": "Back",
          "equipment": "Bodyweight",
          "sets": 4,
          "reps": 8,
          "weight_kg": 0,
          "note": ""
        }
      ]
    },
    {
      "weekday": 6,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    },
    {
      "weekday": 7,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    }
  ],
  "history": [
    {
      "at": "2026-09-01T08:00:00Z",
      "kind": "created",
      "detail": "Generated by the coach"
    }
  ],
  "created_at": "2026-09-01T08:00:00Z",
  "updated_at": null
}

get_body_metrics

Body metrics. Read tool. Idempotent.

Body weight logs (kg, body fat percent) and tape measurements (cm), newest first.

Arguments

ArgumentTypeRequiredDescription
sincestring (date-time)noInclusive lower bound, RFC 3339.
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 9,
  "method": "tools/call",
  "params": {
    "name": "get_body_metrics",
    "arguments": {
      "since": "2026-09-01T00:00:00Z",
      "limit": 2
    }
  }
}

Example result

The structuredContent of the response.

{
  "weight": [
    {
      "id": "bw_301",
      "weight_kg": 82.4,
      "body_fat_percent": 18.9,
      "notes": "",
      "logged_at": "2026-09-18T07:05:00Z"
    },
    {
      "id": "bw_300",
      "weight_kg": 82.6,
      "body_fat_percent": 18.9,
      "notes": "",
      "logged_at": "2026-09-17T07:02:00Z"
    }
  ],
  "measurements": [
    {
      "id": "ms_12",
      "chest_cm": 104.5,
      "waist_cm": 86,
      "hips_cm": 98,
      "arms_cm": 38.5,
      "thighs_cm": 60,
      "neck_cm": 39.5,
      "logged_at": "2026-09-18T07:10:00Z"
    }
  ]
}

get_nutrition

Nutrition days. Read tool. Idempotent.

Daily calories, protein, carbs and fat in grams, newest day first. Filter with since and until as YYYY-MM-DD.

Arguments

ArgumentTypeRequiredDescription
sincestring (date)noInclusive first day, YYYY-MM-DD.
untilstring (date)noInclusive last day, YYYY-MM-DD.
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 10,
  "method": "tools/call",
  "params": {
    "name": "get_nutrition",
    "arguments": {
      "since": "2026-09-17",
      "until": "2026-09-18",
      "limit": 7
    }
  }
}

Example result

The structuredContent of the response.

{
  "nutrition": [
    {
      "day": "2026-09-18",
      "calories": 2116,
      "protein_g": 176,
      "carbs_g": 200,
      "fat_g": 68,
      "logged_at": "2026-09-18T21:30:00Z"
    },
    {
      "day": "2026-09-17",
      "calories": 2090,
      "protein_g": 170,
      "carbs_g": 200,
      "fat_g": 68,
      "logged_at": "2026-09-17T21:10:00Z"
    }
  ],
  "next_cursor": null
}

get_training_stats

Training stats. Read tool. Idempotent.

Sessions, completed sets, volume in kg, duration, volume per muscle group and the activity streak for a window. Defaults to the last 90 days.

Arguments

ArgumentTypeRequiredDescription
sincestring (date-time)noInclusive lower bound, RFC 3339.
untilstring (date-time)noExclusive upper bound, RFC 3339.

Example call

{
  "jsonrpc": "2.0",
  "id": 11,
  "method": "tools/call",
  "params": {
    "name": "get_training_stats",
    "arguments": {
      "since": "2026-08-20T00:00:00Z",
      "until": "2026-09-19T00:00:00Z"
    }
  }
}

Example result

The structuredContent of the response.

{
  "since": "2026-08-20T00:00:00Z",
  "until": "2026-09-19T00:00:00Z",
  "sessions": 16,
  "completed_sets": 262,
  "volume_kg": 91240,
  "total_duration_seconds": 56880,
  "by_muscle_group": [
    {
      "muscle_group": "Back",
      "sessions": 8,
      "sets": 68,
      "volume_kg": 26180
    },
    {
      "muscle_group": "Legs",
      "sessions": 4,
      "sets": 42,
      "volume_kg": 22460
    },
    {
      "muscle_group": "Chest",
      "sessions": 8,
      "sets": 56,
      "volume_kg": 18300
    },
    {
      "muscle_group": "Shoulders",
      "sessions": 8,
      "sets": 48,
      "volume_kg": 14180
    },
    {
      "muscle_group": "Arms",
      "sessions": 8,
      "sets": 40,
      "volume_kg": 10120
    }
  ],
  "streak_days": 3
}

get_personal_records

Personal records. Read tool. Idempotent.

The heaviest completed set per exercise across all history with an estimated one-rep max.

Arguments

ArgumentTypeRequiredDescription
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "tools/call",
  "params": {
    "name": "get_personal_records",
    "arguments": {
      "limit": 3
    }
  }
}

Example result

The structuredContent of the response.

{
  "records": [
    {
      "exercise_id": "deadlift",
      "name": "Deadlift",
      "weight_kg": 130,
      "reps": 5,
      "estimated_1rm_kg": 151.7,
      "workout_id": "wk_9f2b",
      "date": "2026-09-16T17:00:00Z"
    },
    {
      "exercise_id": "barbell-squat",
      "name": "Barbell Squat",
      "weight_kg": 110,
      "reps": 6,
      "estimated_1rm_kg": 132,
      "workout_id": "wk_9f1c",
      "date": "2026-09-11T17:00:00Z"
    },
    {
      "exercise_id": "barbell-bench-press",
      "name": "Barbell Bench Press",
      "weight_kg": 80,
      "reps": 8,
      "estimated_1rm_kg": 101.3,
      "workout_id": "wk_9f2c",
      "date": "2026-09-18T17:00:00Z"
    }
  ]
}

list_supplements

List supplements. Read tool. Idempotent.

The supplement schedule: name, dosage and time of day.

Arguments

ArgumentTypeRequiredDescription
limitintegernoPage size, 1 to 100. Default 25.

Example call

{
  "jsonrpc": "2.0",
  "id": 13,
  "method": "tools/call",
  "params": {
    "name": "list_supplements",
    "arguments": {
      "limit": 10
    }
  }
}

Example result

The structuredContent of the response.

{
  "supplements": [
    {
      "id": "sp_3",
      "name": "Creatine",
      "dosage": "5 g",
      "time": "08:00",
      "created_at": "2026-09-01T08:10:00Z"
    },
    {
      "id": "sp_4",
      "name": "Omega-3",
      "dosage": "1 g",
      "time": "20:00",
      "created_at": "2026-09-01T08:10:00Z"
    }
  ],
  "next_cursor": null
}

get_current_goal

Current goal. Read tool. Idempotent.

The current body goal: target weight, target body fat, deadline and starting weight. Errors when no goal is set.

Arguments

No arguments.

Example call

{
  "jsonrpc": "2.0",
  "id": 14,
  "method": "tools/call",
  "params": {
    "name": "get_current_goal",
    "arguments": {}
  }
}

Example result

The structuredContent of the response.

{
  "id": "gl_2",
  "target_weight_kg": 78,
  "target_body_fat_percent": 14,
  "deadline": "2026-12-19",
  "start_weight_kg": 84.2,
  "created_at": "2026-09-01T08:12:00Z"
}

Write tools

log_workout

Log workout. Write tool: needs a key with read and write scope.

Save a completed workout. Every exercise_id must come from search_exercises. Weights in kg. Set type defaults to working; warm-ups do not count towards volume or records. Saves immediately.

Arguments

ArgumentTypeRequiredDescription
titlestringno
notesstringno
started_atstring (date-time)yesWhen the session started.
duration_secondsintegeryes
plan_idstringno
plan_namestringno
exercisesarray of objectsyes

Example call

{
  "jsonrpc": "2.0",
  "id": 15,
  "method": "tools/call",
  "params": {
    "name": "log_workout",
    "arguments": {
      "title": "Push",
      "started_at": "2026-09-19T17:00:00Z",
      "duration_seconds": 3300,
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "sets": [
            {
              "type": "warmup",
              "weight_kg": 40,
              "reps": 10
            },
            {
              "weight_kg": 82.5,
              "reps": 8,
              "rpe": 8
            },
            {
              "weight_kg": 82.5,
              "reps": 8,
              "rpe": 8.5
            },
            {
              "weight_kg": 82.5,
              "reps": 7,
              "rpe": 9
            }
          ]
        }
      ]
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "wk_9f3d",
  "title": "Push",
  "notes": "",
  "started_at": "2026-09-19T17:00:00Z",
  "duration_seconds": 3300,
  "volume_kg": 1897.5,
  "plan_id": null,
  "plan_name": null,
  "exercises": [
    {
      "exercise_id": "barbell-bench-press",
      "name": "Barbell Bench Press",
      "muscle_group": "Chest",
      "notes": "",
      "superset_id": null,
      "sets": [
        {
          "type": "warmup",
          "weight_kg": 40,
          "reps": 10,
          "completed": true,
          "rpe": null
        },
        {
          "type": "working",
          "weight_kg": 82.5,
          "reps": 8,
          "completed": true,
          "rpe": 8
        },
        {
          "type": "working",
          "weight_kg": 82.5,
          "reps": 8,
          "completed": true,
          "rpe": 8.5
        },
        {
          "type": "working",
          "weight_kg": 82.5,
          "reps": 7,
          "completed": true,
          "rpe": 9
        }
      ]
    }
  ],
  "created_at": "2026-09-19T17:56:00Z",
  "updated_at": "2026-09-19T17:56:00Z"
}

create_routine

Create routine. Write tool: needs a key with read and write scope.

Save a reusable single-day routine with target sets, reps and weights in kg.

Arguments

ArgumentTypeRequiredDescription
namestringyes
focusstringno"Chest & Shoulders"
exercisesarray of objectsyes

Example call

{
  "jsonrpc": "2.0",
  "id": 16,
  "method": "tools/call",
  "params": {
    "name": "create_routine",
    "arguments": {
      "name": "Push day",
      "focus": "Chest & Shoulders",
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "sets": 4,
          "reps": 8,
          "weight_kg": 80
        },
        {
          "exercise_id": "overhead-press",
          "sets": 3,
          "reps": 8,
          "weight_kg": 50
        }
      ]
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "rt_77",
  "name": "Push day",
  "focus": "Chest & Shoulders",
  "use_count": 0,
  "exercises": [
    {
      "exercise_id": "barbell-bench-press",
      "name": "Barbell Bench Press",
      "muscle_group": "Chest",
      "equipment": "Barbell",
      "sets": 4,
      "reps": 8,
      "weight_kg": 80,
      "note": ""
    },
    {
      "exercise_id": "overhead-press",
      "name": "Overhead Press",
      "muscle_group": "Shoulders",
      "equipment": "Barbell",
      "sets": 3,
      "reps": 8,
      "weight_kg": 50,
      "note": ""
    }
  ],
  "created_at": "2026-09-01T08:05:00Z"
}

create_training_plan

Create training plan. Write tool: needs a key with read and write scope.

Save a weekly plan: exactly seven days, weekdays 1 (Monday) to 7 (Sunday), rest days with no exercises. Set active to true to make it the plan the app follows.

Arguments

ArgumentTypeRequiredDescription
namestringyes
summarystringno
progressionstringnoHow to add load week to week.
activebooleannoMake this the plan that drives the dashboard. Retires the current active plan.
daysarray of objectsyesExactly seven, weekdays 1 to 7 once each. Rest days carry no exercises.

Example call

{
  "jsonrpc": "2.0",
  "id": 17,
  "method": "tools/call",
  "params": {
    "name": "create_training_plan",
    "arguments": {
      "name": "Lean Cut PPL",
      "summary": "Four training days that keep strength up while cutting toward 78 kg.",
      "progression": "Add 2.5 kg to compound lifts when every set hits the top of the rep range.",
      "active": true,
      "days": [
        {
          "weekday": 1,
          "label": "Push",
          "focus": "Chest & Shoulders",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "barbell-bench-press",
              "sets": 4,
              "reps": 8,
              "weight_kg": 80
            },
            {
              "exercise_id": "overhead-press",
              "sets": 3,
              "reps": 8,
              "weight_kg": 50
            }
          ]
        },
        {
          "weekday": 2,
          "label": "Pull",
          "focus": "Back & Biceps",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "deadlift",
              "sets": 3,
              "reps": 5,
              "weight_kg": 130
            }
          ]
        },
        {
          "weekday": 3,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        },
        {
          "weekday": 4,
          "label": "Legs",
          "focus": "Quads & Posterior",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "barbell-squat",
              "sets": 4,
              "reps": 6,
              "weight_kg": 105
            }
          ]
        },
        {
          "weekday": 5,
          "label": "Upper",
          "focus": "Full upper body",
          "rest": false,
          "exercises": [
            {
              "exercise_id": "pull-up",
              "sets": 4,
              "reps": 8,
              "weight_kg": 0
            }
          ]
        },
        {
          "weekday": 6,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        },
        {
          "weekday": 7,
          "label": "Rest",
          "focus": "",
          "rest": true,
          "exercises": []
        }
      ]
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "pl_1a2b",
  "name": "Lean Cut PPL",
  "summary": "Four training days that keep strength up while cutting toward 78 kg.",
  "progression": "Add 2.5 kg to compound lifts when every set hits the top of the rep range.",
  "days_per_week": 4,
  "active": true,
  "source": "manual",
  "days": [
    {
      "weekday": 1,
      "label": "Push",
      "focus": "Chest & Shoulders",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "barbell-bench-press",
          "name": "Barbell Bench Press",
          "muscle_group": "Chest",
          "equipment": "Barbell",
          "sets": 4,
          "reps": 8,
          "weight_kg": 80,
          "note": ""
        },
        {
          "exercise_id": "overhead-press",
          "name": "Overhead Press",
          "muscle_group": "Shoulders",
          "equipment": "Barbell",
          "sets": 3,
          "reps": 8,
          "weight_kg": 50,
          "note": ""
        }
      ]
    },
    {
      "weekday": 2,
      "label": "Pull",
      "focus": "Back & Biceps",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "deadlift",
          "name": "Deadlift",
          "muscle_group": "Back",
          "equipment": "Barbell",
          "sets": 3,
          "reps": 5,
          "weight_kg": 130,
          "note": ""
        }
      ]
    },
    {
      "weekday": 3,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    },
    {
      "weekday": 4,
      "label": "Legs",
      "focus": "Quads & Posterior",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "barbell-squat",
          "name": "Barbell Squat",
          "muscle_group": "Legs",
          "equipment": "Barbell",
          "sets": 4,
          "reps": 6,
          "weight_kg": 105,
          "note": ""
        }
      ]
    },
    {
      "weekday": 5,
      "label": "Upper",
      "focus": "Full upper body",
      "rest": false,
      "exercises": [
        {
          "exercise_id": "pull-up",
          "name": "Pull-Up",
          "muscle_group": "Back",
          "equipment": "Bodyweight",
          "sets": 4,
          "reps": 8,
          "weight_kg": 0,
          "note": ""
        }
      ]
    },
    {
      "weekday": 6,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    },
    {
      "weekday": 7,
      "label": "Rest",
      "focus": "",
      "rest": true,
      "exercises": []
    }
  ],
  "history": [],
  "created_at": "2026-09-01T08:00:00Z",
  "updated_at": null
}

log_weight

Log body weight. Write tool: needs a key with read and write scope.

Log a body weight in kg with optional body fat percent, notes and a backdated logged_at.

Arguments

ArgumentTypeRequiredDescription
weight_kgnumberyes
body_fat_percentnumberno
notesstringno
logged_atstring (date-time)noDefaults to now. May be backdated.

Example call

{
  "jsonrpc": "2.0",
  "id": 18,
  "method": "tools/call",
  "params": {
    "name": "log_weight",
    "arguments": {
      "weight_kg": 82.4,
      "body_fat_percent": 18.9,
      "logged_at": "2026-09-18T07:05:00Z"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "bw_301",
  "weight_kg": 82.4,
  "body_fat_percent": 18.9,
  "notes": "",
  "logged_at": "2026-09-18T07:05:00Z"
}

log_measurements

Log measurements. Write tool: needs a key with read and write scope.

Log tape measurements in cm. Include at least one site: chest, waist, hips, arms, thighs, neck.

Arguments

ArgumentTypeRequiredDescription
chest_cmnumberno
waist_cmnumberno
hips_cmnumberno
arms_cmnumberno
thighs_cmnumberno
neck_cmnumberno
logged_atstring (date-time)noDefaults to now.

Example call

{
  "jsonrpc": "2.0",
  "id": 19,
  "method": "tools/call",
  "params": {
    "name": "log_measurements",
    "arguments": {
      "waist_cm": 86,
      "chest_cm": 104.5,
      "logged_at": "2026-09-18T07:10:00Z"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "ms_12",
  "chest_cm": 104.5,
  "waist_cm": 86,
  "hips_cm": null,
  "arms_cm": null,
  "thighs_cm": null,
  "neck_cm": null,
  "logged_at": "2026-09-18T07:10:00Z"
}

log_nutrition

Log nutrition day. Write tool: needs a key with read and write scope. Idempotent.

Set the calorie and macro totals for one day (YYYY-MM-DD). Replaces the totals for that day; meals ticked in the app are kept.

Arguments

ArgumentTypeRequiredDescription
daystring (date)yes
caloriesnumberyes
protein_gnumberyes
carbs_gnumberyes
fat_gnumberyes

Example call

{
  "jsonrpc": "2.0",
  "id": 20,
  "method": "tools/call",
  "params": {
    "name": "log_nutrition",
    "arguments": {
      "day": "2026-09-18",
      "calories": 2116,
      "protein_g": 176,
      "carbs_g": 200,
      "fat_g": 68
    }
  }
}

Example result

The structuredContent of the response.

{
  "day": "2026-09-18",
  "calories": 2116,
  "protein_g": 176,
  "carbs_g": 200,
  "fat_g": 68,
  "logged_at": "2026-09-18T21:30:00Z"
}

log_supplement_taken

Mark supplement taken. Write tool: needs a key with read and write scope. Idempotent.

Tick a supplement as taken on a day (defaults to today, UTC). Calling twice for the same day is harmless.

Arguments

ArgumentTypeRequiredDescription
supplement_idstringyes
daystring (date)noDefaults to today in UTC.
taken_atstring (date-time)noDefaults to now.

Example call

{
  "jsonrpc": "2.0",
  "id": 21,
  "method": "tools/call",
  "params": {
    "name": "log_supplement_taken",
    "arguments": {
      "supplement_id": "sp_3",
      "day": "2026-09-18"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "sl_918",
  "supplement_id": "sp_3",
  "day": "2026-09-18",
  "taken_at": "2026-09-18T08:02:00Z"
}

set_goal

Set goal. Write tool: needs a key with read and write scope.

Set a new body goal. The newest goal is the current one. Starting weight defaults to the latest weight log.

Arguments

ArgumentTypeRequiredDescription
target_weight_kgnumberno
target_body_fat_percentnumberno
deadlinestring (date)no
start_weight_kgnumbernoDefaults to your latest weight log.

Example call

{
  "jsonrpc": "2.0",
  "id": 22,
  "method": "tools/call",
  "params": {
    "name": "set_goal",
    "arguments": {
      "target_weight_kg": 78,
      "target_body_fat_percent": 14,
      "deadline": "2026-12-19"
    }
  }
}

Example result

The structuredContent of the response.

{
  "id": "gl_2",
  "target_weight_kg": 78,
  "target_body_fat_percent": 14,
  "deadline": "2026-12-19",
  "start_weight_kg": 84.2,
  "created_at": "2026-09-01T08:12:00Z"
}