Skip to main content
Glama
borgels

mcp-server-fooddata-dk

by borgels

mcp-server-fooddata-dk

MCP server for Danish food and nutrition data. Combines Open Food Facts (Danish branded/supermarket products, barcode lookup) with the DTU Frida food composition database (generic Danish foods like rugbrød, leverpostej, frikadeller).

Read-only, no user accounts, no credentials. Built as a companion to mcp-server-fatsecret: FatSecret's free tier only carries US food data, so this server supplies the real Danish numbers and the calling model logs the meal there with the serving scaled to match.

This is an independent, unofficial project, not affiliated with Open Food Facts or DTU.

Why two sources

They cover opposite gaps, and neither is sufficient alone:

Source

Strong at

Weak at

Open Food Facts

Branded supermarket products, barcode scanning, ~9,400 Danish-tagged items

Generic/home-cooked foods; barcode coverage is patchy

DTU Frida

Generic and composite Danish foods, authoritative composition data

No branded products, no barcodes

fooddata_search queries both and returns Frida first, since for a generic Danish food DTU's figures are authoritative while OFF's nearest equivalent is a branded approximation.

Related MCP server: Open Food Facts MCP Server

Tools

Tool

Purpose

fooddata_search_capabilities

Discovery — find the right tool

fooddata_search

Keyword search across both sources; per-100g macros with source attribution

fooddata_get_by_barcode

Open Food Facts barcode (EAN) lookup

fooddata_get_food

Full detail for one food by id (off:<barcode> or frida:<id>)

fooddata_sources

Which sources are available and their required attribution

All values are per 100 g/ml — the only basis both sources reliably share. The caller scales from there.

Setup

No credentials needed. Open Food Facts requires only a descriptive User-Agent, which defaults to this project's name and URL; set OFF_USER_AGENT to include a real contact address if you run it at any volume.

{
  "mcpServers": {
    "fooddata-dk": {
      "command": "npx",
      "args": ["-y", "mcp-server-fooddata-dk"],
      "env": { "OFF_USER_AGENT": "yourapp/1.0 (you@example.com)" }
    }
  }
}

Adding the Frida dataset (optional)

Frida has no public API — its site is a single-page app over an undocumented backend, which this project deliberately does not reverse-engineer. The dataset is instead downloaded by hand and converted:

npm run frida:convert -- frida-export.csv ./data/frida.json --version 5.5

See data/README.md. The server runs fine without it, serving Open Food Facts only and reporting Frida as unavailable.

Rate limits and caching

Open Food Facts allows 15 requests/min for product reads and 10/min for searches, per IP. Responses are cached in memory (1 h TTL, 500 entries), including barcode misses — a barcode absent from OFF won't appear a minute later. A 429 is reported as a clear rate-limit message rather than a bare status code, and OFF's habit of serving an HTML error page during outages is detected and reported as such.

Attribution

Both licences require credit, and the server attaches it to every result:

  • Open Food Facts — Open Database License (ODbL).

  • DTU FridaFrida Food Data (https://frida.fooddata.dk), National Food Institute, Technical University of Denmark.

Optional HTTP server

npm run dev:http (and the published Docker image) serve /mcp over Streamable HTTP, gated by MCP_HTTP_TOKEN, plus a /healthz endpoint reporting whether the Frida dataset loaded. There is no per-user state, so unlike the personal connectors this one needs no identity forwarding.

Verification

npm run typecheck && npm test && npm run build
npm run smoke:live   # hits the real Open Food Facts API

License

Apache-2.0

Available Tools

5 tools
fooddata_get_by_barcodeLook Up Food by BarcodeA
Read-onlyIdempotent

Look up a packaged product by its barcode (EAN) in Open Food Facts. Danish barcode coverage is good but incomplete — if nothing is found, fall back to fooddata_search by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
barcodeYes

TDQS

A4.6/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral context beyond those annotations: it notes that Danish barcode coverage is good but incomplete, implying occasional empty results, and it communicates the fallback behavior. This is useful context that enriches what the annotations already provide, though it doesn't discuss rate limits or auth requirements, which are likely not applicable here.

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 two sentences, with no fluff. The first sentence states the primary use case; the second adds essential fallback guidance. Front-loaded and efficient, every word contributes to selection and invocation.

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?

Given the simplicity of the tool (one parameter, no output schema), the description is complete enough: it explains what the tool does, when to use it, and what to do if it fails. The fallback to fooddata_search covers a critical edge case. It doesn't detail the exact return format, but for a lookup tool with an open-world hint, this is acceptable. Overall, it provides sufficient context for an agent to use it correctly.

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 input schema has 0% description coverage, so the description must compensate. It does so by clarifying the 'barcode' parameter is an EAN and tying it directly to the tool's purpose. The schema already enforces numeric string with minLength 6, and the description adds the semantic meaning of 'EAN' without redundancy. This is sufficient for a simple single-parameter tool.

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 states the tool's purpose: to look up a packaged product by its barcode (EAN) in Open Food Facts. It uses a specific verb ('look up') and resource ('packaged product by barcode'), which distinguishes it from sibling tools like fooddata_search (by name) and fooddata_get_food (likely by internal ID). The explicit mention of 'barcode (EAN)' leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance and a fallback: 'if nothing is found, fall back to fooddata_search by name.' This tells the agent exactly when to use this tool and what to do if it fails, and it names the alternative tool (fooddata_search). This is a model of clear usage instruction.

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

fooddata_get_foodGet One Food by IdA
Read-onlyIdempotent

Full detail for a single food by the id returned from fooddata_search ("off:" or "frida:").

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already provide readOnly/idempotent/destructive safety hints. The description adds the id format constraint ('off:<barcode>' or 'frida:<id>') but does not describe return shape or error behavior, so moderate value beyond annotations.

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?

A single, front-loaded sentence with no filler; every word adds value.

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-parameter read tool with no output schema, the description gives essential information (id source and format) but omits details about the returned 'full detail' structure or error cases; adequate but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no description for the id parameter, but the description fully explains the expected format, including prefixes from fooddata_search, completely compensating for the schema gap.

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 the tool retrieves full detail for a single food by id, referencing the specific id format from fooddata_search, which clearly distinguishes it from siblings like fooddata_get_by_barcode.

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 indicates the id must come from fooddata_search, implying a search-then-get workflow, but does not explicitly mention alternatives or exclusions.

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

fooddata_search_capabilitiesSearch Food Data CapabilitiesA
Read-onlyIdempotent

Find the right food-data tool. Use first if unsure what is available.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, providing a clear safety profile. The description adds context about being a first-step tool but does not elaborate on behavioral details such as return format, pagination behavior, or how results are ranked. This is acceptable given the annotations, but no extra behavioral insight is provided beyond what annotations imply.

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?

The description is exceptionally concise with two short sentences, both of which are directly relevant and front-loaded. However, the brevity sacrifices necessary parameter explanation, so it is not perfectly efficient; it could include a clause about query/limit without bloating significantly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Without an output schema, the description must clarify what the agent will receive (e.g., a list of tool names, recommended tool, or explanation) and how to use the results. It also fails to explain how 'query' influences the output or how 'limit' affects the number of suggestions. For a meta-tool that guides tool selection, this lack of detail makes the description incomplete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no description coverage (0%), and the description does not mention the 'query' or 'limit' parameters at all. The tool name suggests query is a natural-language need description and limit may cap results, but the agent must guess these semantics. A description for a routing tool should explicitly state that 'query' is the user's goal and 'limit' restricts the number of recommended tools.

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 explicitly states the tool's purpose: 'Find the right food-data tool.' This uses a specific verb ('find') and resource ('right food-data tool'), clearly distinguishing it from sibling tools that directly search or retrieve food data. The phrase 'Use first if unsure what is available' reinforces its role as a discovery or routing tool.

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 usage guidance: 'Use first if unsure what is available.' This tells the agent when to call this tool, implying that if the agent already knows the appropriate sibling, it should use that tool directly. However, it does not explicitly name alternatives or say when not to use it, so it falls one point short of a perfect score.

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

fooddata_sourcesFood Data SourcesA
Read-onlyIdempotent

Which data sources this server has available, and the attribution their licences require.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds that the tool returns license attribution requirements, which is useful content context. No contradictions are present, and the description does not overpromise. It doesn't mention response format or caching, but with strong annotations this is acceptable.

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?

The description is a single sentence fragment that conveys the essential purpose without wasting words. It is relatively clear and front-loaded with the main topic (data sources), though the grammar is slightly awkward due to the missing verb.

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 zero-parameter informational tool with robust annotations, the description gives enough context: it explains what data is returned (sources and license attribution). No output schema exists, but the description communicates the tool's functionality sufficiently for an agent to select it. It could mention that it returns a list, but the use case is straightforward.

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 has zero parameters, so the schema is empty. According to the rubric, 0 params is baseline 4. The description does not need to add parameter information, and none is provided.

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 clearly states the tool provides available data sources and their required license attribution. It distinguishes itself from sibling tools (search, get_food) by focusing on server-level data source information, though it lacks an explicit verb like 'list' and uses a question-style fragment.

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?

No explicit when-to-use or alternative tool guidance is provided. The purpose is clear enough to imply usage for retrieving data source information, but exclusions against alternatives like search_capabilities are not stated. The context is implied rather than explicit.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedfooddata_get_by_barcode
    • First observedfooddata_get_food
    • First observedfooddata_search
    • First observedfooddata_search_capabilities
    • First observedfooddata_sources

TDQS

A4.1/5.0
Disambiguation4/5

Tools are largely distinct: search, barcode lookup, ID detail, and meta-info. fooddata_search_capabilities and fooddata_sources both provide meta-info but one guides tool selection while the other covers data sources/licensing. Search vs get_by_barcode is clarified by description, so only minor ambiguity remains.

Naming Consistency4/5

All tools share the fooddata_ prefix, and most follow a verb_noun pattern (search_capabilities, get_food, get_by_barcode). However, 'fooddata_sources' is a bare noun and 'fooddata_search' is a bare verb, deviating slightly from the consistent verb_noun style.

Tool Count5/5

Five tools is well-scoped for a food data server. Each serves a distinct need: search, barcode lookup, detail retrieval, and source/capability info. No redundant or missing tools for the server's read-only purpose.

Completeness5/5

The tool surface covers all core operations for a food data lookup server: keyword search, barcode lookup, full detail by ID, and attribution info. There are no dead ends—get_food relies on search IDs, but that is a documented flow. No obvious gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to a comprehensive food database with 300,000+ items, enabling nutritional data lookups, food searches, and barcode scanning with all processing happening locally for privacy and speed.
    204
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to access the Open Food Facts database to query detailed food product information, nutritional data, and environmental scores. Supports product lookup by barcode, smart search with filtering, nutritional analysis, product comparison, and dietary recommendations to help users make informed food choices.
    5
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/borgels/mcp-server-fooddata-dk'

If you have feedback or need assistance with the MCP directory API, please join our Discord server