Skip to main content
Glama
smeet666

mcp-recipes

Read one recipe, optionally rescaled

get_recipe
Read-onlyIdempotent

Read one full recipe by its search result ID, with ingredients, steps, times, rating and nutrition, and rescale quantities to a chosen serving count.

Instructions

Read one recipe in full: its ingredients, its steps, what it yields, and whatever times, rating and nutrition its source publishes. 'id' must come from search_recipes. It names the source, so this reads the right one without guessing; an identifier no source would have minted is refused, because sending it anywhere would answer about the wrong dish. Pass 'servings' to rescale. Quantities land where a kitchen can follow them: an egg stays whole, anything that pours or cuts can halve, a small measurement moves to a smaller unit before it is rounded, and anything unmultipliable comes back flagged. A page that states no number of servings comes back as published and says so, because dividing by a yield nobody wrote would answer for a number of people the page never claimed. Read 'kind' first. Some sources publish articles gathering other recipes at the same kind of address as a recipe, and such an answer carries 'collection' with the recipes it points at and no 'recipe' at all: there is nothing to cook from that page, and the recipes it lists are read with get_recipe. A part this answer holds nothing for says which of two things happened: the page showed no sign of it, or this server failed to read what the page carries. An empty ingredient list is never evidence that an ingredient is absent from the dish. 'sections' decides what comes back, and 'sections_omitted' names what was left out: a field belonging to an omitted section is empty because nobody asked for it, never because the page states nothing. A field a source does not publish is null, never zero. Credit the source and link the url when you repeat any of it.

Input Schema

NameRequiredDescriptionDefault
idYesFrom search_recipes, such as 'marmiton:44078', 'pequerecetas:paella-de-marisco' or 'cookbook:Cookbook:Carbonara'. Two sources address a recipe by a bare number, so spell an id with its source.
sectionsNoWhich parts to return. A full recipe is a lot of text, so this defaults to two.
servingsNoRescale to this many. Left out, the quantities come back as published.
max_stepsNoSteps to return. The answer says how many more there are.
max_gatheredNoRecipes and headings to return from an address that gathers recipes. The answer says how many the article holds.
max_step_charsNoCharacters kept per step. Raise it only if a step was cut mid-sentence.

Output Schema

NameRequiredDescriptionDefault
kindYesWhat the address held. 'recipe' comes with 'recipe' and no 'collection'; 'collection' comes with 'collection' and no 'recipe', and is an article gathering other recipes, with no ingredients and no method of its own.
notesYes
recipeNoPresent when 'kind' is 'recipe'.
collectionNoPresent when 'kind' is 'collection'.
id_read_asYesHow a raw identifier was routed, when it was not spelled with its source.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed41 schema fields changedv4.1.0
    • changedInput schema / properties / id / description
      Previous value: -"From search_recipes, such as 'marmiton:44078', 'goodfood:recipes/carbonara' or 'cookbook:Cookbook:Carbonara'. Two sources address a recipe by a bare number, so spell an id with its source."New value: +"From search_recipes, such as 'marmiton:44078', 'pequerecetas:paella-de-marisco' or 'cookbook:Cookbook:Carbonara'. Two sources address a recipe by a bare number, so spell an id with its source."
    • addedInput schema / properties / max_gathered
      Added value: +{
      +  "default": 30,
      +  "description": "Recipes and headings to return from an address that gathers recipes. The answer says how many the article holds.",
      +  "maximum": 500,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / collection
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Present when 'kind' is 'collection'.",
      +  "properties": {
      +    "attribution": {
      +      "description": "Show this, with the url, when repeating anything from here.",
      +      "type": "string"
      +    },
      +    "gathered_count": {
      +      "description": "Recipes the article points at, whether or not they are all listed here.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "headings": {
      +      "description": "The headings the article is built from, in the order it prints them, up to 'max_gathered'.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "id": {
      +      "type": "string"
      +    },
      +    "image_url": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "recipes": {
      +      "description": "The recipes it points at, each readable with get_recipe, up to 'max_gathered'. 'gathered_count' says how many the article holds.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "excerpt": {
      +            "description": "The gloss or matching passage the source offered, when it offered one.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "description": "Pass this to get_recipe. It names its source, so nothing has to be guessed.",
      +            "type": "string"
      +          },
      +          "image_url": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "source": {
      +            "description": "Which source published this row.",
      +            "type": "string"
      +          },
      +          "source_name": {
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "The recipe's own page. Show this when citing it.",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "source",
      +          "source_name",
      +          "title",
      +          "url",
      +          "image_url",
      +          "excerpt"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "source_name": {
      +      "type": "string"
      +    },
      +    "title": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "source",
      +    "source_name",
      +    "title",
      +    "url",
      +    "image_url",
      +    "headings",
      +    "recipes",
      +    "gathered_count",
      +    "attribution"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / id_read_as / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / id_read_as / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / kind
      Added value: +{
      +  "description": "What the address held. 'recipe' comes with 'recipe' and no 'collection'; 'collection' comes with 'collection' and no 'recipe', and is an article gathering other recipes, with no ingredients and no method of its own.",
      +  "enum": [
      +    "recipe",
      +    "collection"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / recipe / description
      Added value: +"Present when 'kind' is 'recipe'."
    • removedOutput schema / properties / recipe / properties / author / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / author / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / category / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / category / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / image_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / image_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / ingredients / items / properties / amount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / ingredients / items / properties / amount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / ingredients / items / properties / amount_max / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / ingredients / items / properties / amount_max / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / recipe / 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 / recipe / properties / ingredients / items / properties / language / enum
      Previous value: -[
      -  "fr",
      -  "en"
      -]New value: +[
      +  "fr",
      +  "en",
      +  "es"
      +]
    • changedOutput schema / properties / recipe / 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 / recipe / properties / ingredients / items / properties / unit / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / ingredients / items / properties / unit / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / recipe / 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 / recipe / properties / language / enum
      Previous value: -[
      -  "fr",
      -  "en"
      -]New value: +[
      +  "fr",
      +  "en",
      +  "es"
      +]
    • changedOutput schema / properties / recipe / properties / rating / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "count": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "How many readers rated it, when the source says."
      -      },
      -      "max": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "The top of the scale. A rating read without its scale means nothing."
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "value",
      -      "count",
      -      "max"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "count": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "How many readers rated it, when the source says."
      +      },
      +      "max": {
      +        "description": "The top of the scale. A rating read without its scale means nothing.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "value",
      +      "count",
      +      "max"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / recipe / properties / scaling_summary / description
      Added value: +"The four counts add up to the number of ingredient lines."
    • addedOutput schema / properties / recipe / properties / scaling_summary / properties / equipment_count
      Added value: +{
      +  "description": "Lines naming a tool, which some sites write among the ingredients.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / recipe / properties / scaling_summary / required
      Previous value: -[
      -  "scaled_count",
      -  "rounded_count",
      -  "unscaled_count"
      -]New value: +[
      +  "scaled_count",
      +  "rounded_count",
      +  "unscaled_count",
      +  "equipment_count"
      +]
    • removedOutput schema / properties / recipe / properties / steps_as_one_block / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / steps_as_one_block / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / yield / properties / factor / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / yield / properties / factor / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / yield / properties / original_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / yield / properties / original_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / yield / properties / original_max / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / yield / properties / original_max / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / yield / properties / original_text / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / yield / properties / original_text / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / recipe / properties / yield / properties / unit / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / recipe / properties / yield / properties / unit / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "recipe",
      -  "id_read_as",
      -  "notes"
      -]New value: +[
      +  "kind",
      +  "id_read_as",
      +  "notes"
      +]
  2. Changed5 schema fields changedv3.0.1
    • changedInput schema / properties / id / description
      Previous value: -"From search_recipes, such as 'marmiton:44078' or 'cookbook:Cookbook:Carbonara'."New value: +"From search_recipes, such as 'marmiton:44078', 'goodfood:recipes/carbonara' or 'cookbook:Cookbook:Carbonara'. Two sources address a recipe by a bare number, so spell an id with its source."
    • addedOutput schema / properties / recipe / properties / rest_minutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Time the recipe stands, from a source that publishes it apart. It is in no other time here, and belongs to no other source's cooking time. Null where the source publishes none, which is not a dish that needs no rest."
      +}
    • addedOutput schema / properties / recipe / properties / steps_as_one_block
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Whether the source publishes the method as one block of prose rather than as steps of its own. Null where the source says neither, so a single entry is not read as step one of several."
      +}
    • addedOutput schema / properties / recipe / properties / withheld
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "parts": {
      +          "description": "Which parts, named as 'ingredients' or 'method'.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "why": {
      +          "description": "What the source says about keeping them back.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "parts",
      +        "why"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "A part the source published nothing of because it keeps it for its subscribers. Null from a source that withholds nothing, which is a different statement from an empty list."
      +}
    • changedOutput schema / properties / recipe / required
      Previous value: -[
      -  "id",
      -  "source",
      -  "source_name",
      -  "language",
      -  "title",
      -  "url",
      -  "image_url",
      -  "yield",
      -  "ingredients",
      -  "steps",
      -  "prep_minutes",
      -  "cook_minutes",
      -  "total_minutes",
      -  "category",
      -  "author",
      -  "rating",
      -  "nutrition",
      -  "equipment",
      -  "tips",
      -  "license",
      -  "attribution",
      -  "sections_returned",
      -  "sections_omitted",
      -  "scaling_summary"
      -]New value: +[
      +  "id",
      +  "source",
      +  "source_name",
      +  "language",
      +  "title",
      +  "url",
      +  "image_url",
      +  "yield",
      +  "ingredients",
      +  "steps",
      +  "prep_minutes",
      +  "cook_minutes",
      +  "total_minutes",
      +  "rest_minutes",
      +  "steps_as_one_block",
      +  "withheld",
      +  "category",
      +  "author",
      +  "rating",
      +  "nutrition",
      +  "equipment",
      +  "tips",
      +  "license",
      +  "attribution",
      +  "sections_returned",
      +  "sections_omitted",
      +  "scaling_summary"
      +]
  3. First observedv1.0.0

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, the description discloses substantial behavior: invalid ids are refused, rescaling preserves whole eggs and flags unmultipliable quantities, missing serving counts are returned as published, collection pages return no recipe, empty sections distinguish 'not present' from 'server failed to read', and null never means zero. This is unusually rich behavioral context for a read-only tool.

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 front-loaded with the purpose and then moves through id, rescaling, kind, sections, and null semantics in a logical order. It is long and occasionally circuitous, but nearly every sentence carries distinct operational information rather than repeating schema or annotations.

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?

Given six parameters, full schema coverage, an output schema, and read-only annotations, the description covers the remaining behavioral and semantic gaps an agent needs: source-qualified ids, rescaling edge cases, collection pages, omitted sections, null versus zero, and attribution expectations.

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, but the description adds real meaning for key parameters: id provenance and source naming, servings rescaling rules, and sections/sections_omitted semantics. It does not add prose about max_steps, max_gathered, or max_step_chars, leaving those to the schema.

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 opens with a specific verb and resource: 'Read one recipe in full', then enumerates what is returned (ingredients, steps, yield, times, rating, nutrition). It clearly distinguishes this from search_recipes by requiring an id from that tool, and it explains the collection-page case where get_recipe is still the reader.

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 gives clear usage context: the id must come from search_recipes, 'kind' should be read first, collection results point to recipes that are read with get_recipe, and 'servings' triggers rescaling. It does not explicitly compare against sibling tools like scale_ingredients or compare_recipes, so it stops short of full when/when-not/alternatives guidance.

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