Koskamo

FoodChecker MCP

FoodChecker is an open-source MCP server that provides a 0-100 health score for food products based on nutrition, additive risks, and processing levels. It uses Open Food Facts data to allow users to check products by barcode, name, or label photo, and suggests healthier alternatives. The server supports tools for checking food, analyzing labels, finding alternatives, and explaining additives.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

FoodChecker MCP logo, by kjagsadvisorsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by kjagsadvisors
MCP endpoint (Streamable HTTP)
https://foodchecker-ebon.vercel.app/mcp
Vendor documentation

What you can do with it

  • Look up a product by barcode or name and score it
  • Score a product from its label photo or pasted text
  • Find similar products that score clearly higher
  • Explain an additive by E-number or name with risk level

Source and maintenance

Community listingRegistry 0.1.0
Maintenance checked

Protocol and capabilities

Server
foodchecker 0.1.0
MCP protocol
2025-06-18
Tools
4 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

FoodChecker rates packaged food and drinks from 0 to 100 (Excellent 75+, Good 50-74, Poor 25-49, Bad 0-24). The score starts from nutrition quality (Nutri-Score 2023), then takes a percentage off for risky additives and ultra-processing (NOVA). High-risk additives or trans fat cap the score at 49. - Barcode or product name: call check_food. - Photo of a label, or pasted ingredients and nutrition facts: transcribe them and call analyze_label. If the photo only shows a barcode, read the digits and call check_food. - "What can I buy instead?": call find_healthier_alternatives with the barcode. - Questions about a specific additive (E-number or name): call explain_additive. When you answer, lead with the score and rating, then the two or three biggest reasons. The card already shows the full breakdown, so don't repeat all of it. Never invent a score; only report what the tools return. This is general information, not medical advice. Mention that briefly when the user has a health condition.

Tools

4 advertised

check_food — Check a food product
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Looks up a packaged food or drink in Open Food Facts (3M+ products) by barcode or by name and returns a 0-100 health score (Excellent / Good / Poor / Bad) with the reasons: nutrition (Nutri-Score), additives and their risk level, and how processed it is. For questions such as whether a product is healthy. A barcode gives the most precise match.

check_food input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "query": {
      "type": "string",
      "description": "Product name, ideally with the brand, e.g. 'Nutella hazelnut spread'. Used when there is no barcode."
    },
    "barcode": {
      "type": "string",
      "description": "EAN/UPC barcode digits, e.g. 3017620422003."
    },
    "country": {
      "type": "string",
      "description": "Optional country to prefer when searching by name, e.g. 'united-states', 'france', 'united-kingdom'."
    }
  }
}
check_food annotations
{
  "title": "Check a food product",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
analyze_label — Score a food from its label
Advertised by the server during the last successful anonymous check.
Advertised read-only

Scores a food from its label: the ingredient list and/or the nutrition facts, for example from a photo of the packaging or pasted text, including products that aren't in the database. Most accurate with the ingredient list exactly as printed, including E-numbers and words in brackets. Nutrition values can be per 100 g or per serving (with the serving size). Returns the same 0-100 score and reports any missing data.

analyze_label input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "brand": {
      "type": "string"
    },
    "category": {
      "enum": [
        "general",
        "beverage",
        "water",
        "cheese",
        "fat_oil_nuts_seeds",
        "red_meat"
      ],
      "type": "string",
      "description": "Nutri-Score family. Use fat_oil_nuts_seeds for oils, butter, nuts and nut butters; cheese for cheese; red_meat for beef, pork or lamb products."
    },
    "is_drink": {
      "type": "boolean",
      "description": "True for beverages (milk and plant drinks included). Values are then per 100 ml."
    },
    "nutrition": {
      "type": "object",
      "required": [
        "basis"
      ],
      "properties": {
        "basis": {
          "enum": [
            "per_100g",
            "per_serving"
          ],
          "type": "string",
          "description": "What the numbers refer to. EU labels are usually per 100 g/ml; US Nutrition Facts are per serving."
        },
        "salt_g": {
          "type": "number",
          "minimum": 0
        },
        "fiber_g": {
          "type": "number",
          "minimum": 0
        },
        "sugars_g": {
          "type": "number",
          "minimum": 0,
          "description": "Total sugars."
        },
        "energy_kj": {
          "type": "number",
          "minimum": 0
        },
        "protein_g": {
          "type": "number",
          "minimum": 0
        },
        "sodium_mg": {
          "type": "number",
          "minimum": 0,
          "description": "Sodium in milligrams (US labels). Use salt_g instead if the label shows salt."
        },
        "total_fat_g": {
          "type": "number",
          "minimum": 0
        },
        "trans_fat_g": {
          "type": "number",
          "minimum": 0
        },
        "serving_size": {
          "type": "number",
          "description": "Serving size in g (or ml for drinks). Required when basis is per_serving.",
          "exclusiveMinimum": 0
        },
        "calories_kcal": {
          "type": "number",
          "minimum": 0
        },
        "added_sugars_g": {
          "type": "number",
          "minimum": 0
        },
        "carbohydrates_g": {
          "type": "number",
          "minimum": 0
        },
        "saturated_fat_g": {
          "type": "number",
          "minimum": 0
        }
      },
      "description": "The nutrition facts table, copied exactly."
    },
    "product_name": {
      "type": "string"
    },
    "ingredients_text": {
      "type": "string",
      "description": "The full ingredient list exactly as printed."
    },
    "fruit_veg_percent": {
      "type": "number",
      "maximum": 100,
      "minimum": 0,
      "description": "% of fruit, vegetables and legumes, if the label states it."
    }
  }
}
analyze_label annotations
{
  "title": "Score a food from its label",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_healthier_alternatives — Find healthier alternatives
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Finds similar products in the same Open Food Facts category that score clearly higher than the given product, best first, each with its score.

find_healthier_alternatives input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "barcode"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1
    },
    "barcode": {
      "type": "string",
      "description": "Barcode of the product to beat."
    },
    "country": {
      "type": "string",
      "description": "Only suggest products sold in this country, e.g. 'united-states'."
    }
  }
}
find_healthier_alternatives annotations
{
  "title": "Find healthier alternatives",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
explain_additive — Explain a food additive
Advertised by the server during the last successful anonymous check.
Advertised read-only

Explains what a food additive is, what it does, and its risk level with sources, by E-number (E250) or name (sodium nitrite, Red 40, carrageenan).

explain_additive input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "additive"
  ],
  "properties": {
    "additive": {
      "type": "string",
      "description": "E-number or name, e.g. 'E471' or 'Red 40'."
    }
  }
}
explain_additive annotations
{
  "title": "Explain a food additive",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

FoodChecker score card

Advertised by the server during the last successful anonymous check.

Interactive health score card for a food product.

FoodChecker score card URI
ui://foodchecker/score-card-v1.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1034 ms
95th percentile latency
1034 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1034 ms · metadata changed · 4 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http foodchecker-mcp https://foodchecker-ebon.vercel.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add foodchecker-mcp --url https://foodchecker-ebon.vercel.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable foodchecker-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "foodchecker-mcp": {
      "url": "https://foodchecker-ebon.vercel.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "foodchecker-mcp": {
      "type": "streamableHttp",
      "url": "https://foodchecker-ebon.vercel.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start foodchecker-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "foodchecker-mcp": {
      "type": "http",
      "url": "https://foodchecker-ebon.vercel.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http foodchecker-mcp https://foodchecker-ebon.vercel.app/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "foodchecker-mcp": {
      "url": "https://foodchecker-ebon.vercel.app/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "foodchecker-mcp": {
      "serverUrl": "https://foodchecker-ebon.vercel.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like FoodChecker MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.