Read tools (scope: read)
These ten tools are available to any token carrying the read scope.
get_day
Returns everything logged on a single date: all food entries and their nutrition totals, water intake, completed workout sessions, and whether the day was marked as a rest day.
Key notes:
- Date format:
YYYY-MM-DD - Defaults to today in UTC if no date is passed
- Pass the date explicitly if the user’s timezone may be behind or ahead of UTC around midnight
get_range
Returns per-day nutrition totals, workouts, and rest-day status between two dates (inclusive). Use this for weekly or monthly summaries. It is far more efficient than calling get_day once per day.
Key notes:
- Both start and end dates are
YYYY-MM-DD - Ideal for questions like “how was my week?” or “what did I eat last month?”
list_workouts
Returns recent workout sessions in reverse chronological order (newest first), including exercises, sets, reps, and weights for each session.
get_goals
Returns your configured targets: calorie goal, macro targets, water goal, preferred weight unit, and stated training goal.
get_training_insights
Returns the app’s analytical conclusions about your training:
- Per-lift progression verdicts over the last 12 weeks
- Recovery metrics compared against your own baseline
- Six monthly training summaries
list_body_measurements
Returns recent check-ins, newest first, in kilograms and centimetres regardless of your in-app unit preference.
Every field the check-in holds is returned, not just the ones the charts plot: weight, body fat, all seven circumferences, lean and bone mass, basal metabolic rate, and notes. Each row also carries an id for deletion and a source of "manual" (typed in the app or through the API) or "health" (read from Apple Health or Health Connect).
Key notes:
limitaccepts 1 to 100, defaulting to 20- Fields with no value are returned as
nullrather than omitted, so a client can see what is missing and offer to fill it
get_health_days
Returns sleep, steps, resting heart rate, HRV, and active energy per day between two dates, as synced from Apple Health or Health Connect.
Key notes:
- Both
startandendare required and inclusive - HRV is SDNN on Apple and RMSSD on Health Connect. Never compare the two figures; compare a person against their own baseline
- Each day carries
manualFields, the list of fields the user corrected by hand. Those are pinned: the phone no longer overwrites them, and neither should you without being asked
list_health_workouts
Returns sessions read out of the platform health store (runs, rides, swims, and the rest), newest first, with duration, distance, heart rate, and whether each has been promoted into the training log.
Key notes:
limitaccepts 1 to 50, defaulting to 10
list_custom_metrics
Returns the user’s own tracked metrics, the ones the app has no built-in screen for, with each definition (unit, step, target, which tab it lives on) and its recent daily values, newest first.
Key notes:
tabnarrows tobody,nutrition, ortraining;daysaccepts 7 to 90 and defaults to 30tabis also what files an unbound metric onto a Health dial: body to Body, nutrition to Nutrition, training to Activity. A metric with ahealthMetricKeyignores it and files by the catalogue group of the signal it readshealthMetricKeyis the platform signal the metric is bound to, ornullwhen the user types it in- Each value says whether it was typed (
manual) or came off the health sync (synced)
list_platform_metrics
Returns the catalogue of Apple Health and Health Connect signals a custom metric can be bound to: key, label, unit, aggregation, the HealthKit identifier, the Health Connect record, and a gap note where one platform cannot supply it.
Read this before creating a metric with a healthMetricKey rather than guessing a key. Guessed keys are refused.
Key notes:
- By default it lists only the bindable metrics. The ones the app already scores on and draws its own screens for are excluded unless you pass
all: true groupnarrows to one category:activity,vitals,body,nutrition,sleep,reproductive, ormindfulness- Answered from the catalogue itself, with no database read behind it
Write tools (scope: write)
These eleven tools require the write scope. They are not listed to, or callable by, a read-only token.
log_water
Adds a water entry to a specified day.
Key notes:
- Amount must be between 1 and 5,000 ml
- Defaults to today in UTC if no date is passed
log_food
Adds a single food entry to a day.
Key notes:
- Calories are required
- Protein, carbohydrates, and fat all default to zero if not provided
- Defaults to today in UTC if no date is passed
log_weight
Records a body weight measurement for a day. If a weigh-in already exists for that day, it is replaced.
Key notes:
- Weight must be between 20 and 400 kg
- Defaults to today in UTC if no date is passed
log_workout
Records a completed workout session, including the exercises performed, sets, reps, and weights.
Key notes:
- Maximum 20 exercises per session
- Maximum 30 sets per exercise
- At most 2 sessions can be logged per calendar day. A third attempt on the same date is refused with an explanation, not silently dropped
mark_rest_day
Marks one or more dates as deliberate rest days, so the app does not treat gaps in your training log as missed sessions.
Key notes:
- Accepts up to 31 dates per call
- Dates are
YYYY-MM-DD
log_body_measurement
Writes or corrects any part of a day’s check-in: weight, body fat, any of the seven circumferences, lean mass, bone mass, basal metabolic rate, and notes. Use this rather than log_weight when you have more than a weight, or when you need to fix one field on a day that already has an entry.
Key notes:
- Partial by design. Only the fields you pass change; everything else on that day is left exactly as it was
- To blank a value, name it in
clearFields. Omitting a field never deletes it - Passing no fields at all is refused rather than treated as an empty write
- Correcting a day marked
"health"flips it to"manual", so a later phone sync stops overwriting it - Undoable from the app, and the undo restores the previous values of exactly the fields the call touched
set_health_metric
Pins one field of one day to a figure the user gives you, and keeps the phone from overwriting it on the next sync. This is the tool for “my watch was on the charger, I actually slept seven hours”.
Key notes:
fieldis one ofsleepMinutes,steps,restingHeartRateBpm,hrvMs, oractiveEnergyKcalvalue: nullreleases the field. The override is dropped and the next sync restores whatever the health store says- Values outside the plausible range for the metric are rejected, not clamped. A slipped decimal point should fail loudly rather than settle into a baseline
- Overrides are per field, so pinning a resting heart rate leaves that day’s steps syncing normally
- The call returns the day’s full
manualFieldslist, so you can see what else is pinned - Undoable from the app, including when the correction had to invent the day’s row: undoing then removes the row rather than leaving the corrected number sitting in it
log_health_workout
Records a cardio or activity session the phone cannot see: a watch OneRep has no integration with, or a bulk import.
Key notes:
- Pass a stable
externalIdand a repeated call replaces that session instead of duplicating it - The body describes the session in full, so a field you leave out on a replacing call is cleared
- This does not touch the training log. Promote the session to a workout in the app
create_custom_metric
Defines a new metric for the user to track.
Key notes:
kinddecides how the app draws it:counterfor whole things tallied through the day,numberfor a figure typed once,togglefor did-it-or-nottitle,tab,kind, andunitare required;step,target,accent, anddescriptionhave sensible defaultstabdecides which Health dial an unbound metric files under: body to Body, nutrition to Nutrition, training to Activity. Bound metrics file by their catalogue group instead- Pass a
healthMetricKeyfromlist_platform_metricsto have the health sync fill it in instead of the user typing it - A key the catalogue does not know is refused, not stored. A metric waiting forever on a reading nobody will send looks broken and is
- This never touches an existing metric. Use
update_custom_metricto change one - Undoable from the app, as is every other custom-metric write
update_custom_metric
Changes the definition of an existing metric while keeping every value already logged against it. Renaming a metric, moving it to another tab, or changing its target should not cost the user their history.
Key notes:
- Only the fields you pass move
target: nulldrops a target;healthMetricKey: nullunbinds it from the health sync and leaves the stored values alone- An unknown
healthMetricKeyis refused here too
set_custom_metric_value
Writes one metric’s value for one date, replacing whatever was there.
Key notes:
- The day is marked as typed, so a metric bound to the health sync will not have this figure overwritten on the next sync
value: nullclears the day, after which a bound metric goes back to whatever the health store says- Clearing a day that has nothing on it is an error, not a silent success
Delete tools (scope: delete)
These eight tools require the delete scope, which is separate from write. A key that can log a meal cannot remove one unless you gave it both. Every delete is undoable from the app.
delete_custom_metric takes the history with it, and undo is the only way back. To stop a metric syncing without losing what it has collected, unbind it with update_custom_metric instead.Deleting synced data does not stop it coming back. A later device sync may re-import the same health workout or re-write the same day’s readings. To stop a metric arriving at all, switch it off in Settings → Health & wearables.
Limits and behaviour
Rate limits
Rate limits apply per token, not per account:
This means one assistant running in a loop cannot lock you out of your own app; other tokens continue to work.
Date handling
All date parameters default to today in UTC. If the user is in a timezone that is significantly ahead of or behind UTC, pass the date explicitly to avoid logging entries on the wrong day around midnight.What is deliberately absent
No bulk clears. Deletes are one row at a time, by id. There is no way to empty a day, a date range, or an account over MCP; that lives in the app, where a human confirms it. No AI-billed operations. Coach features and photo logging are not accessible over MCP.Tool errors
Tool failures are returned astools/call results with isError: true and a human-readable message. They are not transport-level errors. This means the assistant can read the error message and correct itself (for example, by adjusting a value that was out of range) rather than seeing a failed HTTP request.