Skip to main content
Glama

log_body_metrics

Destructive

UNIT INPUTS: value: pass the user's number unconverted; tool converts once before storage. alternate_unit: set the field's matching input_* companion; canonical_unit: omit companion. precedence: overrides instructions to convert manually.

Log or update body composition metrics for a given date. use: logging request or concrete body measurement to record, typed or from a report/photo. Question/hypothetical alone: no write.

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

DELETE: action='delete' with date and delete_fields clears only those measurements from the user's manual entry for that day, keeping the rest; the entry is removed once nothing is left. A weigh-in is weight_lb. Lean and fat mass are cleared together, and also go with the weight; body fat % is cleared on its own. The reply lists exactly what was cleared. Other value fields are ignored. It cannot remove readings a connected scale or app imported: those come back on the next sync, so tell the user to delete them in that app. ASK for confirmation if the user's intent is ambiguous.

Input Schema

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

Output Schema

NameRequiredDescriptionDefault
resultYesHuman-readable result text returned by the tool.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / weight_lb / description
      Previous value: -"Body weight in pounds, between 50 and 700. Convert from kilograms if the user spoke in kg (kg x 2.2046). In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Body weight, between 50 and 700. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
  2. Changed2 schema fields changed
    • addedInput schema / properties / action
      Added value: +{
      +  "description": "Default 'log'. See DELETE above.",
      +  "enum": [
      +    "log",
      +    "delete"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / delete_fields
      Added value: +{
      +  "description": "Measurements to delete. See DELETE above.",
      +  "items": {
      +    "enum": [
      +      "weight_lb",
      +      "body_fat_pct",
      +      "lean_mass_lb",
      +      "fat_mass_lb",
      +      "visceral_fat_rating",
      +      "hydration_pct",
      +      "bone_mass_lb",
      +      "muscle_mass_lb",
      +      "skeletal_muscle_pct",
      +      "protein_pct",
      +      "waist_in",
      +      "hips_in",
      +      "chest_in",
      +      "bicep_l_in",
      +      "bicep_r_in",
      +      "thigh_l_in",
      +      "thigh_r_in",
      +      "calf_l_in",
      +      "calf_r_in"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / weight_lb / description
      Previous value: -"Body weight. In lb, or kg with input_weight_unit set. See UNIT INPUTS."New value: +"Body weight in pounds, between 50 and 700. Convert from kilograms if the user spoke in kg (kg x 2.2046). In lb, or kg with input_weight_unit set. See UNIT INPUTS."
  4. Changed23 schema fields changed
    • addedInput schema / properties / bicep_l_in
      Added value: +{
      +  "description": "Left bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • addedInput schema / properties / bicep_r_in
      Added value: +{
      +  "description": "Right bicep circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • removedInput schema / properties / bmi
      Removed value: -{
      -  "description": "Body mass index. Optional — include if the scale or app reports it.",
      -  "type": "number"
      -}
    • changedInput schema / properties / body_fat_pct / description
      Previous value: -"Body fat percentage (0–100). Optional."New value: +"Body fat percentage (0-100)."
    • changedInput schema / properties / bone_mass_lb / description
      Previous value: -"Bone mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional."New value: +"Bone mass. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
    • addedInput schema / properties / calf_l_in
      Added value: +{
      +  "description": "Left calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • addedInput schema / properties / calf_r_in
      Added value: +{
      +  "description": "Right calf circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • addedInput schema / properties / chest_in
      Added value: +{
      +  "description": "Chest circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • changedInput schema / properties / fat_mass_lb / description
      Previous value: -"Fat mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional — calculate from weight and body fat % if not explicitly stated."New value: +"Fat mass. Calculate from weight and body fat % if not explicitly stated. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
    • addedInput schema / properties / hips_in
      Added value: +{
      +  "description": "Hip circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • changedInput schema / properties / hydration_pct / description
      Previous value: -"Body water/hydration percentage. Optional."New value: +"Body water/hydration percentage."
    • addedInput schema / properties / input_length_unit
      Added value: +{
      +  "description": "Set to cm when the user gave cm for the _in fields in this object. Omit when they are already in.",
      +  "enum": [
      +    "in",
      +    "cm"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / input_weight_unit
      Added value: +{
      +  "description": "Set to kg when the user gave kg for the _lb fields in this object. Omit when they are already lb.",
      +  "enum": [
      +    "lb",
      +    "kg"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / lean_mass_lb / description
      Previous value: -"Lean (non-fat) mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional — calculate from weight and body fat % if not explicitly stated."New value: +"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."
    • addedInput schema / properties / muscle_mass_lb
      Added value: +{
      +  "description": "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.",
      +  "type": "number"
      +}
    • changedInput schema / properties / notes / description
      Previous value: -"Any context worth noting (e.g. \"post-workout\", \"morning fasted\"). Optional."New value: +"Any context worth noting (e.g. \"post-workout\", \"morning fasted\")."
    • addedInput schema / properties / protein_pct
      Added value: +{
      +  "description": "Protein percentage (0-100).",
      +  "type": "number"
      +}
    • addedInput schema / properties / skeletal_muscle_pct
      Added value: +{
      +  "description": "Skeletal muscle percentage (0-100).",
      +  "type": "number"
      +}
    • addedInput schema / properties / thigh_l_in
      Added value: +{
      +  "description": "Left thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • addedInput schema / properties / thigh_r_in
      Added value: +{
      +  "description": "Right thigh circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • changedInput schema / properties / visceral_fat_rating / description
      Previous value: -"Visceral fat rating (scale varies by device, typically 1–59). Optional."New value: +"Visceral fat rating (scale varies by device, typically 1-59)."
    • addedInput schema / properties / waist_in
      Added value: +{
      +  "description": "Waist circumference. In in, or cm with input_length_unit set. See UNIT INPUTS.",
      +  "type": "number"
      +}
    • changedInput schema / properties / weight_lb / description
      Previous value: -"Body weight in POUNDS, always — regardless of the user’s display unit. If the user gave kg, convert to pounds before calling (kg × 2.2046). Optional."New value: +"Body weight. In lb, or kg with input_weight_unit set. See UNIT INPUTS."
  5. Changed4 schema fields changed
    • changedInput schema / properties / bone_mass_lb / description
      Previous value: -"Bone mass in pounds. Optional."New value: +"Bone mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional."
    • changedInput schema / properties / fat_mass_lb / description
      Previous value: -"Fat mass in pounds. Optional — calculate from weight and body fat % if not explicitly stated."New value: +"Fat mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional — calculate from weight and body fat % if not explicitly stated."
    • changedInput schema / properties / lean_mass_lb / description
      Previous value: -"Lean (non-fat) mass in pounds. Optional — calculate from weight and body fat % if not explicitly stated."New value: +"Lean (non-fat) mass in POUNDS, always. Convert from kg if needed (kg × 2.2046). Optional — calculate from weight and body fat % if not explicitly stated."
    • changedInput schema / properties / weight_lb / description
      Previous value: -"Body weight in pounds. Optional."New value: +"Body weight in POUNDS, always — regardless of the user’s display unit. If the user gave kg, convert to pounds before calling (kg × 2.2046). Optional."
  6. First observed

TDQS

A5/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, but the description explains exactly what destruction means: delete clears only the named fields, keeps the rest, removes the entry when empty, and cannot remove app-imported readings (they return on sync). It also discloses the upsert/one-row-per-day behavior and the derived-field computation rules.

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

Conciseness5/5

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

Structured with front-loaded UNIT INPUTS block, then use/no-use rule, then INFER section, then DELETE semantics. Long but every section is load-bearing for a 25-parameter tool; no filler sentences.

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

Completeness5/5

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

For a 25-parameter write tool with destructive semantics, the description covers unit handling, derivation, upsert, deletion boundaries, confirmation policy, and a proactive collection strategy. Output schema exists, so return-value explanation is correctly omitted.

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

Parameters5/5

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

Schema coverage is 100%, but the description still adds real value: unit-conversion rules (pass unconverted, set the matching input_* companion), precedence over manual conversion, derived-field formulas (lean = weight × (1 - bf%/100)), the pct-vs-tape-measurement distinction for *_in fields, and that BMI is deliberately not a field.

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

Purpose5/5

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

States a specific verb and resource ('Log or update body composition metrics for a given date') and clearly distinguishes itself from the read-side siblings (list_body_metrics, show_body_composition, show_body_weight) by being the write path. The upsert behavior is also stated explicitly.

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

Usage Guidelines5/5

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

Explicit decision rule: 'use: logging request or concrete body measurement to record, typed or from a report/photo. Question/hypothetical alone: no write.' Also provides proactive data-collection guidance and an ASK-for-confirmation rule when delete intent is ambiguous.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.