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
| Argument | Type | Required | Description |
|---|---|---|---|
since | string (date-time) | no | Inclusive lower bound, RFC 3339. |
until | string (date-time) | no | Exclusive upper bound, RFC 3339. |
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
workout_id | string | yes |
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
| Argument | Type | Required | Description |
|---|---|---|---|
exercise_id | string | yes | |
since | string (date-time) | no | Inclusive lower bound, RFC 3339. |
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
query | string | no | Part of the exercise name. |
muscle_group | string: Chest, Back, Legs, Shoulders, Arms, Core, Full body | no | |
equipment | string: Barbell, Dumbbell, Cable, Machine, Bodyweight, Kettlebell, Band | no | |
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
plan_id | string | yes |
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
| Argument | Type | Required | Description |
|---|---|---|---|
since | string (date-time) | no | Inclusive lower bound, RFC 3339. |
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
since | string (date) | no | Inclusive first day, YYYY-MM-DD. |
until | string (date) | no | Inclusive last day, YYYY-MM-DD. |
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
since | string (date-time) | no | Inclusive lower bound, RFC 3339. |
until | string (date-time) | no | Exclusive 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
| Argument | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Page 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
| Argument | Type | Required | Description |
|---|---|---|---|
title | string | no | |
notes | string | no | |
started_at | string (date-time) | yes | When the session started. |
duration_seconds | integer | yes | |
plan_id | string | no | |
plan_name | string | no | |
exercises | array of objects | yes |
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
| Argument | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
focus | string | no | "Chest & Shoulders" |
exercises | array of objects | yes |
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
| Argument | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
summary | string | no | |
progression | string | no | How to add load week to week. |
active | boolean | no | Make this the plan that drives the dashboard. Retires the current active plan. |
days | array of objects | yes | Exactly 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
| Argument | Type | Required | Description |
|---|---|---|---|
weight_kg | number | yes | |
body_fat_percent | number | no | |
notes | string | no | |
logged_at | string (date-time) | no | Defaults 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
| Argument | Type | Required | Description |
|---|---|---|---|
chest_cm | number | no | |
waist_cm | number | no | |
hips_cm | number | no | |
arms_cm | number | no | |
thighs_cm | number | no | |
neck_cm | number | no | |
logged_at | string (date-time) | no | Defaults 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
| Argument | Type | Required | Description |
|---|---|---|---|
day | string (date) | yes | |
calories | number | yes | |
protein_g | number | yes | |
carbs_g | number | yes | |
fat_g | number | yes |
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
| Argument | Type | Required | Description |
|---|---|---|---|
supplement_id | string | yes | |
day | string (date) | no | Defaults to today in UTC. |
taken_at | string (date-time) | no | Defaults 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
| Argument | Type | Required | Description |
|---|---|---|---|
target_weight_kg | number | no | |
target_body_fat_percent | number | no | |
deadline | string (date) | no | |
start_weight_kg | number | no | Defaults 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"
}