Skip to main content
Glama
smeet666

mcp-wikibooks-cookbook

Read a recipe

get_recipe
Read-onlyIdempotent

Retrieve a Cookbook recipe's full details—ingredients, steps, yield, time, difficulty, and nutrition—and rescale quantities to a target number of servings.

Instructions

Read one Wikibooks Cookbook page: ingredients, equipment, steps, yield, time, difficulty, category, and the nutrition panel when the page carries one. 'id' is the page key from search_recipes or list_recipes, such as 'Cookbook:Spaghetti_alla_Carbonara'. A plain dish name is accepted and the Cookbook namespace is added. Pass 'servings' to rescale: a countable thing lands on the smallest share a cook can take out of one of it, which is a whole one where half of one cannot be measured out at all, such as an egg or a whole clove, a half where half of one pours, weighs or splits, such as a can or a packet, and a quarter where a knife or the size of the thing goes further, such as an onion, a slice of bread or a jar; a measurement is moved to a smaller unit before rounding so nothing disappears; and anything that cannot be multiplied is flagged instead. Read 'scaling' on each ingredient rather than doing the arithmetic yourself. A page that groups its ingredients by what they are for, such as a cake and its glaze, states that group on every line; a page that lists them flat states null. Two lines can read alike and belong to different parts of the dish. A page offering several versions of the dish states which one each line came from in 'variant'. Those lists replace one another: one of them is used, even where the procedure says to mix all the ingredients. A measurement the page writes as a conversion template is read as the value and the unit the page wrote, and the counterpart the template computes is left out: nothing here is converted between measuring systems. A line asking for as much as is needed and giving an indication in brackets, such as 'water as required (about 1 ½ cups)', states a quantity: the indication is scaled with the recipe and the wording in front of it is left as the page wrote it. A line offering an alternative in brackets, such as '4 eggs (or 8 egg yolks)', has both branches scaled, since a cook takes one of them. The Cookbook keeps recipes and the book's own chapter indexes in one namespace, and both write 'Ingredients' over a bulleted list. A page carrying no recipe box, no recipe banner and no procedure comes back with empty lists and a note: its bullets are links to other pages rather than things to buy. A heading owns what is nested under it and stops at the next heading of its own level, so a page carrying two recipes returns the first of each part and names the rest in a note. A page that only redirects elsewhere is followed to the page it points at, and 'id' and 'redirected_from' say which page was read. Rescaling needs a yield to scale from. A page that states none comes back as published, and says so. A page yielding no quantities is answered with 'factor' 1 and a note: an empty ingredient list was multiplied by nothing. 'author' and 'rating' are always null: the Cookbook is written collectively and carries no reader score. A time the page does not state is null, never zero, and never inferred from the steps. A page stating phases rather than a total, such as a fermentation and a cooking, publishes them in 'time_phases' with 'total_minutes' null: the phases measure different things and are never added. Pages are published under a licence that requires attribution; 'license' and 'url' carry what to credit.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesPage key from a search, such as 'Cookbook:Spaghetti_alla_Carbonara'.
servingsNoRescale the ingredients to this many servings.
max_description_charsNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe page that was read, which differs from 'id' after a redirect.
urlYes
tipsYesNotes, tips and variations the page publishes.
notesYes
stepsYes
titleYes
yieldYes
authorYesAlways null: the Cookbook is written collectively.
energyYesEnergy per serving as the page states it.
ratingYesAlways null: the Cookbook carries no reader score.
sourceYes
licenseYes
categoryYes
equipmentYes
nutritionYes
time_textYesThe time in the page's own wording.
categoriesYesEvery category the page files itself under.
difficultyYes
revised_atYes
attributionYes
descriptionYes
ingredientsYes
time_phasesYesEach duration the page states, in the order it states them.
cook_minutesYesThe phase the page labels as cooking. Null when it labels none.
prep_minutesYesThe phase the page labels as preparation. Null when it labels none.
total_minutesYesThe whole dish, stated only where the page states a total: one duration, or a phase the page itself calls the total. Null where the page states phases and no total, since a fermentation, a marinade or a rest is not cooking time and adding them would answer with a figure nobody published. Read 'time_phases' instead.
difficulty_maxYesThe scale 'difficulty' sits on.
redirected_fromYesRedirect pages walked to reach this one. Empty when the page was reached directly.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed47 schema fields changedv2.1.0
    • removedOutput schema / properties / author / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / author / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / category / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / category / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / cook_minutes / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / cook_minutes / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / difficulty / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / difficulty / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / energy / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / energy / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • 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"
      +]
    • removedOutput schema / properties / ingredients / items / properties / group / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / group / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • 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"
      +]
    • removedOutput schema / properties / ingredients / items / properties / variant / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / variant / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / nutrition / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "calcium": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "calories": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "calories_from_fat": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "carbohydrates": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "cholesterol": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "fiber": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "iron": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "protein": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "saturated_fat": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "serving_size": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "servings": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "sodium": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "sugars": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "total_fat": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "vitamin_a": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "vitamin_c": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "serving_size",
      -      "servings",
      -      "calories",
      -      "calories_from_fat",
      -      "total_fat",
      -      "saturated_fat",
      -      "cholesterol",
      -      "sodium",
      -      "carbohydrates",
      -      "fiber",
      -      "sugars",
      -      "protein",
      -      "vitamin_a",
      -      "vitamin_c",
      -      "calcium",
      -      "iron"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "calcium": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "calories": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "calories_from_fat": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "carbohydrates": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "cholesterol": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "fiber": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "iron": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "protein": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "saturated_fat": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "serving_size": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "servings": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sodium": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "sugars": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "total_fat": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "vitamin_a": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "vitamin_c": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "serving_size",
      +      "servings",
      +      "calories",
      +      "calories_from_fat",
      +      "total_fat",
      +      "saturated_fat",
      +      "cholesterol",
      +      "sodium",
      +      "carbohydrates",
      +      "fiber",
      +      "sugars",
      +      "protein",
      +      "vitamin_a",
      +      "vitamin_c",
      +      "calcium",
      +      "iron"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / prep_minutes / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / prep_minutes / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / rating / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rating / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / revised_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / revised_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / time_phases / items / properties / label / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / time_phases / items / properties / label / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / time_phases / items / properties / minutes / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / time_phases / items / properties / minutes / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / time_phases / items / properties / minutes_max / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / time_phases / items / properties / minutes_max / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / time_text / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / time_text / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / total_minutes / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / total_minutes / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / yield / properties / original_count / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / original_count / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / yield / properties / original_text / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / original_text / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / yield / properties / requested / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / requested / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / yield / properties / unit / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / unit / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed11 schema fields changedv1.3.0
    • addedOutput schema / properties / cook_minutes / description
      Added value: +"The phase the page labels as cooking. Null when it labels none."
    • addedOutput schema / properties / id / description
      Added value: +"The page that was read, which differs from 'id' after a redirect."
    • addedOutput schema / properties / ingredients / items / properties / group
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The part of the dish this line is for, such as 'Glaze'. Null when the page names none. Every part is made, so a caller buys all of them."
      +}
    • changedOutput schema / properties / ingredients / items / properties / scaling / description
      Previous value: -"'scaled' means the arithmetic was exact. 'rounded' means a countable item was moved to a whole or half unit, or a measurement was demoted to a smaller unit to stay usable. 'unscaled' means the line carries nothing that can be multiplied and was left alone."New value: +"'scaled' means the arithmetic was exact. 'rounded' means a countable item was moved to a whole, a half or a quarter, whichever is the smallest share a cook takes out of one of it, or a measurement was demoted to a smaller unit to stay usable. 'unscaled' means the line carries nothing that can be multiplied and was left alone."
    • addedOutput schema / properties / ingredients / items / properties / variant
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The alternative list this line belongs to, such as 'Variation II'. Null when the line belongs to the recipe itself. Lines carrying different variants replace one another: exactly one of them is used, whatever the procedure says about mixing everything."
      +}
    • changedOutput schema / properties / ingredients / items / required
      Previous value: -[
      -  "text",
      -  "original",
      -  "scaling",
      -  "amount",
      -  "amount_max",
      -  "unit"
      -]New value: +[
      +  "text",
      +  "original",
      +  "scaling",
      +  "amount",
      +  "amount_max",
      +  "unit",
      +  "group",
      +  "variant"
      +]
    • addedOutput schema / properties / prep_minutes / description
      Added value: +"The phase the page labels as preparation. Null when it labels none."
    • addedOutput schema / properties / redirected_from
      Added value: +{
      +  "description": "Redirect pages walked to reach this one. Empty when the page was reached directly.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / time_phases
      Added value: +{
      +  "description": "Each duration the page states, in the order it states them.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "label": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The phase as the page names it, such as 'Fermentation'. Null when it names none."
      +      },
      +      "minutes": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The duration in minutes, or the lower bound of a range."
      +      },
      +      "minutes_max": {
      +        "anyOf": [
      +          {
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The upper bound where the page gives a range, null where it gives one figure."
      +      },
      +      "text": {
      +        "description": "The duration in the page's own wording.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "label",
      +      "text",
      +      "minutes",
      +      "minutes_max"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / total_minutes / description
      Added value: +"The whole dish, stated only where the page states a total: one duration, or a phase the page itself calls the total. Null where the page states phases and no total, since a fermentation, a marinade or a rest is not cooking time and adding them would answer with a figure nobody published. Read 'time_phases' instead."
    • changedOutput schema / required
      Previous value: -[
      -  "id",
      -  "title",
      -  "url",
      -  "yield",
      -  "ingredients",
      -  "equipment",
      -  "steps",
      -  "tips",
      -  "prep_minutes",
      -  "cook_minutes",
      -  "total_minutes",
      -  "time_text",
      -  "category",
      -  "categories",
      -  "difficulty",
      -  "difficulty_max",
      -  "energy",
      -  "author",
      -  "rating",
      -  "nutrition",
      -  "description",
      -  "attribution",
      -  "license",
      -  "revised_at",
      -  "source",
      -  "notes"
      -]New value: +[
      +  "id",
      +  "title",
      +  "url",
      +  "redirected_from",
      +  "yield",
      +  "ingredients",
      +  "equipment",
      +  "steps",
      +  "tips",
      +  "prep_minutes",
      +  "cook_minutes",
      +  "total_minutes",
      +  "time_text",
      +  "time_phases",
      +  "category",
      +  "categories",
      +  "difficulty",
      +  "difficulty_max",
      +  "energy",
      +  "author",
      +  "rating",
      +  "nutrition",
      +  "description",
      +  "attribution",
      +  "license",
      +  "revised_at",
      +  "source",
      +  "notes"
      +]
  3. Changed1 schema field changedv1.2.0
    • addedInput schema / additionalProperties
      Added value: +false
  4. First observedv1.0.0

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive status. The description goes far beyond this by disclosing precise rescaling rules (whole, half, quarter rounding), ingredient grouping and variant behavior, redirect following, null conventions for author/rating/time, license attribution, and edge cases for pages without recipe boxes. This is exemplary behavioral transparency with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a dense, single-paragraph wall of text with many clauses and edge cases. It is front-loaded with the core action and every sentence adds distinct behavioral detail, but the lack of bullets or sectioning makes it hard to scan. Given the tool's complexity, the length is largely justified, but the structure does not aid quick comprehension.

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 does not need to restate every return field. It comprehensively covers the tricky semantics: rescaling arithmetic, ingredient grouping, variants, redirects, nulls, time phases, licensing, and pages that are just link lists. The only unmentioned parameter is max_description_chars, but its schema constraints are sufficient for an agent to infer its role. Overall, the tool is fully contextualized.

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 description coverage is 67%, and the description adds substantial meaning for the two core parameters: id is given an example and namespace behavior, and servings receives an extremely detailed explanation of how scaling rounds quantities. However, max_description_chars is never mentioned in the description, leaving its purpose entirely to the schema field's default and bounds. The two primary parameters are richly enriched, but the third is a 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 opens with a specific verb and resource: 'Read one Wikibooks Cookbook page', and enumerates the exact fields returned (ingredients, equipment, steps, yield, time, difficulty, category, nutrition panel). It clearly distinguishes itself from search/list siblings by framing id as a key obtained from search_recipes or list_recipes, leaving no ambiguity about the tool's purpose.

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?

Clear context is given: id comes from search_recipes or list_recipes, and the tool reads a single recipe. The description also explains when rescaling is triggered via 'servings' and instructs the agent to rely on the returned 'scaling' rather than doing arithmetic. It does not explicitly name exclusions or alternatives like scale_ingredients, but the workflow is evident from the text and sibling names.

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