Wellness Project MCP
This server is a hosted MCP backend for logging, reading, and analyzing personal health and fitness data across many domains, with a mix of CRUD tools and interactive chart widgets.
Nutrition & hydration: log, list, update, and delete meals; mark fast/forgot/unanswered days; track drink volumes and hydration events.
Workouts & strength training: log, list, view, update, and delete workouts; manage exercises, sets, supersets, RPE, equipment, heart points; track exercise progression, PRs, est. 1RM, and NSI scores; create and edit reusable Saved Workouts.
Wearable & vital data: log/list daily steps (supplemental), resting HR, HRV, Zone Minutes, VO2max, dietary calories, SpO₂, respiratory rate, skin/core temperature, blood pressure, blood glucose, and stress.
Body composition: log/list weight, body fat, lean/muscle/bone mass, circumferences, hydration %, visceral fat, and more; BMI derived automatically.
Sleep: log and list sleep duration, score, stages, bedtime, wake time, and awakenings.
Labs & biomarkers: browse LOINC-coded lab markers; log, list, update, and delete blood test results with flags, references ranges, and panels.
Injuries: log, list, update, and delete injuries with severity, status, side, and affected movements plus severity history.
Wellbeing: log, list, update, and delete subjective ratings for mood, energy, stress, and soreness over custom periods.
Supplements & medications: list and manage supplement/medication records, and mark them taken or missed for a date.
Recovery & mindfulness: manage recurring strategies (sauna, meditation, breathwork, etc.) and log/list/update/delete completed or skipped sessions.
Running: log or plan runs with distance, duration, splits, segments, HR, power, cadence, elevation, and run type; list runs with a runner-state summary; delete runs.
Rest days: mark, cancel, and list intentional rest days.
Goals: create, update, complete/pause/end/reopen/delete goals and standard targets for weight, strength, consistency, body composition, races, N=1 experiments, nutrition, steps, sleep, etc.
Cycle tracking: log, list, update, and delete menstrual period records.
Personal context memory: list and add/update durable user preferences/circumstances across conversations.
Interactive widgets: render rich MCP UI cards for health overview, Fit Score, workouts, nutrition, sleep, steps, body weight/composition, recovery, runs, exercise progression, meal diary, and wellbeing.
Other: search public blog posts and look up app guide/help sections (including pricing).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Wellness Project MCPWhat was my resting heart rate trend this quarter?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Wellness Project MCP
Bring connected health and fitness data into Claude, ChatGPT, Gemini Spark, Grok, Mistral, and other MCP clients. Wellness Project is a hosted Model Context Protocol server. Your devices and logs sync into one account, and supported assistants can read or update workouts, nutrition, sleep, recovery, body metrics, goals, labs, wellbeing, and more in plain English.
This repository is the public documentation and catalog for the hosted server. It is not a self-hosted backend and contains no private server implementation.
MCP endpoint:
https://wellnessproject.ai/api/mcp73 advertised public tools generated from the production tool registry
15 active interactive widgets for compatible MCP Apps UI clients
OAuth 2.1 authentication with Dynamic Client Registration
What you can ask
Once connected, ask naturally and the assistant can call the matching Wellness Project tool:
"How did my training look this week?"
"Show my sleep for the last month."
"How is my bench progressing?"
"Log today's lunch: chicken burrito bowl, about 700 calories."
"What was my resting heart rate trend vs my HRV this quarter?"
"How am I doing against my goals?"
"Log 16 ounces of water."
Read tools return your logged and synced health data. Write tools add, update, or delete entries when you ask. Widget tools can render structured interactive views instead of a wall of numbers.
Related MCP server: whoop-ai-mcp
Connect Wellness Project to an MCP client
First create an account at https://wellnessproject.ai and connect the health sources you want under Settings → Devices. Every client below uses the same hosted endpoint:
https://wellnessproject.ai/api/mcp
Authentication is handled by OAuth. Personal API keys are not part of the current public connection flow.
Claude
Open Claude on the web.
Go to Customize → Connectors → Add custom connector.
Paste
https://wellnessproject.ai/api/mcp.Leave Client ID and Client Secret blank if Claude shows those fields. Claude can register itself dynamically.
Sign in to Wellness Project and authorize the connection.
Claude Code
Claude Code installs Wellness Project as a plugin. The plugin carries nothing but this server's configuration and a setup skill.
/plugin marketplace add turnnoblindeye/wellness-project-mcp
/plugin install wellness-projectRestart Claude Code, then run /mcp, select wellness-project, and authorize.
There is no client ID, client secret, or API key to enter. Run
/wellness-project:setup if you would rather be walked through it.
ChatGPT
ChatGPT custom MCP apps use developer mode. Current OpenAI availability is plan-dependent: full MCP support including write/modify actions is available in beta for Business, Enterprise, and Edu, while Pro can connect MCPs with read/fetch permissions in developer mode.
Enable developer mode for your account or workspace as permitted by your ChatGPT plan.
Create a custom MCP app from ChatGPT's Apps settings.
Use
https://wellnessproject.ai/api/mcpas the remote MCP server.Complete the Wellness Project OAuth flow.
OpenAI's current setup and plan details: https://help.openai.com/en/articles/12584461
Gemini Spark
Custom MCP apps require Gemini Spark access and are added from the Gemini web app.
Go to https://gemini.google.com.
Open Settings & help → Connected Apps. If needed, open Personal Intelligence → Connected Apps first.
Under Custom apps for Spark, choose Add a custom app.
Enter
https://wellnessproject.ai/api/mcpand click Next.Complete the Wellness Project OAuth flow.
Google's current eligibility and availability rules: https://support.google.com/gemini/answer/17209137
Grok
Go to https://grok.com/connectors and choose New Connector → Custom.
Paste
https://wellnessproject.ai/api/mcp.Leave Client ID and Client Secret blank if those fields appear.
Complete the Wellness Project OAuth flow.
Grok connector availability may depend on your Grok plan.
Mistral Le Chat
In Le Chat, open Intelligence → Connectors → Add Connector → Custom MCP Connector.
Paste
https://wellnessproject.ai/api/mcp.Leave Client ID and Client Secret blank if those fields appear.
Complete the Wellness Project OAuth flow.
Workspace permissions may require an owner or admin to add a connector.
Demo
A short screen recording of the Wellness Project connector running inside ChatGPT:
Interactive widgets
Fifteen active tools render interactive views through the MCP Apps UI extension in compatible clients:
Ask | Widget tool |
"Give me a health overview" |
|
"How did my Fit Score look?" |
|
"Show my workouts" |
|
"Show that workout" |
|
"Show my macros" |
|
"Show my meal diary" |
|
"How's my sleep trending?" |
|
"Show last night's sleep" |
|
"Steps this week?" |
|
"My weight trend" |
|
"Show my body composition" |
|
"Recovery trend" |
|
"How's my running?" |
|
"How's my bench progressing?" |
|
"Show my wellbeing" |
|
Many trend widgets support multiple time ranges; detail widgets use the date or record relevant to the request.
Tool catalog
The complete production-generated list of 73 advertised public tools, grouped by domain, is in TOOLS.md. The machine-readable descriptions, annotations, and JSON Schemas are in catalog/tools.json.
Both files are generated from the same production tool registry used by tools/list. Admin-only tools and retired tools that remain callable only for older cached clients are not advertised in this catalog.
Do not edit the generated catalog by hand.
Data sources and integrations
Wellness Project combines native mobile health stores, direct integrations, relay sources, and manual/chat logging.
Source | Current support |
Apple Health | Native iOS health and fitness sync |
Google Health Connect | Native Android health and fitness sync |
Fitbit / Google Health | Activity, sleep, heart, workout, body, and nutrition data when available |
Oura | Sleep, readiness/recovery, heart, and activity data |
Withings | Body, sleep, activity, heart, blood pressure, and other supported health data |
Wyze | Supported Wyze health data |
Hevy | Strength workout history via direct integration |
Ultrahuman | Ring data and supported metabolic/CGM data |
Liftosaur | Strength workout history via direct integration |
Polar | Activity, sleep, recovery, heart, and training data |
WHOOP | Direct integration is rolling out behind availability gating |
Manual / chat | Workouts, meals, hydration, body metrics, labs, injuries, supplements, goals, wellbeing, and more |
Garmin, Samsung Health, Amazfit/Zepp, Coros, Wahoo, Strava, Peloton, smart scales, and other compatible sources can also reach Wellness Project through Apple Health or Health Connect when those services write the relevant data there.
Pricing and status
Pricing below reflects the current production configuration as of September 7, 2026. Local app-store pricing may vary.
Plan | Price | Status |
Free Basic | $0 | Logging and editing remain free; starting October 15, 2026, Free includes 3 analysis questions per day |
Founder Pro monthly | $4.99/month | Founder pricing through October 15, 2026 |
Founder Pro annual | $39.99/year | Founder pricing through October 15, 2026 |
Founder Lifetime | $199 one-time | Limited founder option, sunsetting |
Pro monthly | $9.99/month | Standard pricing |
Pro annual | $99.99/year | Standard pricing |
Privacy and auth
The public MCP endpoint uses OAuth 2.1; supported clients can register dynamically.
Every MCP request is scoped to the authenticated Wellness Project account.
Row-level security protects user-owned records in the data layer.
Connector access can be revoked without self-hosting or rotating a long-lived personal API key.
Wellness Project is informational software, not a medical product.
FAQ
Do I have to self-host anything?
No. https://wellnessproject.ai/api/mcp is the hosted production server. This GitHub repository publishes documentation and schemas only.
Does the same endpoint work across AI assistants?
Yes. Claude, eligible ChatGPT accounts/workspaces, Gemini Spark, Grok, Mistral, and other compatible remote MCP clients can use the same endpoint. Client-side MCP availability and permissions vary by product and plan.
Is Wellness Project free?
Free Basic is available. Paid Founder Pro and standard Pro plans add analysis capacity and other paid capabilities; current pricing is listed above.
Is my health data private?
MCP access requires an authenticated OAuth grant and each tool operates on the signed-in user's account. You can revoke connector access when you no longer want a client connected.
Related
Works with Wellness Project: https://wellnessproject.ai/works-with
Connect Apple Health to Claude: https://wellnessproject.ai/integrations/apple-health-to-claude
Fitbit MCP: https://wellnessproject.ai/integrations/fitbit-mcp
Claude integration: https://wellnessproject.ai/integrations/claude
ChatGPT integration: https://wellnessproject.ai/integrations/chatgpt
License
The tool catalog and schemas in this repository are published under the MIT License so MCP clients and directories can reference them freely. "Wellness Project" and the app itself remain the property of Wellness Project LLC. See NOTICE for the scope of the grant.
Available Tools
73 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The memory text: a compact, durable fact or preference with no conversational filler. | |
| memory_id | No | Required for update. The numeric id from list_personal_context. Omit for add. | |
| operation | Yes | add creates a new memory. update replaces the content of an existing one, identified by memory_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_dayADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The date to un-mark. Format: YYYY-MM-DD. Default: today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Create a new Wellness Project goal or standard target. Call this directly when the user wants to establish a goal; there is no schema-discovery or list_goals prerequisite. Available goal types and inputs come from the canonical Goals definitions.
This tool loads the user's current goals itself before writing, so do not call list_goals first: it reports what a standard target changed from, and refuses to stack a second goal on top of one that already covers the same thing, naming that goal's ID to use with update_goal. Infer the goal_type and canonical inputs from the request. Standard targets use target_value. Formal goal fields are described on the generated inputs.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Concise title, inferred from the goal inputs. | |
| weeks | No | For weight_loss. Duration in weeks when target_date is not supplied. For body_comp. Duration in weeks when target_date is not supplied. | |
| metric | No | For 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_name | No | For n1_experiment. Name for a new supplement when not using supplement_id. | |
| goal_type | Yes | Goal type to create. | |
| new_brand | No | For n1_experiment. Optional brand for a new supplement. | |
| race_date | No | For race. Race date in YYYY-MM-DD format. Required on create. | |
| start_date | No | YYYY-MM-DD. Default: today. | |
| start_value | No | For body_comp. Starting value when the goal begins. Required on create. Set at create, not editable later. | |
| target_date | No | For 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_window | No | For 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_lb | No | For 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_hours | No | For consistency. Nightly sleep target in hours. Required when metric is sleep_duration. | |
| target_value | No | For 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_name | No | For strength. Exercise name. Required on create. Set at create, not editable later. | |
| new_dose_unit | No | For n1_experiment. Dose unit for a new supplement. | |
| supplement_id | No | For n1_experiment. Existing supplement ID. Use either supplement_id or the new-supplement fields. | |
| target_1rm_lb | No | For strength. Target 1RM. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| new_dose_amount | No | For n1_experiment. Dose amount for a new supplement. | |
| start_weight_lb | No | For 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_week | No | For consistency. Target occurrences per week. Required on create. | |
| target_time_sec | No | For race. Target finish time in seconds. Required on create. | |
| target_weight_lb | No | For weight_loss. Target body weight. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| input_weight_unit | No | Set to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb. | |
| intervention_days | No | For n1_experiment. Intervention duration in days. | |
| baseline_direction | No | For n1_experiment. Use already logged previous 14 days or collect the next 14 days. | |
| target_distance_mi | No | For race. Target race distance. Required on create. In mi, or km with input_distance_unit set. See UNIT INPUTS. | |
| input_distance_unit | No | Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi. | |
| acknowledged_warnings | No | Warning keys the user explicitly acknowledged after a guarded create attempt. Omit otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, and the description aligns with a creating/writing operation. It additionally discloses behavioral details: the tool loads current goals itself, refuses to stack duplicate goals, reports what a standard target changed from, and supports acknowledged warnings. Minor gap: no explicit statement about persistence or side effects beyond creation, but annotations cover the general write nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three focused paragraphs and avoids unnecessary filler. It is slightly repetitive with the 'See UNIT INPUTS' references and the phrase 'Required on create / Set at create, not editable later', but these repetitions serve clarity in a large parameter surface and do not harm usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large number of parameters (29) and the existence of an output schema, the description does not need to explain every field individually; the schema handles that. It does provide important contextual guidance on unit conversion, duplicate prevention, and when to omit list_goals. A small gap is that it references 'canonical Goals definitions' without embedding them, but this is acceptable given the schema already enumerates valid goal_type values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter includes targeted descriptions referencing relevant goal types. The description also gives important cross-cutting semantics for unit fields (input_weight_unit/input_distance_unit) and clarifies required-on-create versus not-editable-later fields. This goes well beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new Wellness Project goal or standard target' and specifies when to call it directly. It names the primary action (create) and the resource (goal), 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: call directly when establishing a goal, no prerequisite schema discovery or list_goals call is needed. It also warns against calling list_goals first and explains the tool's built-in duplicate guard, which is actionable and relevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_cycleADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record ID. Alternative to date. | |
| date | No | Alternative 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
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_injuryADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Injury ID to delete. Alternative to injury. | |
| date | No | Optional, narrows the injury selector to one active on this date (YYYY-MM-DD). Ignored when id is given. | |
| injury | No | Alternative to id: body part or injury type substring, case-insensitive (e.g. "shoulder"). Optionally narrow with date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_resultADestructiveIdempotentInspect
Permanently delete one or more lab results. Use when the user explicitly asks to remove or delete a logged lab result. Never guess a selector.
SELECTOR, pass exactly one of id, date, or date+marker:
id: deletes a single marker's row.
date (optionally narrowed by panel_name): deletes every result from that draw at once. This is 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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Lab result ID. Deletes a single marker row. Alternative to date. | |
| date | No | 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. | |
| marker | No | 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. | |
| panel_name | No | Optional, narrows a date (or date+marker) selector to one panel within that draw (e.g. "Lipid Panel"). Ignored when id is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that date-scoped deletes are irreversible, can remove many rows at once, and require user confirmation. It also includes the strong guardrail 'Never guess a selector.' These behaviors are not inferable from readOnlyHint=false or destructiveHint=true alone, so the description adds substantial value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a bolded selector heading and bullet-like separators. Every sentence serves a purpose: defining the action, stating when to use it, warning about irreversibility, and explaining parameter combinations. The length is appropriate for the destructive and ambiguous nature of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 four optional parameters with complex interactions, the description fully covers what an agent needs: when to use it, how to choose selectors, what is irreversible, and when to confirm with the user. The output schema exists, so return-value documentation is not required. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description enriches the parameters by explaining the selector hierarchy: id deletes one row, date deletes the whole draw, and date+marker resolves to one row with error behavior if multiple markers match. It also clarifies that panel_name narrows date-based selectors and that marker is ignored when id is present—none of which the schema alone conveys as clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently delete one or more lab results,' which is a specific verb and resource. It also clarifies the exact use case ('when the user explicitly asks to remove or delete a logged lab result') and distinguishes itself from siblings by focusing on deletion rather than update or logging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 and provides detailed selection guidelines among id, date, and date+marker. It does not explicitly name alternatives like update_lab_result for non-destructive corrections, but the context is clear enough that an agent should not confuse this with other lab-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_mealADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Meal ID, if already known. Alternative to date + name — see FIND THE MEAL above. | |
| date | No | Date 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. | |
| name | No | Substring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite strong annotations (destructiveHint=true, readOnlyHint=false), the description adds important behavioral detail: irreversibility, cascade deletion of linked hydration events, and the exact error behavior when a match is not exactly one meal. It also clarifies that nothing is deleted on ambiguity, which is critical safety 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every sentence earns its place. It is front-loaded with purpose, then organized into clearly capped sections (FIND THE MEAL, HYDRATION) with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, irreversible operation, the description covers all critical aspects: how to identify the exact meal, what happens on ambiguity, retry guidance, and cascade effects. An output schema exists, so return-value documentation is not the description's responsibility. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds substantial selection logic: id is an alternative to date+name, name is a case-insensitive substring used only for disambiguation, and date defaults to today. This gives the agent the decision rules needed to choose the right parameter combination, going well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a meal entry.' It also states the exact triggering condition ('when the user explicitly asks to remove or delete a logged meal'), which clearly distinguishes it from related meal tools like update_meal 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance, including the user-intent trigger. It also provides a detailed decision procedure for locating the meal (id vs. date+name, name only when multiple meals exist) and an explicit exclusion: do not issue a separate hydration delete. This fully routes the agent away from incorrect usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_recovery_sessionADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Recovery session ID. Alternative to session_date. | |
| session_date | No | Alternative to id: the date (YYYY-MM-DD) the session was logged on. Optionally narrow with session_category. | |
| session_category | No | Optional, narrows session_date to one category when more than one session shares that date. Ignored when id is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_runADestructiveIdempotentInspect
UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Delete a run. Use when the user wants to remove a run entry. ASK for confirmation if the user's intent is ambiguous.
SELECTOR — pass id if known, or date (+ optional distance_mi to narrow, matched approximately within 0.25 mi) to resolve it. Exactly one of id or date required. If it matches more than one run, the call errors with candidate IDs to retry with.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Run UUID. Alternative to date. | |
| date | No | Alternative to id: the date (YYYY-MM-DD) the run was logged on. Optionally narrow with distance_mi. | |
| distance_mi | No | Optional, 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_unit | No | Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and idempotent, and the description adds meaningful behavior beyond that: it will error with candidate IDs when multiple runs match, distance matching is approximate within 0.25 mi, and unit conversion is handled internally so the agent must never convert values itself. This gives the agent important operational expectations not encoded elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and every sentence contributes useful information, but the main purpose ('Delete a run') is not front-loaded; the tool starts with a unit-inputs caveat instead. The selector and ambiguity guidance are well organized afterward, so the structure is good but not maximally focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary invocation context: when to use it, confirmation behavior, how to choose between id and date, approximate matching, unit handling, and the error outcome when multiple runs match. An output schema exists, so not detailing return values is acceptable; nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While schema coverage is 100%, the description adds critical semantic rules not present in the schema: exactly one of id or date is required, distance_mi is ignored when id is given, distance matching is approximate, and input_distance_unit only applies when the user supplied km. These constraints materially change how the parameters should be used and are essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens the second paragraph with 'Delete a run. Use when the user wants to remove a run entry,' which names a specific verb and resource and clearly distinguishes this tool from run-logging or run-listing siblings like log_run, list_runs, and show_runs. The title and name reinforce the action, and the description adds unambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use the tool ('when the user wants to remove a run entry') and instructs the agent to ask for confirmation if intent is ambiguous. It also provides selection guidance for resolving the target run, but it does not explicitly mention when-not-to-use or compare against sibling deletion tools, so it stops just short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_wellbeingADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Wellbeing entry ID to delete. Alternative to date. | |
| date | No | Alternative to id: a date (YYYY-MM-DD) that falls within the entry's period. Resolves only when exactly one entry matches. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_workoutADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Substring 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_id | No | Session ID, if already known. Alternative to session_date + name — see FIND THE SESSION above. | |
| session_date | No | Date 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_id | No | Saved Workout ID to delete. When present, deletes the reusable prescription and does not touch completed workout history. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation destructiveHint=true is reinforced by the description's use of 'Permanently delete' and 'irreversible.' The description also explains the idempotent behavior (if no unique match, nothing is deleted and an error is returned), which aligns with idempotentHint=true. No contradictions exist between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: the primary purpose, FIND THE SESSION, and SAVED WORKOUTS. It avoids redundancy and each sentence adds necessary information. The use of bold labels and concise bullets (though not bullets) makes it easy to parse. Despite being lengthy, it is efficiently organized and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the decision tree for selecting parameters: session_id vs session_date+name, defaults, the saved_workout_id alternative, and the error case (no unique match). It also states the destructive and irreversible nature, leaving no ambiguity for an agent. Given the moderate complexity (4 params, 0 required, with defaults and alternatives), the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are fully described in the schema, and the description adds valuable context beyond the schema. For example, session_id is described as an 'Alternative to session_date + name,' session_date includes format and default, name explains substring/case-insensitivity and when it applies, and saved_workout_id clarifies its distinct purpose. The description references the FIND THE SESSION section for cross-guidance, making semantics clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Permanently delete a workout session and all its exercises and sets.' It also explicitly says 'Use when the user wants to remove a logged workout entirely,' providing unambiguous intent. The distinction between completed workout history and reusable saved workouts is also clarified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: it instructs when to use the tool and how to select the correct target. It explains the two identification paths (session_id vs session_date + name), the default for session_date, and the alternative for saved_workout_id. It also states the error behavior when no unique match exists, so the agent knows when to retry or use a different parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_guide_sectionARead-onlyIdempotentInspect
Look up general customer help for the Wellness Project app. Use this only for broad questions about where a feature lives, how to use it, what a visible feature does, common troubleshooting steps, or pricing.
The returned guide is intentionally limited to stable, customer-facing help. Do not add or infer implementation details, technical architecture, policy or legal interpretation, privacy or security claims beyond the exact returned text, billing mechanics, release or version history, internal timing or targeting rules, or other details that are not in the returned section.
For navigation, the guide result is the source of truth. Navigation grounding: use only app sections, routes, labels, buttons, gestures, and menu paths explicitly named in this guide result. Do not infer, invent, or autocomplete nearby navigation. If the requested path or action is not confirmed here, say you are not sure where it lives rather than guessing.
For cost, price, Free vs Pro, Founding Member, upgrading, or the 3-analysis limit, use topic=pricing. That result consists of the two approved product messages plus the subscription page link. Reproduce exactly one appropriate message verbatim, include the supplied subscription link, and add no other pricing detail. Use the Founding Member message for ordinary pricing questions and the exhausted message only when the user says they already used the daily analysis allowance. In the in-app coach only, append this CTA block exactly after the chosen message: [CHIPS] Get Pro Now|open_paywall [/CHIPS]
Examples: "where do I see my PRs?" -> pages_training; "what does Fit Score include?" -> pages_dashboard; "how do I connect Oura?" -> wearables; "how do I set a calorie goal?" -> goals; "how do I log a meal?" -> logging; "how much does it cost?" -> pricing.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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's job is behavioral context beyond safety — and it delivers: the guide is 'intentionally limited to stable, customer-facing help,' navigation must be grounded only in explicitly named paths ('Do not infer, invent, or autocomplete nearby navigation'), and pricing must be reproduced verbatim with an exact CTA block appended in the in-app coach. These operational constraints shape how the agent should consume the result and cannot be inferred from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose in the first sentence, then flows from usage scope to exclusions to navigation grounding to operational pricing rules to examples — a logical structure. It is long, but every section carries operational weight; the only drag is the dense single-sentence exclusion list, which could be broken up for easier parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 1-parameter lookup tool with an output schema present, the description covers everything needed for correct invocation: purpose, scope boundaries, grounding constraints, exact pricing reproduction behavior, and worked examples. Combined with annotations covering the read-only/idempotent profile, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 12 enum values is already thoroughly documented, giving a baseline of 3. The description adds genuine value above that via natural-language example mappings ('where do I see my PRs?' -> pages_training) and by clarifying that cost/Free/Pro/Founding Member/3-analysis questions route to topic=pricing — a routing detail not present in the schema enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Look up general customer help for the Wellness Project app.' Then narrows scope to 'broad questions about where a feature lives, how to use it, what a visible feature does, common troubleshooting steps, or pricing,' which clearly distinguishes it from the data-centric sibling tools like log_meal, update_workout, and get_exercise_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit scoping with 'Use this only for...' followed by a precise list of question types, plus negative guidance listing what must not be added or inferred (implementation details, policy, privacy claims, billing mechanics, etc.). It also provides concrete example-to-topic mappings and detailed conditional rules for the pricing topic, telling the agent exactly which message to reproduce and when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exercise_historyARead-onlyIdempotentInspect
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 exist.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| since_date | No | Optional YYYY-MM-DD lower bound for the Recent block. Does not affect the PR section, which is always all-time. | |
| recent_limit | No | How many recent sessions containing this exercise to surface. Optional — default 10, capped at 50. | |
| exercise_name | Yes | Exercise to look up. Required. Free-text — the tool resolves to canonical (e.g. "bench" → "Bench Press"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint: true, idempotentHint: true, and destructiveHint: false, with no contradiction in the description. The description adds useful behavioral context beyond the annotations, such as that exercise_name 'resolves to canonical, or says so if never logged' and that 'Banded and unbanded PRs are shown side-by-side when both exist.' This extra detail about resolution and output formatting earns a score above the baseline of 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with distinct sections (overview, USE FOR, NOT, INFER) and uses bullet-like lines for readability. However, some information is repeated (e.g., the opening paragraph already mentions all-time PR and recent performance, and the USE FOR section restates these examples). This slight redundancy keeps it from a perfect score, but it remains clear and reasonably concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is thorough for the tool's complexity. It details the output contents (est. 1RM PR, exact set, date, weight, reps, RPE, banded vs unbanded, superset siblings, notes, rep-range bests, recent sessions, delta), explains the optional parameters' effects, and covers edge cases like 'never logged.' Given that no output schema is shown, this descriptive completeness is essential and well-executed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all three parameters are described). The description adds semantic nuance that improves parameter understanding: since_date 'narrows only the Recent block; the PR is always all-time,' recent_limit is 'default 10, capped at 50,' and exercise_name is 'free-text — the tool resolves to canonical.' This additional guidance justifies a score above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up everything the user has done for ONE exercise: all-time PR plus recent performance, across many sessions.' It uses a specific verb ('look up'), a specific resource (exercise history), and a clear scope (one exercise). It also distinguishes the tool from siblings like get_workout and list_workouts by mentioning 'NOT for a full session' and 'or a date-window list regardless of exercise.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists use cases under 'USE FOR:' (PR lookups, recent-activity questions, trend questions) and non-use cases under 'NOT for' (full session, date-window list), naming the appropriate sibling tools (get_workout, list_workouts). It also provides operational guidance under 'INFER — do not ask:' for each parameter, making the intended usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workoutARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Session ID from list_workouts. Required. | |
| saved_workout_id | No | Saved Workout ID from list_workouts(saved_workouts=true). When present, returns the reusable prescription instead of a completed workout session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_postsARead-onlyIdempotentInspect
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/.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional — number of posts to return. Default 10, max 30. | |
| query | No | Optional — substring filter applied to title and summary (case-insensitive). | |
| advisor_slug | No | Optional — filter to one advisor (e.g. "nutritionist" for Casey Mills). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_metricsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 30 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_cycleARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 6 months ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_exercisesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_goalsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include_capabilities | No | Append 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
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_hydrationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End date in YYYY-MM-DD format. Default today. | |
| start_date | No | Start date in YYYY-MM-DD format. Default 6 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_injuriesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status. Default: Active + Monitoring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_markersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_resultsARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| panel_name | No | Optional — filter to a specific panel (e.g. "Lipid Panel"). | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 365 days ago. | |
| marker_name | No | Optional — filter to a specific marker (e.g. "LDL Cholesterol"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_mealsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Start date (or the single date if no range). Format: YYYY-MM-DD. Optional — omit for today (resolved in the user's own timezone). | |
| end_date | No | End date for a range query. Format: YYYY-MM-DD. Optional — omit for a single-day lookup. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it read-only and idempotent, lowering the bar. The description adds useful behavioral context beyond the annotations, such as timezone resolution for dates, the 31-day maximum range, and the recommendation to make multiple calls for longer periods. This enhances transparency without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured, with clear sections for usage, ranges, and inference rules. While it repeats some schema information, the added guidance on when to call and how to handle date ranges is valuable and not redundant. The organization makes it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use the tool, what it returns (meals with fields), limitations (max range, multi-call strategy), and parameter handling. Given that an output schema exists, an agent has all necessary information to decide when and how to call this tool successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with detailed descriptions (format, optionality, meaning), establishing a baseline of 3. The main description adds extra semantic context, particularly the inference rules for date and end_date (e.g., "this week" maps to Monday through today), which helps agents interpret parameter values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List all meals logged for a date or date range, including each meal's ID, date, type, food description, and macros.' It also distinguishes itself from sibling tools by noting that update_meal and delete_meal can resolve meals without this tool, making the purpose and scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage scenarios are provided: '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.' It also gives practical guidance on date ranges and multi-call handling, and clarifies that it is not required before update/delete operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_personal_contextARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_sessionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional — max sessions to return. Default 50, max 200. | |
| category | No | Optional — filter to one category. Omit to return every category. | |
| end_date | No | End of date range. Format: YYYY-MM-DD. Optional — defaults to today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Optional — defaults to 30 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_strategiesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Which strategies to return. Default: 'active'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_daysARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 30 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_runsARead-onlyIdempotentInspect
List runs within a date range. Returns a compact Runner State summary first, then individual runs. This is the preferred single read for Elias: current-week volume, four-week baseline, longest run, confirmed easy/quality mix, unclassified mileage, pace trend, heart points and available HR are computed together rather than pieced together from several calls.
Maximum range: 92 days. Defaults to 7 days ago through today. For a longer span, make several calls covering consecutive windows.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Optional — defaults to today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Optional — defaults to 7 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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 transparency about the output structure (compact summary then individual runs) and that metrics are computed together, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized with the primary purpose first, then output details, then usage guidance; each sentence adds value, including the list of computed metrics and the note about longer spans.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 provides all necessary context for an agent to decide when and how to use this tool, including return structure and limitations, with no missing guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described with format and defaults in the schema, and the description adds crucial semantics about the maximum range (92 days) and default window (7 days ago to today).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists runs within a date range, specifies the resource and scope, and differentiates it by being the preferred single read for computed metrics, contrasting with piecing together data from multiple calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly positions this tool as the preferred single read for specific metrics, implies alternatives by stating 'rather than pieced together from several calls', and gives usage guidance for longer spans by advising multiple consecutive calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sleepARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 14 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_supplementsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Which items to return. Default: 'active'. | |
| category | No | Filter by category. Omit for both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_dataARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 14 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behaviors beyond the read-only annotation: it explains how Zone Minutes are calculated, how calories burned may be estimated and labeled, and how TDEE is derived or why it might be missing. It also states the tool will infer defaults without asking, which is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is verbose and somewhat repetitive: the same list of metrics appears in both the opening sentence and the 'Use when' clause. While the extra paragraphs on Zone Minutes and calories are informative, they could be condensed, and the overall length makes it harder to scan quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context: what data is returned, operational limits (31-day range), default handling, and special labeling for estimates. It does not describe the output schema, but that's not required for a list operation. It is complete but slightly over-explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with clear descriptions and defaults for both parameters. The description reinforces the default behavior (INFER) but does not add new details beyond what the schema already states, though it does clarify the date format implicitly through the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists daily wearable data across multiple specific metrics (steps, HRV, calories, etc.), with a verb and resource. It distinguishes itself from sibling list tools like list_workouts and list_body_metrics by explicitly naming the wearable data categories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a direct 'Use when' clause listing user queries (step count, heart rate, HRV trends, etc.) and provides operational guidance such as the 31-day maximum range and instruction to make multiple calls for longer periods. This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_wellbeingARead-onlyIdempotentInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Default: today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Default: 14 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_workoutsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | End of date range. Format: YYYY-MM-DD. Optional — defaults to today. | |
| start_date | No | Start of date range. Format: YYYY-MM-DD. Optional — defaults to 7 days ago. | |
| saved_workouts | No | When true, list reusable Saved Workouts instead of completed workout sessions. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Log or update body composition metrics for a given date. Use when the user shares weight, body fat percentage, or any other body composition reading — whether typed manually, copy-pasted from a smart scale app, or described from a photo of a scale display.
PROACTIVE DATA COLLECTION: If the user hasn't shared their data yet, ask them to copy-paste the output from their scale app or upload a photo of the display — this lets you parse all fields at once instead of asking one by one.
INFER — do not ask:
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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date of the measurement. Format: YYYY-MM-DD. Default to today. | |
| notes | No | Any context worth noting (e.g. "post-workout", "morning fasted"). | |
| hips_in | No | Hip circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| chest_in | No | Chest circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| waist_in | No | Waist circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| calf_l_in | No | Left calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| calf_r_in | No | Right calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| weight_lb | No | Body weight. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| bicep_l_in | No | Left bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| bicep_r_in | No | Right bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| thigh_l_in | No | Left thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| thigh_r_in | No | Right thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS. | |
| fat_mass_lb | No | Fat mass. Calculate from weight and body fat % if not explicitly stated. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| protein_pct | No | Protein percentage (0-100). | |
| body_fat_pct | No | Body fat percentage (0-100). | |
| bone_mass_lb | No | Bone mass. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| lean_mass_lb | No | Lean (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_pct | No | Body water/hydration percentage. | |
| muscle_mass_lb | No | Skeletal 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_unit | No | Set to cm when the user gave cm for the _in fields in this object. Omit when they are already in. | |
| input_weight_unit | No | Set to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb. | |
| skeletal_muscle_pct | No | Skeletal muscle percentage (0-100). | |
| visceral_fat_rating | No | Visceral fat rating (scale varies by device, typically 1-59). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: one row per day, calling twice on the same date is an upsert, all fields except date are optional, and the tool converts units once before storage. These are critical runtime behaviors an agent needs to know and are not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but justified given 23 parameters and complex unit/derivation rules. It is logically sectioned, though not perfectly front-loaded: the purpose statement appears only after an initial dense unit-input paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool, the description covers purpose, usage, units, inference rules, upsert behavior, and exclusions like BMI. An output schema exists, so return-value details are not necessary. The minor input_distance_unit inaccuracy prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description greatly enhances parameter meaning by explaining unit-input conventions, derived-field formulas, percentage ranges, and the distinction between muscle mass and lean mass. It loses a point because it references input_distance_unit, which does not exist in this tool's schema, creating potential confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Log or update body composition metrics for a given date.' It names the exact resource and action, and differentiates itself from sibling read/list tools by explicitly describing when the user shares a body composition reading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong when-to-use guidance: weight, body fat percentage, or other composition readings from manual entry, smart scale apps, or photos. It also provides important when-not behavior, such as never asking for BMI. However, it does not explicitly name alternative tools like log_wearable or list_body_metrics for exclusions.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ended_on | No | Period end date. Format: YYYY-MM-DD. Omit if period is still active. | |
| started_on | Yes | Period start date. Format: YYYY-MM-DD. Required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Side of body. Optional — infer from description. | |
| notes | No | Additional context about how injury occurred, symptoms, etc. Optional. | |
| status | No | Status. Default: 'Active'. Auto-set to 'Resolved' if end_date is provided. | |
| end_date | No | Date injury resolved. Format: YYYY-MM-DD. Default: null (ongoing). Set when injury is fully resolved. | |
| severity | Yes | Severity 1-10 (1=minor, 10=severe). Required — estimate from description. | |
| body_part | Yes | Body part affected (e.g. 'Shoulder', 'Lower Back', 'Knee'). Required. | |
| start_date | No | Date injury started. Format: YYYY-MM-DD. Default: today. | |
| injury_type | Yes | Type of injury (e.g. 'Strain', 'Tendonitis', 'Sprain', 'Disc', 'Soreness', 'Acute'). Required — infer from description. | |
| affected_movements | No | Movements affected (e.g. ['Pressing', 'Overhead', 'Bench Press']). Infer from body part. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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).
Submit all markers from a single lab visit in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| results | Yes | Array of individual lab marker results. Required — submit all markers from the visit in a single call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations mark this as readOnly=false, the description adds substantial behavioral context: the required list_lab_markers workflow, the infer-not-ask policy for date/panel_name/flag/reference ranges/lab_name, and the requirement to submit all markers from one visit in a single call. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative and well organized with clear sections (glucose routing, workflow, inference policy). It front-loads the purpose and gives the most critical routing distinction early. Minor redundancy exists between the workflow section and schema field descriptions, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a lab-logging tool with nested result items and several inferable fields, this description is complete: it covers when to use it, how to prepare parameters, how to disambiguate from related tools, what to infer, and how to batch submissions. The output schema exists, so return-value details do not need to be repeated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each field well. The description adds extra parameter-level guidance: use canonical marker_name and loinc_code for matches, omit loinc_code when no match exists, infer defaults for several fields, and batch all markers from a visit into one results array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Log one or more blood test or biomarker results." It also distinguishes from log_wearable by explicitly routing glucose measurements to that sibling, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 (lab/blood-draw results from a PDF, paper report, or photo) and when not to use it (finger-stick, CGM, home meter, wearable glucose belongs in log_wearable). It also defines a required workflow with list_lab_markers and tells the agent what to do if results are mentioned but not shared.
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.
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.
SAVED RECIPES: if the user says the food is saved/usual, pass recipe_name. It supplies stored food and macros; explicit fields override them. 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.
BRAND NAMES: for a branded, restaurant, or specific product, use published macros for the stated size/variant before a generic estimate.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-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_g | No | Fat in grams. See MACROS above. | |
| force | No | True only when the user has explicitly confirmed a separate entry despite a duplicate warning. Bypasses duplicate detection. | |
| fluids | No | Optional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking. | |
| carbs_g | No | Carbohydrates in grams. See MACROS above. | |
| calories | No | Total calories (kcal). See MACROS above. | |
| alcohol_g | No | Alcohol 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_type | Yes | Required. 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_g | No | Protein in grams. See MACROS above. | |
| food_items | No | Description of the food and drinks consumed. See MACROS above; ask the user only if completely absent and no recipe_name applies. | |
| recipe_name | No | Name 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=false and no other safety hints, so the description carries the behavioral burden. It fully discloses important behaviors: never overwriting known stored macros with fresh estimates, requiring confirmation before force=true, handling duplicate errors by prompting the user, and letting the server decide whether hydration tracking is enabled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but its complexity warrants it: 11 parameters, macro resolution rules, duplicate handling, and hydration all need explanation. It is well-organized with clear section headers and fronts the core purpose before diving into edge cases, though a more compact phrasing would slightly improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is remarkably complete. It covers inference rules, macro sourcing, required fields, fasting, duplicates, and hydration, leaving no major decision ambiguous. An output schema exists, so the absence of explicit return-value details is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds substantial meaning beyond the schema: date inference rules, canonical meal_type time mapping, when recipe_name supplies macros, how fluids and alcohol_g interact, and the explicit rule to never call without all four macros populated. This goes far beyond what the input schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 meal to the user's food diary,' and expands with concrete trigger conditions ('mentions eating, describes a meal, or asks to log food'). It covers special cases like fasting and drinks without blurring the core purpose, and it is clearly distinguishable from siblings like update_meal and list_meals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives detailed when-to-use guidance: direct meal logging, repeats, saved recipes, brand names, fasting days, and drinks/hydration. It explicitly names alternatives such as list_meals for repeats and update_meal for correcting duplicates, and it states this is the single write path for drinks, clearly routing behavior away from other tools.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date (YYYY-MM-DD). Default to today. | |
| notes | No | Session notes or reason for skipping. Optional. | |
| quality | No | Subjective quality 1-5. Optional. | |
| skipped | No | true if the session was skipped/missed. Default: false. | |
| category | Yes | Category. Required. | |
| strategy_id | No | Strategy ID from list_recovery_strategies. Optional — omit for standalone sessions. | |
| strategy_name | Yes | Name of the practice. Required. | |
| duration_minutes | No | Duration in minutes. Optional — omit for skipped. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_dayAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The date to mark as a rest day. Format: YYYY-MM-DD. Default: today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description conflicts with the annotation by declaring the operation idempotent while the annotation sets idempotentHint to false. This contradiction undermines transparency. Additionally, it does disclose side effects like suppressing workout-prompt nudges, but the contradiction is a major issue.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but well-structured with clear paragraphs and a bullet point for inference rules. There is minor repetition, but it remains concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use, how to infer the date, the effect on workout nudges, idempotency, and the alternative cancellation tool. It provides all necessary context for the tool's functionality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'date' parameter with format and default, but the description adds crucial inference rules for parsing user references like 'today' and 'yesterday,' going beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with the verb 'Mark' and the resource 'date as an intentional rest day.' It also provides usage examples, making the action unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly specifies when to use the tool ('Use when the user says they took a rest day...') and directs users to the sibling tool 'cancel_rest_day' for removal, leaving no ambiguity about when to choose this tool.
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. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Create an editable running card. Use for a completed run OR a future run plan.
intent:
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.
| Name | Required | Description | Default |
|---|---|---|---|
| rpe | No | RPE 1-10. For a plan this is target RPE. | |
| date | No | YYYY-MM-DD. Completed runs default to today when context allows; planned runs use the intended date when known. | |
| notes | No | ||
| avg_hr | No | Average heart rate only when known. | |
| intent | Yes | log = completed run; plan = future run. Elias uses plan for a workout the runner has not done yet. | |
| splits | No | Actual splits/laps only when supplied by the runner/source. Never invent. | |
| surface | No | ||
| run_type | No | Classify only when the runner or workout structure supports it. Do not turn an unspecified wearable run into easy. | |
| segments | No | Workout structure, e.g. warmup, 6x800m threshold, recovery, cooldown. This may describe a plan or what was actually performed. | |
| pain_notes | No | Pain/discomfort exactly as the runner described it. | |
| start_time | No | Local HH:MM only when known. | |
| avg_power_w | No | Average running power in watts only when known. | |
| distance_mi | No | Distance. In mi, or km with input_distance_unit set. See UNIT INPUTS. | |
| elapsed_sec | No | Wall-clock elapsed time including pauses, only when known. | |
| duration_sec | No | Moving/workout duration in seconds. | |
| avg_cadence_spm | No | Average running cadence in steps/min only when known. | |
| elevation_gain_m | No | Elevation gain in metres only when known. | |
| perceived_effort | No | Post-run check-in only. | |
| input_distance_unit | No | Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only weak annotations (all hints false), the description carries the behavioral burden and delivers richly: it discloses that the tool converts units itself ('The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic'), that logging 'writes the completed run and returns a card marker for in-app editing', and imposes anti-fabrication constraints ('Never invent sensor data or splits', 'do NOT call it easy merely because it was a run'). These go well beyond what readOnlyHint=false and idempotentHint=false convey. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~250 words) but earns its length given 19 parameters and two operational modes. It is well-organized with labeled sections (UNIT INPUTS, intent, RUN TYPE, DETAIL) and front-loads the most critical instruction (unit handling) before anything else. Minor deduction: some redundancy with schema descriptions — the run_type and splits/segments 'never invent' constraints appear both in the schema and the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 19 parameters, two intents, and five enums, the description covers the decision-critical ground: unit conversion policy, the log-vs-plan distinction with required fields, run-type classification guardrails, and data-fidelity constraints. An output schema exists, so return values need not be described. Minor gaps: no explicit guidance on ambiguous cases (e.g., a run that might be both a plan and a log) and some per-field sourcing rules are left to the schema — but 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is high (89%), the description adds critical cross-parameter semantics the schema only references: the UNIT INPUTS paragraph explains the pairing rule ('when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in'). It also adds intent-specific required fields for log (date, distance_mi, duration_sec) that the schema does not state, and clarifies run_type classification guardrails. This far exceeds the baseline 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create an editable running card. Use for a completed run OR a future run plan.' It further distinguishes two intents — log (the run happened) vs plan (the run has NOT happened) — which sets it apart from nearby siblings like log_workout, log_wearable, and log_rest_day. An agent can clearly identify this as the run-specific card creator without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit 'when' guidance: use for a completed run OR a future run plan, with a hard rule that a future run must never go into completed history. It also clarifies defaults (log is default) and mode-specific required fields. However, it does not explicitly name alternatives or exclusions (e.g., 'use log_wearable for synced wearable data' or 'use update_workout to modify'), so routing between siblings is left partly to inference.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date of the sleep entry (night ending on this date). Format: YYYY-MM-DD. Default to today. | |
| bedtime | No | Bedtime / 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_time | No | Wake 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. | |
| awakenings | No | Number of times woken during the night. Optional. | |
| sleep_score | No | Sleep quality score on a 0-100 scale (matches wearable scoring). For a 1-10 self-rating, multiply by 10 first. Optional. | |
| total_hours | No | Total sleep duration in hours (e.g. 7.5). Optional. | |
| rem_sleep_hours | No | REM sleep in hours. Optional — include if the tracker reports it. | |
| deep_sleep_hours | No | Deep/slow-wave sleep in hours. Optional — include if the tracker reports it. | |
| light_sleep_hours | No | Light sleep in hours. Optional — include if the tracker reports it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date (YYYY-MM-DD). Default to today. | |
| notes | No | Optional note for this check-in. | |
| taken | No | true = taken, false = missed. Default: true. | |
| supplement_id | No | Supplement ID. Alternative to supplement_name. | |
| supplement_name | No | Alternative to supplement_id: name substring, case-insensitive (e.g. "magnesium"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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".
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Date for the entry. Format: YYYY-MM-DD. Default to today. | |
| resting_hr | No | Resting heart rate in BPM. Optional. | |
| step_count | No | Supplemental 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_morning | No | Morning HRV in milliseconds (RMSSD or similar). Optional. | |
| skin_temp_c | No | Skin temperature in °C. Manual/home/device reading. Optional. | |
| spo2_avg_pct | No | SpO₂ in %. Manual/home/device reading. Optional. | |
| stress_score | No | Stress score (0–100 scale). Optional. | |
| vo2max_estimate | No | VO2max estimate (ml/kg/min). Optional. | |
| core_body_temp_c | No | Core temperature in °C. Manual/home/device reading. Optional. | |
| dietary_calories | No | Dietary energy / calories eaten for the day in kcal, imported from a connected health app (Apple Health / Health Connect). Optional. | |
| systolic_bp_mm_hg | No | Systolic blood pressure in mmHg. Provide with diastolic_bp_mm_hg. Manual/home/device reading. Optional. | |
| diastolic_bp_mm_hg | No | Diastolic blood pressure in mmHg. Provide with systolic_bp_mm_hg. Manual/home/device reading. Optional. | |
| blood_glucose_mg_dl | No | Blood glucose in mg/dL. Manual/home/device reading. Optional. | |
| active_zone_min_peak | No | Zone Minutes (also called Active Zone Minutes by Fitbit, Heart Points by Google Fit) at peak intensity. Optional. | |
| confirm_supplemental | No | Set 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_bpm | No | Breathing in br/min. Manual/home/device reading. Optional. | |
| active_zone_min_moderate | No | Zone Minutes (also called Active Zone Minutes by Fitbit, Heart Points by Google Fit) at moderate intensity. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mood | No | Mood 1-10 (1=terrible, 10=excellent). Optional. | |
| notes | No | Free-text notes about how you feel. Optional. | |
| energy | No | Energy level 1-10 (1=exhausted, 10=wired). Optional. | |
| stress | No | Stress level 1-10 (1=calm, 10=overwhelmed). Optional. | |
| soreness | No | Muscle soreness 1-10 (1=none, 10=extreme DOMS). Optional. | |
| period_end | No | End date of period. Format: YYYY-MM-DD. Default: same as period_start (single day). Use for week/month/custom ranges. | |
| period_start | No | Start date of period. Format: YYYY-MM-DD. Default: today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_workoutADestructiveInspect
UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Log a complete workout session: exercises, sets, reps, weights, and session metadata. Use when the user describes finishing a workout, lists exercises performed, or asks to log training. A workout they have not done yet is not a log: use propose_workout for that.
EXERCISE NAMES:
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
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.
SAVED WORKOUT MODE: when the user asks to save a workout for reuse, set save_as_saved_workout=true and pass the full prescription through this same tool. In saved mode the workout is NOT logged as completed history. To replace an existing Saved Workout, also pass saved_workout_id; the supplied prescription fully replaces its prior prescribed sets/reps/weights. Use saved_workout_title when the reusable name should differ from focus_type.
| Name | Required | Description | Default |
|---|---|---|---|
| rpe | No | Session RPE, 1-10, half steps allowed: 5 moderate, 7 hard, 9 one rep left, 10 failure. Infer from comments about overall difficulty, or omit. | |
| date | Yes | YYYY-MM-DD. Default to today. | |
| notes | No | Session notes: how it went, PRs hit, how they felt. | |
| location | No | Gym, Home, Outdoor. Infer from context or ask. | |
| exercises | Yes | Every exercise performed, in order. | |
| focus_type | No | Infer from the exercises: Push, Pull, Legs, Upper, Lower, Full Body, Cardio, Mobility. Ask only if genuinely unclear. | |
| saved_workout_id | No | Existing Saved Workout ID to replace in saved mode. Omit to create a new Saved Workout. | |
| heart_points_peak | No | Peak-intensity heart points, if mentioned. | |
| saved_workout_title | No | Optional reusable workout name in saved mode. Defaults to focus_type. | |
| heart_points_moderate | No | Moderate-intensity heart points, Google Fit or equivalent, if mentioned. | |
| save_as_saved_workout | No | True when this payload is a reusable Saved Workout prescription, not a completed workout. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the tool's own unit conversion, exercise-name resolution, near-miss prompting, silent matching behavior, and saved-workout semantics. The destructive annotation aligns with logging side effects, with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-sectioned and each section conveys important rules. A few repeated emphases could be tightened, but the length is largely warranted by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides enough context to call the tool correctly: what to infer, when to ask, how to structure sets, how to handle units and equipment, and what the tool returns. Even without an explicit output schema, the return value and follow-up usage are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds substantial meaning beyond the schema: unit-input overrides, per-set reps/holds/carries, equipment load basis, superset grouping, slot inference, RPE interpretation, and saved-workout fields. This goes well beyond the field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool logs a complete workout session with exercises, sets, reps, weights, and metadata. It also distinguishes itself from related actions like updating, deleting, or proposing workouts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: when the user describes finishing a workout or asks to log training. It also says not to use it for future workouts and explains saved-workout mode and follow-up use with the returned ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_recovery_strategyADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Strategy ID. Required for update, end, delete unless strategy_name is given. | |
| name | No | Strategy name (e.g. 'Box Breathing'). Required for add; on update, sets a new name. | |
| notes | No | Free-text notes. Optional. | |
| action | Yes | What to do. Required. | |
| category | No | Category. Infer from name. | |
| end_date | No | End date (YYYY-MM-DD). Default to today for end action. | |
| start_date | No | Start date (YYYY-MM-DD). Default to today for add. | |
| period_unit | No | Period unit. Default: 'week'. | |
| time_of_day | No | When during the day: ['morning'], ['evening'], etc. Optional. | |
| strategy_name | No | Alternative to id for update/end/delete: strategy name substring, case-insensitive (e.g. "sauna"). | |
| duration_minutes | No | Target minutes per session. Optional. | |
| sessions_per_period | No | Target sessions per period. Default: 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_supplementADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ID. Required for update, end, delete unless supplement_name is given. | |
| form | No | Physical form: pill, capsule, tablet, softgel, powder, liquid, gummy, other. Optional. | |
| name | No | Name (e.g. 'Magnesium Glycinate' or 'Metformin'). Required for add; on update, sets a new name. | |
| brand | No | Brand name. Optional. | |
| notes | No | Free-text notes. Optional. | |
| action | Yes | What to do. Required. | |
| category | No | Category: 'medication' for drugs/pharmaceuticals, 'supplement' for vitamins/minerals/herbs. Default: 'supplement'. | |
| end_date | No | End date (YYYY-MM-DD). Set for 'end' action — default to today. Null means currently active. | |
| dose_unit | No | Unit for dose_amount: pills, capsules, tablets, softgels, g, mg, ml, IU, mcg, tbsp, scoop. Required for add. | |
| start_date | No | Start date (YYYY-MM-DD). Required for add — default to today. | |
| unit_label | No | Label for dose_per_unit (e.g. 'mg', 'IU'). Optional. | |
| dose_amount | No | Numeric dose quantity (e.g. 2 for '2 pills'). Required for add. | |
| period_unit | No | The period for times_per_period. Optional. | |
| time_of_day | No | When during the day: ['morning'], ['morning','evening'], ['night'], etc. Optional. | |
| dose_per_unit | No | Amount per individual unit (e.g. 240 for '240mg per pill'). Optional. | |
| frequency_type | No | Frequency category. Optional — default 'daily'. | |
| supplement_name | No | Alternative to id for update/end/delete: name substring, case-insensitive (e.g. "magnesium"). | |
| times_per_period | No | How many times per period (e.g. 2 for twice per week). Optional — default 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_dayADestructiveIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | The date being answered for. Format: YYYY-MM-DD. Required. | |
| answer | Yes | Required. "fast" = intentional 0-calorie day. "forgot" = day stays excluded, not imputed as 0. "unanswered" = clear any prior answer. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_compositionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 90d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_weightARead-onlyIdempotentInspect
Show the user their body weight (and body-fat %) trend over time as an interactive line chart with a 30/90-day/1-year range toggle. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes that it renders an interactive MCP app and returns a short text summary, making the behavior transparent without contradicting the read-only and idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses two concise sentences that convey purpose, usage, and output without extra fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Provides enough context for an agent to decide when to call the tool and what to expect in return (interactive chart and text summary), given the simple nature of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'range' is fully covered by the schema enum and description; the tool description mentions the range toggle but does not add meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool shows body weight and body-fat % trend over time as an interactive line chart with a 30/90-day/1-year range toggle, providing a specific and actionable purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 body weight trend, giving a clear when-to-use directive and mentioning the alternative interaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_exercise_progressionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. | |
| exercise | No | Exercise name to chart (e.g. "Bench Press"). Optional; defaults to the most-logged lift in the window. | |
| muscle_group | No | Optional muscle-group filter for the exercise picker (e.g. "Chest", "Legs"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_overviewARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 30d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_diaryARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Diary date (YYYY-MM-DD). Optional; defaults to today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_recoveryARead-onlyIdempotentInspect
Show the user their resting heart rate and HRV recovery trend over time as an interactive dual-line chart with a 30/90-day/1-year range toggle. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds useful behavioral detail beyond that: it produces an interactive dual-line chart, offers range toggles, and returns a short text summary alongside the visual. This is sufficient for a low-risk read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences each earn their place: the first states what the tool shows, the second gives routing guidance, and the third describes the returned output. Information is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one optional parameter, a fully documented schema, rich annotations, and an output schema, the description is complete enough for an agent to select and invoke the tool correctly. It covers the visual output, interaction behavior, and high-level return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the single optional range parameter with an enum and description, so the baseline is 3. The description adds the notion of a range toggle but omits the 7d option present in the schema enum, so it does not fully align with and adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: showing resting heart rate and HRV recovery trend over time. It also specifies the output form as an interactive dual-line chart with a range toggle, which clearly distinguishes it from sibling show_* tools and 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to prefer this tool when the user asks about recovery trends and to render the interactive MCP app rather than describing rows in text. It provides clear context and a preferred behavior, though it does not name a specific alternative sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_runsARead-onlyIdempotentInspect
Show the user their running mileage over the last 14 days as an inline bar chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 30d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds genuine behavioral context by explaining that it renders an interactive MCP app and returns a short text summary alongside the visual view. This goes beyond what annotations provide and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The core action and format are front-loaded, and the second sentence adds a usage preference and return-value hint without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, an output schema, and safety annotations, the description is nearly complete. However, it says 'last 14 days' while the schema allows only 7d/30d/90d/1y with a default of 30d, creating a factual mismatch that could mislead an agent into expecting a 14-day window or setting an unsupported range value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter 'range' has documented enum values and a default. The description adds no parameter-specific detail, but since the schema carries the full semantic burden, the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Show'), a resource ('running mileage'), a time scope ('last 14 days'), and a presentation format ('inline bar chart'). It also differentiates from sibling tools by saying this tool should be preferred over describing underlying rows in text, clearly distinguishing it from list_runs and similar tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage cue: 'When the user asks about this, prefer calling this tool... over describing the underlying rows in text.' This provides clear context for when to choose this tool, though it does not name specific alternatives or state when not to use it (e.g., when a raw list is explicitly requested).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_sleep_detailARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Night ending date (YYYY-MM-DD). Optional; defaults to the most recent sleep entry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_scoreARead-onlyIdempotentInspect
Show the user their current Fit Score (the app's 0-100 composite), how it breaks down across its six components (Train, Fuel, Sleep, Recovery, Steps, Wellbeing), and the past 7 days of daily scores, as one inline card. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint, idempotentHint, and destructiveHint annotations are present and consistent with the description. The description adds value by disclosing that the tool returns a text summary alongside a visual view and that it renders an interactive MCP app, which are behavioral details not covered by 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, with the first sentence stating the tool's purpose and the second sentence providing usage guidance and output details. Each sentence adds necessary information without redundancy or excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully explains what the tool does, what it returns (text summary and visual view), and when to use it. The default behavior (current Fit Score and past 7 days) is specified, and the output schema is implied. No critical context is missing for a read-only reporting tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'range' is fully documented in the schema with an enum and description ('Time window'), achieving 100% coverage. The tool description does not add additional semantics beyond what the schema already provides, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Show' and the resource 'Fit Score' with a specific composite (0-100) and its six components. It also distinguishes itself from similar tools by specifying the 7-day default and the preference for rendering an interactive view over text descriptions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit user-intent guidance ('When the user asks about this, prefer calling this tool...') and explains the output format. It does not mention alternative tools for similar requests, but the instruction to prefer this over text descriptions gives sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_week_macrosARead-onlyIdempotentInspect
Show the user their past 7 days of calories and macros (protein, carbs, fat) vs targets as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds meaningful behavioral context: it renders an inline/interactive MCP visual and returns a short text summary alongside it, which is useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The action, scope, output style, and usage preference are all front-loaded, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, non-destructive tool with one optional parameter, a full input schema, an output schema, and clear annotations, the description is complete. It covers what is shown, in what form, and what the user receives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the only parameter 'range' is fully documented with an enum and default. The description does not add new parameter semantics beyond implying the default 7-day window, so it appropriately relies on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('past 7 days of calories and macros vs targets'), and the output form ('inline chart'). The title 'This week in nutrition' reinforces the domain and distinguishes it from sibling show_week_* tools focused on fitness score, workouts, sleep, and steps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance: when the user asks about this, prefer calling the tool and rendering the interactive MCP app rather than describing rows in text. It does not explicitly name alternative tools or exclusions, but the usage context is clear enough for an agent to select it appropriately among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_week_sleepARead-onlyIdempotentInspect
Show the user their past 7 days of sleep (hours per night and sleep score) as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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 value beyond that by disclosing that the tool renders an interactive MCP app and 'returns a short text summary alongside the visual view.' This informs the agent how to present the invocation result, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: core function and format, tool-selection guidance, and return behavior. The content is front-loaded with the primary purpose and contains no redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with a fully documented schema, output schema, and safety annotations, the description covers what to invoke, when to prefer it, and what to expect back. Minor gaps are reconciling the '7 days' wording with the larger range windows and explicitly naming show_sleep_detail as the drill-down alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — the range parameter is fully described with its enum values and default ('Default 7d'), so the schema carries the burden. The description adds no parameter detail and even centers on 'past 7 days' while the schema permits 30d/90d/1y; at full coverage this lands at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Show the user their past 7 days of sleep (hours per night and sleep score) as an inline chart' — naming both content and output format. It also differentiates from sibling list tools by preferring 'rendering the interactive MCP app over describing the underlying rows in text.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear selection context: 'When the user asks about this, prefer calling this tool... over describing the underlying rows in text,' which routes the agent away from the list_sleep pattern. It stops short of naming explicit alternatives or exclusions, such as when to send the user to show_sleep_detail for granular detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_week_stepsARead-onlyIdempotentInspect
Show the user their past 7 days of step counts vs their daily goal as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnly and idempotent annotations, and it adds useful context about rendering an interactive MCP app and returning a short text summary. It does not mention side effects, but none are implied and the annotations already cover safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff: purpose, usage preference, and return format. The most important information 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the parameter schema is fully documented, the description is mostly complete. It explains the visual and summary outputs, though it does not explicitly mention that the range parameter can extend beyond 7 days; the schema covers this, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description fully covers the parameter's enum values and default, so the baseline is met. The tool description adds no extra parameter guidance and even says 'past 7 days' while the range parameter supports 30d/90d/1y, which could be slightly misleading for non-default ranges.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('show'), the data ('step counts vs daily goal'), the time scope ('past 7 days'), and the presentation format ('inline chart'). The purpose is immediately understandable and distinct from a plain text response.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to prefer this tool over a text-only description when the user asks about this topic. It does not enumerate sibling tools, but it gives a clear condition and preferred behavior, so the guidance is useful though not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_week_workoutsARead-onlyIdempotentInspect
Show the user their past 7 days of workouts (heart points per day, days trained) as an inline chart. When the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing the underlying rows in text. Returns a short text summary alongside the visual view.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value beyond the annotations by disclosing the inline-chart rendering, the preference for the interactive MCP app, and the short text summary returned alongside the visual.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first front-loads the core function and content, and the second adds the usage preference and return format without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple optional-parameter, read-only visualization tool with an output schema, the description covers what is shown, how it is shown, and what accompanies it. The only real gap is not signaling that the range is configurable beyond the default 7d, but the schema fills that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the range parameter with enum values, default, and 100% coverage, so the baseline applies. The description adds no parameter-level detail and slightly frames the tool as fixed to 'past 7 days' even though range supports 30d, 90d, and 1y.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('past 7 days of workouts'), specific metrics ('heart points per day, days trained'), and the presentation format ('inline chart'), so the tool's job is clear. It does not explicitly distinguish itself from siblings such as show_workout or show_week_fit_score, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear triggering context: when the user asks about this, prefer calling this tool and rendering the interactive MCP app over describing rows in text. It does not name alternative tools or give explicit when-not-to-use conditions, but the guidance is still actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_wellbeingARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Time window. One of 7d, 30d, 90d, 1y. Default 30d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_workoutARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Workout date (YYYY-MM-DD). Optional; defaults to the most recent workout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | Widget discriminant identifying the payload shape. |
| generatedAt | No | ISO timestamp the snapshot was built. |
TDQS
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.
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.
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.
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.
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.
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_cycleAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record ID. Alternative to date. | |
| date | No | Alternative 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_on | No | Updated end date. Format: YYYY-MM-DD. Pass null to clear (mark active). Optional. | |
| started_on | No | Updated start date. Format: YYYY-MM-DD. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_goalADestructiveInspect
UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Change, complete, pause, stop/end, reopen, or delete an existing goal. Call this tool directly for ordinary goal changes. It already loads the user's current goals and resolves a unique goal from goal_id or a natural-language goal_ref, so do NOT call list_goals first just to find an ID.
For edit, pass only the fields to change. For complete/pause/end/reopen/delete, no edit fields are required. If goal_ref genuinely matches multiple goals, this tool returns the candidates and changes nothing. Formal goal end/delete follows the existing Goals UI cancel lifecycle; standard-target end/pause turns that target off while delete removes it.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Concise title, inferred from the goal inputs. | |
| weeks | No | For weight_loss. Duration in weeks when target_date is not supplied. For body_comp. Duration in weeks when target_date is not supplied. | |
| action | Yes | What 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. | |
| metric | No | For 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_id | No | Formal goal ID, when known. | |
| goal_ref | No | Natural-language reference when no ID is known, e.g. "protein", "10K", "weight loss". This tool resolves it against current goals itself. | |
| new_name | No | For n1_experiment. Name for a new supplement when not using supplement_id. | |
| new_brand | No | For n1_experiment. Optional brand for a new supplement. | |
| race_date | No | For race. Race date in YYYY-MM-DD format. Required on create. | |
| start_date | No | YYYY-MM-DD. Default: today. | |
| start_value | No | For body_comp. Starting value when the goal begins. Required on create. Set at create, not editable later. | |
| target_date | No | For 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_window | No | For 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_lb | No | For 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_hours | No | For consistency. Nightly sleep target in hours. Required when metric is sleep_duration. | |
| target_value | No | For 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_name | No | For strength. Exercise name. Required on create. Set at create, not editable later. | |
| new_dose_unit | No | For n1_experiment. Dose unit for a new supplement. | |
| supplement_id | No | For n1_experiment. Existing supplement ID. Use either supplement_id or the new-supplement fields. | |
| target_1rm_lb | No | For strength. Target 1RM. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| new_dose_amount | No | For n1_experiment. Dose amount for a new supplement. | |
| start_weight_lb | No | For 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_week | No | For consistency. Target occurrences per week. Required on create. | |
| target_time_sec | No | For race. Target finish time in seconds. Required on create. | |
| target_weight_lb | No | For weight_loss. Target body weight. Required on create. In lb, or kg with input_weight_unit set. See UNIT INPUTS. | |
| input_weight_unit | No | Set to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb. | |
| intervention_days | No | For n1_experiment. Intervention duration in days. | |
| baseline_direction | No | For n1_experiment. Use already logged previous 14 days or collect the next 14 days. | |
| target_distance_mi | No | For race. Target race distance. Required on create. In mi, or km with input_distance_unit set. See UNIT INPUTS. | |
| input_distance_unit | No | Set to km when the user gave km for the _mi fields in this object. Omit when they are already mi. | |
| acknowledged_warnings | No | Warning keys the user explicitly acknowledged after a guarded create attempt. Omit otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral details: delete removes the goal, end follows the Goals UI cancel lifecycle, standard-target end/pause turns the target off, and ambiguous goal_ref returns candidates without making changes. This complements the destructiveHint annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into clear paragraphs: unit handling, tool usage, and action behavior. It is somewhat long, but each section serves a distinct purpose and avoids unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and 31 parameters, the description provides sufficient context for invocation, including lifecycle semantics and ambiguous-reference handling. An output schema exists, so return-value details are not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters with descriptions, so the baseline is 3. The description adds meaningful guidance beyond the schema, such as 'For edit, pass only the fields to change' and the unit-input rule for _lb/_mi fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: change, complete, pause, end, reopen, or delete an existing goal. It distinguishes this from related tools by explicitly saying to call update_goal directly instead of list_goals first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance, including 'Call this tool directly for ordinary goal changes' and 'do NOT call list_goals first just to find an ID.' It also explains edit vs. lifecycle actions and ambiguous goal_ref behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_injuryAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Injury ID. Alternative to injury. | |
| date | No | Optional, narrows the injury selector to one active on this date (YYYY-MM-DD). Ignored when id is given. | |
| side | No | Updated side. Optional. | |
| notes | No | Updated notes (replaces existing). Optional. | |
| injury | No | Alternative to id: body part or injury type substring, case-insensitive (e.g. "shoulder"). Optionally narrow with date. | |
| status | No | Updated status. Optional. | |
| end_date | No | Date injury resolved. Format: YYYY-MM-DD. Auto-sets status to Resolved. | |
| severity | No | Updated severity 1-10. Optional. Change is tracked in severity history. | |
| start_date | No | Updated start date. Format: YYYY-MM-DD. Optional. | |
| severity_date | No | Date for the severity entry in the history log. Format: YYYY-MM-DD. Default: today. Use to backfill past severity changes. | |
| affected_movements | No | Updated list of affected movements. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_resultAIdempotentInspect
Update one or more fields on an existing lab result. Use when the user wants to correct a result already logged, most often its collection date. Only send the fields that need to change; omit all others.
SELECTOR, pass exactly one of id, date, or date+marker:
id: addresses one marker's row. Any editable field may change.
date (optionally narrowed by panel_name): addresses every result from that draw at once. Only new_date, panel_name_new, and lab_name may change this way. result_value, result_unit, marker_name, flag, and notes are per-marker fields and require a single row, so one call can never overwrite every marker in a draw with the same value.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Lab result ID. Selects a single marker row. Alternative to date. | |
| date | No | 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. | |
| flag | No | New lab flag: "H", "L", "HH", "LL", or "A". Optional, omit if not changing. Only allowed when selecting by id or date+marker. | |
| notes | No | New notes. Optional, omit if not changing. Only allowed when selecting by id or date+marker. | |
| marker | No | 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. | |
| lab_name | No | New lab name (e.g. "Quest Diagnostics", "LabCorp"). Optional, omit if not changing. Works with any selector. | |
| new_date | No | New 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_name | No | Optional, narrows a date (or date+marker) selector to one panel within that draw (e.g. "Lipid Panel"). Ignored when id is given. | |
| marker_name | No | New marker name. Optional, omit if not changing. Only allowed when selecting by id or date+marker. | |
| result_unit | No | New unit of measurement (e.g. "mg/dL"). Optional, omit if not changing. Only allowed when selecting by id or date+marker. | |
| result_value | No | New numeric result value. Optional, omit if not changing. Only allowed when selecting by id or date+marker. | |
| panel_name_new | No | New panel name. Optional, omit if not changing. Works with any selector. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint and destructiveHint. The description goes beyond by explaining error behavior (e.g., 'Errors with candidate IDs if more than one marker matches') and the subtlety that per-marker fields cannot be changed via a date-only selector. It does 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but every part is necessary to explain the complex selector logic and field restrictions. It is well-structured with a clear breakdown of selectors, making the length justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (12 parameters, 0 required, multiple selector modes), the description provides everything needed: selector rules, field constraints, error handling, and examples. The output schema is present, so return values don't need to be described. The description is fully self-contained for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% description coverage. The description adds critical extra semantics on top, such as which fields are allowed only with id/date+marker, and how 'marker' and 'panel_name' narrow the selection. This goes well beyond the basic parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('lab result'), clearly distinguishing it from sibling tools like log_lab_results, list_lab_results, and delete_lab_result. The purpose is immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when the user wants to correct a result already logged'), and provides detailed selector logic (id vs date vs date+marker) with constraints on which fields are allowed per selector. This gives unambiguous guidance on how to invoke the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mealADestructiveIdempotentInspect
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.
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.
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. add_food_items and add_recipe_name are mutually exclusive: never set both in the same call. Adding both a saved recipe and separate ad-hoc food means two update_meal calls, one per addition.
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.
If add-vs-correct intent is ambiguous, ask before updating.
DRINKS / HYDRATION WHEN UPDATING: a food update must not silently erase an already-linked hydration event. For changes unrelated to drinks, omit fluids and the existing hydration is preserved. When ADDING a drink with add_food_items/add_recipe_name, fluids contains only the newly added drink(s) and they are appended to the meal's hydration. When CORRECTING the meal's drinks with both add_* fields omitted, fluids is the complete corrected drink list and replaces the linked hydration only after replacement rows have been safely inserted. If the correction removes every drink, explicitly send fluids: [] and the linked hydration is deleted. Whenever a drink volume is known or reasonably inferable, include it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above. | |
| date | No | 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. | |
| name | No | Substring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted. | |
| fat_g | No | Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items. | |
| fluids | No | Optional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking. | |
| carbs_g | No | Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items. | |
| calories | No | 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. | |
| alcohol_g | No | 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. | |
| meal_type | No | 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. | |
| protein_g | No | Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items. | |
| food_items | No | 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. | |
| add_food_items | No | 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. | |
| add_recipe_name | No | 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. | |
| target_meal_type | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is rich in behavioral detail, covering replace-vs-add semantics, hydration deletion, matching errors, and the historical silent-replace bug. However, it directly contradicts the idempotentHint=true annotation: add_recipe_name and add_food_items 'ADD' macros to the meal's current value, so retrying the same call would append the food again and produce a different result. This is an annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well organized with labeled sections and front-loaded sibling differentiation. Some parameter details are restated from the schema, but the length is justified by the high complexity of three interacting modes and a 14-parameter surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with zero required parameters, this description is unusually complete: locating the meal, all three modes, mutual exclusions, ambiguity handling, hydration side effects, error behavior, and defaults are all covered. An output schema exists, so return-value documentation is unnecessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description still adds substantial meaning: it explains the interaction between add_* and plain fields, the required-with-add_food_items rule, target_meal_type never being written while meal_type is, matching/error behavior, and hydration fluid semantics. This goes far beyond the schema and materially improves correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Update an existing meal', and immediately differentiates from log_meal by requiring the current message to explicitly change, correct, or add to an already logged meal. The boundary is unambiguous: a plain food statement is a new entry and should use log_meal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Use only when the current message explicitly changes, corrects, or adds to a meal already logged') and when not to ('A plain food statement... use log_meal'). It also routes within the tool across the three modes and instructs the agent to ask when add-vs-correct intent is ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_recovery_sessionAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Recovery session ID. Alternative to session_date. | |
| date | No | Updated date (YYYY-MM-DD). Optional. | |
| notes | No | Updated notes. Optional. | |
| quality | No | Updated quality 1-5. Optional. | |
| skipped | No | Updated skipped status. Optional. | |
| category | No | Updated category. Optional. | |
| strategy_id | No | Updated strategy ID. Optional — set null to unlink. | |
| session_date | No | Alternative to id: the date (YYYY-MM-DD) the session was logged on. Optionally narrow with session_category. | |
| strategy_name | No | Updated practice name. Optional. | |
| duration_minutes | No | Updated duration in minutes. Optional. | |
| session_category | No | Optional, narrows session_date to one category when more than one session shares that date. Ignored when id is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_wellbeingAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Wellbeing entry ID. Alternative to date. | |
| date | No | Alternative to id: a date (YYYY-MM-DD) that falls within the entry's period. Resolves only when exactly one entry matches. | |
| mood | No | Updated mood 1-10. Optional. | |
| notes | No | Updated notes (replaces existing). Optional. | |
| energy | No | Updated energy 1-10. Optional. | |
| stress | No | Updated stress 1-10. Optional. | |
| soreness | No | Updated soreness 1-10. Optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
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.
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.
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.
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.
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.
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_workoutADestructiveIdempotentInspect
UNIT INPUTS: never convert units yourself. Pass the user's number for a _lb / _mi / _in field exactly as stated, and when they gave kg / km / cm set input_weight_unit / input_distance_unit / input_length_unit in that same object. Omit the companion when the number is already lb / mi / in. The tool converts once before storage, so this overrides any wording that asks you to do the arithmetic.
Update a workout session: correct metadata, fix set values, rename/add/remove exercises or individual sets, or move exercises between supersets. Use for any post-log correction.
FIND THE SESSION: pass session_id if already known. Otherwise pass session_date (YYYY-MM-DD, defaults to today) and, only if more than one session was logged that day, name (a substring of the workout's focus/type, case-insensitive) to narrow it down. A match that isn't exactly one session returns an error explaining why, with nothing changed — retry with session_id or a narrower name, never guess. get_workout still gives full detail (exercise names, slot names SS1/SS2/WarmUp/Finisher) when needed; list_exercises first if adding or renaming. Call with only the fields that change — operations can combine in one call.
OPERATIONS:
Metadata: date, focus_type, location, notes, rpe, heart_points_moderate/peak.
set_updates: patch reps/weight/notes/equipment on a set, addressed by set_id OR by exercise_name + set_position (1-based, matches get_workout's "Set N").
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.
SUPERSET SLOTS: rename_exercises/remove_exercises match by exercise name alone unless scoped. If a name is in more than one slot and the user means only one, pass superset_slot (or { name, superset_slot } for remove_exercises) naming that slot from get_workout. Omitting it hits every occurrence, a real corruption risk.
LITERAL NAME: literal_name: true keeps the user's exact wording instead of the closest library match, skips the resolver, and gets no NSI score (no benchmark to compare an unmatched name against). Use for "call it exactly X", "not the standard one", "literally X", or a rejected match. Applies below.
EQUIPMENT (load basis): dumbbell_pair is one dumbbell in EACH hand, weight_lb PER HAND (2x for NSI); dumbbell_single is one implement total. Laterality (single-leg/arm) does NOT decide this alone. Set it when the user describes the load (each hand, machine, band); a wrong or missing tag silently halves or doubles NSI. Values: barbell, dumbbell_pair, dumbbell_single, machine, kettlebell, bodyweight, band, cable, trx, other.
A set_id or exercise_name+set_position matching more than one set (the same exercise in two superset slots) is ambiguous and errors rather than guessing — use the exact set_id from get_workout to disambiguate.
The result discloses a mismatched name from rename_exercises/add_exercises; relay it in your own words. If a name matches nothing closely enough, the result names near-miss library exercises; ask the user which they meant rather than accept the unscored custom log silently.
INFER — do not ask: session_date defaults to today, set positions count from 1 per exercise. Slot names and set_ids beyond what's inferable come from get_workout; canonical exercise names come from list_exercises.
SAVED WORKOUTS: pass saved_workout_id to edit a reusable Saved Workout instead of completed workout history. Use saved_workout_title and/or saved_exercise_updates. For progression requests, inspect real exercise history first rather than applying a deterministic formula.
| Name | Required | Description | Default |
|---|---|---|---|
| rpe | No | Session RPE, 1-10, half steps allowed: 5 moderate, 7 hard, 9 one rep left, 10 failure. Infer from comments about overall difficulty, or omit. | |
| date | No | New session date, YYYY-MM-DD. | |
| name | No | Substring of the focus/type, e.g. "Push", case-insensitive, to pick between sessions on session_date. Only without session_id. | |
| notes | No | New session notes. | |
| location | No | New location, e.g. Gym, Home. | |
| focus_type | No | New category, e.g. Push, Pull, Legs. | |
| session_id | No | Session ID, if known. See FIND THE SESSION above. | |
| remove_sets | No | Sets to delete. See OPERATIONS above. | |
| set_updates | No | Individual set corrections. | |
| session_date | No | YYYY-MM-DD, defaults to today. Finds the session when session_id is omitted. Distinct from `date`, which CHANGES the stored date. | |
| add_exercises | No | New exercises to add. Call list_exercises first for canonical names. | |
| move_exercises | No | Move exercises between superset slots. | |
| remove_exercises | No | Exercises to remove; matched sets deleted, empty slots removed automatically. See SUPERSET SLOTS above. | |
| rename_exercises | No | Rename logged exercises in place. | |
| saved_workout_id | No | Saved Workout ID to update instead of a completed workout session. | |
| heart_points_peak | No | New peak heart points. | |
| saved_workout_title | No | Optional new title for the Saved Workout. | |
| heart_points_moderate | No | New moderate heart points. | |
| saved_exercise_updates | No | Optional prescription edits matched by exercise name inside the Saved Workout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Human-readable result text returned by the tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false, destructiveHint=true, idempotentHint=true. The description adds exactly the contextual detail the rubric asks for: what gets destroyed ("remaining sets renumber; an emptied exercise/slot is removed automatically"), side effects (rename "preserves set IDs, RPE, notes; rebuilds NSI"), silent failure modes (missing equipment tag "silently halves or doubles NSI"), and error semantics (ambiguous matches "error rather than guessing," with "nothing changed"). No contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long (~450 words) but earns most of its length: 19 parameters, 8 operation types, and multiple addressing schemes justify dense detail, and the section headers (UNIT INPUTS, FIND THE SESSION, OPERATIONS, SUPERSET SLOTS, LITERAL NAME, EQUIPMENT, SAVED WORKOUTS) make it scannable, with the highest-risk guardrail (units) front-loaded. It loses a point for minor redundancies — the set-addressing concept is restated a few times, and it references input_distance_unit/input_length_unit that do not appear in the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary. The description covers every operational need: session disambiguation rules, ambiguity/error behavior, cross-tool prerequisites (get_workout for slot names and set_ids, list_exercises for canonical names, get_exercise_history for progression), the Saved Workout alternative, and post-call user communication ("relay it in your own words," "ask the user which they meant"). 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.
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 goes far beyond type/format notes: UNIT INPUTS explains when to set input_weight_unit and when to omit the companion; OPERATIONS defines the set_id vs exercise_name+set_position addressing duality; EQUIPMENT gives the load-basis meaning ("dumbbell_pair is one dumbbell in EACH hand, weight_lb PER HAND"); LITERAL NAME explains resolver-skipping and NSI implications. These are value semantics the schema alone could not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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" — and closes the scope with "Use for any post-log correction." This clearly differentiates it from log_workout (creation) and delete_workout (removal) among the large sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: "Use for any post-log correction." It routes to siblings with concrete conditions — "get_workout still gives full detail ... when needed; list_exercises first if adding or renaming" — and covers the alternative target via "pass saved_workout_id to edit a reusable Saved Workout instead of completed workout history." It even provides an exclusion: "For progression requests, inspect real exercise history first rather than applying a deterministic formula."
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. Dates show when Glama detected each change.
73 tool updates
v1.2.1- First observed
add_or_update_personal_context - First observed
cancel_rest_day - First observed
create_goal - First observed
delete_cycle - First observed
delete_injury - First observed
delete_lab_result - First observed
delete_meal - First observed
delete_recovery_session - First observed
delete_run - First observed
delete_wellbeing - First observed
delete_workout - First observed
get_app_guide_section - First observed
get_exercise_history - First observed
get_workout - First observed
list_blog_posts - First observed
list_body_metrics - First observed
list_cycle - First observed
list_exercises - First observed
list_goals - First observed
list_hydration - First observed
list_injuries - First observed
list_lab_markers - First observed
list_lab_results - First observed
list_meals - First observed
list_personal_context - First observed
list_recovery_sessions - First observed
list_recovery_strategies - First observed
list_rest_days - First observed
list_runs - First observed
list_sleep - First observed
list_supplements - First observed
list_wearable_data - First observed
list_wellbeing - First observed
list_workouts - First observed
log_body_metrics - First observed
log_cycle - First observed
log_injury - First observed
log_lab_results - First observed
log_meal - First observed
log_recovery_session - First observed
log_rest_day - First observed
log_run - First observed
log_sleep - First observed
log_supplement_taken - First observed
log_wearable - First observed
log_wellbeing - First observed
log_workout - First observed
manage_recovery_strategy - First observed
manage_supplement - First observed
mark_empty_day - First observed
show_body_composition - First observed
show_body_weight - First observed
show_exercise_progression - First observed
show_health_overview - First observed
show_meal_diary - First observed
show_recovery - First observed
show_runs - First observed
show_sleep_detail - First observed
show_week_fit_score - First observed
show_week_macros - First observed
show_week_sleep - First observed
show_week_steps - First observed
show_week_workouts - First observed
show_wellbeing - First observed
show_workout - First observed
update_cycle - First observed
update_goal - First observed
update_injury - First observed
update_lab_result - First observed
update_meal - First observed
update_recovery_session - First observed
update_wellbeing - First observed
update_workout
TDQS
Many tools serve near-identical read purposes: list_meals and show_meal_diary both answer "what did I eat today?", and list_wearable_data overlaps heavily with show_health_overview, show_recovery, and show_week_steps. While individual CRUD pairs are well-described, the sheer number of overlapping list/get/show variants makes misselection likely.
Most tools follow clean snake_case verb_noun patterns (log_meal, update_injury, delete_cycle) and each domain has a consistent CRUD family. The main deviations are the three read verbs (list_/get_/show_), plus broad "manage_" tools and add_or_update_personal_context, but the overall convention is still readable and mostly predictable.
73 tools is far beyond the 50+ extreme range for an MCP server. Although the wellness domain is broad, many show_* visualization tools and per-entity CRUD families duplicate each other and could be consolidated.
Core workflows are well covered: workouts, meals, labs, injuries, recovery, supplements, cycle, and goals all have create/read/update/delete or equivalent lifecycle tools. However, there are notable gaps: sleep/body metrics/wearable logs cannot be deleted, run entries cannot be updated, and personal_context explicitly has no delete capability.
Maintenance
Related MCP Connectors
- SomviaOAuthapp.somvia
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that connects Whoop fitness data to Claude, enabling natural language queries about recovery, sleep, workouts, and more.-
- AlicenseNot gradedqualityAmaintenanceMCP server that connects AI assistants like Claude to WHOOP health data, enabling natural language queries about recovery, sleep, workouts, and more.194149MIT
- AlicenseAqualityAmaintenanceAn MCP server that enables AI agents to query Apple Health data (190+ metrics) in natural language, including trends, comparisons, and structured exports.141963MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that securely syncs and queries your health data from Apple Health, storing it in your own Supabase Postgres database and exposing tools for AI assistants to retrieve weight, calories, macros, and more.21MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/turnnoblindeye/wellness-project-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server