MCP tools
Every tool of the Vitruve MCP server: what it returns, its arguments, an example call and result, and the API endpoint it reads.
The server exposes 34 tools. All of them only read, are annotated readOnlyHint: true, and act for the user and organization of the connection: a Coach’s calls return only the athletes visible to them. The tools of an add-on the connection lacks are not listed, as Vitruve hides the feature: Builder for list_programs, get_program, get_program_attendance, get_program_effectiveness, list_templates and get_template; Labs for get_metric_trend, get_metric_ranking and get_athlete_profile. Without Builder, list_workouts and get_workout leave out planned sessions not yet completed. Clients list them with tools/list, which includes each tool’s full JSON Schema and description.
| Organization and people | What it returns |
|---|---|
resolve_names | Resolve names |
get_organization | Get organization |
list_athletes | List athletes |
get_athlete | Get athlete |
get_athlete_profile | Get athlete profile |
list_coaches | List coaches |
get_coach | Get coach |
get_coach_athletes | Get a coach's athletes |
list_teams | List teams |
get_team | Get team |
| Training and templates | What it returns |
|---|---|
list_workouts | List workouts |
get_workout | Get workout |
list_active_workouts | List active workouts |
get_active_workout | Get active workout |
list_programs | List programs |
get_program | Get program |
get_program_attendance | Get program attendance |
get_program_effectiveness | Get program effectiveness |
list_templates | List templates |
get_template | Get template |
| Measurements | What it returns |
|---|---|
get_metric_trend | Get metric trend |
get_metric_ranking | Get metric ranking |
list_equations | List load-velocity profiles |
get_equation | Get load-velocity profile |
list_leaderboards | List leaderboards |
get_leaderboard | Get leaderboard |
list_wellness_tests | List wellness questionnaires |
get_wellness_test | Get wellness questionnaire |
list_injury_reports | List injury reports |
get_injury_report | Get injury report |
| Catalogs | What it returns |
|---|---|
list_exercises | List exercises |
list_muscles | List muscles |
list_metrics | List metrics |
list_prescription_types | List prescription types |
list_units | List units |
get_catalog_items | Get catalog items |
| Knowledge | What it returns |
|---|---|
get_knowledge_base | Get knowledge base |
How results look
Each call returns its result once, as JSON text in content (what every client shows the model). get_knowledge_base is the exception: it answers Markdown text, since a JSON string would escape every line break and quote. There is no structuredContent: the tools declare no output schema, and sending the payload twice would double what the model reads.
- Lists return
{ data, hasMore, nextCursor }. WhilehasMoreistrue, call the same tool again with the same arguments andcursorset tonextCursor.limitis 1–100, 25 by default. - Details return
{ data }.get_catalog_itemsaddsnotFound; the analytics tools andresolve_namesreturn their own shapes, shown in each example. - Records keep their API field names, so the API reference documents every field. Fields whose value is
nullare omitted. - Ids link records.
userIdis an athlete (get_athlete);createdByis staff (get_coach);recordedByUserIdis the athlete or a staff member;exerciseId,metricId,prescriptionTypeIdandunitIdresolve in batches withget_catalog_items. - Dates are ISO 8601.
fromandtoare inclusive, and a bareYYYY-MM-DDcovers that whole day in thetimezoneargument (IANA, UTC by default). A datetime must carry its offset (Zor+02:00); an impossible date such as2026-02-31is rejected. - Values are in the unit of their metric or prescribed parameter;
list_unitsgives each unit’sconversionFactor.
Results are capped at 60,000 characters. A list that would exceed it is fetched again with a smaller page, and its nextCursor continues from there, so nothing is skipped. A detail that would exceed it answers an error that says how to narrow the call. See limits.
Organization and people
Who is in the organization. Start here to turn a name into the id other tools filter by.
get_organization
The organization this connection reads: id, name, category and measurementSystem (metric or imperial). Every other tool reads this organization only.
Call
{
"name": "get_organization",
"arguments": {}
}Result
{
"data": {
"id": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"name": "Northgate Performance",
"category": "professional-team",
"measurementSystem": "metric",
"createdAt": "2025-06-10T09:00:00.000Z",
"updatedAt": "2026-01-21T15:40:12.000Z"
}
}Reads
- Get your organization
GET /organization
resolve_names
Resolves up to 20 names of one kind (athletes, coaches, teams or exercises) to ids in one call. Per name it returns up to 5 candidates, the exact name first, then names starting with it, and whether more exist. Every word of a full name must match.
Call
{
"name": "resolve_names",
"arguments": {
"kind": "athlete",
"names": [
"Ana García",
"Lee"
]
}
}Result
{
"kind": "athlete",
"results": [
{
"name": "Ana García",
"matches": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"name": "Ana",
"surname": "García López"
}
],
"hasMore": false
},
{
"name": "Lee",
"matches": [],
"hasMore": false
}
]
}Arguments
kindathlete | coach | team | exerciserequired- What the names are.
namesstring[]required- 1–20 names as the user wrote them, e.g.
Ana García.
Notes
- Several candidates: the assistant asks which one unless the conversation decides. Coaches only find the athletes assigned to them.
Reads
- List athletes
GET /athletes - List coaches
GET /coaches - List teams
GET /teams - List exercises
GET /exercises
list_athletes
Active athletes sorted by surname, with their membership and team ids. Resolves an athlete name to the userId that athlete-data tools filter by.
Call
{
"name": "list_athletes",
"arguments": {
"search": "garcía",
"limit": 25
}
}Result
{
"data": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"name": "Marta",
"surname": "Ibáñez",
"email": "marta.ibanez@example.com",
"isVerified": true,
"profession": "athlete",
"gender": "female",
"measurementSystem": "metric",
"height": 172,
"weight": 64,
"birthDate": "1998-04-12T00:00:00.000Z",
"dominantSide": "right",
"createdAt": "2025-09-02T08:14:31.402Z",
"updatedAt": "2026-03-18T10:22:05.117Z",
"organizationsToUsers": [
{
"id": "0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
"createdAt": "2025-09-02T08:14:31.402Z",
"updatedAt": "2025-09-02T08:14:31.402Z"
}
],
"teams": [
{
"id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
searchstring- Case-insensitive partial match on name, surname or email.
teamIduuid- Only athletes of this team (id from
list_teams). limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Notes
- Coaches only see the athletes assigned to them.
Reads
- List athletes
GET /athletes
get_athlete
One athlete: name, email, gender, birth date, height, weight, dominant side, membership and team ids.
Call
{
"name": "get_athlete",
"arguments": {
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
}
}Result
{
"data": {
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"name": "Marta",
"surname": "Ibáñez",
"email": "marta.ibanez@example.com",
"isVerified": true,
"profession": "athlete",
"gender": "female",
"measurementSystem": "metric",
"height": 172,
"weight": 64,
"birthDate": "1998-04-12T00:00:00.000Z",
"dominantSide": "right",
"createdAt": "2025-09-02T08:14:31.402Z",
"updatedAt": "2026-03-18T10:22:05.117Z",
"organizationsToUsers": [
{
"id": "0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
"createdAt": "2025-09-02T08:14:31.402Z",
"updatedAt": "2025-09-02T08:14:31.402Z"
}
],
"teams": [
{
"id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
}
]
}
}Arguments
iduuidrequired- Athlete id, from
list_athletesor auserIdfield.
Reads
- Get an athlete
GET /athletes/{id}
get_athlete_profile
An athlete’s sport profile as dated versions: sport, position, competition level, squad and strength-training start year. The version without validTo is current.
Call
{
"name": "get_athlete_profile",
"arguments": {
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
}
}Result
{
"data": {
"id": "6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"revision": 2,
"createdAt": "2025-09-02T08:20:00.000Z",
"updatedAt": "2026-02-01T09:00:00.000Z",
"versions": [
{
"id": "b3a8d5f0-71e2-4c69-90a4-e1c7f2d83b56",
"profileId": "6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68",
"validFrom": "2026-02-01T00:00:00.000Z",
"sport": "basketball",
"position": "guard",
"competitionLevel": "professional",
"squad": "first-team",
"strengthTrainingStartedYear": 2016,
"recordedAt": "2026-02-01T09:00:00.000Z",
"recordedByUserId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47"
}
]
}
}Arguments
iduuidrequired- Athlete id, from
list_athletesor auserIdfield.
Reads
- Get an athlete’s sport profile
GET /athletes/{id}/profile
list_coaches
Staff (owners and coaches) sorted by surname, with their membership. Resolves the createdBy and recordedByUserId fields of other results.
Call
{
"name": "list_coaches",
"arguments": {
"role": "coach"
}
}Result
{
"data": [
{
"id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"name": "Daniel",
"surname": "Okafor",
"email": "daniel.okafor@northgate.example",
"isVerified": true,
"profession": "coach",
"organizationsToUsers": [
{
"id": "9c4e1a73-d085-4b2f-a6e8-31f7b5d02c94",
"userId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"roleId": "ef736bad-c98e-410e-bf26-af834332153b"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
searchstring- Case-insensitive partial match on name, surname or email.
roleowner | coach- Only owners or only coaches.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List coaches
GET /coaches
get_coach
One owner or coach with their membership.
Call
{
"name": "get_coach",
"arguments": {
"id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47"
}
}Result
{
"data": {
"id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"name": "Daniel",
"surname": "Okafor",
"email": "daniel.okafor@northgate.example",
"isVerified": true,
"profession": "coach",
"organizationsToUsers": [
{
"userId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"roleId": "ef736bad-c98e-410e-bf26-af834332153b"
}
]
}
}Arguments
iduuidrequired- Staff user id, from
list_coaches,createdByorrecordedByUserId.
Reads
- Get a coach
GET /coaches/{id}
get_coach_athletes
The ids of the athletes a coach is assigned to: every athlete of the organization except those excluded from them.
Call
{
"name": "get_coach_athletes",
"arguments": {
"id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47"
}
}Result
{
"data": {
"athleteIds": [
"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
]
}
}Arguments
iduuidrequired- Coach user id, from
list_coaches.
Notes
- Owners read any coach’s assignments; a Coach reads only their own, and another coach’s id answers not found.
Reads
- List a coach's athletes
GET /coaches/{id}/athletes
list_teams
Teams sorted by name, each with its athletes as users[].id. Resolves a team name to the teamId that list_athletes filters by.
Call
{
"name": "list_teams",
"arguments": {
"search": "u18"
}
}Result
{
"data": [
{
"id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
"name": "First team",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2025-09-01T10:00:00.000Z",
"updatedAt": "2025-09-01T10:00:00.000Z",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
searchstring- Case-insensitive partial match on team name.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Notes
- A coach sees every team, with only their visible athletes listed.
Reads
- List teams
GET /teams
get_team
One team with its athletes as users[].id.
Call
{
"name": "get_team",
"arguments": {
"id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
}
}Result
{
"data": {
"id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
"name": "First team",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
]
}
}Arguments
iduuidrequired- Team id, from
list_teamsor an athlete’steams[].id.
Reads
- Get a team
GET /teams/{id}
Training and templates
Workouts as performed, the programs that schedule them, and the template library.
list_workouts
Athletes’ workouts newest first, as headers without content. completed (default) lists performed sessions by completedAt; pending lists assigned sessions not yet performed, by createdAt.
Call
{
"name": "list_workouts",
"arguments": {
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"from": "2026-09-01",
"limit": 10
}
}Result
{
"data": [
{
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"name": "Lower body strength A",
"isTemplate": false,
"rpe": 8,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"completedAt": "2026-03-17T10:41:52.318Z",
"startedAt": "2026-03-17T09:58:04.902Z",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:41:52.877Z"
},
{
"id": "5a0e7c3d-91b4-4f26-8d58-c3e2a1f6b097",
"name": "Upper body power",
"isTemplate": false,
"rpe": 7,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"completedAt": "2026-03-14T17:32:10.441Z",
"startedAt": "2026-03-14T16:55:47.019Z",
"createdAt": "2026-03-14T16:55:46.870Z",
"updatedAt": "2026-03-14T17:32:10.902Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
userIduuid- Athlete id, from
list_athletes. exerciseIduuid- Only workouts with this exercise (id from
list_exercises). trainingTypevbt | jump | sprint | reaction- Only workouts with at least one exercise of this modality.
statuscompleted | pendingdefaultcompletedcompleted(performed) orpending(assigned, not done yet).fromdate- Inclusive start:
YYYY-MM-DD(start of that day intimezone) or an ISO 8601 datetime with offset. todate- Inclusive end:
YYYY-MM-DD(covers that whole day intimezone) or an ISO 8601 datetime with offset. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC. limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List workouts
GET /workouts
get_workout
One athlete workout’s full tree: blocks → prescription groups → prescriptions → prescribed parameters and sets, with prescribed versus executed values, set metrics and repetitions.
Call
{
"name": "get_workout",
"arguments": {
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35"
}
}Result
{
"data": {
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"name": "Lower body strength A",
"isTemplate": false,
"rpe": 8,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"completedAt": "2026-03-17T10:41:52.318Z",
"startedAt": "2026-03-17T09:58:04.902Z",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:41:52.877Z",
"blocks": [
{
"id": "0b6d3a9e-7f21-4c58-9d14-e82a5f3c6b79",
"name": "Main lifts",
"isTemplate": false,
"order": 0,
"prescriptionsGroups": [
{
"id": "4d1e8c75-2a93-4f06-b8e7-39c0a6d5f142",
"name": "Back squat",
"isTemplate": false,
"order": 0,
"prescriptions": [
{
"id": "a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"name": "Back squat",
"order": 0,
"note": "Stop the set if mean velocity drops below 0.55 m/s.",
"isTemplate": false,
"isVbt": true,
"trainingType": "vbt",
"seriePrescriptions": [
{
"id": "e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726",
"prescriptionTypeId": "3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05",
"unitId": "fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78",
"order": 0,
"isRange": false,
"isTopMode": false
},
{
"id": "9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34",
"prescriptionTypeId": "62c8a0f4-3d19-4e7b-a5c2-f0b9d14e8a63",
"unitId": "b7e05a92-4f3c-4d18-86a1-2c9e7d3b5f40",
"order": 1,
"isRange": false,
"isTopMode": false
}
],
"series": [
{
"id": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"order": 0,
"completedAt": "2026-03-17T10:06:30.512Z",
"serieValues": [
{
"id": "0f6d2b84-a7e1-4c39-b05d-e9a3c8f1724b",
"seriePrescriptionId": "e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726",
"valuePrescripted": 100,
"valueExecuted": 100
},
{
"id": "c5a19e37-04bd-4f62-8e7a-3b2d6f0c9a18",
"seriePrescriptionId": "9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34",
"valuePrescripted": 5,
"valueExecuted": 5
}
],
"metricValues": [
{
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.61
}
],
"repetitions": [
{
"id": "e19a4d83-5b60-4c27-a8f1-0d7c3e52b946",
"type": "concentric",
"repNumber": 1,
"repIndex": 0,
"metricValues": [
{
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.64
},
{
"metricId": "2a9c6e41-b0d8-4f73-9e15-84d3c7a0b2f6",
"value": 1.12
}
]
},
{
"id": "48b3f6d1-e2a0-4c95-b7d8-06f1a9c3e5b2",
"type": "concentric",
"repNumber": 2,
"repIndex": 1,
"metricValues": [
{
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.62
}
]
}
]
}
]
}
]
}
]
}
]
}
}Arguments
iduuidrequired- Workout id, from
list_workoutsor a program’sscheduledWorkouts[].workout.id. repetitionsbooleandefaulttruefalse: each set keeps its metric values and arepetitionCountinstead of every rep. Use it for a session overview.
Notes
- Nested rows omit what their parent already carries: ids of the enclosing rows, the owner, the organization and timestamps. Metric values become
{ metricId, value }. - Every repetition is returned with its type and metric values; an eccentric row is the same rep measured on the way down, which the Vitruve app leaves out of its rep count.
- Repetitions dominate a workout’s size. With
repetitions: falseeach set answersrepetitionCount(the reps the app counts, eccentric rows left out) instead. A very long session can exceed the result limit even so; summarise it withget_metric_trendorget_metric_ranking.
Reads
- Get a workout
GET /workouts/{id}
list_active_workouts
Sessions athletes are performing right now, newest first, as headers without content (version grows with every save, updatedAt is the last save). A finished session moves to list_workouts.
Call
{
"name": "list_active_workouts",
"arguments": {
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
}
}Result
{
"data": [
{
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"version": 12,
"createdAt": "2026-03-17T09:58:05.114Z",
"updatedAt": "2026-03-17T10:21:37.502Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
userIduuid- Athlete id, from
list_athletes. limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List active workouts
GET /active-workouts
get_active_workout
One session in progress as the app last saved it, in the same tree as get_workout: the sets done so far with their values and metrics.
Call
{
"name": "get_active_workout",
"arguments": {
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35"
}
}Result
{
"data": {
"id": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"name": "Lower body strength A",
"isTemplate": false,
"rpe": 8,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"startedAt": "2026-03-17T09:58:04.902Z",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:21:37.502Z",
"blocks": [
{
"id": "0b6d3a9e-7f21-4c58-9d14-e82a5f3c6b79",
"name": "Main lifts",
"isTemplate": false,
"order": 0,
"workoutId": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-10T16:20:11.004Z",
"prescriptionsGroups": [
{
"id": "4d1e8c75-2a93-4f06-b8e7-39c0a6d5f142",
"name": "Back squat",
"isTemplate": false,
"order": 0,
"blockId": "0b6d3a9e-7f21-4c58-9d14-e82a5f3c6b79",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-10T16:20:11.004Z",
"prescriptions": [
{
"id": "a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"prescriptionsGroupId": "4d1e8c75-2a93-4f06-b8e7-39c0a6d5f142",
"name": "Back squat",
"order": 0,
"note": "Stop the set if mean velocity drops below 0.55 m/s.",
"isTemplate": false,
"isVbt": true,
"trainingType": "vbt",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-10T16:20:11.004Z",
"seriePrescriptions": [
{
"id": "e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"prescriptionId": "a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8",
"prescriptionTypeId": "3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05",
"unitId": "fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78",
"order": 0,
"isRange": false,
"isTopMode": false,
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-10T16:20:11.004Z"
},
{
"id": "9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"prescriptionId": "a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8",
"prescriptionTypeId": "62c8a0f4-3d19-4e7b-a5c2-f0b9d14e8a63",
"unitId": "b7e05a92-4f3c-4d18-86a1-2c9e7d3b5f40",
"order": 1,
"isRange": false,
"isTopMode": false,
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-10T16:20:11.004Z"
}
],
"series": [
{
"id": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"prescriptionId": "a7f35c20-9e18-4d64-8b3a-5c2d0e91f6b8",
"order": 0,
"completedAt": "2026-03-17T10:06:30.512Z",
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:06:30.512Z",
"serieValues": [
{
"id": "0f6d2b84-a7e1-4c39-b05d-e9a3c8f1724b",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"seriePrescriptionId": "e3b72d05-6a1c-4f98-b4e3-1d8c9a5f0726",
"valuePrescripted": 100,
"valueExecuted": 100,
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:06:30.512Z"
},
{
"id": "c5a19e37-04bd-4f62-8e7a-3b2d6f0c9a18",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"seriePrescriptionId": "9d4f1b68-c2e7-4a05-93d1-7b6e0f2a8c34",
"valuePrescripted": 5,
"valueExecuted": 5,
"createdAt": "2026-03-10T16:20:11.004Z",
"updatedAt": "2026-03-17T10:06:30.512Z"
}
],
"metricValues": [
{
"id": "71e4c0a9-5d36-4b82-a1f7-9c8e2b4d0563",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.61,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"createdAt": "2026-03-17T10:06:30.512Z",
"updatedAt": "2026-03-17T10:06:30.512Z"
}
],
"repetitions": [
{
"id": "e19a4d83-5b60-4c27-a8f1-0d7c3e52b946",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"type": "concentric",
"repNumber": 1,
"repIndex": 0,
"createdAt": "2026-03-17T10:05:58.140Z",
"updatedAt": "2026-03-17T10:05:58.140Z",
"metricValues": [
{
"id": "86a1c4e7-3b05-4d9f-92e8-5f1d7c0a3b94",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.64,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"repetitionId": "e19a4d83-5b60-4c27-a8f1-0d7c3e52b946",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"createdAt": "2026-03-17T10:05:58.140Z",
"updatedAt": "2026-03-17T10:05:58.140Z"
},
{
"id": "3c7e9b20-a5f1-4d86-b2c4-71d0e8f3a659",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "2a9c6e41-b0d8-4f73-9e15-84d3c7a0b2f6",
"value": 1.12,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"repetitionId": "e19a4d83-5b60-4c27-a8f1-0d7c3e52b946",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"createdAt": "2026-03-17T10:05:58.140Z",
"updatedAt": "2026-03-17T10:05:58.140Z"
}
]
},
{
"id": "48b3f6d1-e2a0-4c95-b7d8-06f1a9c3e5b2",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"type": "concentric",
"repNumber": 2,
"repIndex": 1,
"createdAt": "2026-03-17T10:06:03.377Z",
"updatedAt": "2026-03-17T10:06:03.377Z",
"metricValues": [
{
"id": "d9c2a5e0-8b17-4f4d-a36e-5e0b7c1f9d84",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"value": 0.62,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"repetitionId": "48b3f6d1-e2a0-4c95-b7d8-06f1a9c3e5b2",
"serieId": "68c2e5b1-0d47-4a93-9f6e-b13a7d84c250",
"createdAt": "2026-03-17T10:06:03.377Z",
"updatedAt": "2026-03-17T10:06:03.377Z"
}
]
}
]
}
]
}
]
}
]
}
],
"version": 12
}
}Arguments
iduuidrequired- Active workout id, from
list_active_workouts. repetitionsbooleandefaultfalsetrue: every rep with its type and metric values. Defaultfalse: each set keeps its metric values and arepetitionCount.
Notes
- Repetitions are left out by default: a session in progress is read for where the athlete is, and every rep can exceed the result limit. Ask for them with
repetitions: true. - Nested rows omit what their parent already carries, as in
get_workout.
Reads
- Get an active workout
GET /active-workouts/{id}
list_programs
Training programs newest first, with their assigned athletes as users[].id. isTemplate: true lists the program template library; false lists programs assigned to athletes.
Call
{
"name": "list_programs",
"arguments": {
"isTemplate": false
}
}Result
{
"data": [
{
"id": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"name": "Pre-season strength block",
"isTemplate": false,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"startedAt": "2026-03-02T00:00:00.000Z",
"createdAt": "2026-02-24T11:05:42.610Z",
"updatedAt": "2026-03-01T18:12:09.233Z",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
isTemplatebooleantrue: templates only;false: assigned programs only; omitted: both.userIduuid- Only programs assigned to this athlete (id from
list_athletes). searchstring- Case-insensitive partial match on program name.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List programs
GET /programs
get_program
One program: phases → scheduled workouts (when each repeats: recurrence, include, exclude) → workout header. Read a scheduled workout’s content with get_workout.
Call
{
"name": "get_program",
"arguments": {
"id": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53"
}
}Result
{
"data": {
"id": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"name": "Pre-season strength block",
"isTemplate": false,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"startedAt": "2026-03-02T00:00:00.000Z",
"createdAt": "2026-02-24T11:05:42.610Z",
"updatedAt": "2026-03-01T18:12:09.233Z",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
],
"phases": [
{
"id": "b45e0c97-1a68-4d32-9c7f-82f3d6a1e0b4",
"name": "Accumulation",
"isTemplate": false,
"order": 0,
"weeks": 4,
"programId": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-02-24T11:05:42.610Z",
"updatedAt": "2026-02-24T11:05:42.610Z",
"scheduledWorkouts": [
{
"id": "73d9f1c8-e526-4a0b-b4d3-9e8a2c5f6710",
"color": "#4C8BF5",
"phaseId": "b45e0c97-1a68-4d32-9c7f-82f3d6a1e0b4",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"include": [],
"exclude": [
14
],
"recurrence": [
0,
3
],
"createdAt": "2026-02-24T11:05:42.610Z",
"updatedAt": "2026-02-24T11:05:42.610Z",
"workout": {
"id": "a3d81f6c-07e5-4b29-9c4a-e5f2b0d7c813",
"name": "Lower body strength A",
"isTemplate": false,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"scheduledWorkoutId": "73d9f1c8-e526-4a0b-b4d3-9e8a2c5f6710",
"createdAt": "2026-02-24T11:05:42.610Z",
"updatedAt": "2026-02-24T11:05:42.610Z"
}
},
{
"id": "f0a7d3c6-29e8-4b51-9c04-a6b1e8d2f375",
"phaseId": "b45e0c97-1a68-4d32-9c7f-82f3d6a1e0b4",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"include": [
26
],
"exclude": [],
"recurrence": [],
"createdAt": "2026-02-24T11:07:15.032Z",
"updatedAt": "2026-02-24T11:07:15.032Z",
"workout": {
"id": "e86b2c47-d150-4f3a-a8e9-2f7c4d06b5a1",
"name": "Jump test",
"isTemplate": false,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"scheduledWorkoutId": "f0a7d3c6-29e8-4b51-9c04-a6b1e8d2f375",
"createdAt": "2026-02-24T11:07:15.032Z",
"updatedAt": "2026-02-24T11:07:15.032Z",
"testType": "vertical_jump"
}
}
]
}
]
}
}Arguments
iduuidrequired- Program id, from
list_programs.
Reads
- Get a program
GET /programs/{id}
get_program_attendance
How a program’s athletes keep to it, as the program page of the app computes it: planned sessions already due matched to the sessions performed, overall, per athlete, per team and per planned session. Use it for compliance and missed sessions instead of expanding the schedule.
Call
{
"name": "get_program_attendance",
"arguments": {
"id": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"timezone": "Europe/Madrid"
}
}Result
{
"data": {
"programId": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"asOf": "2026-03-25",
"startDateKey": "2026-02-24",
"endDateKey": "2026-04-21",
"overall": {
"athletesCount": 2,
"due": 18,
"fulfilled": 15,
"missed": 3,
"rate": 0.8333
},
"completion": {
"total": 32,
"completed": 15,
"remaining": 17
},
"athletes": [
{
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"due": 9,
"fulfilled": 9,
"missed": 0,
"rate": 1,
"unplanned": 1
},
{
"userId": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
"due": 9,
"fulfilled": 6,
"missed": 3,
"rate": 0.6667,
"unplanned": 0
}
],
"teams": [
{
"teamId": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
"name": "First team",
"athletesCount": 2,
"due": 18,
"fulfilled": 15,
"missed": 3,
"rate": 0.8333
}
],
"occurrences": [
{
"scheduledWorkoutId": "73d9f1c8-e526-4a0b-b4d3-9e8a2c5f6710",
"name": "Lower body strength A",
"dateKey": "2026-02-24",
"due": 2,
"fulfilled": 2,
"rate": 1
}
]
}
}Arguments
iduuidrequired- Program id, from
list_programswithisTemplate: false. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC.
Notes
- A planned session counts as performed when the athlete completed it from the program within a day of its date. Today’s and yesterday’s sessions are not due yet.
athletes[],overallandteams[]cover the program to date;occurrences[]carries each due session’sdateKey, to look at one period.
Reads
- Get a program’s attendance
GET /programs/{id}/attendance
get_program_effectiveness
How a program’s athletes are progressing towards its goals, as the program page of the app computes it: each goal evaluated per athlete and for the group, with where the group should be by now. Use it to tell whether a program is working.
Call
{
"name": "get_program_effectiveness",
"arguments": {
"id": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"timezone": "Europe/Madrid"
}
}Result
{
"data": {
"programId": "2f8b6a04-d3c1-4e95-87a2-c64e1b9d0f53",
"asOf": "2026-03-25",
"startDateKey": "2026-02-24",
"endDateKey": "2026-04-21",
"timeShare": 0.5179,
"goals": [
{
"goal": {
"id": "d8c41f27-5a9e-4b03-a6f2-0e7b3c95d184",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"calculation": "max",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"condition": "increase",
"target": 5
},
"athletes": [
{
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"baseline": 0.92,
"current": 0.97,
"changePct": 5.43,
"achieved": true,
"progress": 1,
"ratio": 1.087
},
{
"userId": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
"baseline": 0.88,
"current": 0.9,
"changePct": 2.27,
"achieved": false,
"progress": 0.4545,
"ratio": 0.4545
}
],
"summary": {
"evaluated": 2,
"achieved": 1,
"achievedShare": 0.5,
"meanChangePct": 3.85,
"meanProgress": 0.7273
},
"expectedProgress": 0.5179,
"series": {
"points": [
{
"dateKey": "2026-02-24",
"value": 0
},
{
"dateKey": "2026-03-02",
"value": 0.21
},
{
"dateKey": "2026-03-25",
"value": 0.7273
}
],
"projection": [
{
"dateKey": "2026-02-24",
"value": 0
},
{
"dateKey": "2026-04-20",
"value": 1
}
]
}
}
]
}
}Arguments
iduuidrequired- Program id, from
list_programswithisTemplate: false. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC.
Notes
- Compare a goal’s
summary.meanProgresswith itsexpectedProgressto tell whether the group is on track. goalsis empty before the program starts or when it has no goals; a goal whose read failed carrieserrorand the others are still evaluated.
Reads
- Get a program’s effectiveness
GET /programs/{id}/effectiveness
list_templates
The organization’s reusable template library of one kind, newest first, as headers. Program templates are list_programs with isTemplate: true.
Call
{
"name": "list_templates",
"arguments": {
"kind": "workout"
}
}Result
{
"data": [
{
"id": "41d6e9b3-a8f5-4c07-92e1-d5b0c3a76f84",
"name": "Lower body strength",
"isTemplate": true,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
kindworkout | phase | block | prescriptions_group | prescriptionrequiredworkout,phase,block,prescriptions_group(a superset) orprescription(a single exercise with its sets).searchstring- Case-insensitive partial match on template name.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List workout templates
GET /templates/workouts - List phase templates
GET /templates/phases - List block templates
GET /templates/blocks - List prescription group templates
GET /templates/prescriptions-groups - List prescription templates
GET /templates/prescriptions
get_template
One template with its content: a workout, block, superset or prescription template down to its sets, or a phase template with its scheduled workouts. kind must match the template.
Call
{
"name": "get_template",
"arguments": {
"kind": "workout",
"id": "41d6e9b3-a8f5-4c07-92e1-d5b0c3a76f84"
}
}Result
{
"data": {
"id": "41d6e9b3-a8f5-4c07-92e1-d5b0c3a76f84",
"name": "Lower body strength",
"isTemplate": true,
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z",
"blocks": [
{
"id": "6a2f9d14-b8c3-4e70-a5d1-0c7e3b94f826",
"name": "Strength",
"isTemplate": true,
"order": 0,
"workoutId": "41d6e9b3-a8f5-4c07-92e1-d5b0c3a76f84",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z",
"prescriptionsGroups": [
{
"id": "e8b40c7d-5f19-4a26-9d83-2b6a1e0f7c45",
"name": "Main lift",
"isTemplate": true,
"order": 0,
"blockId": "6a2f9d14-b8c3-4e70-a5d1-0c7e3b94f826",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z",
"prescriptions": [
{
"id": "1f7c3e95-a2d8-4b61-8e04-d93b5a2c6f17",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"prescriptionsGroupId": "e8b40c7d-5f19-4a26-9d83-2b6a1e0f7c45",
"name": "Back squat",
"order": 0,
"note": "Stop the set if mean velocity drops below 0.55 m/s.",
"isTemplate": true,
"isVbt": true,
"trainingType": "vbt",
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z",
"seriePrescriptions": [
{
"id": "9d5e2a07-c4b1-4f38-a6e9-71f0d3c8b524",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"prescriptionId": "1f7c3e95-a2d8-4b61-8e04-d93b5a2c6f17",
"prescriptionTypeId": "3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05",
"unitId": "fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78",
"order": 0,
"isRange": false,
"isTopMode": false,
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z"
}
],
"series": [
{
"id": "b2c86f41-03ad-4e95-b7d2-5e18a9c04f63",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"prescriptionId": "1f7c3e95-a2d8-4b61-8e04-d93b5a2c6f17",
"order": 0,
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z",
"serieValues": [
{
"id": "5f03d8b6-e917-4c2a-8b45-c6a2f1e7d390",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"serieId": "b2c86f41-03ad-4e95-b7d2-5e18a9c04f63",
"seriePrescriptionId": "9d5e2a07-c4b1-4f38-a6e9-71f0d3c8b524",
"valuePrescripted": 80,
"createdAt": "2026-02-11T09:30:00.000Z",
"updatedAt": "2026-02-11T09:30:00.000Z"
}
],
"metricValues": [],
"repetitions": []
}
]
}
]
}
]
}
]
}
}Arguments
kindworkout | phase | block | prescriptions_group | prescriptionrequiredworkout,phase,block,prescriptions_group(a superset) orprescription(a single exercise with its sets).iduuidrequired- Template id, from
list_templatesor a template tree.
Reads
- Get a workout template
GET /templates/workouts/{id} - Get a phase template
GET /templates/phases/{id} - Get a block template
GET /templates/blocks/{id} - Get a prescription group template
GET /templates/prescriptions-groups/{id} - Get a prescription template
GET /templates/prescriptions/{id}
Measurements
Metric trends and rankings, load-velocity profiles, leaderboards, wellness and injuries.
get_metric_trend
How a metric evolved per athlete, in time buckets: by default days up to 31 days, weeks up to 93, months beyond, or the granularity asked for. Each bucket is aggregated by calculation. Use it for progress over time.
Call
{
"name": "get_metric_trend",
"arguments": {
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"calculation": "avg",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"userIds": [
"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
],
"from": "2026-07-01",
"to": "2026-09-30",
"timezone": "Europe/Madrid"
}
}Result
{
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"calculation": "avg",
"granularity": "week",
"from": "2026-06-30T22:00:00.000Z",
"to": "2026-09-30T21:59:59.999Z",
"repetitionType": "concentric",
"athleteCount": 1,
"athletes": [
{
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"buckets": [
{
"bucketStart": "2026-06-27T22:00:00.000Z",
"value": 0.61
},
{
"bucketStart": "2026-07-04T22:00:00.000Z",
"value": 0.64
}
]
}
],
"unit": "m/s",
"measurementSystem": "metric"
}Arguments
metricIduuidrequired- The metric to aggregate (id from
list_metrics). calculationavg | max | min | sum | median | latestrequiredsumtotals additive metrics (repetitions, tonnage, distance); the metric must support the calculation.fromdaterequired- Inclusive start:
YYYY-MM-DD(start of that day intimezone) or an ISO 8601 datetime with offset. todaterequired- Inclusive end:
YYYY-MM-DD(covers that whole day intimezone) or an ISO 8601 datetime with offset. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC. userIdsuuid[]- Up to 50 athletes. Omitted: every athlete the user can see, or the team’s.
teamIduuid- Only athletes of this team.
exerciseIduuid- The exercise. Required by per-exercise metrics (velocity, power, force, 1RM…), rejected by the others.
repetitionTypeconcentric | eccentric | all- Repetition phase for repetition metrics. Defaults to
concentric. filterMetricIduuid- Keep only the repetitions or sets whose value of this other metric is within
filterMin–filterMax, e.g. a load band on the weight metric. filterMinnumber- Inclusive lower bound, in the display unit of
filterMetricId(filterUnitin the result). RequiresfilterMetricId. filterMaxnumber- Inclusive upper bound, in the display unit of
filterMetricId(filterUnitin the result). RequiresfilterMetricId. granularityday | week | month- Bucket size when the user asks for one:
day(ranges up to 93 days),week(up to 731) ormonth. Omitted: follows the range.
Notes
- At most 50 athletes per trend. Athletes without data are left out.
- Values and filter bounds are in the user’s display units, as the Vitruve app shows them: their own measurement system, else the organization’s.
unitnames the metric’s unit andfilterUnitthe filter metric’s. Metrics computed on demand (tonnage, workout duration…) stay in their stored unit. The API itself answers in stored units. - Coaches only read the athletes assigned to them.
Reads
- Get a metric trend
GET /analytics/trend
get_metric_ranking
Ranks athletes by one value each over a period: their best, average, total or latest. Use it for leaderboards, top performers and comparisons.
Call
{
"name": "get_metric_ranking",
"arguments": {
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"calculation": "max",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"teamId": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
"from": "2026-01-01",
"to": "2026-09-30",
"limit": 3
}
}Result
{
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"calculation": "max",
"order": "desc",
"repetitionType": "concentric",
"athleteCount": 12,
"rankedCount": 11,
"athletes": [
{
"rank": 1,
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"value": 0.96,
"date": "2026-05-01T16:10:02.000Z"
},
{
"rank": 2,
"userId": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
"value": 0.94,
"date": "2026-04-17T16:10:02.000Z"
}
],
"unit": "m/s",
"measurementSystem": "metric"
}Arguments
metricIduuidrequired- The metric to aggregate (id from
list_metrics). calculationavg | max | min | sum | median | latestrequiredsumtotals additive metrics (repetitions, tonnage, distance); the metric must support the calculation.fromdaterequired- Inclusive start:
YYYY-MM-DD(start of that day intimezone) or an ISO 8601 datetime with offset. todaterequired- Inclusive end:
YYYY-MM-DD(covers that whole day intimezone) or an ISO 8601 datetime with offset. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC. userIdsuuid[]- Up to 50 athletes. Omitted: every athlete the user can see, or the team’s.
teamIduuid- Only athletes of this team.
exerciseIduuid- The exercise. Required by per-exercise metrics (velocity, power, force, 1RM…), rejected by the others.
repetitionTypeconcentric | eccentric | all- Repetition phase for repetition metrics. Defaults to
concentric. filterMetricIduuid- Keep only the repetitions or sets whose value of this other metric is within
filterMin–filterMax, e.g. a load band on the weight metric. filterMinnumber- Inclusive lower bound, in the display unit of
filterMetricId(filterUnitin the result). RequiresfilterMetricId. filterMaxnumber- Inclusive upper bound, in the display unit of
filterMetricId(filterUnitin the result). RequiresfilterMetricId. orderdesc | ascdefaultdescascfor metrics where lower is better (times).limitintegerdefault25- How many ranked athletes to return, 1–100.
Notes
rankedCountcounts the athletes with data in the period.- Values and filter bounds are in the user’s display units, as the Vitruve app shows them: their own measurement system, else the organization’s.
unitnames the metric’s unit andfilterUnitthe filter metric’s. Metrics computed on demand (tonnage, workout duration…) stay in their stored unit. The API itself answers in stored units. - Coaches only read the athletes assigned to them.
Reads
- Rank athletes on a metric
GET /analytics/ranking
list_equations
Athletes’ load-velocity profiles (equations), one per athlete, exercise and metric: quadratic coefficients a, b, c (a = 0 is linear), the fit r2 and isSelected (the profile in use).
Call
{
"name": "list_equations",
"arguments": {
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"isSelected": true
}
}Result
{
"data": [
{
"id": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"name": "Back squat LVP",
"a": 0,
"b": -64.286,
"c": 119.286,
"r2": 0.987,
"isSelected": true,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
userIduuid- Athlete id, from
list_athletes. exerciseIduuid- Exercise id, from
list_exercises. metricIduuid- Metric id, from
list_metrics. isSelectedbooleantrue: only the profiles in use.limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List load-velocity profiles
GET /equations
get_equation
One load-velocity profile with its coefficients and the measured points it was fitted on (equationSeries: weight and velocity).
Call
{
"name": "get_equation",
"arguments": {
"id": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063"
}
}Result
{
"data": {
"id": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"name": "Back squat LVP",
"a": 0,
"b": -64.286,
"c": 119.286,
"r2": 0.987,
"isSelected": true,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z",
"equationSeries": [
{
"id": "5a9c2e71-d4b8-4f06-a3e9-17c0b6d8f2a4",
"equationId": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"weight": 60,
"velocity": 1.14,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z",
"order": 0
},
{
"id": "c38f0b5d-7e2a-4c91-b6d4-e09a3f1c7b58",
"equationId": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"weight": 80,
"velocity": 0.9,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z",
"order": 1
},
{
"id": "81d6a4f3-0c5e-4b27-9a8f-d3e2b7c05a19",
"equationId": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"weight": 100,
"velocity": 0.66,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z",
"order": 2
},
{
"id": "e72b9c08-3f1d-4a65-8e4b-6c0d9a2f7b31",
"equationId": "ad30e6f9-8c47-4b12-a5d8-e91f2c7b4063",
"weight": 115,
"velocity": 0.48,
"createdAt": "2026-02-04T09:12:00.000Z",
"updatedAt": "2026-02-04T09:12:00.000Z",
"order": 3
}
]
}
}Arguments
iduuidrequired- Equation id, from
list_equations.
Reads
- Get a load-velocity profile
GET /equations/{id}
list_leaderboards
Leaderboard definitions newest first: name, metric, exercise and their athletes. Rankings are not stored; an assistant ranks them with get_metric_ranking.
Call
{
"name": "list_leaderboards",
"arguments": {}
}Result
{
"data": [
{
"id": "17b9d4e2-60a5-4c83-bf19-4a8e3d0c6f25",
"name": "Back squat: best mean velocity",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"createdAt": "2025-11-03T08:00:00.000Z",
"updatedAt": "2025-11-03T08:00:00.000Z",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
metricIduuid- Metric id, from
list_metrics. exerciseIduuid- Exercise id, from
list_exercises. userIduuid- Only leaderboards this athlete is on (id from
list_athletes). limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List leaderboards
GET /leaderboards
get_leaderboard
One leaderboard definition with its athletes.
Call
{
"name": "get_leaderboard",
"arguments": {
"id": "17b9d4e2-60a5-4c83-bf19-4a8e3d0c6f25"
}
}Result
{
"data": {
"id": "17b9d4e2-60a5-4c83-bf19-4a8e3d0c6f25",
"name": "Back squat: best mean velocity",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"metricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"createdAt": "2025-11-03T08:00:00.000Z",
"updatedAt": "2025-11-03T08:00:00.000Z",
"users": [
{
"id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
},
{
"id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
}
]
}
}Arguments
iduuidrequired- Leaderboard id, from
list_leaderboards.
Reads
- Get a leaderboard
GET /leaderboards/{id}
list_wellness_tests
Answered wellness questionnaires newest first, each with its questions and answers: readiness, sleep, fatigue, stress, soreness and mood.
Call
{
"name": "list_wellness_tests",
"arguments": {
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"from": "2026-09-01"
}
}Result
{
"data": [
{
"id": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"workoutId": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z",
"questions": [
{
"id": "2b7e4f90-c613-4d8a-95e2-a0f3d71c6b48",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"baseQuestionId": "7c1d9a35-e840-4f62-b0a7-58e3c2d4f916",
"wellnessTestId": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"order": 0,
"question": "How fatigued do you feel?",
"placeholderMinValue": "Very Fatigated",
"placeholderMaxValue": "Not Fatigated",
"minValue": 1,
"maxValue": 5,
"integerValue": 4,
"isSelected": true,
"type": "numeric",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z"
},
{
"id": "f05a8c3e-29d7-4b16-a4c9-6e1b7d0f3a82",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"baseQuestionId": "4e8b2d61-a0f5-4c39-8d17-b9c6e3a05f24",
"wellnessTestId": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"order": 1,
"question": "Write whatever you want",
"stringValue": "Slight tightness in the left calf.",
"isSelected": true,
"type": "text",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
userIduuid- Athlete id, from
list_athletes. workoutIduuid- Only the questionnaire answered with this workout (id from
list_workouts). fromdate- Inclusive start:
YYYY-MM-DD(start of that day intimezone) or an ISO 8601 datetime with offset. todate- Inclusive end:
YYYY-MM-DD(covers that whole day intimezone) or an ISO 8601 datetime with offset. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC. limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List wellness questionnaires
GET /wellness-tests
get_wellness_test
One answered wellness questionnaire with its answers.
Call
{
"name": "get_wellness_test",
"arguments": {
"id": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3"
}
}Result
{
"data": {
"id": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"workoutId": "f2c8e1a6-3d49-4b75-8e02-6a9d4c1b7f35",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z",
"questions": [
{
"id": "2b7e4f90-c613-4d8a-95e2-a0f3d71c6b48",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"baseQuestionId": "7c1d9a35-e840-4f62-b0a7-58e3c2d4f916",
"wellnessTestId": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"order": 0,
"question": "How fatigued do you feel?",
"placeholderMinValue": "Very Fatigated",
"placeholderMaxValue": "Not Fatigated",
"minValue": 1,
"maxValue": 5,
"integerValue": 4,
"isSelected": true,
"type": "numeric",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z"
},
{
"id": "f05a8c3e-29d7-4b16-a4c9-6e1b7d0f3a82",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"baseQuestionId": "4e8b2d61-a0f5-4c39-8d17-b9c6e3a05f24",
"wellnessTestId": "c4e7a18d-9f32-4b50-8d6a-2b1f5e09a7c3",
"order": 1,
"question": "Write whatever you want",
"stringValue": "Slight tightness in the left calf.",
"isSelected": true,
"type": "text",
"createdAt": "2026-03-18T08:47:12.000Z",
"updatedAt": "2026-03-18T08:47:12.000Z"
}
]
}
}Arguments
iduuidrequired- Wellness test id, from
list_wellness_tests.
Reads
- Get a wellness questionnaire
GET /wellness-tests/{id}
list_injury_reports
Injury reports newest first: injury type, side, severity, estimated recovery, recovered and notes.
Call
{
"name": "list_injury_reports",
"arguments": {
"recovered": false
}
}Result
{
"data": [
{
"id": "8f1a3c56-e0d7-4294-b5a8-7d4c9e2f1b60",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdBy": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"injuryType": "Hamstring strain",
"side": "left",
"severity": "mid",
"recoveryEstimatedDate": "2026-04-15T00:00:00.000Z",
"recovered": false,
"notes": "Grade 1. Return to running in two weeks.",
"createdAt": "2026-03-20T16:05:41.000Z",
"updatedAt": "2026-03-20T16:05:41.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
userIduuid- Athlete id, from
list_athletes. recoveredbooleanfalse: active injuries only;true: recovered only.fromdate- Inclusive start:
YYYY-MM-DD(start of that day intimezone) or an ISO 8601 datetime with offset. todate- Inclusive end:
YYYY-MM-DD(covers that whole day intimezone) or an ISO 8601 datetime with offset. timezonestring- IANA time zone the user’s dates mean, e.g.
Europe/Madrid. Default UTC. limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List injury reports
GET /injury-reports
get_injury_report
One injury report.
Call
{
"name": "get_injury_report",
"arguments": {
"id": "8f1a3c56-e0d7-4294-b5a8-7d4c9e2f1b60"
}
}Result
{
"data": {
"id": "8f1a3c56-e0d7-4294-b5a8-7d4c9e2f1b60",
"userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"createdBy": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
"injuryType": "Hamstring strain",
"side": "left",
"severity": "mid",
"recoveryEstimatedDate": "2026-04-15T00:00:00.000Z",
"recovered": false,
"notes": "Grade 1. Return to running in two weeks.",
"createdAt": "2026-03-20T16:05:41.000Z",
"updatedAt": "2026-03-20T16:05:41.000Z"
}
}Arguments
iduuidrequired- Injury report id, from
list_injury_reports.
Reads
- Get an injury report
GET /injury-reports/{id}
Catalogs
The reference data every record points to. Global catalogs are the same for every organization; exercises also include the organization’s own.
list_exercises
Exercises sorted by name: Vitruve’s global library and the organization’s own, with their muscles. Resolves an exercise name to its exerciseId.
Call
{
"name": "list_exercises",
"arguments": {
"search": "squat"
}
}Result
{
"data": [
{
"id": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"name": "Back Squat",
"isMain": true,
"isJump": false,
"isReaction": false,
"isSprint": false,
"equipment": "barbell",
"force": "push",
"level": "intermediate",
"mechanic": "compound",
"instructions": "Set the bar across your upper back and unrack it with feet shoulder-width apart. Bend at the hips and knees until the thighs are at least parallel, then drive up through the whole foot to stand.",
"category": "strength",
"youtubeUrl": "https://www.youtube.com/results?search_query=how%20to%20do%20Back%20Squat",
"googleUrl": "https://www.google.com/search?q=how%20to%20do%20Back%20Squat",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z",
"primaryMuscles": [
{
"id": "5c8f2d06-a931-4e7b-96d4-0b3e8a1f7c52",
"name": "quadriceps",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
}
],
"secondaryMuscles": [
{
"id": "2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264",
"name": "glutes",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
},
{
"id": "e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035",
"name": "hamstrings",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
}
],
"exerciseMetadata": [
{
"id": "9d5c2a71-e4f8-4b36-8c0d-6a1e3f7b9c52",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"videoUrl": "https://videos.northgate.example/back-squat.mp4",
"createdAt": "2025-10-03T11:12:40.000Z",
"updatedAt": "2025-10-03T11:12:40.000Z"
}
]
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
searchstring- Case-insensitive partial match on exercise name.
categorystring- Exact category: strength, plyometrics, olympic weightlifting, powerlifting, cardio, stretching, strongman or test.
sourceall | global | organizationdefaultallglobal: Vitruve’s library;organization: the organization’s own exercises.limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List exercises
GET /exercises
list_muscles
The muscle catalog sorted by name, referenced by exercises’ primary and secondary muscles.
Call
{
"name": "list_muscles",
"arguments": {}
}Result
{
"data": [
{
"id": "2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264",
"name": "glutes",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
},
{
"id": "e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035",
"name": "hamstrings",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List muscles
GET /muscles
list_metrics
Metric definitions in display order, with their unit and where each is captured. Finds the metricId of a measurement before reading values, profiles or leaderboards.
Call
{
"name": "list_metrics",
"arguments": {
"group": "Velocity",
"isRepetitionMetric": true
}
}Result
{
"data": [
{
"id": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"name": "Mean Propulsive Velocity",
"key": "mean-propulsive-velocity",
"group": "Velocity",
"unitId": "fa52c8d4-17e3-4b69-8d0a-6c3f9e1b2a78",
"order": 0,
"isMainVelocityMetric": true,
"isRepetitionMetric": true,
"isSerieMetric": false,
"isQuickStartMetric": true,
"isEquationMetric": true,
"isUserMetric": false,
"createdAt": "2024-01-15T09:00:00.000Z",
"updatedAt": "2026-05-04T07:30:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
groupstring- Exact group, for example Velocity, Force, Power, Time, Weight, Distance, Fatigue or Heart Rate.
isRepetitionMetricboolean- Captured per repetition.
isSerieMetricboolean- Captured per set.
isUserMetricboolean- A standalone athlete measurement (body weight, sleep…).
isEquationMetricboolean- Usable in load-velocity profiles.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List metrics
GET /metrics
list_prescription_types
The parameters a set can prescribe and record (weight, repetitions, velocity targets, RPE, rest, jump, sprint and reaction targets), referenced by seriePrescriptions[].prescriptionTypeId.
Call
{
"name": "list_prescription_types",
"arguments": {
"group": "VBT"
}
}Result
{
"data": [
{
"id": "b8d24f6a-0c97-4e35-a1f8-5d3e9c7b2a16",
"name": "Fatigue [MPV]",
"label": "Fatigue [MPV]",
"metricId": "4c9e7b20-d1a5-4f83-b6e2-a07f3d58c914",
"primaryMetricId": "d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63",
"group": "VBT",
"trainingModality": "vbt",
"valueType": "int",
"placeholder": "0",
"formatRegex": "^(100|\\d{0,2})?$",
"hasRange": false,
"hasTopMode": false,
"createdAt": "2024-01-15T09:00:00.000Z",
"updatedAt": "2026-05-04T07:30:00.000Z"
},
{
"id": "3e9d7a12-c5b8-4f40-a136-d82e4b6f9c05",
"name": "Weight",
"label": "Weight",
"metricId": "62f0d8a4-b3c9-4e17-8a5d-0e4c7f1b9d28",
"group": "General",
"valueType": "float",
"placeholder": "0",
"formatRegex": "^\\d{0,5}(\\.\\d{0,2})?$",
"hasRange": true,
"hasTopMode": false,
"createdAt": "2024-01-15T09:00:00.000Z",
"updatedAt": "2026-05-04T07:30:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
groupstring- Exact group: General, VBT, Jump, Sprint, Reaction, Velocity, Time, Other or Test.
trainingModalityvbt | jump | sprint | reaction- Only the types of this modality.
limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List prescription types
GET /prescription-types
list_units
Units with their dimension, measurement system, metric/imperial counterpart and conversionFactor (base value = value × conversionFactor).
Call
{
"name": "list_units",
"arguments": {
"dimension": "Weight"
}
}Result
{
"data": [
{
"id": "09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246",
"name": "Kilograms",
"dimension": "Weight",
"measurementSystem": "metric",
"label": "kg",
"baseUnitId": "09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246",
"pairUnitId": "7b13e9c5-48d2-4a06-b9f1-c2e8a5d4f317",
"conversionFactor": 1,
"createdAt": "2024-01-15T09:00:00.000Z",
"updatedAt": "2026-05-04T07:30:00.000Z"
},
{
"id": "7b13e9c5-48d2-4a06-b9f1-c2e8a5d4f317",
"name": "Pounds",
"dimension": "Weight",
"measurementSystem": "imperial",
"label": "lb",
"baseUnitId": "09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246",
"pairUnitId": "09e4b7a3-d2c6-4158-b8f0-a71d5c3e9246",
"conversionFactor": 0.45359237,
"createdAt": "2024-01-15T09:00:00.000Z",
"updatedAt": "2026-05-04T07:30:00.000Z"
}
],
"hasMore": true,
"nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
}Arguments
dimensionstring- Exact dimension, for example Weight, Velocity, Distance, Time, Force or Power.
measurementSystemmetric | imperialmetricorimperial.limitintegerdefault25- Page size, 1–100. Lower it when items are large.
cursorstringnextCursorfrom the previous result. Repeat the same arguments with it to continue.
Reads
- List units
GET /units
get_catalog_items
Resolves up to 50 catalog ids of one kind in a single call: exercises, muscles, metrics, prescription types or units. Ids that match nothing are returned in notFound.
Call
{
"name": "get_catalog_items",
"arguments": {
"kind": "metric",
"ids": [
"d06b3f81-4e92-4a7c-8c15-b7e29a0d5f63"
]
}
}Result
{
"data": [
{
"id": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"name": "Back Squat",
"isMain": true,
"isJump": false,
"isReaction": false,
"isSprint": false,
"equipment": "barbell",
"force": "push",
"level": "intermediate",
"mechanic": "compound",
"instructions": "Set the bar across your upper back and unrack it with feet shoulder-width apart. Bend at the hips and knees until the thighs are at least parallel, then drive up through the whole foot to stand.",
"category": "strength",
"youtubeUrl": "https://www.youtube.com/results?search_query=how%20to%20do%20Back%20Squat",
"googleUrl": "https://www.google.com/search?q=how%20to%20do%20Back%20Squat",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z",
"primaryMuscles": [
{
"id": "5c8f2d06-a931-4e7b-96d4-0b3e8a1f7c52",
"name": "quadriceps",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
}
],
"secondaryMuscles": [
{
"id": "2b7e4f19-c6a3-4d80-9e51-a8d3f0c7b264",
"name": "glutes",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
},
{
"id": "e6a09c3d-5f72-4b18-8d4e-17c9b2a6f035",
"name": "hamstrings",
"updatedAt": "2026-05-04T07:30:00.000Z",
"createdAt": "2024-01-15T09:00:00.000Z"
}
],
"exerciseMetadata": [
{
"id": "9d5c2a71-e4f8-4b36-8c0d-6a1e3f7b9c52",
"exerciseId": "1c7a5e93-f804-4b26-a9d1-3e6b0d82c4f7",
"organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
"videoUrl": "https://videos.northgate.example/back-squat.mp4",
"createdAt": "2025-10-03T11:12:40.000Z",
"updatedAt": "2025-10-03T11:12:40.000Z"
}
]
}
],
"notFound": []
}Arguments
kindexercise | muscle | metric | prescription_type | unitrequired- The catalog the ids belong to.
idsuuid[]required- 1–50 ids; duplicates are ignored.
Notes
- Use it for the
exerciseId,metricId,prescriptionTypeIdandunitIdfields of other results instead of paging through whole catalogs.
Reads
- Get an exercise
GET /exercises/{id} - Get a muscle
GET /muscles/{id} - Get a metric
GET /metrics/{id} - Get a prescription type
GET /prescription-types/{id} - Get a unit
GET /units/{id}
Knowledge
Vitruve’s documentation, for interpreting the data correctly. Also available as MCP resources, vitruve://knowledge/{topic}.
get_knowledge_base
Vitruve’s reference documentation for one topic, as Markdown: the training data model, the VBT methodology, and guides to Vitruve features, hardware, plans and roles.
Call
{
"name": "get_knowledge_base",
"arguments": {
"topic": "vbt-methodology"
}
}Result
# VBT Methodology
A long topic (19,097 characters). Read only the sections the question needs: call get_knowledge_base again with topic "vbt-methodology" and section, or section "all" for the whole topic.
Sections (characters):
- role (204)
- core-principles (1,165)
- velocity-references (1,094)
- official-vitruve-velocity-table (5,679)
- …Arguments
topictraining-data-model | vbt-methodology | getting-started | training | vbt-training-screen | quick-start | offline-mode | jump-tests | sprint-tests | reaction-tests | history | calendar | templates | programs | phases | workouts | blocks | prescriptions-groups | prescriptions | exercises | live-programs | athletes | teams | coaches | coach-mode | wellness | injury-reports | equations | leaderboards | chats | data-export | settings | integrations | account | organization | roles | subscription | ai-assistant | apps | help | troubleshooting | resources | shipping-warranty | encoder | vitruve-force | vbt-science | velocity-loss-fatigue | periodization-programming | strength-types | power-plyometrics | sport-specific-programs | recovery-nutrition | training-methodsrequired- The topic to read. Start with
training-data-modelbefore reading a workout or program tree. sectionstring- One section of the topic, as its list of sections names it, or
all. A topic longer than 12,000 characters read without it answers that list.
Notes
- The result is the topic as Markdown text, not JSON: its title as a heading, then the content.
- A topic longer than 12,000 characters (
vbt-methodology,resources) first answers its sections and their sizes; read the ones the question needs withsection, or the whole topic withsection: "all". Shorter topics answer in full. - Product topics end with an
Open in Vitruve:link to the matching page of the web app for the connected organization.
Topics get_knowledge_base and the resources accept:
| Reading Vitruve data | Topic |
|---|---|
training-data-model | How workouts, programs and templates nest, every prescription type, and how scheduling works |
vbt-methodology | Velocity-based training reference: velocity and %1RM tables, velocity loss, zones |
| Training in the app | Topic |
|---|---|
getting-started | Getting started with Vitruve |
training | The Training screen |
vbt-training-screen | Recording a VBT workout |
quick-start | Quick tracking |
offline-mode | Training offline |
jump-tests | Jump workouts |
sprint-tests | Sprint workouts |
reaction-tests | Reaction workouts |
history | Workout history |
calendar | Calendar |
| Planning | Topic |
|---|---|
templates | The template library |
programs | Program templates |
phases | Phase templates |
workouts | Workout templates |
blocks | Block templates |
prescriptions-groups | Supersets and circuits |
prescriptions | Exercise prescriptions |
exercises | The exercise library |
live-programs | Assigning live programs |
| Team and results | Topic |
|---|---|
athletes | Athlete roster |
teams | Teams |
coaches | Coaching staff |
coach-mode | Coach Mode |
wellness | Wellness questionnaires |
injury-reports | Injury tracking |
equations | Load-velocity profiles |
leaderboards | Leaderboards |
chats | Team messaging |
data-export | Exporting training data |
| Account, plans and support | Topic |
|---|---|
settings | Settings |
integrations | Integrations and wearables |
account | Account settings |
organization | Organization settings |
roles | Roles and permissions |
subscription | Plans and billing |
ai-assistant | The in-app AI assistant |
apps | Vitruve apps and platforms |
help | Help and support |
troubleshooting | Troubleshooting |
resources | Resources and education |
shipping-warranty | Shipping, returns and warranty |
| Hardware | Topic |
|---|---|
encoder | The Vitruve encoder |
vitruve-force | Vitruve Force |
| Coaching science | Topic |
|---|---|
vbt-science | VBT science and methodology |
velocity-loss-fatigue | Velocity loss and fatigue management |
periodization-programming | Periodization and programming |
strength-types | Types of strength and hypertrophy |
power-plyometrics | Power, plyometrics and ballistic training |
sport-specific-programs | Sport-specific S&C programs |
recovery-nutrition | Recovery, sleep and nutrition |
training-methods | Advanced training methods |