Skip to main content
Glama

update_meal

Destructive

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.

A meal imported from Cronometer, Fitbit, Apple Health, or Health Connect can't be edited here; the call refuses and names where to edit it instead. Relay that to the user rather than retrying.

FIND THE MEAL: call directly, no preliminary list for an ID or additive totals. Use id if known (it is in list_meals output and in the chat history's saved-records note after a log). 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: add_saved: add_recipe_name appends recipe food and ADDS its macros to current totals. Match: case-insensitive exact title, then substring; relay no-match/ambiguous errors. Stored recipe macros, including 0, are authoritative; explicit macros replace the recipe's contribution only for a correction or changed food/quantity. Missing recipe macros: estimate only the missing fields from returned food text and retry with the same selector and add_recipe_name. add_unsaved: add_food_items plus the four core macros (calories/protein_g/fat_g/carbs_g) for ONLY the new food; estimate those core values, never ask for them. Text appends; core macros ADD to current totals. alcohol_g: optional, omitted adds nothing. add_both: set add_recipe_name and add_food_items; ordinary core macro fields describe ONLY the unsaved addition. Recipe contributes its stored core macros. correct: both add_* unset; supplied fields REPLACE stored values. Send corrected totals, omit unchanged fields. Changed food_items: the four core macros for the WHOLE corrected meal; list_meals only if needed stored values are unavailable this turn. Additions and explicit value corrections need no pre-read. food_items: when supplied, replaces the description even in add modes. SATURATED FAT / FIBER: expanded nutrients, never required for an update. The estimator or a saved recipe's nutrient panel can fill omitted values, and core-macro updates work without them. 0 is a real value only when known, never a placeholder. ambiguous_add_vs_correct: ask before updating.

ESTIMATE: estimate (same format as log_meal's ESTIMATE section) supplies the nutrient estimate for whatever food this call changes -- the add_unsaved/add_both addition's own food, or, for a mode-3 food_items replacement, the WHOLE corrected meal. Omit to let the server estimate instead; never required.

MOVE TO A DIFFERENT DATE -> move_to_date. "move Tuesday's lunch to Wednesday": date/name/target_meal_type only SELECT which meal to update; they never move it. Set move_to_date to actually change the stored date, keeping the same id.

REMOVE ONE ADDED COMPONENT -> remove_item_name. Only works for a food previously recorded on THIS meal (add_recipe_name, add_food_items, or log_meal's own estimated items). If the meal has no such recorded item, this throws telling you to use mode 3 with corrected totals instead. An estimated item (log_meal's own food, no add_recipe_name/add_food_items involved) carries a name and gram estimate but no recorded calorie/macro split for that one item, so a precise subtraction isn't possible: this throws asking you to also send calories/protein_g/fat_g/carbs_g (the meal's corrected TOTALS after removing it) in the SAME call, which performs the removal and applies those totals together, in that order -- do this rather than a separate correcting call. Removing an item re-estimates the meal's nutrient panel from what remains (its updated food text and items), rather than leaving a stale estimate for food that's gone -- pass estimate here too to supply that re-estimate yourself instead of letting the server do it.

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. Drinks only; exclude food moisture.

CAFFEINE / DRINKS WHEN UPDATING: keep the two sidecars explicit in the same update_meal call. fluids is the hydration side and caffeine is the caffeine side; when a drink change affects both, send both. Omit either one when that side is unchanged so existing linked data is preserved. When ADDING caffeinated food/drink with add_food_items/add_recipe_name, caffeine contains only the new dose(s) and they are appended. When CORRECTING the meal's caffeine with both add_* fields omitted, caffeine is the complete corrected dose list and replaces linked caffeine only after replacement rows have been safely inserted. If the correction removes every caffeine dose, explicitly send caffeine: []. Each retained/new dose needs caffeine_mg and may optionally include source_type; its date follows the meal date.

SAVE AS RECIPE: when the user asks to save an already-logged meal as a reusable recipe, set save_as_recipe=true. This may be the only requested action: identify the real meal with id or the normal selectors and do not invent a food or macro edit. A follow-up like "save that as a recipe" after a successful log should use the known meal id plus save_as_recipe=true. Do not tell the user recipes cannot be saved from chat.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoMeal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above.
dateNoDate the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted. This only SELECTS which meal to update -- see move_to_date below to actually change a meal's stored date.
nameNoSubstring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted.
fat_gNoFat (g). See THREE MODES.
fluidsNoOptional drinks consumed in this intake, including liquid ingredients in shakes or smoothies. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking.
carbs_gNoCarbohydrates (g). See THREE MODES.
fiber_gNoOptional expanded nutrient: dietary fiber (g).
caffeineNoOptional caffeine doses in this intake. Keep each dose simple: caffeine amount is required and type is optional. The dose date follows the intake/meal date. If the user gave exact milligrams, preserve them exactly; otherwise estimate from the described food or drink.
caloriesNoCalories (kcal) never kJ
estimateNoThe compact 3-line nutrient estimate for the food this call adds or the WHOLE corrected meal on a food_items replacement. See ESTIMATE above for the format. Omit to have the server estimate instead -- never blocks the write either way. A block whose parts exceed their whole (saturated fat over fat, fiber over carbs) is discarded and re-estimated. NUTRIENT ID DICTIONARY (id=name, unit is the name's suffix; ug=mcg). Every id means exactly this nutrient, never guess the order: 1=fiber_g 2=sugar_g 3=saturated_fat_g 4=monounsaturated_fat_g 5=polyunsaturated_fat_g 6=trans_fat_g 7=cholesterol_mg 8=sodium_mg 9=potassium_mg 10=calcium_mg 11=iron_mg 12=magnesium_mg 13=phosphorus_mg 14=zinc_mg 15=copper_mg 16=manganese_mg 17=selenium_ug 18=chloride_mg 19=chromium_ug 20=iodine_ug 21=molybdenum_ug 22=vitamin_a_ug 23=vitamin_c_mg 24=vitamin_d_ug 25=vitamin_e_mg 26=vitamin_k_ug 27=thiamin_b1_mg 28=riboflavin_b2_mg 29=niacin_b3_mg 30=pantothenic_acid_b5_mg 31=vitamin_b6_mg 32=biotin_b7_ug 33=folate_b9_ug 34=folic_acid_ug 35=vitamin_b12_ug 36=choline_mg 37=omega3_g 38=omega6_g 39=caffeine_mg 40=water_g 41=starch_g 42=added_sugar_g 43=total_unsaturated_fat_g 44=fluoride_mg
alcohol_gNoAlcohol (g). See THREE MODES.
meal_typeNoUpdated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner), only when the user asks to change the type. A "For my breakfast:"-style label at the start of the message is the pill the user had open, not a request to change it. 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_gNoProtein (g). See THREE MODES.
food_itemsNoReplacement food description; omit to preserve or append. See THREE MODES.
move_to_dateNoMove this meal to a different date. Format: YYYY-MM-DD. Distinct from date above, which only finds the meal; this is what actually changes it, keeping the same id. Optional, omit if not moving the meal.
add_food_itemsNoUnsaved food description to add; omit unless adding unsaved food. See THREE MODES.
recipe_fiber_gNoOptional recipe-component fiber (g) for add_both.
save_as_recipeNoTrue only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.
add_recipe_nameNoSaved recipe name or close phrase to add; omit unless adding saved food. See THREE MODES.
saturated_fat_gNoOptional expanded nutrient: saturated fat (g).
remove_item_nameNoName or substring of a previously-recorded item to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Normally exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal, plus optionally estimate for the remaining meal -- EXCEPT when the tool has already refused this exact removal asking for corrected totals: then also send calories/protein_g/fat_g/carbs_g together with remove_item_name in the retry.
target_meal_typeNoWhich meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- "update today's breakfast" is target_meal_type: "Breakfast". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match.
recipe_saturated_fat_gNoOptional recipe-component saturated fat (g) for add_both.

Output Schema

TableJSON 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 / fluids / description
      Previous value: -"Optional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking."New value: +"Optional drinks consumed in this intake, including liquid ingredients in shakes or smoothies. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking."
  2. Changed5 schema fields changed
    • addedInput schema / properties / estimate
      Added value: +{
      +  "description": "The compact 3-line nutrient estimate for the food this call adds or the WHOLE corrected meal on a food_items replacement. See ESTIMATE above for the format. Omit to have the server estimate instead -- never blocks the write either way. A block whose parts exceed their whole (saturated fat over fat, fiber over carbs) is discarded and re-estimated.\n\nNUTRIENT ID DICTIONARY (id=name, unit is the name's suffix; ug=mcg). Every id means exactly this nutrient, never guess the order:\n1=fiber_g\n2=sugar_g\n3=saturated_fat_g\n4=monounsaturated_fat_g\n5=polyunsaturated_fat_g\n6=trans_fat_g\n7=cholesterol_mg\n8=sodium_mg\n9=potassium_mg\n10=calcium_mg\n11=iron_mg\n12=magnesium_mg\n13=phosphorus_mg\n14=zinc_mg\n15=copper_mg\n16=manganese_mg\n17=selenium_ug\n18=chloride_mg\n19=chromium_ug\n20=iodine_ug\n21=molybdenum_ug\n22=vitamin_a_ug\n23=vitamin_c_mg\n24=vitamin_d_ug\n25=vitamin_e_mg\n26=vitamin_k_ug\n27=thiamin_b1_mg\n28=riboflavin_b2_mg\n29=niacin_b3_mg\n30=pantothenic_acid_b5_mg\n31=vitamin_b6_mg\n32=biotin_b7_ug\n33=folate_b9_ug\n34=folic_acid_ug\n35=vitamin_b12_ug\n36=choline_mg\n37=omega3_g\n38=omega6_g\n39=caffeine_mg\n40=water_g\n41=starch_g\n42=added_sugar_g\n43=total_unsaturated_fat_g\n44=fluoride_mg",
      +  "type": "string"
      +}
    • addedInput schema / properties / fiber_g
      Added value: +{
      +  "description": "Optional expanded nutrient: dietary fiber (g).",
      +  "type": "number"
      +}
    • addedInput schema / properties / recipe_fiber_g
      Added value: +{
      +  "description": "Optional recipe-component fiber (g) for add_both.",
      +  "type": "number"
      +}
    • addedInput schema / properties / recipe_saturated_fat_g
      Added value: +{
      +  "description": "Optional recipe-component saturated fat (g) for add_both.",
      +  "type": "number"
      +}
    • addedInput schema / properties / saturated_fat_g
      Added value: +{
      +  "description": "Optional expanded nutrient: saturated fat (g).",
      +  "type": "number"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / calories / description
      Previous value: -"Calories (kcal). See THREE MODES for totals vs additions and conditional requirements."New value: +"Calories (kcal) never kJ"
  4. Changed4 schema fields changed
    • removedInput schema / properties / fiber_g
      Removed value: -{
      -  "description": "Dietary fiber (g). See SATURATED FAT / FIBER.",
      -  "type": "number"
      -}
    • removedInput schema / properties / recipe_fiber_g
      Removed value: -{
      -  "description": "Recipe-only fiber (g). See add_both in THREE MODES.",
      -  "type": "number"
      -}
    • removedInput schema / properties / recipe_saturated_fat_g
      Removed value: -{
      -  "description": "Recipe-only saturated fat (g). See add_both in THREE MODES.",
      -  "type": "number"
      -}
    • removedInput schema / properties / saturated_fat_g
      Removed value: -{
      -  "description": "Saturated fat (g). See SATURATED FAT / FIBER.",
      -  "type": "number"
      -}
  5. Changed1 schema field changed
    • removedInput schema / properties / estimate
      Removed value: -{
      -  "description": "The compact 3-line nutrient estimate for the food this call adds or the WHOLE corrected meal on a food_items replacement. See ESTIMATE above; the id-to-nutrient dictionary and its format are documented on get_nutrient_summary, not repeated here. Omit to have the server estimate instead -- never blocks the write either way.",
      -  "type": "string"
      -}
  6. Changed4 schema fields changed
    • removedInput schema / properties / add_components
      Removed value: -{
      -  "description": "Reference-resolved components for the add_food_items addition. See COMPONENTS above.",
      -  "items": {
      -    "properties": {
      -      "name": {
      -        "description": "The food or drink name, e.g. \"banana\", \"grilled chicken breast\".",
      -        "type": "string"
      -      },
      -      "quantity": {
      -        "description": "The amount, in the given unit, or a bare count. Omit when unknown.",
      -        "type": "number"
      -      },
      -      "quantity_source": {
      -        "description": "See COMPONENTS above.",
      -        "enum": [
      -          "stated",
      -          "estimated"
      -        ],
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Unit for quantity, e.g. \"g\", \"cup\", \"oz\", \"slice\". Omit for a bare count (\"2 eggs\").",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "name",
      -      "quantity_source"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • removedInput schema / properties / components
      Removed value: -{
      -  "description": "Reference-resolved components for a mode-3 food_items replacement. See COMPONENTS above.",
      -  "items": {
      -    "properties": {
      -      "name": {
      -        "description": "The food or drink name, e.g. \"banana\", \"grilled chicken breast\".",
      -        "type": "string"
      -      },
      -      "quantity": {
      -        "description": "The amount, in the given unit, or a bare count. Omit when unknown.",
      -        "type": "number"
      -      },
      -      "quantity_source": {
      -        "description": "See COMPONENTS above.",
      -        "enum": [
      -          "stated",
      -          "estimated"
      -        ],
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "Unit for quantity, e.g. \"g\", \"cup\", \"oz\", \"slice\". Omit for a bare count (\"2 eggs\").",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "name",
      -      "quantity_source"
      -    ],
      -    "type": "object"
      -  },
      -  "type": "array"
      -}
    • addedInput schema / properties / estimate
      Added value: +{
      +  "description": "The compact 3-line nutrient estimate for the food this call adds or the WHOLE corrected meal on a food_items replacement. See ESTIMATE above; the id-to-nutrient dictionary and its format are documented on get_nutrient_summary, not repeated here. Omit to have the server estimate instead -- never blocks the write either way.",
      +  "type": "string"
      +}
    • changedInput schema / properties / remove_item_name / description
      Previous value: -"Name or substring of a previously-recorded component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Normally exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal -- EXCEPT when the tool has already refused this exact removal asking for corrected totals: then also send calories/protein_g/fat_g/carbs_g together with remove_item_name in the retry."New value: +"Name or substring of a previously-recorded item to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Normally exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal, plus optionally estimate for the remaining meal -- EXCEPT when the tool has already refused this exact removal asking for corrected totals: then also send calories/protein_g/fat_g/carbs_g together with remove_item_name in the retry."
  7. Changed3 schema fields changed
    • addedInput schema / properties / add_components
      Added value: +{
      +  "description": "Reference-resolved components for the add_food_items addition. See COMPONENTS above.",
      +  "items": {
      +    "properties": {
      +      "name": {
      +        "description": "The food or drink name, e.g. \"banana\", \"grilled chicken breast\".",
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "description": "The amount, in the given unit, or a bare count. Omit when unknown.",
      +        "type": "number"
      +      },
      +      "quantity_source": {
      +        "description": "See COMPONENTS above.",
      +        "enum": [
      +          "stated",
      +          "estimated"
      +        ],
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Unit for quantity, e.g. \"g\", \"cup\", \"oz\", \"slice\". Omit for a bare count (\"2 eggs\").",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "quantity_source"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / components
      Added value: +{
      +  "description": "Reference-resolved components for a mode-3 food_items replacement. See COMPONENTS above.",
      +  "items": {
      +    "properties": {
      +      "name": {
      +        "description": "The food or drink name, e.g. \"banana\", \"grilled chicken breast\".",
      +        "type": "string"
      +      },
      +      "quantity": {
      +        "description": "The amount, in the given unit, or a bare count. Omit when unknown.",
      +        "type": "number"
      +      },
      +      "quantity_source": {
      +        "description": "See COMPONENTS above.",
      +        "enum": [
      +          "stated",
      +          "estimated"
      +        ],
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Unit for quantity, e.g. \"g\", \"cup\", \"oz\", \"slice\". Omit for a bare count (\"2 eggs\").",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "quantity_source"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / remove_item_name / description
      Previous value: -"Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal."New value: +"Name or substring of a previously-recorded component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Normally exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal -- EXCEPT when the tool has already refused this exact removal asking for corrected totals: then also send calories/protein_g/fat_g/carbs_g together with remove_item_name in the retry."
  8. Changed4 schema fields changed
    • removedInput schema / properties / fluids / items / properties / unit
      Removed value: -{
      -  "description": "Volume unit. Default ml.",
      -  "enum": [
      -    "ml",
      -    "fl_oz"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / fluids / items / properties / volume
      Removed value: -{
      -  "description": "Consumed drink volume in the supplied unit.",
      -  "type": "number"
      -}
    • addedInput schema / properties / fluids / items / properties / volume_ml
      Added value: +{
      +  "description": "Millilitres. Convert any other unit first.",
      +  "type": "number"
      +}
    • changedInput schema / properties / fluids / items / required
      Previous value: -[
      -  "volume"
      -]New value: +[
      +  "volume_ml"
      +]
  9. Changed12 schema fields changed
    • changedInput schema / properties / add_food_items / description
      Previous value: -"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."New value: +"Unsaved food description to add; omit unless adding unsaved food. See THREE MODES."
    • changedInput schema / properties / add_recipe_name / description
      Previous value: -"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."New value: +"Saved recipe name or close phrase to add; omit unless adding saved food. See THREE MODES."
    • changedInput schema / properties / alcohol_g / description
      Previous value: -"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."New value: +"Alcohol (g). See THREE MODES."
    • changedInput schema / properties / calories / description
      Previous value: -"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."New value: +"Calories (kcal). See THREE MODES for totals vs additions and conditional requirements."
    • changedInput schema / properties / carbs_g / description
      Previous value: -"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Carbohydrates (g). See THREE MODES."
    • changedInput schema / properties / fat_g / description
      Previous value: -"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Fat (g). See THREE MODES."
    • changedInput schema / properties / fiber_g / description
      Previous value: -"Updated dietary fiber in grams. See SATURATED FAT / FIBER above."New value: +"Dietary fiber (g). See SATURATED FAT / FIBER."
    • changedInput schema / properties / food_items / description
      Previous value: -"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."New value: +"Replacement food description; omit to preserve or append. See THREE MODES."
    • changedInput schema / properties / protein_g / description
      Previous value: -"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Protein (g). See THREE MODES."
    • changedInput schema / properties / recipe_fiber_g / description
      Previous value: -"Dietary fiber in grams of the add_recipe_name recipe alone, only when add_food_items is also set. See mode 2 above."New value: +"Recipe-only fiber (g). See add_both in THREE MODES."
    • changedInput schema / properties / recipe_saturated_fat_g / description
      Previous value: -"Saturated fat in grams of the add_recipe_name recipe alone, only when add_food_items is also set. See mode 2 above."New value: +"Recipe-only saturated fat (g). See add_both in THREE MODES."
    • changedInput schema / properties / saturated_fat_g / description
      Previous value: -"Updated saturated fat in grams. See SATURATED FAT / FIBER above."New value: +"Saturated fat (g). See SATURATED FAT / FIBER."
  10. Changed5 schema fields changed
    • changedInput schema / properties / fiber_g / description
      Previous value: -"Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated dietary fiber in grams. See SATURATED FAT / FIBER above."
    • changedInput schema / properties / meal_type / description
      Previous value: -"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."New value: +"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner), only when the user asks to change the type. A \"For my breakfast:\"-style label at the start of the message is the pill the user had open, not a request to change it. 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."
    • addedInput schema / properties / recipe_fiber_g
      Added value: +{
      +  "description": "Dietary fiber in grams of the add_recipe_name recipe alone, only when add_food_items is also set. See mode 2 above.",
      +  "type": "number"
      +}
    • addedInput schema / properties / recipe_saturated_fat_g
      Added value: +{
      +  "description": "Saturated fat in grams of the add_recipe_name recipe alone, only when add_food_items is also set. See mode 2 above.",
      +  "type": "number"
      +}
    • changedInput schema / properties / saturated_fat_g / description
      Previous value: -"Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated saturated fat in grams. See SATURATED FAT / FIBER above."
  11. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Meal ID only if it came from a real meal/tool result; never invent or guess it. Otherwise omit it and use date + name/target_meal_type, see FIND THE MEAL above."New value: +"Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above."
  12. Changed14 schema fields changed
    • changedInput schema / properties / add_food_items / description
      Previous value: -"Optional. Description of food to ADD to this meal that is not a saved recipe. Requires calories/protein_g/fat_g/carbs_g for just this new food."New value: +"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."
    • removedInput schema / properties / add_recipe_multiplier
      Removed value: -{
      -  "description": "Positive serving multiplier for add_recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
      -  "type": "number"
      -}
    • changedInput schema / properties / add_recipe_name / description
      Previous value: -"Optional. Name or close phrase for one saved recipe to FOLD INTO this meal. Adds the recipe food and stored macros; distinct from log_meal recipe_name."New value: +"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."
    • changedInput schema / properties / alcohol_g / description
      Previous value: -"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories, optional for additions."New value: +"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."
    • changedInput schema / properties / calories / description
      Previous value: -"Updated total calories (kcal). REPLACES unless an add_* field is present, then it is the amount for the applicable new contribution."New value: +"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."
    • changedInput schema / properties / carbs_g / description
      Previous value: -"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • changedInput schema / properties / fat_g / description
      Previous value: -"Updated fat in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • changedInput schema / properties / fiber_g / description
      Previous value: -"Updated dietary fiber in grams. Optional."New value: +"Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above."
    • changedInput schema / properties / food_items / description
      Previous value: -"Updated food description. Optional, omit if not changing. Without add_* it REPLACES; with add_* it overrides the appended description."New value: +"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."
    • changedInput schema / properties / meal_type / description
      Previous value: -"Updated meal type to WRITE onto the meal. Optional, omit if not changing. Never inferred from add_recipe_name."New value: +"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."
    • changedInput schema / properties / protein_g / description
      Previous value: -"Updated protein in grams. Same REPLACE-vs-ADD rule as calories."New value: +"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • changedInput schema / properties / remove_item_name / description
      Previous value: -"Name or substring of a previously-added component to remove from this meal. Exclusive of every other field below; only selectors may accompany it."New value: +"Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal."
    • changedInput schema / properties / saturated_fat_g / description
      Previous value: -"Updated saturated fat in grams. Optional."New value: +"Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above."
    • changedInput schema / properties / target_meal_type / description
      Previous value: -"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day. This is NEVER written to the meal; it only narrows the search. Distinct from meal_type below, which SETS the new type."New value: +"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- \"update today's breakfast\" is target_meal_type: \"Breakfast\". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match."
  13. Changed14 schema fields changed
    • changedInput schema / properties / add_food_items / description
      Previous value: -"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."New value: +"Optional. Description of food to ADD to this meal that is not a saved recipe. Requires calories/protein_g/fat_g/carbs_g for just this new food."
    • addedInput schema / properties / add_recipe_multiplier
      Added value: +{
      +  "description": "Positive serving multiplier for add_recipe_name, e.g. 0.5 for half or 2 for double. Omit for one saved serving.",
      +  "type": "number"
      +}
    • changedInput schema / properties / add_recipe_name / description
      Previous value: -"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."New value: +"Optional. Name or close phrase for one saved recipe to FOLD INTO this meal. Adds the recipe food and stored macros; distinct from log_meal recipe_name."
    • changedInput schema / properties / alcohol_g / description
      Previous value: -"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."New value: +"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories, optional for additions."
    • changedInput schema / properties / calories / description
      Previous value: -"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."New value: +"Updated total calories (kcal). REPLACES unless an add_* field is present, then it is the amount for the applicable new contribution."
    • changedInput schema / properties / carbs_g / description
      Previous value: -"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories."
    • changedInput schema / properties / fat_g / description
      Previous value: -"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated fat in grams. Same REPLACE-vs-ADD rule as calories."
    • changedInput schema / properties / fiber_g / description
      Previous value: -"Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated dietary fiber in grams. Optional."
    • changedInput schema / properties / food_items / description
      Previous value: -"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."New value: +"Updated food description. Optional, omit if not changing. Without add_* it REPLACES; with add_* it overrides the appended description."
    • changedInput schema / properties / meal_type / description
      Previous value: -"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."New value: +"Updated meal type to WRITE onto the meal. Optional, omit if not changing. Never inferred from add_recipe_name."
    • changedInput schema / properties / protein_g / description
      Previous value: -"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."New value: +"Updated protein in grams. Same REPLACE-vs-ADD rule as calories."
    • changedInput schema / properties / remove_item_name / description
      Previous value: -"Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal."New value: +"Name or substring of a previously-added component to remove from this meal. Exclusive of every other field below; only selectors may accompany it."
    • changedInput schema / properties / saturated_fat_g / description
      Previous value: -"Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above."New value: +"Updated saturated fat in grams. Optional."
    • changedInput schema / properties / target_meal_type / description
      Previous value: -"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day -- \"update today's breakfast\" is target_meal_type: \"Breakfast\". Case-insensitive, only used when id is omitted. This is NEVER written to the meal; it only narrows the search, exactly like name above. Distinct from meal_type below, which SETS the new type to write. If no meal of this type is logged on the date, the call throws naming the meal types that ARE logged that day and changes nothing -- it never falls back to whichever meal the date happens to match."New value: +"Which meal type to FIND on the date, e.g. Breakfast, to disambiguate multiple meals logged that day. This is NEVER written to the meal; it only narrows the search. Distinct from meal_type below, which SETS the new type."
  14. Changed2 schema fields changed
    • addedInput schema / properties / fiber_g
      Added value: +{
      +  "description": "Updated dietary fiber in grams. Optional, see SATURATED FAT / FIBER above.",
      +  "type": "number"
      +}
    • addedInput schema / properties / saturated_fat_g
      Added value: +{
      +  "description": "Updated saturated fat in grams. Optional, see SATURATED FAT / FIBER above.",
      +  "type": "number"
      +}
  15. Changed1 schema field changed
    • addedInput schema / properties / save_as_recipe
      Added value: +{
      +  "description": "True only when the user explicitly asks to save this meal as a reusable recipe. The recipe is copied from the final persisted meal. On update_meal, this can be the only requested action; use the real meal id or normal selectors and do not invent an edit.",
      +  "type": "boolean"
      +}
  16. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above."New value: +"Meal ID only if it came from a real meal/tool result; never invent or guess it. Otherwise omit it and use date + name/target_meal_type, see FIND THE MEAL above."
  17. Changed5 schema fields changed
    • changedInput schema / properties / add_food_items / description
      Previous value: -"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Mutually exclusive with add_recipe_name -- never set both; if adding a saved recipe and separate ad-hoc food, make two calls."New value: +"Optional. Description of food to ADD to this meal that ISN'T a saved recipe, e.g. \"a banana\", \"small coffee with cream\" (see ADD FOOD THAT WASN'T SAVED above). Requires calories/protein_g/fat_g/carbs_g to be set to the estimated macros of just this new food -- never the meal's new total. Appends this text onto the meal's existing food_items and adds the macro fields onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). May be set together with add_recipe_name in one call, see mode 2 above."
    • changedInput schema / properties / add_recipe_name / description
      Previous value: -"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. Mutually exclusive with add_food_items -- never set both."New value: +"Optional. Name (or a close phrase) of one of the user's saved recipes to FOLD INTO this meal, e.g. \"kombucha\", \"protein shake\" (see FOLD IN A SAVED RECIPE above). Adds the recipe's food text and macros onto the meal's current values; never use this to replace a meal outright (omit it and pass food_items/calories/etc. directly for that). Distinct from log_meal's recipe_name, which SETS a new meal's fields instead of adding to one that already exists. May be set together with add_food_items in one call, see mode 2 above."
    • changedInput schema / properties / date / description
      Previous value: -"Date the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted."New value: +"Date the meal was logged. Format: YYYY-MM-DD. Used with name and/or target_meal_type to find the meal when id is omitted; defaults to today if id and date are both omitted. This only SELECTS which meal to update -- see move_to_date below to actually change a meal's stored date."
    • addedInput schema / properties / move_to_date
      Added value: +{
      +  "description": "Move this meal to a different date. Format: YYYY-MM-DD. Distinct from date above, which only finds the meal; this is what actually changes it, keeping the same id. Optional, omit if not moving the meal.",
      +  "type": "string"
      +}
    • addedInput schema / properties / remove_item_name
      Added value: +{
      +  "description": "Name or substring of a previously-added component to remove from this meal (see REMOVE ONE ADDED COMPONENT above). Exclusive of every other field below -- only id/date/name/target_meal_type may accompany it, to select the meal.",
      +  "type": "string"
      +}
  18. Changed2 schema fields changed
    • changedInput schema / properties / fluids / items / properties / beverage_type / description
      Previous value: -"Broad drink type. Default water. Use other when the exact drink is not in the enum and preserve its name in beverage_name."New value: +"Broad drink type. Default water. Energy drinks are accepted and stored as other; preserve the exact drink in beverage_name."
    • changedInput schema / properties / fluids / items / properties / beverage_type / enum
      Previous value: -[
      -  "water",
      -  "electrolyte",
      -  "sports_drink",
      -  "coffee",
      -  "tea",
      -  "juice",
      -  "milk",
      -  "soda",
      -  "broth",
      -  "other"
      -]New value: +[
      +  "water",
      +  "electrolyte",
      +  "sports_drink",
      +  "coffee",
      +  "tea",
      +  "juice",
      +  "milk",
      +  "soda",
      +  "broth",
      +  "other",
      +  "energy_drink"
      +]
  19. Changed10 schema fields changed
    • changedInput schema / properties / caffeine / description
      Previous value: -"Optional caffeine doses in this intake. Every dose must identify the ingested caffeine source. If the user gave exact milligrams, preserve them exactly. If only a food/drink is described, estimate caffeine with the same nutrition-estimation judgment used for meal macros. Each item preserves its consumed time."New value: +"Optional caffeine doses in this intake. Keep each dose simple: caffeine amount is required and type is optional. The dose date follows the intake/meal date. If the user gave exact milligrams, preserve them exactly; otherwise estimate from the described food or drink."
    • changedInput schema / properties / caffeine / items / properties / caffeine_mg / description
      Previous value: -"Caffeine in milligrams. Preserve an explicit user amount exactly; otherwise estimate from the described source."New value: +"Caffeine in milligrams. Preserve an explicit user amount exactly; otherwise estimate from the described intake."
    • removedInput schema / properties / caffeine / items / properties / consumed_at
      Removed value: -{
      -  "description": "Alternative ISO 8601 timestamp with offset. Optional.",
      -  "type": "string"
      -}
    • removedInput schema / properties / caffeine / items / properties / consumed_date
      Removed value: -{
      -  "description": "Local date YYYY-MM-DD. Default: the meal date, then today.",
      -  "type": "string"
      -}
    • removedInput schema / properties / caffeine / items / properties / consumed_time
      Removed value: -{
      -  "description": "Local time HH:MM. Default: current local time for today; ask rather than invent a time for historical intake.",
      -  "type": "string"
      -}
    • removedInput schema / properties / caffeine / items / properties / note
      Removed value: -{
      -  "description": "Additional context. Optional.",
      -  "type": "string"
      -}
    • removedInput schema / properties / caffeine / items / properties / source_name
      Removed value: -{
      -  "description": "Specific food, drink, supplement, or product name. Required when source_type is other; optional otherwise.",
      -  "type": "string"
      -}
    • changedInput schema / properties / caffeine / items / properties / source_type / description
      Previous value: -"Required broad ingested caffeine source. Use other only when source_name identifies the specific food, drink, or supplement."New value: +"Optional broad caffeine type."
    • removedInput schema / properties / caffeine / items / properties / source_type / enumFallback
      Removed value: -{
      -  "annotate": "source_name",
      -  "value": "other"
      -}
    • changedInput schema / properties / caffeine / items / required
      Previous value: -[
      -  "caffeine_mg",
      -  "source_type"
      -]New value: +[
      +  "caffeine_mg"
      +]
  20. Changed1 schema field changed
    • addedInput schema / properties / caffeine
      Added value: +{
      +  "description": "Optional caffeine doses in this intake. Every dose must identify the ingested caffeine source. If the user gave exact milligrams, preserve them exactly. If only a food/drink is described, estimate caffeine with the same nutrition-estimation judgment used for meal macros. Each item preserves its consumed time.",
      +  "items": {
      +    "properties": {
      +      "caffeine_mg": {
      +        "description": "Caffeine in milligrams. Preserve an explicit user amount exactly; otherwise estimate from the described source.",
      +        "type": "number"
      +      },
      +      "consumed_at": {
      +        "description": "Alternative ISO 8601 timestamp with offset. Optional.",
      +        "type": "string"
      +      },
      +      "consumed_date": {
      +        "description": "Local date YYYY-MM-DD. Default: the meal date, then today.",
      +        "type": "string"
      +      },
      +      "consumed_time": {
      +        "description": "Local time HH:MM. Default: current local time for today; ask rather than invent a time for historical intake.",
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "Additional context. Optional.",
      +        "type": "string"
      +      },
      +      "source_name": {
      +        "description": "Specific food, drink, supplement, or product name. Required when source_type is other; optional otherwise.",
      +        "type": "string"
      +      },
      +      "source_type": {
      +        "description": "Required broad ingested caffeine source. Use other only when source_name identifies the specific food, drink, or supplement.",
      +        "enum": [
      +          "coffee",
      +          "espresso",
      +          "tea",
      +          "energy_drink",
      +          "soda",
      +          "pre_workout",
      +          "supplement",
      +          "other"
      +        ],
      +        "enumFallback": {
      +          "annotate": "source_name",
      +          "value": "other"
      +        },
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "caffeine_mg",
      +      "source_type"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  21. Changed16 schema fields changed
    • addedInput schema / properties / add_food_items
      Added value: +{
      +  "description": "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.",
      +  "type": "string"
      +}
    • addedInput schema / properties / add_recipe_name
      Added value: +{
      +  "description": "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.",
      +  "type": "string"
      +}
    • changedInput schema / properties / alcohol_g / description
      Previous value: -"Updated alcohol in grams. Optional — omit if not changing."New value: +"Updated alcohol in grams. Same REPLACE-vs-ADD rule as calories above, except this one stays optional even with add_recipe_name or add_food_items set: omitting it just adds nothing."
    • changedInput schema / properties / calories / description
      Previous value: -"Updated total calories (kcal). Optional — omit if not changing."New value: +"Updated total calories (kcal). Optional, omit if not changing (or, with add_recipe_name, if the recipe already has a stored value). REPLACES the current value unless add_recipe_name or add_food_items is also set, in which case this is the AMOUNT BEING ADDED (the new food's own calories, not the meal's new total), added onto the meal's current value. Required whenever add_food_items is set, since there is no saved recipe to fall back on."
    • changedInput schema / properties / carbs_g / description
      Previous value: -"Updated carbohydrates in grams. Optional — omit if not changing."New value: +"Updated carbohydrates in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • addedInput schema / properties / date
      Added value: +{
      +  "description": "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.",
      +  "type": "string"
      +}
    • changedInput schema / properties / fat_g / description
      Previous value: -"Updated fat in grams. Optional — omit if not changing."New value: +"Updated fat in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • addedInput schema / properties / fluids
      Added value: +{
      +  "description": "Optional drinks consumed in this intake. Omit when no drink amount is known. Hydration is persisted only when the user enabled hydration tracking.",
      +  "items": {
      +    "properties": {
      +      "alcohol_g": {
      +        "description": "Alcohol grams in this specific drink. Required per alcoholic fluid when more than one drink is present.",
      +        "type": "number"
      +      },
      +      "beverage_name": {
      +        "description": "Specific drink name when useful, e.g. IPA, vodka soda, latte.",
      +        "type": "string"
      +      },
      +      "beverage_type": {
      +        "description": "Broad drink type. Default water. Use other when the exact drink is not in the enum and preserve its name in beverage_name.",
      +        "enum": [
      +          "water",
      +          "electrolyte",
      +          "sports_drink",
      +          "coffee",
      +          "tea",
      +          "juice",
      +          "milk",
      +          "soda",
      +          "broth",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "Volume unit. Default ml.",
      +        "enum": [
      +          "ml",
      +          "fl_oz"
      +        ],
      +        "type": "string"
      +      },
      +      "volume": {
      +        "description": "Consumed drink volume in the supplied unit.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "volume"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / food_items / description
      Previous value: -"Updated food description. Optional — omit if not changing."New value: +"Updated food description. Optional, omit if not changing. With add_recipe_name and add_food_items both omitted, this REPLACES the current description outright. With either one present and this omitted, the new food's text (the recipe's stored food_items, or add_food_items itself) is appended instead. Passing this alongside add_recipe_name/add_food_items overrides the append with this exact text."
    • changedInput schema / properties / id / description
      Previous value: -"Meal ID from list_meals. Required — do not proceed without it."New value: +"Meal ID, if already known. Alternative to date + name/target_meal_type, see FIND THE MEAL above."
    • changedInput schema / properties / meal_type / description
      Previous value: -"Updated meal type. Optional — omit if not changing."New value: +"Updated meal type to WRITE onto the meal (e.g. reclassify a Snack as Dinner). Optional, omit if not changing. Never inferred from add_recipe_name. Distinct from target_meal_type above, which FINDS a meal by its current type and is never written."
    • changedInput schema / properties / meal_type / enum
      Previous value: -[
      -  "Breakfast",
      -  "Lunch",
      -  "Dinner",
      -  "Snack",
      -  "Post-Workout"
      -]New value: +[
      +  "Breakfast",
      +  "Lunch",
      +  "Dinner",
      +  "Snack",
      +  "Post-Workout",
      +  "Shake",
      +  "Other"
      +]
    • addedInput schema / properties / name
      Added value: +{
      +  "description": "Substring of the food description (case-insensitive) to disambiguate multiple meals on the same date. Only used when id is omitted.",
      +  "type": "string"
      +}
    • changedInput schema / properties / protein_g / description
      Previous value: -"Updated protein in grams. Optional — omit if not changing."New value: +"Updated protein in grams. Same REPLACE-vs-ADD rule as calories above, including required-with-add_food_items."
    • addedInput schema / properties / target_meal_type
      Added value: +{
      +  "description": "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.",
      +  "enum": [
      +    "Breakfast",
      +    "Lunch",
      +    "Dinner",
      +    "Snack",
      +    "Post-Workout",
      +    "Shake",
      +    "Other"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "id"
      -]
  22. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructive/not-idempotent/not-readonly, and the description goes well beyond them: refusal on imported meals with instructions to relay rather than retry, no-op on ambiguous matches with ask-the-user policy, replace-vs-append semantics for each mode, hydration/caffeine preservation rules, and ordered insert-then-replace behavior. Side effects and failure paths are unusually well disclosed.

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

Conciseness4/5

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

Front-loaded with the triggering condition and route-away rules, and the ALL-CAPS section headers (FIND THE MEAL, THREE MODES, ESTIMATE) make it scannable despite its length. It is verbose and repeats the append/replace rule for fluids and caffeine, but for a 23-parameter tool with four modes and two sidecars most sentences carry real load.

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?

Selection (id vs date+name/target_meal_type), all three add modes, correction, removal, date move, recipe save, sidecar handling, and both error paths are covered; an output schema exists, so return values need no explanation. Nothing an agent needs to invoke this correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, but the description supplies the semantics the schema defers to it for: the add vs correct modes (adds ADD to totals, corrections REPLACE), meal_type (writes) vs target_meal_type (finds only), fluids/caffeine append-when-adding vs full-list-replace-when-correcting, and the remove_item_name retry exception. This is meaning well beyond the field types.

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 ('Update an existing meal') and immediately carves out its boundaries against siblings: plain food statements go to log_meal, date changes go to move_to_date, component removal goes to remove_item_name. An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('only when the current message explicitly changes, corrects, or adds'), when-not ('never infer an update from earlier chat history'), and named alternatives for adjacent operations (log_meal, move_to_date, remove_item_name, and mode 3 corrected totals instead of remove when no recorded item exists). This is about as complete as routing guidance gets.

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.