Skip to main content
Glama

Server Details

Free AI calorie & macro tracker: tell your AI what you ate and it logs it to your private food diary

Ownership verified
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

A4.1/5.0

Scored across 14 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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 tools
delete_mealA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe entry id, shown with each entry in the reply text when a meal is logged or a day or range is read.
item_indexNoWhich food to remove (0-based). Omit to delete the whole entry.
local_dateYesYYYY-MM-DD diary date of the entry.

Output Schema

NameRequiredDescription
entryYesWhat remains of the entry, or null.
removedYes
day_totalsYes

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_dayA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
local_dateNoYYYY-MM-DD; defaults to today.

Output Schema

NameRequiredDescription
totalsYes
entriesYes
local_dateYesA local date, YYYY-MM-DD.

TDQS

A4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_notificationsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
limitNoHow many to return, newest first (1 to 20, default 10).
unread_onlyNoOnly unread notifications. Defaults to false.

Output Schema

NameRequiredDescription
unread_countYes
notificationsYes

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_preferencesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
likesYes
dislikesYes
allergiesYes
diet_styleYes
portion_noteYes
allergy_disclaimerYes

TDQS

A4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_rangeA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
endYesYYYY-MM-DD (inclusive).
startYesYYYY-MM-DD (inclusive).

Output Schema

NameRequiredDescription
endYesA local date, YYYY-MM-DD.
daysYes
startYesA local date, YYYY-MM-DD.
entriesYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_foodsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
mealNoOnly foods logged under this meal.

Output Schema

NameRequiredDescription
mealYes
usualYes
recentYes
recent_windowYes

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

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.

NameRequiredDescriptionDefault
atNoISO-8601 instant the meal was eaten; defaults to now.
mealNoWhich meal of the day this was.
noteNoOptional free-text note stored with the meal, e.g. 'post-run'.
saidNoThe 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.
itemsYesThe foods in this meal, one entry per food.
sourceNoOptional 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_dateNoYYYY-MM-DD diary date; defaults to the user's local date (from their timezone).

Output Schema

NameRequiredDescription
entryYesOne diary entry: a meal with its foods.
day_totalsYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_barcodeA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
upcYesUPC/EAN barcode, digits only (8–14 digits).

Output Schema

NameRequiredDescription
candidatesYes

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_foodsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
limitNoMax candidates to return (default and maximum 5).
queryYesFood to search, e.g. 'greek yogurt' or 'Chipotle chicken'. At least 2 letters; wildcards are not supported.

Output Schema

NameRequiredDescription
candidatesYes
details_that_change_itNoFor a bare generic dish: the details that change its numbers most (where it's from, which item, size, add-ons).

TDQS

A4/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
aboutNoWhat the note is about: logging (saving or editing meals), accuracy (a food or number that looked wrong), connect (connecting this AI app), or other.
ratingNoThe user's thumbs up or down on Forkmate, when they gave one.
messageYesThe feedback, in the user's own words as they said it (at most 4000 characters).
categoryNoThe 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

NameRequiredDescription
sentYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_mealA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe entry id, shown with each entry in the reply text when a meal is logged or a day or range is read.
mealNoMove the entry to a different meal label.
nameNoCorrected name of the food.
noteNoReplacement note for the entry.
saidNoThe 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.
macrosNoCorrected macros. Only the components included are changed.
fluid_mlNoCorrected fluid/hydration volume, in millilitres.
quantityNoPortion as stated, e.g. '2' or '1 cup'.
item_indexNoWhich 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_dateYesYYYY-MM-DD diary date of the entry.
caffeine_mgNoCorrected caffeine content, in milligrams.

Output Schema

NameRequiredDescription
entryYesOne diary entry: a meal with its foods.
day_totalsYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_preferencesA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
add_likesNoFoods the user enjoys, e.g. 'salmon'.
diet_styleNoThe user's diet style; 'none' clears it.
add_dislikesNoFoods the user dislikes, e.g. 'mushrooms'. A taste preference, not an allergy or a restriction.
remove_likesNoFoods to take off the likes list.
add_allergiesNoAllergens to add, from the major US allergen list.
user_approvedYesTrue 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_dislikesNoFoods to take off the dislikes list.
remove_allergiesNoAllergens to remove.

Output Schema

NameRequiredDescription
likesNo
removedYes
dislikesNo
allergiesNo
not_foundYes
diet_styleNo
portion_noteNo
allergy_disclaimerNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

whoamiA
Read-only
Inspect

Diagnostic: confirms that this connection is signed in to a Forkmate account. Returns no account id, email or other identifier.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
connectedYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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. 1 tool update
    • Changedgive_consent1 field changed
      • changedInput schema / properties / version / enum
        Previous value: -[
        -  "health_ack_v4"
        -]New value: +[
        +  "health_ack_v5"
        +]
  2. 1 tool update
    • Changedlog_meal1 field changed
      • changedInput schema / properties / items / items / properties / caffeine_mg / description
        Previous 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."
  3. 1 tool update
    • Changedsend_feedback2 fields changed
      • addedInput schema / properties / category
        Added 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"
        +}
      • changedInput schema / properties / message / description
        Previous 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)."
  4. 1 tool update
    • Changedlog_meal1 field changed
      • changedInput schema / properties / items / items / properties / macros / description
        Previous 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."
  5. 2 tool updates
    • Changedlog_meal1 field changed
      • changedInput schema / properties / said / description
        Previous 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."
    • Changedupdate_meal1 field changed
      • changedInput schema / properties / said / description
        Previous 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."
  6. 2 tool updates
    • Changedlog_meal1 field changed
      • addedInput schema / properties / said
        Added 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"
        +}
    • Changedupdate_meal1 field changed
      • addedInput schema / properties / said
        Added 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"
        +}
  7. 1 tool update
    • Changedsearch_foods1 field changed
      • addedOutput schema / properties / details_that_change_it
        Added 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"
        +}
  8. 3 tool updates
    • Changedlog_meal2 fields changed
      • changedInput schema / properties / source / description
        Previous 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."
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "USDA",
        -  "Open Food Facts",
        -  "Forkmate",
        -  "estimate"
        -]New value: +[
        +  "USDA",
        +  "Open Food Facts",
        +  "Forkmate",
        +  "product label",
        +  "estimate"
        +]
    • Changedlookup_barcode1 field changed
      • changedOutput schema / properties / candidates / items / properties / provenance / description
        Previous 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."
    • Changedsearch_foods1 field changed
      • changedOutput schema / properties / candidates / items / properties / provenance / description
        Previous 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."
  9. 1 tool update
    • Addedget_notifications
  10. 2 tool updates
    • Addedgive_consent
    • Addedsend_feedback
  11. 1 tool update
    • Changedupdate_preferences1 field changed
      • changedInput schema / properties / user_approved / description
        Previous 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."
  12. 14 tool updates
    • Removedadd_pantry_item
    • Changeddelete_meal1 field changed
      • changedOutput schema / properties / entry / anyOf
        Previous 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"
        +  }
        +]
    • Changedget_day4 fields changed
      • removedOutput schema / properties / entries / items / properties / created_at
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / entries / items / properties / id / description
        Added value: +"Identifies the entry for a later edit or deletion."
      • removedOutput schema / properties / entries / items / properties / items / items / properties / source
        Removed value: -{
        -  "description": "Where the macros came from (e.g. usda, off, client).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / entries / items / properties / items / items / properties / unknown_macros
        Added 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"
        +}
    • Removedget_pantry
    • Changedget_preferences2 fields changed
      • addedOutput schema / properties / likes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "diet_style",
        -  "allergies",
        -  "dislikes",
        -  "portion_note",
        -  "allergy_disclaimer"
        -]New value: +[
        +  "diet_style",
        +  "allergies",
        +  "likes",
        +  "dislikes",
        +  "portion_note",
        +  "allergy_disclaimer"
        +]
    • Changedget_range4 fields changed
      • removedOutput schema / properties / entries / items / properties / created_at
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / entries / items / properties / id / description
        Added value: +"Identifies the entry for a later edit or deletion."
      • removedOutput schema / properties / entries / items / properties / items / items / properties / source
        Removed value: -{
        -  "description": "Where the macros came from (e.g. usda, off, client).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / entries / items / properties / items / items / properties / unknown_macros
        Added 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"
        +}
    • Addedget_usual_foods
    • Changedlog_meal6 fields changed
      • changedInput schema / properties / source / description
        Previous 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."
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "client",
        -  "usda",
        -  "off",
        -  "usda-index",
        -  "mfp-import",
        -  "manual",
        -  "chain-menu"
        -]New value: +[
        +  "USDA",
        +  "Open Food Facts",
        +  "Forkmate",
        +  "estimate"
        +]
      • removedOutput schema / properties / entry / properties / created_at
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / entry / properties / id / description
        Added value: +"Identifies the entry for a later edit or deletion."
      • removedOutput schema / properties / entry / properties / items / items / properties / source
        Removed value: -{
        -  "description": "Where the macros came from (e.g. usda, off, client).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / entry / properties / items / items / properties / unknown_macros
        Added 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"
        +}
    • Changedlookup_barcode7 fields changed
      • addedOutput schema / properties / candidates / items / properties / provenance
        Added 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"
        +}
      • addedOutput schema / properties / candidates / items / properties / serving / description
        Added value: +"The basis the macros are for, e.g. '100 g'."
      • addedOutput schema / properties / candidates / items / properties / serving_approx
        Added value: +{
        +  "description": "serving_grams is estimated from a drink's volume.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / candidates / items / properties / source / description
        Added value: +"Where the figures came from, as a label."
      • addedOutput schema / properties / candidates / items / properties / source / enum
        Added value: +[
        +  "USDA",
        +  "Open Food Facts",
        +  "Forkmate",
        +  "your entry",
        +  "estimate"
        +]
      • addedOutput schema / properties / candidates / items / properties / unknown_macros
        Added 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"
        +}
      • changedOutput schema / properties / candidates / items / required
        Previous value: -[
        -  "name",
        -  "macros",
        -  "source"
        -]New value: +[
        +  "name",
        +  "serving",
        +  "macros",
        +  "source"
        +]
    • Removedremove_pantry_item
    • Changedsearch_foods9 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max candidates to return (default 5, clamped to 1–10)."New value: +"Max candidates to return (default and maximum 5)."
      • changedInput schema / properties / query / description
        Previous 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."
      • addedOutput schema / properties / candidates / items / properties / provenance
        Added 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"
        +}
      • addedOutput schema / properties / candidates / items / properties / serving / description
        Added value: +"The basis the macros are for, e.g. '100 g'."
      • addedOutput schema / properties / candidates / items / properties / serving_approx
        Added value: +{
        +  "description": "serving_grams is estimated from a drink's volume.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / candidates / items / properties / source / description
        Added value: +"Where the figures came from, as a label."
      • addedOutput schema / properties / candidates / items / properties / source / enum
        Added value: +[
        +  "USDA",
        +  "Open Food Facts",
        +  "Forkmate",
        +  "your entry",
        +  "estimate"
        +]
      • addedOutput schema / properties / candidates / items / properties / unknown_macros
        Added 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"
        +}
      • changedOutput schema / properties / candidates / items / required
        Previous value: -[
        -  "name",
        -  "macros",
        -  "source"
        -]New value: +[
        +  "name",
        +  "serving",
        +  "macros",
        +  "source"
        +]
    • Changedupdate_meal4 fields changed
      • removedOutput schema / properties / entry / properties / created_at
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / entry / properties / id / description
        Added value: +"Identifies the entry for a later edit or deletion."
      • removedOutput schema / properties / entry / properties / items / items / properties / source
        Removed value: -{
        -  "description": "Where the macros came from (e.g. usda, off, client).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / entry / properties / items / items / properties / unknown_macros
        Added 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"
        +}
    • Addedupdate_preferences
    • Changedwhoami4 fields changed
      • addedOutput schema / properties / connected
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / scopes
        Removed value: -{
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / user_id
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "user_id",
        -  "scopes"
        -]New value: +[
        +  "connected"
        +]
  13. 2 tool updates
    • Changeddelete_meal1 field changed
      • changedInput schema / properties / id / description
        Previous 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."
    • Changedupdate_meal1 field changed
      • changedInput schema / properties / id / description
        Previous 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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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 npm
    2
    AGPL 3.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.