bodylog
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BODYLOG_DB | No | The SQLite file path (default: ~/.bodylog/log.db) | ~/.bodylog/log.db |
| FDC_API_KEY | No | USDA FoodData Central API key (default: DEMO_KEY) | DEMO_KEY |
| BODYLOG_UNIT | No | Unit for workout totals: kg or lb (default: most-logged unit) | |
| BODYLOG_CARDS | No | Directory where card PNGs are stored (default: ~/.bodylog/cards/) | ~/.bodylog/cards/ |
| BODYLOG_OFFLINE | No | Set to '1' to use only the bundled food table, no network (default: off) | off |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| log_setA | Log a set to the current workout, starting one if none is open. exercise: name as the user says it ("incline db curl"); omit to reuse the last set's exercise. weight/unit: 0 or omitted for bodyweight; unit is kg or lb (defaults to the last unit used). kind: normal, warmup, drop or failure. count: identical sets at once ("3x10"). text: alternatively, the user's raw message ("62.5kg x 6", "same", "this is tricep pushdowns btw"). Returns the logged sets and any PRs they set. A text that ends the workout ("done, 1h 5m") returns the card. |
| edit_last_setB | Fix the most recent set in the open workout ("that was 10 reps", "that was cable pushdowns"), or delete it. |
| end_sessionA | End the open workout. duration is what the user says ("1h 5m", "65 min", "1:05"); title is optional ("Push Day"). unit (kg or lb) sets the totals' unit. Returns the summary card as text and PNG images (one per page; long workouts span several) to show the user. |
| session_cardB | Summary card (text + PNG pages) for a workout: the open one, else the latest. theme: dark, light, or clear (transparent background, a sticker for a photo); unit: kg or lb for totals (each set keeps the unit it was logged in); style: full (every set, may span pages) or story (one phone-screen image, one line per exercise). |
| exercise_historyA | Per-session history for one exercise, newest first: sets, best set, top weight, estimated 1RM, volume. |
| prsA | All-time records (heaviest weight, best estimated 1RM, most reps) for one exercise or all of them. |
| weekly_volumeC | Training volume, workouts and sets per week (Monday start), oldest first. |
| import_chatA | Backfill workouts from a pasted chat log (lines like "[2026-09-08 18:07] me: 60kg x 8"). Safe to repeat: time spans that already hold sets are skipped. Lists lines it could not read. |
| log_foodA | Log food. Usually pass the user's words as text ("2 eggs, toast and a protein shake", "lunch: 200g chicken, 1 cup rice"); it is split into items and each is matched to USDA FoodData Central or Open Food Facts. For one item: name (or barcode, or a food_id from lookup_food) with grams, or amount + unit (cup, slice, tbsp, oz, ml...). Pass kcal/protein/carbs/fat when the user reads them off a label. meal: breakfast, lunch, dinner or snack (default from the words, else the time of day). Each item has a status: ok / manual count; unknown (no match; see candidates) and needs_amount do not count until fixed with edit_food. Returns the items and the day's totals so far. |
| edit_foodA | Fix a logged food item by id: a new amount (grams, or amount + unit), another food (name, or food_id from lookup_food or an item's candidates), another meal, or the numbers themselves. delete=True removes it. |
| lookup_foodA | Search foods without logging: a name ("kimchi", "clif bar") or a product barcode. Returns candidates with per-100 g macros, portions and a food_id to pass to log_food or edit_food. |
| food_dayA | One day's food (default today, YYYY-MM-DD): items by meal, totals, goals and what is left, streaks, items not counted, and any workouts that day. |
| food_cardA | Shareable card for a day of food (default today): text plus a PNG. theme: dark, light or clear; style: full (every item) or story (one phone screen). Workouts that day appear on it too. |
| set_goalsA | Daily targets (kcal, grams of protein/carbs/fat). Omitted ones stay as they are; 0 clears one. |
| streaksA | Current food-logging streak in days (and the best), and training streak in weeks with a workout. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 15 tools
Tools are mostly distinct by domain: food vs. workout logging, and card generation vs. raw data. A few pairs (food_card/session_card, lookup_food/log_food, prs/exercise_history) could be confused, but their descriptions clarify the boundaries well.
All names are snake_case and readable, but the pattern is mixed: some are verb-first (log_food, end_session, edit_food) while others are noun-first (food_card, session_card, weekly_volume, prs). This is a readable mixed convention rather than a consistent one.
Fifteen tools is at the upper end of the typical range, but the server covers two distinct domains—food logging and workout logging—and each tool has a clear, non-redundant purpose. The count feels appropriate for the stated scope.
The surface covers food logging, editing, searching, goals, summaries, and cards, plus workout logging, workout cards, history, PRs, volume, streaks, and chat import. The main gap is that workout set editing is limited to the most recent set, with no way to edit or delete arbitrary past workout entries.