FDA GRAS search, US retailer ingredient rules, sugar swaps and FDA Nutrition Facts labels.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Calculate a US FDA Nutrition Facts label from a formula: FDA rounding (21 CFR 101.9), % Daily Values, RACC-based serving size, servings per container, single vs dual-column format, plus ingredient, allergen and net-quantity statements and nutrient-content claim checks. Ingredient quantities are batch amounts; nutrients are per 100 g of each ingredient. Missing nutrients are treated as 0 and reported back, so the label is only as good as its inputs: it must be verified before printing.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http sks-nutrition-ai https://iygszrxfaretrgnjfmel.supabase.co/functions/v1/sks-mcp
Calculate a US FDA Nutrition Facts label from a formula: FDA rounding (21 CFR 101.9), % Daily Values, RACC-based serving size, servings per container, single vs dual-column format, plus ingredient, allergen and net-quantity statements and nutrient-content claim checks. Ingredient quantities are batch amounts; nutrients are per 100 g of each ingredient. Missing nutrients are treated as 0 and reported back, so the label is only as good as its inputs: it must be verified before printing.
| Argument | Type | Description |
|---|---|---|
| product* | object | |
| ingredients* | array |
{
"type": "object",
"required": [
"product",
"ingredients"
],
"properties": {
"product": {
"type": "object",
"required": [
"name",
"racc_id",
"net_quantity",
"household_measure"
],
"properties": {
"name": {
"type": "string"
},
"format": {
"enum": [
"auto",
"standard",
"dual"
],
"type": "string",
"default": "auto"
},
"racc_g": {
"type": "number",
"description": "Only for categories that need a gram RACC."
},
"racc_id": {
"type": "string",
"description": "FDA RACC category id, e.g. 'cookies'."
},
"protein_dv": {
"type": "boolean",
"default": false,
"description": "Declare protein %DV (requires PDCAAS)."
},
"may_contain": {
"type": "string",
"description": "Optional advisory allergen statement."
},
"net_quantity": {
"type": "object",
"required": [
"value",
"unit"
],
"properties": {
"unit": {
"enum": [
"g",
"oz",
"lb",
"kg",
"fl_oz",
"mL",
"L"
],
"type": "string"
},
"value": {
"type": "number"
}
}
},
"density_g_per_ml": {
"type": "number",
"description": "For liquids sold by volume. Default 1.0."
},
"serving_quantity": {
"type": "object",
"required": [
"value",
"unit"
],
"properties": {
"unit": {
"enum": [
"g",
"oz",
"lb",
"kg",
"fl_oz",
"mL",
"L"
],
"type": "string"
},
"value": {
"type": "number"
}
},
"description": "Optional; defaults to the RACC."
},
"household_measure": {
"type": "string",
"description": "e.g. '2 cookies (30g)', '1 can', '2 tbsp'."
},
"processing_loss_pct": {
"type": "number",
"maximum": 99,
"minimum": 0,
"description": "Moisture/processing loss from batch to finished product, percent. Default 0."
}
}
},
"ingredients": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"quantity",
"nutrients_per_100g"
],
"properties": {
"name": {
"type": "string"
},
"unit": {
"enum": [
"g",
"kg",
"lb",
"oz"
],
"type": "string",
"default": "g"
},
"quantity": {
"type": "number",
"description": "Amount in the batch."
},
"verified": {
"type": "boolean",
"default": false
},
"allergens": {
"type": "array",
"items": {
"enum": [
"Milk",
"Egg",
"Fish",
"Crustacean Shellfish",
"Tree Nuts",
"Peanuts",
"Wheat",
"Soy",
"Sesame"
],
"type": "string"
}
},
"label_name": {
"type": "string",
"description": "Name for the ingredient statement; defaults to name."
},
"nutrient_source": {
"enum": [
"supplier_spec",
"lab",
"customer_db",
"usda",
"calculated",
"manual",
"ai_estimate"
],
"type": "string",
"default": "manual"
},
"nutrients_per_100g": {
"type": "object",
"properties": {
"k": {
"type": "number",
"minimum": 0
},
"ca": {
"type": "number",
"minimum": 0
},
"fe": {
"type": "number",
"minimum": 0
},
"na": {
"type": "number",
"minimum": 0
},
"fat": {
"type": "number",
"minimum": 0
},
"sat": {
"type": "number",
"minimum": 0
},
"carb": {
"type": "number",
"minimum": 0
},
"chol": {
"type": "number",
"minimum": 0
},
"kcal": {
"type": "number",
"minimum": 0
},
"prot": {
"type": "number",
"minimum": 0
},
"vitd": {
"type": "number",
"minimum": 0
},
"added": {
"type": "number",
"minimum": 0
},
"fiber": {
"type": "number",
"minimum": 0
},
"sugar": {
"type": "number",
"minimum": 0
},
"trans": {
"type": "number",
"minimum": 0
}
},
"description": "kcal; fat, sat, trans, carb, fiber, sugar, added, prot in g; chol, na, ca, fe, k in mg; vitd in mcg.",
"additionalProperties": false
}
}
},
"maxItems": 60,
"minItems": 1
}
},
"additionalProperties": false
}Screen food ingredients against the public private-label ingredient rules of 7 US retailers: Trader Joe's (TJ), Whole Foods Market (WFM), Kroger Simple Truth (ST), Walmart (WMT), Sam's Club (SAM), Aldi (ALDI) and Sprouts (SPR). Covers about 54 ingredients and classes (synthetic colors, high-intensity sweeteners, preservatives, emulsifiers, fats, flavors). Statuses: BANNED, BANNED_BY_PRINCIPLE, ALLOWED_NAMED, CONDITIONAL, NOT_LISTED (not the same as approved), UNVERIFIED, CONFIRM_WITH_BUYER. Public lists are not full specifications: always confirm with the buyer.
| Argument | Type | Description |
|---|---|---|
| retailers | array | Optional subset of retailer codes. Default: all 7. |
| ingredients* | array | Ingredient names as on a label, e.g. ['sucralose', 'Red 40', 'sodium benzoate']. |
{
"type": "object",
"required": [
"ingredients"
],
"properties": {
"retailers": {
"type": "array",
"items": {
"enum": [
"TJ",
"WFM",
"ST",
"WMT",
"SAM",
"ALDI",
"SPR"
],
"type": "string"
},
"description": "Optional subset of retailer codes. Default: all 7."
},
"ingredients": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 60,
"minItems": 1,
"description": "Ingredient names as on a label, e.g. ['sucralose', 'Red 40', 'sodium benzoate']."
}
},
"additionalProperties": false
}List FDA Reference Amounts Customarily Consumed (RACC, 21 CFR 101.12) product categories used for Nutrition Facts serving sizes. Returns each category's id, group, name, reference amount and household measure hint. Optional filter words, e.g. 'cookie', 'carbonated beverage' or 'sauce'.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query | string | Optional words to filter categories. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 15,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"description": "Optional words to filter categories."
}
},
"additionalProperties": false
}Search the FDA GRAS (Generally Recognized as Safe) Notice inventory by substance, intended use or notifier. Returns GRN number, substance, intended use, basis, notifier, filing/closure dates and FDA's response letter (e.g. 'FDA has no questions'). Useful for checking whether a food ingredient has a GRAS notice before formulating for the US market. A missing notice does not mean an ingredient is not GRAS (self-affirmed GRAS exists), and a notice covers only its stated uses.
| Argument | Type | Description |
|---|---|---|
| field | string | |
| limit | integer | |
| query* | string | Words to search for, e.g. 'allulose', 'pea protein', 'steviol glycosides'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"field": {
"enum": [
"any",
"substance",
"intended_use",
"notifier"
],
"type": "string",
"default": "any"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1
},
"query": {
"type": "string",
"description": "Words to search for, e.g. 'allulose', 'pea protein', 'steviol glycosides'."
}
},
"additionalProperties": false
}Search the SKS nutrition ingredient library (largely USDA-based) for an ingredient's nutrients per 100 g, label declaration name and allergens. Each result says where its data comes from and which nutrients are missing.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Ingredient, e.g. 'wheat flour', 'cane sugar', 'whole milk powder'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 15,
"minimum": 1
},
"query": {
"type": "string",
"description": "Ingredient, e.g. 'wheat flour', 'cane sugar', 'whole milk powder'."
}
},
"additionalProperties": false
}Calculate how much of a sweetener matches the sweetness of a given amount of sugar (sucrose), the calories saved, and the bulk (grams of solids) lost that must be replaced with fiber, polyol or another bulking agent. Also returns the sweetener's relative sweetness, kcal/g, glycemic index, heat/acid stability and regulatory notes from the SKS Sweetener Atlas.
| Argument | Type | Description |
|---|---|---|
| sweetener* | string | Sweetener name, e.g. 'sucralose', 'stevia', 'allulose', 'erythritol', 'monk fruit'. |
| sugar_grams* | number | Grams of sugar to replace. |
{
"type": "object",
"required": [
"sweetener",
"sugar_grams"
],
"properties": {
"sweetener": {
"type": "string",
"description": "Sweetener name, e.g. 'sucralose', 'stevia', 'allulose', 'erythritol', 'monk fruit'."
},
"sugar_grams": {
"type": "number",
"maximum": 100000,
"description": "Grams of sugar to replace.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 5, 2026.