Skip to main content
OneRep exposes 29 tools over MCP. They are deliberately coarse, so an assistant can describe your training and nutrition without burning its context window on dozens of thin wrappers. Each tool belongs to exactly one scope, and a token is only shown the tools its scopes cover. A read-only token will not list or accept a write or delete tool call.

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:
  • limit accepts 1 to 100, defaulting to 20
  • Fields with no value are returned as null rather 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 start and end are 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:
  • limit accepts 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:
  • tab narrows to body, nutrition, or training; days accepts 7 to 90 and defaults to 30
  • tab is also what files an unbound metric onto a Health dial: body to Body, nutrition to Nutrition, training to Activity. A metric with a healthMetricKey ignores it and files by the catalogue group of the signal it reads
  • healthMetricKey is the platform signal the metric is bound to, or null when 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
  • group narrows to one category: activity, vitals, body, nutrition, sleep, reproductive, or mindfulness
  • 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:
  • field is one of sleepMinutes, steps, restingHeartRateBpm, hrvMs, or activeEnergyKcal
  • value: null releases 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 manualFields list, 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 externalId and 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:
  • kind decides how the app draws it: counter for whole things tallied through the day, number for a figure typed once, toggle for did-it-or-not
  • title, tab, kind, and unit are required; step, target, accent, and description have sensible defaults
  • tab decides 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 healthMetricKey from list_platform_metrics to 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_metric to 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: null drops a target; healthMetricKey: null unbinds it from the health sync and leaves the stored values alone
  • An unknown healthMetricKey is 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: null clears 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 as tools/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.