Loafy: Sourdough Bread Baking
Sourdough baking: dough calculators, a bake planner, The Sourdough Framework and your bake journal
我該用這個嗎
品質與安全性
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"loafy": {
"url": "https://loafy.ai/mcp"
}
}
}遠端端點
https://loafy.ai/mcpstreamable-http它能做什麼
工具清單
工具(19)
🟢calculate_bread_dough(loaves, loaf_size_g, hydration_percent, whole_grain_percent)
Calculate a sourdough bread recipe in grams from loaf count, loaf size and hydration. Returns flour, water, starter and salt, plus a link to the same recipe on loafy.ai where the baker can adjust it 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.
輸入結構描述
{
"type": "object",
"properties": {
"loaves": {
"type": "integer",
"description": "How many loaves to bake.",
"minimum": 1,
"maximum": 100,
"default": 1
},
"loaf_size_g": {
"type": "integer",
"description": "Flour 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.",
"minimum": 100,
"maximum": 2000,
"default": 500
},
"hydration_percent": {
"type": "integer",
"description": "Water as a percentage of flour. The book recommends around 60 % for most flours; higher is more open but stickier.",
"minimum": 55,
"maximum": 100,
"default": 60
},
"whole_grain_percent": {
"type": "integer",
"description": "Share of the flour that is whole grain, the rest is bread flour.",
"minimum": 0,
"maximum": 100,
"default": 20
}
},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"ingredients": {
"type": "object",
"properties": {
"bread_flour_g": {
"type": "number",
"description": "Bread flour, in grams."
},
"whole_grain_flour_g": {
"type": "number",
"description": "Whole grain flour, in grams."
},
"total_flour_g": {
"type": "number",
"description": "All flour, in grams."
},
"water_g": {
"type": "number",
"description": "Water, in grams."
},
"starter_g": {
"type": "number",
"description": "Starter, in grams."
},
"salt_g": {
"type": "number",
"description": "Salt, in grams."
}
}
},
"total_dough_g": {
"type": "number",
"description": "All the dough, in grams."
},
"dough_per_loaf_g": {
"type": "number",
"description": "The dough of one loaf, in grams."
}
},
"description": "A sourdough bread recipe in grams."
}🟢calculate_pizza_dough(pizzas, weight_per_pizza_g, hydration_percent, dough_type, oven)
Calculate pizza dough in grams from the number of pizzas, the ball weight and hydration, with either fresh yeast or sourdough starter. Returns flour, water, salt, leavening and toppings, plus a link to the same recipe on loafy.ai. A loaf of bread is calculate_bread_dough. A value outside its range is corrected, and notes name it.
輸入結構描述
{
"type": "object",
"properties": {
"pizzas": {
"type": "integer",
"description": "How many pizzas.",
"minimum": 1,
"maximum": 12,
"default": 4
},
"weight_per_pizza_g": {
"type": "integer",
"description": "Dough ball weight in grams. Left out, it follows the oven: 250 g home, 270 g pizza oven, 280 g wood-fired.",
"minimum": 50,
"maximum": 350
},
"hydration_percent": {
"type": "integer",
"description": "Water as a percentage of flour. 55-65 is easy to handle, above 70 is expert.",
"minimum": 55,
"maximum": 75,
"default": 60
},
"dough_type": {
"type": "string",
"description": "Leavened with fresh yeast or with sourdough starter.",
"enum": [
"yeast",
"sourdough"
],
"default": "yeast"
},
"oven": {
"type": "string",
"description": "home is a domestic oven, pizza an Ooni or Roccbox, wood a wood-fired oven.",
"enum": [
"home",
"pizza",
"wood"
],
"default": "home"
}
},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"ingredients": {
"type": "object",
"additionalProperties": {
"type": "number"
},
"description": "Flour, water, salt and the leavening (fresh yeast or starter), in grams."
},
"toppings": {
"type": "object",
"additionalProperties": {
"type": "number"
},
"description": "Toppings for all the pizzas: grams, and basil as leaves and pots."
},
"total_dough_g": {
"type": "number",
"description": "All the dough, in grams."
}
},
"description": "Pizza dough in grams."
}🟢plan_sourdough_bake(ready_at, kitchen_temperature_c, bulk_hours, cold_proof_hours)
Plan a sourdough bake backwards from when the bread should come out of the oven: when to feed the starter, mix, shape, proof in the fridge, preheat and bake, and how much starter suits the kitchen's temperature according to The Sourdough Framework. Returns the times and a link to the same plan on loafy.ai. The time is the baker's local date and time, such as 2026-10-24T10:00. The amounts of flour, water and starter are calculate_bread_dough.
輸入結構描述
{
"type": "object",
"properties": {
"ready_at": {
"type": "string",
"description": "When the bread should come out of the oven, as the baker's local date and time, e.g. \"2026-10-24T10:00\"."
},
"kitchen_temperature_c": {
"type": "integer",
"description": "Kitchen temperature in °C, which sets how much starter to use.",
"minimum": 15,
"maximum": 32,
"default": 22
},
"bulk_hours": {
"type": "integer",
"description": "Hours of bulk fermentation, if the baker knows their dough. Without it, the book's figure for the kitchen's temperature.",
"minimum": 4,
"maximum": 16
},
"cold_proof_hours": {
"type": "integer",
"description": "Hours the shaped loaf proofs in the fridge. The book says 8 to 12.",
"minimum": 8,
"maximum": 24,
"default": 12
}
},
"required": [
"ready_at"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"ready_at": {
"type": "string",
"description": "When the bread comes out of the oven."
},
"starter": {
"type": "object",
"properties": {
"percent_of_flour": {
"type": "string",
"description": "Starter as a share of the flour."
},
"bulk": {
"type": "string",
"description": "The bulk fermentation that goes with it."
},
"for_kitchen": {
"type": "string",
"description": "The kitchen temperature the figures are for."
},
"note": {
"type": "string",
"description": "How to read the figures."
},
"source": {
"type": "string",
"description": "Where in the book they come from."
}
}
},
"steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"step": {
"type": "string",
"description": "What to do."
},
"at": {
"type": "string",
"description": "When."
},
"from": {
"type": "string",
"description": "From when, for a window."
},
"until": {
"type": "string",
"description": "Until when, for a window."
},
"hours": {
"type": "number",
"description": "How long it takes."
},
"note": {
"type": "string",
"description": "What to look for."
}
}
},
"description": "The bake, step by step, in order."
}
},
"description": "A sourdough bake planned backwards from when the bread should be ready."
}🟢list_sourdough_journeys
List Loafy's guided sourdough journeys: making a starter, baking a loaf, scoring, and more. Each one is a timed, step-by-step walkthrough on loafy.ai. Returns each journey's slug, title, duration, difficulty, number of steps and link.
輸入結構描述
{
"type": "object",
"properties": {},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"journeys": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The journey's identifier."
},
"title": {
"type": "string",
"description": "Its title."
},
"description": {
"type": "string",
"description": "What it covers."
},
"duration": {
"type": "string",
"description": "How long it takes."
},
"difficulty": {
"type": "string",
"description": "How hard it is."
},
"steps": {
"type": "integer",
"description": "How many steps it has."
},
"url": {
"type": "string",
"description": "The journey on loafy.ai."
}
}
},
"description": "Every guided journey."
}
},
"description": "Loafy's guided journeys."
}🟢start_sourdough_journey(slug)
Start one of Loafy's guided journeys and get the link that opens it at the first step. The journey runs on loafy.ai, where each fold, proof and bake is timed for the baker.
輸入結構描述
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Journey identifier from list_sourdough_journeys, e.g. \"sourdough-bread\", or the journey's title."
}
},
"required": [
"slug"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"journey": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The journey's identifier."
},
"title": {
"type": "string",
"description": "Its title."
},
"description": {
"type": "string",
"description": "What it covers."
},
"duration": {
"type": "string",
"description": "How long it takes."
},
"difficulty": {
"type": "string",
"description": "How hard it is."
},
"steps": {
"type": "integer",
"description": "How many steps it has."
},
"url": {
"type": "string",
"description": "The journey on loafy.ai."
}
}
},
"first_step": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The step's identifier."
},
"title": {
"type": "string",
"description": "Its title."
},
"timer_minutes": {
"type": "integer",
"description": "Its timer, when the step has one."
}
}
}
},
"description": "A guided journey and its first step."
}🟢get_sourdough_journey_step(slug, step)
Look up one step of a guided journey by its id, its title or its position: its title, where it sits in the journey, its timer in minutes when the step has one, and the link that opens it. The instructions themselves are on the page, where the timer for that step runs.
輸入結構描述
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Journey identifier, e.g. \"sourdough-bread\", or the journey's title."
},
"step": {
"type": "string",
"description": "Step identifier (e.g. \"mix\"), its title, or position (\"5\" is the fifth step). Left out, the first step is returned."
}
},
"required": [
"slug"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"journey": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The journey's identifier."
},
"title": {
"type": "string",
"description": "Its title."
},
"description": {
"type": "string",
"description": "What it covers."
},
"duration": {
"type": "string",
"description": "How long it takes."
},
"difficulty": {
"type": "string",
"description": "How hard it is."
},
"steps": {
"type": "integer",
"description": "How many steps it has."
},
"url": {
"type": "string",
"description": "The journey on loafy.ai."
}
}
},
"step": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The step's identifier."
},
"title": {
"type": "string",
"description": "Its title."
},
"timer_minutes": {
"type": "integer",
"description": "Its timer, when the step has one."
},
"position": {
"type": "string",
"description": "Where it sits, such as \"3 of 14\"."
},
"next_step": {
"type": [
"string",
"null"
],
"description": "The next step's identifier."
}
}
}
},
"description": "One step of a guided journey."
}🟢find_sourdough_answer(query, limit)
Search Loafy's library of answers to real questions from bakers, written by Hendrik Kleinwächter of The Bread Code and grounded in his book The Sourdough Framework. Returns the answers that match, each with the book chapter behind it and a link. When none matches, returns the closest passages from the book instead. The library covers starters, fermentation, dough, flour, baking and storage, and it is in English. The book itself is search_sourdough_book for passages and read_sourdough_book for a whole chapter. Without a Loafy account, reading and searching the book and the answers is limited to 3 questions a day, every lookup within 15 minutes counting as one question; with an account it has no limit. The calculators, the guides and the book's table of contents need no account.
輸入結構描述
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "What the baker wants to know, in English, e.g. \"my starter smells like vinegar\"."
},
"limit": {
"type": "integer",
"description": "How many answers to return. Defaults to 3.",
"minimum": 1,
"maximum": 10,
"default": 3
}
},
"required": [
"query"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"answers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"question": {
"type": "string",
"description": "The baker's question."
},
"answer": {
"type": "string",
"description": "Hendrik's answer."
},
"source": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The book chapter behind it."
},
"url": {
"type": "string",
"description": "Its link."
}
}
},
"url": {
"type": "string",
"description": "The answer's page on loafy.ai."
}
}
},
"description": "The answers that match."
},
"passages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"chapter": {
"type": "string",
"description": "The chapter."
},
"section": {
"type": "string",
"description": "The section within it."
},
"part": {
"type": "string",
"description": "Its number and title, which read_sourdough_book takes."
},
"text": {
"type": "string",
"description": "The passage."
},
"url": {
"type": "string",
"description": "The chapter on the book's website."
}
}
},
"description": "When no answer matches, the closest passages from the book."
},
"license": {
"type": "string",
"description": "The licence of the book's text: CC BY-SA 4.0, with attribution."
},
"suggestion": {
"type": "string",
"description": "Where to look next when nothing fits."
}
},
"description": "Answers to real questions from bakers."
}🟢search_sourdough_book(query, limit)
Search Hendrik Kleinwächter's open-source book The Sourdough Framework and get the passages that answer a question, each with its chapter, a link and the part of the book it comes from, which read_sourdough_book returns in full. The book covers starters, fermentation, flour, hydration, shaping, baking and troubleshooting. It is written in English, and the search matches English words. Hendrik's published answers to common questions are find_sourdough_answer, and a whole chapter is read_sourdough_book. Without a Loafy account, reading and searching the book and the answers is limited to 3 questions a day, every lookup within 15 minutes counting as one question; with an account it has no limit. The calculators, the guides and the book's table of contents need no account.
輸入結構描述
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "What to look up, in English, e.g. \"starter smells like acetone\" or \"bulk fermentation temperature\"."
},
"limit": {
"type": "integer",
"description": "How many passages to return. Defaults to 3.",
"minimum": 1,
"maximum": 5,
"default": 3
}
},
"required": [
"query"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"passages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"chapter": {
"type": "string",
"description": "The chapter."
},
"section": {
"type": "string",
"description": "The section within it."
},
"part": {
"type": "string",
"description": "Its number and title, which read_sourdough_book takes."
},
"text": {
"type": "string",
"description": "The passage."
},
"url": {
"type": "string",
"description": "The chapter on the book's website."
}
}
},
"description": "The passages that answer the question."
},
"license": {
"type": "string",
"description": "The licence of the book's text: CC BY-SA 4.0, with attribution."
},
"suggestion": {
"type": "string",
"description": "Where to look next when nothing fits."
}
},
"description": "Passages from The Sourdough Framework."
}🟢get_sourdough_book_contents
The table of contents of Hendrik Kleinwächter's open-source book The Sourdough Framework: every chapter and section with its number and each chapter's length in words. read_sourdough_book returns any of them in full. The book covers starters, fermentation, flour, hydration, shaping, baking and troubleshooting.
輸入結構描述
{
"type": "object",
"properties": {},
"required": []
}🟢read_sourdough_book(part, page)
Read a chapter or section of Hendrik Kleinwächter's open-source book The Sourdough Framework in full, by its number from get_sourdough_book_contents or by its title. Returns the text with its chapter, link and licence; a chapter longer than about 40,000 characters comes in pages. Without a Loafy account, reading and searching the book and the answers is limited to 3 questions a day, every lookup within 15 minutes counting as one question; with an account it has no limit. The calculators, the guides and the book's table of contents need no account.
輸入結構描述
{
"type": "object",
"properties": {
"part": {
"type": "string",
"description": "A chapter or section: its number from get_sourdough_book_contents, e.g. \"8\" or \"8.3\", or its title, e.g. \"Bulk fermentation\"."
},
"page": {
"type": "integer",
"description": "Which page of a long chapter. Most parts have one.",
"minimum": 1,
"maximum": 10,
"default": 1
}
},
"required": [
"part"
]
}🟢list_my_bakes(limit, bake_type)
The baker's own bakes from their Loafy bake journal, newest first: what was baked and when, the recipe figures, rating, problems and notes, each with its id and a link. A new bake is log_bake, a change to one is update_bake with its id. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "How many bakes, newest first.",
"minimum": 1,
"maximum": 20,
"default": 5
},
"bake_type": {
"type": "string",
"description": "Only bakes of this kind, e.g. sourdough_bread or pizza.",
"enum": [
"sourdough_bread",
"pizza",
"focaccia",
"bagels",
"brioche",
"croissant",
"baguettes",
"loaf_pan_bread",
"bread_rolls",
"pan_bread",
"tortilla",
"naan",
"flatbread",
"other"
]
}
},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"bakes": {
"type": "array",
"items": {
"type": "object",
"description": "A bake in the baker's journal.",
"properties": {
"id": {
"type": "string",
"description": "The bake's id, which update_bake takes."
},
"baked_on": {
"type": "string",
"description": "The day, YYYY-MM-DD."
},
"bake_type": {
"type": "string",
"description": "What was baked."
},
"rating": {
"type": "integer",
"description": "Stars, 1 to 5."
},
"hydration_percent": {
"type": "number",
"description": "Water as a share of the flour."
},
"starter_percent": {
"type": "number",
"description": "Starter as a share."
},
"salt_percent": {
"type": "number",
"description": "Salt as a share."
},
"bulk_hours": {
"type": "number",
"description": "Hours of bulk fermentation."
},
"bulk_temp_celsius": {
"type": "number",
"description": "Temperature during bulk, °C."
},
"fridge_proof_hours": {
"type": "number",
"description": "Hours in the fridge."
},
"room_temp_proof_hours": {
"type": "number",
"description": "Hours of proof at room temperature."
},
"bake_temp_celsius": {
"type": "number",
"description": "Oven temperature, °C."
},
"bake_minutes": {
"type": "number",
"description": "Minutes in the oven."
},
"problems": {
"type": "array",
"items": {
"type": "string",
"description": "A problem, such as flat or dense."
},
"description": "What went wrong."
},
"notes": {
"type": "string",
"description": "The baker's notes."
},
"next_time_notes": {
"type": "string",
"description": "What to try next time."
},
"starter": {
"type": "string",
"description": "The starter it was made with."
},
"photos": {
"type": "integer",
"description": "How many photos it has."
},
"url": {
"type": "string",
"description": "The bake on loafy.ai."
}
}
},
"description": "Newest first."
},
"in_journal": {
"type": "integer",
"description": "All bakes in the journal."
}
},
"description": "The baker's bakes."
}🟡log_bake(bake_type, baked_on, rating, hydration_percent, starter_percent, ...)
Add a bake to the baker's Loafy bake journal: what was baked and when, the recipe figures, how it went and what to try next time. Returns the new entry with a link, where photos are added. The same bake sent again within two minutes returns the first entry instead of a second one, and a bake already in the journal changes with update_bake. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"bake_type": {
"type": "string",
"description": "What was baked.",
"enum": [
"sourdough_bread",
"pizza",
"focaccia",
"bagels",
"brioche",
"croissant",
"baguettes",
"loaf_pan_bread",
"bread_rolls",
"pan_bread",
"tortilla",
"naan",
"flatbread",
"other"
],
"default": "sourdough_bread"
},
"baked_on": {
"type": "string",
"description": "The day of the bake, as YYYY-MM-DD; today if left out."
},
"rating": {
"type": "integer",
"description": "How it turned out, 1 to 5 stars.",
"minimum": 1,
"maximum": 5
},
"hydration_percent": {
"type": "integer",
"description": "Water as a percentage of flour.",
"minimum": 40,
"maximum": 120
},
"starter_percent": {
"type": "number",
"description": "Starter as a percentage of flour.",
"minimum": 1,
"maximum": 50
},
"salt_percent": {
"type": "number",
"description": "Salt as a percentage of flour.",
"minimum": 0,
"maximum": 5
},
"bulk_hours": {
"type": "number",
"description": "Hours of bulk fermentation.",
"minimum": 0,
"maximum": 48
},
"bulk_temp_celsius": {
"type": "number",
"description": "Dough or room temperature during bulk, in °C.",
"minimum": 0,
"maximum": 50
},
"fridge_proof_hours": {
"type": "number",
"description": "Hours the shaped dough proofed in the fridge.",
"minimum": 0,
"maximum": 72
},
"room_temp_proof_hours": {
"type": "number",
"description": "Hours the shaped dough proofed at room temperature.",
"minimum": 0,
"maximum": 24
},
"bake_temp_celsius": {
"type": "integer",
"description": "Oven temperature in °C.",
"minimum": 50,
"maximum": 350
},
"bake_minutes": {
"type": "integer",
"description": "Minutes in the oven.",
"minimum": 1,
"maximum": 300
},
"problems": {
"type": "string",
"description": "What went wrong, comma-separated, from: dense_crumb, gummy_interior, no_oven_spring, flat_loaf, burnt_crust, pale_crust, bland_flavor, too_sour, didnt_rise, sticky_dough."
},
"notes": {
"type": "string",
"description": "How the bake went, in the baker's words."
},
"next_time_notes": {
"type": "string",
"description": "What to try differently next time."
},
"starter": {
"type": "string",
"description": "The name of the baker's starter that went in, if any."
}
},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"bake": {
"type": "object",
"description": "A bake in the baker's journal.",
"properties": {
"id": {
"type": "string",
"description": "The bake's id, which update_bake takes."
},
"baked_on": {
"type": "string",
"description": "The day, YYYY-MM-DD."
},
"bake_type": {
"type": "string",
"description": "What was baked."
},
"rating": {
"type": "integer",
"description": "Stars, 1 to 5."
},
"hydration_percent": {
"type": "number",
"description": "Water as a share of the flour."
},
"starter_percent": {
"type": "number",
"description": "Starter as a share."
},
"salt_percent": {
"type": "number",
"description": "Salt as a share."
},
"bulk_hours": {
"type": "number",
"description": "Hours of bulk fermentation."
},
"bulk_temp_celsius": {
"type": "number",
"description": "Temperature during bulk, °C."
},
"fridge_proof_hours": {
"type": "number",
"description": "Hours in the fridge."
},
"room_temp_proof_hours": {
"type": "number",
"description": "Hours of proof at room temperature."
},
"bake_temp_celsius": {
"type": "number",
"description": "Oven temperature, °C."
},
"bake_minutes": {
"type": "number",
"description": "Minutes in the oven."
},
"problems": {
"type": "array",
"items": {
"type": "string",
"description": "A problem, such as flat or dense."
},
"description": "What went wrong."
},
"notes": {
"type": "string",
"description": "The baker's notes."
},
"next_time_notes": {
"type": "string",
"description": "What to try next time."
},
"starter": {
"type": "string",
"description": "The starter it was made with."
},
"photos": {
"type": "integer",
"description": "How many photos it has."
},
"url": {
"type": "string",
"description": "The bake on loafy.ai."
}
}
},
"photos": {
"type": "string",
"description": "Where photos are added."
},
"card": {
"type": "object",
"description": "The figures the bake card in Claude shows (ui://loafy/bake-card).",
"properties": {
"title": {
"type": "string",
"description": "Its title."
},
"subtitle": {
"type": "string",
"description": "Under the title."
},
"trail": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Stars or today."
},
"rating": {
"type": "integer",
"description": "Stars."
},
"now": {
"type": "boolean",
"description": "This bake."
}
}
},
"description": "The last bakes."
},
"facts": {
"type": "array",
"items": {
"type": "string",
"description": "A figure, such as 75 % hydration."
},
"description": "The bake's main figures."
},
"best": {
"type": "string",
"description": "The best bake so far."
},
"open": {
"type": "string",
"description": "The open button's label."
},
"add_photos": {
"type": "string",
"description": "The photo button's label."
},
"url": {
"type": "string",
"description": "The bake on loafy.ai."
},
"photos_url": {
"type": "string",
"description": "Where its photos are added."
}
}
}
},
"description": "The bake as saved in the journal."
}🔴update_bake(id, bake_type, baked_on, rating, hydration_percent, ...)
Change a bake in the baker's Loafy bake journal, by its id from list_my_bakes or log_bake: only the figures and notes given change, the rest stays, and a text given replaces the old text. No bake is deleted. Returns the bake with a link. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The bake's id, from list_my_bakes or log_bake."
},
"bake_type": {
"type": "string",
"description": "What was baked.",
"enum": [
"sourdough_bread",
"pizza",
"focaccia",
"bagels",
"brioche",
"croissant",
"baguettes",
"loaf_pan_bread",
"bread_rolls",
"pan_bread",
"tortilla",
"naan",
"flatbread",
"other"
]
},
"baked_on": {
"type": "string",
"description": "The day of the bake, as YYYY-MM-DD."
},
"rating": {
"type": "integer",
"description": "How it turned out, 1 to 5 stars.",
"minimum": 1,
"maximum": 5
},
"hydration_percent": {
"type": "integer",
"description": "Water as a percentage of flour.",
"minimum": 40,
"maximum": 120
},
"starter_percent": {
"type": "number",
"description": "Starter as a percentage of flour.",
"minimum": 1,
"maximum": 50
},
"salt_percent": {
"type": "number",
"description": "Salt as a percentage of flour.",
"minimum": 0,
"maximum": 5
},
"bulk_hours": {
"type": "number",
"description": "Hours of bulk fermentation.",
"minimum": 0,
"maximum": 48
},
"bulk_temp_celsius": {
"type": "number",
"description": "Dough or room temperature during bulk, in °C.",
"minimum": 0,
"maximum": 50
},
"fridge_proof_hours": {
"type": "number",
"description": "Hours the shaped dough proofed in the fridge.",
"minimum": 0,
"maximum": 72
},
"room_temp_proof_hours": {
"type": "number",
"description": "Hours the shaped dough proofed at room temperature.",
"minimum": 0,
"maximum": 24
},
"bake_temp_celsius": {
"type": "integer",
"description": "Oven temperature in °C.",
"minimum": 50,
"maximum": 350
},
"bake_minutes": {
"type": "integer",
"description": "Minutes in the oven.",
"minimum": 1,
"maximum": 300
},
"problems": {
"type": "string",
"description": "What went wrong, comma-separated, from: dense_crumb, gummy_interior, no_oven_spring, flat_loaf, burnt_crust, pale_crust, bland_flavor, too_sour, didnt_rise, sticky_dough."
},
"notes": {
"type": "string",
"description": "How the bake went, in the baker's words."
},
"next_time_notes": {
"type": "string",
"description": "What to try differently next time."
},
"starter": {
"type": "string",
"description": "The name of the baker's starter that went in, if any."
}
},
"required": [
"id"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"bake": {
"type": "object",
"description": "A bake in the baker's journal.",
"properties": {
"id": {
"type": "string",
"description": "The bake's id, which update_bake takes."
},
"baked_on": {
"type": "string",
"description": "The day, YYYY-MM-DD."
},
"bake_type": {
"type": "string",
"description": "What was baked."
},
"rating": {
"type": "integer",
"description": "Stars, 1 to 5."
},
"hydration_percent": {
"type": "number",
"description": "Water as a share of the flour."
},
"starter_percent": {
"type": "number",
"description": "Starter as a share."
},
"salt_percent": {
"type": "number",
"description": "Salt as a share."
},
"bulk_hours": {
"type": "number",
"description": "Hours of bulk fermentation."
},
"bulk_temp_celsius": {
"type": "number",
"description": "Temperature during bulk, °C."
},
"fridge_proof_hours": {
"type": "number",
"description": "Hours in the fridge."
},
"room_temp_proof_hours": {
"type": "number",
"description": "Hours of proof at room temperature."
},
"bake_temp_celsius": {
"type": "number",
"description": "Oven temperature, °C."
},
"bake_minutes": {
"type": "number",
"description": "Minutes in the oven."
},
"problems": {
"type": "array",
"items": {
"type": "string",
"description": "A problem, such as flat or dense."
},
"description": "What went wrong."
},
"notes": {
"type": "string",
"description": "The baker's notes."
},
"next_time_notes": {
"type": "string",
"description": "What to try next time."
},
"starter": {
"type": "string",
"description": "The starter it was made with."
},
"photos": {
"type": "integer",
"description": "How many photos it has."
},
"url": {
"type": "string",
"description": "The bake on loafy.ai."
}
}
},
"photos": {
"type": "string",
"description": "Where photos are added."
},
"card": {
"type": "object",
"description": "The figures the bake card in Claude shows (ui://loafy/bake-card).",
"properties": {
"title": {
"type": "string",
"description": "Its title."
},
"subtitle": {
"type": "string",
"description": "Under the title."
},
"trail": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Stars or today."
},
"rating": {
"type": "integer",
"description": "Stars."
},
"now": {
"type": "boolean",
"description": "This bake."
}
}
},
"description": "The last bakes."
},
"facts": {
"type": "array",
"items": {
"type": "string",
"description": "A figure, such as 75 % hydration."
},
"description": "The bake's main figures."
},
"best": {
"type": "string",
"description": "The best bake so far."
},
"open": {
"type": "string",
"description": "The open button's label."
},
"add_photos": {
"type": "string",
"description": "The photo button's label."
},
"url": {
"type": "string",
"description": "The bake on loafy.ai."
},
"photos_url": {
"type": "string",
"description": "Where its photos are added."
}
}
}
},
"description": "The bake as saved in the journal."
}🟢list_my_starters
The baker's own sourdough starters in Loafy: name, birthday and age, notes and story, how many bakes each went into and when last, each with its id and a link. A new starter is add_starter, a change to one is update_starter. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"starters": {
"type": "array",
"items": {
"type": "object",
"description": "One of the baker's starters.",
"properties": {
"id": {
"type": "string",
"description": "The starter's id, which update_starter takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"birthday": {
"type": "string",
"description": "The day it was started, YYYY-MM-DD."
},
"age_days": {
"type": "integer",
"description": "Its age in days."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"story": {
"type": "string",
"description": "Its story."
},
"bakes": {
"type": "integer",
"description": "How many bakes it went into."
},
"last_baked_on": {
"type": "string",
"description": "Its last bake, YYYY-MM-DD."
},
"url": {
"type": "string",
"description": "The starter on loafy.ai."
}
}
},
"description": "By name."
}
},
"description": "The baker's starters."
}🟡add_starter(name, birthday, notes, story)
Add a sourdough starter to the baker's Loafy account: its name, the day it was started, notes and its story. Returns it with its id and a link, where photos are added. A name the baker already uses is not added again; that starter comes back, and update_starter changes it. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The starter's name."
},
"birthday": {
"type": "string",
"description": "The day the starter was started, as YYYY-MM-DD; today if left out."
},
"notes": {
"type": "string",
"description": "Notes on the starter, e.g. its flour and how it is fed."
},
"story": {
"type": "string",
"description": "Where the starter comes from, in the baker's words."
}
},
"required": [
"name"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"starter": {
"type": "object",
"description": "One of the baker's starters.",
"properties": {
"id": {
"type": "string",
"description": "The starter's id, which update_starter takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"birthday": {
"type": "string",
"description": "The day it was started, YYYY-MM-DD."
},
"age_days": {
"type": "integer",
"description": "Its age in days."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"story": {
"type": "string",
"description": "Its story."
},
"bakes": {
"type": "integer",
"description": "How many bakes it went into."
},
"last_baked_on": {
"type": "string",
"description": "Its last bake, YYYY-MM-DD."
},
"url": {
"type": "string",
"description": "The starter on loafy.ai."
}
}
}
},
"description": "The starter as saved."
}🔴update_starter(id, name, birthday, notes, story)
Change one of the baker's starters, by its id from list_my_starters: only the name, birthday, notes or story given change, and a text given replaces the old text. No starter is deleted. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The starter's id, from list_my_starters or add_starter."
},
"name": {
"type": "string",
"description": "The starter's name."
},
"birthday": {
"type": "string",
"description": "The day the starter was started, as YYYY-MM-DD."
},
"notes": {
"type": "string",
"description": "Notes on the starter, e.g. its flour and how it is fed."
},
"story": {
"type": "string",
"description": "Where the starter comes from, in the baker's words."
}
},
"required": [
"id"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"starter": {
"type": "object",
"description": "One of the baker's starters.",
"properties": {
"id": {
"type": "string",
"description": "The starter's id, which update_starter takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"birthday": {
"type": "string",
"description": "The day it was started, YYYY-MM-DD."
},
"age_days": {
"type": "integer",
"description": "Its age in days."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"story": {
"type": "string",
"description": "Its story."
},
"bakes": {
"type": "integer",
"description": "How many bakes it went into."
},
"last_baked_on": {
"type": "string",
"description": "Its last bake, YYYY-MM-DD."
},
"url": {
"type": "string",
"description": "The starter on loafy.ai."
}
}
}
},
"description": "The starter as saved."
}🟢list_my_containers
The baker's own containers in Loafy: name and empty weight in grams, which Loafy takes off when dough is weighed in them, with notes, each with its id and a link. A new container is add_container, a change to one is update_container. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {},
"required": []
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"containers": {
"type": "array",
"items": {
"type": "object",
"description": "One of the baker's containers.",
"properties": {
"id": {
"type": "string",
"description": "The container's id, which update_container takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"weight_grams": {
"type": "number",
"description": "Its empty weight, in grams."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"url": {
"type": "string",
"description": "The container on loafy.ai."
}
}
},
"description": "By name."
}
},
"description": "The baker's containers."
}🟡add_container(name, weight_grams, notes)
Add a container to the baker's Loafy account with its empty weight in grams, so Loafy can take it off when dough is weighed in it. Returns it with its id and a link. A name the baker already uses is not added again; that container comes back, and update_container changes it. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The container's name, e.g. \"Glass bowl\"."
},
"weight_grams": {
"type": "integer",
"description": "The empty container's weight in grams.",
"minimum": 1,
"maximum": 10000
},
"notes": {
"type": "string",
"description": "Notes on the container."
}
},
"required": [
"name",
"weight_grams"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"container": {
"type": "object",
"description": "One of the baker's containers.",
"properties": {
"id": {
"type": "string",
"description": "The container's id, which update_container takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"weight_grams": {
"type": "number",
"description": "Its empty weight, in grams."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"url": {
"type": "string",
"description": "The container on loafy.ai."
}
}
}
},
"description": "The container as saved."
}🔴update_container(id, name, weight_grams, notes)
Change one of the baker's containers, by its id from list_my_containers: only the name, weight or notes given change, and a text given replaces the old text. No container is deleted. Needs the baker's Loafy account.
輸入結構描述
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The container's id, from list_my_containers or add_container."
},
"name": {
"type": "string",
"description": "The container's name, e.g. \"Glass bowl\"."
},
"weight_grams": {
"type": "integer",
"description": "The empty container's weight in grams.",
"minimum": 1,
"maximum": 10000
},
"notes": {
"type": "string",
"description": "Notes on the container."
}
},
"required": [
"id"
]
}輸出結構描述
{
"type": "object",
"properties": {
"tool": {
"type": "string",
"description": "The tool that answered."
},
"input": {
"type": "object",
"description": "The arguments as the tool used them, after any correction.",
"properties": {}
},
"notes": {
"type": "array",
"items": {
"type": "string",
"description": "A correction or remark."
},
"description": "What was corrected or left out, such as a value outside its range."
},
"note": {
"type": "string",
"description": "A remark on the whole result, such as why nothing was found."
},
"url": {
"type": "string",
"description": "The same answer, recipe or entry on loafy.ai."
},
"saved": {
"type": "string",
"description": "What was saved, in one sentence."
},
"container": {
"type": "object",
"description": "One of the baker's containers.",
"properties": {
"id": {
"type": "string",
"description": "The container's id, which update_container takes."
},
"name": {
"type": "string",
"description": "Its name."
},
"weight_grams": {
"type": "number",
"description": "Its empty weight, in grams."
},
"notes": {
"type": "string",
"description": "Notes on it."
},
"url": {
"type": "string",
"description": "The container on loafy.ai."
}
}
}
},
"description": "The container as saved."
}社群
證據