Mirobody
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
Description from the maker (original English)
Agent-first workout and food log: sets and meals from chat, USDA and Open Food Facts macros, cards.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
BODYLOG_DB, BODYLOG_CARDS, FDC_API_KEY, BODYLOG_OFFLINEValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"bodylog": {
"command": "uvx",
"args": [
"bodylog",
"mcp"
],
"env": {
"BODYLOG_DB": "your-value",
"BODYLOG_CARDS": "your-value",
"FDC_API_KEY": "your-value",
"BODYLOG_OFFLINE": "your-value"
}
}
}
}Run this in your terminal
claude mcp add bodylog --env BODYLOG_DB=your-value --env BODYLOG_CARDS=your-value --env FDC_API_KEY=your-value --env BODYLOG_OFFLINE=your-value -- uvx bodylog mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"bodylog": {
"command": "uvx",
"args": [
"bodylog",
"mcp"
],
"env": {
"BODYLOG_DB": "your-value",
"BODYLOG_CARDS": "your-value",
"FDC_API_KEY": "your-value",
"BODYLOG_OFFLINE": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"bodylog": {
"type": "stdio",
"command": "uvx",
"args": [
"bodylog",
"mcp"
],
"env": {
"BODYLOG_DB": "your-value",
"BODYLOG_CARDS": "your-value",
"FDC_API_KEY": "your-value",
"BODYLOG_OFFLINE": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
BODYLOG_DB envBODYLOG_CARDS envBODYLOG_OFFLINE envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 9, 2026
The registry name was verified with the GitHub account abhaymettu, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: FDC_API_KEY
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.1.0) reached the registry 2 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Mirobody, FHIR MCP Server, Google Health MCP
Servers in the same category from other makers, sorted by stars.
Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Lab results to LOINC codes and UCUM units, symptoms and diagnoses to ICPC-3. Offline, no API key.
MCP server providing seamless access to FHIR APIs for AI tools and healthcare applications
Privacy-first unofficial Google Health API v4 MCP server for health, sleep, activity, HR agents
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
A workout and food log for personal agents. You tell your agent your sets and your meals in chat, the way you would say them out loud. It stores them, counts calories and macros from real nutrition data, keeps your streaks, and sends back shareable cards.
One package for any agent: an MCP server (bodylog-mcp), a CLI (bodylog), a Python library and a Claude skill. Everything lives in one local SQLite file. No accounts, no cloud, no social features.
| Food day | Story | Workout |
|---|---|---|
More: food, light, food + training on one day (full), workout story, 8-exercise workout, two pages, mixed kg and lb, sticker for a photo.
Python 3.10+.
pip install bodylog # CLI + library + MCP server
uvx --from bodylog bodylog-mcp # run the MCP server without installing
Claude Code, as a plugin (skill and MCP server together):
/plugin marketplace add abhaymettu/bodylog
/plugin install bodylog@bodylog
Claude Code, MCP server only:
claude mcp add bodylog -- uvx --from bodylog bodylog-mcp
Any other MCP client:
{
"mcpServers": { "bodylog": { "command": "uvx", "args": ["--from", "bodylog", "bodylog-mcp"], "env": { "FDC_API_KEY": "optional, free at https://api.data.gov/signup/" } } } }
Settings, all optional:
| Variable | Default | What |
|---|---|---|
BODYLOG_DB | ~/.bodylog/log.db | the SQLite file |
BODYLOG_CARDS | ~/.bodylog/cards/ | where card PNGs go |
BODYLOG_UNIT | most-logged unit | kg or lb for workout totals |
FDC_API_KEY | DEMO_KEY | USDA FoodData Central key; DEMO_KEY allows only a few lookups an hour |
BODYLOG_OFFLINE | off | 1 uses only the bundled food table, no network |
The skill is skills/bodylog/SKILL.md. Outside the plugin, copy or symlink skills/bodylog/ into your agent's skills folder.
The CLI prints what the MCP tools return (bodylog eat is log_food). A real run, offline:
$ bodylog eat "2 eggs, toast and a protein shake"
#1 breakfast: 2 × egg, 100 g: 143 kcal, P 12.6 C 0.7 F 9.5 #2 breakfast: toast, 22 g: 64 kcal, P 2 C 12 F 0.9 #3 breakfast: whey protein, 26 g: 92 kcal, P 20.3 C 1.6 F 0.4 $ bodylog eat "greek yogurt with blueberries and a handful of almonds" #4 breakfast: greek yogurt, 170 g: 100 kcal, P 17.3 C 6.1 F 0.7 #5 breakfast: blueberries, 148 g: 84 kcal, P 1.1 C 21.4 F 0.5 #6 breakfast: 1 handful almonds: not counted (no weight for a handful of almonds; give grams or one of: almond, cup, oz) $ bodylog food-fix 6 --grams 28 #6 breakfast: 28 g almonds: 162 kcal, P 5.9 C 6 F 14
A bare count uses USDA's portion for that food: a large egg (50 g), a slice of toast, a scoop of whey (the FNDDS "1 scoop, NFS", 26 g). Through MCP, the agent asks one short question about item 6 instead of guessing.
How a food gets its numbers:
scripts/build_common_foods.py.POST /fdc/v1/foods/search, survey, SR Legacy and Foundation foods), with FDC_API_KEY or DEMO_KEY.GET /api/v2/product/ .json, no key).A search result is used only when its name contains every word you said. Otherwise the item is kept as unknown with the closest candidates, so the agent can ask which one you meant. An item whose amount cannot become grams (a handful, or millilitres of something with no USDA volume weight) is kept as needs_amount. Neither counts toward totals until it is fixed, and neither is ever filled with made-up numbers. Numbers you read off a label are stored as given (manual).
Also: daily goals for kcal, protein, carbs and fat; a logging streak in days (a day you have not logged yet does not break it) and a training streak in weeks; and a day card in dark, light, clear or story format. On a day you also trained, the card adds a Training block.
The chat below comes from a real run through log_set(text=...). The right column shows what the store recorded for each message.
you: push day -> title: Push Day
you: bench 20 kg x 10 warm up -> Bench Press: 20 kg x 10 (warmup) you: 60kg x 10 -> Bench Press: 60 kg x 10 you: 67.5 kg x 4 -> Bench Press: 67.5 kg x 4 you: 62.5 kg x 8 rpe 9 -> Bench Press: 62.5 kg x 8 you: next incline db press 55 lb x 10 -> Incline Dumbbell Press: 55 lb x 10 you: same -> Incline Dumbbell Press: 55 lb x 10 you: 55lb x 9 -> Incline Dumbbell Press: 55 lb x 9 you: 12.5 kg x 12 -> Incline Dumbbell Press: 12.5 kg x 12 you: that was triceps pushdowns on the cable -> named 1 set(s) Triceps Cable Pushdown you: 12.5 kg x 11 -> Triceps Cable Pushdown: 12.5 kg x 11 you: lateral raise 15 lb x 14 -> Lateral Raise: 15 lb x 14 you: 15 lb x 12 -> Lateral Raise: 15 lb x 12 you: one more -> Lateral Raise: 15 lb x 12 you: wrapped up, workout took 1h 3m -> ended session 4
Push Day Thursday, Sep 17 · 6:05 PM 1h 3m · 2,640 kg · 11 sets · 12 PRs Muscles: Chest 55%, Shoulders 27%, Triceps 18%
Bench Press · Chest · 3 sets · best 60 kg x 10 · PR: Heaviest weight, Best 1RM, Best set volume, Most reps W. 20 kg x 10 (warm-up)
Incline Dumbbell Press · Chest · 3 sets · best 55 lb x 10 · PR: Best 1RM, Best set volume, Most reps
Triceps Cable Pushdown · Triceps · 2 sets · best 12.5 kg x 12 · PR: Heaviest weight, Best 1RM
Lateral Raise · Shoulders · 3 sets · best 15 lb x 14 · PR: Best 1RM, Best set volume, Most reps
This week: 2 workouts, 4,687 kg (−14% vs last week to date)
The last message ends the workout, so the tool returns this card along with the workout PNG at the top of this page (end_session does the same). PRs are counted against the three earlier sessions in tests/fixtures/chat.txt.
60kg x 8, 60 x 8, 50lbs for 9, 8 reps at 60kg, 3x10 @ 90lb, 60kg 3x8, 12 reps (bodyweight). Flags: warmup, drop set, to failure, rpe 9.incline db press 55 lb x 10), announced (now squats), or named after the fact (this is tricep cable pushdowns btw). A set without a name continues the last exercise.edit_last_set(exercise=...) for the earlier sets.db/bb shorthand, word order, filler (on the), and muscle words that don't change the movement. So tricep cable pushdowns, cable pushdown and triceps pushdowns on the cable are one exercise, while triceps curl and biceps curl stay apart. bodylog alias teaches any other name.same / one more repeats the last set; done, 1h 5m / workout took 45 min ends the workout. Agent replies in a pasted log (Agent:, Assistant:, Claude:) are skipped.unit you pass, else $BODYLOG_UNIT, else whichever unit most sets used.muscles.py that covers the common lifts (unknown names count as Other). Percentages always add to 100.weight x (1 + reps / 30).| Tool | What it does |
|---|---|
log_set | Add a set to the open workout (opens one if needed). Structured fields or the raw message as text. Returns any PRs the set broke. |
edit_last_set | Fix or delete the last set. |
end_session | End the workout with the duration the user gives ("1h 5m"). Returns the card as text plus PNG pages. |
session_card | Card for any session: theme dark, light or clear; style full or story; unit kg or lb. |
exercise_history, prs, weekly_volume | Progress per exercise, all-time records, volume per week. |
import_chat | Backfill workouts from a pasted chat log. Safe to repeat. |
log_food | Log food from the user's words, or one item by name, barcode or food id with an amount, or with label numbers. Returns each item's status and the day's totals. |
edit_food | Fix an item: amount, food, meal or numbers; or delete it. |
lookup_food | Search by name or barcode without logging. |
food_day | A day's items by meal, totals, goals, what is left, streaks, flagged items, workouts. |
food_card | The day card as text plus a PNG: theme, style full or story. |
set_goals, streaks | Daily targets; logging and training streaks. |
bodylog log "bench 60kg x 8"
bodylog end "1h 5m" --title "Push Day" bodylog eat "chicken breast 180g, 1.5 cups rice and broccoli" bodylog food-fix 12 --grams 28 bodylog goals --kcal 2400 --protein 160 bodylog food-card --style story bodylog --help
from bodylog import Store, log_text, log_food, day_summary, summary, render_png
from bodylog.foodcard import render_png as food_png
store = S
Only the beginning is shown; read the rest in the repo