{"ok":true,"site":{"host":"windowai.danduh.me","url":"https://windowai.danduh.me/webmcp/webmcp-api-documentation","type":"live","desc":"Documentation for the WebMCP Recipe Workbench demo. Walks through document.modelContext, registerTool, and the page-side tool descriptor.","tools":[{"name":"listRecipes","kind":"answer","impl":"imperative","description":"List all saved recipes with id, title, and serving count. Use this to see what recipes are available before scaling, swapping, or generating a shopping list.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"getRecipe","kind":"answer","impl":"imperative","description":"Get the full details of a recipe by id, including ingredients (name + quantity + unit) and ordered steps.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Recipe id (e.g. \"buttermilk-pancakes\")"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"generateShoppingList","kind":"act","impl":"imperative","description":"Generate a consolidated shopping list across all saved recipes. Ingredients with the same name+unit are summed. If a recipeId is provided, only that recipe is used.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"recipeId":{"type":"string","description":"(optional) recipe id; defaults to all recipes"}},"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"selectRecipe","kind":"act","impl":"imperative","description":"Make a recipe the currently active one in the workbench. Subsequent tools (scaleRecipe, swapIngredient, etc.) operate on the active recipe by default.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Recipe id to make active"}},"required":["id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"scaleRecipe","kind":"act","impl":"imperative","description":"Scale a recipe to a new serving count. All ingredient quantities are scaled proportionally (newQty = oldQty * newServings / oldServings). Operates on the active recipe unless recipeId is provided.","inputSchema":{"type":"object","properties":{"servings":{"type":"integer","minimum":1,"description":"Target servings count"},"recipeId":{"type":"string","description":"(optional) recipe id; defaults to active recipe"}},"required":["servings"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"swapIngredient","kind":"act","impl":"imperative","description":"Replace an ingredient name in the active recipe. Matches the first ingredient whose name contains the search term (case-insensitive substring). Quantity and unit are preserved unless overrides are passed.","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"Ingredient name to replace (case-insensitive substring match — \"milk\" matches \"buttermilk\")"},"to":{"type":"string","description":"New ingredient name"},"recipeId":{"type":"string","description":"(optional) recipe id; defaults to active recipe"},"newQuantity":{"type":"number","minimum":0,"description":"(optional) override quantity"},"newUnit":{"type":"string","description":"(optional) override unit"}},"required":["from","to"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"addIngredient","kind":"act","impl":"imperative","description":"Add a new ingredient to the active recipe. quantity is a positive number; unit is a free-form string like \"g\", \"ml\", \"cup\", \"tbsp\", \"tsp\", \"piece\".","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Ingredient name"},"quantity":{"type":"number","minimum":0,"description":"Numeric quantity"},"unit":{"type":"string","description":"Unit (g, ml, cup, tbsp, tsp, piece, …)"},"recipeId":{"type":"string","description":"(optional) recipe id; defaults to active recipe"}},"required":["name","quantity","unit"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]},{"name":"removeIngredient","kind":"act","impl":"imperative","description":"Remove an ingredient from the active recipe by name (case-insensitive substring match, same matcher as swapIngredient).","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Ingredient name to remove (case-insensitive substring match)"},"recipeId":{"type":"string","description":"(optional) recipe id; defaults to active recipe"}},"required":["name"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp/webmcp-api-documentation","pages":["/webmcp/webmcp-api-documentation"]}],"category":"Developer Tools","favicon":"/favicons/windowai.danduh.me.png","apiSurface":"spec","toolCount":8}}