forkmate
Registry code: bc9a74094a0500af
Forkmate is the user's private food diary and calorie/macro tracker; relevant whenever the user mentions food they ate, calories, macros, protein or nutrition goals. search_foods and lookup_barcode return macros per 100 g. Before logging, scale every macro to the grams actually eaten (macro × grams ÷ 100); log_meal stores macros exactly as sent and never re-scales them. When a candidate has serving_grams/serving_label, the user may answer in servings, but convert servings to grams first: serving_grams 48, serving_label '1 frank', eaten twice → 96 g → per-100 g macros × 0.96, quantity '2 × 1…
- endpoint
- https://app.forkmate.ai/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is forkmate live?
- Yes — it answered the hub's last check (checked 6d ago). It answered 100% of checks over the last 30 days.
- Is forkmate free to use?
- Not measured yet.
- What tools does forkmate have?
- 13 tools: log_meal, whoami, get_usual_foods, get_range, get_preferences, delete_meal, search_foods, lookup_barcode, ….
- Is forkmate safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 13 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
log_meal unknown never probed
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. 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. 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.
{ "type": "object", "required": [ "items" ], "properties": { "at": { "type": "string", "description": "ISO-8601 instant the meal was eaten; defaults to now." }, "meal": { "enum": [ "breakfast", "lunch", "dinner", "snack", "other" ], "type": "string", "description": "Which meal of the day this was." }, "note": { "type": "string", "description": "Optional free-text note stored with the meal, e.g. 'post-run'." }, "items": { "type": "array", "items": { "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string", "description": "What the food is, e.g. 'scrambled eggs' or 'Greek yogurt, plain'." }, "macros": { "type": "object", "properties": { "kcal": { "type": "number", "description": "Energy for the whole portion eaten, in kilocalories (not per 100 g)." }, "fat_g": { "type": "number", "description": "Total fat for the whole portion eaten, in grams." }, "carb_g": { "type": "number", "description": "Total carbohydrate for the whole portion eaten, in grams." }, "protein_g": { "type": "number", "description": "Protein for the whole portion eaten, in grams." } }, "description": "Estimated nutrition for the portion eaten. Omitted fields are looked up from the food databases." }, "barcode": { "type": "string", "description": "The package's UPC/EAN barcode, when the food came from a barcode lookup." }, "fluid_ml": { "type": "number", "description": "Optional fluid/hydration volume of this item, in millilitres (e.g. 240 for an 8 oz cup)." }, "quantity": { "type": "string", "description": "Portion as a display label, e.g. '3', '1 cup' or '2 × 1 frank (96 g)'. Display only: the server stores macros exactly as sent and does not re-scale them." }, "caffeine_mg": { "type": "number", "description": "Optional caffeine content of this item, in milligrams (e.g. ~95 for a mug of brewed coffee)." } } }, "minItems": 1, "description": "The foods in this meal, one entry per food." }, "source": { "enum": [ "USDA", "Open Food Facts", "Forkmate", "estimate" ], "type": "string", "description": "Optional provenance for these items: the `source` label of the food-database candidate they came from ('USDA', 'Open Food Facts' or 'Forkmate'), or 'estimate'. Defaults to 'estimate'; unrecognized values are recorded as an estimate." }, "local_date": { "type": "string", "description": "YYYY-MM-DD diary date; defaults to the user's local date (from their timezone)." } } }arguments 96 lineswhoami unknown never probed
Diagnostic: confirms that this connection is signed in to a Forkmate account. Returns no account id, email or other identifier.
{ "type": "object", "properties": {}, "additionalProperties": false }arguments 5 linesget_usual_foods unknown never probed
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.
{ "type": "object", "properties": { "meal": { "enum": [ "breakfast", "lunch", "dinner", "snack", "other" ], "type": "string", "description": "Only foods logged under this meal." } }, "additionalProperties": false }arguments 17 linesget_range unknown never probed
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.
{ "type": "object", "required": [ "start", "end" ], "properties": { "end": { "type": "string", "description": "YYYY-MM-DD (inclusive)." }, "start": { "type": "string", "description": "YYYY-MM-DD (inclusive)." } } }arguments 17 linesget_preferences unknown never probed
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.
{ "type": "object", "properties": {}, "additionalProperties": false }arguments 5 linesdelete_meal unknown never probed
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.
{ "type": "object", "required": [ "id", "local_date" ], "properties": { "id": { "type": "string", "description": "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": { "type": "number", "description": "Which food to remove (0-based). Omit to delete the whole entry." }, "local_date": { "type": "string", "description": "YYYY-MM-DD diary date of the entry." } } }arguments 21 linessearch_foods unknown never probed
Search USDA FoodData Central, Open Food Facts and Forkmate's curated restaurant menus for a named food. Returns up to 5 candidates, each with macros per 100 g, a `source` label ('USDA', 'Open Food Facts' or 'Forkmate'), and, when known, `serving_grams`/`serving_label` for one household serving. Curated chain-menu candidates include a `provenance` object that may carry a portion caveat. A query names a food (at least 2 letters, no wildcards); there is no paging. All calorie and macro values, including carbohydrates, are estimates from USDA FoodData Central, Open Food Facts, the user's own entry or an AI assistant's estimate — approximate, not lab-measured or specific to a package or batch, and not suitable for insulin dosing (including carb counting for a meal bolus), blood-glucose prediction or any other medical decision.
{ "type": "object", "required": [ "query" ], "properties": { "limit": { "type": "number", "description": "Max candidates to return (default and maximum 5)." }, "query": { "type": "string", "description": "Food to search, e.g. 'greek yogurt' or 'Chipotle chicken'. At least 2 letters; wildcards are not supported." } }, "additionalProperties": false }arguments 17 lineslookup_barcode unknown never probed
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.
{ "type": "object", "required": [ "upc" ], "properties": { "upc": { "type": "string", "description": "UPC/EAN barcode, digits only (8–14 digits)." } }, "additionalProperties": false }arguments 13 linesget_day unknown never probed
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.
{ "type": "object", "properties": { "local_date": { "type": "string", "description": "YYYY-MM-DD; defaults to today." } } }arguments 9 linesupdate_preferences unknown never probed
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.
{ "type": "object", "required": [ "user_approved" ], "properties": { "add_likes": { "type": "array", "items": { "type": "string" }, "description": "Foods the user enjoys, e.g. 'salmon'." }, "diet_style": { "enum": [ "omnivore", "vegetarian", "vegan", "pescatarian", "keto", "none" ], "type": "string", "description": "The user's diet style; 'none' clears it." }, "add_dislikes": { "type": "array", "items": { "type": "string" }, "description": "Foods the user dislikes, e.g. 'mushrooms'. A taste preference, not an allergy or a restriction." }, "remove_likes": { "type": "array", "items": { "type": "string" }, "description": "Foods to take off the likes list." }, "add_allergies": { "type": "array", "items": { "enum": [ "milk", "eggs", "fish", "shellfish", "tree_nuts", "peanuts", "wheat", "soy", "sesame" ], "type": "string" }, "description": "Allergens to add, from the major US allergen list." }, "user_approved": { "type": "boolean", "description": "True only when the previous assistant message proposed this exact change and the user's latest message agreed to it. The user stating the preference itself is not approval." }, "remove_dislikes": { "type": "array", "items": { "type": "string" }, "description": "Foods to take off the dislikes list." }, "remove_allergies": { "type": "array", "items": { "enum": [ "milk", "eggs", "fish", "shellfish", "tree_nuts", "peanuts", "wheat", "soy", "sesame" ], "type": "string" }, "description": "Allergens to remove." } }, "additionalProperties": false }arguments 89 linesgive_consent unknown never probed
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.
{ "type": "object", "required": [ "user_statement", "version" ], "properties": { "version": { "enum": [ "health_ack_v4" ], "type": "string", "description": "The consent version shown to the user." }, "user_statement": { "type": "string", "maxLength": 280, "description": "The user's own words agreeing, as they replied, e.g. 'yes, I agree'." } }, "additionalProperties": false }arguments 22 linessend_feedback unknown never probed
Sends the user's feedback about Forkmate to the Forkmate team: a bug, a food or calorie figure that looked wrong, trouble connecting, or an idea. A person on the Forkmate team reads the note together with the user's account email. It changes nothing in the diary. The note is kept in the user's own account and deleted with it.
{ "type": "object", "required": [ "message" ], "properties": { "about": { "enum": [ "logging", "accuracy", "connect", "other" ], "type": "string", "description": "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": { "enum": [ "up", "down" ], "type": "string", "description": "The user's thumbs up or down on Forkmate, when they gave one." }, "message": { "type": "string", "maxLength": 4000, "description": "The feedback, in the user's words (at most 4000 characters)." } }, "additionalProperties": false }arguments 32 linesupdate_meal unknown never probed
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.
{ "type": "object", "required": [ "id", "local_date" ], "properties": { "id": { "type": "string", "description": "The entry id, shown with each entry in the reply text when a meal is logged or a day or range is read." }, "meal": { "enum": [ "breakfast", "lunch", "dinner", "snack", "other" ], "type": "string", "description": "Move the entry to a different meal label." }, "name": { "type": "string", "description": "Corrected name of the food." }, "note": { "type": "string", "description": "Replacement note for the entry." }, "macros": { "type": "object", "properties": { "kcal": { "type": "number", "description": "Corrected energy for the whole portion, in kilocalories." }, "fat_g": { "type": "number", "description": "Corrected total fat for the whole portion, in grams." }, "carb_g": { "type": "number", "description": "Corrected total carbohydrate for the whole portion, in grams." }, "protein_g": { "type": "number", "description": "Corrected protein for the whole portion, in grams." } }, "description": "Corrected macros. Only the components included are changed." }, "fluid_ml": { "type": "number", "description": "Corrected fluid/hydration volume, in millilitres." }, "quantity": { "type": "string", "description": "Portion as stated, e.g. '2' or '1 cup'." }, "item_index": { "type": "number", "description": "Which food in the entry's items[] to edit (0-based). Required when changing a food's name/quantity/macros/caffeine/fluid; omit for an entry-level change (meal/note)." }, "local_date": { "type": "string", "description": "YYYY-MM-DD diary date of the entry." }, "caffeine_mg": { "type": "number", "description": "Corrected caffeine content, in milligrams." } } }arguments 74 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idbc9a74094a0500af.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/bc9a74094a0500af/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/bc9a74094a0500af?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.
Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.