Body Lab training: today's prescribed session and why, load, recovery, activities and strength.
One address for any MCP client. You sign in at bodylab.lol once, after adding it.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
| Access to | Read | Change |
|---|---|---|
| Training | ||
| Today | ||
| Equipment | ||
| Schedule | ||
| Events | ||
| Labs | ||
| Body |
From the sign-in at bodylab.lol, as the endpoint publishes it. You approve it there.
Odel could not list its tools without signing in.
Connect Claude, ChatGPT, or any assistant that speaks the Model Context Protocol to your Body Lab training. Ask what to do today and why, how last week went, whether you're recovered, or what your squat has been doing, and the answers come from your own data and Body Lab's engine.
https://bodylab.lol/mcp
This repository is the public home of the server: how to connect, the tool reference, the MCP Registry entry, and a Claude Code plugin. The server itself runs at the address above. It's hosted, so there's nothing to install or run.
You need a Body Lab account. The first time an assistant connects, it sends you to Body Lab to sign in and approve it.
Body Lab isn't listed in assistants' app directories yet, so you add it by its address.
Claude (web, desktop, mobile):
https://bodylab.lol/mcp
and press Add.On a Team or Enterprise plan, an organization owner adds it first (Organization settings → Connectors). The free plan allows one custom connector. See Anthropic's custom connector guide.
ChatGPT (web; Plus, Pro, Business, Enterprise or Education):
https://bodylab.lol/mcp, using OAuth.See OpenAI's developer mode guide.
Claude Code:
claude mcp add --transport http body-lab https://bodylab.lol/mcp
Then run /mcp inside Claude Code and choose Body Lab to sign in. Or install
the plugin, which adds the server and skills for using it well:
/plugin marketplace add bodylab-lol/mcp
/plugin install body-lab@bodylab-lol
VS Code, Cursor and other clients: add a remote (Streamable HTTP) MCP
server with the URL https://bodylab.lol/mcp. For clients configured with
JSON:
{
"mcpServers": {
"body-lab": { "type": "http", "url": "https://bodylab.lol/mcp" }
}
}
An assistant can see your training. With your permission it can also tell Body Lab about today, put sessions you've arranged on your calendar and take them off again, add races and goals at priority B or C, see your lab results and add new ones, for example from a PDF or photo of a lab report, and do the same with body composition scans such as DEXA. It can't change your training history, delete anything, or make an event the A race your plan is built around — that's yours to do in Body Lab.
| Tool | For |
|---|---|
get_today | Today's (and tomorrow's) prescribed session, the reasons behind it, alternatives, readiness |
set_today_context | Tells Body Lab how long you have today, what equipment is to hand and which sports are out, and returns the re-prescribed session. Today only. Needs today:write |
get_week | The next seven days as the engine projects them: detailed through tomorrow, summarised after, and shifting each morning |
schedule_session | Puts a session you've arranged — a club ride, a run with a friend — on your calendar, one entry per occurrence, so Body Lab plans the week around it. The same session twice is stored once. Needs schedule:write |
withdraw_session | Takes a session you arranged off the calendar again. It's kept and marked withdrawn, never deleted; Body Lab's own sessions can't be touched. Needs schedule:write |
schedule_event | Adds a race or goal at priority B or C. It refuses to add an A event, and can't edit one: both are yours to do in Body Lab. Needs events:write |
remove_event | Takes off a race it added itself, after reading it back to you. It can't remove one you entered, and can't remove an A race even if it added it — promoting a race to A is your decision, so taking it back is too. Removing is permanent. Needs events:write |
get_weekly_review | How a complete week went against what was prescribed, load against the band, the strength floor, and whether training so far supports an upcoming event |
get_training_status | Fitness, fatigue, form, workload ratio, strain, intensity balance, week by week |
list_activities, get_activity | Your activities, and one in detail with load, zones, power bests and plan adherence |
get_recovery | Morning resting HR, HRV, sleep and energy scores |
get_strength | The strength session Body Lab would prescribe now, estimated maxes, recent sessions |
get_profile | Heart-rate anchors, FTP, weight, most recent blood pressure, strength equipment, test results, power curve |
find_exercises | The strength exercise catalogue |
suggest_routes | Routes you've done before that fit today's session |
get_lab_results | Your blood test results: each marker over time against the lab's range and guideline limits, and whether a change is beyond normal variation. Needs labs:read |
record_lab_results | Adds a blood draw and its results as the report prints them, after the assistant checks the values with you. It can't edit or delete results. Needs labs:write |
get_body_composition | Your body composition scans: total and regional fat, lean and bone mass, body fat percent, visceral fat, and whole-body bone density, as your report gave them. Needs body:read |
record_body_composition | Adds one scan as the report prints it, after the assistant reads every value back to you. It can't edit or delete scans. Needs body:write |
Prompts: What should I do today? (todays-session) and Review my week
(weekly-review).
Full reference, with every argument: TOOLS.md. Machine-readable, with input and output schemas: tools.json.
Every connection can see your training (training:read). Lab results and
body composition scans are separate from it and from each other, and each is
off unless you turn it on when you approve an assistant:
| Scope | Lets the assistant |
|---|---|
training:read | See your training, recovery, activities and profile |
today:write | Tell Body Lab about today: your time, equipment and sports you can't do. It can't change your training history |
schedule:write | Put sessions on your calendar, and take them off again. It can't change your training history |
events:write | Add and remove races and goals you give it. It can't make one an A race — that rebuilds months of your plan, and you do that in Body Lab |
labs:read | See your lab results |
labs:write | Add lab results you give it. It can't change or delete them |
body:read | See your body composition scans |
body:write | Add body composition scans you give it. It can't change or delete them |
schedule:write covers sessions you've arranged and nothing Body Lab
prescribed: a withdrawn session stays on record, marked withdrawn. events:write
adds races and goals at B or C only; making one your A race, editing it, or
removing it stays in Body Lab, so an assistant can't restructure months of your
plan or delete a race by mistake. Every session or event an assistant adds is
recorded as that assistant's, and each assistant is held to a rolling limit on
how much it can schedule.
An assistant you connected before these existed doesn't get them automatically, and one you allowed for lab results doesn't get body composition. To allow any of them, connect it again (in Claude, disconnect and reconnect Body Lab) and tick those boxes when Body Lab asks. To correct or delete a lab result, to remove a scan, or to change or remove a race, use Body Lab on the web.
Body composition scans, including bone density, are measurements you recorded. Body Lab shows them back to you and nothing more: they are not a diagnosis, a whole-body scan is not a diagnostic bone density test, and nothing Body Lab prescribes reads them.
The server follows the MCP authorization spec (2026-07-28):
https://bodylab.lol/.well-known/oauth-protected-resource/mcphttps://bodylab.lol/.well-known/oauth-authorization-server/oauth/register.resource
parameter (https://bodylab.lol/mcp). Authorization responses carry iss.token_endpoint_auth_method: none). Refresh
tokens rotate. Revoke at /oauth/revoke.training:read (every connection), plus the optional
today:write, schedule:write, events:write, labs:read, labs:write,
body:read and body:write. A 401 names all eight; the athlete chooses the
optional ones on the consent page, and the token response's scope says
what was granted. tools/list shows only the tools the grant covers. A
tools/call for a tool it doesn't cover gets 403 with
WWW-Authenticate: Bearer error="insufficient_scope" and a scope naming
the grant's scopes plus the one needed, for step-up authorization.initialize handshake.Registry name: lol.bodylab/body-lab.
Bugs, questions and tool requests: open an issue.