add_pantry_item
ChatGPTitems: array of { name, quantity?, unit?, category?, expires_at? } Output: { added: [...], skipped: [...] }. Each skipped entry includes a reason so you can summarise failures back to the user.By Avana.ai Inc.
ChefSense is a kitchen assistant that keeps track of what's in your pantry, who you're cooking for, and the recipes you love. This plugin lets ChatGPT and Codex work with your ChefSense account directly. What you can do: - See what you have: your pantry (including what's expiring soon), saved recipes, shopping list, and each household member's diets, allergies and dislikes. - Keep it up to date: add, update or remove pantry items, save a recipe from the conversation or from a URL, edit a recipe, and add or check off shopping list items. - Cook for everyone: generate recipes from what's on hand with ChefSense's recipe engine, which respects every household member's diet profile, or refine a saved recipe step by step. - Scan photos: turn a photo of your pantry shelf, a grocery receipt or a recipe card into pantry items or a saved recipe. - Undo anything: pantry, recipe and diet changes are recorded, so "undo that" rolls back the last one. You're asked before anything changes your data. You sign in on ChefSense's own page, the assistant never sees your password, and you can disconnect at any time. Requires a ChefSense account. The shopping list is a list only; ChefSense doesn't place orders.
items: array of { name, quantity?, unit?, category?, expires_at? } Output: { added: [...], skipped: [...] }. Each skipped entry includes a reason so you can summarise failures back to the user.start_pantry_scan instead. This is a BYO-AI tool — it does NOT count against the user's ChefSense AI quota. It DOES count against the per-tool rate limit (60/min). Field shapes documented at chefsense://schema/pantry-item. Allowed units at chefsense://schema/unit. Allowed categories live in the category.enum of the pantry-item schema. Inputs: - items (required): array of { name, quantity?, unit?, category?, expires_at?, notes? } - source_hint: free-text description of what the user shared ("receipt from Whole Foods 2026-06-01"); recorded in the audit log - confidence_hints: optional per-item 0..1 confidence (parallel to items). Items below 0.5 are tagged low_confidence: true in the response so the user can review. Output: { added: [...], merged: [...], skipped: [...] }. merged = matched an existing pantry item (same normalized name + same unit) and incremented quantity instead of duplicating.items: array of { name, quantity?, unit?, category?, notes? } - list_id: optional shopping list id; defaults to the household default list Output: { added: [...], skipped: [...] }.ready_for_review to the user's pantry. Use this after get_pantry_scan returns status=ready_for_review. The detections come from get_pantry_scan; any the user doesn't want can be dropped with reject_detection_ids. Inputs: - scan_id (required) - reject_detection_ids (optional): detections to drop before applying - location_id (optional): default pantry location for detections that don't already carry one Output: { scan_id, applied: { items_created, items_merged }, rejected_count }.question (required) - recipe_id (optional): scopes the answer to a specific saved recipe; ignored if the recipe doesn't belong to the caller Counts against the user's "cooking question" AI quota — every call costs them. Don't fire it unprompted.list_shopping_list. Inputs: - item_ids: array of item ids from list_shopping_list - checked: true to check, false to uncheckget_recipe_scan returns status=draft_ready. The draft from get_recipe_scan.draft becomes the default body; pass edits to override any subset of fields (for OCR corrections the user spotted). Inputs: - scan_id (required) - edits (optional): partial overrides for { title, description, portions, category, ingredients, instructions, time, nutrition, tags }. Same field shapes as the draft. Output: { recipe_id, title }.save_recipe or save_recipe_from_url instead — those are BYO-AI and won't consume their AI quota. This will count against your ChefSense AI generation quota. Inputs: - prompt (required): natural-language ask, e.g. "quick weeknight dinner using what I have" - use_pantry (default true): currently informational — pantry grounding flows through ChefSense's prompt builder regardless; tracked here for future overrides - for_member_ids: optional household member ids (depends on CHEF-139; today the user themself is always included) Generation runs asynchronously on a queue. The tool returns { generation_id, status } immediately. Poll by calling list_recipes (the latest entry will be the new recipe) or follow up with get_recipe once the user reports it appeared.diets: chosen diets (e.g. vegetarian, pescatarian) - dislikes: ingredients the user has explicitly opted out ofkind: "real_user"; profiles the user manages for someone without an account are tagged kind: "profile_stub". Diets and dislikes are only included for the caller and their profile stubs. Member ids are what generate_recipe (for_member_ids) and update_household_member accept.start_pantry_scan. Statuses: - pending / processing — vision pipeline still running; poll again in ~3s - ready_for_review — detections ready; call apply_pantry_scan to commit them (you can pass accept_detection_ids / reject_detection_ids) - completed — already applied - failed — see the error in the audit log Output: { scan_id, status, kind, detections: [{ id, name, quantity?, unit?, category?, confidence?, status }] }list_recipes to look up a recipe id first. Returns an MCP error if the recipe doesn't exist or doesn't belong to the caller.start_recipe_scan. Statuses: - uploading / processing — vision pipeline still running - draft_ready — draft field is populated; show it to the user and call finalize_recipe_scan to save it (optionally with edits for OCR corrections) - saved — already finalized; recipe_id populated - failed — error_message populated Output: { scan_id, status, draft?, recipe_id?, error_message? }.iterate_recipe_start, or polls the iteration status with an empty answers array. Inputs: - iteration_id (required): from iterate_recipe_start - answers: array of strings matching the order of questions returned by iterate_recipe_start. Pass [] to poll without submitting answers. Returns { iteration_id, status, questions?, generated_recipe_id? }. - status='awaiting_user' → more questions, ask the user - status='in_progress' → generation still running - status='success' → look up generated_recipe_id via get_recipe - status='failure' → tell the user; CHEF-149 traces will show whyupdate_recipe instead (no AI quota consumed). Inputs: - recipe_id (required): id of the saved recipe to iterate on - instructions (required): what the user wants changed Returns { iteration_id, status, questions[] }. - When status='awaiting_user', call iterate_recipe_answer with the answers. - When status='in_progress', the iteration is generating; poll by calling iterate_recipe_answer with an empty answers array — or wait and check list_recipes for the new version.update_pantry_item / remove_pantry_item. Don't call it before generate_recipe: ChefSense already grounds generation in the pantry. Optional inputs: - query: case-insensitive substring filter on item name - category: filter to a single category slug (e.g. "produce", "dairy")query: case-insensitive substring on title or description - limit: max results (1–50, default 25)list_id: specific shopping list id. Defaults to the household's default list.list_pantry. Inputs: - item_ids: array of pantry item ids (from list_pantry) Output: { removed_ids: [...], skipped: [{ id, reason }] }. Items not owned by the caller are reported as skipped, not silently ignored.list_shopping_list. Inputs: - item_ids: array of item ids from list_shopping_list Output: { removed_ids: [...], skipped: [{ id, reason }] }.generate_recipe instead. This is a BYO-AI tool — it does NOT count against the user's ChefSense AI generation quota. Field shapes documented at chefsense://schema/recipe. Inputs: - title (required) - summary - ingredients (required): array of { name, quantity?, unit?, notes? } - instructions (required): array of strings, in order - portions, prep_time, cook_time - tags, category - source_hint: free-text origin ("cookbook page", URL, "AI-generated")generate_recipe instead. This is a BYO-AI tool — it does NOT count against the user's ChefSense AI generation quota. Behaviour: - If a recipe with the same url already exists for this user we return the existing recipe_id instead of duplicating. The response includes deduplicated: true. - Otherwise behaves identically to save_recipe, plus stores the URL as source_url on the recipe so it links back. Inputs are the same as save_recipe plus a required url.list_recipes. This is search, not generation — it never consumes AI quota. Use generate_recipe (when available) for a fresh recipe. Inputs: - query (required): natural language or keywords - scope (optional): mine (default; the user's recipe book). all (cross-account global search) is not implemented yet — the tool returns an MCP error rather than silently degrading. - limit (optional): max results (1–50, default 25)add_pantry_items_bulk instead (cheaper, no AI quota burned). Image wire format documented at chefsense://schema/recipe via ADR 0004 — base64 + media_type (preferred) or image_url (fallback for big receipts). Inputs: - image_base64 + media_type (preferred), OR image_url - kind: "shelf" (default) or "receipt" - location_id: optional pantry location to assign detections to Returns { scan_id, status: "pending" | "processing" } immediately; poll with get_pantry_scan and commit with apply_pantry_scan.save_recipe instead (cheaper, no AI quota burned). If the user dropped a URL, use save_recipe_from_url. Image wire format follows ADR 0004 — base64 + media_type (preferred) or image_url (fallback). Inputs: - image_base64 + media_type (preferred), OR image_url Returns { scan_id, status: "processing" } immediately; poll with get_recipe_scan and commit with finalize_recipe_scan.revision_id (optional, rarely needed): undo only that one revision. Omit it to undo the most recent change. Semantics: - create → delete the row - update → restore the prior column values - delete → re-insert the row from the snapshot (limited: any cascade-deleted children are NOT restored; flagged in warnings) Returns { revision_id, subject_type, subject_id, op, reverted_count, warnings[] } for the most recent revision reverted, where subject_type is one of recipe, pantry_item, diet or dislike.get_diet_profile) or case-insensitive names. Unknown items appear in the returned skipped array with reason — they are NOT silently ignored. Output: the updated diet profile (same shape as get_diet_profile) plus a skipped[] array.update_diet_profile invocations. Field shapes documented at chefsense://schema/household-member, diet values at chefsense://schema/diet. Semantics: - Diets / dislikes are SET to the provided list, not appended. If the user wants to add one, call get_household first, then pass the union back. - Users can edit themselves. Any household member can edit fake household placeholders, but not invited real collaborators. - Unknown diet / ingredient values appear in warnings (not errors). If any value in a preference field is unknown, that entire field is skipped and existing preferences are preserved. Inputs: member_id (required), change_summary (required), plus any subset of name, diets, dislikes.list_pantry first to look up item_id. Inputs: item_id (required) plus any of quantity, unit, category, expires_at, notes, name. Omitted fields are left alone.iterate_recipe_start instead. This is a BYO-AI tool — it does NOT count against the user's ChefSense AI generation quota. Field shapes documented at chefsense://schema/recipe. Semantics: - Partial — fields not in the request are left untouched (copied from the latest version). - Arrays (ingredients, instructions) are replaced wholesale when supplied; we don't try to diff item by item. - change_summary is required and recorded as the version's iteration request so the edit history reads sensibly. Inputs: recipe_id, change_summary, plus any subset of title, summary, ingredients, instructions, portions, prep_time, cook_time, tags, category. Returns { recipe_id, version_number, updated_fields[], warnings[] }, where recipe_id is the new version's id.recipe_id (required): id from list_recipes / get_recipe - Exactly one of: - image_url: ChefSense fetches and mirrors. Don't pass URLs you don't trust the user has rights to. - image_base64 + media_type: inline bytes. Capped at ~14 MB encoded (same constraint as scan tools in ADR 0004). - alt_text: optional accessibility text (currently informational until the recipe-image schema gains an alt-text column) - source_hint: free-text origin recorded in the audit trail We mirror the bytes to ChefSense's storage rather than hotlinking, so the image survives the source going away. EXIF stripping + canonical resizing land via CHEF-167's shared helper.Click any prompt to copy it.