Skip to main content
Glama

Loafy: Sourdough Bread Baking

Bread dough calculator

calculate_bread_dough
Read-onlyIdempotent

Calculate a sourdough bread recipe in grams from loaf count, loaf size and hydration, with add-ins such as walnuts, raisins or seeds when the baker wants them. Returns flour, water, starter, salt and the add-ins, plus a link to the same recipe on loafy.ai where the baker can adjust it, bake it with "Bake this" and run the timers. Pizza dough is calculate_pizza_dough, and when to start a bake is plan_sourdough_bake. A value outside its range is corrected, and notes name it.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "calculate_bread_dough"
  }
}

Input Schema

NameRequiredDescriptionDefault
floursNoThe flours, comma-separated, each as the baker named it with its share of all the flour in percent, such as "Caputo Pizzeria 70, whole rye 30": the brand and name on the bag, a token from find_flours, or the grain with the word on its bag. The first takes what the others leave. With flours, the whole grain follows from them and whole_grain_percent is not needed.
loavesNoHow many loaves to bake.
add_insNoAdd-ins for the dough, comma-separated, each as its name and its share of the flour in percent, such as "walnuts 15, raisins 10"; grams with "g" ("walnuts 80 g") are for the whole batch, and a name without a number takes 10 %. Names from the list: walnuts, hazelnuts, sunflower_seeds, pumpkin_seeds, sesame, flaxseeds, hemp_seeds, poppy_seeds, raisins, cranberries, olives, cheese, sun_dried_tomatoes, chocolate; anything else in the baker's words.
loaf_size_gNoFlour per loaf in grams, not the dough weight: 500 g of flour makes one standard loaf of about 860 g of dough. For a loaf of a given dough weight, the flour is about 58 % of it at 60 % hydration.
hydration_percentNoWater as a percentage of flour. The book recommends around 60 % for most flours; higher is more open but stickier.
whole_grain_percentNoShare of the flour that is whole grain, the rest is bread flour.

Output Schema

NameRequiredDescriptionDefault
urlNoThe same answer, recipe or entry on loafy.ai.
noteNoA remark on the whole result, such as why nothing was found.
toolNoThe tool that answered.
inputNoThe arguments as the tool used them, after any correction.
notesNoWhat was corrected or left out, such as a value outside its range.
floursNoThe baker's own flours, when they were given.
add_insNoWhat goes into the dough besides flour, water, starter and salt, such as walnuts or seeds.
ingredientsNo
total_dough_gNoAll the dough, the add-ins included, in grams.
dough_per_loaf_gNoThe dough of one loaf, in grams.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / add_ins
      Added value: +{
      +  "description": "Add-ins for the dough, comma-separated, each as its name and its share of the flour in percent, such as \"walnuts 15, raisins 10\"; grams with \"g\" (\"walnuts 80 g\") are for the whole batch, and a name without a number takes 10 %. Names from the list: walnuts, hazelnuts, sunflower_seeds, pumpkin_seeds, sesame, flaxseeds, hemp_seeds, poppy_seeds, raisins, cranberries, olives, cheese, sun_dried_tomatoes, chocolate; anything else in the baker's words.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / add_ins
      Added value: +{
      +  "description": "What goes into the dough besides flour, water, starter and salt, such as walnuts or seeds.",
      +  "items": {
      +    "properties": {
      +      "grams": {
      +        "description": "Its weight for the batch, in grams.",
      +        "type": "number"
      +      },
      +      "label": {
      +        "description": "The baker's own add-in in their words.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "The add-in: one of Loafy's names, or \"other\" for the baker's own.",
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "Why its share is not the one asked for, when it is not.",
      +        "type": "string"
      +      },
      +      "percent": {
      +        "description": "Its share of the flour, in percent.",
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / total_dough_g / description
      Previous value: -"All the dough, in grams."New value: +"All the dough, the add-ins included, in grams."
  2. Changed2 schema fields changed
    • addedInput schema / properties / flours
      Added value: +{
      +  "description": "The flours, comma-separated, each as the baker named it with its share of all the flour in percent, such as \"Caputo Pizzeria 70, whole rye 30\": the brand and name on the bag, a token from find_flours, or the grain with the word on its bag. The first takes what the others leave. With flours, the whole grain follows from them and whole_grain_percent is not needed.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / flours
      Added value: +{
      +  "description": "The baker's own flours, when they were given.",
      +  "items": {
      +    "properties": {
      +      "grams": {
      +        "description": "Its flour, in grams.",
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "The flour, as a bake's page names it.",
      +        "type": "string"
      +      },
      +      "share_percent": {
      +        "description": "Its share of all the flour.",
      +        "type": "number"
      +      },
      +      "token": {
      +        "description": "The flour from Loafy's list, as log_bake takes it.",
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / loaf_size_g / minimum
      Previous value: -100New value: +50
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "A sourdough bread recipe in grams.",
      +  "properties": {
      +    "dough_per_loaf_g": {
      +      "description": "The dough of one loaf, in grams.",
      +      "type": "number"
      +    },
      +    "ingredients": {
      +      "properties": {
      +        "bread_flour_g": {
      +          "description": "Bread flour, in grams.",
      +          "type": "number"
      +        },
      +        "salt_g": {
      +          "description": "Salt, in grams.",
      +          "type": "number"
      +        },
      +        "starter_g": {
      +          "description": "Starter, in grams.",
      +          "type": "number"
      +        },
      +        "total_flour_g": {
      +          "description": "All flour, in grams.",
      +          "type": "number"
      +        },
      +        "water_g": {
      +          "description": "Water, in grams.",
      +          "type": "number"
      +        },
      +        "whole_grain_flour_g": {
      +          "description": "Whole grain flour, in grams.",
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "input": {
      +      "description": "The arguments as the tool used them, after any correction.",
      +      "properties": {},
      +      "type": "object"
      +    },
      +    "note": {
      +      "description": "A remark on the whole result, such as why nothing was found.",
      +      "type": "string"
      +    },
      +    "notes": {
      +      "description": "What was corrected or left out, such as a value outside its range.",
      +      "items": {
      +        "description": "A correction or remark.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "tool": {
      +      "description": "The tool that answered.",
      +      "type": "string"
      +    },
      +    "total_dough_g": {
      +      "description": "All the dough, in grams.",
      +      "type": "number"
      +    },
      +    "url": {
      +      "description": "The same answer, recipe or entry on loafy.ai.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  5. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare a safe, idempotent, read-only, closed-world calculation, so the bar is lower. The description still adds real behavioural facts beyond them: out-of-range values are silently corrected and the correction is named in the notes, and the result carries a loafy.ai link that supports 'Bake this' and timers, hinting at downstream actions.

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?

Front-loaded with the core calculation, then returns, then sibling routing, then the range-correction caveat — a sensible order with no filler sentences. It is dense but every clause carries information; only the add-in examples ('walnuts, raisins or seeds') are slightly redundant with the schema.

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, a fully documented 6-parameter input schema, and explicit safety annotations, the remaining burden is purpose, routing and behavioural quirks — all three are covered. An agent has everything needed to choose this tool and call it correctly with zero required parameters.

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?

Schema description coverage is 100% and the property descriptions are unusually rich (flour naming, add-in gram vs percent syntax, flour-vs-dough-weight conversion), so the schema does the heavy lifting. The description only echoes 'loaf count, loaf size and hydration' and the optionality of add-ins, adding essentially no syntax or edge-case meaning beyond the schema — baseline 3.

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 ('Calculate a sourdough bread recipe in grams') plus the inputs that drive it (loaf count, loaf size, hydration) and the add-ins capability. It explicitly names the two nearest siblings it is not — calculate_pizza_dough and plan_sourdough_bake — so an agent can disambiguate without opening any schema.

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?

Routing is explicit for the two most confusable neighbours: pizza dough goes to calculate_pizza_dough and scheduling goes to plan_sourdough_bake. What is missing is a statement of prerequisites or when this tool is the wrong choice for bread (e.g. scaling an existing logged bake, which list_my_bakes/update_bake would cover).

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources