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 peopleWhat it returns
resolve_namesResolve names
get_organizationGet organization
list_athletesList athletes
get_athleteGet athlete
get_athlete_profileGet athlete profile
list_coachesList coaches
get_coachGet coach
get_coach_athletesGet a coach's athletes
list_teamsList teams
get_teamGet team
Training and templatesWhat it returns
list_workoutsList workouts
get_workoutGet workout
list_active_workoutsList active workouts
get_active_workoutGet active workout
list_programsList programs
get_programGet program
get_program_attendanceGet program attendance
get_program_effectivenessGet program effectiveness
list_templatesList templates
get_templateGet template
MeasurementsWhat it returns
get_metric_trendGet metric trend
get_metric_rankingGet metric ranking
list_equationsList load-velocity profiles
get_equationGet load-velocity profile
list_leaderboardsList leaderboards
get_leaderboardGet leaderboard
list_wellness_testsList wellness questionnaires
get_wellness_testGet wellness questionnaire
list_injury_reportsList injury reports
get_injury_reportGet injury report
CatalogsWhat it returns
list_exercisesList exercises
list_musclesList muscles
list_metricsList metrics
list_prescription_typesList prescription types
list_unitsList units
get_catalog_itemsGet catalog items
KnowledgeWhat it returns
get_knowledge_baseGet 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 }. While hasMore is true, call the same tool again with the same arguments and cursor set to nextCursor. limit is 1–100, 25 by default.
  • Details return { data }. get_catalog_items adds notFound; the analytics tools and resolve_names return their own shapes, shown in each example.
  • Records keep their API field names, so the API reference documents every field. Fields whose value is null are omitted.
  • Ids link records. userId is an athlete (get_athlete); createdBy is staff (get_coach); recordedByUserId is the athlete or a staff member; exerciseId, metricId, prescriptionTypeId and unitId resolve in batches with get_catalog_items.
  • Dates are ISO 8601. from and to are inclusive, and a bare YYYY-MM-DD covers that whole day in the timezone argument (IANA, UTC by default). A datetime must carry its offset (Z or +02:00); an impossible date such as 2026-02-31 is rejected.
  • Values are in the unit of their metric or prescribed parameter; list_units gives each unit’s conversionFactor.

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

TOOLget_organizationread-only

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

resolve_names

TOOLresolve_namesread-only

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

TOOLlist_athletesread-only

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).
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Notes

  • Coaches only see the athletes assigned to them.

Reads

get_athlete

TOOLget_athleteread-only

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_athletes or a userId field.

Reads

get_athlete_profile

TOOLget_athlete_profileread-only

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_athletes or a userId field.

Reads

list_coaches

TOOLlist_coachesread-only

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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_coach

TOOLget_coachread-only

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, createdBy or recordedByUserId.

Reads

get_coach_athletes

TOOLget_coach_athletesread-only

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_teams

TOOLlist_teamsread-only

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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Notes

  • A coach sees every team, with only their visible athletes listed.

Reads

get_team

TOOLget_teamread-only

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_teams or an athlete’s teams[].id.

Reads

Training and templates

Workouts as performed, the programs that schedule them, and the template library.

list_workouts

TOOLlist_workoutsread-only

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 | pendingdefault completed
completed (performed) or pending (assigned, not done yet).
fromdate
Inclusive start: YYYY-MM-DD (start of that day in timezone) or an ISO 8601 datetime with offset.
todate
Inclusive end: YYYY-MM-DD (covers that whole day in timezone) or an ISO 8601 datetime with offset.
timezonestring
IANA time zone the user’s dates mean, e.g. Europe/Madrid. Default UTC.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_workout

TOOLget_workoutread-only

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_workouts or a program’s scheduledWorkouts[].workout.id.
repetitionsbooleandefault true
false: each set keeps its metric values and a repetitionCount instead 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: false each set answers repetitionCount (the reps the app counts, eccentric rows left out) instead. A very long session can exceed the result limit even so; summarise it with get_metric_trend or get_metric_ranking.

Reads

list_active_workouts

TOOLlist_active_workoutsread-only

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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_active_workout

TOOLget_active_workoutread-only

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.
repetitionsbooleandefault false
true: every rep with its type and metric values. Default false: each set keeps its metric values and a repetitionCount.

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

list_programs

TOOLlist_programsread-only

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

isTemplateboolean
true: 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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_program

TOOLget_programread-only

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_program_attendance

TOOLget_program_attendanceread-only

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_programs with isTemplate: 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[], overall and teams[] cover the program to date; occurrences[] carries each due session’s dateKey, to look at one period.

Reads

get_program_effectiveness

TOOLget_program_effectivenessread-only

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_programs with isTemplate: false.
timezonestring
IANA time zone the user’s dates mean, e.g. Europe/Madrid. Default UTC.

Notes

  • Compare a goal’s summary.meanProgress with its expectedProgress to tell whether the group is on track.
  • goals is empty before the program starts or when it has no goals; a goal whose read failed carries error and the others are still evaluated.

Reads

list_templates

TOOLlist_templatesread-only

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 | prescriptionrequired
workout, phase, block, prescriptions_group (a superset) or prescription (a single exercise with its sets).
searchstring
Case-insensitive partial match on template name.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_template

TOOLget_templateread-only

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 | prescriptionrequired
workout, phase, block, prescriptions_group (a superset) or prescription (a single exercise with its sets).
iduuidrequired
Template id, from list_templates or a template tree.

Reads

Measurements

Metric trends and rankings, load-velocity profiles, leaderboards, wellness and injuries.

get_metric_trend

TOOLget_metric_trendread-only

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 | latestrequired
sum totals additive metrics (repetitions, tonnage, distance); the metric must support the calculation.
fromdaterequired
Inclusive start: YYYY-MM-DD (start of that day in timezone) or an ISO 8601 datetime with offset.
todaterequired
Inclusive end: YYYY-MM-DD (covers that whole day in timezone) 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 (filterUnit in the result). Requires filterMetricId.
filterMaxnumber
Inclusive upper bound, in the display unit of filterMetricId (filterUnit in the result). Requires filterMetricId.
granularityday | week | month
Bucket size when the user asks for one: day (ranges up to 93 days), week (up to 731) or month. 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. unit names the metric’s unit and filterUnit the 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_metric_ranking

TOOLget_metric_rankingread-only

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 | latestrequired
sum totals additive metrics (repetitions, tonnage, distance); the metric must support the calculation.
fromdaterequired
Inclusive start: YYYY-MM-DD (start of that day in timezone) or an ISO 8601 datetime with offset.
todaterequired
Inclusive end: YYYY-MM-DD (covers that whole day in timezone) 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 (filterUnit in the result). Requires filterMetricId.
filterMaxnumber
Inclusive upper bound, in the display unit of filterMetricId (filterUnit in the result). Requires filterMetricId.
orderdesc | ascdefault desc
asc for metrics where lower is better (times).
limitintegerdefault 25
How many ranked athletes to return, 1–100.

Notes

  • rankedCount counts 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. unit names the metric’s unit and filterUnit the 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

list_equations

TOOLlist_equationsread-only

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.
isSelectedboolean
true: only the profiles in use.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_equation

TOOLget_equationread-only

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

list_leaderboards

TOOLlist_leaderboardsread-only

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).
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_leaderboard

TOOLget_leaderboardread-only

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

list_wellness_tests

TOOLlist_wellness_testsread-only

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 in timezone) or an ISO 8601 datetime with offset.
todate
Inclusive end: YYYY-MM-DD (covers that whole day in timezone) or an ISO 8601 datetime with offset.
timezonestring
IANA time zone the user’s dates mean, e.g. Europe/Madrid. Default UTC.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_wellness_test

TOOLget_wellness_testread-only

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

list_injury_reports

TOOLlist_injury_reportsread-only

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.
recoveredboolean
false: active injuries only; true: recovered only.
fromdate
Inclusive start: YYYY-MM-DD (start of that day in timezone) or an ISO 8601 datetime with offset.
todate
Inclusive end: YYYY-MM-DD (covers that whole day in timezone) or an ISO 8601 datetime with offset.
timezonestring
IANA time zone the user’s dates mean, e.g. Europe/Madrid. Default UTC.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_injury_report

TOOLget_injury_reportread-only

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

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

TOOLlist_exercisesread-only

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 | organizationdefault all
global: Vitruve’s library; organization: the organization’s own exercises.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

list_muscles

TOOLlist_musclesread-only

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

limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

list_metrics

TOOLlist_metricsread-only

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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

list_prescription_types

TOOLlist_prescription_typesread-only

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.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

list_units

TOOLlist_unitsread-only

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 | imperial
metric or imperial.
limitintegerdefault 25
Page size, 1–100. Lower it when items are large.
cursorstring
nextCursor from the previous result. Repeat the same arguments with it to continue.

Reads

get_catalog_items

TOOLget_catalog_itemsread-only

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, prescriptionTypeId and unitId fields of other results instead of paging through whole catalogs.

Reads

Knowledge

Vitruve’s documentation, for interpreting the data correctly. Also available as MCP resources, vitruve://knowledge/{topic}.

get_knowledge_base

TOOLget_knowledge_baseread-only

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-model before 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 with section, or the whole topic with section: "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 dataTopic
training-data-modelHow workouts, programs and templates nest, every prescription type, and how scheduling works
vbt-methodologyVelocity-based training reference: velocity and %1RM tables, velocity loss, zones
Training in the appTopic
getting-startedGetting started with Vitruve
trainingThe Training screen
vbt-training-screenRecording a VBT workout
quick-startQuick tracking
offline-modeTraining offline
jump-testsJump workouts
sprint-testsSprint workouts
reaction-testsReaction workouts
historyWorkout history
calendarCalendar
PlanningTopic
templatesThe template library
programsProgram templates
phasesPhase templates
workoutsWorkout templates
blocksBlock templates
prescriptions-groupsSupersets and circuits
prescriptionsExercise prescriptions
exercisesThe exercise library
live-programsAssigning live programs
Team and resultsTopic
athletesAthlete roster
teamsTeams
coachesCoaching staff
coach-modeCoach Mode
wellnessWellness questionnaires
injury-reportsInjury tracking
equationsLoad-velocity profiles
leaderboardsLeaderboards
chatsTeam messaging
data-exportExporting training data
Account, plans and supportTopic
settingsSettings
integrationsIntegrations and wearables
accountAccount settings
organizationOrganization settings
rolesRoles and permissions
subscriptionPlans and billing
ai-assistantThe in-app AI assistant
appsVitruve apps and platforms
helpHelp and support
troubleshootingTroubleshooting
resourcesResources and education
shipping-warrantyShipping, returns and warranty
HardwareTopic
encoderThe Vitruve encoder
vitruve-forceVitruve Force
Coaching scienceTopic
vbt-scienceVBT science and methodology
velocity-loss-fatigueVelocity loss and fatigue management
periodization-programmingPeriodization and programming
strength-typesTypes of strength and hypertrophy
power-plyometricsPower, plyometrics and ballistic training
sport-specific-programsSport-specific S&C programs
recovery-nutritionRecovery, sleep and nutrition
training-methodsAdvanced training methods

On this page