Server definition
- Hash
- sha256:c035e446983ff215fbad899aacf011aa7869c3a414890774444e9d359d842b84
- What it is
- What a remote MCP server returned when asked what it offers: 11 tools
The blob, as servednamed by its sha256
{
"instructions": "Forkmate is the user's private food diary and calorie/macro tracker; relevant whenever the user mentions food they ate, calories, macros, protein or nutrition goals. search_foods and lookup_barcode return macros per 100 g. Before logging, scale every macro to the grams actually eaten (macro × grams ÷ 100); log_meal stores macros exactly as sent and never re-scales them. When a candidate has serving_grams/serving_label, the user may answer in servings, but convert servings to grams first: serving_grams 48, serving_label '1 frank', eaten twice → 96 g → per-100 g macros × 0.96, quantity '2 × 1 frank (96 g)'. Never log per-100 g values as if they were one serving. Include estimated kcal, protein, carb and fat for every item you log, scaled to the portion. When logging a database candidate, pass its `source`. For drinks and caffeinated foods, include fluid_ml and caffeine_mg when known (e.g. ~95 mg for an 8 oz brewed coffee); omit them rather than guess. When a chain-menu candidate carries a provenance caveat, relay it to the user verbatim; it changes what they should log. When the user names a food without an amount, log one typical portion instead of asking first: the candidate's serving_grams when it has one and the serving_label is a whole item, otherwise a typical portion as the food is usually sold or served, not the smallest reference serving. Record the assumed amount in `quantity` with '~' and the word 'typical', e.g. '1 typical deli sandwich (~200 g)'. In the reply, say the portion was assumed and the figures are estimates, and that the user can change the size. For foods without a natural unit (pasta, rice, cereal, nuts, a bowl or plate of something), offer smaller or larger in the same reply. Ask before logging only when the user counts carbs for insulin, when the food itself is unclear, or when the amount of a powder, drink mix or oil is unknown. Make the size offer once, in neutral words such as 'a different size?', covering the whole meal rather than each item, and do not follow up about it. Never imply the user under-reported or ask them to double-check, never praise a small number or a light meal, never remark that a portion was large, and never call a food good or bad. Calorie and macro values, carbohydrates included, are estimates. Show them unless the user has asked not to see numbers, but never compute an insulin dose, an insulin-to-carb calculation or a glucose prediction from them. If the user says they are counting carbs for insulin, say plainly that these figures are not dosing-grade and point them to the package label and their care team. If the user has asked not to see numbers, confirm the food and portion in words only. Treat saved allergies as hard exclusions when suggesting food. They are self-reported and cover only the nine major US allergens, so ask about others directly and remind the user to check ingredient labels. Dislikes are preferences to de-prioritize, never allergies. The food profile (get_preferences for likes, dislikes, diet style and allergies; get_usual_foods for what the user usually and recently eats) can inform meal suggestions and 'the usual' logging. Allergies are hard constraints; likes, dislikes and usual foods are a starting point, not a rule. The profile describes taste and habit: no food in it is good or bad, and it is never on its own a reason to suggest eating less, skipping meals or cutting foods out. A dislike of a nutrient or food group (e.g. 'carbs', 'sugar') is a taste note saved as said, not a restriction to plan around or praise. update_preferences records what the user says about their own tastes and allergies, not inferences from their diary. Before every update_preferences call, show the user the exact change (each food or allergen added or removed, and any diet-style change) and ask them to confirm; call it with user_approved: true only after they say yes, and never set it on your own. A user stating a taste or an allergy ('I don't like olives', 'I'm allergic to peanuts') is not a yes: reply by proposing the change and asking, and do not call update_preferences in that turn. Only the user's next message saying yes to that proposal approves it. When the change removes an allergy, say explicitly that Forkmate will stop treating that allergen as a hard exclusion. Entries are identified by `id` and `local_date`. Every log_meal, get_day, get_range and update_meal reply lists each entry with its id in the text, so the entry just logged can be corrected or deleted by that id. To correct, delete or repeat a logged meal, read the day with get_day (today by default): it lists each food's item_index, quantity and macros. Never ask the user for an entry id. To repeat a meal with changes, log the remaining foods with the macros get_day shows.",
"tools": [
{
"description": "Delete one food from a diary entry (by `item_index`), or the whole entry (without it). The entry is identified by `id` and `local_date`. Deletion is permanent, with no undo; deleting the last food removes the entry, and an `id` that matches no entry on that date returns a not-found error and deletes nothing. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"properties": {
"id": {
"description": "The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read.",
"type": "string"
},
"item_index": {
"description": "Which food to remove (0-based). Omit to delete the whole entry.",
"type": "number"
},
"local_date": {
"description": "YYYY-MM-DD diary date of the entry.",
"type": "string"
}
},
"required": [
"id",
"local_date"
],
"type": "object"
},
"name": "delete_meal",
"outputSchema": {
"properties": {
"day_totals": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"entry_count": {
"type": "integer"
},
"fluid_ml": {
"type": "number"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
}
},
"required": [
"local_date",
"entry_count",
"totals"
],
"type": "object"
},
"entry": {
"anyOf": [
{
"description": "One diary entry: a meal with its foods.",
"properties": {
"at": {
"description": "ISO-8601 UTC instant the food was eaten.",
"type": "string"
},
"id": {
"description": "Identifies the entry for a later edit or deletion.",
"type": "string"
},
"items": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"fluid_ml": {
"type": "number"
},
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [],
"type": "object"
},
"name": {
"type": "string"
},
"quantity": {
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"description": "breakfast, lunch, dinner or snack, when set.",
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"at",
"local_date",
"items"
],
"type": "object"
},
{
"type": "null"
}
],
"description": "What remains of the entry, or null."
},
"removed": {
"type": "boolean"
}
},
"required": [
"removed",
"entry",
"day_totals"
],
"type": "object"
}
},
{
"description": "Read the user's food diary for one day: its entries, each listed with its `id` and each food with its item_index, quantity and macros, and calorie/macro totals. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"properties": {
"local_date": {
"description": "YYYY-MM-DD; defaults to today.",
"type": "string"
}
},
"type": "object"
},
"name": "get_day",
"outputSchema": {
"properties": {
"entries": {
"items": {
"description": "One diary entry: a meal with its foods.",
"properties": {
"at": {
"description": "ISO-8601 UTC instant the food was eaten.",
"type": "string"
},
"id": {
"description": "Identifies the entry for a later edit or deletion.",
"type": "string"
},
"items": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"fluid_ml": {
"type": "number"
},
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [],
"type": "object"
},
"name": {
"type": "string"
},
"quantity": {
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"description": "breakfast, lunch, dinner or snack, when set.",
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"at",
"local_date",
"items"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"entry_count": {
"type": "integer"
},
"fluid_ml": {
"type": "number"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
}
},
"required": [
"local_date",
"entry_count",
"totals"
],
"type": "object"
}
},
"required": [
"local_date",
"entries",
"totals"
],
"type": "object"
}
},
{
"description": "Read the user's food profile: diet style, allergies (a structured list of the major US allergens), foods they like, foods they dislike, and a typical-portion note. Allergies are self-reported and not a safety guarantee; the response includes an allergy_disclaimer. Likes and dislikes are taste preferences, not allergies or restrictions.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_preferences",
"outputSchema": {
"properties": {
"allergies": {
"items": {
"type": "string"
},
"type": "array"
},
"allergy_disclaimer": {
"type": "string"
},
"diet_style": {
"type": [
"string",
"null"
]
},
"dislikes": {
"items": {
"type": "string"
},
"type": "array"
},
"likes": {
"items": {
"type": "string"
},
"type": "array"
},
"portion_note": {
"type": [
"string",
"null"
]
}
},
"required": [
"diet_style",
"allergies",
"likes",
"dislikes",
"portion_note",
"allergy_disclaimer"
],
"type": "object"
}
},
{
"description": "Read the user's food diary across a date range, with per-day calorie/macro totals and each entry listed with its `id`. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"properties": {
"end": {
"description": "YYYY-MM-DD (inclusive).",
"type": "string"
},
"start": {
"description": "YYYY-MM-DD (inclusive).",
"type": "string"
}
},
"required": [
"start",
"end"
],
"type": "object"
},
"name": "get_range",
"outputSchema": {
"properties": {
"days": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"entry_count": {
"type": "integer"
},
"fluid_ml": {
"type": "number"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
}
},
"required": [
"local_date",
"entry_count",
"totals"
],
"type": "object"
},
"type": "array"
},
"end": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"entries": {
"items": {
"description": "One diary entry: a meal with its foods.",
"properties": {
"at": {
"description": "ISO-8601 UTC instant the food was eaten.",
"type": "string"
},
"id": {
"description": "Identifies the entry for a later edit or deletion.",
"type": "string"
},
"items": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"fluid_ml": {
"type": "number"
},
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [],
"type": "object"
},
"name": {
"type": "string"
},
"quantity": {
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"description": "breakfast, lunch, dinner or snack, when set.",
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"at",
"local_date",
"items"
],
"type": "object"
},
"type": "array"
},
"start": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
}
},
"required": [
"start",
"end",
"days",
"entries"
],
"type": "object"
}
},
{
"description": "Read what the user usually and recently eats. `usual` lists their most-logged foods, most frequent first, each with how many times it was logged, the date last eaten, the meal it is usually logged under, and the portion and macros from the last time. `recent` lists each distinct food from the last seven days with the date last eaten, its meal and how many times. An optional `meal` narrows both lists to one meal. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"meal": {
"description": "Only foods logged under this meal.",
"enum": [
"breakfast",
"lunch",
"dinner",
"snack",
"other"
],
"type": "string"
}
},
"type": "object"
},
"name": "get_usual_foods",
"outputSchema": {
"properties": {
"meal": {
"type": [
"string",
"null"
]
},
"recent": {
"items": {
"properties": {
"last_eaten": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"type": [
"string",
"null"
]
},
"name": {
"type": "string"
},
"times": {
"type": "integer"
}
},
"required": [
"name",
"last_eaten",
"meal",
"times"
],
"type": "object"
},
"type": "array"
},
"recent_window": {
"properties": {
"end": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"start": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
}
},
"required": [
"start",
"end"
],
"type": "object"
},
"usual": {
"items": {
"properties": {
"last_eaten": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"name": {
"type": "string"
},
"times_logged": {
"type": "integer"
},
"typical_serving": {
"properties": {
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
},
"quantity": {
"type": [
"string",
"null"
]
}
},
"required": [
"quantity",
"macros"
],
"type": "object"
},
"usual_meal": {
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"times_logged",
"last_eaten",
"usual_meal",
"typical_serving"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"meal",
"usual",
"recent",
"recent_window"
],
"type": "object"
}
},
{
"description": "Add a meal to the user's food diary: one or more food items, each with an optional quantity and macros, plus an optional meal label, date, note and provenance `source`. The reply names the new entry's `id` and `local_date`, which identify it for a later edit or deletion. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"properties": {
"at": {
"description": "ISO-8601 instant the meal was eaten; defaults to now.",
"type": "string"
},
"items": {
"description": "The foods in this meal, one entry per food.",
"items": {
"properties": {
"barcode": {
"description": "The package's UPC/EAN barcode, when the food came from a barcode lookup.",
"type": "string"
},
"caffeine_mg": {
"description": "Optional caffeine content of this item, in milligrams (e.g. ~95 for a mug of brewed coffee).",
"type": "number"
},
"fluid_ml": {
"description": "Optional fluid/hydration volume of this item, in millilitres (e.g. 240 for an 8 oz cup).",
"type": "number"
},
"macros": {
"description": "Estimated nutrition for the portion eaten. Omitted fields are looked up from the food databases.",
"properties": {
"carb_g": {
"description": "Total carbohydrate for the whole portion eaten, in grams.",
"type": "number"
},
"fat_g": {
"description": "Total fat for the whole portion eaten, in grams.",
"type": "number"
},
"kcal": {
"description": "Energy for the whole portion eaten, in kilocalories (not per 100 g).",
"type": "number"
},
"protein_g": {
"description": "Protein for the whole portion eaten, in grams.",
"type": "number"
}
},
"type": "object"
},
"name": {
"description": "What the food is, e.g. 'scrambled eggs' or 'Greek yogurt, plain'.",
"type": "string"
},
"quantity": {
"description": "Portion as a display label, e.g. '3', '1 cup' or '2 × 1 frank (96 g)'. Display only: the server stores macros exactly as sent and does not re-scale them.",
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"local_date": {
"description": "YYYY-MM-DD diary date; defaults to the user's local date (from their timezone).",
"type": "string"
},
"meal": {
"description": "Which meal of the day this was.",
"enum": [
"breakfast",
"lunch",
"dinner",
"snack",
"other"
],
"type": "string"
},
"note": {
"description": "Optional free-text note stored with the meal, e.g. 'post-run'.",
"type": "string"
},
"source": {
"description": "Optional provenance for these items: the `source` label of the food-database candidate they came from ('USDA', 'Open Food Facts' or 'Forkmate'), or 'estimate'. Defaults to 'estimate'; unrecognized values are recorded as an estimate.",
"enum": [
"USDA",
"Open Food Facts",
"Forkmate",
"estimate"
],
"type": "string"
}
},
"required": [
"items"
],
"type": "object"
},
"name": "log_meal",
"outputSchema": {
"properties": {
"day_totals": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"entry_count": {
"type": "integer"
},
"fluid_ml": {
"type": "number"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
}
},
"required": [
"local_date",
"entry_count",
"totals"
],
"type": "object"
},
"entry": {
"description": "One diary entry: a meal with its foods.",
"properties": {
"at": {
"description": "ISO-8601 UTC instant the food was eaten.",
"type": "string"
},
"id": {
"description": "Identifies the entry for a later edit or deletion.",
"type": "string"
},
"items": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"fluid_ml": {
"type": "number"
},
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [],
"type": "object"
},
"name": {
"type": "string"
},
"quantity": {
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"description": "breakfast, lunch, dinner or snack, when set.",
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"at",
"local_date",
"items"
],
"type": "object"
}
},
"required": [
"entry",
"day_totals"
],
"type": "object"
}
},
{
"description": "Look up a packaged food by its UPC/EAN barcode in Open Food Facts. Returns macros per 100 g, a `source` label ('Open Food Facts'), and, when known, `serving_grams`/`serving_label` for one household serving. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"upc": {
"description": "UPC/EAN barcode, digits only (8–14 digits).",
"type": "string"
}
},
"required": [
"upc"
],
"type": "object"
},
"name": "lookup_barcode",
"outputSchema": {
"properties": {
"candidates": {
"items": {
"description": "A food match. Macros are PER 100 g — scale to the portion before logging.",
"properties": {
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
},
"name": {
"type": "string"
},
"provenance": {
"description": "Chain-menu citation: the chain, its data date, its published page, the assumed build and a caveat.",
"properties": {
"as_of": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"assumed_build": {
"type": "string"
},
"caveat": {
"type": "string"
},
"chain": {
"type": "string"
},
"source_url": {
"type": "string"
}
},
"required": [
"chain",
"as_of"
],
"type": "object"
},
"serving": {
"description": "The basis the macros are for, e.g. '100 g'.",
"type": "string"
},
"serving_approx": {
"description": "serving_grams is estimated from a drink's volume.",
"type": "boolean"
},
"serving_grams": {
"type": "number"
},
"serving_label": {
"type": "string"
},
"source": {
"description": "Where the figures came from, as a label.",
"enum": [
"USDA",
"Open Food Facts",
"Forkmate",
"your entry",
"estimate"
],
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name",
"serving",
"macros",
"source"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"candidates"
],
"type": "object"
}
},
{
"description": "Search USDA FoodData Central, Open Food Facts and Forkmate's curated restaurant menus for a named food. Returns up to 5 candidates, each with macros per 100 g, a `source` label ('USDA', 'Open Food Facts' or 'Forkmate'), and, when known, `serving_grams`/`serving_label` for one household serving. Curated chain-menu candidates include a `provenance` object that may carry a portion caveat. A query names a food (at least 2 letters, no wildcards); there is no paging. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Max candidates to return (default and maximum 5).",
"type": "number"
},
"query": {
"description": "Food to search, e.g. 'greek yogurt' or 'Chipotle chicken'. At least 2 letters; wildcards are not supported.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_foods",
"outputSchema": {
"properties": {
"candidates": {
"items": {
"description": "A food match. Macros are PER 100 g — scale to the portion before logging.",
"properties": {
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
},
"name": {
"type": "string"
},
"provenance": {
"description": "Chain-menu citation: the chain, its data date, its published page, the assumed build and a caveat.",
"properties": {
"as_of": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"assumed_build": {
"type": "string"
},
"caveat": {
"type": "string"
},
"chain": {
"type": "string"
},
"source_url": {
"type": "string"
}
},
"required": [
"chain",
"as_of"
],
"type": "object"
},
"serving": {
"description": "The basis the macros are for, e.g. '100 g'.",
"type": "string"
},
"serving_approx": {
"description": "serving_grams is estimated from a drink's volume.",
"type": "boolean"
},
"serving_grams": {
"type": "number"
},
"serving_label": {
"type": "string"
},
"source": {
"description": "Where the figures came from, as a label.",
"enum": [
"USDA",
"Open Food Facts",
"Forkmate",
"your entry",
"estimate"
],
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name",
"serving",
"macros",
"source"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"candidates"
],
"type": "object"
}
},
{
"description": "Correct a food already in the user's diary — its name, quantity, macros, caffeine or fluid — or change an entry's meal label or note. The entry is identified by `id` and `local_date`, and a food by its `item_index`. Only the fields sent change; macros are merged onto the existing values and overwritten in place, with no history kept. A new `quantity` sent without `macros` rescales the food's macros, caffeine and fluid by the new amount ÷ the old one when both are the same kind of amount (a weight, a volume or a count), so '150 g' to '300 g' doubles them; otherwise the macros stay as they were and the reply says so. An entry cannot be moved to another day. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.",
"inputSchema": {
"properties": {
"caffeine_mg": {
"description": "Corrected caffeine content, in milligrams.",
"type": "number"
},
"fluid_ml": {
"description": "Corrected fluid/hydration volume, in millilitres.",
"type": "number"
},
"id": {
"description": "The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read.",
"type": "string"
},
"item_index": {
"description": "Which food in the entry's items[] to edit (0-based). Required when changing a food's name/quantity/macros/caffeine/fluid; omit for an entry-level change (meal/note).",
"type": "number"
},
"local_date": {
"description": "YYYY-MM-DD diary date of the entry.",
"type": "string"
},
"macros": {
"description": "Corrected macros. Only the components included are changed.",
"properties": {
"carb_g": {
"description": "Corrected total carbohydrate for the whole portion, in grams.",
"type": "number"
},
"fat_g": {
"description": "Corrected total fat for the whole portion, in grams.",
"type": "number"
},
"kcal": {
"description": "Corrected energy for the whole portion, in kilocalories.",
"type": "number"
},
"protein_g": {
"description": "Corrected protein for the whole portion, in grams.",
"type": "number"
}
},
"type": "object"
},
"meal": {
"description": "Move the entry to a different meal label.",
"enum": [
"breakfast",
"lunch",
"dinner",
"snack",
"other"
],
"type": "string"
},
"name": {
"description": "Corrected name of the food.",
"type": "string"
},
"note": {
"description": "Replacement note for the entry.",
"type": "string"
},
"quantity": {
"description": "Portion as stated, e.g. '2' or '1 cup'.",
"type": "string"
}
},
"required": [
"id",
"local_date"
],
"type": "object"
},
"name": "update_meal",
"outputSchema": {
"properties": {
"day_totals": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"entry_count": {
"type": "integer"
},
"fluid_ml": {
"type": "number"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"totals": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [
"kcal",
"protein_g",
"carb_g",
"fat_g"
],
"type": "object"
}
},
"required": [
"local_date",
"entry_count",
"totals"
],
"type": "object"
},
"entry": {
"description": "One diary entry: a meal with its foods.",
"properties": {
"at": {
"description": "ISO-8601 UTC instant the food was eaten.",
"type": "string"
},
"id": {
"description": "Identifies the entry for a later edit or deletion.",
"type": "string"
},
"items": {
"items": {
"properties": {
"caffeine_mg": {
"type": "number"
},
"fluid_ml": {
"type": "number"
},
"macros": {
"description": "Calories and macros. Estimates, not lab-measured; not for insulin dosing.",
"properties": {
"carb_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
}
},
"required": [],
"type": "object"
},
"name": {
"type": "string"
},
"quantity": {
"type": "string"
},
"unknown_macros": {
"description": "Macros missing from the source data: shown as 0 but unknown, not a real zero.",
"items": {
"enum": [
"protein_g",
"carb_g",
"fat_g"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"local_date": {
"description": "A local date, YYYY-MM-DD.",
"type": "string"
},
"meal": {
"description": "breakfast, lunch, dinner or snack, when set.",
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"id",
"at",
"local_date",
"items"
],
"type": "object"
}
},
"required": [
"entry",
"day_totals"
],
"type": "object"
}
},
{
"description": "Edit the user's food profile: add or remove foods they like or dislike, add or remove allergies from the major US allergen list, or set their diet style. Only the fields sent change. A removal matches a saved name in any casing; a name that matches nothing is reported in `not_found` and nothing else is affected. Adding a food to likes takes it off dislikes, and the reverse. Lists hold up to 50 foods of up to 80 characters each. The reply is the whole updated profile. It saves what the user states about their own tastes and allergies, not inferences from the diary. Every call carries `user_approved: true`, meaning the user saw this exact change and said yes to it; a call without it changes nothing and returns the change for the user to approve. A user stating a preference (e.g. 'I dislike olives') has not approved saving it: approval is a later message agreeing to the change as proposed. The server cannot verify that a person gave the approval. Removals work without health-data consent and then return only what was removed. The user can see and edit the same profile in Forkmate's Settings.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"add_allergies": {
"description": "Allergens to add, from the major US allergen list.",
"items": {
"enum": [
"milk",
"eggs",
"fish",
"shellfish",
"tree_nuts",
"peanuts",
"wheat",
"soy",
"sesame"
],
"type": "string"
},
"type": "array"
},
"add_dislikes": {
"description": "Foods the user dislikes, e.g. 'mushrooms'. A taste preference, not an allergy or a restriction.",
"items": {
"type": "string"
},
"type": "array"
},
"add_likes": {
"description": "Foods the user enjoys, e.g. 'salmon'.",
"items": {
"type": "string"
},
"type": "array"
},
"diet_style": {
"description": "The user's diet style; 'none' clears it.",
"enum": [
"omnivore",
"vegetarian",
"vegan",
"pescatarian",
"keto",
"none"
],
"type": "string"
},
"remove_allergies": {
"description": "Allergens to remove.",
"items": {
"enum": [
"milk",
"eggs",
"fish",
"shellfish",
"tree_nuts",
"peanuts",
"wheat",
"soy",
"sesame"
],
"type": "string"
},
"type": "array"
},
"remove_dislikes": {
"description": "Foods to take off the dislikes list.",
"items": {
"type": "string"
},
"type": "array"
},
"remove_likes": {
"description": "Foods to take off the likes list.",
"items": {
"type": "string"
},
"type": "array"
},
"user_approved": {
"description": "True only when the previous assistant message proposed this exact change and the user's latest message agreed to it. The user stating the preference itself is not approval.",
"type": "boolean"
}
},
"required": [
"user_approved"
],
"type": "object"
},
"name": "update_preferences",
"outputSchema": {
"properties": {
"allergies": {
"items": {
"type": "string"
},
"type": "array"
},
"allergy_disclaimer": {
"type": "string"
},
"diet_style": {
"type": [
"string",
"null"
]
},
"dislikes": {
"items": {
"type": "string"
},
"type": "array"
},
"likes": {
"items": {
"type": "string"
},
"type": "array"
},
"not_found": {
"properties": {
"allergies": {
"items": {
"type": "string"
},
"type": "array"
},
"dislikes": {
"items": {
"type": "string"
},
"type": "array"
},
"likes": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"likes",
"dislikes",
"allergies"
],
"type": "object"
},
"portion_note": {
"type": [
"string",
"null"
]
},
"removed": {
"properties": {
"allergies": {
"items": {
"type": "string"
},
"type": "array"
},
"dislikes": {
"items": {
"type": "string"
},
"type": "array"
},
"likes": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"likes",
"dislikes",
"allergies"
],
"type": "object"
}
},
"required": [
"removed",
"not_found"
],
"type": "object"
}
},
{
"description": "Diagnostic: confirms that this connection is signed in to a Forkmate account. Returns no account id, email or other identifier.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "whoami",
"outputSchema": {
"properties": {
"connected": {
"type": "boolean"
}
},
"required": [
"connected"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:c035e446983ff215fbad899aacf011aa7869c3a414890774444e9d359d842b84 | sha256sum