Skip to main content
Glama
smeet666

mcp-bbc-goodfood

Read a recipe

get_recipe
Read-onlyIdempotent

Fetch a full BBC Good Food recipe by ID: ingredients, steps, times, rating, and nutrition. Scale servings or choose metric/US units.

Instructions

Read one recipe on BBC Good Food: its ingredients, its steps, its times, its rating and its nutrition. Pass the 'id' a search_recipes row carries, which is the page's own path. A recipe behind the site's subscription comes back with everything except its ingredients and steps, and says so: its page on the site is where a subscriber reads it. The site writes many of its recipes twice, once for its own readers and once restated for readers in the United States, and 'unit_system' chooses which of the two to read.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe page's own path, as a search_recipes row carries it.
servingsNoPut the ingredients to this many people. Quantities are then recomputed by this server, not published by the site, and each line says so under 'scaling'.
unit_systemNoWhich of the site's own two renditions to read: 'metric' as it writes for its own readers, 'us' as it restates for readers in the United States. Both are the site's words. A recipe it restated nowhere comes back as it published it, said in 'unit_system' and in the notes.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYes
urlYesThe page. Show this when citing the recipe.
dietsYes
notesYes
stepsYesEmpty when the recipe sits behind the site's subscription.
titleYes
yieldYesWhat the ingredients were put to, and what they were put from.
authorYes
ratingYes1 to 5. Null when nobody has rated it.
sourceYes
premiumYesTrue when the recipe sits behind the site's subscription.
nutritionYes
difficultyYes
yield_textYesThe site's own wording, such as 'Serves 4 - 6'.
descriptionYes
ingredientsYesEmpty when the recipe sits behind the site's subscription.
unit_systemYesWhich of the site's two renditions this answer carries.
yield_countYesThe first whole number of that wording.
cook_minutesYes
prep_minutesYes
rating_countYes
nutrition_perYesThe site's own wording for the serving.
total_minutesYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changedv1.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 / 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": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / difficulty / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / ingredients / items / properties / heading / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / ingredients / items / properties / heading / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / ingredients / items / properties / ingredients / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Null when the site states no quantity."
      -      },
      -      "item": {
      -        "description": "What goes in, without its quantity.",
      -        "type": "string"
      -      },
      -      "note": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "What to do to it beforehand, such as 'thinly sliced'."
      -      },
      -      "term": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "The site's own normalised name for it."
      -      },
      -      "text": {
      -        "description": "The line as the site composes it.",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "text",
      -      "amount",
      -      "unit",
      -      "item",
      -      "note",
      -      "term"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "amount": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "amount_max": {
      -        "anyOf": [
      -          {
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "original": {
      -        "description": "The line as the site composes it.",
      -        "type": "string"
      -      },
      -      "scaling": {
      -        "description": "'scaled': the arithmetic landed exactly. 'rounded': the figure moved to stay usable in a kitchen. 'unscaled': the line carried no quantity.",
      -        "enum": [
      -          "scaled",
      -          "rounded",
      -          "unscaled"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "The line as it now reads.",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "text",
      -      "original",
      -      "scaling",
      -      "amount",
      -      "amount_max",
      -      "unit"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "description": "Null when the site states no quantity.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "item": {
      +        "description": "What goes in, without its quantity.",
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "What to do to it beforehand, such as 'thinly sliced'.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "term": {
      +        "description": "The site's own normalised name for it.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "text": {
      +        "description": "The line as the site composes it.",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "text",
      +      "amount",
      +      "unit",
      +      "item",
      +      "note",
      +      "term"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "amount": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "amount_max": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "original": {
      +        "description": "The line as the site composes it.",
      +        "type": "string"
      +      },
      +      "scaling": {
      +        "description": "'scaled': the arithmetic landed exactly. 'rounded': the figure moved to stay usable in a kitchen. 'unscaled': the line carried no quantity.",
      +        "enum": [
      +          "scaled",
      +          "rounded",
      +          "unscaled"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "The line as it now reads.",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "text",
      +      "original",
      +      "scaling",
      +      "amount",
      +      "amount_max",
      +      "unit"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties / nutrition / items / properties / value / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / nutrition / items / properties / value / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / nutrition_per / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / nutrition_per / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / rating / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / rating / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / yield / properties / factor / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / factor / 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 / unit / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield / properties / unit / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / yield_text / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / yield_text / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Added

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the readOnly/idempotent annotations, the description reveals that subscription recipes omit ingredients and steps but explicitly say so, and that many recipes exist in two regional renditions selected by unit_system. This is meaningful behavioral context that annotations alone don't provide.

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

Conciseness5/5

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

Three sentences, all informative, with the core purpose front-loaded. No redundant filler; each clause earns its place, including the paywall caveat and regional variant explanation.

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?

For a single-recipe read operation with a full output schema and strong annotations, the description covers the key edge cases (paywall, regional variants) and the id provenance. Nothing essential for calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all three parameters in detail (100% coverage), including id's source and unit_system's meaning. The description adds no new parameter-level detail beyond restating id's origin and unit_system's role, so a baseline 3 is appropriate.

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 ('Read') and resource ('one recipe on BBC Good Food') and enumerates the data fields returned (ingredients, steps, times, rating, nutrition). It clearly differentiates from siblings by focusing on a single recipe rather than searching, filtering, or scaling.

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?

Explicitly tells the agent to pass the 'id' that a search_recipes row carries, anchoring this tool to the search workflow. It also explains the subscription edge case and the unit_system choice, giving context for when these options matter, though it doesn't list explicit exclusions vs siblings.

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