Forkmate
Server Details
Free AI calorie & macro tracker: tell your AI what you ate and it logs it to your private food diary
- Status
- Healthy
- Uptime
- 100.0% over 75 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- shawnazar/forkmate-mcp
- GitHub Stars
- 0
TDQS
Scored across 14 tools
Each tool targets a distinct resource+action: diary reads (get_day vs get_range vs get_usual_foods) are separated by scope, writes are split into log/update/delete_meal, and the two food-lookup tools are clearly differentiated by name search vs barcode. Preferences, notifications, feedback, consent and diagnostics each occupy their own space with no meaningful overlap.
Nearly all tools follow a consistent snake_case verb_noun pattern (get_day, log_meal, update_preferences, delete_meal, search_foods). The only deviation is whoami, which is a conventional diagnostic name and does not create confusion.
14 tools is well within the sweet spot for a food-diary domain, and each tool earns its place (diary CRUD, profile read/update, food search, barcode lookup, notifications, feedback, consent, auth check). Nothing looks padded or redundant.
Diary lifecycle (log/update/delete/read by day or range) and preference read/update are fully covered, with sensible extras like usual foods and barcode lookup. Minor gaps exist: notifications are read-only with no mark-as-read tool, and log_meal references saved recipes but there is no tool to list or manage them.
Available Tools
14 toolsdelete_mealADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read. | |
| item_index | No | Which food to remove (0-based). Omit to delete the whole entry. | |
| local_date | Yes | YYYY-MM-DD diary date of the entry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | What remains of the entry, or null. |
| removed | Yes | |
| day_totals | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already carrying destructiveHint and idempotentHint, the description adds substantial unstated behavior: permanence with no undo, the cascade where deleting the last food removes the entry, and the fact that a non-matching `id` errors and deletes nothing. These are exactly the edge cases an agent needs before calling a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The deletion semantics are front-loaded and efficient, but the trailing multi-clause disclaimer about calorie/macro estimates from USDA, Open Food Facts and AI estimates has no bearing on a delete operation and consumes roughly half the text. That is off-topic filler in an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich annotation set and an output schema present, the description supplies everything still needed: scope selection, permanence, cascade-to-entry-removal, and error behavior. Nothing required to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `id`, `item_index` (0-based, omit to delete the whole entry) and `local_date` are already fully documented. The description restates the same semantics (item_index selects a food, omission targets the entry) without adding format or boundary details beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Delete one food from a diary entry ... or the whole entry') and distinguishes the two scopes by the presence or absence of `item_index`. An agent can separate this from siblings like log_meal, update_meal, and get_day 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the two operating modes and the condition that selects each ('by item_index' vs 'without it'), plus the not-found error case, which is genuine when-to-use guidance. It does not name update_meal as the non-destructive alternative, so it stops short of explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dayARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| local_date | No | YYYY-MM-DD; defaults to today. |
Output Schema
| Name | Required | Description |
|---|---|---|
| totals | Yes | |
| entries | Yes | |
| local_date | Yes | A local date, YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial context beyond them: the exact shape of the returned data (entries with ids, item_index, quantity, macros, totals) and the critical caveat that values are estimates from varied sources and unsuitable for medical decisions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return shape, then the disclaimer. The disclaimer is long but each clause (sources, approximation, medical exclusions) carries distinct information, so it is mostly earned rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, an output schema covering return values, and 100% parameter coverage, the remaining burden is domain caveats — which the description handles thoroughly by disclosing data provenance and medical limitations. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100%, so the schema fully documents local_date's format and default. The description's "one day" phrasing hints at the date scope but adds no syntax or defaulting detail beyond the schema, matching the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read the user's food diary") and scopes it precisely to "one day," which implicitly separates it from get_range and the mutation siblings. It doesn't name an alternative explicitly, so it falls just short of the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The one-day scope implies when to use it versus get_range, and the closing disclaimer clearly rules out medical uses (insulin dosing, glucose prediction). However, there is no explicit when-to-use or when-not-to-use routing to the sibling tools, leaving usage largely inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notificationsARead-onlyInspect
Reads the user's Forkmate notifications, newest first: notices that something the user reported was fixed, Forkmate release notes (what's new), and account messages. Each one has a kind, a title, a body, an optional link, the day it arrived and whether it is unread, and the reply includes the unread count. Read-only: reading marks nothing as read. Notifications older than 180 days are not kept.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return, newest first (1 to 20, default 10). | |
| unread_only | No | Only unread notifications. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| unread_count | Yes | |
| notifications | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing two non-obvious behaviors: "reading marks nothing as read" (the annotations only say read-only, not that unread state is preserved) and a 180-day retention cutoff that affects what can be returned. It also surfaces that the reply carries an unread count, which matters for how an agent reports results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and keeps to a few dense sentences with no filler. Mild redundancy in enumerating per-notification fields (kind, title, body, link, day, unread) that the output schema already defines, which costs it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations carrying the safety profile and an output schema carrying the return shape, the description covers everything else an agent needs: content kinds, ordering, non-mutating read semantics, retention limits, and the unread count. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (limit with 1-20 bounds and default 10, unread_only defaulting false) are fully documented in the schema. The description adds nothing to either parameter beyond restating the newest-first ordering, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ("Reads the user's Forkmate notifications") plus the ordering ("newest first") and enumerates the three kinds of content returned. No sibling tool deals with notifications, so the agent can route unambiguously without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description says what notification kinds exist, which hints at when it is useful (checking fixes, release notes, account messages), but it never states a when-to-use condition or any exclusion, and points to no alternative. Adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_preferencesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| likes | Yes | |
| dislikes | Yes | |
| allergies | Yes | |
| diet_style | Yes | |
| portion_note | Yes | |
| allergy_disclaimer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' read-only safety profile, the description discloses important behavioral caveats: allergies are self-reported and not a safety guarantee, the response includes an allergy_disclaimer, and likes/dislikes are taste preferences rather than restrictions. These are exactly the kind of semantic warnings an agent needs before relying on the returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose and followed by two clearly relevant caveats. Every sentence earns its place and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only tool with annotations and an output schema, the description covers the key return semantics and the critical allergy caveat. The output schema can carry structural return details, so no further explanation is required for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document in the description. The baseline for a parameterless tool is 4, and nothing in the description misleads about input requirements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') and resource ('the user's food profile'), then enumerates the returned fields: diet style, allergies, likes, dislikes, and portion note. It is clearly distinguishable from write-oriented siblings like update_preferences in practice, but it does not explicitly name or contrast any alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what is read but gives no explicit when-to-use condition, prerequisites, or comparison to alternatives such as update_preferences or get_usual_foods. An agent must infer that this is the read path for food preferences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rangeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | YYYY-MM-DD (inclusive). | |
| start | Yes | YYYY-MM-DD (inclusive). |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | A local date, YYYY-MM-DD. |
| days | Yes | |
| start | Yes | A local date, YYYY-MM-DD. |
| entries | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, non-destructive, closed-world), and the description adds meaningful context beyond them: the data provenance (USDA FoodData Central, Open Food Facts, user or AI estimates) and an explicit warning that values are not suitable for insulin dosing or glucose prediction. That is genuine domain-specific behavioral disclosure, not restatement of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns before the disclaimer, which is the right order for an agent. The second sentence is long and somewhat repetitive in its list of prohibited uses, but each clause carries distinct safety meaning rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description still summarizes them usefully while adding the estimate caveat. For a two-parameter read tool this is effectively complete; only the missing routing guidance to get_day is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both start/end are documented as inclusive YYYY-MM-DD, so the baseline is 3. The description adds no format or boundary semantics of its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('the user's food diary') plus the scope and return shape (per-day totals, each entry with its `id`). This clearly distinguishes it from the single-day sibling get_day, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'across a date range' and the required start/end parameters, but the description never says when to prefer this over get_day or how it relates to the other diary tools. No exclusions or alternatives are offered, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usual_foodsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| meal | No | Only foods logged under this meal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meal | Yes | |
| usual | Yes | |
| recent | Yes | |
| recent_window | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, closed-world behavior, and the description adds substantial context on top: the provenance of every calorie/macro value (USDA FoodData Central, Open Food Facts, user entry, AI estimate), the fact that values are approximate and not batch- or package-specific, and an explicit prohibition on medical use such as insulin dosing or glucose prediction. This is exactly the kind of behavioral disclosure annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then mode details, then the filter interaction, then the safety caveat — a logical progression with no filler. The disclaimer is long but every clause (provenance, approximation, medical unsuitability) earns its place for a nutrition tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single optional enum parameter, an existing output schema, and annotations covering the safety profile, the description supplies everything an agent needs: what each mode returns, how the filter applies, and the reliability limits of the data. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the `meal` enum is already documented as 'Only foods logged under this meal.' The description adds real meaning beyond that by clarifying the filter applies to BOTH the usual and recent lists, which the schema alone does not convey. Baseline 3 is exceeded but no format or default nuance is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read what the user usually/recently eats) and cleanly splits the tool into two named modes, `usual` and `recent`, with the exact fields each returns. It does not, however, distinguish itself from siblings like search_foods or get_day, so an agent must infer the boundary from the mode semantics alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the trigger conditions for each mode implicit but clear: `usual` for most-logged foods, `recent` for the last seven days, and `meal` to narrow either. There is no explicit when-not guidance or named alternative (e.g., when to prefer search_foods or get_range), so usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
give_consentAIdempotentInspect
Records the user's consent to Forkmate storing and processing their health-related data, as summarised in the consent text that a refused log reply shows. Valid only as the user's own explicit agreement given in this conversation; an assistant agreeing on the user's behalf is not consent. Stores the consent version, the time, the connected app and the user's words, then logs any meal that was waiting for consent. Withdrawal is in Forkmate Settings.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | The consent version shown to the user. | |
| user_statement | Yes | The user's own words agreeing, as they replied, e.g. 'yes, I agree'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| logged | Yes | Meals held until consent, now logged. |
| version | Yes | |
| consented | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, idempotent, non-destructive; the description adds the substantive behavior the agent could not otherwise infer: it persists consent version, timestamp, connected app and the user's words, and then logs any meal that was waiting on consent. It also flags the authority constraint (assistant consent invalid) and where withdrawal lives, which matters for a health-data write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause front-loads the core action and the constraints follow in priority order with no filler. The phrase 'as summarised in the consent text that a refused log reply shows' is slightly convoluted, but no sentence is extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with a rich annotation profile and an output schema, the description covers purpose, authority constraint, side effects (storing fields then logging a pending meal), and off-ramp (Settings withdrawal). Nothing an agent needs to invoke it correctly is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: user_statement must be the user's verbatim words rather than a paraphrase, and version corresponds to the consent text shown in the refused reply. That constrains how the agent fills the enum and the free-text field beyond the schema's own wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: recording the user's consent to Forkmate storing/processing health-related data. It also anchors the action in a concrete trigger (the consent text shown by a refused log reply), so the agent knows exactly which resource this mutates and how it differs from every sibling (log_meal, get_preferences, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear admissibility condition — only the user's own explicit agreement in this conversation counts, and an assistant agreeing on their behalf is not consent — plus a redirect for the opposite operation (withdrawal happens in Forkmate Settings). That covers when to use and when not to, though it doesn't name a sibling tool for the non-consent paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_mealAInspect
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. A restaurant meal's numbers depend most on the restaurant, the specific menu item, its size and its add-ons (cheese, fries, sauce, dressing); a bare dish name is logged as a typical serving. When the user names one of their saved recipes ("my chicken and rice", "half my chili"), send their words as one item's name, with any amount in quantity; Forkmate logs the recipe's own foods and numbers in its place. Portion amounts are checked against the user's own words for the meal when they arrive in said, and the reply lists each food with the amount it was logged at. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | ISO-8601 instant the meal was eaten; defaults to now. | |
| meal | No | Which meal of the day this was. | |
| note | No | Optional free-text note stored with the meal, e.g. 'post-run'. | |
| said | No | The amounts are checked against this: the user's own words for this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation. Optional; without it, the amounts are logged as sent. | |
| items | Yes | The foods in this meal, one entry per food. | |
| source | No | Optional provenance for these items: the `source` label of the food-database candidate they came from ('USDA', 'Open Food Facts', 'Forkmate' or 'product label'), or 'estimate'. Defaults to 'estimate'; unrecognized values are recorded as an estimate. | |
| local_date | No | YYYY-MM-DD diary date; defaults to the user's local date (from their timezone). |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | One diary entry: a meal with its foods. |
| day_totals | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations (which only say it's a non-idempotent, non-destructive write) by disclosing the reply contents (`id` and `local_date` for later edit/delete), the recipe-substitution behavior, the `said` portion-checking behavior, and the provenance/estimate semantics including an explicit medical-use caveat. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and return value before moving to edge-case behaviors and disclaimers; each sentence carries information. The macro-source/medical disclaimer sentence is long and dense, which slightly dilutes scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with an output schema, nothing essential is missing: it covers write semantics, what identifies the new entry, portion validation, recipe handling, provenance defaults, and the estimate/medical caveat. An agent can call it correctly and know what to tell the user afterwards.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the recipe-in-one-item convention, the role of `said` in validating amounts, and the fact that all macro values are approximations from named sources. It adds value beyond field-level schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Add a meal to the user's food diary', and enumerates what a meal consists of (items, optional label, date, note, source). This clearly separates it from update_meal and delete_meal, which act on an existing entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: how to handle restaurant meals (numbers depend on menu item/size/add-ons), how to log saved recipes (send the user's words as one item's name with amount in quantity), and how portions are validated against `said`. It stops short of explicitly routing between siblings (e.g., when to search_foods or lookup_barcode first, or when update_meal is the right call instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_barcodeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| upc | Yes | UPC/EAN barcode, digits only (8–14 digits). |
Output Schema
| Name | Required | Description |
|---|---|---|
| candidates | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety (readOnly, openWorld, non-destructive), but the description goes well beyond them: it names the data provenance chain (USDA FoodData Central, Open Food Facts, user entry, AI estimate), labels values as approximate estimates rather than lab-measured, warns that they may not be package- or batch-specific, and explains what fields are returned including serving_grams/serving_label.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then return contents, then the limitation caveat — a sensible ordering. The final disclaimer is long and runs several distinct warnings together, but every clause is substantive rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not enumerate return values, yet it helpfully previews them, and it fully covers the domain-critical caveat about estimate quality. The only gap is not routing the agent to search_foods for cases where a barcode is unavailable or unknown.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single `upc` parameter already documents 'digits only (8–14 digits)'. The description adds the UPC/EAN equivalence but no format, validation, or failure semantics for unknown barcodes, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up a packaged food by its UPC/EAN barcode') plus the backing source (Open Food Facts), which is enough for an agent to distinguish it from the name-based search_foods sibling. It never names that alternative explicitly, so the differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied trigger is clear (you have a barcode), and the description supplies a firm usage boundary: results are not suitable for insulin dosing, carb counting, or blood-glucose prediction. It does not tell the agent when to prefer search_foods instead when no barcode is available, so routing guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_foodsARead-onlyInspect
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', 'Forkmate' or 'product label', a packaged product's published label read from a cited page and not yet checked by 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. For a bare generic dish ("a burger", "coffee"), the reply also lists details_that_change_it: the details that change that dish's numbers most, such as where it is from, which item, its size and add-ons. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max candidates to return (default and maximum 5). | |
| query | Yes | Food to search, e.g. 'greek yogurt' or 'Chipotle chicken'. At least 2 letters; wildcards are not supported. |
Output Schema
| Name | Required | Description |
|---|---|---|
| candidates | Yes | |
| details_that_change_it | No | For a bare generic dish: the details that change its numbers most (where it's from, which item, size, add-ons). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, the description discloses return shape (up to 5 candidates, macros per 100 g, source labels, serving fields, provenance caveats), the unverified 'product label' status, the absence of paging, and a strong medical-use disclaimer. This is rich context an agent cannot get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the sources, but it is one dense run-on paragraph with redundant source enumeration ('USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate') and a deeply nested parenthetical about the 'product label' source that is hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema already defining the return, the description supplies enough for correct invocation: sources, candidate cap, query rules, and the medical caveat. Only the provenance/portion-caveat behavior remains vague.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented; the description's query constraints (2-letter minimum, no wildcards, no paging) largely restate the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) plus the exact corpora it searches (USDA FoodData Central, Open Food Facts, Forkmate's curated restaurant menus) and the query unit (a named food). This clearly distinguishes it from siblings like lookup_barcode and get_usual_foods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes context (queries name a food, min 2 letters, no wildcards, no paging, generic-dish behavior) but never names an alternative or states when NOT to use it — e.g. telling the agent to reach for lookup_barcode when a barcode is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackAInspect
Sends feedback to Forkmate to improve the app: a bug, a feature request, a food or nutrition figure that looked wrong (food_data), or something else. It is for feedback the user has asked to send, in the user's own words rather than a paraphrase. It changes nothing in the diary. The note is kept in the user's own account and deleted with it, and no reply is sent.
| Name | Required | Description | Default |
|---|---|---|---|
| about | No | What the note is about: logging (saving or editing meals), accuracy (a food or number that looked wrong), connect (connecting this AI app), or other. | |
| rating | No | The user's thumbs up or down on Forkmate, when they gave one. | |
| message | Yes | The feedback, in the user's own words as they said it (at most 4000 characters). | |
| category | No | The kind of feedback: bug (something broken), feature_request (something the user would like), food_data (a wrong food match or nutrition figure), or other. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that nothing in the diary is modified, that the note is stored in the user's own account and deleted with it, and that no reply is sent. These retention and side-effect facts are exactly the kind of context readOnlyHint/destructiveHint cannot express, and they are consistent with destructiveHint=false and openWorldHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the user's-words constraint, then the side-effect and retention facts. Four sentences that each carry information, though the final sentence could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a 4-parameter schema at full description coverage, an output schema in place, and annotations covering the safety profile, the description supplies the remaining essentials (verbatim input expectation, no diary mutation, retention, no reply). Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and three of four parameters carry enum descriptions, so the schema already documents about/category/rating/message fully. The description restates the feedback kinds that mirror the category enum but adds no format or usage detail beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Sends feedback to Forkmate') and enumerates the four feedback kinds, so an agent can tell exactly what this tool does and that none of the siblings (delete_meal, log_meal, update_meal, etc.) perform this action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection condition: it is for feedback the user has asked to send, verbatim in the user's own words rather than a paraphrase, and it changes nothing in the diary. There is no competing sibling to exclude, so the absence of named alternatives costs little.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_mealADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read. | |
| meal | No | Move the entry to a different meal label. | |
| name | No | Corrected name of the food. | |
| note | No | Replacement note for the entry. | |
| said | No | The amounts are checked against this: the user's own words for this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation. Optional; without it, the amounts are logged as sent. | |
| macros | No | Corrected macros. Only the components included are changed. | |
| fluid_ml | No | Corrected fluid/hydration volume, in millilitres. | |
| quantity | No | Portion as stated, e.g. '2' or '1 cup'. | |
| item_index | No | 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). | |
| local_date | Yes | YYYY-MM-DD diary date of the entry. | |
| caffeine_mg | No | Corrected caffeine content, in milligrams. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | One diary entry: a meal with its foods. |
| day_totals | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the mutation profile (readOnly=false, destructive=true, idempotent=true), and the description adds substantial non-obvious behavior: partial-update merge semantics, no history kept, the quantity-rescaling rule with the '150 g to 300 g doubles' example and its fallback, and the immutability of the entry's date. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and edit surface, then layered with the rescaling rule and the estimate disclaimer. It is dense and earns most of its length, though the closing medical disclaimer is lengthy relative to the tool's edit function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter mutation tool with nested macros, the description covers identity (id/local_date/item_index), merge semantics, the rescaling edge case, and the accuracy caveat. An output schema exists, so return-value explanation is not needed, leaving no material gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description goes beyond the schema by explaining cross-parameter interactions: quantity without macros rescales macros/caffeine/fluid, and `said` is the verbatim user wording that amounts are validated against. It does not explain every parameter (e.g. `note` replacement scope is left to the schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Correct a food already in the user's diary') and enumerates exactly what is editable (name, quantity, macros, caffeine, fluid, meal label, note). This clearly separates it from siblings like log_meal and delete_meal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool and the key routing rule between entry-level vs food-level edits ('Required when changing a food's name/quantity/macros/caffeine/fluid; omit for an entry-level change'), plus the constraint that an entry cannot be moved to another day. It never names an alternative sibling such as log_meal or delete_meal, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_preferencesADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| add_likes | No | Foods the user enjoys, e.g. 'salmon'. | |
| diet_style | No | The user's diet style; 'none' clears it. | |
| add_dislikes | No | Foods the user dislikes, e.g. 'mushrooms'. A taste preference, not an allergy or a restriction. | |
| remove_likes | No | Foods to take off the likes list. | |
| add_allergies | No | Allergens to add, from the major US allergen list. | |
| user_approved | Yes | 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. | |
| remove_dislikes | No | Foods to take off the dislikes list. | |
| remove_allergies | No | Allergens to remove. |
Output Schema
| Name | Required | Description |
|---|---|---|
| likes | No | |
| removed | Yes | |
| dislikes | No | |
| allergies | No | |
| not_found | Yes | |
| diet_style | No | |
| portion_note | No | |
| allergy_disclaimer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds extensive behavior beyond the annotations: partial-update semantics, case-insensitive removal matching with not_found reporting, cross-field side effects (adding a like drops the dislike), list caps of 50 items/80 chars, consent exemptions for removals, and the approval workflow including the server's inability to verify a human approval. This is exactly the disclosure a destructive mutation needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long, but the length is justified for an 8-parameter destructive mutation with an approval gate, and the core purpose is front-loaded. Some approval wording is repeated across the description and the user_approved schema field, and the Forkmate Settings sentence is marginal, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with an output schema, it covers everything an agent needs: mutation scope, consent rules, list limits, conflict resolution, and a brief note that the reply is the whole updated profile. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds genuinely new semantics: attention to partial updates, the add-to-likes/remove-from-dislikes interaction, and how removals match saved names by casing. It does not re-explain individual parameter formats, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Edit the user's food profile") and enumerates the exact operations: add/remove likes and dislikes, add/remove allergies, set diet style. Combined with "Only the fields sent change," an agent can immediately distinguish it from the read counterpart get_preferences without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage context: it saves only what the user states about themselves, not diary inferences, and describes the approval gate that must precede a successful call. It stops short of explicitly naming the alternative (e.g. get_preferences for reading) or when-not-to-call, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiARead-onlyInspect
Diagnostic: confirms that this connection is signed in to a Forkmate account. Returns no account id, email or other identifier.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| connected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds real value beyond that by disclosing what it does NOT return (no account id, email or identifier), preempting a common misuse expectation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the diagnostic purpose and followed by the key output caveat. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter diagnostic with an output schema and full annotation coverage, the description supplies the essential behavioral caveat. It is complete enough to invoke correctly, with only the absence of explicit usage routing as a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description does not need to compensate for any parameter gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a diagnostic that confirms the connection is signed in to a Forkmate account. It is clearly distinguishable from the food-logging siblings, though it does not explicitly name or contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Diagnostic:' implies usage as a connectivity/auth check, but there is no explicit when-to-use, when-not, or relationship to alternatives like get_preferences. Context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
give_consent1 field changed- changed
Input schema / properties / version / enumPrevious value: -[ - "health_ack_v4" -]New value: +[ + "health_ack_v5" +]
1 tool update
- Changed
log_meal1 field changed- changed
Input schema / properties / items / items / properties / caffeine_mg / descriptionPrevious value: -"Optional caffeine content of this item, in milligrams (e.g. ~95 for a mug of brewed coffee)."New value: +"Optional caffeine content of this item, in milligrams (e.g. ~95 for an 8 oz brewed coffee). If you omit it, Forkmate fills it from the label or its reference table when it knows the drink."
1 tool update
- Changed
send_feedback2 fields changed- added
Input schema / properties / categoryAdded value: +{ + "description": "The kind of feedback: bug (something broken), feature_request (something the user would like), food_data (a wrong food match or nutrition figure), or other.", + "enum": [ + "bug", + "feature_request", + "food_data", + "other" + ], + "type": "string" +} - changed
Input schema / properties / message / descriptionPrevious value: -"The feedback, in the user's words (at most 4000 characters)."New value: +"The feedback, in the user's own words as they said it (at most 4000 characters)."
1 tool update
- Changed
log_meal1 field changed- changed
Input schema / properties / items / items / properties / macros / descriptionPrevious value: -"Estimated nutrition for the portion eaten. Omitted fields are looked up from the food databases."New value: +"Estimated nutrition for the portion eaten. Omitted fields are looked up from the food databases. Without this object, kcal (or calories), protein_g, carb_g (or carbs_g) and fat_g set on the item itself are read as these macros."
2 tool updates
- Changed
log_meal1 field changed- changed
Input schema / properties / said / descriptionPrevious value: -"Optional. The user's own words describing this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation."New value: +"The amounts are checked against this: the user's own words for this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation. Optional; without it, the amounts are logged as sent."
- Changed
update_meal1 field changed- changed
Input schema / properties / said / descriptionPrevious value: -"Optional. The user's own words describing this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation."New value: +"The amounts are checked against this: the user's own words for this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation. Optional; without it, the amounts are logged as sent."
2 tool updates
- Changed
log_meal1 field changed- added
Input schema / properties / saidAdded value: +{ + "description": "Optional. The user's own words describing this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation.", + "maxLength": 300, + "type": "string" +}
- Changed
update_meal1 field changed- added
Input schema / properties / saidAdded value: +{ + "description": "Optional. The user's own words describing this meal, verbatim (e.g. 'a pint of IPA and wings at the bar'). Only the meal description — not other parts of the conversation.", + "maxLength": 300, + "type": "string" +}
1 tool update
- Changed
search_foods1 field changed- added
Output schema / properties / details_that_change_itAdded value: +{ + "description": "For a bare generic dish: the details that change its numbers most (where it's from, which item, size, add-ons).", + "items": { + "type": "string" + }, + "type": "array" +}
3 tool updates
- Changed
log_meal2 fields changed- changed
Input schema / properties / source / descriptionPrevious value: -"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."New value: +"Optional provenance for these items: the `source` label of the food-database candidate they came from ('USDA', 'Open Food Facts', 'Forkmate' or 'product label'), or 'estimate'. Defaults to 'estimate'; unrecognized values are recorded as an estimate." - changed
Input schema / properties / source / enumPrevious value: -[ - "USDA", - "Open Food Facts", - "Forkmate", - "estimate" -]New value: +[ + "USDA", + "Open Food Facts", + "Forkmate", + "product label", + "estimate" +]
- Changed
lookup_barcode1 field changed- changed
Output schema / properties / candidates / items / properties / provenance / descriptionPrevious value: -"Chain-menu citation: the chain, its data date, its published page, the assumed build and a caveat."New value: +"Citation: the chain or a product label's brand, its data date, its published page, the assumed build and a caveat."
- Changed
search_foods1 field changed- changed
Output schema / properties / candidates / items / properties / provenance / descriptionPrevious value: -"Chain-menu citation: the chain, its data date, its published page, the assumed build and a caveat."New value: +"Citation: the chain or a product label's brand, its data date, its published page, the assumed build and a caveat."
1 tool update
- Added
get_notifications
2 tool updates
- Added
give_consent - Added
send_feedback
1 tool update
- Changed
update_preferences1 field changed- changed
Input schema / properties / user_approved / descriptionPrevious value: -"True when the user approved this exact change in the conversation just before the call."New value: +"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."
14 tool updates
- Removed
add_pantry_item - Changed
delete_meal1 field changed- changed
Output schema / properties / entry / anyOfPrevious value: -[ - { - "description": "One diary entry: a meal with its foods.", - "properties": { - "at": { - "description": "ISO-8601 UTC instant the food was eaten.", - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "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" - }, - "source": { - "description": "Where the macros came from (e.g. usda, off, client).", - "type": "string" - } - }, - "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" - } -]New value: +[ + { + "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" + } +]
- Changed
get_day4 fields changed- removed
Output schema / properties / entries / items / properties / created_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / entries / items / properties / id / descriptionAdded value: +"Identifies the entry for a later edit or deletion." - removed
Output schema / properties / entries / items / properties / items / items / properties / sourceRemoved value: -{ - "description": "Where the macros came from (e.g. usda, off, client).", - "type": "string" -} - added
Output schema / properties / entries / items / properties / items / items / properties / unknown_macrosAdded value: +{ + "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" +}
- Removed
get_pantry - Changed
get_preferences2 fields changed- added
Output schema / properties / likesAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "diet_style", - "allergies", - "dislikes", - "portion_note", - "allergy_disclaimer" -]New value: +[ + "diet_style", + "allergies", + "likes", + "dislikes", + "portion_note", + "allergy_disclaimer" +]
- Changed
get_range4 fields changed- removed
Output schema / properties / entries / items / properties / created_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / entries / items / properties / id / descriptionAdded value: +"Identifies the entry for a later edit or deletion." - removed
Output schema / properties / entries / items / properties / items / items / properties / sourceRemoved value: -{ - "description": "Where the macros came from (e.g. usda, off, client).", - "type": "string" -} - added
Output schema / properties / entries / items / properties / items / items / properties / unknown_macrosAdded value: +{ + "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" +}
- Added
get_usual_foods - Changed
log_meal6 fields changed- changed
Input schema / properties / source / descriptionPrevious value: -"Optional provenance for these items, e.g. 'usda' or 'off' for a food-database result. Defaults to 'client' (an estimate); unrecognized values are recorded as 'client'."New value: +"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." - changed
Input schema / properties / source / enumPrevious value: -[ - "client", - "usda", - "off", - "usda-index", - "mfp-import", - "manual", - "chain-menu" -]New value: +[ + "USDA", + "Open Food Facts", + "Forkmate", + "estimate" +] - removed
Output schema / properties / entry / properties / created_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / entry / properties / id / descriptionAdded value: +"Identifies the entry for a later edit or deletion." - removed
Output schema / properties / entry / properties / items / items / properties / sourceRemoved value: -{ - "description": "Where the macros came from (e.g. usda, off, client).", - "type": "string" -} - added
Output schema / properties / entry / properties / items / items / properties / unknown_macrosAdded value: +{ + "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" +}
- Changed
lookup_barcode7 fields changed- added
Output schema / properties / candidates / items / properties / provenanceAdded value: +{ + "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" +} - added
Output schema / properties / candidates / items / properties / serving / descriptionAdded value: +"The basis the macros are for, e.g. '100 g'." - added
Output schema / properties / candidates / items / properties / serving_approxAdded value: +{ + "description": "serving_grams is estimated from a drink's volume.", + "type": "boolean" +} - added
Output schema / properties / candidates / items / properties / source / descriptionAdded value: +"Where the figures came from, as a label." - added
Output schema / properties / candidates / items / properties / source / enumAdded value: +[ + "USDA", + "Open Food Facts", + "Forkmate", + "your entry", + "estimate" +] - added
Output schema / properties / candidates / items / properties / unknown_macrosAdded value: +{ + "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" +} - changed
Output schema / properties / candidates / items / requiredPrevious value: -[ - "name", - "macros", - "source" -]New value: +[ + "name", + "serving", + "macros", + "source" +]
- Removed
remove_pantry_item - Changed
search_foods9 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max candidates to return (default 5, clamped to 1–10)."New value: +"Max candidates to return (default and maximum 5)." - changed
Input schema / properties / query / descriptionPrevious value: -"Food to search, e.g. 'greek yogurt' or 'Chipotle chicken'."New value: +"Food to search, e.g. 'greek yogurt' or 'Chipotle chicken'. At least 2 letters; wildcards are not supported." - added
Output schema / properties / candidates / items / properties / provenanceAdded value: +{ + "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" +} - added
Output schema / properties / candidates / items / properties / serving / descriptionAdded value: +"The basis the macros are for, e.g. '100 g'." - added
Output schema / properties / candidates / items / properties / serving_approxAdded value: +{ + "description": "serving_grams is estimated from a drink's volume.", + "type": "boolean" +} - added
Output schema / properties / candidates / items / properties / source / descriptionAdded value: +"Where the figures came from, as a label." - added
Output schema / properties / candidates / items / properties / source / enumAdded value: +[ + "USDA", + "Open Food Facts", + "Forkmate", + "your entry", + "estimate" +] - added
Output schema / properties / candidates / items / properties / unknown_macrosAdded value: +{ + "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" +} - changed
Output schema / properties / candidates / items / requiredPrevious value: -[ - "name", - "macros", - "source" -]New value: +[ + "name", + "serving", + "macros", + "source" +]
- Changed
update_meal4 fields changed- removed
Output schema / properties / entry / properties / created_atRemoved value: -{ - "type": "string" -} - added
Output schema / properties / entry / properties / id / descriptionAdded value: +"Identifies the entry for a later edit or deletion." - removed
Output schema / properties / entry / properties / items / items / properties / sourceRemoved value: -{ - "description": "Where the macros came from (e.g. usda, off, client).", - "type": "string" -} - added
Output schema / properties / entry / properties / items / items / properties / unknown_macrosAdded value: +{ + "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" +}
- Added
update_preferences - Changed
whoami4 fields changed- added
Output schema / properties / connectedAdded value: +{ + "type": "boolean" +} - removed
Output schema / properties / scopesRemoved value: -{ - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / user_idRemoved value: -{ - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "user_id", - "scopes" -]New value: +[ + "connected" +]
2 tool updates
- Changed
delete_meal1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The entry id, as returned when reading a day."New value: +"The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read."
- Changed
update_meal1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The entry id, as returned when reading a day."New value: +"The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read."
Related MCP Connectors
Calorie and macro diary your AI fills in: log meals from text or photos, refine later, track goals.
AI-powered calorie tracking with photo recognition, barcode scanning, and voice logging
Calorie, workout and body-weight log inside ChatGPT and Claude. Log meals by text, photo or voice.
Calorie tracker app for ChatGPT and Claude: read meals, macros, weight and log meals from chat.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables nutrition tracking via AI, allowing users to read food logs with macros, goals, and profile, log meals by text or photo, and access diary, subscription, diabetes, and wearable/glucose data.MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that lets you log meals through Claude (and soon ChatGPT) in plain language, using India's official food composition data (IFCT 2017) plus USDA, enabling accurate calorie and macro tracking for Indian dishes with household units and photo logging.34 npm2AGPL 3.0
- AlicenseAqualityDmaintenanceCalculate TDEE & macro targets, look up food nutrition data, generate meal plans, fix nutrient deficiencies, and score a day's eating from 0–100. Free nutrition tools for AI assistants.5MIT
- AlicenseNot gradedqualityBmaintenanceNutrition Tracker AI - MCP server providing AI-powered tools and automation by MEOK AI Labs9 npm56 PyPIMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.