Wellness Project MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| log_mealA | Log a meal to the user's food diary. Use when the user mentions eating, describes a meal, or asks to log food. INFER:
MACRO SOURCE: strongest evidence wins. Never replace known stored macros with a fresh estimate.
MACROS: food_items plus calories/protein_g/fat_g/carbs_g are required unless recipe_name supplies them. Ask only if food_items are absent and no recipe_name applies. Never call without all four macros populated. FASTING: if the user ate nothing / fasted all day, log one "Fast day" Snack with calories/protein_g/fat_g/carbs_g all 0. DUPLICATES: if this tool returns a duplicate error, tell the user what's already logged and ask whether this is a separate serving (retry with force=true) or should update the existing entry instead (update_meal with adjusted values). DRINKS / HYDRATION: this is the single write path for consumed drinks too. When a drink amount is known or reasonably inferable, include it in fluids even when the same drink also contributes calories/macros/alcohol. The server decides whether hydration tracking is enabled; never use a separate hydration write tool. A plain fluid-only intake may omit food_items and macros and send only fluids. For alcoholic drinks, include that drink's alcohol_g in its fluid item; if there is exactly one drink, the top-level alcohol_g can stand in. |
| list_mealsA | List all meals logged for a date or date range, including each meal's ID, date, type, food description, and macros. update_meal and delete_meal can resolve a meal on their own from date (+ optional name substring), so this is no longer required before either — use it to answer "what did I eat today/this week/yesterday?", review what has been logged, or get an id after an ambiguous update_meal/delete_meal match. Maximum range: 31 days per call. For longer periods, make multiple calls with sequential date ranges. INFER — do not ask:
|
| update_mealA | Update an existing meal. Use only when the current message explicitly changes, corrects, or adds to a meal already logged. Never infer an update from earlier chat history. A plain food statement ("coffee with milk") is a new entry: use log_meal, even if that meal type already exists today. FIND THE MEAL: use id if known. Otherwise use date (YYYY-MM-DD, defaults to today) plus name and/or target_meal_type to narrow the existing row. target_meal_type finds the current type and is never written; meal_type sets a new type. If the match is not exactly one row, nothing changes. On multiple matches, ask the user which meal they mean; never select a candidate id yourself. Send only fields that change. THREE MODES. Picking the wrong one corrupts the meal.
Reaching for mode 3 when the meal is GROWING is the exact bug this tool used to have: it silently REPLACES the whole meal with just the new food and throws away what was already logged. If add-vs-correct intent is ambiguous, ask before updating. DRINKS / HYDRATION WHEN UPDATING: a food update must not silently erase an already-linked hydration event. For changes unrelated to drinks, omit fluids and the existing hydration is preserved. When ADDING a drink with add_food_items/add_recipe_name, fluids contains only the newly added drink(s) and they are appended to the meal's hydration. When CORRECTING the meal's drinks with both add_* fields omitted, fluids is the complete corrected drink list and replaces the linked hydration only after replacement rows have been safely inserted. If the correction removes every drink, explicitly send fluids: [] and the linked hydration is deleted. Whenever a drink volume is known or reasonably inferable, include it. |
| delete_mealA | Permanently delete a meal entry. Use when the user explicitly asks to remove or delete a logged meal. FIND THE MEAL: pass id if already known. Otherwise pass date (YYYY-MM-DD, defaults to today) and, only if more than one meal was logged that day, name (a substring of the food description, case-insensitive) to narrow it down. This action is irreversible — a match that isn't exactly one meal returns an error explaining why, with nothing deleted; retry with id or a narrower name, never guess. HYDRATION: any assistant hydration events linked to this meal are deleted by the database in the same food-row delete. Do not issue a separate hydration delete. |
| mark_empty_dayA | Set, change, or undo the answer to "why is this day empty?" for a date with no real meals logged. Use when the user wants to flip a fast day to forgotten (or back), or undo either one, in chat instead of the in-app prompt. There are exactly three states for a date, and this tool is the only way to move between them:
Setting one answer always clears the other, so a date is never both a fast and a forgotten day at once. Use list_meals first if unsure whether the date already has real food logged. This tool refuses to touch a day that has actual meals on it (other than an existing fast marker). |
| list_hydrationA | Review hydration events and stored effective hydration totals. Use when the user explicitly asks about hydration history or fluid intake. Hydration tracking must already be enabled in Settings. Maximum range 31 days. Defaults to the last 7 days. |
| list_exercisesA | Returns all canonical exercise names from the exercise library, grouped by muscle group. Call this before log_workout or update_workout to match user-described exercise names to canonical ones. Canonical names ensure proper exercise tracking and NSI score calculation. |
| log_workoutA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Log a complete workout session: exercises, sets, reps, weights, and session metadata. Use when the user describes finishing a workout, lists exercises performed, or asks to log training. A workout they have not done yet is not a log: use propose_workout for that. EXERCISE NAMES:
SETS:
INFER — do not ask:
RPE (Rate of Perceived Exertion) — 1-10 scale, half steps allowed (7.5, 8.5):
ASK (single batched question) only if missing and not inferable: location, focus_type (list ambiguous), heart_points (tracker provides them but not mentioned). RETURNS the new session's ID (as "[ID NN]"). Pass it to update_workout / delete_workout / get_workout / add_exercises for follow-ups in this conversation. SAVED WORKOUT MODE: when the user asks to save a workout for reuse, set save_as_saved_workout=true and pass the full prescription through this same tool. In saved mode the workout is NOT logged as completed history. To replace an existing Saved Workout, also pass saved_workout_id; the supplied prescription fully replaces its prior prescribed sets/reps/weights. Use saved_workout_title when the reusable name should differ from focus_type. |
| list_workoutsA | List workout sessions in a date range: ID, date, focus type, location, and session-level NSI with rating. Use before get_workout to find a session ID, or to answer "how many times did I train this week?", "when was my last leg day?", "did I work out yesterday?", "how is my NSI trending?". Each row's NSI is the mean of per-exercise NSIs (after dropping anything below 50% of the user's median for that exercise), with a rating band (Below Average, Novice, Average, Intermediate, Advanced, Elite). 100 = the population intermediate standard for the user's bodyweight, age, and sex. Use the rolling average across rows for trend questions. Maximum range: 90 days per call. For longer periods (PR lookups, "have I ever done X", "when was the last time I did Y"), make multiple sequential calls walking backwards (days 0-89, then 90-179, then 180-269...) until you find what you need. Don't give up after one call. INFER — default start_date to 7 days ago, end_date to today. Widen up to 90 days for trend questions. Chain calls for anything older. SAVED WORKOUTS: set saved_workouts=true to list the user's reusable Saved Workouts library instead of completed workout history. Saved workout IDs are separate from workout session IDs. |
| get_workoutA | Retrieve full detail of a workout session: exercises, sets, reps, weights, superset groupings, heart points, notes, and NSI scoring at every grain. Use for detailed questions about a past workout, reviewing training before recommendations, confirming what was logged, or comparing a session to population strength standards. NSI: session NSI/rating in the header; per-exercise NSI (max set NSI), rating, est. 1RM, and the population_1rm_lb/population_reps benchmark it was measured against; per-set NSI and est. 1RM to see which set drove the exercise score. EQUIPMENT: shown per exercise when every set shares a tag, else per set; missing means untagged. A wrong or missing tag on a dumbbell exercise silently halves or doubles its NSI score — fix it via update_workout's set_updates or add_exercises equipment field. REQUIRED WORKFLOW: call list_workouts first to find the session ID — never guess it. SAVED WORKOUTS: pass saved_workout_id to read a reusable Saved Workout prescription. Do not combine it with session_id/session_date. |
| get_exercise_historyA | Look up everything the user has done for ONE exercise: all-time PR plus recent performance, across many sessions. USE FOR:
NOT for a full session (every exercise in one workout — use get_workout) or a date-window list regardless of exercise (use list_workouts). INFER — do not ask: exercise_name (take the user's words; resolves to canonical, or says so if never logged), recent_limit (default 10 sessions), since_date (optional — narrows only the Recent block; the PR is always all-time). |
| delete_workoutA | Permanently delete a workout session and all its exercises and sets. Use when the user wants to remove a logged workout entirely. FIND THE SESSION: pass session_id if already known. Otherwise pass session_date (YYYY-MM-DD, defaults to today) and, only if more than one session was logged that day, name (a substring of the workout's focus/type, e.g. "Push" or "Leg Day", case-insensitive) to narrow it down. This action is irreversible and removes the session, all supersets, and all sets — a match that isn't exactly one session returns an error explaining why, with nothing deleted; retry with session_id or a narrower name, never guess. SAVED WORKOUTS: pass saved_workout_id to delete a reusable Saved Workout instead of completed workout history. |
| update_workoutA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Update a workout session: correct metadata, fix set values, rename/add/remove exercises or individual sets, or move exercises between supersets. Use for any post-log correction. FIND THE SESSION: pass session_id if already known. Otherwise pass session_date (YYYY-MM-DD, defaults to today) and, only if more than one session was logged that day, name (a substring of the workout's focus/type, case-insensitive) to narrow it down. A match that isn't exactly one session returns an error explaining why, with nothing changed — retry with session_id or a narrower name, never guess. get_workout still gives full detail (exercise names, slot names SS1/SS2/WarmUp/Finisher) when needed; list_exercises first if adding or renaming. Call with only the fields that change — operations can combine in one call. OPERATIONS:
SUPERSET SLOTS: rename_exercises/remove_exercises match by exercise name alone unless scoped. If a name is in more than one slot and the user means only one, pass superset_slot (or { name, superset_slot } for remove_exercises) naming that slot from get_workout. Omitting it hits every occurrence, a real corruption risk. LITERAL NAME: literal_name: true keeps the user's exact wording instead of the closest library match, skips the resolver, and gets no NSI score (no benchmark to compare an unmatched name against). Use for "call it exactly X", "not the standard one", "literally X", or a rejected match. Applies below. EQUIPMENT (load basis): dumbbell_pair is one dumbbell in EACH hand, weight_lb PER HAND (2x for NSI); dumbbell_single is one implement total. Laterality (single-leg/arm) does NOT decide this alone. Set it when the user describes the load (each hand, machine, band); a wrong or missing tag silently halves or doubles NSI. Values: barbell, dumbbell_pair, dumbbell_single, machine, kettlebell, bodyweight, band, cable, trx, other. A set_id or exercise_name+set_position matching more than one set (the same exercise in two superset slots) is ambiguous and errors rather than guessing — use the exact set_id from get_workout to disambiguate. The result discloses a mismatched name from rename_exercises/add_exercises; relay it in your own words. If a name matches nothing closely enough, the result names near-miss library exercises; ask the user which they meant rather than accept the unscored custom log silently. INFER — do not ask: session_date defaults to today, set positions count from 1 per exercise. Slot names and set_ids beyond what's inferable come from get_workout; canonical exercise names come from list_exercises. SAVED WORKOUTS: pass saved_workout_id to edit a reusable Saved Workout instead of completed workout history. Use saved_workout_title and/or saved_exercise_updates. For progression requests, inspect real exercise history first rather than applying a deterministic formula. |
| log_wearableA | Log daily wearable/manual health metrics (RHR, HRV, Zone Minutes / AZM, VO2max, calories eaten / dietary energy, stress, supplemental steps, and physiological vitals including SpO₂, respiratory rate, skin temperature, blood pressure, blood glucose, and core temperature). VITALS — use the vital fields for manual/home/device readings and corrections, including a finger-stick, CGM, home glucose meter, or wearable/Apple Health/Health Connect value the user explicitly wants stored manually. A glucose value from an actual lab report or blood draw belongs in log_lab_results instead, not here. STEPS — read before using step_count: manual step_count is ADDITIVE — it adds on top of whatever a connected wearable (Fitbit, Oura, Apple Health, Health Connect) already recorded that day; it never replaces or overrides device data. Only use it when the user explicitly says they walked steps their device did NOT capture (phone left home, battery died, device not worn). If the user says sync is wrong, steps look doubled, or they want to fix/override/replace device data: do NOT pass step_count — explain that manual steps add on top, and sync issues need investigating at the device level. ALL OTHER FIELDS (RHR, HRV, AZM, VO2max, stress, and physiological vitals) replace the existing manual value for that day and are safe to use for corrections. INFER — do not ask: date defaults to today unless the user says otherwise. IDEMPOTENT: if the values you'd log already exist for that date (any source), the tool returns a no-op success — report this as "already had data", not "failed". |
| list_wearable_dataA | List daily wearable data (steps, RHR, HRV, Zone Minutes / AZM including the vigorous-intensity breakdown, VO2max, calories eaten / dietary energy, calories burned / active energy / total energy expenditure, maintenance calories / TDEE, stress, and physiological vital signs reported by connected sources or manual overrides) within a date range. Use when the user asks about their step count, heart rate, HRV trends, vigorous minutes, calories eaten / dietary energy, calories burned, active or total energy expenditure, maintenance calories, TDEE, cardio fitness, blood glucose, vital signs, or any wearable metrics over time. Zone Minutes (a.k.a. Active Zone Minutes) are shown as a daily total plus, when the per-zone breakdown is available, a moderate (1 pt/min) vs vigorous (2 pts/min — Cardio + Peak zones) split. The zone boundaries are personalized to the user's own resting and maximum heart rate, so they are not a fixed BPM. Calories burned per day shows active + resting where both are known; when a device reports active energy with no resting figure, a resting estimate is derived from the user's profile BMR and labelled an estimate, never shown as measured. A trailing Maintenance (TDEE) line reports current maintenance calories and which method produced it (formula estimate vs. logged weight trend), or names the missing profile fields when TDEE can't be computed. Maximum range: 31 days per call. For longer periods, make multiple calls with sequential date ranges. INFER — do not ask:
|
| log_body_metricsA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Log or update body composition metrics for a given date. Use when the user shares weight, body fat percentage, or any other body composition reading — whether typed manually, copy-pasted from a smart scale app, or described from a photo of a scale display. PROACTIVE DATA COLLECTION: If the user hasn't shared their data yet, ask them to copy-paste the output from their scale app or upload a photo of the display — this lets you parse all fields at once instead of asking one by one. INFER — do not ask:
The *_pct fields are percentages 0-100. The *_in fields are manual tape measurements, not bioimpedance scale readings. BMI is not a field here. It is derived automatically at read time from the user's canonical height and their resolved weight for the day -- never ask the user for BMI, and never try to log it. Every field except date is optional; log any subset. One row per day. Calling this tool twice on the same date updates the existing entry (upsert). |
| list_body_metricsA | List body composition entries within a date range. Use when the user asks about their weight history, body fat trend, or any body metrics over time. Maximum range: 31 days per call. For longer periods, make multiple calls with sequential date ranges. INFER — do not ask:
BMI in the output is derived from the user's canonical height and that day's resolved weight -- do not recompute it yourself. |
| log_sleepA | Log a sleep entry. Use when the user shares sleep data — total duration, score, stage breakdown, bedtime, or wake time — from Fitbit, Oura, Whoop, Apple Health, or manual recall. PROACTIVE DATA COLLECTION: If the user says they want to log sleep but hasn't shared numbers, ask: "How many hours did you sleep, and do you have a sleep score or stage breakdown from your tracker?" They can paste or describe the summary screen. INFER — do not ask:
You may log any subset of fields. One row per day. Calling this tool twice on the same date updates the existing entry (upsert). Entries made through this tool are always tagged as manual — the wearable-provider sources (Fitbit/Oura/Apple Health) are reserved for the actual auto-sync pipelines. |
| list_sleepA | List sleep log entries within a date range. Each entry includes total duration, sleep score, stage breakdown, and the canonical bedtime and wake_time (full ISO 8601 timestamps with preserved timezone offset) for the user's primary overnight sleep session (excluding daytime naps). Maximum range: 31 days per call. For longer periods, make multiple calls with sequential date ranges. INFER — do not ask:
|
| list_lab_markersA | Returns all LOINC-coded markers in the reference library: canonical name, LOINC code, panel, typical unit, and common aliases. Call this BEFORE log_lab_results to match user-provided marker names to canonical entries — same pattern as list_exercises for workouts. Prevents name drift and ensures trending works across lab visits. |
| log_lab_resultsA | Log one or more blood test or biomarker results. Use when the user shares lab values — copy-pasted from a Quest/LabCorp PDF, typed from a paper report, or described from a photo of their results. GLUCOSE ROUTING: use this tool for glucose only when it is an actual lab/blood-draw result or part of a reported lab panel. Finger-stick, CGM, home meter, wearable, Apple Health, or Health Connect glucose — including a manual correction to daily glucose — belongs in log_wearable as blood_glucose_mg_dl, not here. REQUIRED WORKFLOW: 1) call list_lab_markers for canonical names and LOINC codes. 2) for each marker the user provides, find the best match and use its canonical marker_name and loinc_code. 3) if no match exists, use the name as stated and omit loinc_code. If the user says they have lab results but hasn't shared them, prompt: "You can paste the text from your lab report PDF, or upload a photo of the results page — I'll parse all the values at once." INFER — do not ask: date (look for a collection/drawn date in the pasted text, default today), panel_name (from list_lab_markers for matched markers, infer for unmatched), flag (extract from the report if present: "H", "L", "HH", "LL", "A"), ref_range_low/high (parse from the report if shown), lab_name (from the report header, same for all markers in a visit). Submit all markers from a single lab visit in one call. |
| list_lab_resultsA | List lab/biomarker results within a date range, including each result's ID. update_lab_result and delete_lab_result can resolve a result on their own from date (+ optional marker or panel_name), so this is no longer required before either — use it to review lab history, answer questions about blood work trends or specific marker values over time, or get an id after an ambiguous update_lab_result/delete_lab_result match. Optionally filter by panel or marker name. INFER — do not ask:
|
| update_lab_resultA | Update one or more fields on an existing lab result. Use when the user wants to correct a result already logged, most often its collection date. Only send the fields that need to change; omit all others. SELECTOR, pass exactly one of id, date, or date+marker:
|
| delete_lab_resultA | Permanently delete one or more lab results. Use when the user explicitly asks to remove or delete a logged lab result. Never guess a selector. SELECTOR, pass exactly one of id, date, or date+marker:
|
| log_injuryA | Log a new injury or aggravation. Use when the user mentions getting hurt, feeling pain, straining something, or describes an injury. Injuries are date ranges — they start on a date and are ongoing until an end_date is set. INFER — do not ask:
ASK only if body_part is entirely unclear. |
| list_injuriesA | List injuries from the injury log. update_injury and delete_injury can resolve an injury on their own from injury (+ optional date), so this is no longer required before either — use it to review the injury log, answer questions about injury history or rehab progress, or get an id after an ambiguous update_injury/delete_injury match. Defaults to active and monitoring injuries. INFER — do not ask:
|
| update_injuryA | Update an existing injury entry. Use when the user reports an injury is improving, worsening, resolved, or wants to change details. When severity changes, the new value is automatically tracked in the severity history for trend analysis. Only send fields that need to change. Setting end_date automatically marks the injury as Resolved. Use severity_date to backfill historical severity changes (e.g., "it was a 7 in January, dropped to 4 by March"). SELECTOR — pass id if known, or injury (a body part or injury type substring, case-insensitive, e.g. "shoulder") optionally narrowed by date (an injury active on that day). Exactly one of id or injury required. If injury matches more than one entry, the call errors with candidate IDs to retry with. |
| delete_injuryA | Permanently delete an injury entry. Also removes all severity history for that injury. SELECTOR — pass id if known, or injury (a body part or injury type substring, case-insensitive, e.g. "shoulder") optionally narrowed by date (an injury active on that day). Exactly one of id or injury required. If injury matches more than one entry, the call errors with candidate IDs to retry with. |
| log_wellbeingA | Log subjective wellbeing ratings for a day, week, month, or custom date range. Use when the user describes how they feel — energy level, mood, stress, or muscle soreness. Supports single-day entries ("how I feel today") and period entries ("this week was stressful", "March was great"). If an overlapping entry already exists for the requested period, returns a warning with the conflicting entry IDs — the user must update or delete existing entries first. INFER — do not ask:
You may log any subset of rating fields. |
| list_wellbeingA | List wellbeing log entries within a date range. update_wellbeing and delete_wellbeing can resolve an entry on their own from date, so this is no longer required before either — use it to answer questions about mood, energy, stress, or soreness trends over time, or get an id after an ambiguous update_wellbeing/delete_wellbeing match. Maximum range: 31 days per call. For longer periods, make multiple calls with sequential date ranges. INFER — do not ask:
|
| update_wellbeingA | Update an existing wellbeing entry. Only updates fields that are provided — omitted fields remain unchanged. SELECTOR — pass id if known, or date (any day within the entry's period) to resolve it. Exactly one of id or date required. If date matches more than one entry, the call errors with candidate IDs to retry with. |
| delete_wellbeingA | Permanently delete a wellbeing entry. SELECTOR — pass id if known, or date (any day within the entry's period) to resolve it. Exactly one of id or date required. If date matches more than one entry, the call errors with candidate IDs to retry with. |
| list_supplementsA | List the user's medications and supplements. manage_supplement can resolve an item on its own from supplement_name, so this is no longer required before it — use it when the user asks what medications or supplements they're taking, asks to review their stack, or to get an id after an ambiguous manage_supplement match. INFER — do not ask:
Returns each item's id, category, name, brand, dose, schedule, start_date, and end_date. |
| manage_supplementA | Add, update, end, or delete a medication or supplement. Use when the user describes their stack, adds a new item, changes a dose or schedule, says they stopped taking something, or wants to remove an entry. INFER — do not ask:
ASK the user only if name is missing for a new entry, or 'end' (set end_date) vs 'delete' (remove record) intent is ambiguous. SELECTOR for 'update', 'end', 'delete' — pass id if known, or supplement_name (case-insensitive substring, e.g. "magnesium") to resolve it. Exactly one of id or supplement_name required. If supplement_name matches more than one item, the call errors with candidate IDs to retry with. |
| log_supplement_takenA | Mark a medication or supplement as taken or not taken for a specific date. Only relevant when the user has daily tracking mode enabled. Use when the user says they took (or missed) a medication or supplement on a particular day. INFER — do not ask:
SELECTOR — pass supplement_id if known, or supplement_name (case-insensitive substring) to resolve it. Exactly one required. If supplement_name matches more than one item, the call errors with candidate IDs to retry with. |
| list_recovery_strategiesA | List the user's recovery and mindfulness strategies. Use when the user asks about their recovery practices, mindfulness routines, or you need strategy IDs before logging a session. INFER — do not ask:
Returns each strategy's id, name, category, schedule, start_date, and end_date. |
| manage_recovery_strategyA | Add, update, end, or delete a recovery/mindfulness strategy. Use when the user describes a new practice, changes a schedule, stops a practice, or removes one. Infer category from name, start_date defaults to today, infer schedule from context. ASK only if name is missing. SELECTOR for update/end/delete — pass id if known, or strategy_name (case-insensitive substring, e.g. "sauna") to resolve it. Exactly one of id or strategy_name required. If strategy_name matches more than one strategy, the call errors with candidate IDs to retry with. AFTER a successful 'add': do NOT just confirm and stop. Reply by (1) restating the assumed schedule (sessions per period, duration, time of day, start date) in plain language, and (2) asking the user to confirm or correct it — especially any optional fields you did NOT set (duration_minutes, time_of_day). Example: "Logged sauna starting today, assuming once per week. Sound right? About how long do you usually go for, and what time of day — morning, evening?" If the user corrects anything, call this tool again with action='update'. The goal is accurate adherence data, not a silent confirmation. |
| log_recovery_sessionA | Log a completed or skipped recovery/mindfulness session. Use when the user says they did (or skipped) a breathing exercise, meditation, cold plunge, sauna, stretching, or any recovery practice. Also use for one-off standalone sessions not linked to a recurring strategy. INFER — do not ask:
PREFERRED WORKFLOW: call list_recovery_strategies first to link the session to an active strategy for adherence tracking. If no matching strategy exists, log as standalone. |
| list_recovery_sessionsA | List logged recovery sessions (completions and skips) within a date range, each with its ID. list_recovery_strategies only returns the recurring strategies (the schedule), never the individual logged entries against them — this is the only way to see those. update_recovery_session and delete_recovery_session can resolve a session on their own from session_date (+ optional session_category), so this is no longer required before either — use it to answer "what recovery sessions have I logged", audit/spot-check past entries (e.g. a sauna and a cold plunge logged separately on the same day that should have been one contrast_therapy entry), or get an id after an ambiguous update_recovery_session/delete_recovery_session match. INFER — do not ask:
Maximum range: 90 days per call. To audit or correct a longer history, make multiple sequential calls walking backwards (days 0-90, then 90-180, then 180-270...) until you have covered the period the user means. Don't stop after one call and report that as the whole history. |
| update_recovery_sessionA | Update one or more fields on an existing recovery session log entry. Use when the user wants to correct or change something already logged (e.g. wrong duration, quality rating, category, or notes). Only send the fields that need to change; omit all others. SELECTOR — pass id if known, or session_date (+ optional session_category to narrow) to resolve it. Exactly one of id or session_date required. If it matches more than one session, the call errors with candidate IDs to retry with. |
| delete_recovery_sessionA | Permanently delete a recovery session log entry. This action is irreversible. If the user's intent is ambiguous, ask which session to remove. SELECTOR — pass id if known, or session_date (+ optional session_category to narrow) to resolve it. Exactly one of id or session_date required. If it matches more than one session, the call errors with candidate IDs to retry with. |
| log_runA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Create an editable running card. Use for a completed run OR a future run plan. intent:
RUN TYPE: distinguish easy, long, tempo, interval, recovery, race, fartlek, threshold, progression and hills when the runner or workout structure supports it. If a wearable run is unspecified, do NOT call it easy merely because it was a run. DETAIL: preserve elapsed time, HR, cadence, power, elevation, RPE, splits and structured segments only when supplied by the user/source. Never invent sensor data or splits. |
| list_runsA | List runs within a date range. Returns a compact Runner State summary first, then individual runs. This is the preferred single read for Elias: current-week volume, four-week baseline, longest run, confirmed easy/quality mix, unclassified mileage, pace trend, heart points and available HR are computed together rather than pieced together from several calls. Maximum range: 92 days. Defaults to 7 days ago through today. For a longer span, make several calls covering consecutive windows. |
| delete_runA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Delete a run. Use when the user wants to remove a run entry. ASK for confirmation if the user's intent is ambiguous. SELECTOR — pass id if known, or date (+ optional distance_mi to narrow, matched approximately within 0.25 mi) to resolve it. Exactly one of id or date required. If it matches more than one run, the call errors with candidate IDs to retry with. |
| log_rest_dayA | Mark a date as an intentional rest day. Use when the user says they took a rest day, are taking one today, or wants to mark a past day as rest after the fact (e.g. "this past Monday was a rest day", "today is a rest day", "I rested yesterday"). Suppresses the workout-prompt nudges for that date and lets the engine treat the day as planned, not skipped. INFER — do not ask:
Idempotent — calling twice on the same date is a no-op (the second call returns the same confirmation). To remove a rest day, use cancel_rest_day. |
| cancel_rest_dayA | Remove a previously declared rest day. Use when the user changes their mind ("scratch that, I'm going to lift today after all") or wants to undo a mistaken declaration. INFER — do not ask:
|
| list_rest_daysA | List the dates a user has marked as rest days within a range. Use when the user asks about their rest pattern ("how many rest days have I taken this month?", "did I rest last week?"). INFER — do not ask:
|
| list_goalsA | Analyze or show the user's current and past goals. Returns active/paused formal goals, completed/historical formal goals, and current standard targets. Use this when the user asks what goals they have or asks to review/analyze their goals. Pass include_capabilities: true ONLY when the user asks what kinds of goals Wellness Project supports; it appends the full catalog of goal types and their inputs, which is large. Do not call this tool merely to obtain an ID before create_goal or update_goal; those write tools resolve current goals themselves. |
| create_goalA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Create a new Wellness Project goal or standard target. Call this directly when the user wants to establish a goal; there is no schema-discovery or list_goals prerequisite. Available goal types and inputs come from the canonical Goals definitions. This tool loads the user's current goals itself before writing, so do not call list_goals first: it reports what a standard target changed from, and refuses to stack a second goal on top of one that already covers the same thing, naming that goal's ID to use with update_goal. Infer the goal_type and canonical inputs from the request. Standard targets use target_value. Formal goal fields are described on the generated inputs. |
| update_goalA | UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic. Change, complete, pause, stop/end, reopen, or delete an existing goal. Call this tool directly for ordinary goal changes. It already loads the user's current goals and resolves a unique goal from goal_id or a natural-language goal_ref, so do NOT call list_goals first just to find an ID. For edit, pass only the fields to change. For complete/pause/end/reopen/delete, no edit fields are required. If goal_ref genuinely matches multiple goals, this tool returns the candidates and changes nothing. Formal goal end/delete follows the existing Goals UI cancel lifecycle; standard-target end/pause turns that target off while delete removes it. |
| list_blog_postsA | Search the public Crew Blog at /blog for advisor-authored daily posts. Only call when the user explicitly asks about the blog or what an advisor has written; don't volunteer posts in normal conversation. Returns each matching post's slug, title, summary, advisor name, and date. Link a post inline as /blog/. |
| get_app_guide_sectionA | Look up general customer help for the Wellness Project app. Use this only for broad questions about where a feature lives, how to use it, what a visible feature does, common troubleshooting steps, or pricing. The returned guide is intentionally limited to stable, customer-facing help. Do not add or infer implementation details, technical architecture, policy or legal interpretation, privacy or security claims beyond the exact returned text, billing mechanics, release or version history, internal timing or targeting rules, or other details that are not in the returned section. For navigation, the guide result is the source of truth. Navigation grounding: use only app sections, routes, labels, buttons, gestures, and menu paths explicitly named in this guide result. Do not infer, invent, or autocomplete nearby navigation. If the requested path or action is not confirmed here, say you are not sure where it lives rather than guessing. For cost, price, Free vs Pro, Founding Member, upgrading, or the 3-analysis limit, use topic=pricing. That result consists of the two approved product messages plus the subscription page link. Reproduce exactly one appropriate message verbatim, include the supplied subscription link, and add no other pricing detail. Use the Founding Member message for ordinary pricing questions and the exhausted message only when the user says they already used the daily analysis allowance. In the in-app coach only, append this CTA block exactly after the chosen message: [CHIPS] Get Pro Now|open_paywall [/CHIPS] Examples: "where do I see my PRs?" -> pages_training; "what does Fit Score include?" -> pages_dashboard; "how do I connect Oura?" -> wearables; "how do I set a calorie goal?" -> goals; "how do I log a meal?" -> logging; "how much does it cost?" -> pricing. |
| log_cycleA | Log a period to the user's cycle log. Handles all cases:
Before logging, check that cycle tracking is enabled (cycle_prefs.tracking_enabled AND consented_at, both required -- a user can have consented in the past and later turned tracking off). If not, tell the user to turn it on from the dashboard first. INFER — do not ask:
Do NOT use this tool to log future dates. |
| list_cycleA | List the user's logged period records within a date range. update_cycle and delete_cycle can resolve a record on their own from date, so this is no longer required before either — use it when the user asks about their cycle history, or get an id after an ambiguous update_cycle/delete_cycle match. INFER — do not ask:
|
| update_cycleA | Update an existing period record. Use to correct dates, add a missing end date, or clear an end date (resume). Common uses:
SELECTOR — pass id if known, or date (the period's start date, or any date that falls within it) to resolve it. Exactly one required. If date matches more than one record, the call errors with candidate IDs to retry with. |
| delete_cycleA | Delete a period record. Only delete if the user explicitly asks to remove a specific record. Do not delete to "fix" a record — use update_cycle instead. SELECTOR — pass id if known, or date (the period's start date, or any date that falls within it) to resolve it. Exactly one required. If date matches more than one record, the call errors with candidate IDs to retry with. |
| show_week_workoutsA | Show the user their past 7 days of workouts (heart points per day, days trained) as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_week_fit_scoreA | Show the user their current Fit Score (the app's 0-100 composite), how it breaks down across its six components (Train, Fuel, Sleep, Recovery, Steps, Wellbeing), and the past 7 days of daily scores, as one inline card. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_week_macrosA | Show the user their past 7 days of calories and macros (protein, carbs, fat) vs targets as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_week_sleepA | Show the user their past 7 days of sleep (hours per night and sleep score) as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_week_stepsA | Show the user their past 7 days of step counts vs their daily goal as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_body_weightA | Show the user their body weight (and body-fat %) trend over time as an interactive line chart with a 30/90-day/1-year range toggle. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_recoveryA | Show the user their resting heart rate and HRV recovery trend over time as an interactive dual-line chart with a 30/90-day/1-year range toggle. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_runsA | Show the user their running mileage over the last 14 days as an inline bar chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_exercise_progressionA | Show the user's estimated 1-rep-max progression for a lift over time as an interactive line chart, with filters for date range and muscle group, and an exercise picker. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_workoutA | Show a single logged workout session's exercises and sets as an inline card. Defaults to the most recent workout; can target a specific date. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_health_overviewA | Show a rich overview of wearable health signals including steps, Zone Minutes, resting heart rate, HRV, VO2max, and stress. Prefer this for broad wearable or overall health-trend questions. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_sleep_detailA | Show one night of sleep in detail with duration, score, stages, bedtime, wake time, awakenings, and recent-night context. Prefer this for last-night or specific-night sleep questions. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_body_compositionA | Show body composition over time with an interactive metric picker for weight, body fat, lean and muscle mass, hydration, visceral fat, BMI, waist, and related scale metrics. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_meal_diaryA | Show the meals logged on a day as a rich diary with daily calories and macros versus targets. Prefer this for what-did-I-eat and daily food-log review questions. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| show_wellbeingA | Show energy, mood, stress, and soreness together with recent context and an overall wellbeing trend. Prefer this for how-I-have-been-feeling and subjective recovery questions. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view. |
| list_personal_contextA | List the user's active Personal Context memories: durable circumstances and preferences remembered across conversations (e.g. travels most weeks, gym has no squat rack, trains early mornings, wants blunt feedback). Use when the user asks what has been remembered about them, or before proposing a new memory to check whether an existing one already covers the subject. Read-only. |
| add_or_update_personal_contextA | Add a new Personal Context memory, or update an existing one by id. A memory is a durable circumstance or preference that should carry across future unrelated conversations (e.g. "travels most weeks", "gym has no squat rack", "prefers short home workouts", "wants blunt feedback"). Use list_personal_context first to check whether an existing memory already covers the subject, and pass its id with operation update rather than creating a duplicate. Health history does not belong here. Injuries, lab results, meals, workouts, sleep and body metrics each have their own dedicated tools that store them as structured data the app can chart and reason over; writing any of them as a memory duplicates that record and degrades it to loose text. This writes immediately with no separate approval step. Free accounts are capped at 3 memories and Pro accounts at 50; updating an existing memory by id is always allowed even at the cap. There is no delete or bulk-write capability here. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/turnnoblindeye/wellness-project-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server