Skip to main content
Glama

livsmedel-mcp

Ask Claude (or any MCP client) what is in Swedish food, using the Swedish Food Agency's official nutrition database.

This is an MCP server for the Livsmedelsdatabasen API from Livsmedelsverket. It covers about 2,600 foods and dishes with 50+ nutrients each. You can search foods by name, read nutrient values, compare foods and work out the nutrition of a recipe per serving.

Unofficial. This project is not made by, affiliated with or endorsed by Livsmedelsverket. The data is theirs, published under CC BY 4.0.

Tools

Tool

What it does

search_foods

Find foods by name (English or Swedish), filter to lab-analysed foods or calculated dishes, paginate with a cursor.

get_food

One food: type, cooking method, a nutrition summary per 100 g, and optionally classifications, recipe ingredients and raw materials.

get_nutrients

All ~60 nutrient values for a food, or only the ones you ask for by code (VITD) or name (iron).

compare_foods

2 to 6 foods side by side on the same nutrients.

calculate_recipe_nutrition

Total, per serving and per 100 g nutrition for a list of foods and gram amounts.

There is also one prompt, nutrition_label, which turns a recipe in plain text into an EU-style nutrition declaration by chaining the tools above.

All tools are read-only. No account or API key is needed.

Related MCP server: nutrition-mcp-server

Install

Requires Node.js 20 or newer.

Claude Code

claude mcp add livsmedel -- npx -y @rickardlind/livsmedel-mcp

Claude Desktop

Add this to claude_desktop_config.json (Settings > Developer > Edit Config) and restart Claude Desktop:

{
  "mcpServers": {
    "livsmedel": {
      "command": "npx",
      "args": ["-y", "@rickardlind/livsmedel-mcp"],
      "env": {
        "LIVSMEDEL_LANGUAGE": "en"
      }
    }
  }
}

Cursor

Add this to ~/.cursor/mcp.json (global) or .cursor/mcp.json in a project:

{
  "mcpServers": {
    "livsmedel": {
      "command": "npx",
      "args": ["-y", "@rickardlind/livsmedel-mcp"]
    }
  }
}

From source

git clone https://github.com/Rapitzo/livsmedel-mcp.git
cd livsmedel-mcp
npm install
npm run build
node dist/index.js   # speaks MCP over stdio

Point your client at node /absolute/path/to/livsmedel-mcp/dist/index.js instead of npx.

Configuration

Everything is optional. Empty values count as unset.

Variable

Default

Purpose

LIVSMEDEL_LANGUAGE

en

Default language for names: en or sv. Each tool call can override it.

LIVSMEDEL_BASE_URL

https://dataportal.livsmedelsverket.se/livsmedel/api/v1

Point at a proxy, a mirror or a mock server.

LIVSMEDEL_API_KEY

unset

Sent on every request if set. The public API does not need one.

LIVSMEDEL_API_KEY_HEADER

x-api-key

Header for the key. If set to Authorization, the key is sent as Bearer <key>.

LIVSMEDEL_TIMEOUT_MS

15000

Per-request timeout.

LIVSMEDEL_MAX_RETRIES

3

Retries for 408, 425, 429, 5xx (except 501), timeouts and network errors.

LIVSMEDEL_CACHE_TTL_SECONDS

21600

How long responses are cached in memory. 0 turns caching off.

LIVSMEDEL_DEBUG

unset

1 logs each request (method, path, status, timing) to stderr. Keys are never logged.

The public Livsmedelsverket API is open, so the key settings do nothing against it. They are there because most real APIs need auth, and this is the pattern I use for those: the key comes from the environment, goes into one header, and never appears in logs or tool output. If you run the server behind a gateway that wants a key, this is how you pass it.

Example prompts

  • "How much vitamin D is in fortified oat drink compared with regular milk?"

  • "I make pancakes with 180 g wheat flour, 6 dl milk, 3 eggs and 30 g butter. Four servings. What is the nutrition per serving?"

  • "Which Swedish sausages in the database have the least salt? Start with falukorv."

  • "Use the nutrition_label prompt for my kanelbulle recipe."

Example output

This is the real response to the pancake recipe above (flour 1941, milk 123, egg 1225, butter 29), recorded against the live API. Three of the nine nutrients are shown here. The full transcript of every tool, including two error cases, is in docs/example-session.md.

{
  "total_weight_g": 960,
  "servings": 4,
  "nutrients": [
    { "code": "ENERC_KCAL", "name": "Energy (kcal)", "unit": "kcal", "total": 1427.4, "per_serving": 356.85, "per_100g": 148.69 },
    { "code": "PROT", "name": "Protein", "unit": "g", "total": 55.23, "per_serving": 13.81, "per_100g": 5.75 },
    { "code": "NACL", "name": "Salt, NaCl", "unit": "g", "total": 1.41, "per_serving": 0.35, "per_100g": 0.15 }
  ],
  "note": "Sums stored per-100 g values. Water loss and nutrient losses from cooking are not modelled.",
  "source": "Livsmedelsverket, Livsmedelsdatabasen (CC BY 4.0)"
}

Design notes

Tool boundaries

The API has one list endpoint and five per-food endpoints (food, nutrients, classifications, ingredients, raw materials). Mapping those one to one would give the model six tools, and it would still have to make several calls to answer a normal question. The tools here follow the questions people ask instead: find a food, look at one food, look at its nutrients, compare a few, add up a recipe. Classifications, ingredients and raw materials are opt-in sections of get_food because they are useful but rarely needed, and leaving them out by default keeps responses small.

Search and pagination

The API cannot search by name. It only pages through the full list with offset and limit. So on the first search the server walks the whole list in pages of 500 (six requests, about a second), caches it per language, and searches in memory after that. Every word in the query has to appear in the name. Exact and start-of-word matches rank first, and shorter names beat long composite dishes. Results come back in pages with an opaque next_cursor. The cursor is tied to the query, type and language it came from, so a cursor from a different search gets a clear error instead of the wrong page.

Compact output

Responses are small JSON objects with English keys, whatever the display language. Energy appears twice in the source data under the same code (ENERC, once in kJ and once in kcal), so the server splits it into ENERC_KJ and ENERC_KCAL. Nutrient filters take codes or name fragments, and anything that did not match is listed under unmatched, so the model can tell "no such nutrient" apart from "value is zero".

Retries and rate limits

The HTTP client retries 408, 425, 429 and 5xx responses (except 501), timeouts and network failures. It uses exponential backoff with full jitter: a random wait of up to 250 ms, then up to 500 ms, then up to 1 s, never more than 10 s. A Retry-After header wins over the computed backoff. Other 4xx responses fail at once. Identical requests that run at the same time share one in-flight promise, and failures are never cached.

Errors

Failures come back as tool results with isError: true and a small JSON body such as {"error": "not_found", "message": "... Use search_foods to find valid numbers."}. The codes are not_found, bad_request, unauthorized, rate_limited, upstream, timeout, network, invalid_response and invalid_input. I return them as tool results rather than protocol errors because the MCP spec says tool failures should be visible to the model so it can recover, for example by searching again. Schema violations are rejected by the SDK before any HTTP call is made.

Logging

stdout carries the MCP protocol, so the server writes nothing there. With LIVSMEDEL_DEBUG=1 it logs one line per request to stderr. The API key travels in a header and is never part of a logged URL.

Development

npm install
npm run typecheck
npm test                 # unit tests against recorded fixtures, no network
npm run test:live        # opt-in smoke test against the real API
npm run session          # build, then call every tool over stdio against the live API
node scripts/record-fixtures.mjs   # refresh test/fixtures from the live API

The unit tests use responses recorded from the real API (test/fixtures/livsmedel-en.json) behind a small fake that implements the same paging. They cover retries, Retry-After, error mapping, auth headers, log redaction, pagination, caching, cursors and every tool through an in-memory MCP client.

Limitations

  • stdio transport only. There is no hosted HTTP endpoint.

  • Search matches on names only. It does not know that "mjölk" and "milk" are the same food, so search in the language you set.

  • calculate_recipe_nutrition adds up stored values. It does not model water loss or nutrient loss from cooking. For cooked dishes, use a calculated dish from the database where one exists, since those already include cooking factors.

  • The database describes generic foods, not branded products.

  • The catalogue is cached for 6 hours by default, so database updates show up after the cache expires or the server restarts.

License

MIT, see LICENSE. Data from Livsmedelsverket's Livsmedelsdatabasen, licensed CC BY 4.0. Credit Livsmedelsverket when you publish values from it.

Built by Rickard Lindbom · Lindforge Digital Studio · https://lindforge.dev

Available Tools

5 tools
calculate_recipe_nutritionCalculate recipe nutritionA
Read-onlyIdempotent

Calculate the nutrition of a recipe or meal from food numbers and gram amounts. Returns totals, per serving and per 100 g. Uses the stored values as-is: if you pass raw ingredients, cooking losses are not modelled.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesIngredients as food number + grams.
languageNoLanguage for food and nutrient names: 'en' (English) or 'sv' (Swedish). Defaults to the server setting.
servingsNoNumber of servings the recipe makes.
nutrientsNoNutrients to include, by code (e.g. 'PROT', 'ENERC_KCAL', 'VITD') or name fragment (e.g. 'iron', 'vitamin b'). Omit for the default set.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate a safe, read-only, idempotent operation. The description adds meaningful behavioral context beyond that: results are computed from stored values as-is, and cooking losses are not modelled when raw ingredients are passed. This is exactly the kind of caveat that helps an agent reason about correctness.

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?

Three sentences with no redundancy. The first sentence states the main purpose and input, the second the return structure, and the third an important limitation. All information is front-loaded and earns its place.

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 read-only calculation tool with a fully described schema, the description covers the essentials: purpose, input format, output shape, and a key modelling limitation. Since there is no output schema, the explicit mention of returned totals, per-serving, and per-100g values is valuable. It could be slightly more explicit about how servings affect results, but overall it is complete.

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?

All four parameters are fully described in the schema, so the baseline is 3. The description adds general context about food numbers and gram amounts but does not need to repeat parameter-level details. It does not meaningfully enhance the schema's parameter documentation.

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 uses a specific verb ('calculate'), names the resource ('nutrition of a recipe or meal'), and specifies the input type ('food numbers and gram amounts'). It also states the output forms (totals, per serving, per 100 g), which clearly separates it from food-search siblings.

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?

The description gives clear context for when to use the tool: when calculating recipe/meal nutrition from food numbers and gram amounts. However, it does not explicitly contrast it with siblings such as get_food or compare_foods, so the guidance is clear but lacks explicit exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_foodsCompare foodsA
Read-onlyIdempotent

Compare 2-6 foods side by side on the same nutrients (per 100 g). Defaults to the nutrition declaration set: energy, fat, saturated fat, carbohydrates, sugar, fibre, protein, salt.

ParametersJSON Schema
NameRequiredDescriptionDefault
numbersYesFood numbers to compare.
languageNoLanguage for food and nutrient names: 'en' (English) or 'sv' (Swedish). Defaults to the server setting.
nutrientsNoNutrients to include, by code (e.g. 'PROT', 'ENERC_KCAL', 'VITD') or name fragment (e.g. 'iron', 'vitamin b'). Omit for the default set.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, and open-world behavior. The description adds meaningful context not in the annotations: the comparison is per 100 g, uses a fixed nutrient set by default, and supports 2–6 foods. This is sufficient supplemental behavioral disclosure for a safe read-only operation.

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 sentences with no redundancy. The primary action and constraints are front-loaded, and the default set is compactly listed. Every sentence earns its place.

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 simple read-only comparison tool with fully described parameters and a default nutrient set, the description covers the essential context an agent needs. No output schema exists, but the tool's return is straightforward, and no critical behavior like error handling or authentication is needed given the read-only annotations.

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?

Input schema covers all parameters with descriptions, so the bar is met by the schema itself. The description adds the default nutrient set and per-100 g basis, which enriches the 'nutrients' parameter's meaning, but it does not explain parameter syntax or relationships beyond what the schema already states.

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 clearly identifies the action (compare), the resource (foods), and the scope (2-6 foods, same nutrients per 100 g). It also lists the default nutrient set, which sets it apart from sibling tools like get_food and search_foods, whose purposes are singular retrieval or search.

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 implies when to use the tool—when a side-by-side comparison of foods is desired—but it does not explicitly state when not to use it or point to alternatives like get_food for a single food's data. The usage guidance is present but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_foodGet food detailsA
Read-onlyIdempotent

Get one food by number: type, scientific name, cooking method, a short nutrition summary per 100 g (energy, fat, saturated fat, carbohydrates, sugar, fibre, protein, salt) and optionally its classifications, recipe ingredients and raw materials.

ParametersJSON Schema
NameRequiredDescriptionDefault
numberYesFood number from search_foods (livsmedelsnummer).
includeNoExtra sections. 'ingredients' only exists for calculated foods (dishes).
languageNoLanguage for food and nutrient names: 'en' (English) or 'sv' (Swedish). Defaults to the server setting.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful behavioral detail about the returned nutrition summary and optional sections, which goes beyond the annotations without contradicting them.

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 a single informative sentence with the key action front-loaded. It lists necessary return fields without unnecessary elaboration or repetition of schema details.

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?

There is no output schema, but the description sufficiently explains the return content, including the nutrient list and optional included sections. Combined with the fully documented input schema and annotations, an agent has enough context to call the tool correctly.

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 the parameters are already well documented. The description adds little about parameter semantics beyond mentioning optional sections, but it doesn't need to compensate for missing schema documentation.

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 states a specific action ('Get one food by number') and a precise resource, then enumerates the exact fields returned. This makes it easy to distinguish from siblings like search_foods, compare_foods, and calculate_recipe_nutrition.

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?

The description makes the usage context clear: it is for retrieving a single food when a food number is already known, with optional extended sections. It does not explicitly name alternatives or exclusion conditions, but the 'one food by number' framing is enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_nutrientsGet nutrient valuesA
Read-onlyIdempotent

Get nutrient values per 100 g for one food. Returns all ~60 nutrients (vitamins, minerals, fatty acids, sugars, energy) unless you pass a nutrients filter. Unknown filter terms are listed in 'unmatched'.

ParametersJSON Schema
NameRequiredDescriptionDefault
numberYesFood number from search_foods (livsmedelsnummer).
languageNoLanguage for food and nutrient names: 'en' (English) or 'sv' (Swedish). Defaults to the server setting.
nutrientsNoNutrients to include, by code (e.g. 'PROT', 'ENERC_KCAL', 'VITD') or name fragment (e.g. 'iron', 'vitamin b'). Omit for the default set.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent safety. The description adds two behavioral details: the default return set ('all ~60 nutrients') and how unknown filter terms are handled ('listed in unmatched'). This gives an agent foresight into failure modes and response shape without repetition.

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 sentences, zero waste. Purpose is front-loaded, followed by default behavioral scope, then the edge case. Every word earns its place.

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 single-food nutrient query, the description covers the main behavior, the scaling (per 100 g), default nutrient set, and the unmatched-field edge case. Since there is no output schema, a little more return-structure detail would help, but the essential context is present and adequate.

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 the baseline is 3. The description only lightly references the nutrients filter and adds no syntax or code details beyond what the schema already provides. No extra semantic value.

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: 'Get nutrient values per 100 g for one food.' The 'one food' scope differentiates it from compare_foods and calculate_recipe_nutrition, and the 'per 100 g' detail adds precision. An agent can tell it apart from siblings without opening schemas.

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 implies a clear use case (single food nutrient lookup) but never explicitly names alternatives or conditions for when to use those instead. No mention of search_foods as a prerequisite or compare_foods for multiple items. Usage is inferred, not directed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_foodsSearch foodsA
Read-onlyIdempotent

Search the Swedish Food Agency's food composition database (about 2,600 foods and dishes) by name. Returns food numbers to use with the other tools. All words in the query must appear in the name. Results are ranked, paginated, and include next_cursor when more matches exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo'analysed' = lab-analysed raw foods, 'calculated' = recipes and dishes computed from ingredients.any
limitNoResults per page (1-50).
queryYesWords to find in the food name, e.g. 'oat milk' or 'falukorv'.
cursorNonext_cursor from a previous call with the same query.
languageNoLanguage for food and nutrient names: 'en' (English) or 'sv' (Swedish). Defaults to the server setting.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds meaningful behavioral details beyond annotations: exact multi-word matching ('All words must appear'), ranking, pagination, and next_cursor behavior. It does not detail the exact response shape, but for a search tool the description is sufficiently transparent.

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?

Three tight sentences cover purpose, output, matching behavior, and pagination with no filler. The most important facts are front-loaded: what the tool searches and what it returns.

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 search tool with no output schemaanding, the description covers what it searches, how matching works, what it returns, and how pagination works. The remaining parameter details (limit, language, type) are fully covered by the schema, so nothing essential is missing 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?

Schema description coverage is 100%, so the schema already documents all five parameters. The description adds value by clarifying query semantics ('All words in the query must appear in the name') and the pagination contract tied to cursor ('include next_cursor when more matches exist'). This goes beyond simply restating parameter names.

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 names a specific verb ('Search'), resource ('Swedish Food Agency's food composition database'), and method ('by name'), and states the key output ('food numbers to use with the other tools'). This clearly distinguishes search_foods from sibling tools like get_food or get_nutrients, which operate on already-known foods.

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?

The description implies the primary use case: find food numbers first, then use them with the other tools. It also gives important search behavior ('All words in the query must appear in the name') and pagination semantics. It does not explicitly name alternatives or exclusions, but the 'use with the other tools' statement provides clear context.

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. 5 tool updatesv0.1.0
    • First observedcalculate_recipe_nutrition
    • First observedcompare_foods
    • First observedget_food
    • First observedget_nutrients
    • First observedsearch_foods

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct operation: searching, retrieving a basic record, retrieving detailed nutrients, comparing foods, and calculating recipe nutrition. The only mild overlap is between get_food's summary and get_nutrients' detailed values, but their scopes are clear.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: search_foods, get_food, get_nutrients, compare_foods, calculate_recipe_nutrition. The singular/plural objects are semantically appropriate.

Tool Count5/5

Five tools is well-scoped for a food composition database MCP. The set covers discovery, detailed lookup, comparison, and recipe calculation without unnecessary extras.

Completeness5/5

For a read-only database, the surface is complete: search finds foods, get_food gives the record, get_nutrients gives full nutrient detail, compare_foods supports side-by-side analysis, and calculate_recipe_nutrition handles meal-level use cases. The documented limitation about cooking losses is reasonable rather than a gap.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers