ask.recipes
Server Details
Recipe search, ingredient matching, nutrition filters and a private cookbook for any AI agent.
- Status
- Healthy
- Uptime
- 99.6% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- RCM7/ask.recipes
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- ask.recipes
TDQS
Scored across 32 tools
Most tools target a distinct resource+action, and descriptions explicitly cross-reference the near neighbours (list_saved vs list_cookidoo_recipes, search_recipes vs find_by_ingredients, mark_cooked with rating vs rate_recipe). The recipe-intake family (upload_recipe, import_recipes, import_cookidoo_recipe) and the two search paths remain close enough that a hurried agent could still misselect, but the boundaries are documented.
Nearly everything is snake_case verb-first (add_to_pantry, get_recipe, save_recipe, unsave_recipe, invite_to_household, list_cookbooks, search_cookidoo). Occasional noun-first names such as cooked_history and the straddling prefix order in import_cookidoo_recipe vs import_recipes are minor deviations, not a pattern break.
32 tools is heavy for a single surface, and clusters like connect/disconnect Cookidoo, search_cookidoo/list_cookidoo_recipes/import_cookidoo_recipe/send_to_thermomix, and three separate recipe-intake tools could be consolidated without losing capability. The domain is genuinely broad (recipes, pantry, cookbooks, household, external sync), so the count is defensible but not well-scoped.
Coverage is strong: full cookbook CRUD, pantry in/out, household lifecycle, profile, diary, ratings, sharing and import paths. Gaps are minor rather than blocking: no way to delete an uploaded private recipe (unsave only detaches it from cookbooks), and no pantry-to-shopping-list or explicit meal-plan tool despite the week-planning language in descriptions.
Available Tools
32 toolsadd_to_pantryAdd to the pantryADestructiveIdempotentInspect
Add or restock pantry items from what the user says in passing: "bought rice and two chickens", "here's what's in the fridge". An item already in the pantry gets the new quantity. Names are matched loosely, so 'Eggs' and 'eggs' are the same item. Returns the whole pantry after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| add | Yes | items to add or update; an item already in the pantry gets the new quantity |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the annotations: existing items are updated to the new quantity (overwriting the prior amount, consistent with destructiveHint=true), name matching is loose/case-insensitive, and the whole pantry is returned. It does not spell out what happens if an existing item is re-added with no quantity, which leaves the mutation semantics partially ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, zero waste, each front-loading the most decision-relevant fact in order: what it does, input source, update semantics, matching semantics, return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a full output schema and annotations, the description covers the important gaps (loose matching, restock-in-place behavior) and needn't explain return values. The remaining hole is the merge rule when an existing item is supplied without a quantity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the nested name/quantity fields are already documented, making 3 the baseline. The description adds meaning to the 'quantity' field (free-text amounts in the user's words) but does not add format or edge-case guidance for the 'add' array beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add or restock) and resource (pantry items), plus the input source ('what the user says in passing') with concrete examples. An agent can distinguish this from remove_from_pantry or get_pantry 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context – freeform phrases like 'bought rice and two chickens' or 'here's what's in the fridge' – which tells the agent when this tool applies. However, it never names the alternative (get_pantry for reading, remove_from_pantry for deletion) or states when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_cookidooConnect Cookidoo (Thermomix / Bimby)AIdempotentInspect
Check whether the user's Cookidoo account (the Thermomix / Bimby recipe platform) is connected, and when it is not, return a one-time link where they enter their Cookidoo login. For "connect my Thermomix", "link my Bimby", or before the first send_to_thermomix. Give the user the link; it works once and expires in 15 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| No | ||
| units | No | units the Thermomix works in |
| devices | No | every Thermomix paired with the account |
| machine | No | Thermomix model the recipes are written for |
| language | No | language of the Cookidoo account; write everything sent to it in this language |
| username | No | |
| connected | Yes | |
| last_error | No | |
| connect_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the returned link is one-time and expires in 15 minutes, and the user—not the tool—enters credentials. That explains why the tool is non-destructive yet not readOnly (it mints a session). It does not say what the response looks like when already connected or whether the agent must re-poll after the user completes the flow, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then triggers, then the operational caveat about expiry. No filler and nothing repeated from the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description covers everything an agent needs: when to call it, what the user must do, and how long the returned artifact is valid. Return-value details are appropriately delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline applies. Calling convention is fully determined by the tool name and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Check whether the user's Cookidoo account ... is connected') plus the fallback behavior (returns a one-time login link). It disambiguates from siblings by naming the Thermomix/Bimby alias and by implying this is the entry point rather than the actual import/send operations handled by other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrases ('connect my Thermomix', 'link my Bimby') and a concrete sequencing rule ('before the first send_to_thermomix'), naming the sibling that depends on it. It also tells the agent to hand the link to the user, so the invocation context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cooked_historyWhat the user cookedARead-onlyIdempotentInspect
List what the user cooked and when, newest first, for "what did we cook last week", "when did I last make the lasagna", "what have we been eating". Call it before planning a week so the plan avoids repeating recent dishes and ingredients. Each entry carries the day, the user's note and the recipe summary with its source link. Without since, until or recipe_id it covers the last 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | max entries, default 50, max 200 | |
| since | No | first day to include as YYYY-MM-DD; without since, until or recipe_id the last 30 days are returned | |
| until | No | last day to include as YYYY-MM-DD, inclusive | |
| recipe_id | No | only entries for this recipe, for 'when did I last make the lasagna'; lifts the 30-day default |
Output Schema
| Name | Required | Description |
|---|---|---|
| entries | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: newest-first ordering, the default 30-day window and what lifts it, and the shape of each entry (day, note, recipe summary with source link).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and ordering are front-loaded, the example utterances are tightly grouped, and the workflow hint follows. The closing sentence on the 30-day default duplicates the schema text, a small redundancy that keeps it out of the top band.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full schema coverage, rich annotations and an output schema, everything an agent needs is present: what it returns, default scope, ordering, and when to invoke it. No meaningful gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented. The description's statements about the 30-day default and recipe_id lifting it restate the schema rather than adding new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list cooked history) plus ordering ('newest first'), and the example utterances ('when did I last make the lasagna') make the retrieval shape unambiguous against siblings like mark_cooked or get_recipe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it before planning a week so plans avoid repeating dishes and ingredients, which gives a clear triggering context. It stops short of naming an alternative tool or stating when-not to use it, so it falls just under the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_cookbookCreate a cookbookAInspect
Create an empty cookbook, for "make me a BBQ cookbook". Not needed before save_recipe, which creates a cookbook it does not know. Fails when a cookbook with that name exists already. shared=true makes it a household cookbook, visible to everyone in the user's household.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | cookbook name, e.g. 'BBQ', 'Weeknight', 'Christmas' | |
| shared | No | true to make it a household cookbook that everyone in the user's household sees and saves into, for 'a cookbook for the whole family'; needs a household | |
| description | No | one line on what goes in it |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| shared | No | |
| default | No | |
| description | No | |
| recipe_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, non-idempotent, closed-world, so safety is covered. The description adds value beyond that with the duplicate-name failure mode and the cross-user visibility consequence of shared=true, which no annotation expresses. It stops short of describing the return value, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing distinct work: create, sibling routing, and shared semantics. The opening quoted example is slightly awkward, but nothing is padded or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering mutability and an output schema covering returns, the remaining burden is when-to-use and edge cases—both addressed (duplicate name, save_recipe overlap, household prerequisite). Minor omission: no statement about what permissions or scope the new cookbook lands in beyond shared.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented—including the household requirement for shared and example names. The description's shared=true sentence mostly restates the schema's own wording, adding only the household-scoping phrasing; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create an empty cookbook') and immediately anchors it to a real-world intent ('make me a BBQ cookbook'). Crucially, it distinguishes itself from save_recipe, the sibling that also creates cookbooks, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when this tool is NOT needed ('Not needed before save_recipe, which creates a cookbook it does not know'), which is exactly the routing decision an agent would otherwise get wrong. It also names the failure condition (duplicate name), giving a clear precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_cookbookDelete a cookbookADestructiveIdempotentInspect
Delete a cookbook by name. No recipe is lost: any recipe that was only in this cookbook moves to the default cookbook. The default cookbook cannot be deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| cookbook | Yes | name of the cookbook to delete; its recipes are kept and any that were in no other cookbook move to the default one |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| moved_to_default | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructiveHint and idempotentHint, the description explains the actual consequence: no recipe is lost, and recipes only in that cookbook move to the default. This is exactly the behavioral context an agent needs before invoking a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, followed by the key safety behavior and the main restriction. Every sentence carries useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with annotations and an output schema, the description covers purpose, side effects, and the key restriction. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already documents the single cookbook parameter in detail. The description adds only "by name," so it meets the baseline without adding substantial parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Delete a cookbook by name." This clearly distinguishes it from create_cookbook and update_cookbook without requiring schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage condition and an explicit exclusion: the default cookbook cannot be deleted. It does not name sibling alternatives, but the delete operation is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disconnect_cookidooDisconnect CookidooADestructiveIdempotentInspect
Remove the user's stored Cookidoo login from ask.recipes. Recipes already sent to Cookidoo and recipes imported into ask.recipes stay where they are.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| disconnected | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds real value beyond that by scoping what is and isn't destroyed: only the stored login goes, while already-sent and imported recipes persist. It stops short of saying whether re-authentication is required afterward or what happens on disconnect failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, both front-loaded and load-bearing: the first defines the action, the second preempts the most likely agent/user misconception about data loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, no parameters, and annotations carrying the safety profile, the description covers everything an agent needs to invoke it correctly. Only the post-disconnect state (e.g., whether the account must be reconnected) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to compensate for and the empty schema is fully consistent with the no-argument behavior described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('the user's stored Cookidoo login') scoped to ask.recipes, which lets an agent distinguish it from connect_cookidoo and the recipe-level siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool applies (removing a stored login) but never names an alternative or an explicit when-not condition, such as pointing to connect_cookidoo for re-authentication or clarifying that it doesn't touch Cookidoo-side data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_by_ingredientsFind recipes by ingredients on handARead-onlyIdempotentInspect
Find recipes that use ingredients the user already has: leftovers, a full fridge, an ingredient about to turn. Ranks by how many of those ingredients a recipe uses and how few extra ones it needs. The user's pantry counts as on hand too, so a recipe that only needs pantry staples on top of what was passed ranks as nearly complete; with no ingredients passed it cooks from the pantry alone, for "what can I make with what I have"; when the pantry is empty too, ask_user carries the question to put to the user. Takes the same diet, nutrition and exclude_ingredients filters as search_recipes. Each result links to its source. The user's profile, once saved with update_profile, excludes allergens and dislikes, keeps its diets on and supplies the default time budget; pass max_total_minutes=-1 to lift it. who names the people eating, by name or role, when not everyone is. check, present when the profile has allergens, says to read a recipe's ingredients with get_recipe before recommending it, because a product name can hide an excluded ingredient.
| Name | Required | Description | Default |
|---|---|---|---|
| who | No | who is eating, by the names or roles saved as people on the profile, e.g. ['Dad','Ana'] or ['adults'] when the kids are out, ['kids'] when only they eat; only those people's allergens and dislikes apply on top of the household's; leave empty for everyone | |
| limit | No | ||
| query | No | optional free-text to narrow results, e.g. 'breakfast pancakes' | |
| vegan | No | only vegan recipes: vegetarian and no eggs, dairy or honey | |
| feeding | No | how many people are eating, e.g. 10 for a dinner party; from six up, dishes cooked in one vessel (stews, braises, tray bakes, casseroles, soups, roasts) rank ahead of dishes cooked per portion (steaks, burgers, pancakes, stir-fries); nothing is excluded | |
| nut_free | No | only recipes without tree nuts or peanuts; coconut counts as nut-free | |
| max_fat_g | No | maximum grams of fat per serving | |
| dairy_free | No | only recipes without milk, butter, cheese, cream or yogurt | |
| min_rating | No | only recipes rated at least this many stars, source ratings and ask.recipes stars averaged together; recipes nobody has rated yet and private uploads stay in; off unless passed | |
| vegetarian | No | only vegetarian recipes: no meat, poultry, fish, seafood or gelatin in the ingredients | |
| gluten_free | No | only recipes without wheat, barley, rye, oats or products made from them | |
| ingredients | No | ingredients to cook with, e.g. ['oats','milk','eggs','skyr','berries']; leave empty to cook from the pantry alone | |
| max_carbs_g | No | maximum grams of carbohydrates per serving | |
| max_sugar_g | No | maximum grams of sugar per serving | |
| min_fiber_g | No | minimum grams of fiber per serving | |
| min_reviews | No | only recipes with at least this many ratings, source and ask.recipes together; recipes with no rating at all and private uploads stay in; off unless passed | |
| main_protein | No | only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, shrimp (with prawns), seafood (other shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','shrimp','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish | |
| max_calories | No | only recipes with at most this many calories per serving, e.g. 300 | |
| min_calories | No | only recipes with at least this many calories per serving | |
| ignore_pantry | No | true to match only the ingredients passed and not count the pantry, for 'using just these' | |
| min_protein_g | No | minimum grams of protein per serving, e.g. 10 | |
| batch_friendly | No | true to leave out dishes cooked per portion, for a crowd; recipes not yet classified stay in | |
| max_total_minutes | No | ||
| exclude_ingredients | No | ingredients to leave out for this search, whole-word match on the ingredient list, e.g. ['chicken','brussels sprouts'] to avoid repeating what the week already has; nuts, gluten and dairy as a word apply the matching diet filter; the profile's allergens and dislikes stay excluded on top |
Output Schema
| Name | Required | Description |
|---|---|---|
| check | No | |
| matches | Yes | |
| ask_user | No | |
| from_pantry | No | |
| ingredients | Yes | |
| pantry_ingredients | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent, so the description correctly spends its words on non-obvious behavior instead: pantry ingredients count toward completion ranking, saved profile silently applies allergen/dislike exclusions and a default time budget, and max_total_minutes=-1 is the documented escape hatch. The 'check' result field and its implication (verify ingredients via get_recipe before recommending) is exactly the kind of caveat an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and ranking are front-loaded, and the dense single-paragraph format packs a lot of decision-relevant content with little filler. It is longer than ideal and would scan better with structure, but no sentence is genuinely expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter tool with an output schema and full annotation coverage, the description supplies the missing layer: profile-driven allergen/dislike exclusion, pantry counting, the 'check' flag contract, and the escape hatch for the default time budget. Nothing an agent needs to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 92%, so the baseline is 3; the description earns above that by explaining semantics the schema omits entirely — the -1 sentinel on max_total_minutes (which has no schema description) and the profile-derived defaults that filters override. It does not cover 'limit' or 'query' beyond what the schema already says, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find recipes that use ingredients the user already has') and immediately explains the ranking logic, which is what makes this tool distinct from search_recipes. An agent can tell this apart from search_recipes and from get_pantry 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers the scenarios that select this tool: leftovers/full fridge/about-to-turn ingredient, pantry-only cooking with no ingredients passed, and the degraded case where the pantry is also empty and ask_user should carry the question. It also names the sibling it shares filters with ('takes the same diet, nutrition and exclude_ingredients filters as search_recipes') and the downstream verification step (get_recipe).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_householdWho shares the kitchenARead-onlyIdempotentInspect
Read the user's household: its name and who is in it, by the names they go by at home. Members share one pantry, one cooking diary and any cookbook marked shared, and each member's own allergens and dislikes apply when anyone in the household searches for everyone. in_household=false means the user shares a kitchen with nobody yet; invite_to_household starts one. For "who's in my household", "is my partner connected".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| note | No | |
| members | Yes | |
| in_household | Yes | false when this account shares a kitchen with nobody yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description goes beyond them by disclosing the domain consequences of membership (shared pantry, shared cooking diary, shared-marked cookbooks, members' allergens/dislikes applying household-wide) and what in_household=false means. It does not describe caching, privacy scoping, or failure modes, but for a zero-argument read the added context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The identity of the tool is front-loaded in the first sentence and the routing hint is placed at the end where it belongs. The middle sentence about shared pantry, diary and allergens is long and reads more like product documentation than tool guidance, though it does earn its place by explaining why household membership matters to nearby tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with an output schema, the description supplies everything an agent needs: what is returned, how to read in_household, where to go next, and example intents. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case. The description adds a small amount of interpretive value by explaining that in_household is a signal to check rather than an input, but since it is a response field and an output schema exists, no further parameter explanation is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ("Read the user's household: its name and who is in it") plus the exact shape of the returned identity data. It is clearly distinguishable from write-side siblings like update_household, invite_to_household and leave_household, which the description implicitly frames as the alternative paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names a concrete alternative with the condition that selects it: when in_household=false, "invite_to_household starts one." The closing phrases ("who's in my household", "is my partner connected") give real triggering utterances. It stops short of stating explicit exclusions, e.g. that changing the household requires update_household rather than this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pantryWhat is in the pantryARead-onlyIdempotentInspect
List what the user has told you is in their kitchen: pantry, fridge and freezer, with quantities when they gave one. For "what do I have", before suggesting a shopping list, or to check an ingredient before recommending a recipe. find_by_ingredients with no ingredients searches from this list directly.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds meaningful context the annotations cannot: the data reflects only what the user has told the assistant, and quantities are optional, so the agent knows gaps are possible rather than treating the list as authoritative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler, and the core definition is front-loaded before the usage triggers and the sibling relationship. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, annotations are rich, and no parameters need explaining, so the description only has to supply purpose, triggers and sibling routing — all present. Nothing required to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero-parameter tool, so there is no parameter semantics to document and the baseline of 4 applies. Nothing in the description misdescribes the (empty) input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List what the user has told you is in their kitchen: pantry, fridge and freezer') and pins down the scope detail that quantities only appear when provided. It is immediately distinguishable from add_to_pantry and remove_from_pantry, which mutate the same resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three explicit trigger conditions — answering 'what do I have', before suggesting a shopping list, and before recommending a recipe — plus an explicit alternative route: find_by_ingredients with no ingredients searches from this list. That is when-to-use and alternative-selection guidance in a single sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_profileHow the household eatsARead-onlyIdempotentInspect
Read what is saved about how the user eats: how many are eating, allergens, dislikes, likes, diets, cuisines, the usual weeknight time budget, units, daily calorie or macro goals, and the people in the household, each with a role such as kid or adult and what applies to them alone. Household allergens and dislikes are excluded from every search; a person's apply whenever they are eating, which is everyone unless a search passes who. Diets stay on and the time budget is the default time limit, so you rarely need to pass them yourself; read likes and cuisines to steer suggestions. Call it before planning a week and when the user asks what you know about them. set=false means nothing is saved yet: offer the set_up_my_kitchen questions once.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| set | Yes | false when nothing has been saved yet |
| note | No | |
| diets | Yes | |
| likes | Yes | |
| units | No | |
| people | Yes | |
| cuisines | Yes | |
| dislikes | Yes | |
| allergens | Yes | |
| household | No | present when the user shares a kitchen with other ask.recipes accounts; their allergens and dislikes apply to searches for everyone |
| fat_g_per_day | No | |
| household_size | No | |
| carbs_g_per_day | No | |
| calories_per_day | No | |
| protein_g_per_day | No | |
| time_budget_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds real behavioral semantics: household allergens and dislikes are excluded from every search, a person's constraints apply whenever they eat unless a search passes who, diets stay on, and the time budget is the default time limit. The set=false branch also pre-empts an empty-result misread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the field list and every sentence carries operational content, but the middle argument about allergens/diets/time budget is a dense run-on that could be broken into clearer sentences without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be detailed, yet the description still flags the one return value an agent must act on (set=false). Usage triggers, downstream constraints for searches, and default behaviors are all covered for a zero-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4 and there is nothing for the description to disambiguate. It does clarify the semantics of the 'who' filter on the related search tools and of set=false in the response, which is adjacent useful context rather than parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Read what is saved about how the user eats') and enumerates the concrete fields returned: household size, allergens, dislikes, likes, diets, cuisines, time budget, units, goals, and per-person roles. That enumeration distinguishes it from get_household and update_profile in spirit, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers: 'Call it before planning a week and when the user asks what you know about them,' plus a branch on set=false to offer set_up_my_kitchen questions. It also tells the agent it rarely needs to pass diets or time budget itself. There is no explicit when-not or named alternative tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipeGet a recipe in fullARead-onlyIdempotentInspect
Get one recipe in full: ingredients, step-by-step instructions, times, yield, nutrition, rating (source ratings and ask.recipes stars averaged, with the user's own as my_rating) and its source link. For when the user picks a recipe from a search or asks how to make it. Pass servings to scale the ingredient quantities, e.g. for meal prep or a crowd; nutrition_for says whether the nutrition numbers are per serving or for the whole yield. Amounts come back in the units saved on the profile: metric turns cups and ounces into grams and millilitres (dry goods by weight, liquids by volume, spoons stay spoons) and oven temperatures and pan sizes in the steps into Celsius and centimetres; us does the reverse; units in the result says which applied, empty means as the source wrote it. Pass units to override for one call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id from a previous search | |
| units | No | metric or us; converts the ingredient amounts and the temperatures and pan sizes in the steps; defaults to the units saved on the profile, leave empty unless the user asks for the other system this once | |
| servings | No | scale ingredient quantities to this many servings; when the recipe's yield does not state servings the recipe comes back unscaled with scale_note saying so, nutrition stays per serving |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| diets | No | |
| fat_g | No | |
| units | No | |
| yield | No | |
| rating | No | |
| carbs_g | No | |
| fiber_g | No | |
| sugar_g | No | |
| calories | No | |
| saved_in | No | |
| servings | No | |
| image_url | No | |
| my_rating | No | |
| nutrition | No | |
| protein_g | No | |
| scale_note | No | |
| source_url | Yes | |
| attribution | Yes | |
| description | No | |
| ingredients | Yes | |
| scale_class | No | |
| source_site | Yes | |
| cook_minutes | No | |
| instructions | Yes | |
| main_protein | No | |
| prep_minutes | No | |
| rating_count | Yes | |
| nutrition_for | No | |
| total_minutes | No | |
| askrecipes_ratings | No | |
| scaled_from_servings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond them: how ratings are composed (source ratings averaged with ask.recipes stars, user's own surfaced as my_rating), that nutrition_for indicates per-serving vs whole-yield, and that scaling is skipped with a scale_note when yield doesn't state servings. The units paragraph discloses conversion rules (dry goods by weight, liquids by volume, spoons unchanged, oven temps and pan sizes converted) and that an empty units field in the result means source-as-written.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and use case are front-loaded, then scaling, then units — a logical order. The units block is long and packs output semantics (what 'units in the result' means) into a parameter discussion, and it partly restates the schema's units description, costing it a point on tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, yet the description still flags the non-obvious fields (nutrition_for, my_rating, scale_note, units). For a three-parameter read tool with edge cases around scaling and unit conversion, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: it explains the intent of servings (meal prep, a crowd), the concrete metric/us conversion effects, and the fallback behavior (scale_note, nutrition stays per serving). The units explanation overlaps the schema's own units description, so the marginal gain is real but partly duplicated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one recipe in full') and immediately enumerates the payload: ingredients, instructions, times, yield, nutrition, rating, source link. An agent can distinguish this from search_recipes or list_saved without opening the schema, since this is the single-item full-fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition: 'when the user picks a recipe from a search or asks how to make it,' and the id parameter is described as coming from a previous search, which implies the prerequisite lookup flow. It does not explicitly name the sibling to use instead when the user has not yet picked a recipe (search_recipes/list_saved), so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_cookidoo_recipeImport a Cookidoo recipeADestructiveIdempotentInspect
Copy one Cookidoo recipe into the user's private ask.recipes collection, so the agent can read it in full, adapt it, build a shopping list, or compare it with other recipes. Imported recipes are visible only to this user and cannot be shared. Importing the same recipe again refreshes the copy.
| Name | Required | Description | Default |
|---|---|---|---|
| cookidoo_id | Yes | Cookidoo recipe id such as r123456 or a created-recipe id, from search_cookidoo, list_cookidoo_recipes or the recipe's Cookidoo URL |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| diets | No | |
| fat_g | No | |
| units | No | |
| yield | No | |
| rating | No | |
| carbs_g | No | |
| fiber_g | No | |
| sugar_g | No | |
| calories | No | |
| saved_in | No | |
| servings | No | |
| image_url | No | |
| my_rating | No | |
| nutrition | No | |
| protein_g | No | |
| scale_note | No | |
| source_url | Yes | |
| attribution | Yes | |
| description | No | |
| ingredients | Yes | |
| scale_class | No | |
| source_site | Yes | |
| cook_minutes | No | |
| instructions | Yes | |
| main_protein | No | |
| prep_minutes | No | |
| rating_count | Yes | |
| nutrition_for | No | |
| total_minutes | No | |
| askrecipes_ratings | No | |
| scaled_from_servings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true; the description explains both by disclosing that re-importing the same recipe refreshes the copy, and adds the privacy constraint that imported recipes are visible only to this user and cannot be shared. It does not mention the prerequisite Cookidoo account link, which is the main operational unknown left.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the verb and destination, then use cases, then the two behavioral caveats (privacy, refresh semantics). Nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the annotations carry the safety profile while the description reinforces it. The remaining gap is the unstated dependency on connect_cookidoo before importing can succeed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single required parameter, and the schema itself already documents accepted id formats (r123456, created-recipe ids, URL). The description adds no further meaning about cookidoo_id, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Copy one Cookidoo recipe into the user's private ask.recipes collection') plus the target scope, which separates it from the plural sibling import_recipes and from save_recipe. It never names the alternative import tool explicitly, so differentiation is implied by 'one' rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete downstream uses ('read it in full, adapt it, build a shopping list, or compare it with other recipes') that tell an agent when this import is worthwhile. It stops short of explicit exclusions — e.g. when to prefer import_recipes or save_recipe, or that a Cookidoo connection must exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_recipesImport a recipe app exportAInspect
Return a one-time link where the user drops the export file from their recipe app: Paprika (.paprikarecipes), Mela (.melarecipes), Crouton (.crumb) or a zip of recipe pages carrying schema.org Recipe markup. Every recipe becomes a private recipe visible only to this user, in a cookbook named after the file, with its photo; Paprika star ratings become my_rating, nutrition is estimated afterwards. For "import my Paprika recipes", "bring my recipe collection over", or whenever the user has more than a few recipes to add at once; upload_recipe stays the tool for a single recipe. Give the user the link as is; it works once and expires in an hour. Files up to 100 MB and 3000 recipes; bigger libraries go in by category, duplicates are skipped on a second upload. Then suggest list_saved with the new cookbook once they say it is done.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| formats | Yes | export files the page reads |
| import_url | Yes | one-time page where the user drops the export file; works once, expires in an hour |
| how_to_export | Yes | where the export lives in each app |
| expires_in_minutes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the tool only mints a link (the actual import happens on the user's upload), that the link is single-use and expires in an hour, that results are private cookbooks named after the file with photos preserved, that Paprika stars map to my_rating, that nutrition is estimated afterwards, that limits are 100 MB / 3000 recipes, and that duplicates are skipped on re-upload. These are exactly the operational facts the readOnly/destructive hints cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the link mechanism, then limits, then triggers, then follow-up — a sensible order. It is dense and long-jammed into a few run-on sentences (limits, dedup, and expiry all in one breath), but nearly every clause carries information an agent would otherwise guess wrong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite zero parameters, the description covers the full interaction: supported formats, what gets created, what the user must do with the link, size caps, dedup behavior, and the natural next step. With an output schema present it rightly does not describe the response payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the description makes the interaction model clear — the file is dropped via the returned link rather than passed as an argument, so there is nothing for an agent to supply. No further parameter detail is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: returns a one-time upload link for recipe-app exports, naming the exact file formats (Paprika, Mela, Crouton, schema.org zip). It also explicitly distinguishes itself from upload_recipe, so an agent can tell the bulk and single paths apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ("import my Paprika recipes", "bring my recipe collection over") plus a quantitative rule ("more than a few recipes to add at once") and names the competing tool: "upload_recipe stays the tool for a single recipe." It even prescribes the post-import follow-up (list_saved with the new cookbook).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_to_householdInvite someone to the householdAInspect
Create a one-time link that lets another ask.recipes user join the user's household, for "add my wife to my household", "share my pantry with Sam", "connect my partner's account". The first call creates the household, so pass my_name (what the family calls the user) and optionally household_name. The person opens the link, enters their name and email, confirms a 6-digit code and is in; an account is created for them when they have none. On joining, their pantry merges into the shared one and their cooking diary becomes the household's. Give the user the link as is to forward; it works once and expires in a day. Up to 6 members, and an account can be in one household at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| my_name | No | what the household calls the user, e.g. 'Dad' or 'Ana'; required the first time, when the household is created, and shown to the person invited | |
| household_name | No | a name for the household when creating it, e.g. 'Casa Silva' or 'Home'; defaults to Home |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| join_url | Yes | one-time link the user sends to the person joining; works once and expires in a day |
| household | Yes | |
| expires_in_hours | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the one-time link semantics, 24-hour expiry, 6-member cap, one-household-per-account limit, automatic account creation for invitees, and the side effects of joining (pantry merge, cooking diary becoming the household's). These are exactly the behavioral traits an agent needs before invoking a non-idempotent mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then constraints and flow in a logical order. The three quoted example utterances are somewhat redundant and could be trimmed, but no sentence is wasted overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained. The description covers all the operational constraints an agent needs: invite flow, expiry, member cap, side effects, and account creation, leaving no significant gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description restates that my_name is what the family calls the user and that it is required when the household is created, adding only marginal meaning beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a one-time link that lets another ask.recipes user join the user's household.' It is clearly distinguishable from siblings like get_household, update_household, and remove_from_household, and the example utterances reinforce the intended use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete when-to-use signals through example utterances and explains the first-call-creates-household behavior, including when my_name is needed. It does not explicitly exclude alternatives (e.g., update_household for renaming, get_household for viewing), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_householdLeave the householdADestructiveIdempotentInspect
Take the user out of their household, for "leave the household", "stop sharing my kitchen". The shared pantry, diary entries and shared cookbooks stay with the household; the user starts again with an empty pantry and keeps their own diary entries. When the last member leaves, the household is gone. Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| left | Yes | name of the household the user left |
| note | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and idempotent=true, and the description adds substantive consequence detail beyond them: shared pantry, diary entries and shared cookbooks stay with the household, the departing user gets an empty pantry but keeps their own diary entries, and the household is dissolved when the last member leaves. It also correctly adds a user-confirmation requirement for a destructive zero-param call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Data-consequence information is front-loaded (what stays, what is lost, what happens to the household) with no filler sentences. The quoted intent list ("for 'leave the household', 'stop sharing my kitchen'") is slightly awkward in phrasing but earns its place as a routing trigger.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover safety and idempotency, an output schema exists, and the description covers data loss, household dissolution, and the confirmation requirement — everything needed to call correctly. The only missing piece is disambiguation from the remove_from_household sibling in a 32-tool set where both mutate membership.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate; the baseline applies. No parameter text is needed or present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource ("take the user out of their household") with concrete user-intent phrasings ("stop sharing my kitchen"). It does not distinguish itself from the sibling remove_from_household, which is the most plausible confusion (leaving oneself vs. removing someone else).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit intent triggers that select this tool and a hard prerequisite ("Confirm with the user before calling"). It lacks an explicit when-not or a pointer to remove_from_household as the alternative, which is the one routing decision an agent could get wrong here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cookbooksList cookbooksARead-onlyIdempotentInspect
List the user's cookbooks with how many recipes each holds, for "what cookbooks do I have", or before saving when the user says "the usual one". Every user has a default cookbook; the others are named by the user, e.g. Stews, BBQ, Christmas. Cookbooks shared with the household carry shared=true and appear for every member.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| cookbooks | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, so the safety profile is covered. The description adds domain behavior an agent cannot infer: every user has a default cookbook, others are user-named, and shared cookbooks surface for all household members.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: what it returns, when to call it, then domain context about defaults and sharing. Purpose is front-loaded and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-parameter read tool with an output schema, rich annotations, and a description that explains the result set's structure and household visibility. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description goes slightly further by characterizing the returned fields (recipe counts, shared flag, default cookbook), though most of that is also carried by the output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the user's cookbooks') and adds the payload detail 'with how many recipes each holds'. This distinguishes it cleanly from recipe-level siblings like get_recipe and list_saved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Two concrete triggers are given: answering 'what cookbooks do I have' and resolving 'the usual one' before a save. It doesn't name a competing tool or a when-not case (e.g. vs create_cookbook/update_cookbook), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cookidoo_recipesList the user's own Cookidoo recipesARead-onlyIdempotentInspect
List the recipes the user created on Cookidoo, including ones sent there by send_to_thermomix, for "what is on my Bimby", "my Thermomix recipes", "read recipes from my Cookidoo". This is the Bimby side; list_saved is the ask.recipes side. Returns Cookidoo ids to pass to import_cookidoo_recipe. Names and links only until the user imports one.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| recipes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and no destructive behavior, but the description adds useful operational context: it returns Cookidoo ids and that only names and links are available until import. That is meaningful behavior beyond structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, then user-intent examples, sibling differentiation, and return-value guidance. Every sentence contributes directly to selection or invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, rich annotations, and an output schema, the description supplies everything needed: when to choose it, what it returns, and how to use those return values. No important selection or invocation context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline for no parameters is 4, and the description appropriately does not invent parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list the user's own Cookidoo recipes, including ones sent via send_to_thermomix. It explicitly distinguishes itself from list_saved by naming the 'Bimby side' versus the 'ask.recipes side'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user phrasings for when to use it, names the alternative list_saved and its domain, and explains the next step: pass returned Cookidoo ids to import_cookidoo_recipe. The routing guidance is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_savedList saved recipesARead-onlyIdempotentInspect
List the recipes the user saved in ask.recipes, for "my recipes", "what did I save", "what's in my Stews cookbook". Each recipe lists the cookbooks it is in and the user's note; pass cookbook to see one cookbook only. Each also carries when it was last cooked and how many times, when mark_cooked recorded it. Not the Thermomix / Bimby / Cookidoo side; that is list_cookidoo_recipes.
| Name | Required | Description | Default |
|---|---|---|---|
| cookbook | No | only recipes in this cookbook, by name; leave empty for every saved recipe, each listed with the cookbooks it is in |
Output Schema
| Name | Required | Description |
|---|---|---|
| recipes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds useful context beyond that: each entry includes its cookbooks, the user's note, and last-cooked time/count as recorded by mark_cooked, which tells the agent what fields are meaningful and where they come from.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose and immediately followed by the sibling exclusion. Slightly dense with quoted example phrases, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A one-optional-parameter read tool with an output schema; the description covers purpose, triggering intents, filtering, sibling disambiguation and the provenance of the returned metadata. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter already documents name-based cookbook filtering. The description restates the same behavior ("pass cookbook to see one cookbook only") without adding syntax, matching rules, or edge cases, so the schema does the heavy lifting — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the recipes the user saved") plus the owning surface (ask.recipes), and explicitly excludes the nearest sibling ("Not the Thermomix / Bimby / Cookidoo side; that is list_cookidoo_recipes"). An agent can distinguish it from list_cookidoo_recipes and list_cookbooks 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user phrasings that trigger it ("my recipes", "what did I save", "what's in my Stews cookbook") and states the filtering condition for the one parameter. It also names the alternative tool to use for Cookidoo content, so both when-to-use and when-not-to-use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_cookedMark a recipe as cookedADestructiveInspect
Record that the user cooked a recipe, for "we made that tonight", "cooked the curry yesterday", "the lasagna was a hit". One entry per time it was cooked, with the day and an optional note on how it went. Pass date when the user names a day other than today. The recipe need not be saved. Pass rating when the user gave a verdict in stars or words, so the cook and the rating land in one call. Returns the entry plus how many times and when this recipe was last cooked.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id that was cooked | |
| date | No | the day it was cooked as YYYY-MM-DD in the user's calendar, e.g. yesterday's date for 'we made it last night'; empty means today | |
| note | No | what the user said about how it went, e.g. 'kids loved it, double the sauce next time'; at most 200 characters | |
| rating | No | the user's stars for the recipe, 1 to 5, when they gave a verdict: 'it was a hit' is 5, 'fine' is 3, 'never again' is 1; replaces their earlier rating of this recipe; leave out when they said nothing about how it was |
Output Schema
| Name | Required | Description |
|---|---|---|
| entry | Yes | |
| last_cooked | No | |
| times_cooked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description justifies these by explaining that each call creates a new entry rather than toggling a flag, and adds that the recipe need not be saved first. It also discloses the return payload (entry plus cook count and last-cooked date). It does not surface that a supplied rating replaces the earlier one, which is the concrete destructive effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then param rules, then return behavior. The quoted user utterances are dense with routing value rather than filler. Slightly longer than strictly necessary, with the third example ("the lasagna was a hit") adding little beyond the first two.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param mutation with full schema coverage, annotations, and an output schema, the description covers what to record, when, and what comes back. Minor residual gaps are overwrite semantics for rating and behavior on an unknown id, neither of which is essential to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns the extra point by adding invocation rules rather than restating types: when to supply date versus default to today, and when a rating should be included at all. Note size limits and rating scale live in the schema, appropriately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Record that the user cooked a recipe") plus the unit of record ("One entry per time it was cooked"), which separates it from rate_recipe and cooked_history without opening either schema. The example utterances anchor the intent unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers ("we made that tonight", "cooked the curry yesterday") and routing rules for the optional params: pass date only when a day other than today is named, pass rating when a verdict was given "so the cook and the rating land in one call". It implies rate_recipe should not be called separately for the same event but never names that sibling explicitly, which is the one missing piece.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rate_recipeRate a recipeADestructiveIdempotentInspect
Record the user's stars for a recipe, 1 to 5, for "five stars", "that one was a 3", "best curry we've had", with an optional note on why. One rating per user and recipe; rating again replaces it. The stars join the recipe's rating: the rating and rating_count every tool returns average the source site's ratings and ask.recipes users' stars together, and the user's own stars come back as my_rating. When the user also says they cooked it, mark_cooked with rating does both in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id to rate | |
| note | No | why, in the user's words, e.g. 'too sweet, halve the sugar'; at most 200 characters; empty keeps the note from the earlier rating | |
| stars | Yes | 1 to 5 stars; replaces the user's earlier rating of this recipe |
Output Schema
| Name | Required | Description |
|---|---|---|
| recipe | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the upsert semantics (one rating per user and recipe, rating again replaces it), how the user's stars feed the aggregate rating and rating_count returned by every tool, and that the user's own stars surface as my_rating. This makes the destructive/replacement behavior concrete rather than leaving the agent to infer it from destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The intent and trigger phrases are front-loaded and every sentence carries information, but the middle sentence covering aggregation, rating_count, and my_rating is dense and slightly overlong. It is efficient overall, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter annotation-covered mutation with an output schema, the description covers the trigger, the write semantics, the replacement behavior, and the cross-tool delegation to mark_cooked. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still adds value by mapping colloquial utterances to the stars parameter and stating the allowed range inline. It also frames the note as an optional "why", giving the parameter a purpose beyond the schema's field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (record stars for a recipe), gives the natural-language phrasings that should trigger it ("five stars", "that one was a 3", "best curry we've had"), and distinguishes it from the sibling mark_cooked. An agent can identify the intent 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule: when the user also says they cooked it, use mark_cooked with rating to do both in one call. That names the alternative and the condition that selects it, which is exactly the guidance an agent needs to choose between the two rating paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_householdRemove someone from the householdADestructiveIdempotentInspect
Take another member out of the user's household by the name get_household lists, for "remove Sam from the household". Only the household's creator can do it; when the creator leaves, the longest-standing member takes over. The removed person keeps their account and their own diary entries; the shared pantry and cookbooks stay. Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | the member's name as get_household lists it |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| note | No | |
| members | Yes | |
| in_household | Yes | false when this account shares a kitchen with nobody yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: it discloses the authorization constraint (only the creator can do it), the succession rule (longest-standing member takes over when the creator leaves), and precisely what is preserved (account, diary entries, shared pantry and cookbooks stay). This is exactly the destructive-operation context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope, then adds constraints and consequences in compact clauses. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description supplies the remaining critical context – permissions, succession behavior, and what survives the removal. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes the name parameter identically, so the description doesn't expand parameter meaning much beyond restating that it comes from get_household. Baseline 3 is appropriate when the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (another member of the user's household), and the word 'another' distinguishes it from a self-removal like leave_household. An agent can differentiate it from sibling household tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent how to obtain the required name ('by the name get_household lists') and to confirm with the user before calling. It doesn't explicitly contrast against leave_household or invite_to_household, so routing to alternatives is implied rather than spelled out, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_pantryRemove from the pantryADestructiveIdempotentInspect
Take items out of the pantry for "used the last onions", "we're out of milk", or empty it with all=true when the user lists what is in the kitchen now, then add_to_pantry. Names are matched loosely. Returns the whole pantry after the change.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | true to empty the pantry, for 'here is what's in my kitchen now' before add_to_pantry | |
| remove | No | item names to take out, for 'used the last onions', 'we're out of milk' |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so safety is covered. The description adds genuinely new behavioral context: loose name matching and that the whole pantry is returned after the change. It stops short of saying what happens to unmatched names, which slightly limits it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences cover purpose, when to use, matching behavior, and return value with no filler. The quoted examples slightly duplicate the schema's own descriptions, a small redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full param coverage, the description need only carry intent and behavior. It supplies the triggering scenarios, the destructive/loose-match semantics, the paired follow-up call, and the return shape, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds value by framing all=true as an ordered operation followed by add_to_pantry and by tying remove to real user phrasings, clarifying the intent behind each parameter rather than just restating types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Take items out of the pantry") plus the full-empty variant (all=true). The mention of add_to_pantry and the pantry-return behavior distinguishes it clearly from sibling pantry tools like get_pantry and add_to_pantry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering utterances ("used the last onions", "we're out of milk") and an explicit alternative workflow: use all=true when the user lists the current kitchen contents, then follow with add_to_pantry. Both when-to-use and the paired call are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_recipeSave a recipeADestructiveIdempotentInspect
Save a recipe to one of the user's cookbooks, for "save that one", "keep this", "put it in my BBQ cookbook". Pass cookbook when the user names one; it is created on first use. Without one the recipe goes to the default cookbook. A recipe can sit in several cookbooks; saving it again to the same one only updates the note.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id to save | |
| note | No | the user's own note on this recipe in this cookbook, e.g. 'half the chilli, kids loved it' | |
| cookbook | No | cookbook to save into, by name, e.g. 'Stews' or 'Christmas'; created when it does not exist yet; leave empty for the default cookbook |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| saved | Yes | |
| cookbook | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the create-on-first-use side effect for cookbooks, the default-cookbook fallback, that a recipe may live in several cookbooks, and that a repeat save only updates the note. That last point softens the destructiveHint=true annotation but does not contradict it outright, since overwriting a note is still a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then defaults, then edge-case semantics. The quoted utterance examples are mildly verbose but earn their place as routing cues.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description only needs to cover side effects and defaults, which it does. It leaves unstated what happens to an existing note when note is omitted on a re-save.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents all three parameters, so the baseline is 3; the description still adds real meaning by clarifying that the note is scoped per cookbook and is what gets replaced on a repeated save, and by tying cookbook names to auto-creation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a recipe to one of the user's cookbooks') plus the scope of the target container, which cleanly separates it from siblings like unsave_recipe, list_saved, and create_cookbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-utterance triggers ('save that one', 'put it in my BBQ cookbook') and a rule for when to pass cookbook versus omit it. It does not explicitly name an alternative tool or a when-not-to-use case, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cookidooSearch the user's CookidooARead-onlyIdempotentInspect
Search Cookidoo's catalogue of Thermomix recipes through the user's connected account, for "find a Bimby recipe for", "what does Cookidoo have for", "search my Bimby for". For the user's own recipes use list_cookidoo_recipes. Returns Cookidoo ids to pass to import_cookidoo_recipe. Cookidoo recipes are the user's subscription content: never quote them beyond name and link unless the user imports them.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | max results, default 10, max 50 | |
| query | Yes | dish or ingredients to look for in Cookidoo's own recipes, in the user's Cookidoo language |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | |
| total | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavioral context: results are subscription content with a hard quoting restriction (name and link only unless imported), and the return value is Cookidoo ids meant for import. This is policy/constraint information the schema and annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose and audience first, then routing to the sibling, then output/next-step and the licensing constraint. No filler, and the most decision-relevant content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema handles return shape and annotations handle safety, so the description only needs to cover routing, downstream use, and the quoting restriction — all of which it does. Nothing an agent needs to call or act on this result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, including the default/max for limit and the language expectation for query. The description adds no further syntax or format detail, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — search Cookidoo's catalogue of Thermomix recipes through the user's connected account — and explicitly demarcates it from the sibling list_cookidoo_recipes for the user's own recipes. The agent can pick between the two Cookidoo search/list tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete user-utterance triggers ("find a Bimby recipe for", "search my Bimby for"), names the alternative for own recipes, and states the downstream step (pass returned ids to import_cookidoo_recipe). When-to-use and what-to-do-next are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_recipesSearch recipesARead-onlyIdempotentInspect
Search recipes for a what-to-cook or what-to-eat question: dinner tonight, cooking for guests, a quick weeknight meal, a protein or calorie target, macros for a cut or a bulk, meal prep for the week. Every result links to its source. rating and rating_count average the source site's ratings with ask.recipes users' stars; my_rating is the user's own. Filters by time, rating, review count, diet (vegetarian, vegan, gluten_free, dairy_free, nut_free, judged from the ingredient list) and nutrition (calories, protein, fat, carbs, sugar, fiber per serving as reported by the source). A nutrition filter only returns recipes whose yield is stated in servings, so the numbers are per serving; recipes without nutrition data are excluded. Results rank by how closely they match the query; min_rating and min_reviews cut rated recipes below a threshold only when passed, and never drop a recipe nobody has rated or a private upload. exclude_ingredients leaves out recipes using any of the ingredients named, for building a week without repeats. main_protein keeps recipes whose main protein is one of the values passed, for week rules like one chicken, two fish and three vegetarian dinners; every result carries main_protein. The user's profile, once saved with update_profile, applies on top: allergens and dislikes are always excluded, its diets are always on, and its time budget is the default when max_total_minutes is not passed; pass max_total_minutes=-1 to lift it. When people are saved on the profile, who names those eating tonight, by name or by role such as adults or kids, and only their allergens and dislikes apply, for "the kids aren't home"; empty means everyone. ask_user, when present, says no profile is saved yet and what to offer. check, present when the profile has allergens, reminds you that exclusions match whole words and a sauce or spice mix can hide one; read the ingredients with get_recipe before recommending.
| Name | Required | Description | Default |
|---|---|---|---|
| who | No | who is eating, by the names or roles saved as people on the profile, e.g. ['Dad','Ana'] or ['adults'] when the kids are out, ['kids'] when only they eat; only those people's allergens and dislikes apply on top of the household's; leave empty for everyone | |
| site | No | restrict to one source site slug, e.g. budgetbytes | |
| limit | No | max results, default 10, max 50 | |
| query | Yes | the dish or main ingredients, e.g. 'overnight oats' or 'chicken curry'; express time, rating and nutrition limits with the filters rather than in words | |
| vegan | No | only vegan recipes: vegetarian and no eggs, dairy or honey | |
| feeding | No | how many people are eating, e.g. 10 for a dinner party; from six up, dishes cooked in one vessel (stews, braises, tray bakes, casseroles, soups, roasts) rank ahead of dishes cooked per portion (steaks, burgers, pancakes, stir-fries); nothing is excluded | |
| nut_free | No | only recipes without tree nuts or peanuts; coconut counts as nut-free | |
| max_fat_g | No | maximum grams of fat per serving | |
| dairy_free | No | only recipes without milk, butter, cheese, cream or yogurt | |
| min_rating | No | only recipes rated at least this many stars, e.g. 4.5, source ratings and ask.recipes stars averaged together; recipes nobody has rated yet and private uploads stay in; off unless passed | |
| vegetarian | No | only vegetarian recipes: no meat, poultry, fish, seafood or gelatin in the ingredients | |
| gluten_free | No | only recipes without wheat, barley, rye, oats or products made from them | |
| max_carbs_g | No | maximum grams of carbohydrates per serving | |
| max_sugar_g | No | maximum grams of sugar per serving | |
| min_fiber_g | No | minimum grams of fiber per serving | |
| min_reviews | No | only recipes with at least this many ratings, source and ask.recipes together, e.g. 25; recipes with no rating at all and private uploads stay in; off unless passed | |
| main_protein | No | only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, shrimp (with prawns), seafood (other shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','shrimp','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish | |
| max_calories | No | only recipes with at most this many calories per serving, e.g. 300 | |
| min_calories | No | only recipes with at least this many calories per serving | |
| min_protein_g | No | minimum grams of protein per serving, e.g. 10 | |
| batch_friendly | No | true to leave out dishes cooked per portion, for a crowd; recipes not yet classified stay in | |
| max_total_minutes | No | only recipes taking at most this many minutes total | |
| exclude_ingredients | No | ingredients to leave out for this search, whole-word match on the ingredient list, e.g. ['chicken','brussels sprouts'] to avoid repeating what the week already has; nuts, gluten and dairy as a word apply the matching diet filter; the profile's allergens and dislikes stay excluded on top |
Output Schema
| Name | Required | Description |
|---|---|---|
| check | No | |
| recipes | Yes | |
| ask_user | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent, and the description adds substantial beyond-schema behavior: profile defaults applied on top unless overridden, ask_user signaling no saved profile, check flag warning that exclusions match whole words and sauces can hide allergens, and instructions to verify with get_recipe. This is rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and use cases well, and every clause conveys actionable behavior. It is a dense single-block paragraph run-on; a little structure or trimming of filter enumerations already in the schema would sharpen it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter search tool with an output schema, it covers the essentials: profile interaction, exclusions, ranking, and the allergen check reminder. Return values need not be explained since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds cross-parameter meaning beyond the schema — that main_protein is judged from ingredients (stock doesn't count), exclude_ingredients is whole-word and maps to diet filters, and main_protein values can build week rules. It largely restates many params already fully documented, so it doesn't exceed a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and frames the concrete use cases (dinner tonight, macros for a cut, meal prep). It clearly says what it returns (recipes linking to source, rating semantics). Sibling differentiation is only implicit — it doesn't name find_by_ingredients or search_cookidoo — so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use framing plus when-not/exception behavior: min_rating/min_reviews never drop unrated or private uploads, nutrition filters exclude recipes without serving-yield data, max_total_minutes=-1 lifts the profile default, and who='' means everyone. Alternatives and edge conditions are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_to_thermomixSend a recipe to the ThermomixAInspect
Send one recipe to the user's Cookidoo account as a private created recipe, so it shows on their Thermomix / Bimby with guided cooking. For "send this to my Thermomix", "put it on my Bimby", "cook this on the TM6". First get_recipe, then rewrite the recipe for the Cookidoo account: name, ingredients and steps in the account's language (connect_cookidoo returns it), amounts in grams and millilitres since the Thermomix weighs everything, steps as Thermomix steps with time, temperature, speed, direction or mode. Pass name, ingredients and steps; show the user the rewritten steps before sending. Each call creates a new Cookidoo recipe. Thermomix step settings, for rewriting a recipe before send_to_thermomix: each step is one action with at most one setting block. Times are seconds. Chop: 5-10 s / speed 5-7. Sauté onion and garlic: 3-5 min / 120 °C / speed 1. Simmer sauces and soups: 15-25 min / 100 °C / speed 1, with direction CCW when pieces must stay whole. Blend soup: 1 min / speed 10. Whip cream: speed 3.5 with the butterfly, write that in the text. Melt chocolate: 50 °C / speed 2. Knead bread: mode dough for 2-3 min. Steam: mode steaming, or varoma temperature with the Varoma dish. Rice: mode rice_cooker. Modes depend on the model connect_cookidoo reports: a TM31 has none, a TM5 only dough and turbo, TM6 and TM7 all of them; on an older model write the step with time, temperature and speed instead, and the server refuses a mode the machine lacks. Keep the ingredient amounts in the step text so the screen shows them. Steps without settings are fine for prep done outside the machine.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id from a search, get_recipe, list_saved or upload | |
| name | No | recipe name in the Cookidoo account's language; the stored name is used when omitted | |
| hints | No | optional tips shown under the recipe on Cookidoo | |
| steps | No | the recipe rewritten as Thermomix steps with settings, in the account's language; when omitted the recipe's plain steps are sent without settings | |
| machine | No | TM31, TM5, TM6 or TM7, only when the user names a paired machine other than the connected one | |
| ingredients | No | one ingredient per entry in the account's language with metric amounts in g or ml, e.g. '200 g cebola, em pedaços'; the stored list is sent verbatim when omitted |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| name | Yes | |
| cookidoo_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds key behavior beyond the annotations: every call creates a new Cookidoo recipe (consistent with idempotentHint=false), the account language comes from connect_cookidoo, and the server refuses a mode the machine lacks. It does not cover failure modes such as missing account connection or partial-send behavior, so it falls short of the richest behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and trigger phrases are front-loaded, but the description is a single dense paragraph mixing workflow instructions with a long reference catalogue of Thermomix settings. The catalogue is useful but verbose and poorly delimited, making it harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers the workflow, prerequisite account context, language handling, machine-model constraints, rewriting rules, and the user-confirmation step. An agent has enough information to invoke it correctly in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes well beyond the schema: it explains what name, ingredients and steps should contain (account language, grams and millilitres, one action per step), how machine interacts with mode support, and why ingredient amounts must stay in step text. It also clarifies the model-dependent limitations of the mode parameter, which the schema only lists as an enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (send), resource (one recipe), and destination (the user's Cookidoo account as a private created recipe) and explains the visible outcome (shows on the Thermomix/Bimby with guided cooking). This clearly separates it from sibling tools like save_recipe or share_recipe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the exact user phrasings that should trigger this tool and gives an explicit ordering: first get_recipe, then rewrite, show the user the rewritten steps before sending. It also explains the fallback for older machines that lack guided modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unsave_recipeRemove a saved recipeADestructiveIdempotentInspect
Take a recipe out of the user's cookbooks, for "remove that from my saved", "take it out of Christmas". With cookbook set it leaves only that cookbook; without it the recipe is removed from every cookbook. The recipe itself stays searchable.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | recipe id to take out | |
| cookbook | No | take it out of this cookbook only; leave empty to remove it from every cookbook |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| removed | Yes | |
| cookbook | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds meaningful context beyond that: removal only affects cookbook membership, and the underlying recipe remains searchable. It doesn't discuss reversibility or permissions, but adds real behavioral value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scope, then adds a useful clarifying sentence. The quoted example phrases are a bit informal but earn their place as trigger cues; no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full parameter descriptions, and annotations covering safety, the remaining description gap is small. It covers the key ambiguity (scope of removal and non-destruction of the recipe), though it could mention prerequisites such as the cookbook existing or recipe ownership.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter meanings are already documented. The description restates the cookbook parameter's semantics in nearly the same terms as the schema ('With cookbook set it leaves only that cookbook; without it the recipe is removed from every cookbook'), adding clarity but little new information beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Take a recipe out of the user's cookbooks') and makes the scope explicit in both modes. It is clearly the inverse of save_recipe and cannot be confused with delete_cookbook, especially since it notes the recipe itself is untouched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides user-utterance triggers ('remove that from my saved', 'take it out of Christmas') and explains the cookbook-scoped vs. global behavior. It does not explicitly contrast with siblings like delete_cookbook or list_saved, but the context is clear enough for confident selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_cookbookRename or describe a cookbookADestructiveIdempotentInspect
Rename a cookbook, change its description, or share it with the household, for "call it Sunday Roasts instead" or "share my Christmas cookbook with the family". Recipes stay where they are. The default cookbook stays personal.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | new name; leave empty to keep it | |
| shared | No | true moves the cookbook to the household so every member sees it, false makes it personal to this user again; leave out to keep it as is | |
| cookbook | Yes | current name of the cookbook to change | |
| description | No | new description; leave empty to keep it |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| shared | No | |
| default | No | |
| description | No | |
| recipe_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations marking this as a non-read-only, destructive, idempotent mutation, the description adds real non-annotated facts: recipes remain in place and the default cookbook stays personal. It does not explain the destructiveHint=true — nothing about what a rename might break (e.g., references, name collisions) or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the actions front-loaded and example phrasings that double as usage cues. Nothing is padded, though the quoted examples occupy space that a single terse clause could have covered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation with full schema coverage, existing annotations, and an output schema, this covers the essentials: what changes, what does not, and one important constraint. The main residual gap is the unexplained destructive flag and any rename-collision behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already explains optional-vs-keep semantics for name, description, and shared. The description only implicitly maps its three operations to those parameters, adding little syntax or constraint detail beyond the 'default cookbook stays personal' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names three specific verbs (rename, change description, share) against one resource (cookbook), so it is immediately distinguishable from create_cookbook and delete_cookbook in the sibling list. The quoted example intents ('call it Sunday Roasts instead', 'share my Christmas cookbook') make the operation concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is clear through the two example intents, and the closing sentences set scope boundaries (recipes are untouched, the default cookbook cannot be shared). It never explicitly names an alternative tool or says when not to use it, which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_householdRename the household or the user in itAIdempotentInspect
Rename the household or change what it calls the user, for "call our household Casa Silva", "in the household I'm Mum, not Ana". Names are what who on a search and cooked_by in the diary use.
| Name | Required | Description | Default |
|---|---|---|---|
| my_name | No | new name for the user inside the household; leave empty to keep it | |
| household_name | No | new name for the household; leave empty to keep it |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| note | No | |
| members | Yes | |
| in_household | Yes | false when this account shares a kitchen with nobody yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-read-only, idempotent, non-destructive, closed-world operation. The description adds valuable behavioral context by explaining that the names affect search results and diary cooked_by labels, which is a downstream consequence not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single, compact sentence with the core action front-loaded and examples embedded efficiently. The final clause about search and cooked_by is slightly awkwardly worded but still earns its place by explaining downstream impact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover safety and idempotency, so the description need not explain return values. It supplies purpose, examples, and downstream naming effects; only minor details such as permission requirements or whether both names can be updated together are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters already document that empty values keep the existing name. The description adds meaning about the effect of names but does not provide additional per-parameter syntax or constraints beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and two resources: renaming the household and changing the household-specific name for the user. The example utterances make the purpose concrete, though it does not explicitly distinguish this from the sibling update_profile tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Concrete example phrases such as "call our household Casa Silva" and "in the household I'm Mum, not Ana" map directly to the two parameters and clearly indicate when to use the tool. It lacks explicit exclusions or comparison to alternatives like update_profile, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_profileRemember how the household eatsADestructiveIdempotentInspect
Save what the user says about how they eat so it holds across sessions and clients: "we don't eat cilantro" is add_dislikes, "my daughter can't have berries or tomatoes" is add_allergens, "we love meat" is add_likes, "weeknights are 30 minutes max" is time_budget_minutes, "we're five" is household_size, "grams please" is units=metric. Only the fields passed change; lists are added to or removed from, never replaced, so nothing already saved is lost. Pass 0 for a number to clear it. Something one person cannot or will not eat goes on that person under people, so a search with who can leave it out when they are not at the table; what everyone avoids goes on the household lists. Give each person a role (kid, adult, parent, guest) when the user says it, so who can name a group. From then on allergens and dislikes are excluded from every search as whole words, vegetarian, vegan, gluten_free, dairy_free and nut_free diets stay on, and the time budget is the default time limit. Returns the whole profile after the change; read it back to the user in one short list. When allergens were added it carries a note to pass on once: exclusions match whole words, so for a serious allergy the user should still read ingredients and labels themselves.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | metric or us, the measurements the user wants to read; get_recipe converts amounts and oven temperatures to it; empty string clears it | |
| people | No | people in the household with a role and what applies to them alone: 'Sam, our kid, can't have berries' is people=[{name:'Sam', role:'kid', add_allergens:['berries']}]; what everyone avoids goes on the household lists instead. Each entry changes only that person and only the fields passed | |
| add_diets | No | diets followed; vegetarian, vegan, gluten_free, dairy_free and nut_free switch the matching filter on for every search, any other value is stored for you to read | |
| add_likes | No | ingredients or dishes the household loves, e.g. ['meat','pasta','spicy food']; nothing is filtered on them, read them to steer what you suggest | |
| add_cuisines | No | cuisines the household likes, e.g. ['italian','mexican','thai']; stored for you to read | |
| add_dislikes | No | ingredients the household avoids by taste, e.g. ['cilantro','mushrooms']; excluded from every search as whole words | |
| remove_diets | No | ||
| remove_likes | No | ||
| add_allergens | No | ingredients nobody in the household may eat, medical or otherwise, one per entry, e.g. ['peanuts','berries','tomatoes']; excluded from every search as whole words | |
| fat_g_per_day | No | daily fat goal in grams; 0 clears it | |
| remove_people | No | names to take off the profile | |
| household_size | No | how many people usually eat, e.g. 5 for two adults and three children; 0 clears it | |
| carbs_g_per_day | No | daily carbohydrate goal in grams; 0 clears it | |
| remove_cuisines | No | ||
| remove_dislikes | No | ||
| calories_per_day | No | daily calorie goal when the user tracks one; 0 clears it | |
| remove_allergens | No | ||
| protein_g_per_day | No | daily protein goal in grams; 0 clears it | |
| time_budget_minutes | No | most minutes a usual dinner may take in total; becomes the default time limit on every search; 0 clears it |
Output Schema
| Name | Required | Description |
|---|---|---|
| set | Yes | false when nothing has been saved yet |
| note | No | |
| diets | Yes | |
| likes | Yes | |
| units | No | |
| people | Yes | |
| cuisines | Yes | |
| dislikes | Yes | |
| allergens | Yes | |
| household | No | present when the user shares a kitchen with other ask.recipes accounts; their allergens and dislikes apply to searches for everyone |
| fat_g_per_day | No | |
| household_size | No | |
| carbs_g_per_day | No | |
| calories_per_day | No | |
| protein_g_per_day | No | |
| time_budget_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses additive list semantics ('added to or removed from, never replaced'), that 0 clears numeric fields, the downstream effects on every later search (whole-word exclusion, diet filters, default time limit), and the one-time allergy caveat to relay. Remaining gap: it never says whose profile is written when a household is shared (invite_to_household/update_household exist as siblings), so precedence between members' units and diets is unstated; the 'nothing already saved is lost' phrasing also sits slightly awkwardly with destructiveHint=true, though the explicit remove_* fields resolve that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the highest-value content (the example-to-field mapping) and dense rather than padded; length is justified by 19 parameters. The single-paragraph block makes the allergy safety note and the return-value instruction easy to skim past, which costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter mutation tool it covers what matters: which fields change, how clearing works, what happens downstream, and what comes back ('returns the whole profile after the change; read it back in one short list') even though an output schema exists. Nothing needed to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 74% schema coverage the schema already documents most fields, yet the description adds real value: worked examples for likes/dislikes/allergens, the 0-clears convention for all numeric goals, and the rule that a person's role makes them addressable by group in who. It does not, however, explain the four remove_* fields that have no schema description, nor fat/carbs/calories/protein interaction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Save what the user says about how they eat') with the scope stated immediately: persistence across sessions and clients. It is clearly distinguished from read-side siblings (get_profile, get_household) and from update_household by naming exactly which household attributes it owns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit utterance-to-field routing ("we don't eat cilantro" → add_dislikes, "my daughter can't have berries" → people[].add_allergens, "grams please" → units=metric), plus the decision rule for household lists vs per-person lists. An agent can map free-form user speech to parameters without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_recipeUpload a private recipeAInspect
Add a recipe the user supplies themselves: pasted in, dictated, a family recipe they want kept, or a web page they point at. For a web page, pass the page's raw HTML or its JSON-LD as markup together with source_url; the server extracts the facts. Each call creates a new private recipe, visible only to this user in searches and saves.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | recipe name; may be left empty when markup carries the recipe | |
| yield | No | ||
| markup | No | for a recipe from a web page: the page's raw HTML, or just its schema.org/Recipe JSON-LD block, as fetched by the agent; the server extracts name, ingredients, steps, times, nutrition and rating from it, so the other fields can stay empty | |
| source_url | No | the web page the recipe came from, if any; kept as attribution on the private copy | |
| description | No | ||
| ingredients | No | one ingredient per entry, with quantities, e.g. '2 cups rolled oats' | |
| instructions | No | one step per entry | |
| total_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, non-idempotent, non-destructive write; the description adds real context: every call creates a NEW private recipe (consistent with idempotentHint=false), it is visible only to this user in searches and saves, and when markup is passed the server extracts name, ingredients, steps, times, nutrition and rating from it. Missing only error/failure behavior and whether duplicates are detected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and followed by the web-page path and the privacy/non-idempotency consequence. Some of the markup explanation duplicates the schema's markup description, but it earns its place because it describes the primary extraction workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation here; the description covers the two distinct input paths, the extraction behavior, and the visibility model. With 8 optional parameters and 63% schema coverage, the three undocumented scalar fields are low-risk name-obvious fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, and the description carries the most consequential semantics: markup can be full HTML or just the JSON-LD block and supersedes the other fields, source_url is kept as attribution, and name may be omitted when markup carries the recipe. yield, description and total_minutes are left to their self-explanatory names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a recipe the user supplies themselves') and enumerates the accepted input modes: pasted, dictated, family recipe, or a web page. It distinguishes this from source-based siblings implicitly by insisting the user supplies the content, but never names add_to_pantry, save_recipe, or import_cookidoo_recipe, so the boundary is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for when this applies: user-supplied text, or a web page where the agent passes raw HTML/JSON-LD in markup along with source_url and lets the server extract facts. It does not explicitly say when NOT to use it (e.g. versus import_cookidoo_recipe for Cookidoo URLs or save_recipe for existing recipes).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
get_recipe1 field changed- added
Output schema / properties / saved_inAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +}
- Changed
import_cookidoo_recipe1 field changed- added
Output schema / properties / saved_inAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +}
2 tool updates
- Changed
find_by_ingredients1 field changed- changed
Input schema / properties / main_protein / descriptionPrevious value: -"only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, seafood (shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish"New value: +"only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, shrimp (with prawns), seafood (other shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','shrimp','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish"
- Changed
search_recipes1 field changed- changed
Input schema / properties / main_protein / descriptionPrevious value: -"only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, seafood (shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish"New value: +"only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, shrimp (with prawns), seafood (other shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','shrimp','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish"
2 tool updates
- Changed
find_by_ingredients2 fields changed- changed
Input schema / properties / min_rating / descriptionPrevious value: -"only recipes rated at least this many stars, source ratings and ask.recipes stars averaged together; off unless passed"New value: +"only recipes rated at least this many stars, source ratings and ask.recipes stars averaged together; recipes nobody has rated yet and private uploads stay in; off unless passed" - changed
Input schema / properties / min_reviews / descriptionPrevious value: -"only recipes with at least this many ratings, source and ask.recipes together; off unless passed"New value: +"only recipes with at least this many ratings, source and ask.recipes together; recipes with no rating at all and private uploads stay in; off unless passed"
- Changed
search_recipes2 fields changed- changed
Input schema / properties / min_rating / descriptionPrevious value: -"only recipes rated at least this many stars, e.g. 4.5, source ratings and ask.recipes stars averaged together; off unless passed"New value: +"only recipes rated at least this many stars, e.g. 4.5, source ratings and ask.recipes stars averaged together; recipes nobody has rated yet and private uploads stay in; off unless passed" - changed
Input schema / properties / min_reviews / descriptionPrevious value: -"only recipes with at least this many ratings, source and ask.recipes together, e.g. 25; off unless passed"New value: +"only recipes with at least this many ratings, source and ask.recipes together, e.g. 25; recipes with no rating at all and private uploads stay in; off unless passed"
12 tool updates
- Changed
cooked_history1 field changed- added
Output schema / properties / entries / items / properties / cooked_byAdded value: +{ + "type": "string" +}
- Changed
create_cookbook2 fields changed- added
Input schema / properties / sharedAdded value: +{ + "description": "true to make it a household cookbook that everyone in the user's household sees and saves into, for 'a cookbook for the whole family'; needs a household", + "type": "boolean" +} - added
Output schema / properties / sharedAdded value: +{ + "type": "boolean" +}
- Added
get_household - Changed
get_profile1 field changed- added
Output schema / properties / householdAdded value: +{ + "description": "present when the user shares a kitchen with other ask.recipes accounts; their allergens and dislikes apply to searches for everyone", + "properties": { + "in_household": { + "description": "false when this account shares a kitchen with nobody yet", + "type": "boolean" + }, + "members": { + "items": { + "properties": { + "creator": { + "description": "the member who created the household; the only one who can remove others", + "type": "boolean" + }, + "joined_on": { + "type": "string" + }, + "name": { + "type": "string" + }, + "you": { + "type": "boolean" + } + }, + "required": [ + "name", + "joined_on" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "in_household", + "members" + ], + "type": [ + "null", + "object" + ] +}
- Added
invite_to_household - Added
leave_household - Changed
list_cookbooks1 field changed- added
Output schema / properties / cookbooks / items / properties / sharedAdded value: +{ + "type": "boolean" +}
- Changed
mark_cooked1 field changed- added
Output schema / properties / entry / properties / cooked_byAdded value: +{ + "type": "string" +}
- Added
remove_from_household - Changed
update_cookbook2 fields changed- added
Input schema / properties / sharedAdded value: +{ + "description": "true moves the cookbook to the household so every member sees it, false makes it personal to this user again; leave out to keep it as is", + "type": [ + "null", + "boolean" + ] +} - added
Output schema / properties / sharedAdded value: +{ + "type": "boolean" +}
- Added
update_household - Changed
update_profile1 field changed- added
Output schema / properties / householdAdded value: +{ + "description": "present when the user shares a kitchen with other ask.recipes accounts; their allergens and dislikes apply to searches for everyone", + "properties": { + "in_household": { + "description": "false when this account shares a kitchen with nobody yet", + "type": "boolean" + }, + "members": { + "items": { + "properties": { + "creator": { + "description": "the member who created the household; the only one who can remove others", + "type": "boolean" + }, + "joined_on": { + "type": "string" + }, + "name": { + "type": "string" + }, + "you": { + "type": "boolean" + } + }, + "required": [ + "name", + "joined_on" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "in_household", + "members" + ], + "type": [ + "null", + "object" + ] +}
3 tool updates
- Changed
get_profile1 field changed- added
Output schema / properties / noteAdded value: +{ + "type": "string" +}
- Added
import_recipes - Changed
update_profile4 fields changed- changed
Input schema / properties / add_allergens / descriptionPrevious value: -"ingredients nobody at the table may eat, medical or otherwise, one per entry, e.g. ['peanuts','berries','tomatoes']; excluded from every search as whole words"New value: +"ingredients nobody in the household may eat, medical or otherwise, one per entry, e.g. ['peanuts','berries','tomatoes']; excluded from every search as whole words" - changed
Input schema / properties / people / descriptionPrevious value: -"people at the table with a role and what applies to them alone: 'Sam, our kid, can't have berries' is people=[{name:'Sam', role:'kid', add_allergens:['berries']}]; what everyone avoids goes on the household lists instead. Each entry changes only that person and only the fields passed"New value: +"people in the household with a role and what applies to them alone: 'Sam, our kid, can't have berries' is people=[{name:'Sam', role:'kid', add_allergens:['berries']}]; what everyone avoids goes on the household lists instead. Each entry changes only that person and only the fields passed" - changed
Input schema / properties / people / items / properties / role / descriptionPrevious value: -"one word for who they are at the table, e.g. 'kid', 'adult', 'parent', 'guest'; who on a search accepts a role as well as a name, so 'the kids are out' is who=['adults']; empty string clears it"New value: +"one word for who they are in the household, e.g. 'kid', 'adult', 'parent', 'guest'; who on a search accepts a role as well as a name, so 'the kids are out' is who=['adults']; empty string clears it" - added
Output schema / properties / noteAdded value: +{ + "type": "string" +}
2 tool updates
- Changed
find_by_ingredients1 field changed- added
Output schema / properties / checkAdded value: +{ + "type": "string" +}
- Changed
search_recipes1 field changed- added
Output schema / properties / checkAdded value: +{ + "type": "string" +}
3 tool updates
- Changed
get_recipe2 fields changed- added
Input schema / properties / unitsAdded value: +{ + "description": "metric or us; converts the ingredient amounts and the temperatures and pan sizes in the steps; defaults to the units saved on the profile, leave empty unless the user asks for the other system this once", + "type": "string" +} - added
Output schema / properties / unitsAdded value: +{ + "type": "string" +}
- Changed
import_cookidoo_recipe1 field changed- added
Output schema / properties / unitsAdded value: +{ + "type": "string" +}
- Changed
update_profile1 field changed- changed
Input schema / properties / units / descriptionPrevious value: -"metric or us, the measurements the user wants to read; empty string clears it"New value: +"metric or us, the measurements the user wants to read; get_recipe converts amounts and oven temperatures to it; empty string clears it"
4 tool updates
- Changed
find_by_ingredients1 field changed- added
Input schema / properties / whoAdded value: +{ + "description": "who is eating, by the names or roles saved as people on the profile, e.g. ['Dad','Ana'] or ['adults'] when the kids are out, ['kids'] when only they eat; only those people's allergens and dislikes apply on top of the household's; leave empty for everyone", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +}
- Changed
get_profile2 fields changed- added
Output schema / properties / peopleAdded value: +{ + "items": { + "properties": { + "allergens": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "dislikes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "likes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "name", + "role", + "allergens", + "dislikes", + "likes" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "set", - "diets", - "allergens", - "dislikes", - "likes", - "cuisines" -]New value: +[ + "set", + "diets", + "allergens", + "dislikes", + "likes", + "cuisines", + "people" +]
- Changed
search_recipes1 field changed- added
Input schema / properties / whoAdded value: +{ + "description": "who is eating, by the names or roles saved as people on the profile, e.g. ['Dad','Ana'] or ['adults'] when the kids are out, ['kids'] when only they eat; only those people's allergens and dislikes apply on top of the household's; leave empty for everyone", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +}
- Changed
update_profile4 fields changed- added
Input schema / properties / peopleAdded value: +{ + "description": "people at the table with a role and what applies to them alone: 'Sam, our kid, can't have berries' is people=[{name:'Sam', role:'kid', add_allergens:['berries']}]; what everyone avoids goes on the household lists instead. Each entry changes only that person and only the fields passed", + "items": { + "additionalProperties": false, + "properties": { + "add_allergens": { + "description": "ingredients this person cannot eat; excluded whenever they are eating", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "add_dislikes": { + "description": "ingredients this person avoids by taste; excluded whenever they are eating", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "add_likes": { + "description": "what this person loves; read, never filtered", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "description": "the person's name as the user says it, e.g. 'Sam' or 'Dad'; matched case-insensitively, created on first use", + "type": "string" + }, + "remove_allergens": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "remove_dislikes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "remove_likes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "role": { + "description": "one word for who they are at the table, e.g. 'kid', 'adult', 'parent', 'guest'; who on a search accepts a role as well as a name, so 'the kids are out' is who=['adults']; empty string clears it", + "type": [ + "null", + "string" + ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - added
Input schema / properties / remove_peopleAdded value: +{ + "description": "names to take off the profile", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / peopleAdded value: +{ + "items": { + "properties": { + "allergens": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "dislikes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "likes": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + } + }, + "required": [ + "name", + "role", + "allergens", + "dislikes", + "likes" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / requiredPrevious value: -[ - "set", - "diets", - "allergens", - "dislikes", - "likes", - "cuisines" -]New value: +[ + "set", + "diets", + "allergens", + "dislikes", + "likes", + "cuisines", + "people" +]
3 tool updates
- Added
get_profile - Changed
search_recipes1 field changed- added
Output schema / properties / ask_userAdded value: +{ + "type": "string" +}
- Added
update_profile
8 tool updates
- Changed
cooked_history2 fields changed- added
Output schema / properties / entries / items / properties / recipe / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / entries / items / properties / recipe / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Changed
find_by_ingredients4 fields changed- changed
Input schema / properties / min_rating / descriptionPrevious value: -"only recipes the source rates at least this many stars; off unless passed"New value: +"only recipes rated at least this many stars, source ratings and ask.recipes stars averaged together; off unless passed" - changed
Input schema / properties / min_reviews / descriptionPrevious value: -"only recipes with at least this many source ratings; off unless passed"New value: +"only recipes with at least this many ratings, source and ask.recipes together; off unless passed" - added
Output schema / properties / matches / items / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / matches / items / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Changed
get_recipe2 fields changed- added
Output schema / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Changed
import_cookidoo_recipe2 fields changed- added
Output schema / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Changed
list_saved2 fields changed- added
Output schema / properties / recipes / items / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / recipes / items / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Changed
mark_cooked3 fields changed- added
Input schema / properties / ratingAdded value: +{ + "description": "the user's stars for the recipe, 1 to 5, when they gave a verdict: 'it was a hit' is 5, 'fine' is 3, 'never again' is 1; replaces their earlier rating of this recipe; leave out when they said nothing about how it was", + "type": "integer" +} - added
Output schema / properties / entry / properties / recipe / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / entry / properties / recipe / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
- Added
rate_recipe - Changed
search_recipes4 fields changed- changed
Input schema / properties / min_rating / descriptionPrevious value: -"only recipes the source rates at least this many stars, e.g. 4.5; off unless passed"New value: +"only recipes rated at least this many stars, e.g. 4.5, source ratings and ask.recipes stars averaged together; off unless passed" - changed
Input schema / properties / min_reviews / descriptionPrevious value: -"only recipes with at least this many source ratings, e.g. 25; off unless passed"New value: +"only recipes with at least this many ratings, source and ask.recipes together, e.g. 25; off unless passed" - added
Output schema / properties / recipes / items / properties / askrecipes_ratingsAdded value: +{ + "type": "integer" +} - added
Output schema / properties / recipes / items / properties / my_ratingAdded value: +{ + "properties": { + "note": { + "type": "string" + }, + "stars": { + "type": "integer" + } + }, + "required": [ + "stars" + ], + "type": [ + "null", + "object" + ] +}
7 tool updates
- Changed
cooked_history1 field changed- added
Output schema / properties / entries / items / properties / recipe / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
find_by_ingredients2 fields changed- added
Input schema / properties / main_proteinAdded value: +{ + "description": "only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, seafood (shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / matches / items / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
get_recipe1 field changed- added
Output schema / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
import_cookidoo_recipe1 field changed- added
Output schema / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
list_saved1 field changed- added
Output schema / properties / recipes / items / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
mark_cooked1 field changed- added
Output schema / properties / entry / properties / recipe / properties / main_proteinAdded value: +{ + "type": "string" +}
- Changed
search_recipes2 fields changed- added
Input schema / properties / main_proteinAdded value: +{ + "description": "only recipes whose main protein is one of these: chicken, turkey, duck, goose, quail, pheasant, guinea_fowl, beef (with veal), pork (with ham, bacon and sausage), lamb (with mutton), goat, venison, bison, rabbit, fish, seafood (shellfish, squid, octopus), egg, legume (beans, lentils, chickpeas, tofu), none; e.g. ['beef','pork','lamb'] for red meat or ['fish','seafood']; judged from the ingredients, so chicken stock alone does not make a chicken dish", + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / recipes / items / properties / main_proteinAdded value: +{ + "type": "string" +}
3 tool updates
- Changed
find_by_ingredients1 field changed- added
Output schema / properties / ask_userAdded value: +{ + "type": "string" +}
- Changed
get_recipe2 fields changed- changed
Input schema / properties / servings / descriptionPrevious value: -"scale ingredient quantities to this many servings; only works when the recipe's yield states servings, nutrition stays per serving"New value: +"scale ingredient quantities to this many servings; when the recipe's yield does not state servings the recipe comes back unscaled with scale_note saying so, nutrition stays per serving" - added
Output schema / properties / scale_noteAdded value: +{ + "type": "string" +}
- Changed
import_cookidoo_recipe1 field changed- added
Output schema / properties / scale_noteAdded value: +{ + "type": "string" +}
23 tool updates
- Changed
add_to_pantry2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / items / items / additionalPropertiesRemoved value: -false
- Changed
connect_cookidoo1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
cooked_history3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / entries / items / additionalPropertiesRemoved value: -false - removed
Output schema / properties / entries / items / properties / recipe / additionalPropertiesRemoved value: -false
- Changed
create_cookbook1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
delete_cookbook1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
disconnect_cookidoo1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
find_by_ingredients2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / matches / items / additionalPropertiesRemoved value: -false
- Changed
get_pantry2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / items / items / additionalPropertiesRemoved value: -false
- Changed
get_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
import_cookidoo_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
list_cookbooks2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / cookbooks / items / additionalPropertiesRemoved value: -false
- Changed
list_cookidoo_recipes2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / recipes / items / additionalPropertiesRemoved value: -false
- Changed
list_saved3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / recipes / items / additionalPropertiesRemoved value: -false - removed
Output schema / properties / recipes / items / properties / cookbooks / items / additionalPropertiesRemoved value: -false
- Changed
mark_cooked3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / entry / additionalPropertiesRemoved value: -false - removed
Output schema / properties / entry / properties / recipe / additionalPropertiesRemoved value: -false
- Changed
remove_from_pantry2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / items / items / additionalPropertiesRemoved value: -false
- Changed
save_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
search_cookidoo2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / hits / items / additionalPropertiesRemoved value: -false
- Changed
search_recipes2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / recipes / items / additionalPropertiesRemoved value: -false
- Changed
send_to_thermomix1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
share_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
unsave_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
update_cookbook1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
- Changed
upload_recipe1 field changed- removed
Output schema / additionalPropertiesRemoved value: -false
7 tool updates
- Changed
cooked_history1 field changed- added
Output schema / properties / entries / items / properties / recipe / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
find_by_ingredients3 fields changed- added
Input schema / properties / batch_friendlyAdded value: +{ + "description": "true to leave out dishes cooked per portion, for a crowd; recipes not yet classified stay in", + "type": "boolean" +} - added
Input schema / properties / feedingAdded value: +{ + "description": "how many people are eating, e.g. 10 for a dinner party; from six up, dishes cooked in one vessel (stews, braises, tray bakes, casseroles, soups, roasts) rank ahead of dishes cooked per portion (steaks, burgers, pancakes, stir-fries); nothing is excluded", + "type": "integer" +} - added
Output schema / properties / matches / items / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
get_recipe1 field changed- added
Output schema / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
import_cookidoo_recipe1 field changed- added
Output schema / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
list_saved1 field changed- added
Output schema / properties / recipes / items / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
mark_cooked1 field changed- added
Output schema / properties / entry / properties / recipe / properties / scale_classAdded value: +{ + "type": "string" +}
- Changed
search_recipes3 fields changed- added
Input schema / properties / batch_friendlyAdded value: +{ + "description": "true to leave out dishes cooked per portion, for a crowd; recipes not yet classified stay in", + "type": "boolean" +} - added
Input schema / properties / feedingAdded value: +{ + "description": "how many people are eating, e.g. 10 for a dinner party; from six up, dishes cooked in one vessel (stews, braises, tray bakes, casseroles, soups, roasts) rank ahead of dishes cooked per portion (steaks, burgers, pancakes, stir-fries); nothing is excluded", + "type": "integer" +} - added
Output schema / properties / recipes / items / properties / scale_classAdded value: +{ + "type": "string" +}
3 tool updates
- Added
cooked_history - Changed
list_saved2 fields changed- added
Output schema / properties / recipes / items / properties / last_cookedAdded value: +{ + "type": "string" +} - added
Output schema / properties / recipes / items / properties / times_cookedAdded value: +{ + "type": "integer" +}
- Added
mark_cooked
7 tool updates
- Added
create_cookbook - Added
delete_cookbook - Added
list_cookbooks - Changed
list_saved3 fields changed- added
Input schema / propertiesAdded value: +{ + "cookbook": { + "description": "only recipes in this cookbook, by name; leave empty for every saved recipe, each listed with the cookbooks it is in", + "type": "string" + } +} - added
Output schema / properties / recipes / items / properties / cookbooksAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +} - changed
Output schema / properties / recipes / items / requiredPrevious value: -[ - "id", - "name", - "rating_count", - "source_site", - "source_url" -]New value: +[ + "id", + "name", + "rating_count", + "source_site", + "source_url", + "cookbooks" +]
- Changed
save_recipe4 fields changed- added
Input schema / properties / cookbookAdded value: +{ + "description": "cookbook to save into, by name, e.g. 'Stews' or 'Christmas'; created when it does not exist yet; leave empty for the default cookbook", + "type": "string" +} - added
Input schema / properties / noteAdded value: +{ + "description": "the user's own note on this recipe in this cookbook, e.g. 'half the chilli, kids loved it'", + "type": "string" +} - added
Output schema / properties / cookbookAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "saved", - "id" -]New value: +[ + "saved", + "id", + "cookbook" +]
- Added
unsave_recipe - Added
update_cookbook
Publisher details
- Operator
- Ricardo Marques · Publisher source
- Operator website
- https://capsule.one · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://ask.recipes/docs · Publisher source
- Trust center
- Not available
- Restrictions
- None. Free, no paid plan, no admin approval, no regional limit. Sign-in with an email address is the only requirement. · Publisher source
Related MCP Connectors
Search structured recipes, scale servings, match pantry ingredients, and build shopping lists.
Search, save, organize, cook, and share recipes with any AI assistant.
Scraps Kitchen gives any AI agent a persistent, household-aware kitchen memory. Unlike generic chatbot recall, Scraps maintains structured cooking data: what's in your fridge (with freshness tracking), who you cook for (with allergens, dietary restrictions, and preferences), your recipe collection (with cook notes and per-diner ratings), your shopping list, and your kitchen equipment. 27 tools across 6 domains let agents read kitchen context, suggest meals that respect dietary safety, update the pantry after cooking, and build a history of what works for your household. Every interaction makes the data richer. Cooking history, preference signals, kitchen awareness = better suggestions next time. All tools work via oAuth and a free scraps.kitchen account.
Persistent food journal for AI assistants. Log meals, save recipes, plan meals and track nutrition.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage a personal recipe collection and assist with cooking by searching by ingredients on hand, scaling recipes, and generating grouped shopping lists with pantry-aware gaps.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to analyze the nutrition of ingredients or recipe lines and to search recipe and food databases with optional diet, health, and cuisine filters.476 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to search recipes, compose nutritionally balanced meals, optimize weekly meal plans based on macro targets for family members, and generate consolidated grocery lists from a personal recipe database.-
- AlicenseNot gradedqualityCmaintenanceHousehold-aware kitchen brain for AI agents: manage pantry inventory with freshness tracking, shopping lists, recipe collections with cook notes and per-diner ratings, dietary profiles with allergen safety, and kitchen equipment — all through 27 tools with OAuth 2.1 authentication. Includes a free tool for ingredient-based recipe generation without an account (accounts are free!).MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.