# Healthmaxx > The health OS: your data, mapped onto your body. This application exposes the same capabilities over REST and MCP. Agents should prefer MCP. ## Authentication - REST: send an API key as `Authorization: Bearer ` (keys are created by the user in the app; prefix `zts_`). - MCP: the same bearer API key, or OAuth 2.1 with PKCE, discovered from https://healthmaxx.app/.well-known/oauth-protected-resource. Read-only tools need the read scope; everything else needs the write scope. ## Endpoints - MCP server (Streamable HTTP): https://healthmaxx.app/api/mcp - OpenAPI document: https://healthmaxx.app/api/openapi.json - REST: POST https://healthmaxx.app/api/v1/ with the arguments as a JSON object; GET https://healthmaxx.app/api/v1 lists every method - OAuth authorization server metadata: https://healthmaxx.app/.well-known/oauth-authorization-server ## Tool discovery - The default MCP tool list contains search_tools, describe_tool, call_tool and call_destructive_tool, plus direct todo tools. - Use search_tools with an empty query to list features, or search by task. Use describe_tool for arguments, then call_tool to execute. Deletions, clears and resets use call_destructive_tool. - Clients requiring one tool per method can use https://healthmaxx.app/api/mcp?tools=all. ## MCP tools (read-only) - attachments_forOwner (read-only): List the caller's ready files (photos, PDFs) attached to one record, in display order: id, mime, size, width, height, sortOrder. Sign one for viewing with attachments.get. - attachments_ofType (read-only): List the caller's ready files attached to records of one owner type (medication, prescription, blood_test, food_entry, workout, hydration_entry…), each with its ownerId, in display order. - bathroom_byId (read-only): Get one of the caller's bathroom logs by id, or null. - bathroom_list (read-only): List the caller's bathroom logs (poop with Bristol type 1–7, pee with colour), newest first; optionally a from/to window (epoch ms). - body_measurement (read-only): Get one of the caller's body measurements by id, or null. - body_measurements (read-only): List the caller's body measurements (weight kg, body fat %, girths cm…), newest first; optionally one kind and a from/to window (epoch ms). - bp_byId (read-only): Get one of the caller's blood pressure readings by id, or null. - bp_list (read-only): List the caller's blood pressure readings (mmHg, pulse bpm, 2017 ACC/AHA category), newest first; optionally within a from/to window (epoch ms). - chats_byId (read-only): Get one of the caller's chats with its messages, oldest first, or null. - chats_folderById (read-only): Get one of the caller's chat folders by id, or null. - chats_folders (read-only): List the caller's chat folders in their sort order. - chats_mine (read-only): List the caller's chats without messages: pinned first, then most recently updated. - community_membership (read-only): Get the caller's membership of one community challenge, or null when they haven't joined it. - community_memberships (read-only): List the community challenges the caller joined (slug, the handle shown on its leaderboard, when they joined), oldest first. - dental_pain (read-only): List the caller's tooth pain (teeth, optional area, intensity 0–10, kind, resolvedAt null while it still hurts), newest first. - dental_painById (read-only): Get one of the caller's tooth pain entries by id, or null. - dental_procedure (read-only): Get one of the caller's dental procedures by id, or null. - dental_procedures (read-only): List the caller's dental procedures (cleaning, exam, xray, filling, crown, root_canal, extraction, implant, bridge, whitening, scaling, other) with teeth, cost and the visit they were done at, newest first. - dental_teeth (read-only): List the caller's marked teeth (FDI number 11–48, status: healthy, filling, crown, root_canal, implant, missing, extracted, bridge, veneer, watch, surfaces, note). Teeth without a row are healthy. - dental_tooth (read-only): Get the caller's row for one tooth (FDI number), or null when it was never marked. - drawMarkers_byId (read-only): Get one of the caller's blood-draw markers by id, or null. - drawMarkers_list (read-only): List the markers ordered for one of the caller's blood draws (a medical event), or for all of them without eventId, in the order they were added. medicalCalendar.day says which are resulted. - facilities_byId (read-only): Get one of the caller's facilities by id, or null. - facilities_list (read-only): List the caller's hospitals, clinics, labs, imaging centers and dentists (name, kind, address, city, country), by name. - fasting_active (read-only): Get the caller's running fast (no end yet), or null. There is at most one. - fasting_byId (read-only): Get one of the caller's fasts by id, or null. - fasting_history (read-only): List the caller's fasts, running and finished, newest start first; optionally within a from/to window on the start (epoch ms). - feed_mine (read-only): List the caller's own community posts, newest first (at most 100): topic, markdown body, GIF or image, the shared entry's card, and whether an admin hid it. - feed_myReactions (read-only): List the emoji reactions the caller left on community posts and replies, newest first. - feed_postById (read-only): Get one of the caller's own community posts by id, or null. - feed_replyById (read-only): Get one of the caller's own community replies by id, or null. - foodItems_byBarcode (read-only): Get the caller's pantry item with this barcode (EAN/UPC as printed), or null. - foodItems_byId (read-only): Get one of the caller's pantry items by id, or null. - foodItems_list (read-only): List the caller's pantry (foods and branded products they log by weight) by name: brand, barcode, kcal, protein, carbs, fat and fiber per 100 g, micronutrients per 100 g, usual serving (g), label photo. - goals_inEffect (read-only): Get the caller's goal of a kind in effect on a day: the latest one set on or before it (goals carry forward). Null when none was set yet. - goals_list (read-only): List the caller's daily goals (hydration ml, calories, macros g, caffeine mg, steps, sleep s), oldest day first; optionally one kind. A goal holds from its day until the next one of its kind. - gratitude_byId (read-only): Get one of the caller's gratitude entries by id, or null. - gratitude_list (read-only): List the caller's gratitude entries (one to five short lines each, optional note) from fromDay to toDay (both included), newest first. - hangs_byId (read-only): Get one of the caller's dead hangs by id, or null. - hangs_list (read-only): List the caller's dead hangs (seconds, type: passive, active, single-arm or alternating, added kg), newest first; optionally a from/to window (epoch ms). - healthStates_current (read-only): Get the caller's latest health state (healthy, tired, injured, sick, recovering or hungover), with when it was set and the local day it was set on, or null when they never set one. Tired and hungover count only on that day. - healthStates_history (read-only): List the health states the caller has set (healthy, tired, injured, sick, recovering, hungover), newest first, up to limit rows (default 50). - hydration_byId (read-only): Get one of the caller's drinks by id, or null. - hydration_day (read-only): List the caller's drinks on a day (YYYY-MM-DD, their time zone), in order: ml, drink kind, caffeine mg. - hydration_range (read-only): List the caller's drinks from fromDay to toDay (both included), oldest first. - integrations_list (read-only): List the caller's integrations (Apple Health, Health Connect, Strava, Whoop, Oura) with their status and when they last synced. Providers never connected are absent. - labs_panel (read-only): Get one of the caller's lab panels with its results, or null. - labs_panels (read-only): List the caller's lab panels with their results (LOINC code, canonical name, value in the canonical UCUM unit, the printed name/value/unit, reference range, low/normal/high flag), newest first; optionally a from/to window (epoch ms). - labs_result (read-only): Get one of the caller's lab results by id, or null. - labs_results (read-only): List all of the caller's lab results across panels, newest first; optionally a from/to window (epoch ms). - labs_series (read-only): List the caller's results for one marker by LOINC code (e.g. 4548-4 HbA1c, 13457-7 LDL), oldest first: one comparable series across labs, in the canonical unit. - logTemplates_byId (read-only): Get one of the caller's log templates by id, or null. - logTemplates_list (read-only): List the caller's log templates (one-tap saved logs), optionally of one kind (hydration, nutrition, meal, mood, meds), by their sort order: name, icon, payload (the log's fields), use count and last use. - mealGroups_byId (read-only): Get one of the caller's meal groups with its food entries, or null. - mealGroups_list (read-only): List the caller's meal groups on a day (YYYY-MM-DD, their time zone), in order, each with its food entries (name, kcal, macros, rough or precise, pantry item and grams). - mealGroups_range (read-only): List the caller's meal groups with their food entries from fromDay to toDay (both included), oldest first. - meditation_byId (read-only): Get one of the caller's meditation sessions by id, or null. - meditation_list (read-only): List the caller's meditation sessions (start, whole seconds, kind: breathwork, mindfulness, body_scan, loving_kindness, walking, other), newest first; optionally a from/to window on the start (epoch ms). - meds_byId (read-only): Get one of the caller's medications with its regimens and requirements, or null. - meds_dose (read-only): Get one of the caller's dose logs by id, or null. - meds_doses (read-only): List the caller's dose logs (taken or skipped; a scheduled slot without a log was missed) from fromDay to toDay, both included, in order. - meds_list (read-only): List the caller's medications and supplements by name, each with its type (supplement, prescription, none), form, color, strength, brand, inventory, setup step (null once set up), its regimens (prescription or supplement plan: dates, duration, cycle, prescriber, refills, purpose) and its requirements (dose slots: time of day, HH:MM, dose, meal relation, weekdays) in order. - meds_regimen (read-only): Get one of the caller's medication regimens (a prescription or supplement plan) by id, or null. - meds_requirement (read-only): Get one of the caller's medication requirements (a dose slot) by id, or null. - meds_slot (read-only): Get the caller's dose log for one requirement on a day, or for an unscheduled dose of a medication (no requirement) the latest that day; null when nothing was logged. - mood_byId (read-only): Get one of the caller's mood check-ins by id, or null. - mood_list (read-only): List the caller's mood check-ins (mood, energy and stress 1–5, tags) from fromDay to toDay (both included), oldest first. - notes_byId (read-only): Get one of the caller's health notes by id, or null. - notes_list (read-only): List the caller's health notes (free text, tags), newest first; optionally a from/to window (epoch ms). - nutrition_byId (read-only): Get one of the caller's food entries by id, or null. - nutrition_day (read-only): List what the caller ate on a day (YYYY-MM-DD, their time zone), in order: name, meal, kcal, protein/carbs/fat/fiber g, micronutrients. - nutrition_range (read-only): List what the caller ate from fromDay to toDay (both included), oldest first. - pain_byId (read-only): Get one of the caller's pain entries by id, or null. - pain_list (read-only): List the caller's pain entries (body region, 3D point, intensity 0–10, type), newest first; optionally one region and a from/to window (epoch ms). - photos_byId (read-only): Get one of the caller's progress photos by id with its image, or null. - photos_list (read-only): List the caller's progress photos (day, pose: front, side or back, optional weight kg and body fat %, the R2 attachment metadata or a bundled image path), newest first; optionally one pose. - plans_byId (read-only): Get one of the caller's day plans by id, or null. - plans_list (read-only): List the caller's day plans (planned meals and fasts) from fromDay to toDay, both included, in time order. - privacy_mine (read-only): Get the caller's community privacy: per health domain whether it's public or private (missing means private), whether their stats show on their profile and the leaderboard, whether new entries auto-post to the timeline, and when they finished the privacy onboarding. Null until they save it once. - profile_me (read-only): Get the caller's health profile: height (cm), weight (kg), sex, birth date, body fat %, activity level, goal weight and unit system. Null until it's first saved with profile.update. - records_byId (read-only): Get one of the caller's medical records by id, or null. - records_list (read-only): List the caller's medical records (MRI, CT, X-ray, ultrasound, dental, ECG, documents) with the body region they cover and their file, newest first; optionally one kind. - sickness_active (read-only): Get the caller's open sickness (not recovered yet), or null. - sickness_byId (read-only): Get one of the caller's sicknesses by id, or null. - sickness_list (read-only): List the caller's sickness episodes (title, symptoms, severity 1–5, started/ended; ended null while still sick), newest first. - sleep_byId (read-only): Get one of the caller's nights of sleep by id, or null. - sleep_recovery (read-only): List the caller's daily recovery from fromDay to toDay, oldest first: HRV (ms), resting HR, readiness 0–100, strain, steps and active kcal, per source. - sleep_sessions (read-only): List the caller's nights of sleep from fromDay to toDay (the day each night ended), oldest first: bed and wake times, seconds of deep, REM, light and awake, HRV, resting HR, score and source. - substances_byId (read-only): Get one of the caller's substance logs by id, or null. - substances_list (read-only): List the caller's substance logs (alcohol, nicotine, other), newest first, up to limit rows (default 200); kind keeps one kind. Each row: kind, name, amount in unit (standard drinks, cigarettes, puffs, mg, doses), optional volumeMl/abv (alcohol) and route, at, day, notes. - substances_range (read-only): List the caller's substance logs from fromDay to toDay (local days, both included), oldest first. - temperature_byId (read-only): Get one of the caller's temperature readings by id, or null. - temperature_list (read-only): List the caller's body temperatures (°C, site), newest first; optionally a from/to window (epoch ms). - thermal_byId (read-only): Get one of the caller's heat or cold sessions by id, or null. - thermal_list (read-only): List the caller's heat and cold sessions (sauna, infrared sauna, hot bath, cold plunge, cold shower; °C, seconds), newest first; optionally a from/to window (epoch ms). - todos_archived (read-only): List the caller's archived todos, newest first. - todos_byId (read-only): Get one of the caller's todos by id, or null. - todos_mine (read-only): List the caller's active and paused todos, newest first. - users_me (read-only): Get the caller's own profile: name, email, username, bio, timezone, role, onboarding state, raw preferences, and the avatar and cover images (R2 attachment metadata). Null when the user no longer exists. - visits_byId (read-only): Get one of the caller's medical events (doctor visits, stays, blood draws, imaging, consultations) by id, or null. - visits_list (read-only): List the caller's medical events (doctor visits, consultations, ER, hospital stays with endedAt, blood draws, imaging, telehealth, dentist, physio) with facility, diagnosis, the doctor's conclusion and summary, newest first. - weightGoals_active (read-only): Get the caller's active weight goal, or null when none is running. - weightGoals_byId (read-only): Get one of the caller's weight goals by id, or null. - weightGoals_list (read-only): List the caller's weight goals (lose or gain from startKg to targetKg between startDay and endDay; status active, achieved or abandoned), newest start first; optionally one status. - whatsNew_seen (read-only): List the What's new entries the caller has seen on any device (entryId, seenAt), newest first. Entries from whatsNew.list without a row here are unread. - workouts_active (read-only): Get the caller's workout in progress (not finished yet) with its exercises and sets, or null. - workouts_byId (read-only): Get one of the caller's workouts with its exercises and sets, or null. - workouts_exercise (read-only): Get one exercise of one of the caller's workouts with its sets, or null. - workouts_list (read-only): List the caller's workouts with their exercises and sets (reps, kg, seconds, metres, RPE), newest first; optionally a from/to window on the start (epoch ms). - workouts_set (read-only): Get one set of one of the caller's workouts, or null. ## MCP tools (write) - admin_envVars: Admins only: list the deployment environment variables (Coolify, Vercel, Railway, Render, PORT, HOST, SOURCE_COMMIT), null when unset. - aiProviders_clearKey: Delete the caller's stored API key for an AI provider. - aiProviders_list: List every AI provider with whether the caller enabled it and stored a key (only the key's last 4 characters). - aiProviders_setEnabled: Turn an AI provider on or off for the caller's chats. - aiProviders_setKey: Store the caller's API key for an AI provider, encrypted, replacing any previous key. Returns its last 4 characters. - apiKeys_create: Create an API key for the caller (expiresIn in seconds, null never expires). Returns the record with the full `key`, which is shown only this once. - apiKeys_delete: Delete one of the caller's API keys; requests using it fail from then on. - apiKeys_get: Get one of the caller's API keys by id, without the secret. - apiKeys_list: List the caller's API keys, newest first, without the secrets. - apiKeys_update: Rename, enable or disable, re-expire or re-tag one of the caller's API keys, and return it. - attachments_confirm: Verify the uploaded R2 object matches the reserved attachment and mark it ready. Returns the attachment id and status. - attachments_delete: Delete a caller-owned R2 attachment from storage and remove its row. Returns success. - attachments_get: Get a short-lived signed download URL for a ready R2 attachment owned by the caller, or a published community image/profile avatar. - attachments_list: List ready attachments for a record owned by the caller, in display order. Returns metadata without signed URLs. - attachments_presign: Reserve an attachment for a record owned by the caller and return a short-lived R2 PUT URL and attachment id. Confirm it after uploading bytes. - attachments_reorder: Set the display order of the caller's files on one record: ids in the new order (ids not on that record are refused). Returns the ids in their new order. - auth_changePassword: Change the caller's password (8-128 characters, confirmed) after checking the current one, and sign out every other session. - bathroom_log: Log a bathroom visit and return it: poop (Bristol type 1–7) or pee (colour clear…brown), with blood and pain 0/1. Attaches to the open sickness unless sicknessId says otherwise. - bathroom_remove: Delete one of the caller's bathroom logs. - billing_appAccountToken: Get the caller's App Store appAccountToken: a stable UUID the iOS app passes to StoreKit with every purchase so Apple's transactions name this account. Created on first call. - billing_claimAppleTransaction: Record an App Store purchase or restore: verifies the signed transaction (JWS) from StoreKit against Apple's certificates, the bundle id, environment and the caller's appAccountToken, then records the entitlement. Returns whether that purchase is active and until when. - billing_state: Get the caller's billing state: Polar subscriptions and benefits, isPro (true for every signed-in caller: Healthmaxx is free) and proSources (active purchases from Polar or the App Store, usually empty). Without Polar it answers id "noop" with no Polar data. - body_edit: Change one of the caller's body measurements (only the fields given) and return it. A weight that ends up the newest also updates profile.weightKg. - body_log: Log a body measurement and return it: weight and muscle mass in kg, body fat and visceral fat in %, girths in cm. A weight newer than the profile's also updates profile.weightKg. - body_remove: Delete one of the caller's body measurements. - body_summary: Summarize the caller's body on a day (their local YYYY-MM-DD): BMI and WHO class, healthy weight range, body fat % (measured, else estimated from BMI and age), resting and daily energy (kcal), weight change over 7/14/30 days, and progress to the goal weight. Fields are null when the profile lacks what they need. - bp_edit: Change a blood pressure reading (only the fields given) and return it; the category is recomputed. - bp_log: Log a blood pressure reading (mmHg, optional pulse, arm and position) and return it with its 2017 ACC/AHA category: normal, elevated, stage1, stage2 or crisis. - bp_remove: Delete one of the caller's blood pressure readings. - bp_summary: Summarize the caller's blood pressure over a from/to window (epoch ms; default the last 30 days): the average and its ACC/AHA category (diagnosis goes by averages), readings per category, the latest reading, and weekly averages. - chats_create: Start a chat and return it. Defaults: title 'New chat', intelligence 'standard'. - chats_createFolder: Create a chat folder at the end of the caller's folder list and return it. - chats_deleteFolder: Delete a chat folder. Its chats are kept and move out of the folder. - chats_moveToFolder: Move a chat into one of the caller's folders, or out of any folder with null, and return it. - chats_remove: Delete a chat and all of its messages permanently. - chats_rename: Rename a chat and return it. - chats_renameFolder: Rename a chat folder and return it. - chats_setPinned: Pin a chat to the top of the list, or unpin it, and return it. - chats_updateSettings: Change a chat's AI provider, model or intelligence level (only the fields given), and return it. - community_challenges: List the community challenges (30-day dead hang, 12 workouts in 30 days, 11 cold minutes a week) with how many people joined each, whether the caller joined, and the caller's own progress up to today (their local YYYY-MM-DD). - community_join: Join a community challenge (dead-hang-30, train-12, cold-11) under a public handle and return the membership. Joining opts in: the caller's progress then shows on that challenge's leaderboard. Joining again only changes the handle. - community_leaderboard: Rank the members of one community challenge by progress (capped at the target), then by its tiebreak (longest hang, training minutes, cold sessions), each over their own rolling window. Only people who joined appear, under their handle; isMe marks the caller. today is the caller's local YYYY-MM-DD. - community_leave: Leave a community challenge: the caller drops off its leaderboard. Their hangs, workouts and sessions stay. - connectedApps_list: List the apps the caller connected through OAuth (MCP clients such as ChatGPT or Claude), most recently used first, with their scopes. - connectedApps_revoke: Disconnect one of the caller's connected apps: its access and refresh tokens stop working at once and it must ask for consent again. - connectors_authorize: Start connecting a cloud provider (strava, whoop, oura, garmin, withings, dexcom): returns the provider's consent URL to open. After the user approves, the provider redirects back and `days` of history start importing in the background (null: all the provider keeps; omitted: all on a first link, nothing extra on a reconnect). - connectors_backfill: Import more history from a connected cloud provider: reach back `days` from now (null: all the provider keeps). Only the part not imported yet is fetched, in the background; re-imported records never duplicate. Returns the import with its progress. - connectors_disconnect: Disconnect a real provider: forget its tokens and stop syncing; data already imported stays. Returns the integration. - connectors_list: List every connector in display order: provider id, name, whether it connects with OAuth (cloud) or syncs from the phone (device), the kinds of data it brings, whether this server has the provider's app credentials (configured), whether the caller has granted access (linked), whether the provider pushes webhooks, how many days of history it can import (historyDays), and the caller's history import (backfill: window, progress 0..1, records, finishedAt, last error) or null. - connectors_pull: Sync a connected cloud provider now: fetch everything new since its last sync and merge it into workouts, sleep, recovery, measurements, blood pressure and glucose. Returns how many provider records came in and how many rows they resolved to. - connectors_push: Push a batch from the phone's health store (apple_health or health_connect): records in the bridge's fields keyed by the store's ids, deletions, and the store's cursors per stream. Returns records stored and rows resolved. - customIntegrations_create: Create a custom integration: an ingest URL plus a bearer token that may write the given kinds (default sleep, daily, workout). Returns the integration with `token`, shown only this once. - customIntegrations_list: List the caller's custom integrations (own ingest tokens), newest first, without the tokens: label, allowed kinds, last use and whether revoked. - customIntegrations_revoke: Revoke one of the caller's custom integrations: its token stops working at once. Data it already sent stays. Returns the integration. - demo_clearMyData: Undo demo.seedMyData: delete its rows (ids starting 'demo:'), the Oura/Strava connections it made with everything they synced, the goals it set and the demo profile's fields the caller never changed. The caller's own entries, connections and real imported data stay. Returns how many rows went. - demo_seedMyData: Fill the caller's account with believable demo history up to today (their local YYYY-MM-DD; default 90 days): profile (only if they have none), goals, weight, fasts, meals, drinks, blood pressure, three lab panels, workouts, hangs, sauna and cold, supplements with doses, pain, moods, records, plus Oura and Strava connected (unless the caller already has a connection for them). Re-running replaces the demo rows. Returns row counts. - dental_addProcedure: Record a dental procedure and return it: procedure (cleaning, exam, xray, filling, crown, root_canal, extraction, implant, bridge, whitening, scaling, other), when, the teeth it was on (FDI numbers; empty for the whole mouth), optional cost, note and the dentist visit (visits id) it was done at. The tooth chart is not changed; use dental.setTooth. - dental_clearTooth: Remove a tooth's row from the caller's dental chart, so it reads as healthy again. - dental_logPain: Log tooth pain and return it: the teeth that hurt (FDI numbers; one tooth or an area), optional area (upper_left, upper_right, lower_left, lower_right, front_upper, front_lower, whole), intensity 0–10, kind (sharp, dull, sensitivity_cold, sensitivity_hot, throbbing) and note. - dental_removePain: Delete one of the caller's tooth pain entries. - dental_removeProcedure: Delete one of the caller's dental procedures. - dental_resolvePain: Mark tooth pain as gone (at resolvedAt, default now; null reopens it) and return it. - dental_setTooth: Set one tooth's state on the caller's dental chart and return its row: FDI number, status (healthy, filling, crown, root_canal, implant, missing, extracted, bridge, veneer, watch), optional surfaces (mesial, distal, occlusal, buccal, lingual) and note. id is used when the tooth has no row yet. - drawMarkers_add: Add a marker that was ordered for one of the caller's blood draws (a medical event, usually kind blood_draw) and return it: a LOINC code, a name as printed on the order (matched to the lab catalog), or both. It shows as ordered until a lab panel linked to the same event (labs.logPanel with eventId) has a result for it. - drawMarkers_remove: Remove an ordered marker from one of the caller's blood draws. - facilities_add: Add a hospital, clinic, lab, imaging center, dentist or other facility and return it: name, kind (hospital, clinic, lab, imaging_center, dentist, other), address, city, country, notes. Medical events point at it with facilityId. - facilities_edit: Change a facility (only the fields given; null clears one) and return it. - facilities_remove: Delete a facility; medical events at it stay, without a facility. - fasting_edit: Change a fast's times, target, protocol or notes (only the fields given) and return it. - fasting_end: End a running fast at endedAt (epoch ms) and return it. - fasting_log: Record a past fast with its start and end, and return it. Fails when it overlaps another fast. - fasting_remove: Delete one of the caller's fasts (running or finished). - fasting_start: Start a fast and return it. The target defaults to the protocol's hours (16:8 → 16, OMAD → 23…). Fails when a fast is already running. - fasting_stats: Summarize the caller's fasting up to today (their local YYYY-MM-DD): the running fast's progress, metabolic stage (fed → ketosis → autophagy…) and time to the next, plus history: completion rate, average and longest fast, and the streak of days that started a finished fast of 14 h or more. - feed_editPost: Edit one of the caller's community posts (only the fields given; null removes the GIF or image) and return it, marked as edited. - feed_editReply: Edit the body or GIF of one of the caller's replies and return it, marked as edited. - feed_gifs: Search GIFs for a community post or reply (trending when query is empty). available is false when no GIF provider is configured. - feed_leaderboard: Rank community members by activity over the last week, month or all time: posts, replies, reactions received and entries logged in public domains, plus their current logging streak. Only members who show their data on their profile appear; me is the caller's row, or null when they don't. - feed_moderate: Admins only: hide a community post or reply from everyone's feed, show it again, or delete it for good (with its replies and reactions). - feed_post: Create a community post in a topic and return it: a markdown body, optionally a GIF (from feed.gifs) or an image URL. Everyone signed in sees it in the feed. - feed_profile: Read a community member's public profile: name, handle, bio, their posts, and (only when they show their data on their profile) their streak, activity and the stats of the health domains they made public. - feed_react: React to a community post, or (with replyId) one of its replies, with an emoji. Reacting again with the same emoji changes nothing. - feed_removePost: Delete one of the caller's community posts with every reply and reaction on it. - feed_removeReply: Delete one of the caller's replies and the reactions on it. - feed_reply: Reply to a community post, or (with parentId) to a reply on it, and return the reply: a markdown body and optionally a GIF from feed.gifs. - feed_share: Share one of the caller's logged entries (a workout, weigh-in, measurement, meal, night of sleep, drink, blood pressure reading, meditation, dead hang or hot/cold session) to the community as a post with a card of its numbers, whatever their privacy settings, and return the post. The topic defaults to the entry's; body is an optional markdown caption. - feed_thread: Read one community post with all of its replies, oldest first; a reply's parentId points at the reply it answers. - feed_timeline: Read the community feed, newest first: posts from everyone (optionally one topic), each with its author, reaction counts (and which the caller left), reply count and any shared entry card. Pass the previous page's nextBefore as before to page back. - feed_unreact: Take back the caller's emoji reaction on a community post or reply. - foodItems_create: Add a food or branded product to the caller's pantry and return it: name, brand, barcode, kcal, protein, carbs, fat and fiber per 100 g, micronutrients per 100 g ({ sodium_mg: 40 }), usual serving in g, and a label photo (a ready attachment of owner type food_item). Log it with nutrition.log (foodItemId + grams). - foodItems_readLabel: Read a photo of a nutrition label (a ready attachment of owner type food_item) with the caller's own vision-capable AI key: product name, brand, barcode, serving size (g) and per 100 g kcal, protein, carbs, fat, fiber, sugar and salt (g), each null when the label doesn't show it, plus `uncertain`, the fields worth a second look. Writes nothing; save the reviewed values with foodItems.create or foodItems.update (labelAttachmentId). Fails when the caller has no AI key, their provider can't see images, or no nutrition table is legible. - foodItems_remove: Delete one of the caller's pantry items. Food entries logged from it keep their name and nutrition; templates that used it keep the nutrition it gave them. - foodItems_search: Search the caller's pantry by name, brand or barcode: every word must start a word of the item's name or brand. Returns the matching items, best first (name matches before brand matches), at most limit (default 20). - foodItems_update: Change one of the caller's pantry items (only the fields given; null clears one) and return it. Entries already logged keep their values. - goals_remove: Delete one of the caller's daily goals; the previous one of its kind applies again. - goals_set: Set a daily goal from a day on (it carries forward until the next one of its kind) and return it. One goal per kind per day: setting it again replaces the value. - gratitude_log: Log a gratitude entry and return it: one to five short lines the caller is grateful for, an optional note. day is the local day of at. - gratitude_remove: Delete one of the caller's gratitude entries. - hangs_log: Log a dead hang and return it: whole seconds, type (passive two-arm by default, active, single_left, single_right, alternating) optional added kg, 1–5 difficulty rating and note. - hangs_remove: Delete one of the caller's dead hangs. - hangs_stats: Summarize the caller's dead hangs up to today (their local YYYY-MM-DD): the personal record per hang type (longest bodyweight hang, heaviest weighted one), weekly bests of the passive hang and the improvement, a level, the target for their sex (2 min men, 90 s women) and the streak of hang days. - healthStates_remove: Delete one entry from the caller's health-state history (healthStates.history); the latest remaining entry becomes the current state. - healthStates_set: Set how the caller is right now (healthy, tired, injured, sick, recovering or hungover) and return their current state. Adds to the history; tired and hungover fall back to healthy after day (the caller's local day of at), the others stay until another is set. - hydration_log: Log a drink and return it. ml is the volume; day is the local day (YYYY-MM-DD) of at. Caffeine defaults to a typical amount for coffee, tea and soda. - hydration_remove: Delete one of the caller's drinks. - hydration_summary: Summarize the caller's hydration on a day (their local YYYY-MM-DD): total and effective ml (drinks weighted by how well they hydrate), the goal in effect (their own, else 35 ml/kg adjusted for activity), progress, caffeine against the 400 mg limit, ml per drink kind, and the streak of days the goal was met. - insights_today: The caller's day at a glance (their local YYYY-MM-DD): readiness score and level, and a timeline of everything logged that day across trackers (wake-up, drinks, meals, blood pressure, fasts, workouts, hangs, heat/cold, doses, pain, mood) with a short value each, in time order. - integrations_connect: Connect a provider (apple_health, health_connect, strava, whoop, oura) and import the last 30 days up to today (the caller's local YYYY-MM-DD). Returns the integration and how many rows each kind got. Mock providers for now. - integrations_disconnect: Disconnect a provider; data it already imported stays. Returns the integration. - integrations_remove: Delete a disconnected integration record (refused while it is connected or still holds tokens: disconnect it first). With purgeDemoRows, also delete the rows mock and demo syncs of that provider wrote (sleep, recovery, workouts, measurements with ids '::'); real connector data and the caller's own entries stay. Returns the removed integration and how many rows were purged. - integrations_sync: Import the last `days` days (default 7) up to today from a connected provider. Re-syncing updates rows instead of duplicating them. Returns the integration and row counts. - labs_addResult: Add one printed result to one of the caller's panels, normalized like labs.logPanel, and return it. - labs_catalog: Search the LOINC lab catalog (~130 common markers): code, canonical name, aliases, canonical UCUM unit, category, body system, organs, reference and optimal ranges. Empty query lists everything. - labs_editPanel: Change a lab panel's date, lab, notes, report file or the medical event it came from (only the fields given) and return it with its results. - labs_logPanel: Record a lab panel with its results and return it. Each result is given as printed (name, value, unit, optional reference range) and normalized: matched to its LOINC marker across naming variants, converted to the canonical UCUM unit and flagged low/normal/high. eventId links it to the blood draw (medical event) it came from, which marks that draw's ordered markers resulted. - labs_markers: Summarize every marker the caller has results for: latest value (with its comparator, or valueText for a text result) and flag, change since the previous exact result, trend per year, optimal-range status and the organs it concerns. Worst flags first. - labs_normalize: Preview how a printed lab result would be stored, without saving: its LOINC marker, the value converted to the canonical unit with its comparator ("<0.5" is lt), the reference range (by the profile's sex unless one is given) and the low/normal/high flag; a text result is normal or abnormal against expectedText. - labs_removePanel: Delete one of the caller's lab panels and all of its results. - labs_removeResult: Delete one result from one of the caller's lab panels. - log_apply: Parse a line of plain text (as log.parse) and write every intent it reads through the matching mutators (hydration.log, bp.log, body.log, fasting.start/end/log, nutrition.log, workouts.log, hangs.log, thermal.log, meds.take/skip, pain.log, mood.log, sleep.log, meditation.log, gratitude.log). Returns what was written (method, row id, result), what failed and why, and the parts it couldn't read. - log_parse: Read a line of plain text into typed health log intents without writing anything, e.g. "bp 128/82, 500ml water, knee pain 6 30 min ago": hydration, blood pressure, weight and body fat, fasting, food, workouts, sets, dead hangs, sauna and cold, medication doses, pain, mood, sleep, meditation, gratitude. Units are normalized (ml, kg, seconds, metres, °C); now (epoch ms) and timeZone default to the server clock and the caller's zone. Returns each intent with its fields, confidence 0–1, body region and label, plus unreadable parts with example phrases. - logTemplates_apply: Log a template now (or at at, epoch ms) through the same method as logging by hand (hydration.log, nutrition.log, mealGroups.create, mood.log, meds.take, substances.log), count the use, and return the template and what was written: the drink, food entry, meal group with its items, mood check-in, dose or substance log. id is the new row's id (a uuid, generated when left out); day defaults to the caller's local day of at. - logTemplates_create: Save a log template (a one-tap log) and return it. kind is the tracker: hydration (payload { ml, drink?, caffeineMg? }), nutrition (one food: name or foodItemId + grams, macros, mealType…), meal (a meal group: { label, mealType?, items: [food…] }), mood ({ mood, energy, stress 1–5, tags? }) or meds ({ medicationId or requirementId }). icon is an emoji or icon name; sortOrder defaults to after the caller's others. - logTemplates_markUsed: Count one use of a log template at at (epoch ms) and return it; apps call this after writing the template's log themselves (logTemplates.apply does both). - logTemplates_remove: Delete one of the caller's log templates; what was logged with it stays. - logTemplates_update: Change a log template's name, icon, payload (checked against its kind, which can't change) or sort order, and return it. - mealGroups_create: Create a meal group (food eaten together under a free label such as 'Breakfast', 'Post-gym' or 'Snack at work') with its items and return it with them. Each item is a food: stated macros, a rough description (rawText, confidence 0–1), or a pantry item (foodItemId) and grams; items get the group's time, day and meal type, and ids `:`. day is the local day (YYYY-MM-DD) of at. - mealGroups_remove: Delete one of the caller's meal groups and every food entry in it. - mealGroups_update: Change a meal group's label, time, day, meal type or notes (only the fields given) and return it with its items. A new time, day or meal type moves its items too. Add items with nutrition.log (mealGroupId), change them with nutrition.edit. - medicalCalendar_day: Everything medical on one of the caller's days (local YYYY-MM-DD), in full: its calendar items; each medical event with its facility, the doctor's conclusion (English, and as written with its language), summary, ordered blood-draw markers (ordered or resulted, with the result), documents (with their extracted text) and linked lab panels and records; the sicknesses covering the day; lab panels with results; records; workouts; and medication starts and stops. - medicalCalendar_range: The caller's medical history for fromDay…toDay (their local YYYY-MM-DD, both included, at most 400 days), for calendar cells and questions like 'what happened in March': one item per sickness, medical event (doctor visit, consultation, ER, hospital stay over its days, blood draw, imaging), lab panel, record and medication start or stop, plus one 'Trained' item per day with workouts. Each item has kind, category (icon key), title, detail, place, startDay/endDay, at, status (ongoing, planned, pending, abnormal) and refs to its rows; spans that overlap the range come whole. medicalCalendar.day has one day in full. - medicalDocuments_process: Read one of the caller's medical documents (a PDF or photo uploaded with attachments.presign/confirm: owner type medical_event, or blood_test for a lab panel's report when the panel is linked to a blood draw) with their own AI provider and store what it says: the document's text and language; for a lab report a lab panel linked to the event (LOINC-normalised results, which result the draw's ordered markers); for a doctor's conclusion the text as written, its language, an English translation and a short summary on the event; for an imaging report a record linked to the event. kind forces the document type (default auto). A lab panel's report is read as a lab report and its results are added to that panel. Re-running replaces this document's earlier panel, record or added results. Returns status done or failed with the reason (no AI key, unreadable output), and the ids written. Runs on its own after attachments.confirm for medical-event documents; call it to read a lab panel's report or to re-run. - meditation_log: Log a meditation session and return it: start (epoch ms), whole seconds, kind (mindfulness by default, breathwork, body_scan, loving_kindness, walking, other) and optional notes. - meditation_remove: Delete one of the caller's meditation sessions. - meds_add: Add a medication or supplement and return it: name, type (supplement, prescription, or none to just track it), form (pill, capsule, powder…), color, strength of one unit (amount + unit), brand, notes, a photo (photoAttachmentId, which becomes its first photo; attach more with attachments.presign, owner type medication), inventory (units on hand) and refill threshold (days). setupStep marks an unfinished setup (type, details, requirements); leave it out when done. Add its regimen with meds.addRegimen and its dose slots with meds.addRequirement. - meds_addRegimen: Add a regimen to one of the caller's medications and return it: a prescription (prescribedBy, prescribedOn, reason, refills, pharmacy) or a supplement plan (purpose, weeks-on/weeks-off cycle). Both take a start day and a duration: ongoing, N days/weeks/months (durationCount), or until a day (endDate). Its dose slots are requirements (meds.addRequirement). - meds_addRequirement: Add a requirement (one dose slot) to one of the caller's medications and return it: time of day (morning 08:00, afternoon 13:00, evening 18:00, night 22:00, or exact with an HH:MM time), dose amount and unit, relation to a meal (before, during, after, any), optional weekdays (0 = Sunday; null = daily) and notes. It joins the medication's latest regimen unless regimenId is given (null keeps it on the medication alone); it goes last unless position is given. - meds_edit: Change a medication's details (only the fields given; null clears one), including its type and setup step, and return it with its regimens and requirements. - meds_editRegimen: Change a regimen (only the fields given; null clears one) and return it; the end day follows the duration. Past dose logs stay. - meds_editRequirement: Change a requirement (only the fields given; null clears one) and return it. Today's dose log, if any, stays with it. - meds_endRegimen: End a regimen on a day (its last day of doses) and return it; its requirements stop counting toward adherence after that day. - meds_refill: Add units (tablets, capsules, ml) to a medication's inventory, e.g. after picking up a refill, and return it. - meds_remove: Delete a medication with its regimens, requirements and dose logs. - meds_removeRegimen: Delete a regimen and its requirements; dose logs already taken stay with the medication. - meds_removeRequirement: Delete a requirement (a dose slot); its past dose logs stay with the medication. - meds_reorderRequirements: Put a medication's requirements in the order given (ids, first to last) and return the medication; requirements left out keep their place after them. - meds_schedule: The caller's medication day: every scheduled slot on a day (their local YYYY-MM-DD) with its status (taken, skipped, missed, upcoming), the next dose due, 7- and 30-day adherence per medication (ended regimens excluded after their end), and supply: days of inventory left and whether to refill. - meds_skip: Mark a requirement's dose on a day deliberately skipped (it counts against adherence, apart from missed) and return its log. Returns units to inventory if it had been taken. - meds_take: Mark a dose taken and return its log: a requirement's slot on a day (requirementId), or an unscheduled, as-needed dose of a medication (medicationId). One log per requirement per day, so taking it again updates it. Draws the dose's units from inventory. - meds_undoDose: Delete a dose log (the slot goes back to due or missed); a taken dose returns its units to inventory. - mood_log: Log a mood check-in and return it: mood, energy and stress on 1–5, optional tags (e.g. 'slept badly', 'sauna') and notes. day is the local day of at. - mood_remove: Delete one of the caller's mood check-ins. - mood_trend: Analyze the caller's mood from fromDay to toDay: daily averages of mood, energy and stress (1–5), each scale's average, per-day slope and direction (stress falling counts as improving), and tags ranked by the mood that comes with them. - notes_log: Write a health note (anything worth remembering) and return it, with optional tags. Attaches to the open sickness unless sicknessId says otherwise. - notes_remove: Delete one of the caller's health notes. - nutrition_edit: Change a food entry (only the fields given; null clears one) and return it. Changing grams or foodItemId rescales the macros you don't give from the pantry item; mealGroupId moves it into one of the caller's meal groups, null takes it out. - nutrition_log: Log something the caller ate and return it. day is the local day (YYYY-MM-DD) of eatenAt; macros in grams, energy in kcal. Give foodItemId and grams to take the name and any macro you leave out from a pantry item; rawText (what was typed) makes it a rough entry, with confidence 0–1 for the estimate. mealGroupId adds it to one of the caller's meal groups (its meal type by default). - nutrition_parseRough: Estimate what the caller ate from rough text ('3 eggs, cherry tomatoes, slice of sourdough') with their own AI key: each item's name, quantity, unit, grams, kcal, protein, carbs, fat and fiber (g), a confidence 0–1, and the pantry item it matched (whose per-100 g values are used). Writes nothing; returns the items and `meal`, the arguments to log them with mealGroups.create (add an id) as rough items in the caller's local day. Fails when the caller has no AI provider key. - nutrition_remove: Delete one of the caller's food entries. - nutrition_summary: Summarize what the caller ate on a day (their local YYYY-MM-DD): kcal, protein, carbs, fat and fiber (g) against the goals in effect (goals carry forward), kcal per meal, and daily kcal for the 14 days up to it. - pain_edit: Change a pain entry (only the fields given) and return it. - pain_log: Pin pain on the body and return the entry: a region (e.g. knee_left, lower_back), optionally the exact point on the 3D model (x, y, z), intensity 0–10 and type. day is the local day of at. - pain_remove: Delete one of the caller's pain entries. - pain_summary: Summarize the caller's pain over a from/to window (epoch ms; default the last 90 days) for the body heat map: per region how often, average and worst intensity, days affected and a 0–1 heat, plus the worst pain of each day. - photos_log: Add a progress photo and return it: an image the caller uploaded (uploads id), pose (front, side, back), the local day it was taken, optional weight kg, body fat % and note. - photos_remove: Delete one of the caller's progress photos; the uploaded image stays until uploads.delete removes it. - plans_add: Plan a meal or a fast on a day's timeline and return it: kind meal (startAt, title, meal type, calories) or fast (startAt = last meal, endAt = first meal). Plans are drafts, not logs. - plans_edit: Change a plan (only the fields given) and return it; doneAt marks it done. - plans_remove: Delete one of the caller's day plans. - privacy_save: Save the caller's per-feature profile visibility and timeline auto-post flags and return their privacy. Omitted features remain unchanged; new features start private. onboarded marks privacy onboarding done. - profile_update: Create or update the caller's health profile (only the fields given; null clears one) and return it. Height in cm, weights in kg; bedtime and wakeTime are the ideal sleep window (HH:MM). goalWeightKg mirrors the active weight goal: setting it retargets that goal or starts one from the current weight at 0.5 kg a week, null abandons it (weightGoals.* set end days). - records_add: Add a medical record and return it: kind (mri, ct, xray, ultrasound, dental, ecg, document), title, when it was taken, the body region it covers, findings, and the uploaded file's key, name, type and size. - records_edit: Change a medical record (only the fields given; null clears one) and return it. - records_remove: Delete one of the caller's medical records (the row; its uploaded file is not removed from storage). - sickness_edit: Change a sickness (only the fields given; null clears one) and return it. Setting endedAt marks recovery. - sickness_recover: Mark the open sickness recovered at endedAt (epoch ms) and return it. - sickness_remove: Delete a sickness episode; its logs stay, unlinked. - sickness_start: Start a sickness episode and return it: a title ('flu', 'food poisoning'), when it started, symptoms and severity 1–5. While it is open, pain, temperature, bathroom, note and dose logs attach to it. Fails when one is already open. - sleep_log: Log a night of sleep by hand and return it: bed and wake times, the local day it ended, and optionally seconds of deep, REM and awake (the rest counts as light). The score is computed. - sleep_readiness: The caller's readiness on a day (their local YYYY-MM-DD): last night's sleep (asleep seconds, efficiency, score) and the morning's HRV and resting HR against their 14-day baselines, combined into a 0–100 score and level (optimal, good, fair, low). Null parts when there's no data. - sleep_remove: Delete one of the caller's nights of sleep. - sleep_removeRecovery: Delete one of the caller's daily recovery rows (HRV, resting HR, readiness, strain, steps; as listed by sleep.recovery), e.g. a day an integration or the demo imported. - substances_edit: Change one of the caller's substance logs (any of name, amount, unit, volumeMl, abv, route, at with day, notes; the kind stays) and return it. Omitted fields keep their value; null clears an optional one. - substances_log: Log alcohol, nicotine or another substance and return it. kind is alcohol, nicotine or other; name is the drink (Beer, Wine), the form (Cigarette, Vape, Pouch) or the substance; amount counts unit (default: drink, cigarette, dose). For alcohol, volumeMl and abv may replace amount (it becomes standard drinks of 14 g). route is optional (oral, smoked, vaped, nasal, …). day is the local day of at. - substances_remove: Delete one of the caller's substance logs. - temperature_log: Log a body temperature in °C and return it (site: oral, ear, forehead, armpit, rectal). Attaches to the open sickness unless sicknessId says otherwise. - temperature_remove: Delete one of the caller's temperature readings. - thermal_log: Log a heat or cold session and return it: kind (sauna, infrared_sauna, hot_bath, cold_plunge, cold_shower), water/air °C, whole seconds, optional humidity %. - thermal_remove: Delete one of the caller's heat or cold sessions. - thermal_stats: Summarize the caller's heat and cold exposure for the 8 ISO weeks up to today (their local YYYY-MM-DD): minutes, sessions and degree-minute dose per week against the ~57 min sauna and ~11 min cold weekly targets, plus the streak of days with a session. - todos_create: Create a todo and return it. The id is generated when omitted. - todos_export: Export the caller's active and paused todos as a Markdown checklist. - todos_plan: Set the day a todo is planned for (YYYY-MM-DD), or null to unplan it, and return it. - todos_remove: Delete a todo permanently. - todos_setDone: Mark a todo done or not done, and return it. - todos_setStatus: Pause, archive or reactivate a todo, and return it. Archived todos drop out of todos.mine. - uploads_create: Upload an image (base64, JPEG/PNG/WebP/HEIC, at most 15 MB) to the caller's file storage and return its uploads id and storage key; pass the id to photos.log or users.updateProfile. - uploads_delete: Delete one of the caller's uploaded images from storage and the database; a profile using it as avatar or cover loses that image. - users_deleteAccount: Permanently delete the caller's Healthmaxx account and all of its data (health records, chats, uploads, sessions). App Store subscriptions are not cancelled; manage them in Apple ID settings. Returns success. - users_markOnboarded: Mark the caller as onboarded and return the profile. - users_resendVerificationEmail: Send the caller a new email verification link (at most one a minute, five an hour), and return the updated limits. - users_resetOnboarding: Reset the caller's onboarding so the onboarding flow shows again, and return the profile. - users_setPreference: Set one boolean preference (notifications, sound, analytics, emailMarketing, emailUpdates, aiProviderEnabled) and return the profile with its preferences. - users_setTheme: Set the caller's appearance: light, dark, or system (follow the device); every signed-in web and mobile client switches to it. null forgets it, so each device keeps its own. Returns the profile; the choice is in preferences.theme. - users_setTrackers: Turn trackers on or off for the caller (fasting, caffeine, hydration, nutrition, weight, workouts, steps, sleep, dead-hangs, hot-cold, meds, mood, meditation, gratitude, dentistry, labs, blood-pressure, progress-photos, alcohol, nicotine, substances). Only the given ids change; the rest keep their value. Turned-off trackers are hidden in the app, their data is kept. Returns the profile; the settings are in preferences.trackers (unset ids default to on, except alcohol, nicotine and substances). - users_updateProfile: Update the caller's name, username, bio, timezone and avatar/cover image (an uploaded image id, or null to remove it), and return the profile. Omitted fields keep their value; an empty username clears it. - users_verificationEmailStatus: Get whether the caller can request another verification email and when (ISO time); null when verification is off or the email is already verified. - visits_edit: Change a medical event (only the fields given; null clears one) and return it. Setting endedAt ends a hospital stay. - visits_log: Log a medical event and return it. kind: general, specialist, consultation, urgent_care, emergency, stay (hospital stay from `at` to `endedAt`), blood_draw, imaging, telehealth, dentist, teeth_cleaning, physiotherapy, other. Also: title, provider, facilityId (facilities.add) or free-text facility, reason, diagnosis, the doctor's conclusion (English; conclusionOriginal + conclusionLanguage for the text as written), summary, follow-up and the sickness it was for (default: the open one). Prescriptions, records, lab panels, blood-draw markers and documents (attachments, owner type medical_event) point at it. - visits_remove: Delete a medical event and its blood-draw markers; prescriptions, records and lab panels from it stay, unlinked. Delete its documents first (attachments.delete), or they stay in storage. - weightGoals_close: End the caller's active weight goal as achieved or abandoned, recording the latest weight, and return it. - weightGoals_edit: Change one of the caller's weight goals (only the fields given) and return it. The target must stay on the direction's side of the start weight. - weightGoals_remove: Delete one of the caller's weight goals from their history. - weightGoals_start: Start a weight goal and return it: direction lose or gain, targetKg, startDay and endDay (YYYY-MM-DD). startKg defaults to the latest weigh-in, else the profile weight. The active goal, if any, ends as abandoned. - whatsNew_list: List Healthmaxx's published changelog (What's new), newest first: each change or entry with its title, plain-text description (null for one-liners), type (feature, improvement, fix, other), publishedAt (epoch ms) and its release's changelogTitle. Pair with whatsNew.seen for the unread ones. - whatsNew_markSeen: Mark What's new entries (ids from whatsNew.list) as seen by the caller on every device. Idempotent: entries already seen keep their first seenAt. - workouts_addExercise: Add an exercise to one of the caller's workouts (a catalog slug from workouts.exercises, or a custom name) and return it. - workouts_addSet: Add a set to an exercise and return it. Reps and weight left out are copied from the exercise's previous set. - workouts_edit: Change a workout's type, times or details (only the fields given; null clears one) and return it. - workouts_editSet: Change a set (only the fields given; null clears one), e.g. mark it done, and return it. - workouts_exercises: Search the exercise catalog (~175 lifts and bodyweight moves) by name and/or muscle group; each has a slug for workouts.addExercise, its muscles (primary first) and equipment. - workouts_finish: Finish the caller's workout in progress at endedAt (epoch ms), optionally with a 1–5 rating and notes, and return it. - workouts_log: Record a finished workout in one call and return it: type, start and end, optional distance (m), kcal, heart rate, rating, notes, and exercises (catalog slug or custom name) with their sets. - workouts_plates: Plate calculator: the plates per side (25, 20, 15, 10, 5, 2.5, 1.25 kg) that load a target weight on a bar (default 20 kg), and what can't be matched. - workouts_remove: Delete one of the caller's workouts with all of its exercises and sets. - workouts_removeExercise: Remove an exercise and its sets from one of the caller's workouts. - workouts_removeSet: Remove a set from one of the caller's workouts. - workouts_start: Start a workout (default type strength) and return it. Only one workout can be in progress; add exercises and sets while it runs, then finish it. - workouts_stats: Summarize the caller's training up to today (their local YYYY-MM-DD): workouts this week and month, the streak of consecutive training weeks, weekly counts and volume for 8 weeks, personal records per exercise (heaviest, estimated 1RM, most reps) and sets per muscle group over the last 7 days. ## Notes - MCP tool names are the REST method names with `.` replaced by `_` (`todos.create` is the tool `todos_create`). - Tool input schemas are served by `describe_tool` (or `tools/list` in all-tools mode). Recursive schemas are bounded for model compatibility; the original method validator still validates every call.