Skip to main content
Glama

Server Details

Connect your health, fitness, nutrition, sleep, and wearable data to your AI assistant.

Ownership verified
Status
Healthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
turnnoblindeye/wellness-project-mcp
GitHub Stars
2
Server Listing
Wellness Project MCP

TDQS

A3.8/5.0

Scored across 74 tools

Disambiguation4/5

Tools are partitioned by domain with clear routing guidance and mostly distinct read/write/visual responsibilities. A few boundaries overlap, such as log_meal and mark_empty_day both creating a 'Fast day' entry and get_workout vs show_workout vs show_week_workouts all presenting workout data, but the descriptions largely mitigate confusion.

Naming Consistency4/5

The dominant verb patterns are highly consistent: list_* for reads, log_* for entries, update_*/delete_* for mutations, and show_* for visual views. Deviations like create_goal, cancel_rest_day, mark_empty_day, manage_recovery_strategy, and add_or_update_personal_context break the pattern but remain readable and domain-scoped.

Tool Count1/5

At 74 tools this is far beyond the 25+ threshold, making the surface overwhelming regardless of domain breadth. Even a comprehensive wellness app would struggle to justify this many entry points, and an agent would need extensive routing to avoid misselection.

Completeness3/5

CRUD coverage is strong across most domains including workouts, meals, labs, injuries, cycle, wellbeing, goals, and recovery. However, there are dead ends: log_run has no update_run, sleep has no delete, personal context has no delete, and log_workout explicitly references a propose_workout tool that is missing from the set.

Available Tools

74 tools
add_or_update_personal_contextAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe memory text: a compact, durable fact or preference with no conversational filler.
memory_idNoRequired for update. The numeric id from list_personal_context. Omit for add.
operationYesadd creates a new memory. update replaces the content of an existing one, identified by memory_id.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that writes happen immediately with no separate approval step, that free accounts are capped at 3 memories and Pro at 50, that updates by id are allowed even at the cap, and that there is no delete/bulk capability. This meaningfully extends what the annotations alone communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical, but each paragraph earns its place: purpose, do-not-duplicate workflow, exclusions for structured health data, and write/cap behavior. The core action is front-loaded before broader guardrails.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 3-parameter tool with full schema coverage, an output schema, and meaningful annotations, the description closes the important gaps: when to update vs add, what content belongs, what caps apply, and why duplicate structured records should be avoided. No critical dimension appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all three parameters at 100%, but the description adds real semantics: it clarifies that content must be a compact durable fact/preference, illustrates valid content with examples, and explains the relationship between memory_id and operation update in the list-first workflow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Add a new Personal Context memory, or update an existing one by id.' It also distinguishes itself from nearby tools in the sibling list by explaining that memories are durable circumstances/preferences and that structured health data belongs in other dedicated tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit, actionable guidance: use list_personal_context first, pass the existing id with operation update instead of duplicating, and avoid storing metrics/trackable health data here because dedicated tools exist for those. This is strong when-versus-alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_rest_dayA
DestructiveIdempotent
Inspect

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:

  • date: parse the user's reference; default to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoThe date to un-mark. Format: YYYY-MM-DD. Default: today.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose destructiveHint=true and idempotentHint=true, so the description does not need to restate those. It adds useful framing with 'previously declared' and real user scenarios, but it does not reveal additional behavioral traits such as what happens when no rest day exists or whether the action is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the action first, then gives usage examples, then supplies a clear inference instruction. Every sentence earns its place, and the structured 'INFER — do not ask' line is easy for an agent to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a single-optional-parameter tool with an output schema present and annotations covering mutability, destructiveness, and idempotence. The description covers what the tool does, when to use it, and how to handle the parameter, so an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the date parameter, its format, and default. The description adds meaningful semantic guidance beyond the schema by instructing the agent to infer the date from the user's reference rather than asking, which directly affects invocation behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Remove a previously declared rest day.' This clearly differentiates the tool from sibling tools like log_rest_day and list_rest_days, since it targets undoing a prior declaration rather than creating or listing one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: when the user changes their mind or wants to undo a mistaken declaration. It does not explicitly name alternatives or state when not to use it, but the 'previously declared' qualifier and the examples make the intended context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_goalAInspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoConcise title, inferred from the goal inputs.
weeksNoFor weight_loss. Duration in weeks when target_date is not supplied. For body_comp. Duration in weeks when target_date is not supplied.
metricNoFor consistency. What consistency behavior to track. Required on create. Set at create, not editable later. For body_comp. Body composition metric. Required on create. Set at create, not editable later. For nutrition. Legacy nutrition metric.
new_nameNoFor n1_experiment. Name for a new supplement when not using supplement_id.
goal_typeYesGoal type to create.
new_brandNoFor n1_experiment. Optional brand for a new supplement.
race_dateNoFor race. Race date in YYYY-MM-DD format. Required on create.
start_dateNoYYYY-MM-DD. Default: today.
start_valueNoFor body_comp. Starting value when the goal begins. Required on create. Set at create, not editable later.
target_dateNoFor weight_loss. Target date in YYYY-MM-DD format. Use this when the user names a deadline. For body_comp. Target date in YYYY-MM-DD format. Use this when the user names a deadline.
week_windowNoFor consistency. How the week this goal is measured against is bounded: rolling = the last 7 days, sunday/monday = a calendar week that resets on that day. Default: rolling.
start_1rm_lbNoFor strength. Estimated 1RM when the goal starts. Required on create. Set at create, not editable later. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
target_hoursNoFor consistency. Nightly sleep target in hours. Required when metric is sleep_duration.
target_valueNoFor body_comp. Target body composition value. Required on create. For nutrition. Legacy nutrition target value. For standard targets, this is the numeric target value.
exercise_nameNoFor strength. Exercise name. Required on create. Set at create, not editable later.
new_dose_unitNoFor n1_experiment. Dose unit for a new supplement.
supplement_idNoFor n1_experiment. Existing supplement ID. Use either supplement_id or the new-supplement fields.
target_1rm_lbNoFor strength. Target 1RM. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
new_dose_amountNoFor n1_experiment. Dose amount for a new supplement.
start_weight_lbNoFor weight_loss. Starting body weight. Required on create. Set at create, not editable later. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
target_per_weekNoFor consistency. Target occurrences per week. Required on create.
target_time_secNoFor race. Target finish time in seconds. Required on create.
target_weight_lbNoFor weight_loss. Target body weight. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
input_weight_unitNoSet to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb.
intervention_daysNoFor n1_experiment. Intervention duration in days.
baseline_directionNoFor n1_experiment. Use already logged previous 14 days or collect the next 14 days.
target_distance_miNoFor race. Target race distance. Required on create. In mi, or km with input_distance_unit set. See UNIT INPUTS.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.
acknowledged_warningsNoWarning keys the user explicitly acknowledged after a guarded create attempt. Omit otherwise.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description adds meaningful non-obvious behavior: it loads existing goals itself, reports what a standard target changed from, and refuses duplicate/stacked goals by naming an ID. It does not mention auth requirements or rate limits, and does not explain what the output contains, but the duplicate-detection and self-loading behavior is genuinely useful context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The UNIT INPUTS block is front-loaded but occupies roughly half the description with a repeated per-category list that could be condensed. The core purpose and usage statements come after, and there is some redundancy ('there is no schema-discovery or list_goals prerequisite' overlaps with the later 'do not call list_goals first'). It is information-rich but not tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 29-parameter creation tool with 100% schema coverage and an output schema, the description covers the key operational behavior (unit handling, duplicate refusal, no list prerequisite) that the schema cannot. It stops short of explaining goal_type inference rules or the full set of canonical inputs, deferring to 'the canonical Goals definitions,' but what is present is sufficient for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and every parameter's description already explains its purpose, unit, and when required. The description adds the UNIT INPUTS protocol, which is a real value-add: it tells the agent to pass numbers unconverted and set companion fields for kg/km/cm/oz/fl_oz. However, it omits explanation of many other parameters (goal_type, metric, weeks, etc.) and the unit block is somewhat repetitive with the schema's per-field unit notes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Create a new Wellness Project goal or standard target.' It distinguishes itself from list_goals and update_goal by saying when to call it directly and that there is no list prerequisite. However, it does not define what a 'Wellness Project goal' or 'standard target' is, and the description is cluttered with a long unit-input preamble that dilutes the core statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to call it (user wants to establish a goal), which prerequisite tools NOT to call (no schema discovery, no list_goals), and what happens on conflict (refuses to stack and names the existing goal ID to use with update_goal). It also routes the agent to the generated inputs for formal fields. This is strong when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_cycleA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord ID. Alternative to date.
dateNoAlternative to id: a date (YYYY-MM-DD) that identifies the period — its start date, or any day within it. Resolves only when exactly one record matches.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the destructive nature is covered. The description adds valuable behavioral detail: exactly one of id or date is required, date resolution matches only the period start date or any date within it, and an ambiguous match causes an error that returns candidate IDs to retry with. This goes beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by usage constraints and selector details. Every sentence earns its place, with no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter destructive tool with annotations and an output schema, the description is complete. It covers what the tool does, when to use it, when not to use it, how to select the target, and how ambiguity is handled. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. However, the description adds important semantics: 'Exactly one required' clarifies the optional-looking schema, and it explains how date resolves and what happens on ambiguous matches. This meaningfully aids correct invocation beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: delete a period record. It explicitly distinguishes itself from update_cycle, telling the agent it must not use this tool to 'fix' a record. This makes it easy to tell apart from the sibling update_cycle tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: only when the user explicitly asks to remove a specific record. It also gives a clear exclusion and alternative: do not delete to fix a record; use update_cycle instead. The selector instructions further clarify how to invoke it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_injuryA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoInjury ID to delete. Alternative to injury.
dateNoOptional, narrows the injury selector to one active on this date (YYYY-MM-DD). Ignored when id is given.
injuryNoAlternative to id: body part or injury type substring, case-insensitive (e.g. "shoulder"). Optionally narrow with date.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this destructive, but the description adds meaningful behavioral context: deletion is permanent, severity history is also removed, and ambiguous injury matches cause an error returning candidate IDs. This goes well beyond the structured hints and clearly sets expectations for side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: effect first, side effect second, then selector rules. Each sentence earns its place and no information is repeated from the schema or annotations. The use of an em-dash separator and explicit rule statements makes it easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover safety, the description supplies everything else needed: selection strategy, disambiguation behavior, requiredness despite no schema-required params, and destructive consequences. The tool is fully usable based on this description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is met. The description adds value by explaining the mutual exclusivity between id and injury, the exact-one-required contract, the role of date as a narrowing filter, and the error behavior on ambiguous matches — all beyond the schema's individual property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Permanently delete an injury entry.' The scope is precise, and naming the cascading removal of severity history distinguishes this from update_injury and log_injury. An agent can tell exactly what this tool does and what side effects come with it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational guidance: how to choose between id and injury, when to use date to narrow, and that exactly one selector is required. It does not explicitly discuss alternatives like update_injury for non-destructive changes, but the selector guidance is detailed enough for practical use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_lab_resultA
DestructiveIdempotent
Inspect

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, date+marker, or draw_id:

  • id: deletes a single marker's row.

  • draw_id: deletes every result sharing that draw_id at once, unambiguous by construction. Irreversible.

  • date (optionally narrowed by panel_name): deletes every result from that draw at once, but ONLY when exactly one draw exists on that date — see AMBIGUITY below. Irreversible and can remove many rows in one call. Confirm with the user before a date-scoped delete, especially one not narrowed by panel_name or marker.

  • date + marker (a marker-name substring, case-insensitive, optionally narrowed by panel_name): resolves to and deletes one marker's row, same as id. Errors with candidate IDs if more than one marker on that date matches.

AMBIGUITY: a bare date (optionally + panel_name) selector is rejected, with nothing deleted, if it would match more than one physical draw — an explicit draw_id from one source plus legacy rows with none, two distinct draw_ids, or two differently-named legacy sources on the same day. The error names every draw found; retry with draw_id, marker, or a narrower panel_name.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoLab result ID. Deletes a single marker row. Alternative to date/draw_id.
dateNoCollection date of the draw to delete. Format: YYYY-MM-DD. Deletes every result from that draw (see AMBIGUITY above), or (with marker) one row. Alternative to id/draw_id.
markerNoOptional with date: marker-name substring, case-insensitive (e.g. "LDL"), narrowing the date selector to delete a single marker row instead of the whole draw. Ignored when id or draw_id is given.
draw_idNoOpaque label of your choosing grouping a set of results from one visit, normalized server-side. Deletes every result sharing that label, unambiguous by construction. Alternative to id/date. Ignored when id is given.
panel_nameNoOptional, narrows a date (or date+marker) selector to one panel within that draw (e.g. "Lipid Panel"). Ignored when id is given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true and idempotentHint=true, but the description adds crucial behavioral context: deletion is irreversible, date-scoped deletes can remove many rows, and ambiguous dates are rejected with nothing deleted and candidate IDs returned. This fully discloses what gets destroyed and how failures behave.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every block earns its place given the destructive and ambiguous nature of the operation. The core action and use condition are front-loaded, selector rules are organized, and the AMBIGUITY section handles the trickiest behavior clearly. No filler or repetition beyond what improves safe usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with five optional parameters and complex selector semantics, the description covers the key decision space: which selector to use, how ambiguity is resolved, what is irreversible, and when to confirm with the user. The output schema exists, so return-value details do not need to be repeated here. Nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description adds substantial meaning beyond the schema: pass exactly one selector, marker matching is a case-insensitive substring, draw_id deletes all rows sharing that label, and panel_name narrows date selectors. It also explains resolution and rejection behavior that the schema alone cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Permanently delete one or more lab results.' It clearly distinguishes this destructive action from the sibling update_lab_result and the many list/log tools, and even states the triggering user intent. The selector breakdown reinforces exactly what the tool operates on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use the tool: when the user asks to remove or delete a logged lab result. It also provides strong exclusions and guardrails: 'Never guess a selector,' warns about ambiguity, and instructs confirming with the user before date-scoped deletes. This goes well beyond implied usage and actively prevents misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_mealA
DestructiveIdempotent
Inspect

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.

CAFFEINE: caffeine sidecars linked to this meal are deleted by the database in the same food-row delete. Do not call a separate caffeine delete tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoMeal ID, if already known. Alternative to date + name — see FIND THE MEAL above.
dateNoDate the meal was logged. Format: YYYY-MM-DD. Used with name to find the meal when id is omitted; defaults to today if id and date are both omitted.
nameNoSubstring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already flag the operation as destructive, but the description adds meaningful behavioral detail: the action is irreversible, ambiguous matches return an error with nothing deleted, retries should use id or a narrower name, and linked hydration/caffeine events are removed automatically. This goes well beyond the annotation metadata and directly shapes safe invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every section earns its place. The intent is front-loaded in the first sentence, and the FIND THE MEAL / HYDRATION / CAFFEINE sections are clearly labeled and logically separated, making the content easy for an agent to parse and apply.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, ambiguity-prone delete operation, this description covers the entire invocation context: how to identify the target, what happens on failure, retry guidance, and automatic cascade behavior for linked records. An output schema exists to cover return values, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already has a strong 100% coverage with per-parameter descriptions, the tool description enriches those semantics with the decision tree: id takes priority, date defaults to today, and name is only a disambiguator used when multiple meals were logged that day. It even warns that an ambiguous match will error and the agent should never guess, which is genuinely useful parameter-level guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Permanently delete a meal entry,' naming the exact verb and resource. It also states the precise user-intent trigger ('when the user explicitly asks to remove or delete a logged meal'), which clearly differentiates it from update_meal and the other meal-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use condition and then expands into a structured disambiguation protocol: use id if known, otherwise date, and add name only when multiple meals exist on that date. It also provides strong exclusions, telling the agent not to issue separate hydration or caffeine delete calls because the database handles those cascades.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_recovery_sessionA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecovery session ID. Alternative to session_date.
session_dateNoAlternative to id: the date (YYYY-MM-DD) the session was logged on. Optionally narrow with session_category.
session_categoryNoOptional, narrows session_date to one category when more than one session shares that date. Ignored when id is given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal destructiveness and idempotency, and the description adds irreversibility, ambiguity-handling guidance, and the error behavior with candidate IDs. The description and annotations align, and the additional context meaningfully exceeds what annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the most important facts (permanence, irreversibility, ambiguity handling) followed by a compact selector block. Every sentence adds operational value and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's destructive nature and the non-obvious selector logic, the description fully equips an agent to call it correctly: it covers user clarification, parameter selection, ambiguity resolution, and error recovery. The output schema and annotations cover remaining details, so nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds crucial cross-parameter semantics: the selector relationship between id and session_date, the optional narrowing role of session_category, that session_category is ignored when id is given, and the exactly-one-required constraint. This goes well beyond the baseline schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Permanently delete') and a specific resource ('a recovery session log entry'), clearly distinguishing it from sibling delete/update/log tools. The title annotation adds a parallel label, and the resource is unambiguous against the large set of sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs the agent on when to ask the user for clarification, how to resolve the target session using either id or session_date, and what to do if multiple sessions match. It also clearly states that exactly one of id or session_date is required, which is not reflected in the schema's required parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_runA
DestructiveIdempotent
Inspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRun UUID. Alternative to date.
dateNoAlternative to id: the date (YYYY-MM-DD) the run was logged on. Optionally narrow with distance_mi.
distance_miNoOptional, narrows date to a run within 0.25 mi of this value when more than one run shares that date. Ignored when id is given. In mi, or km with input_distance_unit set. See UNIT INPUTS.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so safety is covered structurally. The description adds genuine behavior beyond that: it warns the call errors with candidate IDs when the selector matches multiple runs, and it requires confirmation on ambiguous intent. It does not state reversibility or what is destroyed alongside the run.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with a large UNIT INPUTS block that is irrelevant to a delete operation except for the single optional distance_mi field, and it buries the actual purpose ("Delete a run") several paragraphs down. The purpose and selector guidance are good but not front-loaded, and the boilerplate dominates the text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with an output schema and full annotation coverage, the description supplies the selector contract, the confirmation requirement, and the multi-match failure path. What remains unspecified is the effect on dependent data and whether deletion is recoverable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the per-field docs are already handled. The description still earns credit for adding rules the schema lacks: "exactly one of id or date required", the approximate 0.25 mi narrowing semantics, and the multi-match retry behavior. The long unit-conversion rules also add meaning beyond "mi, or km with input_distance_unit set".

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Delete a run" names a specific verb+resource, and "Use when the user wants to remove a run entry" disambiguates it from the many sibling deleters (delete_workout, delete_cycle, delete_meal). An agent can pick it out immediately from the list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear trigger conditions ("remove a run entry") and an explicit caution to ask for confirmation on ambiguous intent. However, it never explicitly routes the agent away from the nearest alternative (e.g. delete_workout, or update for corrections), so the alternative-selection guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_wellbeingA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoWellbeing entry ID to delete. Alternative to date.
dateNoAlternative to id: a date (YYYY-MM-DD) that falls within the entry's period. Resolves only when exactly one entry matches.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reinforces the destructive nature ('Permanently delete') and adds transparency about the idempotent behavior (error with candidate IDs on ambiguous date). It goes beyond the annotations by detailing the exact failure mode and retry guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet complete, comprising two sentences and a selector note. Every word contributes to usage clarity, with no redundant or vague statements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete operation, the description covers all necessary context: target, selector, exclusivity, and error handling. The lack of output schema details is acceptable since a delete confirmation is standard and does not hinder usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (id and date) are fully described in the schema and the description, including the semantics of date ('any day within the entry's period') and the exclusivity requirement. High schema coverage combined with clear prose makes parameter usage unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Permanently delete') and the target ('a wellbeing entry'), with no ambiguity. It effectively distinguishes this from sibling tools like update or log by specifying deletion and the selector mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use the tool by providing a selector rule: pass id or date, exactly one required. It also describes the error condition when the date matches multiple entries, giving clear guidance for resolution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_workoutA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSubstring of the workout's focus/type (e.g. "Push", "Leg Day"), case-insensitive, to disambiguate multiple sessions on the same date. Only used when session_id is omitted.
session_idNoPositive session ID returned by a workout tool. If unknown, omit it and use session_date + name; never guess.
session_dateNoDate the session was logged. Format: YYYY-MM-DD. Used with name to find the session when session_id is omitted; defaults to today if both are omitted.
saved_workout_idNoSaved Workout ID to delete. When present, deletes the reusable prescription and does not touch completed workout history.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint/idempotentHint annotations, it discloses irreversibility, the exact scope of destruction (session, supersets, sets), and critically the failure semantics: a non-singleton match errors with nothing deleted, with retry guidance. This is behavioral context the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and consequence, then organized under FIND THE SESSION and SAVED WORKOUTS headers. Multi-sentence length is justified because every sentence carries disambiguation or safety information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the definition covers selection logic, scope of deletion, failure behavior, and the alternate entity path. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: name is a case-insensitive substring used only for disambiguation when more than one session exists that day, session_date defaults to today, and saved_workout_id targets a different entity class. It goes beyond restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Permanently delete a workout session and all its exercises and sets") and clearly separates the two deletable entities: completed workout session vs. reusable Saved Workout. It is trivially distinguishable from sibling update_workout and the other delete_* tools, which target different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ("Use when the user wants to remove a logged workout entirely") and a full decision procedure: pass session_id if known, else session_date + optional name, and only the name when multiple sessions share a date. It routes to saved_workout_id for the other deletion target and tells the agent never to guess.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_app_guide_sectionA
Read-onlyIdempotent
Inspect

Look up customer-facing Wellness Project product knowledge. Use it for app navigation, visible features, integrations, metric meanings, logging methods, permissions/sync questions, or troubleshooting.

Wellness Project-specific answers are closed-book: answer them from this tool's result, never from memory. The result states its own grounding rules.

Use wearables for supported integrations, basic connection requirements, broad data coverage, and explicitly documented provider limitations. Use metrics for user-facing metric meanings. Use sync_details only for permissions, history depth, missing history, and detailed sync behavior. Use troubleshooting only when the user reports unexpected behavior or asks how to recover.

For recognized exercise names or whether an exercise is in the app's exercise library, use list_exercises rather than guessing or expecting the app guide to enumerate exercises.

For cost, price, Free vs Pro, Founding Member, upgrading, or the 3-analysis limit, use topic=pricing. Reproduce exactly one returned pricing message verbatim, include the supplied subscription link, and add no other pricing detail. The app attaches its own upgrade button to that message when one applies; never type out a button, chip, link markup, or call-to-action of your own.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesChoose the narrowest relevant area. pages_dashboard = Dashboard, Me, Settings, AI Assistants. pages_training = Fitness, workouts, running, cycling, heart, recovery. pages_nutrition = nutrition, hydration, caffeine, sleep, body, wellbeing, labs. personas = AI specialists. logging = ways to log/correct data. photos = meal photos, labels, barcodes. wearables = integrations, connection requirements, known provider limits. metrics = user-facing metric meanings. goals = goals/targets. challenges = friend challenges. privacy = account controls/policy links. sync_details = permissions, history, missing-data behavior. troubleshooting = unexpected behavior/recovery. pricing = approved pricing copy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and idempotent safety, and the description adds behavioral context annotations cannot express: the closed-book grounding requirement ('answer them from this tool's result, never from memory'), the verbatim-reproduction rule for pricing messages, and the prohibition on typing out buttons, chips, or link markup. The note that the app attaches its own upgrade button also informs expected output handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence and the text is organized into distinct sections (purpose, grounding rule, tool routing, sibling routing, pricing behavior) with no fluff. It is long, and the wearables/metrics/sync_details/troubleshooting routing prose partly duplicates the schema's enum descriptions, so it is not maximally concise — but every paragraph earns its place given the routing complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup tool with an output schema, full enum documentation, and safety annotations, the description is complete: it covers purpose, when to use internal topics vs sibling tools, grounding behavior, and the special pricing output format. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed per-enum descriptions, so the schema carries the semantic weight. The description adds modest value by mapping cost/price/Free-vs-Pro/Founding-Member/3-analysis-limit queries to topic=pricing — details beyond the schema's terse 'approved pricing copy' — but otherwise reinforces rather than extends the schema's enum meanings.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — 'Look up customer-facing Wellness Project product knowledge' — and enumerates concrete use cases (app navigation, visible features, integrations, metric meanings, logging methods, permissions/sync, troubleshooting). It differentiates from siblings by expressly naming list_exercises for exercise-name lookups and pricing for cost questions, so an agent can distinguish it without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Routing guidance is explicit and actionable: within the tool it tells which topic to use for which need (wearables vs metrics vs sync_details vs troubleshooting), and outside it names list_exercises as the alternative for exercise names. It even states a positive selection rule ('Use troubleshooting only when the user reports unexpected behavior') and a negative one ('never from memory').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_exercise_historyA
Read-onlyIdempotent
Inspect

Look up everything the user has done for ONE exercise: all-time PR plus recent performance, across many sessions.

USE FOR:

  • PR lookups — "what's my bench PR?", "have I ever squatted 315?". Returns the est. 1RM PR and the exact set it came from (date, weight, reps, RPE, banded vs unbanded, superset siblings, notes), plus rep-range bests (1RM/3RM/5RM/10RM). Banded and unbanded PRs are shown side-by-side when both exists.

  • Recent-activity questions — "how has my squat been lately?", "when did I last deadlift?". Returns the most recent N sessions containing the exercise, formatted like get_workout.

  • Trend questions — "am I getting stronger on incline DB press?". Includes a one-line delta of current best vs ~30-90 days ago.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
since_dateNoOptional YYYY-MM-DD lower bound for the Recent block. Does not affect the PR section, which is always all-time.
recent_limitNoHow many recent sessions containing this exercise to surface. Optional — default 10, capped at 50.
exercise_nameYesExercise to look up. Required. Free-text — the tool resolves to canonical (e.g. "bench" → "Bench Press").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, non-destructive, closed-world. The description adds genuine behavioral detail beyond them: that the PR is always all-time regardless of since_date, that banded and unbanded PRs appear side-by-side, rep-range bests, and that since_date narrows only the Recent block. Some return-content detail overlaps the output schema, keeping this just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Strongly front-loaded and organized under USE FOR / NOT for / INFER headers, with the scoping constraint stated first. Slightly long overall, but no sentence is clearly disposable, so a 4 rather than a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with rich annotations, a full output schema, and three fully documented parameters, nothing an agent needs to invoke it correctly is missing — selection criteria, argument inference, and the since_date/PR interaction are all covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description earns extra: it clarifies exercise_name resolution (free-text resolved to canonical, or reports if never logged) and reinforces that since_date affects only the Recent block while the PR stays all-time. This adds meaning the schema states only in passing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a precise verb and resource — look up everything for ONE exercise, all-time PR plus recent performance across sessions. It explicitly contrasts against the two most confusable siblings (get_workout for a full session, list_workouts for a date-window list regardless of exercise), so an agent can route to it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE FOR block enumerates three distinct intents with example user phrasings (PR lookups, recent-activity, trend), and the NOT-for section names the exact alternative tools and the condition that selects them. The INFER block further tells the agent which arguments to derive rather than ask for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workoutA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession ID from list_workouts. Required.
saved_workout_idNoSaved Workout ID from list_workouts(saved_workouts=true). When present, returns the reusable prescription instead of a completed workout session.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal read-only and idempotent behavior, and the description goes far beyond them by disclosing a non-obvious accuracy quirk: a wrong or missing equipment tag on a dumbbell exercise 'silently halves or doubles its NSI score.' It also explains when equipment is shown per exercise vs per set and what 'missing' means, which is highly useful behavioral detail not present in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely informative, with clear section headers (NSI, EQUIPMENT, REQUIRED WORKFLOW, SAVED WORKOUTS) that make scanning easy. Every sentence adds operational knowledge; there is no filler or repetition of schema definitions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the tool has complex behavior (nested NSI scoring at session/exercise/set grains, equipment-tag sensitivity, two distinct input modes). The description covers all of these, plus the required lookup workflow and a correctness caveat. Together with the annotations and schema, an agent has everything needed to invoke the tool correctly and interpret its unusual scoring behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema: it explains that session_id comes from list_workouts and is required, clarifies saved_workout_id returns a 'reusable prescription instead of a completed workout session,' and warns against combining saved_workout_id with session_id/session_date. These semantic clarifications exceed the schema's basic field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Retrieve full detail of a workout session' and enumerates the exact contents (exercises, sets, reps, weights, superset groupings, heart points, notes, NSI scoring). It clearly differentiates from siblings like list_workouts (list vs full detail) and show_workout (which may focus on summary/display), and also explains the separate saved_workout_id mode.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use for detailed questions about a past workout, reviewing training before recommendations, confirming what was logged, or comparing a session to population strength standards.' It also mandates the preceding workflow step ('call list_workouts first to find the session ID — never guess it') and gives a clear exclusion/alternative for saved workouts ('Do not combine it with session_id/session_date').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_blog_postsA
Read-onlyIdempotent
Inspect

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/.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOptional — number of posts to return. Default 10, max 30.
queryNoOptional — substring filter applied to title and summary (case-insensitive).
advisor_slugNoOptional — filter to one advisor (e.g. "nutritionist" for Casey Mills).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable behavioral context beyond that: it is a search over public content, returns specific fields, and prescribes how results should be linked inline. This is more than the annotations alone provide, though it does not cover edge cases like empty results or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well organized: purpose first, usage constraint second, return format and link handling last. Every sentence adds useful information, with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple, optional-parameter read tool with a rich schema, output schema, and full annotations. The description covers when to use it, what it returns, and how to format links, so an agent has everything needed to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented with types and descriptions. The tool description adds no new parameter semantics beyond the general search framing, which matches the baseline for fully covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: searching the public Crew Blog at /blog for advisor-authored posts. It clearly identifies what the tool returns and the /blog/<slug> link format, making its purpose unambiguous and distinguishable from the many list/show siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: only when the user explicitly asks about the blog or what an advisor has written. It also provides a clear when-not-to-use instruction: don't volunteer posts in normal conversation. No sibling tool covers this same domain, so naming an alternative is unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_body_metricsA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 30 days ago

  • end_date: default to today

BMI in the output is derived from the user's canonical height and that day's resolved weight -- do not recompute it yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 30 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint false), the description adds behavioral context: it states BMI in the output is derived from the user's canonical height and that day's resolved weight, and instructs the agent not to recompute it. It also explains default parameter behavior (infer 30 days ago to today). These details help the agent understand side effects and derived data, exceeding annotation-only transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It covers purpose, usage conditions, range constraints, and behavioral notes without unnecessary verbosity. Each sentence serves a distinct purpose: identifying the resource, stating when to use, noting the 31-day limit, and explaining parameter inference. No fluff or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description need not explain return values. It fully covers input parameters, defaults, usage context, range limits, and derived data behavior. The description provides all necessary information for an agent to invoke the tool correctly in various scenarios, making it contextually complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions for start_date and end_date specify format (YYYY-MM-DD) and defaults ('30 days ago', 'today'). The description reinforces these defaults and adds the 'INFER — do not ask' guidance, making the parameter semantics fully clear. Schema coverage is 100%, and no enums exist, so the description effectively complements the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists body composition entries within a date range. It specifies the resource ('body composition entries') and scope ('date range'), and the context signals show sibling tools include similar list tools, enabling an agent to distinguish this from list_workouts, list_meals, etc. The verb 'list' and explicit resource make the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('when the user asks about their weight history, body fat trend, or any body metrics over time'). It also provides guidance for handling longer periods by making multiple calls with sequential date ranges, and instructs the agent to infer default parameters rather than asking the user. This gives clear, actionable usage instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_caffeineA
Read-onlyIdempotent
Inspect

List caffeine doses by local date with daily totals. Use for caffeine history or today's total. Supports up to 366 days per call; daily totals cover every dose in the range, while the dose list shows the 200 most recent and says how many it omitted.

INFER: from/to default to the last 14 local calendar days through today.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast local date, YYYY-MM-DD. Default: today.
fromNoFirst local date, YYYY-MM-DD. Default: 13 days before today.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses important behavioral details: the 366-day limit, daily totals covering all doses, the dose list capping at 200 most recent, and that omitted doses are reported. It also explains default date behavior via the INFER note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and uses a clear INFER section for defaults. No sentence is wasted; the behavioral limits and use cases are presented efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and comprehensive annotations, the description covers all necessary operational context: purpose, defaults, limits, and truncation behavior. An agent has enough information to invoke the tool correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already has a clear description. The tool description adds value by explaining the default range behavior ('from/to default to the last 14 local calendar days through today') and by framing parameters in terms of local calendar dates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List caffeine doses by local date with daily totals.' It also clarifies its intended use cases ('caffeine history or today's total'), making it distinct from other list tools like list_sleep or list_meals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use for caffeine history or today's total,' which gives clear usage context. It does not mention alternatives or when not to use it, but the use cases are specific enough for an agent to select it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_cycleA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 6 months ago

  • end_date: default to today

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 6 months ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it clarifies date-range scoping, explains the relationship to update/delete operations, and instructs the agent to infer defaults rather than ask the user.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. The sibling differentiation, usage condition, and default-inference instruction each earn their place without redundant filler. It is structured for quick scanning by an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with two optional parameters, full schema coverage, a safe read-only annotation profile, and an output schema, the description provides everything needed to invoke it correctly. It also covers the relevant edge case of ambiguous update/delete matches, making it contextually complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both start_date and end_date already documented including format and defaults. The description mostly repeats these defaults in the INFER block. It adds the 'do not ask' operational instruction, but that is not new parameter semantic meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List the user's logged period records within a date range.' It also explicitly differentiates this tool from update_cycle and delete_cycle, so an agent can tell exactly what list_cycle is for relative to its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use it when the user asks about cycle history, or to get an id after an ambiguous update/delete match. It also explicitly says the tool is no longer required before update_cycle/delete_cycle because those resolve records by date, which prevents unnecessary calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_exercisesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful context by revealing the grouping behavior and explaining that canonical names support exercise tracking and NSI score calculation, which goes beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no filler: output definition, when to call it, and why it matters. The most actionable guidance is front-loaded, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool with an output schema present, the description is complete. It explains the return content, the grouping, the practical invocation timing, and the downstream benefit, leaving no obvious gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics burden on the description. The baseline is 4, and the description appropriately focuses on the return value and usage context rather than inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a precise resource ('all canonical exercise names from the exercise library'), and an organizing detail ('grouped by muscle group'). It clearly distinguishes this tool from sibling list_* tools by focusing on the canonical exercise library rather than logs, meals, or metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call this before log_workout or update_workout to match user-described exercise names to canonical ones. This provides clear contextual guidance, though it does not explicitly discuss when not to use it or name alternatives as exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_goalsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_capabilitiesNoAppend the supported goal types and their inputs. Default false. Only set this when the user is asking what kinds of goals the app supports.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds meaningful behavioral context beyond that: it explains that include_capabilities=true appends a 'full catalog' that is 'large', informing the agent of an output-size tradeoff. It also clarifies that write tools resolve current goals themselves, preventing unnecessary calls. Minor gaps remain (e.g., pagination or exact response shape), but the output schema exists to cover structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: the first states purpose and output, the second gives usage triggers, and the third covers negative usage and the parameter caveat. It is front-loaded with the core purpose and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only tool with a full output schema and comprehensive annotations, the description covers everything an agent needs: when to use, what it returns, when to pass the parameter, and when not to use it. No critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by tying include_capabilities to a specific user intent ('what kinds of goals Wellness Project supports') and explicitly warning that the appended catalog is 'large'. This helps the agent decide when to set the flag, which is more actionable than the schema's generic phrasing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Analyze or show the user's current and past goals'), names the resource ('user's goals'), and enumerates the exact return categories: active/paused formal goals, completed/historical formal goals, and current standard targets. It also implicitly distinguishes itself from sibling write tools by noting it should not be used to fetch an ID for create_goal or update_goal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage conditions are provided: use when the user asks about their goals or wants a review/analysis. The description also gives a clear when-not-to-use rule ('Do not call this tool merely to obtain an ID before create_goal or update_goal') and a precise condition for setting include_capabilities. This fully routes an agent to the correct tool and parameter choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_hydrationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format. Default today.
start_dateNoStart date in YYYY-MM-DD format. Default 6 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description only needs to add extra context. It adds meaningful behavioral details: maximum range of 31 days, defaulting to the last 7 days, and the Settings prerequisite. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences cover purpose, usage trigger, prerequisite, range, and defaults with no filler. The most important scoping information is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only two-parameter list tool with an output schema, the description is complete: it states what is returned, when to use it, the prerequisite, the allowed range, and the default behavior. Nothing needed for correct invocation or selection is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already describes both parameters and their defaults. The description adds value by stating the maximum range (31 days) and the default window (last 7 days), which helps an agent validate input without opening the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Review') with a clear resource ('hydration events and stored effective hydration totals'), and the hydration domain distinguishes it from the many list_* siblings. It states exactly what the tool returns without relying on the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use when the user explicitly asks about hydration history or fluid intake' and adds a prerequisite ('Hydration tracking must already be enabled in Settings'). It does not name an alternative tool, but no direct hydration-list sibling exists, so the guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_injuriesA
Read-onlyIdempotent
Inspect

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:

  • status: default to showing Active and Monitoring; use 'all' to include Resolved; use 'Resolved' for history only.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by status. Default: Active + Monitoring.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate safety. It adds valuable behavioral context beyond the schema: the default filter combines Active and Monitoring, the meaning of 'all' versus 'Resolved', and an explicit instruction to infer rather than ask.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear usage section and a compact INFER block. The only minor flaw is slight redundancy between the sentence 'Defaults to active and monitoring injuries' and the INFER line restating the same default, but the overall size is appropriate and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter, an existing output schema, and strong annotations, the description covers everything an agent needs: what it returns, when to use it, how to handle the status filter, and how it relates to sibling mutation tools. No important operational gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the status filter, so the baseline is 3. The description adds extra semantic value by specifying the default behavior, the exact meaning of each enum option, and an INFER directive that helps the agent invoke the tool without unnecessary clarification.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('List injuries from the injury log') and clearly distinguishes the tool's purpose from update_injury and delete_injury by explaining that those can resolve injuries without a prior lookup. It also enumerates concrete use cases: reviewing the log, answering history/rehab questions, and retrieving an id after ambiguous matches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool (review, answer history/rehab questions, get an id after ambiguous matches) and when it is not required (before update_injury/delete_injury). It also gives direct guidance on the status filter values, making the decision boundary clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_lab_markersA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds useful behavioral context: it returns canonical library data, includes aliases for matching, and supports canonicalization. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The primary return value is front-loaded, the output fields are enumerated compactly, and the usage directive follows naturally. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no parameters, has an output schema, and is fully annotated as read-only and idempotent. The description adds the only missing context: what the data represents, what fields are returned, and how it should be used in the logging workflow. Nothing essential is left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so there is no parameter burden for the description to carry. The description instead clarifies the semantic meaning of the returned canonical marker set, which is more valuable here. Baseline 4 is appropriate for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Returns'), a specific resource ('LOINC-coded markers in the reference library'), and enumerates the returned fields. It clearly distinguishes itself from list_lab_results, which is about logged lab results rather than the reference marker library.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to call this BEFORE log_lab_results, gives the matching purpose, references the analogous list_exercises pattern, and explains why it matters ('prevents name drift and ensures trending works'). This is strong when-to-use guidance with a concrete alternative pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_lab_resultsA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 365 days ago (labs are infrequent)

  • end_date: default to today

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
panel_nameNoOptional — filter to a specific panel (e.g. "Lipid Panel").
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 365 days ago.
marker_nameNoOptional — filter to a specific marker (e.g. "LDL Cholesterol").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond those annotations: the tool returns IDs, defaults start_date to 365 days ago, end_date to today, and clarifies that update/delete can resolve results independently. It does not describe every output detail, but an output schema exists, so this is not a major gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. Each subsequent sentence adds distinct value: sibling relationship, use cases, filtering, and inference defaults. There is no filler or repetition of schema fields, and the formatting makes the INFER instructions easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (0 required parameters, 4 optional well-documented parameters, no nested objects, and an output schema), the description covers all important context. It explains when the tool is needed, when it is not needed, what IDs are for, and how defaults should be inferred. Nothing essential is missing for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter already documented with format, defaults, and optionality. The description adds value by instructing the agent to 'INFER — do not ask' the defaults and by explaining why start_date defaults to 365 days ago ('labs are infrequent'). This goes beyond the schema and gives practical guidance for parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List lab/biomarker results within a date range, including each result's ID.' It clearly distinguishes itself from related siblings like list_lab_markers, update_lab_result, and delete_lab_result by focusing on historical review and ID retrieval. No ambiguity remains about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: to review lab history, answer trend questions, or get an ID after ambiguous update/delete matches. It also explicitly says this tool is 'no longer required' before update_lab_result or delete_lab_result, giving clear exclusion criteria. The INFER defaults further guide autonomous invocation without asking the user.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mealsA
Read-onlyIdempotent
Inspect

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:

  • date: default to today

  • end_date: if the user asks about a week or range, set end_date to cover the full period (e.g. "this week" → date=Monday, end_date=today; "last 7 days" → date=7 days ago, end_date=today). For a single day, omit end_date.

ROUTING: Exact rows/IDs/ranges: list_meals. One-day visual diary: show_meal_diary. Multi-day macro trend: show_week_macros.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoStart date (or the single date if no range). Format: YYYY-MM-DD. Optional — omit for today (resolved in the user's own timezone).
end_dateNoEnd date for a range query. Format: YYYY-MM-DD. Optional — omit for a single-day lookup.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, and non-destructive. The description adds meaningful behavioral constraints beyond annotations: the 31-day maximum range per call and the parameter inference rules (default today, end_date logic for week/range queries). This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections and bullets, but it contains some redundancy (e.g., the note about update_meal/delete_meal resolving appears twice in slightly different forms). It is still efficient overall and not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description doesn't need to enumerate all return fields, but it still mentions key outputs (meal ID, date, type, food description, macros). It covers purpose, parameters, usage, routing, and constraints, providing everything an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (date and end_date) are fully described with format (YYYY-MM-DD), optionality, and specific semantics (start vs. single date, end of range). The description also explains default behavior and inference rules, making both parameters unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists meals logged for a date or range, with a specific verb ('List'), resource ('meals'), and scope (date/range). It also distinguishes it from siblings like show_meal_diary and show_week_macros via the ROUTING section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: answering 'what did I eat today/this week/yesterday?', reviewing logged meals, and retrieving an ID after an ambiguous update/delete match. It also explains when it is not required (update_meal/delete_meal can resolve on their own) and how to handle longer periods with multiple calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_personal_contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful behavioral context by specifying that only 'active' memories are returned and by describing the type of content stored, which helps the agent set expectations beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: it states the core action and resource first, gives illustrative examples, then provides usage context. Every sentence adds value and there is no redundancy beyond the harmless 'Read-only' confirmation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only tool with an output schema and annotations covering safety, the description fully covers purpose, scope, content type, and when to invoke it. Nothing essential is missing for an agent to select and call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is trivially complete at 100% coverage. With no parameters to document, the description's focus on the returned content and usage context is appropriate. The baseline for zero-parameter tools is 4, and the description earns it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List'), a specific resource ('the user's active Personal Context memories'), and includes concrete examples. It clearly distinguishes this tool from the sibling add_or_update_personal_context and from other list tools by focusing on durable remembered preferences and circumstances.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use: when the user asks what has been remembered about them, or before proposing a new memory to check for existing coverage. This gives clear practical guidance and implicitly routes the agent to add_or_update_personal_context when no existing memory covers the subject.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recovery_sessionsA
Read-onlyIdempotent
Inspect

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:

  • start_date / end_date: default to the last 30 days. Widen the range yourself for an older lookup instead of asking the user for exact dates.

  • category: omit to return every category.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOptional — max sessions to return. Default 50, max 200.
categoryNoOptional — filter to one category. Omit to return every category.
end_dateNoEnd of date range. Format: YYYY-MM-DD. Optional — defaults to today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Optional — defaults to 30 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, destructiveHint, and idempotentHint, and the description does not contradict them. It adds meaningful behavioral context such as the 90-day maximum range, the need for sequential calls to cover longer periods, and the 'INFER — do not ask' directive, which helps the agent behave correctly. It does not explicitly mention output format or error behavior, but with an output schema present that is less critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but well-organized: it starts with the primary purpose, then contrasts with a sibling, and finally gives usage and inference rules. While it could be trimmed, the added detail on multi-call traversal and inference rules is necessary for correct usage, so the structure is appropriate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple optional parameters, inference rules, range limitations, and a sibling that is easily confused), the description covers all necessary context: it identifies when to use it, how to handle date ranges, how to distinguish from list_recovery_strategies, and how to handle long histories. No critical information is missing for an agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides descriptions for all four parameters, and the description enriches them further: it explains default values for start_date/end_date, that omitting category returns all categories, and the limit's default/maximum. This goes beyond the schema and gives the agent full understanding of each parameter's meaning and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List', the resource 'logged recovery sessions', and the scope 'within a date range, each with its ID'. It also explicitly contrasts with the sibling tool list_recovery_strategies to remove ambiguity, so an agent immediately knows what this tool does and how it differs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage scenarios ('answer what recovery sessions have I logged', audit/spot-check, get an id after ambiguous match) and gives concrete inference rules for parameters (default date range, category omission). It also tells the agent when to make multiple calls for longer histories, making the usage guidance highly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recovery_strategiesA
Read-onlyIdempotent
Inspect

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:

  • filter: default to 'active'; use 'all' for history; use 'historical' for ended strategies only.

Returns each strategy's id, name, category, schedule, start_date, and end_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoWhich strategies to return. Default: 'active'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly/idempotent/non-destructive behavior. The description builds on that by explaining the INFER behavior ('do not ask'), the default filter, and what fields are returned. This adds useful operational context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, use cases second, then a clearly marked INFER block with parameter guidance, and finally a one-line return convention. Every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only list tool with annotations and an output schema, the description covers usage, filter semantics, inference behavior, and return fields. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds meaning not present in the schema: 'use 'all' for history; use 'historical' for ended strategies only.' This disambiguates the enum values and gives the agent a rule for inferring the parameter without asking.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description begins with a specific verb and resource: 'List the user's recovery and mindfulness strategies.' It also gives concrete use cases ('user asks about recovery practices, mindfulness routines, or you need strategy IDs before logging a session'), which distinguishes it from related siblings like manage_recovery_strategy or list_recovery_sessions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: when the user asks about recovery practices, mindfulness routines, or needs strategy IDs before logging a session. It does not explicitly name alternatives or say when not to use it, so it earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_rest_daysA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 30 days ago

  • end_date: default to today

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 30 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context by stating the INFER rule: default start_date to 30 days ago and end_date to today without asking the user.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then usage conditions, then inference rules. No filler or redundant phrasing; every sentence contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with two optional, fully documented parameters, an output schema, and annotations covering safety, the description provides everything an agent needs: purpose, when to use, inference behavior, and range semantics. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters and their defaults. The description adds meaningful guidance beyond the schema by instructing the agent to infer defaults rather than ask, which changes invocation behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('dates a user has marked as rest days within a range'), clearly distinguishing it from sibling tools like log_rest_day and cancel_rest_day. The accompanying examples reinforce the exact purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when the user asks about their rest pattern' and gives two concrete example queries. It doesn't name alternatives or state exclusions, but the context is clear enough for an agent to route to this tool correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_runsA
Read-onlyIdempotent
Inspect

List runs within a date range, or return full saved detail for one run when run_id is provided. Range reads stay compact and return a Runner State summary first. A run_id read returns that run's stored splits and structured segments plus the detailed metrics Elias needs for interval analysis.

Maximum range: 92 days. Defaults to 7 days ago through today. For a longer span, make several calls covering consecutive windows.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idNoSpecific run UUID. When provided, returns the full saved run including splits and structured segments and ignores the date range.
end_dateNoEnd of date range. Format: YYYY-MM-DD. Optional. Defaults to today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Optional. Defaults to 7 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only, idempotent, and non-destructive, so the description is free to add behavioral value. It does: range reads 'stay compact and return a Runner State summary first,' run_id reads return 'stored splits and structured segments plus detailed metrics,' and the 92-day maximum with multi-call guidance is a meaningful constraint beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs front-load the primary distinction and then add behavioral and constraint details. Every sentence earns its place: the mode split, the output differences, the defaults, and the multiple-call instruction. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With three optional parameters, 100% schema coverage, an output schema, and full annotation coverage, the description fills the remaining gaps: output shape per mode, maximum range, defaults, and how to handle spans longer than 92 days. Nothing an agent needs to invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all three parameters with formats and defaults, so baseline is 3. The description adds the 92-day maximum range and clarifies the distinction between compact range output and detailed run_id output, reinforcing parameter behavior beyond the schema without repeating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List runs within a date range, or return full saved detail for one run when run_id is provided.' This clearly distinguishes the two modes of operation and their triggers, so an agent knows exactly what the tool does and when each mode applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: date-range reads return a compact summary, run_id reads return split and segment detail, and long spans require multiple calls covering consecutive windows. It does not explicitly name alternatives like show_runs, so sibling differentiation is left to inference, but the usage conditions themselves are concrete and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sleepA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 14 days ago

  • end_date: default to today

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 14 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already provide readOnlyHint and destructiveHint, and the description adds transparency about the returned data fields (duration, score, stage breakdown) and the nature of the entries. There is no contradiction; the description supplements the annotation adequately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet information-dense, covering purpose, scope, parameters, defaults, limits, and exclusions in a clear, structured format without superfluous wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All necessary details for correct usage are present: the data returned, the date range constraints, the default behavior, and the exclusion of naps. Given the tool's simplicity, the description is fully complete and leaves no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are explained with format and default values in the description, adding guidance on the 31-day limit and the inference of defaults, which goes beyond the schema's basic descriptions. This is particularly valuable given the schema only lists field names and descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The verb 'List' clearly specifies the action, the resource 'sleep log entries' is unambiguous, and the scope (date range) is defined. It also implicitly differentiates from logging a new sleep entry via the sibling tool 'log_sleep'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the maximum range of 31 days and instructs to make multiple calls for longer periods. It also clarifies the default values for start_date and end_date, and notes that daytime naps are excluded, providing clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_supplementsA
Read-onlyIdempotent
Inspect

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:

  • filter: default to 'active' (current items); use 'all' if the user asks about history or a specific past period; use 'historical' for ended items only.

  • category: omit to return both medications and supplements; set to 'medication' or 'supplement' to filter by type.

Returns each item's id, category, name, brand, dose, schedule, start_date, and end_date.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoWhich items to return. Default: 'active'.
categoryNoFilter by category. Omit for both.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds useful behavioral context: default filtering behavior, how to request history, and the full list of returned fields. This goes beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose, followed by concise parameter inference guidance and a clear list of return fields. Every sentence adds value, and the use of labeled sections ('INFER — do not ask') makes it easy for an agent to parse. Nothing feels redundant or wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with two optional enum parameters and an output schema, the description is complete. It covers when to use the tool, what each parameter means, how to handle ambiguous matches, and what fields are returned. There is no missing information an agent would need to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema covers both parameters 100%, the description adds significant extra meaning. It defines the inference rules, explains the default 'active' filter, clarifies when to use 'all' vs 'historical', and specifies that omitting category returns both types. This is exactly the kind of parameter guidance that helps an agent choose values correctly without asking the user.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the user's medications and supplements.' It clearly distinguishes itself from the sibling manage_supplement by explaining that list_supplements is for reviewing what the user takes, not for managing individual items. This lets an agent immediately know what the tool does and how it differs from related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: when the user asks what medications/supplements they're taking, asks to review their stack, or needs an id after an ambiguous manage_supplement match. It also explains that manage_supplement can resolve items on its own, so list_supplements is not a required prerequisite. This is strong, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_wearable_dataA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 14 days ago

  • end_date: default to today

ROUTING: Exact daily values: list_wearable_data. Broad visual: show_health_overview. RHR/HRV: show_recovery. Steps: show_week_steps.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 14 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only and idempotent, and the description adds meaningful behavioral context: the 31-day maximum, sequential date-range calls, Zone Minutes scoring details, and the explicit rule that derived resting calories are 'labelled an estimate, never shown as measured.' It also explains how TDEE method or missing profile fields are surfaced. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly structured: opening scope, expansion of ambiguous metric semantics, operational limit, inference defaults, and routing rules. Each section adds information an agent needs, and the key verb/resource is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and annotations cover safety, the description covers everything needed to call correctly: metric coverage, date-range limits, batching, estimation caveats, default inference, and sibling routing. No critical behavioral or usage element is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents both parameters with defaults and formats, the description adds the actionable instruction 'INFER — do not ask', the default values, and the operational constraint that maximum range is 31 days per call with sequential calls for longer periods. This goes beyond the schema's structured parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List daily wearable data' within a date range, and enumerates the exact metrics covered. The ROUTING section further distinguishes it from show_health_overview, show_recovery, and show_week_steps, so an agent can tell siblings apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit routing ('Exact daily values: list_wearable_data. Broad visual: show_health_overview. RHR/HRV: show_recovery. Steps: show_week_steps') and a 31-day call batching rule. However, the earlier 'Use when the user asks about ... HRV trends' is not fully reconciled with the ROUTING line that sends RHR/HRV to show_recovery, creating a minor ambiguity for that query type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_wellbeingA
Read-onlyIdempotent
Inspect

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:

  • start_date: default to 14 days ago

  • end_date: default to today

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Default: today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Default: 14 days ago.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as read-only, idempotent, and non-destructive; the description adds further transparency by explaining that the tool is not a prerequisite for update/delete operations and that it returns ids useful for resolving ambiguous matches. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence contributes: the main purpose, the relationship to update/delete, the 31-day limit, and the parameter defaults. No redundant or filler content; the structure flows logically from what the tool does to how to use it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the two optional parameters and the presence of an output schema (mentioned in context), the description provides sufficient context for an agent to call the tool correctly. It covers parameter defaults, usage scenarios, and operational limits, so no missing information would cause incorrect invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully describes both parameters with types and defaults, and the description reinforces their behavior ('INFER — do not ask' with default values), clarifying that the agent should infer these rather than prompt the user. This adds semantic value beyond the schema's basic metadata.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action ('List wellbeing log entries') and the resource, with explicit scope ('within a date range'). It distinguishes itself from sibling tools by noting that update_wellbeing and delete_wellbeing can resolve entries on their own, making list_wellbeing specific to trend queries and id retrieval after ambiguous matches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: for trends over time or getting an id after an ambiguous match, and explicitly states it is not required before update/delete. Also gives operational constraints (maximum 31 days per call) and default parameter values, leaving no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_workoutsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd of date range. Format: YYYY-MM-DD. Optional — defaults to today.
start_dateNoStart of date range. Format: YYYY-MM-DD. Optional — defaults to 7 days ago.
saved_workoutsNoWhen true, list reusable Saved Workouts instead of completed workout sessions. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description reveals important runtime behaviors: default date range, 90-day maximum range, the need to chain calls for older periods, and the effect of the saved_workouts flag. This adds meaningful context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is slightly long but well-organized with labeled sections (SAVED WORKOUTS, INFER) and each sentence adds value. It front-loads the core function and usage examples before diving into edge cases, though a bit of trimming could improve conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the three optional parameters and the tool's role in a broad ecosystem, the description covers all necessary aspects: default dates, range limitations, chaining strategy, saved workout mode, and the output fields. Users have enough context to call it correctly without referencing external docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover all three parameters, but the tool description enriches them further by specifying defaults (start_date = 7 days ago, end_date = today), the meaning of saved_workouts, and instructions to widen the range up to 90 days. This goes well beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: listing workout sessions with specific attributes (ID, date, focus, location, NSI rating). It also gives concrete usage examples and distinguishes between completed workouts and saved workouts, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use it: before get_workout to find a session ID, for answering trend questions, and how to handle older data via chaining. It also clarifies the saved_workouts flag to switch modes, which helps select the right tool among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_body_metricsAInspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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:

  • date: default to today; infer from context ("this morning", "yesterday")

  • derived fields (lean_mass_lb, fat_mass_lb): calculate from weight and body fat % if possible — lean = weight × (1 - bf%/100), fat = weight × bf%/100

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate of the measurement. Format: YYYY-MM-DD. Default to today.
notesNoAny context worth noting (e.g. "post-workout", "morning fasted").
hips_inNoHip circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
chest_inNoChest circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
waist_inNoWaist circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
calf_l_inNoLeft calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
calf_r_inNoRight calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
weight_lbNoBody weight in pounds, between 50 and 700. Convert from kilograms if the user spoke in kg (kg x 2.2046). In lb, or kg with input_weight_unit set. See UNIT INPUTS.
bicep_l_inNoLeft bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
bicep_r_inNoRight bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
thigh_l_inNoLeft thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
thigh_r_inNoRight thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.
fat_mass_lbNoFat mass. Calculate from weight and body fat % if not explicitly stated. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
protein_pctNoProtein percentage (0-100).
body_fat_pctNoBody fat percentage (0-100).
bone_mass_lbNoBone mass. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
lean_mass_lbNoLean (non-fat) mass. Calculate from weight and body fat % if not explicitly stated. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
hydration_pctNoBody water/hydration percentage.
muscle_mass_lbNoSkeletal muscle mass. Skeletal muscle tissue specifically, NOT lean_mass_lb, which is total non-fat mass including water, organs and bone. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
input_length_unitNoSet to cm when the user gave cm for the _in fields in this object. Omit when they are already in.
input_weight_unitNoSet to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb.
skeletal_muscle_pctNoSkeletal muscle percentage (0-100).
visceral_fat_ratingNoVisceral fat rating (scale varies by device, typically 1-59).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description contains rich behavioral disclosure: unit conversion companion fields, derived lean/fat mass calculation, optional fields, proactive data collection, and upsert behavior. However, annotations declare idempotentHint false, while the description explicitly says 'Calling this tool twice on the same date updates the existing entry (upsert)' — an idempotent upsert behavior that contradicts the annotation. Per the rubric, description contradicting annotations must score 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but very well structured: UNIT INPUTS, PROACTIVE DATA COLLECTION, INFER, and exclusion rules are all labeled and front-loaded. Vital unit-handling rules appear first because getting them wrong corrupts stored data. Every block earns its place, and the layout makes the dense content scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 23-parameter tool with unit pitfalls, derivation logic, and upsert semantics, the description is nearly exhaustive. It covers when to use the tool, how to infer dates, how to handle all supported unit cases, which fields to derive, which fields are optional, how duplicate calls behave, and what not to log. The output schema exists, so omitting return-value explanation is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description adds a great deal of added meaning: exact rules for passing numbers unconverted and setting companion unit fields, formulas for lean_mass_lb and fat_mass_lb, the distinction between muscle_mass_lb and lean_mass_lb, and the clarification that *_in fields are manual tape measurements while *_pct fields are percentages. This is substantive semantic guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action on a specific resource: 'Log or update body composition metrics for a given date.' It names the exact trigger condition with concrete examples like weight, body fat percentage, typed manual input, copy-pasted scale output, or scale-display photos. This makes it clearly distinguishable from sibling read tools like list_body_metrics and show_body_composition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly says when to use the tool: whenever the user shares body composition data. It also gives exclusions such as 'BMI is not a field here... never ask the user for BMI, and never try to log it' and gives proactive collection guidance. It does not explicitly name alternative sibling tools or explicit when-not conditions relative to list_body_metrics/show_body_composition, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_cycleAInspect

Log a period to the user's cycle log. Handles all cases:

  • Starting a period today: "my period started today"

  • Backfilling a past period: "my period started May 3rd and ended May 8th"

  • Resuming a period ended today: "actually I'm still on my period" — detects that today's period was marked ended and reopens it

  • Logging just a start with no end yet: "I just got my period"

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:

  • started_on: default to today for current-period statements

  • ended_on: omit unless the user says it ended; infer from context ("5-day period starting May 3" → ended_on May 7)

Do NOT use this tool to log future dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
ended_onNoPeriod end date. Format: YYYY-MM-DD. Omit if period is still active.
started_onYesPeriod start date. Format: YYYY-MM-DD. Required.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses meaningful behavior: it can reopen a period that was marked ended, it infers started_on and ended_on instead of asking, and it requires a consent/tracking check before logging. No statement contradicts the provided annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear top-line definition, a bulleted list of cases, a prerequisite warning, and an inference section. Every sentence carries information an agent needs; nothing is filler or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers edge cases, prerequisites, inference rules, and forbidden usage. An output schema exists, so the description does not need to explain return values. For a tool that logs cycle data with inference and consent requirements, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

While the schema already documents both parameters at 100% coverage, the description adds crucial semantics: started_on defaults to today for current-period statements, ended_on should be omitted unless explicitly stated, and both dates can be inferred from context. This goes well beyond the schema's basic format descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource, 'Log a period to the user's cycle log', and then enumerates the distinct real-world utterances it handles. This makes the tool's scope unmistakable and clearly separates it from siblings like list_cycle, update_cycle, and delete_cycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit applicability through concrete examples, a prerequisite check for cycle tracking, and an explicit exclusion: 'Do NOT use this tool to log future dates.' It does not explicitly route users to update_cycle for modifications, but for a logging action the guidance is strong and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_injuryAInspect

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:

  • start_date: default to today

  • severity: estimate from description (minor twinge=2-3, moderate pain=5-6, severe/acute=8-9)

  • status: default to 'Active' for new injuries

  • affected_movements: infer from body part and injury type (e.g. shoulder strain → pressing, overhead)

  • side: infer from description if mentioned (e.g. "right shoulder" → Right)

ASK only if body_part is entirely unclear.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideNoSide of body. Optional — infer from description.
notesNoAdditional context about how injury occurred, symptoms, etc. Optional.
statusNoStatus. Default: 'Active'. Auto-set to 'Resolved' if end_date is provided.
end_dateNoDate injury resolved. Format: YYYY-MM-DD. Default: null (ongoing). Set when injury is fully resolved.
severityYesSeverity 1-10 (1=minor, 10=severe). Required — estimate from description.
body_partYesBody part affected (e.g. 'Shoulder', 'Lower Back', 'Knee'). Required.
start_dateNoDate injury started. Format: YYYY-MM-DD. Default: today.
injury_typeYesType of injury (e.g. 'Strain', 'Tendonitis', 'Sprain', 'Disc', 'Soreness', 'Acute'). Required — infer from description.
affected_movementsNoMovements affected (e.g. ['Pressing', 'Overhead', 'Bench Press']). Infer from body part.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the annotations: injuries are date ranges that stay open until end_date is set, many fields should be inferred rather than asked, and only body_part warrants a clarifying question. The annotations correctly indicate a write operation with readOnlyHint=false, so there is no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose, trigger conditions, domain model, then a scannable INFER list. Every sentence earns its place, and there is no redundancy with the schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter create tool, the description covers when to call, what to infer, what to ask, and the date-range semantics. Since an output schema exists and schema coverage is 100%, no critical information is missing for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful extra value with numeric severity anchors (minor twinge=2-3, moderate pain=5-6, severe/acute=8-9), an example for affected_movements, and a clear policy to ask only when body_part is unclear. This is above baseline but not maximal because the schema already carries much of the parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Log a new injury or aggravation.' It also lists concrete user signals like 'getting hurt, feeling pain, straining something' that trigger this tool. The word 'new' distinguishes it from sibling tools like update_injury and delete_injury.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use the tool: when the user mentions getting hurt, feeling pain, straining, or describes an injury. It doesn't explicitly state when not to use it, such as 'if the injury already exists, use update_injury instead,' but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_lab_resultsAInspect

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).

FASTING: fasting_status is only 'fasting' or 'non_fasting' when the user explicitly states it ("I fasted for this", "hadn't eaten"). Never infer it from time of day, a meal mention in notes, or the draw being in the morning — omit the field (leaves it unknown) whenever it wasn't stated. report_date (when the lab reported results, if given separately from the collection date) and draw_id (only when the user is adding a marker to a draw already logged in this conversation) are also optional, omit otherwise.

Submit all markers from a single lab visit in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
resultsYesArray of individual lab marker results. Required — submit all markers from the visit in a single call.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the mutation profile is known. The description adds valuable behavioral context: it mandates a required workflow (list_lab_markers first), specifies inference rules (date, panel_name, flag, ref_range, lab_name), and clarifies fasting_status handling with explicit never-infer rules. It also states that all markers from a single visit should be submitted in one call. This goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: purpose, glucose routing, required workflow, prompting, inference rules, fasting rules, and batching instruction. It is well-structured with clear section headers (GLUCOSE ROUTING, REQUIRED WORKFLOW, INFER, FASTING) and front-loads the core purpose. It could be slightly tighter, but the density of actionable guidance justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one array parameter and a rich nested schema, the description covers all the operational context an agent needs: when to use it, how to prepare canonical names, what to infer, what to ask, and how to batch. The output schema exists, so return values don't need explanation. The only minor gap is that it doesn't describe what the response looks like, but the output schema covers that. This is complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds significant meaning beyond the schema: it explains the canonical marker_name/loinc_code workflow, defines when to omit loinc_code, clarifies fasting_status semantics (only 'fasting'/'non_fasting' when explicitly stated, omit otherwise), and explains draw_id usage. It also clarifies that report_date and draw_id are optional and when to include them. This is meaningful added value over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Log one or more blood test or biomarker results.' It then immediately distinguishes itself from log_wearable by routing finger-stick/CGM/home meter glucose to that sibling. This is a clear, specific purpose statement that differentiates the tool from its closest alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: use for lab/blood-draw results, and explicitly excludes finger-stick, CGM, home meter, wearable, Apple Health, and Health Connect glucose, directing those to log_wearable. It also specifies the required workflow (call list_lab_markers first) and the prompt to use when the user hasn't shared results yet. This is exemplary usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_mealAInspect

Log a meal to the user's food diary. Use when the user mentions eating, describes a meal, or asks to log food.

INFER:

  • date: today, or from context ("yesterday", "last night")

  • meal_type: canonical time mapping (00-05 Snack, 05-10 Breakfast, 10-14 Lunch, 14-17 Snack, 17-22 Dinner, 22-24 Snack); context overrides ("post-workout shake"=Post-Workout)

MACRO SOURCE: strongest evidence wins. Never replace known stored macros with a fresh estimate.

  1. REPEATS: if the user refers to a previously logged item ("same", "another", "more", "again", or equivalent in any language), call list_meals for the referenced date/range first. If one row unambiguously matches, reuse its stored calories/protein_g/fat_g/carbs_g/alcohol_g and scale by the quantity ratio when the row's quantity is known. If the match or quantity is ambiguous, ask instead of re-estimating. If nothing matches, continue below.

  2. SAVED RECIPES: pass recipe_name whenever the food phrase plausibly names one of the user's saved recipes (see the profile's "Saved recipes" list) -- not only when the user literally says "saved" or "usual"; a bare "morning coffee" should try recipe_name if "Morning Coffee" is one of theirs. A resolved recipe is a default for THIS meal, not a binding rule: it supplies stored food and macros, and any detail the user states this turn (e.g. "black" instead of the recipe's usual cream) overrides just that field the normal way, via the matching explicit argument. The recipe itself changes only through the Recipes page, never as a side effect of log_meal. Relay no-match/ambiguous errors instead of guessing. If the recipe reports missing macros, estimate only those fields and retry. If food_items adds food beyond the recipe, pass all four macros as the combined total.

  3. BRAND NAMES: for a branded, restaurant, or specific product, use published macros for the stated size/variant before a generic estimate.

  4. Otherwise estimate calories, protein_g, fat_g, carbs_g from the food description. Never ask the user for macros.

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.

SATURATED FAT / FIBER: saturated_fat_g and fiber_g are optional, unlike the four core macros. Populate them only when you have real evidence (a Nutrition Facts label, a well-known packaged product, or a food you can confidently estimate the composition of) -- never guess just to fill the field, and never send a value equal to fat_g (saturated fat is always a subset of total fat, not the whole of it, except literally pure fats like butter or coconut oil). Omit both entirely when unsure; they are never asked for and never inferred as 0.

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.

CAFFEINE / DRINKS: this is the single assistant write path for caffeine too. When the user consumed a drink and its volume is known or reasonably inferable, include it in fluids so hydration is recorded; if the drink is caffeinated, include caffeine in the same call too. Do not leave a known-volume drink only in food_items. Each caffeine item needs caffeine_mg and may optionally include source_type. The date comes from the intake date. Preserve exact user-provided milligrams; for vague coffee/tea/energy-drink/pre-workout descriptions, estimate caffeine with the same nutrition-estimation judgment used for meal macros. Never use separate hydration or caffeine write tools. A drink-only or caffeine-only intake may omit food_items/macros.

SAVE AS RECIPE: when the user explicitly asks to save the meal they are logging as a reusable recipe, set save_as_recipe=true in this same call. The recipe is copied from the final persisted meal after the log succeeds.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD. Omit for today (the server resolves it in the user's own timezone, more reliable than guessing). Send explicitly for any past date.
fat_gNoFat in grams. See MACROS above.
forceNoTrue only when the user has explicitly confirmed a separate entry despite a duplicate warning. Bypasses duplicate detection.
fluidsNoOptional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking.
carbs_gNoCarbohydrates in grams. See MACROS above.
fiber_gNoDietary fiber in grams. Optional. See SATURATED FAT / FIBER above.
caffeineNoOptional caffeine doses in this intake. Keep each dose simple: caffeine amount is required and type is optional. The dose date follows the intake/meal date. If the user gave exact milligrams, preserve them exactly; otherwise estimate from the described food or drink.
caloriesNoTotal calories (kcal). See MACROS above.
alcohol_gNoAlcohol in grams (not kcal). Only if alcoholic drinks were consumed; unset takes the saved recipe's value when recipe_name matches. 1 standard drink is about 14g.
meal_typeYesRequired. Infer from time of day or context, even when recipe_name is used (a saved recipe's own stored meal type never fills this in).
protein_gNoProtein in grams. See MACROS above.
food_itemsNoDescription of the food and drinks consumed. See MACROS above; ask the user only if completely absent and no recipe_name applies.
recipe_nameNoName or close phrase for one of the user's saved recipes, e.g. "protein oats", "chicken bowl", or "breakfast" for their saved Breakfast recipe. See SAVED RECIPES above.
save_as_recipeNoTrue only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.
saturated_fat_gNoSaturated fat in grams. Optional. See SATURATED FAT / FIBER above.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare it is a non-idempotent write (readOnlyHint=false, idempotentHint=false), but the description goes far beyond: duplicate detection and force=true retry semantics, the rule never to replace stored macros, recipe non-mutation, fasting-day collapse to a zero-macro "Fast day" Snack, and hydration/caffeine persistence behavior. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and trigger, then organized into clear headed sections, so structure is strong. It is long, and the DRINKS/HYDRATION and CAFFEINE/DRINKS sections partially restate each other (both repeat "single write path"), which is mild redundancy for an otherwise complex tool that justifies most of its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers all the decision logic an agent needs for a 15-parameter write tool: inference, macro sourcing, optional fields, duplicates, fasting, drinks/caffeine, and recipe saving. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: INFER rules for date and meal_type (with time-band mapping and context overrides), the macro-source priority (repeats > saved recipes > brands > estimate), saturated_fat_g/fiber_g evidence rules, and fluids/caffeine/alcohol semantics. Schema fields even defer back to these sections ("See MACROS above"), so the description carries essential semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Log a meal to the user's food diary") and immediately scopes the trigger condition. It also distinguishes itself from siblings by naming list_meals, update_meal, and the never-use separate hydration/caffeine write tools. An agent can identify this as the single write path for meal food.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ("user mentions eating, describes a meal, or asks to log food") plus when to route elsewhere: list_meals first for repeats, update_meal for adjusts, and explicit prohibition of separate hydration/caffeine tools. Covers when-not and alternatives, which is the top bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_recovery_sessionAInspect

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:

  • date: default to today

  • category: infer from the practice name

  • strategy_name: use the strategy name if linked, or the user's description

  • duration_minutes: infer if mentioned (omit for skipped sessions)

  • quality: only include if the user rates it (1-5 scale)

  • skipped: true when the user says they skipped, missed, or didn't do a session; false (default) for completed sessions

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate (YYYY-MM-DD). Default to today.
notesNoSession notes or reason for skipping. Optional.
qualityNoSubjective quality 1-5. Optional.
skippedNotrue if the session was skipped/missed. Default: false.
categoryYesCategory. Required.
strategy_idNoStrategy ID from list_recovery_strategies. Optional — omit for standalone sessions.
strategy_nameYesName of the practice. Required.
duration_minutesNoDuration in minutes. Optional — omit for skipped.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, it details real behavior: infer date/category/strategy_name instead of asking, omit duration_minutes for skipped sessions, include quality only when the user rates it, and map 'skipped/missed/didn't do' to skipped=true. These rules tell the agent exactly how the tool expects the call to be constructed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into a two-sentence purpose, a compact INFER bullet list, and a short workflow callout. There is no filler, and the highest-value guidance is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter write operation, it covers all major decision points: defaults, inference rules, skipped handling, strategy linking, and the standalone fallback. Optional fields like notes are already documented in the schema, and an output schema exists, so the description does not need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds inference semantics that the schema cannot express: category comes from the practice name, strategy_name comes from the linked strategy or user phrasing, and duration is omitted when skipped. This materially improves an agent's ability to fill the parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete action and resource: 'Log a completed or skipped recovery/mindfulness session,' and lists representative practices. It also carves out 'one-off standalone sessions not linked to a recurring strategy,' which separates this tool from strategy-management siblings and gives the agent a clear scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trigger is explicit ('Use when the user says they did or skipped...') and the preferred workflow names list_recovery_strategies and a standalone fallback, so the agent knows when to invoke it. It never states a when-not or names a sibling tool as the alternative, leaving some exclusion logic implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_rest_dayA
Idempotent
Inspect

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:

  • date: parse the user's reference. "today" = today, "yesterday" = today minus 1, "last Monday" = the most recent Monday before today, etc. Default to today when nothing is specified.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoThe date to mark as a rest day. Format: YYYY-MM-DD. Default: today.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, but the description adds meaningful behavioral context beyond that: it explains that repeated calls are a no-op returning the same confirmation, and that the tool suppresses workout-prompt nudges and treats the day as planned rather than skipped. This is useful behavioral disclosure, though the idempotence itself is already annotated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized into three purpose-driven chunks: what the tool does, how to interpret the date parameter, and idempotency behavior. Every sentence contributes actionable guidance, and the most important scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter tool with an output schema and strong annotations, this description is complete. It covers purpose, usage triggers, date inference, idempotency, behavioral effect, and how to undo the action. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single date parameter, including format and default. The description goes further by providing explicit natural-language inference rules and examples ('today' = today, 'yesterday' = today minus 1, 'last Monday' = most recent Monday before today) and instructing the agent to infer rather than ask. This adds real value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Mark a date as an intentional rest day.' It immediately distinguishes this tool from its siblings by explaining the effect (suppresses workout nudges, treats the day as planned rather than skipped) and contrasts it with cancel_rest_day.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use conditions with concrete examples: 'today is a rest day', 'I rested yesterday', and marking a past day after the fact. It also names the alternative, cancel_rest_day, for removal, so an agent can route correctly without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_runAInspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

RUNNING ONLY: use log_run only for running on foot. A bike/cycling ride, walk, or rowing session is not a run even when it has distance and duration. For those, use log_workout with focus_type Cycling, Walking, or Rowing plus the user's native distance field and duration_sec.

Create an editable running card. Use for a completed run OR a future run plan.

intent:

  • log (default): the run happened. date, distance_mi and duration_sec are required. This writes the completed run and returns a card marker for in-app editing.

  • plan: the run has NOT happened yet. Create a planned run card. Never put a future run in completed history.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rpeNoRPE 1-10. For a plan this is target RPE.
dateNoYYYY-MM-DD. Completed runs default to today when context allows; planned runs use the intended date when known.
notesNo
avg_hrNoAverage heart rate only when known.
intentYeslog = completed run; plan = future run. Elias uses plan for a workout the runner has not done yet.
splitsNoActual splits/laps only when supplied by the runner/source. Never invent.
surfaceNo
run_typeNoClassify only when the runner or workout structure supports it. Do not turn an unspecified wearable run into easy.
segmentsNoWorkout structure, e.g. warmup, 6x800m threshold, recovery, cooldown. This may describe a plan or what was actually performed.
pain_notesNoPain/discomfort exactly as the runner described it.
start_timeNoLocal HH:MM only when known.
avg_power_wNoAverage running power in watts only when known.
distance_miNoDistance. In mi, or km with input_distance_unit set. See UNIT INPUTS.
elapsed_secNoWall-clock elapsed time including pauses, only when known.
duration_secNoMoving/workout duration in seconds.
avg_cadence_spmNoAverage running cadence in steps/min only when known.
elevation_gain_mNoElevation gain in metres only when known.
perceived_effortNoPost-run check-in only.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds genuine behavior: the write returns 'a card marker for in-app editing,' the log/plan intent controls whether history is mutated, and 'Never invent sensor data or splits' constrains hallucination. It does not discuss permissions or overwrite semantics, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The bulk of the opening is a unit-convention block, much of it enumerating companion fields that this tool's schema doesn't have, so the actual purpose ('Create an editable running card') is buried. Every remaining sentence is useful, but the front-loading is misprioritized and the reused template block is wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described. The description covers the mutation intent, run-type classification, unit handling, and data-fidelity rules, which is everything an agent needs to call this 19-parameter tool correctly. No material gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 89% (baseline 3), but the description adds real meaning beyond the schema: the schema fields merely point to 'See UNIT INPUTS,' and the description is where the actual rule lives (pass numbers unconverted, set the companion unit field, omit when canonical). It also explains run_type classification and detail-preservation constraints. It loses a point for listing unit families (_lb, _in, _stated_g, _stated_ml) that do not exist in this schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create an editable running card') and explicitly scopes it ('completed run OR a future run plan'). It also differentiates itself from the sibling log_workout by excluding non-running sessions, so an agent can route between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and when-not-to-use: 'use log_run only for running on foot... A bike/cycling ride, walk, or rowing session is not a run... For those, use log_workout.' It also disambiguates intent (log vs plan) with the rule 'Never put a future run in completed history.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_sleepAInspect

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:

  • date: date the primary sleep session ended / wake date (night ending on this date); default to today

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate of the sleep entry (night ending on this date). Format: YYYY-MM-DD. Default to today.
bedtimeNoBedtime / primary sleep session start time. Format: ISO 8601 timestamp (e.g. 2026-08-16T22:47:00-04:00) or HH:MM wall-clock time. Optional.
wake_timeNoWake time / primary sleep session end time. Format: ISO 8601 timestamp (e.g. 2026-08-17T06:21:00-04:00) or HH:MM wall-clock time. Optional.
awakeningsNoNumber of times woken during the night. Optional.
sleep_scoreNoSleep quality score on a 0-100 scale (matches wearable scoring). For a 1-10 self-rating, multiply by 10 first. Optional.
total_hoursNoTotal sleep duration in hours (e.g. 7.5). Optional.
rem_sleep_hoursNoREM sleep in hours. Optional — include if the tracker reports it.
deep_sleep_hoursNoDeep/slow-wave sleep in hours. Optional — include if the tracker reports it.
light_sleep_hoursNoLight sleep in hours. Optional — include if the tracker reports it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description surfaces behaviors not visible from annotations: repeated calls on the same date upsert rather than duplicate, entries are always tagged manual, and wearable-provider sources are reserved for auto-sync. It also discloses the proactive questioning behavior. These details match the write-oriented annotations and add real operational transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into labeled sections, each earning its place: core purpose, proactive collection, inference rule, subset/upsert behavior, and manual tagging. There is no redundant or filler content, and critical scoping information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter write tool with many optional fields, the description answers the key operational questions: when to call it, what to ask if data is missing, how to compute date, whether partial data is allowed, what happens on duplicate calls, and how entries are tagged. An output schema also exists, so the description does not need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already defines each parameter. The description adds valuable semantics by clarifying that date refers to the wake date (night ending on that date), defaults to today, allows any subset of fields, and that a second call on the same date updates the existing row. This goes beyond the schema's per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair, 'Log a sleep entry', and lists the exact data types accepted (duration, score, stage breakdown, bedtime, wake time) and the sources (Fitbit, Oura, Whoop, Apple Health, manual recall). It clearly distinguishes this write tool from read siblings like list_sleep and show_sleep_detail, and separates manual entry from wearable auto-sync behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use when the user shares sleep data...' gives an explicit triggering condition. Proactive data collection instructions specify what to ask when the user wants to log but has no numbers, and the 'INFER — do not ask' section prevents unnecessary clarification. It does not explicitly name sibling alternatives for when to use something else, but the manual-vs-auto-sync note provides a meaningful exclusion rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_supplement_takenAInspect

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:

  • date: default to today

  • taken: default to true (marking as taken)

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDate (YYYY-MM-DD). Default to today.
notesNoOptional note for this check-in.
takenNotrue = taken, false = missed. Default: true.
supplement_idNoSupplement ID. Alternative to supplement_name.
supplement_nameNoAlternative to supplement_id: name substring, case-insensitive (e.g. "magnesium").

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal mutation (readOnlyHint=false). The description adds meaningful behavior beyond that: it documents inference defaults (date=today, taken=true), the requirement that exactly one selector be provided, and the error behavior when supplement_name matches multiple items. This is valuable context for invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized. Purpose, usage condition, inference rules, and selector requirements are each given their own section with no redundant or filler content. Every sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity, the 100% schema coverage, the presence of an output schema, and annotations covering mutation safety, the description is complete. It covers prerequisites, defaults, selector resolution, and failure behavior, so an agent can invoke it correctly without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds important semantics beyond the schema: the exact-one-required relationship between supplement_id and supplement_name, the inference rules, and the multiple-match error behavior. This compensates well for the schema's lack of required-parameter enforcement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Mark a medication or supplement as taken or not taken for a specific date.' This clearly distinguishes it from sibling tools like list_supplements or manage_supplement, and the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use the tool: 'Use when the user says they took (or missed) a medication or supplement on a particular day.' It also notes the daily tracking mode prerequisite. It does not explicitly name alternatives or state when not to use it, but the guidance is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_wearableAInspect

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate for the entry. Format: YYYY-MM-DD. Default to today.
resting_hrNoResting heart rate in BPM. Optional.
step_countNoSupplemental steps NOT captured by any connected wearable. ADDITIVE — adds to device data, never replaces it. Only use when user explicitly says their device missed these steps.
hrv_morningNoMorning HRV in milliseconds (RMSSD or similar). Optional.
skin_temp_cNoSkin temperature in °C. Manual/home/device reading. Optional.
spo2_avg_pctNoSpO₂ in %. Manual/home/device reading. Optional.
stress_scoreNoStress score (0–100 scale). Optional.
vo2max_estimateNoVO2max estimate (ml/kg/min). Optional.
core_body_temp_cNoCore temperature in °C. Manual/home/device reading. Optional.
dietary_caloriesNoDietary energy / calories eaten for the day in kcal, imported from a connected health app (Apple Health / Health Connect). Optional.
systolic_bp_mm_hgNoSystolic blood pressure in mmHg. Provide with diastolic_bp_mm_hg. Manual/home/device reading. Optional.
diastolic_bp_mm_hgNoDiastolic blood pressure in mmHg. Provide with systolic_bp_mm_hg. Manual/home/device reading. Optional.
blood_glucose_mg_dlNoBlood glucose in mg/dL. Manual/home/device reading. Optional.
active_zone_min_peakNoZone Minutes (also called Active Zone Minutes by Fitbit, Heart Points by Google Fit) at peak intensity. Optional.
confirm_supplementalNoSet to true ONLY after the user has explicitly confirmed these steps were walked without their device and were not captured. Do not set true based on your own inference.
respiratory_rate_bpmNoBreathing in br/min. Manual/home/device reading. Optional.
active_zone_min_moderateNoZone Minutes (also called Active Zone Minutes by Fitbit, Heart Points by Google Fit) at moderate intensity. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is highly transparent (additive step semantics, replacement behavior, no-op success), but it explicitly claims 'IDEMPOTENT' while the annotation idempotentHint is false. This is a direct annotation contradiction, so per rubric the score must be 1 despite the otherwise rich detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well structured, with front-loaded purpose and uppercase section headers (VITALS, STEPS, ALL OTHER FIELDS, INFER, IDEMPOTENT). Some enumeration of vitals duplicates the schema, creating mild redundancy, but the operational rules justify most of the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter tool with an output schema and 100% schema coverage, the description covers all critical behaviors: defaulting to today, step additive semantics, replacement scope, no-op idempotent success, and lab-result routing. Only minor gaps exist, such as explicit behavior for omitting all fields, but nothing required for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds substantial extra meaning: step_count is additive and requires explicit confirmation, vitals replace existing manual values, systolic requires diastolic to accompany, and glucose routing depends on source. These are the exact semantic constraints the schema does not fully capture.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific verb and resource: logging daily wearable/manual health metrics across many vitals. It explicitly distinguishes where lab glucose values belong (log_lab_results instead), which separates it from that sibling without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use and when-not-to-use guidance: manual step_count only for device-missed steps, never for sync issues; lab-derived glucose belongs in log_lab_results; all other fields replace existing manual values. This is model-level routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_wellbeingAInspect

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:

  • period_start: default to today

  • period_end: default to same as period_start (single day). For "this week" use Monday–Sunday, for "this month" use first–last day.

  • ratings: estimate from description ("exhausted"=2, "great energy"=8, "stressed out"=8 stress, "feeling good"=7 mood)

You may log any subset of rating fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
moodNoMood 1-10 (1=terrible, 10=excellent). Optional.
notesNoFree-text notes about how you feel. Optional.
energyNoEnergy level 1-10 (1=exhausted, 10=wired). Optional.
stressNoStress level 1-10 (1=calm, 10=overwhelmed). Optional.
sorenessNoMuscle soreness 1-10 (1=none, 10=extreme DOMS). Optional.
period_endNoEnd date of period. Format: YYYY-MM-DD. Default: same as period_start (single day). Use for week/month/custom ranges.
period_startNoStart date of period. Format: YYYY-MM-DD. Default: today.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, it discloses the overlap conflict behavior: returns a warning with conflicting entry IDs and requires the user to update or delete existing entries first. It also explains date-range inference defaults and rating estimation. This adds meaningful behavioral context not present in the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then organized into support scope, conflict handling, and inference bullets. Every section adds operational value, with no filler or redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with all optional fields and an output schema, it covers when to use it, how to derive period and ratings, and what happens on conflicts. The output schema handles return-value details, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds substantive meaning: natural-language inference rules for period_start and period_end ('this week' = Monday–Sunday, 'this month' = first–last day) and example rating mappings ('exhausted'=2, 'great energy'=8). It also clarifies that any subset of rating fields may be logged, which is operationally useful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Log subjective wellbeing ratings for a day, week, month, or custom date range.' It names the rating dimensions (energy, mood, stress, soreness), which clearly distinguishes it from sibling log_* tools such as log_sleep, log_body_metrics, and log_workout.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use: 'Use when the user describes how they feel — energy level, mood, stress, or muscle soreness.' It also defines date-inference behavior and overlap handling, but it does not explicitly name alternative tools or give when-not-to-use exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

log_workoutA
Destructive
Inspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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:

  • Call list_exercises first; match each exercise to the closest canonical name. No reasonable match → use the name as stated. Don't ask before logging, match silently and log.

  • "Chest press" (machine) and "bench press" (barbell) are DISTINCT — pass the user's term through so the resolver's aliases pin the right one.

  • name is ONLY the exercise name, never reps/weights/sets — those go in the sets array.

  • 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.

  • The result says when a name was matched to something other than what the user said. Relay it in your own words rather than repeating the line verbatim. 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.

  • 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.

SETS:

  • "3 sets of 15 reps" → 3 set objects with reps: 15. "15/12/10" → 3 sets with reps 15, 12, 10.

  • Pure isometric holds (planks, dead hangs, wall sits) have no reps: "30 second plank" = { hold_length_sec: 30 }.

  • Tempo/pause work combines reps + weight_lb + hold_length_sec (seconds per rep) on the same set, never in notes.

  • Loaded carries (farmers carry, sled push, weighted plank) are one set per trip: hold_length_sec + weight_lb, omit reps unless a trip count is given. weight_lb is PER HAND for a two-implement carry, TOTAL for one implement. Distance has no column and is never a duration — put it in notes.

INFER — do not ask:

  • date: today, or from context

  • focus_type: from the exercises (bench/shoulders/triceps=Push, rows/pulldowns/curls=Pull, squats/deadlifts/lunges=Legs, mixed upper=Upper, everything=Full Body)

  • is_bodyweight: true for pull-ups, push-ups, dips, bodyweight squats; missing load alone does not mean bodyweight

  • superset_group: same integer for exercises done back-to-back or as a superset

  • slot_type: 'warmup' for prep at the start, 'finisher' for burnout/cardio at the end, 'working' (default) otherwise

RPE (Rate of Perceived Exertion) — 1-10 scale, half steps allowed (7.5, 8.5):

  • Session-level RPE: overall session difficulty. Infer from user comments like "brutal session" (8-9) or "easy day" (3-4). Optional.

  • Per-set RPE: how hard each individual set felt. Include only if the user explicitly mentions per-set effort or failure. Optional.

  • Scale: 1=minimal effort, 5=moderate, 7=hard, 8=few reps left, 9=one rep left, 10=maximal/failure.

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.

LIVE LOADS: for user-driven completed-workout logging, obvious bodyweight movements may omit load and are inferred as bodyweight. If a performed set normally uses external resistance, include that set's load. If the user did not provide it, ask one batched clarification before calling this tool. Only set load_unknown=true on a missing set when the user explicitly says they do not know, do not remember, or want to save without that load. Preserve partial known loads positionally; never copy one set's load to another or treat a missing external load as bodyweight.

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, and LIVE LOADS does not apply: prescribed weight may be omitted. 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.

SIMPLE CARDIO / ENDURANCE LOGS:

  • Cycling, biking, bike rides, walking, and rowing/RowErg sessions are workouts, not runs. NEVER use log_run for them.

  • Log cycling/biking with focus_type: "Cycling", walking with "Walking", and rowing/RowErg with "Rowing".

  • A simple cardio workout does not need fake strength exercises. Omit exercises (or pass []) and put distance in the unit the user actually supplied: distance_mi, distance_km, or distance_meters. Put elapsed workout time in duration_sec and calories in calories when supplied.

  • NEVER do distance-unit arithmetic yourself. The server converts km/meters to stored miles exactly.

  • Do not call list_exercises just to represent a bike ride, walk, or rowing erg. The server stores these directly as workout_sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
rpeNoSession RPE, 1-10, half steps allowed: 5 moderate, 7 hard, 9 one rep left, 10 failure. Infer from comments about overall difficulty, or omit.
dateYesYYYY-MM-DD. Default to today.
notesNoSession notes: how it went, PRs hit, how they felt.
caloriesNoSession calories for simple cardio when supplied by the user/device.
locationNoGym, Home, Outdoor. Infer from context or ask.
exercisesNoEvery exercise performed, in order.
focus_typeNoInfer from the exercises: Push, Pull, Legs, Upper, Lower, Full Body, Cardio, Mobility. Ask only if genuinely unclear.
distance_kmNoSession distance in kilometers. Server converts it to storage units; do not convert it yourself.
distance_miNoSession distance in miles for simple cardio. Use only when the user supplied miles. In mi, or km with input_distance_unit set. See UNIT INPUTS.
duration_secNoTotal session duration in seconds for simple cardio when known.
distance_metersNoSession distance in meters. Server converts it to storage units; do not convert it yourself.
saved_workout_idNoExisting Saved Workout ID to replace in saved mode. Omit to create a new Saved Workout.
heart_points_peakNoPeak-intensity heart points, if mentioned.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.
saved_workout_titleNoOptional reusable workout name in saved mode. Defaults to focus_type.
heart_points_moderateNoModerate-intensity heart points, Google Fit or equivalent, if mentioned.
save_as_saved_workoutNoTrue when this payload is a reusable Saved Workout prescription, not a completed workout. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructive/readOnly/idempotent flags; the description adds far more: the single-conversion unit contract, the ID returned as '[ID NN]', saved-mode semantics where the workout is not logged as completed history, LIVE LOADS inference policy, and the NSI score implications of equipment tagging. These are behavioral consequences an agent cannot derive from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the highest-risk rule (unit handling) and uses clear headers, so it is navigable. It is nonetheless very long, and several rules restate the same point across sections (e.g., unit conversion is asserted both at top and per-field), costing tightness without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter tool with an output schema, the description covers inference defaults, the batched-question policy, saved-workout mode, and cardio fallbacks — leaving no decision an agent must make on its own. Return-value explanation is correctly omitted since an output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the schema itself repeatedly defers to the description ('See UNIT INPUTS', 'See EQUIPMENT', 'See SETS'), so the description is the authoritative source for param meaning. It defines load basis per equipment value, per-set vs session RPE, hold_length_sec reuse for tempo/carries, and superset/slot inference defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Log a complete workout session: exercises, sets, reps, weights, and session metadata') and explicitly distinguishes itself from siblings by naming propose_workout for future workouts and log_run for cycling/walking/rowing. An agent can route to it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use triggers ('user describes finishing a workout, lists exercises performed, or asks to log training'), explicit exclusions ('a workout they have not done yet is not a log: use propose_workout'), and named alternatives for follow-ups (update_workout / delete_workout / get_workout / add_exercises) plus the cardio exception to log_run.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_recovery_strategyA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoStrategy ID. Required for update, end, delete unless strategy_name is given.
nameNoStrategy name (e.g. 'Box Breathing'). Required for add; on update, sets a new name.
notesNoFree-text notes. Optional.
actionYesWhat to do. Required.
categoryNoCategory. Infer from name.
end_dateNoEnd date (YYYY-MM-DD). Default to today for end action.
start_dateNoStart date (YYYY-MM-DD). Default to today for add.
period_unitNoPeriod unit. Default: 'week'.
time_of_dayNoWhen during the day: ['morning'], ['evening'], etc. Optional.
strategy_nameNoAlternative to id for update/end/delete: strategy name substring, case-insensitive (e.g. "sauna").
duration_minutesNoTarget minutes per session. Optional.
sessions_per_periodNoTarget sessions per period. Default: 1.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and destructive hints, so the bar for disclosure is lower. The description adds useful behavioral detail beyond that: start_date defaults to today, category is inferred from the name, strategy_name is a case-insensitive substring, and ambiguous matches produce an error with candidate IDs to retry with.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into clear sections: trigger cases, selector rules, and post-add follow-up. It stays front-loaded and every block earns its place, though the post-add paragraph is fairly verbose and could be trimmed without losing the required conversational loop.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutation tool with one required field in schema, this description covers the most likely failure points: how to resolve strategy names, what to infer, what defaults to use, how to handle errors, and what to do after a successful add. The output schema exists, so the description does not need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema has 100% parameter coverage, the description adds critical semantics the schema does not express: exactly one of id or strategy_name is required for update/end/delete, name is the only truly required field for add, and optional fields like duration_minutes and time_of_day should be confirmed after an add. This is highly actionable guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line uses a specific verb-resource pairing: 'Add, update, end, or delete a recovery/mindfulness strategy,' and covers the full set of actions. This distinguishes the tool from session-level siblings like log_recovery_session and list_recovery_strategies by making it clear this tool manages the strategy lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete trigger cases: when the user describes a new practice, changes a schedule, stops a practice, or removes one. It also says to ASK only if the name is missing, but it does not explicitly name alternative siblings or state negative 'do not use this when' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_supplementA
Destructive
Inspect

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:

  • action: 'add' for a new item, 'update' for changing a field, 'end' when they stopped/finished a course, 'delete' only to remove the record entirely

  • category: 'medication' for prescription/OTC drugs and pharmaceuticals, 'supplement' for vitamins/minerals/herbs/other dietary supplements — default 'supplement' if unclear

  • start_date: today for new entries

  • end_date (for 'end'): today unless the user specifies otherwise

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoID. Required for update, end, delete unless supplement_name is given.
formNoPhysical form: pill, capsule, tablet, softgel, powder, liquid, gummy, other. Optional.
nameNoName (e.g. 'Magnesium Glycinate' or 'Metformin'). Required for add; on update, sets a new name.
brandNoBrand name. Optional.
notesNoFree-text notes. Optional.
actionYesWhat to do. Required.
categoryNoCategory: 'medication' for drugs/pharmaceuticals, 'supplement' for vitamins/minerals/herbs. Default: 'supplement'.
end_dateNoEnd date (YYYY-MM-DD). Set for 'end' action — default to today. Null means currently active.
dose_unitNoUnit for dose_amount: pills, capsules, tablets, softgels, g, mg, ml, IU, mcg, tbsp, scoop. Required for add.
start_dateNoStart date (YYYY-MM-DD). Required for add — default to today.
unit_labelNoLabel for dose_per_unit (e.g. 'mg', 'IU'). Optional.
dose_amountNoNumeric dose quantity (e.g. 2 for '2 pills'). Required for add.
period_unitNoThe period for times_per_period. Optional.
time_of_dayNoWhen during the day: ['morning'], ['morning','evening'], ['night'], etc. Optional.
dose_per_unitNoAmount per individual unit (e.g. 240 for '240mg per pill'). Optional.
frequency_typeNoFrequency category. Optional — default 'daily'.
supplement_nameNoAlternative to id for update/end/delete: name substring, case-insensitive (e.g. "magnesium").
times_per_periodNoHow many times per period (e.g. 2 for twice per week). Optional — default 1.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behavior: actions are inferred, 'end' sets end_date while 'delete' removes the record, and a non-unique supplement_name causes an error with candidate IDs. This gives a clear model of side effects and failure modes, and there is no contradiction with the destructiveHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but deliberately structured: purpose, trigger conditions, inference rules, ask conditions, and selector behavior are each clearly separated, with the core verb and resource front-loaded. Every sentence earns its place given the tool's 18-parameter complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with conditional selector requirements, the description covers user-intent mapping, defaults, disambiguation, and error behavior. Since an output schema is present, return values do not need to be spelled out, and nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 18 parameters at 100% coverage, but the description adds substantial value by specifying inference rules, defaults for start_date, end_date, category, and frequency, and the id/supplement_name selector contract. This is meaningfully more than what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, multi-operation statement—'Add, update, end, or delete a medication or supplement'—and clearly identifies the resource being managed. It then gives concrete user-intent triggers, making it easy to distinguish from read-only siblings like list_supplements or log_supplement_taken.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when...' sentence provides explicit triggering context, and the INFER/ASK guidance tells the agent when to act autonomously versus when to seek clarification. It does not explicitly name sibling alternatives or state when not to use this tool, but the operational guidance is strong enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark_empty_dayA
DestructiveIdempotent
Inspect

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:

  • fast: writes the 0-kcal "Fast day" food_log entry (a real, counted 0-calorie day).

  • forgot: records that the day was reviewed and simply not logged. Writes nothing to food_log, so the day stays a true blank and is excluded from calorie/TDEE averages, never imputed as 0.

  • unanswered: clears both. The day goes back to being an open question and the in-app prompt may ask about it again.

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date being answered for. Format: YYYY-MM-DD. Required.
answerYesRequired. "fast" = intentional 0-calorie day. "forgot" = day stays excluded, not imputed as 0. "unanswered" = clear any prior answer.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly explains the side effects: writing a 0-kcal food_log entry for 'fast', leaving the day blank for 'forgot', and clearing both for 'unanswered'. It also notes that it refuses to touch days with real meals. This goes beyond the annotations (readOnlyHint=false, destructiveHint=true) by detailing exactly what changes occur to the data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is clear but somewhat repetitive, repeating the three-state definitions twice and the 'setting one clears the other' rule twice. It could be tightened without losing meaning, but it remains organized and not excessively verbose for the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers prerequisites (use list_meals first), parameters, exact effects, and failure conditions (refuses days with real meals). It even notes that the tool is for chat usage instead of the in-app prompt. No critical context is missing for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters (date, answer) are described in the schema with full coverage. The description further elaborates on the 'answer' enum values—'fast' means intentional 0-calorie day, 'forgot' means day stays excluded, 'unanswered' clears any prior answer—adding richer semantics beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Set, change, or undo the answer to why is this day empty?' It specifies the resource (a date) and the exact states (fast, forgot, unanswered) it manages. It also distinguishes itself as the only way to move between these states, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: '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.' It also advises to 'Use list_meals first if unsure whether the date already has real food logged' and mentions refusal when real meals exist, giving clear when-to-use and when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_body_compositionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 90d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds transparency about the tool's behavior beyond that: it 'renders an interactive MCP app' and 'returns a short text summary alongside the visual view.' These are useful behavioral details that the annotations do not capture, and they do not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long and efficiently front-loads the core purpose. The first sentence states what is shown and lists metrics; the second provides usage guidance and output format. Every clause contributes meaningful information—there is no fluff, redundancy, or excessive detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter with an enum, no nested objects), the description covers all essential context: what the tool displays, which metrics are included, when to use it, and what the output looks like (visual app plus text summary). It is complete enough for an agent to decide when and how to call it, though the actual output schema is not detailed in the description itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage: the only parameter 'range' has a description ('Time window. One of 7d, 30d, 90d, 1y. Default 90d.') and an enum. The tool description adds no additional parameter-specific information beyond what the schema already provides. Since the schema fully documents the parameter, a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Show body composition over time with an interactive metric picker' and enumerates the specific metrics (weight, body fat, lean and muscle mass, hydration, visceral fat, BMI, waist, and related scale metrics). It uses a specific verb ('show') and identifies the resource ('body composition'), leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text.' This tells the agent when to invoke the tool and contrasts it with an alternative (text descriptions). It could be more explicit about other alternatives (e.g., raw data tools like list_body_metrics), but the condition and preference are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_body_weightA
Read-onlyIdempotent
Inspect

Visual weight and body-fat trend for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful return-format context by stating it returns an interactive chart plus a short summary, which goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the tool's purpose, states the available time windows, and communicates the output format efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a low-complexity tool with one optional enum parameter, rich annotations, and an output schema. The description covers the core behavior and return format, leaving no significant gaps for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, and the schema already fully describes it with an enum and a clear description. The description repeats the same range values without adding new semantic meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool visualizes weight and body-fat trends across specific time ranges and returns a chart plus summary. It does not explicitly distinguish itself from the sibling show_body_composition, which could overlap on body-fat, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for viewing weight and body-fat trends, and the enum ranges suggest when it can be used. However, there is no explicit guidance on when to choose this over alternatives like show_body_composition or list_body_metrics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_exercise_progressionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y.
exerciseNoExercise name to chart (e.g. "Bench Press"). Optional; defaults to the most-logged lift in the window.
muscle_groupNoOptional muscle-group filter for the exercise picker (e.g. "Chest", "Legs").

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as read-only, idempotent, and non-destructive, and the description does not contradict any of these. It additionally discloses the output format (short text summary alongside visual view) and the UI preference, making the behavior fully transparent without adding any misleading side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant words. It packs the key purpose, filtering capabilities, UI preference, and output summary into a compact but complete statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives the agent enough context to decide when to call the tool (when the user asks about progression) and what to expect (interactive chart, summary text). It also differentiates itself from text-based alternatives, covering the essential contextual needs for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides detailed descriptions for all three parameters, including the enum for range and the default behavior for exercise. The function description reinforces their purpose as filters/picker, and the schema coverage is 100%, ensuring the agent understands each parameter's role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the function shows 1-rep-max progression over time as an interactive line chart with filters for date range and muscle group, and an exercise picker. This makes the tool's purpose unambiguous and distinct from other workout-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance: when the user asks about this topic, prefer this tool and render the interactive app rather than describing rows in text. This directly tells the agent when and how to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_health_overviewA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 30d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond that: the tool renders an interactive MCP app, provides a visual view, and returns a short text summary. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the main purpose and metric list, followed by usage preference and output format. 'When the user asks about this' is slightly vague filler, but overall the text is compact and each sentence contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one optional parameter, full schema coverage, a rich output schema, and annotations covering safety and idempotency, the description fully enables correct invocation and selection. It covers choice rationale, rendering behavior, and output format; nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for the single 'range' parameter, including its enum values and default of 30d. The description adds no parameter-specific detail, but the schema already carries the full semantic load, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'Show a rich overview of wearable health signals' and enumerates the included signals (steps, Zone Minutes, resting heart rate, HRV, VO2max, stress). It distinguishes from sibling metrics tools by framing this as a broad overview for overall health-trend questions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explicitly says to prefer this tool for 'broad wearable or overall health-trend questions' and to render the interactive MCP app rather than describing rows in text. It does not name specific sibling alternatives or exclusion conditions, but the guidance is clear enough for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_meal_diaryA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoDiary date (YYYY-MM-DD). Optional; defaults to today.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context by noting that it returns 'a short text summary alongside the visual view' and that it renders an interactive MCP app.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: what the tool does, when to prefer it, and what it returns. The key purpose is front-loaded and there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read-only tool with a full output schema, the description is complete. It explains the visual rendering behavior, the summary return, and the intended use case, leaving no important gap for an agent deciding to call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents the only parameter (`date`) with type, format, optionality, and default behavior. The description adds no additional parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Show'), a specific resource ('meals logged on a day'), and a distinctive format ('rich diary with daily calories and macros versus targets'). This clearly separates it from sibling tools like list_meals and log_meal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to prefer this tool for 'what-did-I-eat and daily food-log review questions' and instructs rendering the MCP app over describing rows in text. It establishes clear usage context, though it does not explicitly name sibling alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_recoveryA
Read-onlyIdempotent
Inspect

Visual resting-heart-rate and HRV trend for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description is consistent with them. The description adds that output is an interactive chart plus summary, but provides no further behavioral detail such as authentication requirements or default behavior when no range is supplied. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence that front-loads the core purpose and enumerates all valid range options. There is no redundant phrasing or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only visualization tool with an output schema, the description largely suffices: it names the metric, the range choices, and the return form. It does not say what happens when optional range is omitted, which is a minor but real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the only parameter, and the range enum is fully documented. The description merely repeats the allowed values (7d, 30d, 90d, 1y) without adding new meaning or clarifying the optional default behavior, so it stays at the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Visual resting-heart-rate and HRV trend' and 'Returns an interactive chart plus short summary.' It is clear enough to distinguish from list/log siblings, but it does not explicitly differentiate itself from sibling visualization tools like show_health_overview.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the intended use case: retrieving a visual RHR/HRV trend over a selected time window. It does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives, so the agent must infer the right context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_runsA
Read-onlyIdempotent
Inspect

Visual running-mileage trend for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 30d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, and non-destructive hints. The description adds useful behavioral context beyond annotations by disclosing the output form (interactive chart plus short summary) and the supported time ranges. There is no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The main capability and time ranges are front-loaded, and the output format is stated second. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one optional parameter and an output schema, the description is nearly complete. It clearly communicates purpose and return format; the only minor gap is not explicitly stating the 30d default, though the schema already covers it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter is fully documented in the schema. The description merely repeats the enum values without adding new semantic detail such as how the chart renders or what the summary includes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Visual running-mileage trend' with explicit time windows (7d, 30d, 90d, 1y). This clearly distinguishes it from siblings like list_runs, log_run, and other show_* tools by emphasizing the visual chart output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it—when the user wants a visual mileage trend—but it does not explicitly state when not to use it or name alternatives such as list_runs for raw data. The context is clear but exclusions and alternative routing are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_sleep_detailA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoNight ending date (YYYY-MM-DD). Optional; defaults to the most recent sleep entry.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and destructive annotations, the description discloses the output behavior (returns a short text summary alongside a visual view) and the preference to render an interactive app, giving full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact yet covers purpose, usage, and output in three sentences with no redundant or vague phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It provides sufficient context for an agent to decide when to use the tool, what it returns, and how to invoke it. The included field list compensates for the absence of an explicit output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'date' is fully described with format (YYYY-MM-DD), optionality, and default behavior (most recent sleep entry), providing complete semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: showing one night of sleep in detail with specific attributes (duration, score, stages, etc.) and identifies it as preferred for last-night or specific-night queries.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly gives when-to-use guidance ('prefer this for last-night or specific-night sleep questions') and instructs to render the interactive MCP app instead of describing rows in text, making alternatives implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_week_fit_scoreA
Read-onlyIdempotent
Inspect

Visual Fit Score trend and component breakdown for 7d, 30d, 90d, or 1y. Returns an interactive card plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 7d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail by specifying the return type: an interactive card plus short summary. This goes beyond the structured annotations and helps set output expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the core purpose and time options, then specify the output format. Every word earns its place; there is no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter, read-only visualization tool with an output schema, annotations, and a clear return description, nothing essential is missing. An agent has enough to invoke it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, including the enum values and default for 'range'. The description repeats the same time windows and does not add extra semantic detail beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Visual') and a clear resource ('Fit Score trend and component breakdown'), and it enumerates the supported time windows. It clearly distinguishes this from the sibling tools by naming the unique Fit Score capability rather than a generic health or recovery view.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for use: viewing Fit Score trends and components over selectable ranges. It does not explicitly name alternatives or state when-not-to-use, but the Fit Score focus is distinctive enough among siblings that an agent can infer the right selection without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_week_macrosA
Read-onlyIdempotent
Inspect

Visual calories and macros versus targets for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 7d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, idempotent, and non-destructive behavior. The description adds that it returns an interactive chart and summary, but provides no other behavioral details such as data freshness or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the core purpose and then the return format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter, the description is sufficient. It could be slightly more complete by clarifying what 'macros' includes or that targets are user-defined, but those are not essential for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already explains the range parameter with its enum and default. The description repeats the enum values in context but does not add significantly deeper meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool visualizes calories and macros versus targets across selectable time ranges, which distinguishes it from sibling tools like show_week_sleep or show_week_steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by describing the visualization, but it does not explicitly state when to use this tool versus other nutrition-related tools (e.g., list_meals or show_meal_diary), nor does it mention any prerequisites or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_week_sleepA
Read-onlyIdempotent
Inspect

Visual sleep duration and score trend for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 7d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds the non-obvious behavioral detail that it returns an interactive chart plus a short summary, rather than raw JSON. No contradictions with annotations were found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first covers purpose and ranges, the second covers return value. There is no filler or redundant restating of the tool name. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only chart tool with one optional parameter, an output schema, and clear annotations, the description is complete. It specifies the visual nature, the selectable time windows, and the expected return shape. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the range parameter and its default are already fully documented. The description repeats the allowed values without adding additional syntax, format, or edge-case guidance. Per baseline, a 3 is appropriate when the schema handles parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (visualize/show) with a clear resource (sleep duration and score trend) and scope (7d, 30d, 90d, or 1y). This distinguishes it from list_sleep and show_sleep_detail, which imply raw or detailed views. The 'interactive chart plus short summary' makes the visualization purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Visual sleep duration and score trend' clearly signals when this tool is appropriate: when the user wants a chart/trend rather than raw sleep data. It does not explicitly mention alternatives like list_sleep or show_sleep_detail, but the visual-vs-list/detail distinction is strongly implied by the wording.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_week_stepsA
Read-onlyIdempotent
Inspect

Visual step-count trend versus goal for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 7d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds useful behavioral context beyond annotations by specifying the interactive chart and short summary return format, and by framing the output as a trend versus goal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences communicate the core behavior, the supported time windows, and the return format without redundancy. The main action is front-loaded, and every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with one optional parameter, a complete schema, and an output schema, the description provides all necessary selection and invocation context. The interactive chart and summary are specified, and no additional behavioral caveats are essential.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the sole parameter 'range' is fully documented with an enum and default. The description repeats the allowed range values but adds no new meaning beyond the schema, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: a visual step-count trend compared to a goal. It clearly differentiates this from sibling tools like show_week_sleep or show_week_macros by naming the exact metric and view type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: when the user wants a step-count trend versus goal over 7d, 30d, 90d, or 1y. It does not explicitly name alternative tools or exclusion criteria, but the context is unambiguous for a simple visualization tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_week_workoutsA
Read-onlyIdempotent
Inspect

Visual training trend for 7d, 30d, 90d, or 1y. Returns an interactive chart plus short summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 7d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds that it returns an interactive chart and summary, which is more about the return format than side effects, so it adds limited behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, using two short sentences to convey purpose and output. No unnecessary words or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives a clear overview of expected output (chart plus summary) and the input parameter, which is sufficient for a simple read-only tool. It lacks explicit output schema details but that is not required given the presence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter 'range' is fully described in the schema with enum values and default, so the tool description adds no new semantic information beyond reinforcing the valid options. Schema coverage is high, so the baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool visualizes training trends over selectable time windows (7d, 30d, 90d, 1y) and distinguishes it from other workout-related tools by focusing on visual trend output rather than logs or details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given about when to use this tool versus alternatives like list_workouts or show_workout. The description implies a visualization use case but does not state a clear preference or boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_wellbeingA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime window. One of 7d, 30d, 90d, 1y. Default 30d.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds value by disclosing that it renders an interactive MCP app and returns a short text summary alongside the visual view, which the schema alone would not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler, front-loading the tool's purpose. There is minor redundancy between 'Prefer this for...' and 'When the user asks about this, prefer calling this tool', but the description remains tight and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single optional parameter with an output schema and safety annotations, the description covers purpose, usage context, and output behavior. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: the single range parameter has an enum and a default in the schema. The description adds no new parameter meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Show) and resource (energy, mood, stress, soreness) with scope (recent context, wellbeing trend). It clearly distinguishes itself from list_wellbeing by emphasizing the visual/interactive wellbeing view rather than raw rows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to prefer this tool for 'how-I-have-been-feeling' and subjective recovery questions, and contrasts it with describing underlying rows in text. This gives clear when-to-use guidance and implicitly names the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

show_workoutA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoWorkout date (YYYY-MM-DD). Optional; defaults to the most recent workout.

Output Schema

ParametersJSON Schema
NameRequiredDescription
kindYesWidget discriminant identifying the payload shape.
generatedAtNoISO timestamp the snapshot was built.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and idempotent behavior. The description adds that it returns a short text summary alongside the visual view, which is useful behavioral detail beyond the annotations, though it does not cover error cases or side effects (which are already implied safe by annotations).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight and information-dense: it states the output, default behavior, targeting capability, and a usage preference, all in two sentences without redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter read-only tool with an output schema, the description provides sufficient context: what the user sees, how to target a date, and the relationship to the interactive app. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'date' parameter is fully described in both schema and tool description, including format (YYYY-MM-DD), optionality, and default behavior. Schema coverage is 100%, and the description adds meaningful usage context beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states action ('Show'), resource ('single logged workout session's exercises and sets'), and format ('inline card'), distinguishing it from list tools and get_workout by emphasizing the visual/interactive rendering.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to prefer this tool over text descriptions when the user asks about a workout, and contrasts it with alternative presentation methods. The optional date parameter and default behavior are also specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_cycleA
Idempotent
Inspect

Update an existing period record. Use to correct dates, add a missing end date, or clear an end date (resume).

Common uses:

  • "my period ended on the 9th not the 8th" → update ended_on

  • "actually my period started the 2nd not the 3rd" → update started_on

  • "I'm still on my period" → clear ended_on (pass null) to reopen it

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord ID. Alternative to date.
dateNoAlternative to id: a date (YYYY-MM-DD) that identifies the period — its start date, or any day within it. Resolves only when exactly one record matches.
ended_onNoUpdated end date. Format: YYYY-MM-DD. Pass null to clear (mark active). Optional.
started_onNoUpdated start date. Format: YYYY-MM-DD. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds useful behavioral context beyond the annotations, such as the effect of passing null for ended_on (clears the date and marks active) and the selector resolution behavior. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a main statement, a 'Common uses' list, and a 'SELECTOR' paragraph. Each sentence adds value (use cases, selector rules, null handling) without redundancy or fluff. It is appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are documented elsewhere. The description covers the action, use cases, selector logic, and parameter behaviors, making it self-sufficient for an agent to decide when and how to call it. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description repeats the parameter explanations already present in the schema (e.g., id as alternative to date, date resolving only when a single match exists). It does not add new semantic details beyond what the schema already provides, so it stays at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Update' and the resource 'period record', and it lists common use cases (correct dates, add/clear end date). It is easily distinguished from sibling tools like log_cycle, list_cycle, and delete_cycle by the explicit update action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides concrete examples of when to use the tool ('my period ended on the 9th not the 8th', 'I'm still on my period'), and it explains the selector rules (pass id or date, exactly one required, error if multiple matches). This gives clear guidance on when and how to invoke without needing to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_goalA
Destructive
Inspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoConcise title, inferred from the goal inputs.
weeksNoFor weight_loss. Duration in weeks when target_date is not supplied. For body_comp. Duration in weeks when target_date is not supplied.
actionYesWhat to do. 'end' when the user is stopping or canceling a goal; for a formal goal that follows the app's cancel behavior and removes it.
metricNoFor consistency. What consistency behavior to track. Required on create. Set at create, not editable later. For body_comp. Body composition metric. Required on create. Set at create, not editable later. For nutrition. Legacy nutrition metric.
goal_idNoFormal goal ID, when known.
goal_refNoNatural-language reference when no ID is known, e.g. "protein", "10K", "weight loss". This tool resolves it against current goals itself.
new_nameNoFor n1_experiment. Name for a new supplement when not using supplement_id.
new_brandNoFor n1_experiment. Optional brand for a new supplement.
race_dateNoFor race. Race date in YYYY-MM-DD format. Required on create.
start_dateNoYYYY-MM-DD. Default: today.
start_valueNoFor body_comp. Starting value when the goal begins. Required on create. Set at create, not editable later.
target_dateNoFor weight_loss. Target date in YYYY-MM-DD format. Use this when the user names a deadline. For body_comp. Target date in YYYY-MM-DD format. Use this when the user names a deadline.
week_windowNoFor consistency. How the week this goal is measured against is bounded: rolling = the last 7 days, sunday/monday = a calendar week that resets on that day. Default: rolling.
start_1rm_lbNoFor strength. Estimated 1RM when the goal starts. Required on create. Set at create, not editable later. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
target_hoursNoFor consistency. Nightly sleep target in hours. Required when metric is sleep_duration.
target_valueNoFor body_comp. Target body composition value. Required on create. For nutrition. Legacy nutrition target value. For standard targets, this is the numeric target value.
exercise_nameNoFor strength. Exercise name. Required on create. Set at create, not editable later.
new_dose_unitNoFor n1_experiment. Dose unit for a new supplement.
supplement_idNoFor n1_experiment. Existing supplement ID. Use either supplement_id or the new-supplement fields.
target_1rm_lbNoFor strength. Target 1RM. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
new_dose_amountNoFor n1_experiment. Dose amount for a new supplement.
start_weight_lbNoFor weight_loss. Starting body weight. Required on create. Set at create, not editable later. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
target_per_weekNoFor consistency. Target occurrences per week. Required on create.
target_time_secNoFor race. Target finish time in seconds. Required on create.
target_weight_lbNoFor weight_loss. Target body weight. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS.
input_weight_unitNoSet to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb.
intervention_daysNoFor n1_experiment. Intervention duration in days.
baseline_directionNoFor n1_experiment. Use already logged previous 14 days or collect the next 14 days.
target_distance_miNoFor race. Target race distance. Required on create. In mi, or km with input_distance_unit set. See UNIT INPUTS.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.
acknowledged_warningsNoWarning keys the user explicitly acknowledged after a guarded create attempt. Omit otherwise.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructiveHint=true, idempotentHint=false). The description adds valuable behavior beyond that: it resolves goal_ref against current goals itself, returns candidates and changes nothing on ambiguous matches, follows the existing cancel lifecycle, and explains that standard-target end/pause turns a target off while delete removes it. It also discloses the unit-conversion override behavior. Only minor gaps (e.g. auth needs) remain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose sentence and the list_goals exclusion are front-loaded and efficient. However, the lengthy UNIT INPUTS block consumes roughly half the description and largely restates the per-parameter schema text and companion-field descriptions, reducing signal density for the primary use case.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 31 parameters, an output schema present, and rich annotations, the description covers the essential orchestration behavior (direct call, internal resolution, ambiguous-match handling, action semantics) that the agent cannot get from structured fields alone. It is adequately complete; the return-value explanation is rightly delegated to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description nonetheless adds meaning beyond the schema by defining the cross-cutting UNIT INPUTS contract and the companion-field convention across the whole _lb/_mi/_in family, which the schema only references per-field. It also clarifies that goal_ref resolves internally and multi-matches produce candidates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific set of verbs (change, complete, pause, stop/end, reopen, delete) on a specific resource (an existing goal). Clearly distinguishes itself from sibling create_goal and list_goals by naming the latter outright as unnecessary. An agent can tell exactly what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to call this directly for ordinary changes and NOT to call list_goals first. It states which actions need edit fields (edit) and which don't (complete/pause/end/reopen/delete), and describes the multi-match resolution behavior. This is direct when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_injuryA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoInjury ID. Alternative to injury.
dateNoOptional, narrows the injury selector to one active on this date (YYYY-MM-DD). Ignored when id is given.
sideNoUpdated side. Optional.
notesNoUpdated notes (replaces existing). Optional.
injuryNoAlternative to id: body part or injury type substring, case-insensitive (e.g. "shoulder"). Optionally narrow with date.
statusNoUpdated status. Optional.
end_dateNoDate injury resolved. Format: YYYY-MM-DD. Auto-sets status to Resolved.
severityNoUpdated severity 1-10. Optional. Change is tracked in severity history.
start_dateNoUpdated start date. Format: YYYY-MM-DD. Optional.
severity_dateNoDate for the severity entry in the history log. Format: YYYY-MM-DD. Default: today. Use to backfill past severity changes.
affected_movementsNoUpdated list of affected movements. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations by disclosing side effects: severity changes are automatically tracked in history, setting end_date auto-marks Resolved, and severity_date backfills history. Also explains that ambiguous selectors cause an error with candidate IDs. These behavioral details are not available in the minimal idempotent/destructive hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy due to the selector explanation, but it is well-structured into three logical blocks (purpose/usage, side effects, selector rules) and includes a concrete example for substring matching. It is front-loaded with the core purpose, and every sentence adds necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers essential operational details: default value for severity_date, auto-status behavior, selector ambiguity and error handling, and precedence of id over injury. While it does not describe the response shape, an output schema exists (context signal indicates has output schema: true), so that omission is acceptable. The description is sufficiently complete for a caller to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers each parameter (100% coverage), so the baseline is 3. The description adds meaningful semantic relationships not evident from individual field descriptions: end_date ↔ status, severity ↔ severity_date, and the selector precedence (date ignored when id is given). This raised the score from baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action and resource: 'Update an existing injury entry.' The description also explicitly lists use cases ('improving, worsening, resolved, or wants to change details'), which fully distinguishes it from siblings like log_injury, list_injuries, and delete_injury without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('Use when the user reports an injury is improving, worsening, resolved, or wants to change details') and explains parameter selection rules (e.g., 'Only send fields that need to change', selector ambiguity and error behavior). It does not explicitly name alternative tools, but the existing-entry phrasing and use-case list make the boundary clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_lab_resultA
Idempotent
Inspect

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, date+marker, or draw_id:

  • id: addresses one marker's row. Any editable field may change.

  • draw_id: addresses every result sharing that draw_id at once, unambiguous by construction. Only new_date, panel_name_new, lab_name, fasting_status, and report_date may change this way — those are draw-level fields.

  • date (optionally narrowed by panel_name): addresses every result from that draw at once, but ONLY when exactly one draw exists on that date — see AMBIGUITY below. Same draw-level fields as draw_id.

  • date + marker (a marker-name substring, case-insensitive, optionally narrowed by panel_name): resolves to one marker's row, same as id. Errors with candidate IDs if more than one marker on that date matches.

AMBIGUITY: a bare date (optionally + panel_name) selector is rejected, with nothing changed, if it would match more than one physical draw — an explicit draw_id from one source plus legacy rows with none, two distinct draw_ids, or two differently-named legacy sources on the same day. The error names every draw found; retry with draw_id, marker, or a narrower panel_name.

FASTING: fasting_status only changes to 'fasting' or 'non_fasting' when the user explicitly states it for that draw — never infer from time of day or a notes mention. 'unknown' is a valid explicit value too, for undoing a mistaken confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoLab result ID. Selects a single marker row. Alternative to date/draw_id.
dateNoCollection date of the draw to update. Format: YYYY-MM-DD. Selects every result from that draw (see AMBIGUITY above), or (with marker) one row. Alternative to id/draw_id.
flagNoNew lab flag: "H", "L", "HH", "LL", or "A". Optional, omit if not changing. Only allowed when selecting by id or date+marker.
notesNoNew notes. Optional, omit if not changing. Only allowed when selecting by id or date+marker.
markerNoOptional with date: marker-name substring, case-insensitive (e.g. "LDL"), narrowing the date selector to a single marker row so per-marker fields can be edited without an id. Ignored when id or draw_id is given.
draw_idNoOpaque label of your choosing grouping a set of results from one visit, normalized server-side. Selects every result sharing that label, unambiguous by construction. Alternative to id/date. Ignored when id is given.
lab_nameNoNew lab name (e.g. "Quest Diagnostics", "LabCorp"). Optional, omit if not changing. Works with any selector.
new_dateNoNew collection date. Format: YYYY-MM-DD. Optional, omit if not changing. This is the main reason to call this tool, and it works with any selector.
panel_nameNoOptional, narrows a date (or date+marker) selector to one panel within that draw (e.g. "Lipid Panel"). Ignored when id is given.
marker_nameNoNew marker name. Optional, omit if not changing. Only allowed when selecting by id or date+marker.
report_dateNoNew report/result date, separate from the collection date. Format: YYYY-MM-DD. Optional, omit if not changing. Works with any selector.
result_unitNoNew unit of measurement (e.g. "mg/dL"). Optional, omit if not changing. Only allowed when selecting by id or date+marker.
result_valueNoNew numeric result value. Optional, omit if not changing. Only allowed when selecting by id or date+marker.
fasting_statusNoNew fasting status for the whole draw. See FASTING above. Optional, omit if not changing. Works with any selector.
panel_name_newNoNew panel name. Optional, omit if not changing. Works with any selector.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing selector ambiguity behavior, rejection with no changes when multiple draws match, draw-level vs marker-level field restrictions, and the rule to never infer fasting status from time of day. These are important behavioral traits an agent could not infer from annotations or schema alone. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Though long, the description is tightly structured with SELECTOR, AMBIGUITY, and FASTING sections, and every sentence carries operational meaning. The most important guidance is front-loaded, and the organization makes the complexity navigable rather than overwhelming.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's 15 optional parameters, four selector modes, ambiguity risk, and field-level restrictions, the description is comprehensive: it tells the agent how to select, what each selector can change, how ambiguity is handled, and how fasting changes are constrained. The presence of an output schema means the description does not need to explain return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds substantial cross-parameter meaning: which selectors permit which fields, how draw_id groups results, how date+marker resolves to a single row, when panel_name narrows the selection, and the exact fasting_status allowed values. This is far beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update one or more fields on an existing lab result.' It positions the tool as the correction path for already-logged results, most often the collection date, which clearly sets it apart from logging, deleting, or listing lab results among the sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this tool when the user wants to correct an already logged result, gives detailed selector guidance, and instructs the agent to send only changed fields. It does not explicitly name log_lab_results or delete_lab_result as alternatives, but the 'correct a result already logged' framing makes the intended use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mealA
Destructive
Inspect

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.

  1. ADD SAVED FOOD -> add_recipe_name. "add my usual kombucha to breakfast", "add the protein shake I saved to lunch". Do NOT use log_meal for this, that logs a second, separate meal. Additive: the recipe's food text is appended to the meal's existing food_items and each of its macros is ADDED to the meal's current value for that field, so the result is both foods together with both foods' calories, not a replacement. Matched the same way as log_meal's recipe_name (case-insensitive exact title, then substring); no match or more than one substring match throws an error naming the candidates or the user's saved titles instead of guessing. If the matched recipe has no stored value for one of calories/protein_g/fat_g/carbs_g, this throws carrying the recipe's food text: estimate just the missing field(s) and call again with the same id (or date+name) and add_recipe_name plus those field(s) set explicitly. An explicit field passed alongside add_recipe_name takes the recipe's place for that one field and is still ADDED to the meal; it does not overwrite the meal's total the way it does without add_recipe_name.

  2. ADD UNSAVED FOOD -> add_food_items. "add a banana to my breakfast", "I also had a small coffee", where the extra food is not one of the user's saved recipes. Pass the new food's own description plus calories/protein_g/fat_g/carbs_g estimated for JUST that new food, not the meal's new total and not the existing food's macros. All four are required whenever add_food_items is set (there is no recipe to fall back on): estimate them from the description, never ask the user. Additive exactly like add_recipe_name: add_food_items is appended to the existing food_items (unless food_items is ALSO passed explicitly, which replaces the description outright instead of appending) and each macro is ADDED to the meal's current value; alcohol_g is optional and adds nothing when omitted. Set both add_recipe_name and add_food_items in one call to add a saved recipe and separate ad-hoc food together; when both are set, calories/protein_g/fat_g/carbs_g/alcohol_g are read as add_food_items's own macros only, and the recipe always contributes its own stored values.

  3. CORRECT A VALUE -> plain fields, both add_* unset. "that was 400 calories, not 600", "actually it was just eggs, no toast", "make it 500 calories": the meal's stored total needs to become a specific NEW number, not grow. Each of food_items/calories/protein_g/fat_g/carbs_g/alcohol_g you pass REPLACES the meal's current value for that field outright, so send the corrected TOTAL for that field, never an amount to add.

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.

SATURATED FAT / FIBER: saturated_fat_g and fiber_g follow the same REPLACE-vs-ADD rule as the other macros above (REPLACE the meal's total in mode 3, or ADD as the new component's own value in an add_recipe_name/add_food_items fold), but are always optional and never fabricated -- see log_meal's SATURATED FAT / FIBER for when to populate them. A saved recipe never carries these two fields, so folding one in (add_recipe_name, without an explicit override) never changes the meal's own stored value for them; it only marks the meal's existing total as covering less than the whole meal, since food was added without a known contribution.

If add-vs-correct intent is ambiguous, ask before updating.

MOVE TO A DIFFERENT DATE -> move_to_date. "move Tuesday's lunch to Wednesday": date/name/target_meal_type only SELECT which meal to update; they never move it. Set move_to_date to actually change the stored date, keeping the same id.

REMOVE ONE ADDED COMPONENT -> remove_item_name. Only works for a component previously added via add_recipe_name or add_food_items on THIS meal (it needs to know that component's exact recorded macros to subtract). If the meal has no such recorded component, this throws telling you to use mode 3 with corrected totals instead.

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.

CAFFEINE / DRINKS WHEN UPDATING: keep the two sidecars explicit in the same update_meal call. fluids is the hydration side and caffeine is the caffeine side; when a drink change affects both, send both. Omit either one when that side is unchanged so existing linked data is preserved. When ADDING caffeinated food/drink with add_food_items/add_recipe_name, caffeine contains only the new dose(s) and they are appended. When CORRECTING the meal's caffeine with both add_* fields omitted, caffeine is the complete corrected dose list and replaces linked caffeine only after replacement rows have been safely inserted. If the correction removes every caffeine dose, explicitly send caffeine: []. Each retained/new dose needs caffeine_mg and may optionally include source_type; its date follows the meal date.

SAVE AS RECIPE: when the user asks to save an already-logged meal as a reusable recipe, set save_as_recipe=true. This may be the only requested action: identify the real meal with id or the normal selectors and do not invent a food or macro edit. A follow-up like "save that as a recipe" after a successful log should use the known meal id plus save_as_recipe=true. Do not tell the user recipes cannot be saved from chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoMeal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above.
dateNoDate the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted. This only SELECTS which meal to update -- see move_to_date below to actually change a meal's stored date.
nameNoSubstring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted.
fat_gNoUpdated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items.
fluidsNoOptional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking.
carbs_gNoUpdated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items.
fiber_gNoUpdated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above.
caffeineNoOptional caffeine doses in this intake. Keep each dose simple: caffeine amount is required and type is optional. The dose date follows the intake/meal date. If the user gave exact milligrams, preserve them exactly; otherwise estimate from the described food or drink.
caloriesNoUpdated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on.
alcohol_gNoUpdated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing.
meal_typeNoUpdated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written.
protein_gNoUpdated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items.
food_itemsNoUpdated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text.
move_to_dateNoMove this meal to a different date. Format: YYYY-MM-DD. Distinct from date above, which only finds the meal; this is what actually changes it, keeping the same id. Optional, omit if not moving the meal.
add_food_itemsNoOptional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. "a banana", "small coffee with cream" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above.
save_as_recipeNoTrue only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.
add_recipe_nameNoOptional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. "kombucha", "protein shake" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above.
saturated_fat_gNoUpdated saturated fat in grams. Optional, see SATURATED FAT / FIBER above.
remove_item_nameNoName or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal.
target_meal_typeNoWhich meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- "update today's breakfast" is target_meal_type: "Breakfast". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, and the description substantiates that with concrete behavioral consequences: mode 3 replaces whole totals and 'throws away what was already logged' if misapplied, additive modes fold values, remove_item_name throws when no recorded component exists, and hydration sidecars are replaced only after safe insertion. This is far beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core intent and sibling routing, and organized with clear headers (FIND THE MEAL, THREE MODES, etc.). It is long, but for a 20-parameter tool with irreversible replace/add semantics, the length is largely earned; a few sentences on saturated fat/fiber and caffeine could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 20 parameters, mutation semantics, a destructive annotation, and multiple coexisting modes, the description covers selection, all three update modes, date moves, component removal, hydration and caffeine sidecar handling, and recipe saving. An output schema exists, so return-value explanation is correctly omitted. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial semantic meaning beyond the schema: the REPLACE-vs-ADD rule per field, which fields are required only when add_food_items is set, the interplay when both add_recipe_name and add_food_items are set, and the distinction between target_meal_type (selector) versus meal_type (write). This is the rare case where prose meaningfully extends structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('Update an existing meal') and immediately distinguishes its scope from log_meal and delete_meal by naming the exact trigger conditions. It explicitly calls out that a plain food statement should route to log_meal, which prevents the most likely sibling confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('current message explicitly changes, corrects, or adds to a meal already logged'), when-not-to-use ('Never infer an update from earlier chat history'), and names the alternative tool (log_meal) with the precise disambiguating condition. It also covers in-tool mode selection and the ambiguity fallback ('ask before updating').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_recovery_sessionA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecovery session ID. Alternative to session_date.
dateNoUpdated date (YYYY-MM-DD). Optional.
notesNoUpdated notes. Optional.
qualityNoUpdated quality 1-5. Optional.
skippedNoUpdated skipped status. Optional.
categoryNoUpdated category. Optional.
strategy_idNoUpdated strategy ID. Optional — set null to unlink.
session_dateNoAlternative to id: the date (YYYY-MM-DD) the session was logged on. Optionally narrow with session_category.
strategy_nameNoUpdated practice name. Optional.
duration_minutesNoUpdated duration in minutes. Optional.
session_categoryNoOptional, narrows session_date to one category when more than one session shares that date. Ignored when id is given.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly=false, idempotent=true, destructive=false), the description reveals selector resolution behavior: exactly one of id or session_date is needed, session_category can narrow the match, and ambiguity errors with candidate IDs for retry. This is valuable behavioral context an agent would otherwise infer only from failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly scoped paragraphs: the first gives the use case and patch style, the second the selector contract. It is front-loaded with the actionable verb and includes an example list without bloat. Every sentence contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter update tool with an output schema available, the description covers the purpose, patch semantics, selector requirements, disambiguation, and error behavior. The only small omission is an explicit 'do not pass both id and session_date' rule, but the 'or' selector language makes that sufficiently clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents all 11 parameters (100% coverage), the description adds critical relational semantics: the exact-one-of id/session_date selector rule, optional narrowing by session_category, that session_category is ignored when id is supplied, and the patch-style 'omit unchanged fields' convention. These relationships are absent from the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and object: 'Update one or more fields on an existing recovery session log entry.' It distinguishes from related siblings like log_recovery_session and delete_recovery_session by emphasizing 'existing' and 'already logged,' and lists concrete fields (duration, quality, category, notes) that make the scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: when the user wants to correct or change something already logged, and it gives updating guidance ('Only send the fields that need to change'). It does not name alternatives such as log_recovery_session for new entries, but the 'existing'/'already logged' framing and examples supply clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_wellbeingA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoWellbeing entry ID. Alternative to date.
dateNoAlternative to id: a date (YYYY-MM-DD) that falls within the entry's period. Resolves only when exactly one entry matches.
moodNoUpdated mood 1-10. Optional.
notesNoUpdated notes (replaces existing). Optional.
energyNoUpdated energy 1-10. Optional.
stressNoUpdated stress 1-10. Optional.
sorenessNoUpdated soreness 1-10. Optional.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly false, idempotent, non-destructive), the description discloses that only provided fields are updated and omitted fields remain unchanged, and that ambiguous date matches cause an error with candidate IDs. This gives the agent accurate expectations about partial updates and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs with no filler: the operation is stated first, then the selector rule. Every sentence carries necessary information for correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all non-obvious invocation logic (selector requirement, ambiguity handling, partial update behavior). With the output schema present and annotations covering safety/idempotence, nothing essential is missing for an agent to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents all 7 parameters at 100% coverage, the description adds the crucial constraint that exactly one of id/date is required and explains the resolution error behavior. It also clarifies partial update semantics that apply to the optional fields, which the schema alone does not state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Update') and resource ('existing wellbeing entry'), making the operation unambiguous. The word 'existing' implies modification rather than creation, separating it from log_wellbeing, though it does not explicitly name sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit invocation conditions: exactly one of id or date is required, with a fallback rule for dates that match multiple entries. It does not explicitly contrast against create/delete alternatives, but the context for when to use this update tool is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_workoutA
Destructive
Inspect

UNIT INPUTS: never convert units yourself. For each canonical field below, pass the user's number exactly as stated when it is already in the canonical unit; when they gave the alternate unit instead, pass the same number unconverted and set the matching companion field so the tool converts once before storage. Omit the companion when the number is already canonical. This overrides any wording that asks you to do the arithmetic.

  • _lb fields: lb, or kg with input_weight_unit set.

  • _mi fields: mi, or km with input_distance_unit set.

  • _in fields: in, or cm with input_length_unit set.

  • _stated_g fields: g, or oz with input_mass_unit set.

  • _stated_ml fields: ml, or fl_oz with input_volume_unit set.

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:

  • Metadata: date, focus_type, location, notes, rpe, heart_points_moderate/peak.

  • set_updates: patch reps/load/bodyweight/notes/equipment on a set, addressed by set_id OR by exercise_name + set_position (1-based, matches get_workout's "Set N"). Use clear_weight=true when a stored load is wrong but the real external load is unknown; use is_bodyweight=true when the corrected set was genuinely bodyweight.

  • remove_sets: delete sets, same set_id-or-exercise_name+set_position addressing; remaining sets renumber; an emptied exercise/slot is removed automatically.

  • rename_exercises: renames every set of an exercise in place (preserves set IDs, RPE, notes; rebuilds NSI), never remove + add.

  • remove_exercises: deletes all sets for named exercises; empty slots removed automatically.

  • add_exercises: new exercises with sets; to_superset_slot joins an existing slot, omit for standalone.

  • move_exercises: reassigns an exercise to a different slot; "new" makes it standalone. Use from_superset_slot from get_workout when the same exercise name appears in multiple slots.

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, saved_exercise_updates, and/or add_exercises. add_exercises keeps its normal payload shape; to_superset_slot accepts the Saved Workout slot label returned by get_workout or its SS1-style alias. For progression requests, inspect real exercise history first rather than applying a deterministic formula.

WORKOUT CORRECTIONS:

  • PATCH ONLY: send only fields the user explicitly asked to change. Never restate current date/focus/location/RPE just because you read them; every supplied metadata field overwrites stored data.

  • Never invent IDs. Use session_id only when a workout tool returned it; otherwise omit it and use session_date + name. session_id must be > 0.

  • Cardio totals are first-class update fields: distance_mi/distance_km/distance_meters, duration_sec, calories. Never put corrected totals only in notes.

  • add_sets adds sets to an exercise already in the workout. Use it instead of add_exercises when the exercise already exists.

  • If the same exercise name appears in multiple superset slots, rename/remove/move without a source slot is rejected instead of touching every occurrence. For a move, pass from_superset_slot from get_workout.

ParametersJSON Schema
NameRequiredDescriptionDefault
rpeNoSession RPE, 1-10, half steps allowed: 5 moderate, 7 hard, 9 one rep left, 10 failure. Infer from comments about overall difficulty, or omit.
dateNoNew session date, YYYY-MM-DD.
nameNoSubstring of the focus/type, e.g. "Push", case-insensitive, to pick between sessions on session_date. Only without session_id.
notesNoNew session notes.
add_setsNoAdd one or more sets to an exercise already present in this workout. Use add_exercises only for a brand-new exercise.
caloriesNoCorrected session calories when known.
locationNoNew location, e.g. Gym, Home.
focus_typeNoNew category, e.g. Push, Pull, Legs.
session_idNoPositive session ID returned by a workout tool. If unknown, omit and use session_date + name; never guess.
distance_kmNoCorrected session distance in kilometers. Server converts it; do not convert it yourself.
distance_miNoCorrected session distance in miles. Use only when the user gave miles. In mi, or km with input_distance_unit set. See UNIT INPUTS.
remove_setsNoSets to delete. See OPERATIONS above.
set_updatesNoIndividual set corrections.
duration_secNoCorrected total session duration in seconds.
session_dateNoYYYY-MM-DD, defaults to today. Finds the session when session_id is omitted. Distinct from `date`, which CHANGES the stored date.
add_exercisesNoNew exercises to add. Call list_exercises first for canonical names.
move_exercisesNoMove exercises between superset slots. When the same exercise name appears in multiple slots, from_superset_slot is required.
distance_metersNoCorrected session distance in meters. Server converts it; do not convert it yourself.
remove_exercisesNoExercises to remove; matched sets deleted, empty slots removed automatically. See SUPERSET SLOTS above.
rename_exercisesNoRename logged exercises in place.
saved_workout_idNoSaved Workout ID to update instead of a completed workout session.
heart_points_peakNoNew peak heart points.
input_distance_unitNoSet to km when the user gave km for the _mi fields in this object. Omit when they are already mi.
saved_workout_titleNoOptional new title for the Saved Workout.
heart_points_moderateNoNew moderate heart points.
saved_exercise_updatesNoOptional prescription edits matched first by exact Saved Workout exercise name, then by a unique canonical library match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesHuman-readable result text returned by the tool.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool destructive and non-read-only, but the description adds substantial behavioral context: remove_sets renumber remaining sets, emptied slots are removed automatically, rename preserves set IDs/RPE/notes, ambiguous matches error instead of guessing, and updates are PATCH-only so supplied fields overwrite stored data. These are exactly the behavioral traits an agent needs beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool is genuinely complex with 26 parameters and many operations. It is well structured with labeled sections (UNIT INPUTS, OPERATIONS, SUPERSET SLOTS, LITERAL NAME, EQUIPMENT, SAVED WORKOUTS, WORKOUT CORRECTIONS) and front-loads the unit-conversion override because it is the most critical rule. Some repetition of warnings like 'never guess' exists, but it is defensible given the destructive stakes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 26-parameter mutation tool, the description is remarkably complete: it covers session identification, all operation types, set addressing, unit handling, ambiguous-name handling, saved workouts, patch-only behavior, and when to consult get_workout and list_exercises. Since an output schema exists, not explaining return values in the description is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema description coverage, the description adds significant meaning: the UNIT INPUTS protocol with companion fields, set addressing via set_id or exercise_name+set_position, clear_weight versus is_bodyweight, superset_slot disambiguation, literal_name behavior, and the equipment load-basis consequences. This goes far beyond the schema's per-parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Update a workout session: correct metadata, fix set values, rename/add/remove exercises or individual sets, or move exercises between supersets.' This clearly distinguishes update_workout from log_workout (creation) and delete_workout (destruction), and the sibling list confirms the differentiation is effective.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use for any post-log correction,' giving a clear when-to-use boundary. It also directs agents to get_workout for full detail and list_exercises before adding/renaming, and explains the saved_workout_id path for editing reusable workouts instead of completed history. The companion-tool references make the usage context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_app_guide_section1 field changed
      • changedInput schema / properties / topic / description
        Previous value: -"Choose the narrowest relevant area. pages_dashboard = Dashboard, Me, Settings, AI Assistants. pages_training = Fitness, workouts, running, heart, recovery. pages_nutrition = nutrition, hydration, sleep, body, wellbeing, labs. personas = AI specialists. logging = ways to log/correct data. photos = meal photos, labels, barcodes. wearables = integrations, connection requirements, known provider limits. metrics = user-facing metric meanings. goals = goals/targets. challenges = friend challenges. privacy = account controls/policy links. sync_details = permissions, history, missing-data behavior. troubleshooting = unexpected behavior/recovery. pricing = approved pricing copy."New value: +"Choose the narrowest relevant area. pages_dashboard = Dashboard, Me, Settings, AI Assistants. pages_training = Fitness, workouts, running, cycling, heart, recovery. pages_nutrition = nutrition, hydration, caffeine, sleep, body, wellbeing, labs. personas = AI specialists. logging = ways to log/correct data. photos = meal photos, labels, barcodes. wearables = integrations, connection requirements, known provider limits. metrics = user-facing metric meanings. goals = goals/targets. challenges = friend challenges. privacy = account controls/policy links. sync_details = permissions, history, missing-data behavior. troubleshooting = unexpected behavior/recovery. pricing = approved pricing copy."
  2. 1 tool update
    • Changedupdate_workout2 fields changed
      • changedInput schema / properties / saved_exercise_updates / description
        Previous value: -"Optional prescription edits matched by exercise name inside the Saved Workout."New value: +"Optional prescription edits matched first by exact Saved Workout exercise name, then by a unique canonical library match."
      • changedInput schema / properties / saved_exercise_updates / items / properties / name / description
        Previous value: -"Exercise name in the Saved Workout. Required."New value: +"Exercise name. Exact Saved Workout name preferred; a unique canonical library name is also accepted. Required."
  3. 3 tool updates
    • Changeddelete_lab_result1 field changed
      • changedInput schema / properties / draw_id / description
        Previous value: -"Draw ID grouping a set of results from one visit. Deletes every result in that draw, unambiguous by construction. Alternative to id/date. Ignored when id is given."New value: +"Opaque label of your choosing grouping a set of results from one visit, normalized server-side. Deletes every result sharing that label, unambiguous by construction. Alternative to id/date. Ignored when id is given."
    • Changedlog_lab_results1 field changed
      • changedInput schema / properties / results / items / properties / draw_id / description
        Previous value: -"Groups this marker with others from the same draw. See FASTING above. Optional."New value: +"Opaque label of your choosing to group this marker with others from the same draw, normalized server-side. See FASTING above. Optional."
    • Changedupdate_lab_result1 field changed
      • changedInput schema / properties / draw_id / description
        Previous value: -"Draw ID grouping a set of results from one visit. Selects every result in that draw, unambiguous by construction. Alternative to id/date. Ignored when id is given."New value: +"Opaque label of your choosing grouping a set of results from one visit, normalized server-side. Selects every result sharing that label, unambiguous by construction. Alternative to id/date. Ignored when id is given."
  4. 1 tool update
    • Changedlist_runs3 fields changed
      • changedInput schema / properties / end_date / description
        Previous value: -"End of date range. Format: YYYY-MM-DD. Optional — defaults to today."New value: +"End of date range. Format: YYYY-MM-DD. Optional. Defaults to today."
      • addedInput schema / properties / run_id
        Added value: +{
        +  "description": "Specific run UUID. When provided, returns the full saved run including splits and structured segments and ignores the date range.",
        +  "type": "string"
        +}
      • changedInput schema / properties / start_date / description
        Previous value: -"Start of date range. Format: YYYY-MM-DD. Optional — defaults to 7 days ago."New value: +"Start of date range. Format: YYYY-MM-DD. Optional. Defaults to 7 days ago."
  5. 1 tool update
    • Changedlog_body_metrics1 field changed
      • changedInput schema / properties / weight_lb / description
        Previous value: -"Body weight. In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Body weight in pounds, between 50 and 700. Convert from kilograms if the user spoke in kg (kg x 2.2046). In lb, or kg with input_weight_unit set. See UNIT INPUTS."
  6. 1 tool update
    • Changedupdate_meal1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Meal ID only if it came from a real meal/tool result; never invent or guess it. Otherwise omit it and use date + name/target_meal_type, see FIND THE MEAL above."New value: +"Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above."
  7. 2 tool updates
    • Changedlog_meal1 field changed
      • removedInput schema / properties / recipe_multiplier
        Removed value: -{
        -  "description": "Positive serving multiplier for recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
        -  "type": "number"
        -}
    • Changedupdate_meal14 fields changed
      • changedInput schema / properties / add_food_items / description
        Previous value: -"Optional. Description of food to ADD to this meal that is not a saved recipe. Requires calories/protein_g/fat_g/carbs_g for just this new food."New value: +"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."
      • removedInput schema / properties / add_recipe_multiplier
        Removed value: -{
        -  "description": "Positive serving multiplier for add_recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
        -  "type": "number"
        -}
      • changedInput schema / properties / add_recipe_name / description
        Previous value: -"Optional. Name or close phrase for one saved recipe to FOLD INTO this meal. Adds the recipe food and stored macros; distinct from log_meal recipe_name."New value: +"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."
      • changedInput schema / properties / alcohol_g / description
        Previous value: -"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories, optional for additions."New value: +"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."
      • changedInput schema / properties / calories / description
        Previous value: -"Updated total calories (kcal). REPLACES unless an add_* field is present, then it is the amount for the applicable new contribution."New value: +"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."
      • changedInput schema / properties / carbs_g / description
        Previous value: -"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
      • changedInput schema / properties / fat_g / description
        Previous value: -"Updated fat in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
      • changedInput schema / properties / fiber_g / description
        Previous value: -"Updated dietary fiber in grams. Optional."New value: +"Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above."
      • changedInput schema / properties / food_items / description
        Previous value: -"Updated food description. Optional, omit if not changing. Without add_* it REPLACES; with add_* it overrides the appended description."New value: +"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."
      • changedInput schema / properties / meal_type / description
        Previous value: -"Updated meal type to WRITE onto the meal. Optional, omit if not changing. Never inferred from add_recipe_name."New value: +"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."
      • changedInput schema / properties / protein_g / description
        Previous value: -"Updated protein in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
      • changedInput schema / properties / remove_item_name / description
        Previous value: -"Name or substring of a previously-added component to remove from this meal. Exclusive of every other field below; only selectors may accompany it."New value: +"Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal."
      • changedInput schema / properties / saturated_fat_g / description
        Previous value: -"Updated saturated fat in grams. Optional."New value: +"Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above."
      • changedInput schema / properties / target_meal_type / description
        Previous value: -"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day. This is NEVER written to the meal; it only narrows the search. Distinct from meal_type below, which SETS the new type."New value: +"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- \"update today's breakfast\" is target_meal_type: \"Breakfast\". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match."
  8. 4 tool updates
    • Changedlog_meal1 field changed
      • addedInput schema / properties / recipe_multiplier
        Added value: +{
        +  "description": "Positive serving multiplier for recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
        +  "type": "number"
        +}
    • Changedlog_workout3 fields changed
      • changedInput schema / properties / exercises / items / properties / sets / items / properties / is_bodyweight / description
        Previous value: -"True if no external weight. Infer for pull-ups, push-ups, dips."New value: +"True only when genuinely bodyweight. Omit when external load is unknown; existing equipment inference handles obvious bodyweight movements."
      • addedInput schema / properties / exercises / items / properties / sets / items / properties / load_unknown
        Added value: +{
        +  "description": "True only when the user explicitly says this set load is unknown, not remembered, or should be saved without it. Never infer this or use it to replace a known load.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / exercises / items / properties / sets / items / properties / weight_lb / description
        Previous value: -"Load. For a band, the band label weight (e.g. 80 for an 80lb band). Omit for bodyweight. In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Load. For a band, the band label weight (e.g. 80 for an 80lb band). Omit when unknown or bodyweight; never invent it. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
    • Changedupdate_meal14 fields changed
      • changedInput schema / properties / add_food_items / description
        Previous value: -"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."New value: +"Optional. Description of food to ADD to this meal that is not a saved recipe. Requires calories/protein_g/fat_g/carbs_g for just this new food."
      • addedInput schema / properties / add_recipe_multiplier
        Added value: +{
        +  "description": "Positive serving multiplier for add_recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
        +  "type": "number"
        +}
      • changedInput schema / properties / add_recipe_name / description
        Previous value: -"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."New value: +"Optional. Name or close phrase for one saved recipe to FOLD INTO this meal. Adds the recipe food and stored macros; distinct from log_meal recipe_name."
      • changedInput schema / properties / alcohol_g / description
        Previous value: -"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."New value: +"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories, optional for additions."
      • changedInput schema / properties / calories / description
        Previous value: -"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."New value: +"Updated total calories (kcal). REPLACES unless an add_* field is present, then it is the amount for the applicable new contribution."
      • changedInput schema / properties / carbs_g / description
        Previous value: -"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories."
      • changedInput schema / properties / fat_g / description
        Previous value: -"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated fat in grams. Same REPLACE-vs-ADD rule as calories."
      • changedInput schema / properties / fiber_g / description
        Previous value: -"Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated dietary fiber in grams. Optional."
      • changedInput schema / properties / food_items / description
        Previous value: -"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."New value: +"Updated food description. Optional, omit if not changing. Without add_* it REPLACES; with add_* it overrides the appended description."
      • changedInput schema / properties / meal_type / description
        Previous value: -"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."New value: +"Updated meal type to WRITE onto the meal. Optional, omit if not changing. Never inferred from add_recipe_name."
      • changedInput schema / properties / protein_g / description
        Previous value: -"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated protein in grams. Same REPLACE-vs-ADD rule as calories."
      • changedInput schema / properties / remove_item_name / description
        Previous value: -"Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal."New value: +"Name or substring of a previously-added component to remove from this meal. Exclusive of every other field below; only selectors may accompany it."
      • changedInput schema / properties / saturated_fat_g / description
        Previous value: -"Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated saturated fat in grams. Optional."
      • changedInput schema / properties / target_meal_type / description
        Previous value: -"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- \"update today's breakfast\" is target_meal_type: \"Breakfast\". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match."New value: +"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day. This is NEVER written to the meal; it only narrows the search. Distinct from meal_type below, which SETS the new type."
    • Changedupdate_workout5 fields changed
      • changedInput schema / properties / add_exercises / items / properties / sets / items / properties / is_bodyweight / description
        Previous value: -"True if no external weight."New value: +"True only when genuinely bodyweight. Omit when external load is unknown."
      • changedInput schema / properties / add_exercises / items / properties / sets / items / properties / weight_lb / description
        Previous value: -"Load. Omit for bodyweight. In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Load. Omit when unknown or bodyweight; never invent it. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
      • addedInput schema / properties / set_updates / items / properties / clear_weight
        Added value: +{
        +  "description": "True to clear a wrong stored external load while keeping this set non-bodyweight. Use is_bodyweight=true instead when the corrected set was bodyweight.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / set_updates / items / properties / is_bodyweight
        Added value: +{
        +  "description": "True to correct this set to bodyweight; clears stored external load/band state. False marks it non-bodyweight without inventing a load.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / set_updates / items / properties / weight_lb / description
        Previous value: -"Corrected load. In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Corrected external load. If the stored load is wrong and the real load is unknown, use clear_weight=true instead of inventing a number. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
  9. 5 tool updates
    • Changeddelete_lab_result4 fields changed
      • changedInput schema / properties / date / description
        Previous value: -"Collection date of the draw to delete. Format: YYYY-MM-DD. Deletes every result from that draw, or (with marker) one row. Alternative to id."New value: +"Collection date of the draw to delete. Format: YYYY-MM-DD. Deletes every result from that draw (see AMBIGUITY above), or (with marker) one row. Alternative to id/draw_id."
      • addedInput schema / properties / draw_id
        Added value: +{
        +  "description": "Draw ID grouping a set of results from one visit. Deletes every result in that draw, unambiguous by construction. Alternative to id/date. Ignored when id is given.",
        +  "type": "string"
        +}
      • changedInput schema / properties / id / description
        Previous value: -"Lab result ID. Deletes a single marker row. Alternative to date."New value: +"Lab result ID. Deletes a single marker row. Alternative to date/draw_id."
      • changedInput schema / properties / marker / description
        Previous value: -"Optional with date: marker-name substring, case-insensitive (e.g. \"LDL\"), narrowing the date selector to delete a single marker row instead of the whole draw. Ignored when id is given."New value: +"Optional with date: marker-name substring, case-insensitive (e.g. \"LDL\"), narrowing the date selector to delete a single marker row instead of the whole draw. Ignored when id or draw_id is given."
    • Changedlog_lab_results3 fields changed
      • addedInput schema / properties / results / items / properties / draw_id
        Added value: +{
        +  "description": "Groups this marker with others from the same draw. See FASTING above. Optional.",
        +  "type": "string"
        +}
      • addedInput schema / properties / results / items / properties / fasting_status
        Added value: +{
        +  "description": "See FASTING above. Optional, omit to leave unknown.",
        +  "enum": [
        +    "fasting",
        +    "non_fasting",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / results / items / properties / report_date
        Added value: +{
        +  "description": "Report/result date, if stated separately from the collection date. Format: YYYY-MM-DD. See FASTING above. Optional.",
        +  "type": "string"
        +}
    • Changedlog_meal2 fields changed
      • addedInput schema / properties / fiber_g
        Added value: +{
        +  "description": "Dietary fiber in grams. Optional. See SATURATED FAT / FIBER above.",
        +  "type": "number"
        +}
      • addedInput schema / properties / saturated_fat_g
        Added value: +{
        +  "description": "Saturated fat in grams. Optional. See SATURATED FAT / FIBER above.",
        +  "type": "number"
        +}
    • Changedupdate_lab_result6 fields changed
      • changedInput schema / properties / date / description
        Previous value: -"Collection date of the draw to update. Format: YYYY-MM-DD. Selects every result from that draw, or (with marker) one row. Alternative to id."New value: +"Collection date of the draw to update. Format: YYYY-MM-DD. Selects every result from that draw (see AMBIGUITY above), or (with marker) one row. Alternative to id/draw_id."
      • addedInput schema / properties / draw_id
        Added value: +{
        +  "description": "Draw ID grouping a set of results from one visit. Selects every result in that draw, unambiguous by construction. Alternative to id/date. Ignored when id is given.",
        +  "type": "string"
        +}
      • addedInput schema / properties / fasting_status
        Added value: +{
        +  "description": "New fasting status for the whole draw. See FASTING above. Optional, omit if not changing. Works with any selector.",
        +  "enum": [
        +    "fasting",
        +    "non_fasting",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / id / description
        Previous value: -"Lab result ID. Selects a single marker row. Alternative to date."New value: +"Lab result ID. Selects a single marker row. Alternative to date/draw_id."
      • changedInput schema / properties / marker / description
        Previous value: -"Optional with date: marker-name substring, case-insensitive (e.g. \"LDL\"), narrowing the date selector to a single marker row so per-marker fields can be edited without an id. Ignored when id is given."New value: +"Optional with date: marker-name substring, case-insensitive (e.g. \"LDL\"), narrowing the date selector to a single marker row so per-marker fields can be edited without an id. Ignored when id or draw_id is given."
      • addedInput schema / properties / report_date
        Added value: +{
        +  "description": "New report/result date, separate from the collection date. Format: YYYY-MM-DD. Optional, omit if not changing. Works with any selector.",
        +  "type": "string"
        +}
    • Changedupdate_meal2 fields changed
      • addedInput schema / properties / fiber_g
        Added value: +{
        +  "description": "Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above.",
        +  "type": "number"
        +}
      • addedInput schema / properties / saturated_fat_g
        Added value: +{
        +  "description": "Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above.",
        +  "type": "number"
        +}
  10. 3 tool updates
    • Changeddelete_workout2 fields changed
      • changedInput schema / properties / session_id / description
        Previous value: -"Session ID, if already known. Alternative to session_date + name — see FIND THE SESSION above."New value: +"Positive session ID returned by a workout tool. If unknown, omit it and use session_date + name; never guess."
      • addedInput schema / properties / session_id / minimum
        Added value: +1
    • Changedlog_workout6 fields changed
      • addedInput schema / properties / calories
        Added value: +{
        +  "description": "Session calories for simple cardio when supplied by the user/device.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / distance_km
        Added value: +{
        +  "description": "Session distance in kilometers. Server converts it to storage units; do not convert it yourself.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / distance_meters
        Added value: +{
        +  "description": "Session distance in meters. Server converts it to storage units; do not convert it yourself.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / distance_mi / description
        Previous value: -"Session distance in miles for simple cardio such as running, cycling/biking, or walking. Do not use for per-exercise loaded-carry distance. In mi, or km with input_distance_unit set. See UNIT INPUTS."New value: +"Session distance in miles for simple cardio. Use only when the user supplied miles. In mi, or km with input_distance_unit set. See UNIT INPUTS."
      • addedInput schema / properties / distance_mi / minimum
        Added value: +0
      • addedInput schema / properties / duration_sec / minimum
        Added value: +1
    • Changedupdate_workout11 fields changed
      • addedInput schema / properties / add_sets
        Added value: +{
        +  "description": "Add one or more sets to an exercise already present in this workout. Use add_exercises only for a brand-new exercise.",
        +  "items": {
        +    "properties": {
        +      "exercise_name": {
        +        "description": "Exact existing exercise name from get_workout.",
        +        "type": "string"
        +      },
        +      "sets": {
        +        "description": "New sets. Omitted values inherit from the exercise's current last set, so [{}] means add one more matching set.",
        +        "items": {
        +          "properties": {
        +            "band_label_lb": {
        +              "description": "In lb, or kg with input_weight_unit set. See UNIT INPUTS.",
        +              "minimum": 0,
        +              "type": "number"
        +            },
        +            "hold_length_sec": {
        +              "minimum": 1,
        +              "type": "integer"
        +            },
        +            "input_weight_unit": {
        +              "description": "Set to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb.",
        +              "enum": [
        +                "lb",
        +                "kg"
        +              ],
        +              "type": "string"
        +            },
        +            "is_band": {
        +              "type": "boolean"
        +            },
        +            "is_bodyweight": {
        +              "type": "boolean"
        +            },
        +            "notes": {
        +              "type": "string"
        +            },
        +            "reps": {
        +              "minimum": 1,
        +              "type": "integer"
        +            },
        +            "rpe": {
        +              "maximum": 10,
        +              "minimum": 1,
        +              "type": "number"
        +            },
        +            "weight_lb": {
        +              "description": "In lb, or kg with input_weight_unit set. See UNIT INPUTS.",
        +              "minimum": 0,
        +              "type": "number"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "superset_slot": {
        +        "description": "Required only when this exercise name appears in more than one slot.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "exercise_name",
        +      "sets"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / calories
        Added value: +{
        +  "description": "Corrected session calories when known.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / distance_km
        Added value: +{
        +  "description": "Corrected session distance in kilometers. Server converts it; do not convert it yourself.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / distance_meters
        Added value: +{
        +  "description": "Corrected session distance in meters. Server converts it; do not convert it yourself.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / distance_mi
        Added value: +{
        +  "description": "Corrected session distance in miles. Use only when the user gave miles. In mi, or km with input_distance_unit set. See UNIT INPUTS.",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / duration_sec
        Added value: +{
        +  "description": "Corrected total session duration in seconds.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / input_distance_unit
        Added value: +{
        +  "description": "Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi.",
        +  "enum": [
        +    "mi",
        +    "km"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / move_exercises / description
        Previous value: -"Move exercises between superset slots."New value: +"Move exercises between superset slots. When the same exercise name appears in multiple slots, from_superset_slot is required."
      • addedInput schema / properties / move_exercises / items / properties / from_superset_slot
        Added value: +{
        +  "description": "Source slot from get_workout. Required when the exercise name appears in multiple slots.",
        +  "type": "string"
        +}
      • changedInput schema / properties / session_id / description
        Previous value: -"Session ID, if known. See FIND THE SESSION above."New value: +"Positive session ID returned by a workout tool. If unknown, omit and use session_date + name; never guess."
      • addedInput schema / properties / session_id / minimum
        Added value: +1
  11. 2 tool updates
    • Changedlog_meal1 field changed
      • addedInput schema / properties / save_as_recipe
        Added value: +{
        +  "description": "True only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.",
        +  "type": "boolean"
        +}
    • Changedupdate_meal1 field changed
      • addedInput schema / properties / save_as_recipe
        Added value: +{
        +  "description": "True only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.",
        +  "type": "boolean"
        +}
  12. 1 tool update
    • Changedupdate_meal1 field changed
      • changedInput schema / properties / id / description
        Previous value: -"Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above."New value: +"Meal ID only if it came from a real meal/tool result; never invent or guess it. Otherwise omit it and use date + name/target_meal_type, see FIND THE MEAL above."
  13. 2 tool updates
    • Changedlog_workout4 fields changed
      • addedInput schema / properties / exercises / items / properties / sets / items / properties / rpe / maximum
        Added value: +10
      • addedInput schema / properties / exercises / items / properties / sets / items / properties / rpe / minimum
        Added value: +1
      • addedInput schema / properties / rpe / maximum
        Added value: +10
      • addedInput schema / properties / rpe / minimum
        Added value: +1
    • Changedupdate_workout6 fields changed
      • addedInput schema / properties / add_exercises / items / properties / sets / items / properties / rpe / maximum
        Added value: +10
      • addedInput schema / properties / add_exercises / items / properties / sets / items / properties / rpe / minimum
        Added value: +1
      • addedInput schema / properties / rpe / maximum
        Added value: +10
      • addedInput schema / properties / rpe / minimum
        Added value: +1
      • addedInput schema / properties / set_updates / items / properties / rpe / maximum
        Added value: +10
      • addedInput schema / properties / set_updates / items / properties / rpe / minimum
        Added value: +1
  14. 1 tool update
    • Changedupdate_meal5 fields changed
      • changedInput schema / properties / add_food_items / description
        Previous value: -"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Mutually exclusive with add_recipe_name -- never set both; if adding a saved recipe and separate ad-hoc food, make two calls."New value: +"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."
      • changedInput schema / properties / add_recipe_name / description
        Previous value: -"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. Mutually exclusive with add_food_items -- never set both."New value: +"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."
      • changedInput schema / properties / date / description
        Previous value: -"Date the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted."New value: +"Date the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted. This only SELECTS which meal to update -- see move_to_date below to actually change a meal's stored date."
      • addedInput schema / properties / move_to_date
        Added value: +{
        +  "description": "Move this meal to a different date. Format: YYYY-MM-DD. Distinct from date above, which only finds the meal; this is what actually changes it, keeping the same id. Optional, omit if not moving the meal.",
        +  "type": "string"
        +}
      • addedInput schema / properties / remove_item_name
        Added value: +{
        +  "description": "Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal.",
        +  "type": "string"
        +}
  15. 1 tool update
    • Changedget_app_guide_section2 fields changed
      • changedInput schema / properties / topic / description
        Previous value: -"Choose one general help area. pages_dashboard = Dashboard, Me, Settings, Fit Score, Insights. pages_training = Fitness, Train, PRs, running, heart, recovery, injuries. pages_nutrition = Fuel, Nutrition, sleep, body, wellbeing, cycle, labs. personas = AI specialists. logging = ways to log or edit data. photos = meal photos, labels, barcodes. wearables = connected health sources and AI assistants. goals = goals and standard targets. challenges = friend challenges. privacy = account controls and links to posted policies only. troubleshooting = common navigation and recovery steps. pricing = the two approved product pricing messages plus the subscription link."New value: +"Choose the narrowest relevant area. pages_dashboard = Dashboard, Me, Settings, AI Assistants. pages_training = Fitness, workouts, running, heart, recovery. pages_nutrition = nutrition, hydration, sleep, body, wellbeing, labs. personas = AI specialists. logging = ways to log/correct data. photos = meal photos, labels, barcodes. wearables = integrations, connection requirements, known provider limits. metrics = user-facing metric meanings. goals = goals/targets. challenges = friend challenges. privacy = account controls/policy links. sync_details = permissions, history, missing-data behavior. troubleshooting = unexpected behavior/recovery. pricing = approved pricing copy."
      • changedInput schema / properties / topic / enum
        Previous value: -[
        -  "pages_dashboard",
        -  "pages_training",
        -  "pages_nutrition",
        -  "personas",
        -  "logging",
        -  "photos",
        -  "wearables",
        -  "goals",
        -  "challenges",
        -  "privacy",
        -  "troubleshooting",
        -  "pricing"
        -]New value: +[
        +  "pages_dashboard",
        +  "pages_training",
        +  "pages_nutrition",
        +  "personas",
        +  "logging",
        +  "photos",
        +  "wearables",
        +  "metrics",
        +  "goals",
        +  "challenges",
        +  "privacy",
        +  "sync_details",
        +  "troubleshooting",
        +  "pricing"
        +]
  16. 2 tool updates
    • Changedlog_meal2 fields changed
      • changedInput schema / properties / fluids / items / properties / beverage_type / description
        Previous value: -"Broad drink type. Default water. Use other when the exact drink is not in the enum and preserve its name in beverage_name."New value: +"Broad drink type. Default water. Energy drinks are accepted and stored as other; preserve the exact drink in beverage_name."
      • changedInput schema / properties / fluids / items / properties / beverage_type / enum
        Previous value: -[
        -  "water",
        -  "electrolyte",
        -  "sports_drink",
        -  "coffee",
        -  "tea",
        -  "juice",
        -  "milk",
        -  "soda",
        -  "broth",
        -  "other"
        -]New value: +[
        +  "water",
        +  "electrolyte",
        +  "sports_drink",
        +  "coffee",
        +  "tea",
        +  "juice",
        +  "milk",
        +  "soda",
        +  "broth",
        +  "other",
        +  "energy_drink"
        +]
    • Changedupdate_meal2 fields changed
      • changedInput schema / properties / fluids / items / properties / beverage_type / description
        Previous value: -"Broad drink type. Default water. Use other when the exact drink is not in the enum and preserve its name in beverage_name."New value: +"Broad drink type. Default water. Energy drinks are accepted and stored as other; preserve the exact drink in beverage_name."
      • changedInput schema / properties / fluids / items / properties / beverage_type / enum
        Previous value: -[
        -  "water",
        -  "electrolyte",
        -  "sports_drink",
        -  "coffee",
        -  "tea",
        -  "juice",
        -  "milk",
        -  "soda",
        -  "broth",
        -  "other"
        -]New value: +[
        +  "water",
        +  "electrolyte",
        +  "sports_drink",
        +  "coffee",
        +  "tea",
        +  "juice",
        +  "milk",
        +  "soda",
        +  "broth",
        +  "other",
        +  "energy_drink"
        +]
  17. 1 tool update
    • Changedlog_workout4 fields changed
      • addedInput schema / properties / distance_mi
        Added value: +{
        +  "description": "Session distance in miles for simple cardio such as running, cycling/biking, or walking. Do not use for per-exercise loaded-carry distance. In mi, or km with input_distance_unit set. See UNIT INPUTS.",
        +  "type": "number"
        +}
      • addedInput schema / properties / duration_sec
        Added value: +{
        +  "description": "Total session duration in seconds for simple cardio when known.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / input_distance_unit
        Added value: +{
        +  "description": "Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi.",
        +  "enum": [
        +    "mi",
        +    "km"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "date",
        -  "exercises"
        -]New value: +[
        +  "date"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.