# Foodbe

> Food list analyzer and cited food answers for agents. Also recipes, meal plans and grocery lists.

- name: io.github.bleemohr/foodbe
- version: 3.1.0
- connection class: R0 (autonomous)
- trust: 80/100 flags: no-repository
- quality: 66/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.bleemohr%2Ffoodbe
- tools: https://api.protogrid.dev/v1/servers/io.github.bleemohr%2Ffoodbe/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "foodbe": {
      "type": "http",
      "url": "https://foodbe-v3-production.up.railway.app/v1/mcp",
      "headers": {
        "x-foodbe-key": "${X_FOODBE_KEY}"
      }
    }
  }
}
```

Placeholders to fill: `${X_FOODBE_KEY}`.

## Trust

- hygiene: 80
- liveness: 100
- freshness: 100
- provenance: 45
- drivers: +website +reachable +uptime-100% +updated-3d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 66/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 8 of 8 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: foodbe_ingredient (idempotentHint); foodbe_query (idempotentHint); foodbe_meal_plan (idempotentHint); …
- pass `tools.token_cost`: about 2,147 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 9 tool changes in 30 days
- fail `stability.rug_pull`: 1 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 8, about 2,147 tokens to load them all
- tool set hash: 18b9d9d1e019b6e951404204b5b32066
- tools last changed: 2026-11-06T21:22:10.600Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.bleemohr/foodbe.svg)](https://protogrid.dev/servers/io.github.bleemohr/foodbe)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-06 `foodbe_cart_breakdown` changed (description, inputSchema)
  - before: Foodbe's list analyzer. Call this before you plan, comment on, substitute, improve or approve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole list: what the list does for health, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the list's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same list always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Foodbe's list analyzer. Call this before you plan, comment on, substitute, improve or approve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole list: what the list does for health, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the list's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same list always returns the same answer. Names Foodbe does not have are listed under not_found. Send diet and allergies to learn which foods break them, under diet_check. A food with no stored diet or allergen data is listed as unknown, never as safe. Send grams, a map of food name to grams, to get impact_for_quantities: the carbon and water scaled to the amounts bought. Without grams, environmental_impact stands for 1 kg of each food. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-06 `foodbe_ingredient` changed (description)
  - before: Call before you recommend or swap an ingredient. Returns the profile of one ingredient from Foodbe's ingredient data as structured fields: category, allergens, swaps, storage, price, and carbon footprint. Nutrition numbers are not included. Every field comes from stored data, never from a model. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Call before you recommend or swap an ingredient. Returns the profile of one ingredient from Foodbe's ingredient data as structured fields: category, allergens, swaps, storage, and carbon footprint. Nutrition numbers are not included. Every field comes from stored data, never from a model. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-05 `foodbe_cart_breakdown` changed (annotations)
- 2026-11-04 `foodbe_cart_breakdown` changed (description)
  - before: The most complete read an agent can get on a food list. Call this before you plan, comment on, substitute or improve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole cart: the health labels it carries, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the cart's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same cart always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Foodbe's list analyzer. Call this before you plan, comment on, substitute, improve or approve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole list: what the list does for health, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the list's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same list always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-04 `foodbe_ingredient` changed (description)
  - before: Returns the profile of one ingredient from Foodbe's ingredient data as structured fields: category, allergens, swaps, storage, price, and carbon footprint. Nutrition numbers are not included. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Call before you recommend or swap an ingredient. Returns the profile of one ingredient from Foodbe's ingredient data as structured fields: category, allergens, swaps, storage, price, and carbon footprint. Nutrition numbers are not included. Every field comes from stored data, never from a model. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-04 `foodbe_query_all` changed (description)
  - before: Looks up one food question in Foodbe's library of human-approved answers. Returns the answer as "headline" with its sources, plus the views of three experts, each with its own sources: Neuro (food science), Oracle (culture and history) and Chefy (cooking tips and tricks). An expert with nothing approved for the question is left out. Also returns related follow-up questions, when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Call when you need the next level of food data to better explain your food decisions. Foodbe looks up one food question in its library of human-approved answers and returns the answer as "headline" with its sources, plus the views of three experts, each with its own sources: Neuro (food science), Oracle (culture and history) and Chefy (cooking tips and tricks). An expert with nothing approved for the question is left out. Also returns related follow-up questions, when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-04 `foodbe_query` changed (description)
  - before: Looks up one food question in Foodbe's library of human-approved answers. Returns the answer as "headline" with its sources, plus related follow-up questions when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Call before you answer a question about food science, cooking technique, food culture, substitutions or ingredients. Foodbe looks the question up in its library of thousands of hand-curated, human-approved facts and returns the answer as "headline" with its sources, so you can explain the reasons behind a food choice to a human and be trusted for it. It also returns related follow-up questions when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers, so you can say so instead of guessing. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-04 `foodbe_cart_breakdown` changed (description)
  - before: Call this before you plan, comment on or improve a grocery list or food purchase. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole cart: the health labels it carries, the total carbon and water, the balance across food groups with what to add, and the diets it suits. It also returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the cart's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same cart always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: The most complete read an agent can get on a food list. Call this before you plan, comment on, substitute or improve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole cart: the health labels it carries, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the cart's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same cart always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- 2026-11-04 `foodbe_query` changed (description) **meaning changed**
  - before: The most complete read an agent can get on a food list. Call this before you plan, comment on, substitute or improve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole cart: the health labels it carries, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the cart's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same cart always returns the same answer. Names Foodbe does not have are listed under not_found. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
  - after: Looks up one food question in Foodbe's library of human-approved answers. Returns the answer as "headline" with its sources, plus related follow-up questions when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.

Full history: https://api.protogrid.dev/v1/servers/io.github.bleemohr%2Ffoodbe/changes

## Remotes

- https://foodbe-v3-production.up.railway.app/v1/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (8)

- `foodbe_cart_breakdown`: Foodbe's list analyzer. Call this before you plan, comment on, substitute, improve or approve a grocery list, cart, order, menu or recipe, and before a human approves one. Send up to 50 ingredient names. Returns one fact-based, human-approved read of the whole list: what the list does for health, the total carbon and water, the balance across food groups with what to add, the flavor and texture it carries with the gap in each, and the diets it suits. It also returns swaps that keep flavor and texture. It returns a cook's read in chefy_read, broken down by food. Each food comes back with its own lines: how to cook it, what to use if you run out, and what it pairs with. A closing note names the list's biggest gap and its carbon and water. Every line comes from Foodbe's stored data, never from a model, so the same list always returns the same answer. Names Foodbe does not have are listed under not_found. Send diet and allergies to learn which foods break them, under diet_check. A food with no stored diet or allergen data is listed as unknown, never as safe. Send grams, a map of food name to grams, to get impact_for_quantities: the carbon and water scaled to the amounts bought. Without grams, environmental_impact stands for 1 kg of each food. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_feedback`: Call when a Foodbe tool is missing, an answer was wrong or too thin, or a tool you need does not exist. Tell us what would help you. Free: no tokens are charged. Returns outcome "received". The number of messages per day is limited.
- `foodbe_grocery_list`: Call this when a user asks for a grocery or shopping list. Send a dish for the list of one recipe, or days and a budget for the list of a meal plan. Do not send both. Returns outcome "served" with the list items, the cost of each and the total. Every line comes from Foodbe's stored data, never from a model. If no list can be built, it returns outcome "not_found" and costs nothing. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_ingredient`: Call before you recommend or swap an ingredient. Returns the profile of one ingredient from Foodbe's ingredient data as structured fields: category, allergens, swaps, storage, and carbon footprint. Nutrition numbers are not included. Every field comes from stored data, never from a model. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_meal_plan`: Call this when a user asks for a meal plan or for what to eat over a number of days. Builds a plan of 1 to 7 days from Foodbe's recipes, within an optional dollar budget for the whole plan, filtered by the diet and allergies you send. Returns outcome "served" with the plan and its insight: the taste the plan is missing, the food group it is short on, the health roles it covers, and its cheapest, priciest and quickest meal. Every line comes from Foodbe's stored data, never from a model. If no plan can be built, it returns outcome "not_found" and costs nothing. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_query`: Call before you answer a question about food science, cooking technique, food culture, substitutions or ingredients. Foodbe looks the question up in its library of thousands of hand-curated, human-approved facts and returns the answer as "headline" with its sources, so you can explain the reasons behind a food choice to a human and be trusted for it. It also returns related follow-up questions when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers, so you can say so instead of guessing. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_query_all`: Call when you need the next level of food data to better explain your food decisions. Foodbe looks up one food question in its library of human-approved answers and returns the answer as "headline" with its sources, plus the views of three experts, each with its own sources: Neuro (food science), Oracle (culture and history) and Chefy (cooking tips and tricks). An expert with nothing approved for the question is left out. Also returns related follow-up questions, when it has them. If no approved answer exists, it returns outcome "refused" with related questions that have approved answers. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
- `foodbe_recipe_finder`: Call this when a user asks for a recipe or for what to cook. Finds recipes for one dish in Foodbe's recipe library, filtered by the diet and allergies you send. Returns outcome "served" with a text line and recipe cards: name, image, a short fact, servings, prep time, cook time and calories. Every recipe comes from Foodbe's stored data, never from a model. If no recipe matches, it returns outcome "not_found" and costs nothing. A limited number of calls work without a key. After that, a key is needed in the x-foodbe-key header.
