Skip to main content
Glama
smeet666

mcp-recipes

Scale an ingredient list, in any language it reads

scale_ingredients
Read-onlyIdempotent

Scales recipe ingredient lists by a factor or from one serving count to another, reading French, English, and Spanish lines and rounding quantities to kitchen-usable amounts.

Instructions

Multiply a list of ingredient lines, in French, in English, in Spanish, or in a list holding more than one of them. Give either 'factor', or 'from_servings' and 'to_servings' and the factor is worked out from them. Quantities land where a kitchen can follow them: an egg stays whole because half of one is not something a cook takes out of the shell, while anything that pours, weighs or cuts can halve, a spoonful shrinks into the smaller spoon before it is rounded, and a pinch keeps whatever size a hand gives it while its count is multiplied. Every line comes back with 'scaling': 'scaled' when the arithmetic landed on the exact product, 'rounded' when something had to move for the line to stay usable, 'unscaled' when the line carries nothing to multiply. A rounded line says what it was rounded from and in which direction. No quantity is converted between measuring systems: grams stay grams and cups stay cups, because a conversion changes what the recipe said.

Input Schema

NameRequiredDescriptionDefault
factorNoWhat to multiply by. Give exactly one of: 'factor', or both 'from_servings' and 'to_servings'.
languageNo'auto' reads each line on its own, which is what a list holding more than one language needs. Name a language to read every line that way.auto
ingredientsYesThe lines as written, one ingredient each, such as '200 g de farine' or '3 eggs'.
to_servingsNoWhat it should serve. Give it with 'from_servings', and without 'factor'.
from_servingsNoWhat the list serves now. Give it with 'to_servings', and without 'factor'.

Output Schema

NameRequiredDescriptionDefault
notesYes
factorYesWhat every quantity was multiplied by.
languageYesHow the lines were read.
ingredientsYes
scaled_countYesLines whose arithmetic came out exact.
rounded_countYesLines whose value moved to stay usable.
unscaled_countYesLines carrying nothing that can be multiplied, tools excepted.
equipment_countYesLines naming a tool, which are never multiplied: a recipe made for more people uses the same pan.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changedv4.1.0
    • changedInput schema / properties / ingredients / description
      Previous value: -"The lines as written, one ingredient each, such as '200 g de farine' or '3 eggs'. One line, not a whole recipe."New value: +"The lines as written, one ingredient each, such as '200 g de farine' or '3 eggs'."
    • changedInput schema / properties / language / description
      Previous value: -"'auto' reads each line on its own, which is what a list holding both languages needs. Name a language to read every line that way."New value: +"'auto' reads each line on its own, which is what a list holding more than one language needs. Name a language to read every line that way."
    • changedInput schema / properties / language / enum
      Previous value: -[
      -  "auto",
      -  "fr",
      -  "en"
      -]New value: +[
      +  "auto",
      +  "fr",
      +  "en",
      +  "es"
      +]
    • addedOutput schema / properties / equipment_count
      Added value: +{
      +  "description": "Lines naming a tool, which are never multiplied: a recipe made for more people uses the same pan.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • removedOutput schema / properties / ingredients / items / properties / amount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / amount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / ingredients / items / properties / amount_max / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / amount_max / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / ingredients / items / properties / is_equipment
      Added value: +{
      +  "description": "True for a line naming a tool, which some sites write among the ingredients. Such a line is never multiplied: a recipe made for more people uses the same pan.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / ingredients / items / properties / language / enum
      Previous value: -[
      -  "fr",
      -  "en"
      -]New value: +[
      +  "fr",
      +  "en",
      +  "es"
      +]
    • changedOutput schema / properties / ingredients / items / properties / scaling / description
      Previous value: -"'scaled' means the arithmetic landed on the exact product, 'rounded' that something had to move for the line to stay usable or that the line carries a second quantity whose match is the page's claim, 'unscaled' that there is nothing to multiply."New value: +"'scaled' means the arithmetic landed on the exact product, 'rounded' that something had to move for the line to stay usable or that the line carries a second quantity whose match is the page's claim, 'unscaled' that the line was left as given. Read 'is_equipment' beside it: a tool line is 'unscaled' whether or not it carries a figure."
    • removedOutput schema / properties / ingredients / items / properties / unit / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / unit / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / ingredients / items / required
      Previous value: -[
      -  "text",
      -  "original",
      -  "scaling",
      -  "amount",
      -  "amount_max",
      -  "unit",
      -  "language"
      -]New value: +[
      +  "text",
      +  "original",
      +  "scaling",
      +  "amount",
      +  "amount_max",
      +  "unit",
      +  "language",
      +  "is_equipment"
      +]
    • changedOutput schema / properties / unscaled_count / description
      Previous value: -"Lines carrying nothing that can be multiplied."New value: +"Lines carrying nothing that can be multiplied, tools excepted."
    • changedOutput schema / required
      Previous value: -[
      -  "factor",
      -  "language",
      -  "ingredients",
      -  "scaled_count",
      -  "rounded_count",
      -  "unscaled_count",
      -  "notes"
      -]New value: +[
      +  "factor",
      +  "language",
      +  "ingredients",
      +  "scaled_count",
      +  "rounded_count",
      +  "unscaled_count",
      +  "equipment_count",
      +  "notes"
      +]
  2. First observedv1.0.0

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them: it explains rounding policy per ingredient class (whole eggs, pourables, spoonfuls, pinches), the three 'scaling' statuses with direction of rounding, and the deliberate no-unit-conversion rule. That is exactly the behavioral context an agent needs to predict output.

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?

Purpose and input modes are front-loaded, then behavior, then the unit-conversion caveat. The kitchen imagery (egg, pinch, spoon) is longer than strictly necessary but each clause carries a distinct rounding rule, so little is pure waste.

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?

With an output schema present, the description need not explain return shapes, yet it still documents the 'scaling' status vocabulary and rounding provenance. For a 5-parameter, language-aware transformation tool, nothing an agent needs to call it correctly is missing.

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 coverage is 100%, so the baseline is 3; the description still adds value by stating the mutual exclusivity of 'factor' versus the servings pair and clarifying that the factor is derived in the second case. It largely restates the schema's own wording, so it does not fully clear the bar for a 5.

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 ('Multiply a list of ingredient lines') plus the language scope, which no sibling (search_recipes, get_recipe, compare_recipes) covers. An agent can immediately tell this is the scaling tool rather than a retrieval 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?

Gives clear operating context: supply either 'factor' or the 'from_servings'/'to_servings' pair, and name a language or let 'auto' read each line. It never names an alternative tool or an exclusion case, but the operation is unambiguous enough that sibling routing is not really at stake.

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