{"apiVersion":"v1","directorySlug":"heypepper-mcp-2e6e001034","title":"Hey Pepper!","description":"Plan the week, collect recipes, compose menus, build shopping lists, and cook with confidence.","pageUrl":"https://www.mcpbundles.com/skills/heypepper-mcp-2e6e001034","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://heypepper.app/api/mcp/mcp","hostedMcpUrl":null,"toolCount":63,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"app.heypepper/heypepper-mcp-2e6e001034","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"create_recipe","description":"Save a new recipe to the library. Only call this when the user explicitly asked to create, add, or save a recipe, or after they confirmed creating one. Lookup questions (\"do we have X?\", \"is there a recipe for Y?\") and vague wants (\"I want pasta\") are not create requests — call list_recipes first, then ask. Do not invent a confirm tool.","inputSchema":{"type":"object","required":["title","ingredients","instructions"],"properties":{"tags":{"type":"array","items":{"type":"string"}},"servings":{"type":"number"},"image_url":{"type":"string"},"nutrition":{"type":"object","properties":{"fat_g":{"type":"number"},"carbs_g":{"type":"number"},"fiber_g":{"type":"number"},"sugar_g":{"type":"number"},"calories":{"type":"number"},"protein_g":{"type":"number"},"sodium_mg":{"type":"number"}}},"source_url":{"type":"string"},"cookbook_id":{"type":"string"},"ingredients":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"unit":{"type":"string"},"quantity":{"type":"string"}}}},"instructions":{"type":"string"},"nutrition_estimated_by_ai":{"type":"boolean"}},"additionalProperties":false},"logicalName":"create_recipe","displayName":"create_recipe","title":"create_recipe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"read_recipe","description":"Get a single recipe by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"read_recipe","displayName":"read_recipe","title":"read_recipe"},{"name":"set_recipe_verdict","description":"Set the current verdict for a recipe: \"up\" (fire / liked), \"down\" (thumbs-down / disliked), or null to clear. Updates the latest cook log in scope when one exists; otherwise sets the standing recipe verdict. Never creates a cook log. Only when the user was explicit.","inputSchema":{"type":"object","required":["recipe_id","verdict"],"properties":{"verdict":{"enum":["up","down"],"type":"string"},"recipe_id":{"type":"string"},"cookbook_id":{"type":"string"}},"additionalProperties":false},"logicalName":"set_recipe_verdict","displayName":"set_recipe_verdict","title":"set_recipe_verdict","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_recipe","description":"Update fields on an existing recipe. To add, remove, or rename tags, pass the full replacement tags array — there is no add_tag, remove_tag, or rename_tag tool. Read current tags first (page context or read_recipe / list_recipes), apply the change, drop case-insensitive duplicates, keep the user's spelling on add, then send the complete array. Explicit tag edits (\"add Grilling\", \"remove Chicken\", \"rename Thai-Inspired to Thai\") need no confirm; ambiguous ones (\"fix the tags\", \"tag this\" with no","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"servings":{"type":"number"},"image_url":{"type":"string"},"nutrition":{"type":"object","properties":{"fat_g":{"type":"number"},"carbs_g":{"type":"number"},"fiber_g":{"type":"number"},"sugar_g":{"type":"number"},"calories":{"type":"number"},"protein_g":{"type":"number"},"sodium_mg":{"type":"number"}}},"source_url":{"type":"string"},"ingredients":{"type":"array","items":{"type":"object"}},"instructions":{"type":"string"},"nutrition_estimated_by_ai":{"type":"boolean"}},"additionalProperties":false},"logicalName":"update_recipe","displayName":"update_recipe","title":"update_recipe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_recipe_image","description":"Regenerate the hero image for a recipe. The image is based on the recipe title, ingredients, and instructions. Optionally include visual style guidance when the user asks to customize the photo — e.g. \"make it more rustic\", \"outdoor setting\", \"close-up shot\". Always saves the result and calls task_complete after.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"image_prompt":{"type":"string"}},"additionalProperties":false},"logicalName":"generate_recipe_image","displayName":"generate_recipe_image","title":"generate_recipe_image","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_recipe","description":"Delete a recipe by id. You MUST pass confirmed: true — only call this after the user has explicitly confirmed the deletion in the current conversation.","inputSchema":{"type":"object","required":["id","confirmed"],"properties":{"id":{"type":"string"},"confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_recipe","displayName":"delete_recipe","title":"delete_recipe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_recipes","description":"List recipes with optional filters. When query is provided, runs full-text search across recipe titles, ingredient names, and tags using the shared recipe search index. Use tags filter for category browsing; use query for keyword, dish, cuisine, or ingredient-based lookup. Use fire: true for liked / fire recipes (verdict === \"up\"); do not use favorited for that — favorited is the leftover star. search_query is accepted as a backwards-compatible alias for query.","inputSchema":{"type":"object","properties":{"fire":{"type":"boolean"},"tags":{"type":"array","items":{"type":"string"}},"limit":{"type":"number"},"query":{"type":"string"},"favorited":{"type":"boolean"},"cookbook_id":{"type":"string"},"search_query":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_recipes","displayName":"list_recipes","title":"list_recipes"},{"name":"scale_recipe","description":"Read a recipe and return scaled ingredients for a target serving count or multiplier. This is a read-only transform and never changes the stored recipe.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"factor":{"type":"number"},"recipe_id":{"type":"string"},"target_servings":{"type":"number"},"measurement_system":{"enum":["us","imperial","metric"],"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"scale_recipe","displayName":"scale_recipe","title":"scale_recipe"},{"name":"create_meal_plan","description":"Create a new meal plan for a week (week_of = ISO date of Monday). Interactive creates are active. Pass status \"draft\" only for an unattended Weekly Reset.","inputSchema":{"type":"object","required":["week_of"],"properties":{"status":{"enum":["draft","active"],"type":"string"},"week_of":{"type":"string"}},"additionalProperties":false},"logicalName":"create_meal_plan","displayName":"create_meal_plan","title":"create_meal_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"read_meal_plan","description":"Get a meal plan by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"read_meal_plan","displayName":"read_meal_plan","title":"read_meal_plan"},{"name":"update_meal_plan","description":"Update fields on a meal plan. When passing slots, values must be arrays of recipe IDs (e.g. { \"monday_dinner\": [\"id-a\", \"id-b\"] }), not plain strings. Prefer set_meal_plan_slot_marker for Leftovers/Eating out.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"slots":{"type":"object"},"status":{"enum":["draft","active"],"type":"string"},"week_of":{"type":"string"},"draft_note":{"type":"string"},"slot_markers":{"type":"object"},"weekly_reset_generated_at":{"type":"string"}},"additionalProperties":false},"logicalName":"update_meal_plan","displayName":"update_meal_plan","title":"update_meal_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_meal_plan","description":"Delete a meal plan by id. You MUST pass confirmed: true — only call this after the user has explicitly confirmed the deletion in the current conversation.","inputSchema":{"type":"object","required":["id","confirmed"],"properties":{"id":{"type":"string"},"confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_meal_plan","displayName":"delete_meal_plan","title":"delete_meal_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_meal_plans","description":"List all meal plans.","inputSchema":{"type":"object","properties":{"cookbook_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_meal_plans","displayName":"list_meal_plans","title":"list_meal_plans"},{"name":"assign_recipe_to_slot","description":"Add a recipe to a meal slot. Can be called multiple times for the same slot to build a multi-recipe meal (e.g. chicken piccata + mashed potatoes on Monday dinner). Duplicate assignments are ignored. Slot format: \"{day}_{meal}\" e.g. \"monday_dinner\", \"tuesday_breakfast\". Valid meal types: breakfast, lunch, dinner, snack, dessert.","inputSchema":{"type":"object","required":["meal_plan_id","slot","recipe_id"],"properties":{"slot":{"type":"string"},"recipe_id":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"assign_recipe_to_slot","displayName":"assign_recipe_to_slot","title":"assign_recipe_to_slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"assign_meal_to_slot","description":"Add all of a saved menu's course recipes to a plan slot in one call (e.g. assign \"Date Night Dinner\" to saturday_dinner). Recipes already in the slot are kept; duplicates are ignored. Slot format: \"{day}_{meal}\" e.g. \"monday_dinner\".","inputSchema":{"type":"object","required":["meal_plan_id","slot","meal_id"],"properties":{"slot":{"type":"string"},"meal_id":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"assign_meal_to_slot","displayName":"assign_meal_to_slot","title":"assign_meal_to_slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"remove_recipe_from_slot","description":"Remove a specific recipe from a meal slot. If it was the last recipe in the slot, the slot becomes empty. To replace a recipe, call this first, then assign_recipe_to_slot.","inputSchema":{"type":"object","required":["meal_plan_id","slot","recipe_id"],"properties":{"slot":{"type":"string"},"recipe_id":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"remove_recipe_from_slot","displayName":"remove_recipe_from_slot","title":"remove_recipe_from_slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"clear_slot","description":"Remove all recipes or a Leftovers/Eating out marker from a meal slot, leaving it empty.","inputSchema":{"type":"object","required":["meal_plan_id","slot"],"properties":{"slot":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"clear_slot","displayName":"clear_slot","title":"clear_slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_meal_plan_slot_marker","description":"Mark a meal-plan slot as Leftovers or Eating out. This replaces any recipes currently assigned to that slot.","inputSchema":{"type":"object","required":["meal_plan_id","slot","marker"],"properties":{"slot":{"type":"string"},"marker":{"enum":["leftovers","eating_out"],"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"set_meal_plan_slot_marker","displayName":"set_meal_plan_slot_marker","title":"set_meal_plan_slot_marker","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"move_meal_plan_slot","description":"Move a complete meal-plan slot to another slot. If the destination is occupied, the recipe group or Leftovers/Eating out marker there is swapped back to the source slot.","inputSchema":{"type":"object","required":["meal_plan_id","from_slot","to_slot"],"properties":{"to_slot":{"type":"string"},"from_slot":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"move_meal_plan_slot","displayName":"move_meal_plan_slot","title":"move_meal_plan_slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"accept_meal_plan_draft","description":"Keep a Weekly Reset draft as the real plan for that week. Clears the draft flag so it will not be replaced on the next reset. Pass the meal plan id from list_meal_plans or page context.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"accept_meal_plan_draft","displayName":"accept_meal_plan_draft","title":"accept_meal_plan_draft","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"dismiss_meal_plan_draft","description":"Throw away a Weekly Reset draft for a week so it is not shown and not re-drafted this week. You MUST pass confirmed: true after the user has explicitly said they do not want this draft.","inputSchema":{"type":"object","required":["id","confirmed"],"properties":{"id":{"type":"string"},"confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"dismiss_meal_plan_draft","displayName":"dismiss_meal_plan_draft","title":"dismiss_meal_plan_draft","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_grocery_list","description":"Create a new grocery list, optionally linked to a meal plan or a menu.","inputSchema":{"type":"object","required":["title"],"properties":{"meal_id":{"type":"string"},"meal_plan_id":{"type":"string"}},"additionalProperties":false},"logicalName":"create_grocery_list","displayName":"create_grocery_list","title":"create_grocery_list","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"read_grocery_list","description":"Get a grocery list with all its items.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"read_grocery_list","displayName":"read_grocery_list","title":"read_grocery_list"},{"name":"list_grocery_lists","description":"List all grocery lists.","inputSchema":{"type":"object","properties":{"cookbook_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_grocery_lists","displayName":"list_grocery_lists","title":"list_grocery_lists"},{"name":"get_latest_grocery_list","description":"Get the most recent grocery list with all its items, or null if none exist. Equivalent to listing grocery lists and reading the first one, in a single call. Menu-specific lists are excluded — use get_meal_grocery_list for those.","inputSchema":{"type":"object","properties":{"cookbook_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_latest_grocery_list","displayName":"get_latest_grocery_list","title":"get_latest_grocery_list"},{"name":"delete_grocery_list","description":"Delete a grocery list and all its items. You MUST pass confirmed: true — only call this after the user has explicitly confirmed the deletion in the current conversation.","inputSchema":{"type":"object","required":["id","confirmed"],"properties":{"id":{"type":"string"},"confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_grocery_list","displayName":"delete_grocery_list","title":"delete_grocery_list","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_grocery_item","description":"Add an item to a grocery list.","inputSchema":{"type":"object","required":["list_id","name"],"properties":{"name":{"type":"string"},"unit":{"type":"string"},"list_id":{"type":"string"},"category":{"type":"string"},"quantity":{"type":"string"}},"additionalProperties":false},"logicalName":"add_grocery_item","displayName":"add_grocery_item","title":"add_grocery_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_grocery_item","description":"Update fields on a grocery item.","inputSchema":{"type":"object","required":["item_id"],"properties":{"name":{"type":"string"},"unit":{"type":"string"},"checked":{"type":"boolean"},"item_id":{"type":"string"},"category":{"type":"string"},"quantity":{"type":"string"}},"additionalProperties":false},"logicalName":"update_grocery_item","displayName":"update_grocery_item","title":"update_grocery_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_grocery_item","description":"Delete a grocery item by id.","inputSchema":{"type":"object","required":["item_id"],"properties":{"item_id":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_grocery_item","displayName":"delete_grocery_item","title":"delete_grocery_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"check_off_item","description":"Mark or unmark a grocery item as checked off. Set checked=false to uncheck.","inputSchema":{"type":"object","required":["item_id"],"properties":{"checked":{"type":"boolean"},"item_id":{"type":"string"}},"additionalProperties":false},"logicalName":"check_off_item","displayName":"check_off_item","title":"check_off_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_ingredient_progress","description":"Get which ingredients the user has checked off for a recipe. Returns a list of 0-based ingredient indices that are marked done.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"recipe_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_ingredient_progress","displayName":"get_ingredient_progress","title":"get_ingredient_progress"},{"name":"set_ingredient_done","description":"Mark or unmark a single recipe ingredient as checked off. Use ingredient_index 0 for the first ingredient. Set done=false to uncheck.","inputSchema":{"type":"object","required":["recipe_id","ingredient_index","done"],"properties":{"done":{"type":"boolean"},"recipe_id":{"type":"string"},"ingredient_index":{"type":"number"}},"additionalProperties":false},"logicalName":"set_ingredient_done","displayName":"set_ingredient_done","title":"set_ingredient_done","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reset_ingredient_progress","description":"Clear all checked-off ingredients for a recipe.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"recipe_id":{"type":"string"}},"additionalProperties":false},"logicalName":"reset_ingredient_progress","displayName":"reset_ingredient_progress","title":"reset_ingredient_progress","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_step_progress","description":"Get which instruction steps the user has completed for a recipe. Returns a list of 0-based step indices that are marked done.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"recipe_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_step_progress","displayName":"get_step_progress","title":"get_step_progress"},{"name":"set_step_done","description":"Mark or unmark a single recipe instruction step as complete. Use step_index 0 for the first step. Set done=false to uncheck. Marking a step done also checks off every ingredient chip under that step; unmarking clears those chips. Independent of the Ingredients-list checklist.","inputSchema":{"type":"object","required":["recipe_id","step_index","done"],"properties":{"done":{"type":"boolean"},"recipe_id":{"type":"string"},"step_index":{"type":"number"}},"additionalProperties":false},"logicalName":"set_step_done","displayName":"set_step_done","title":"set_step_done","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_step_ingredient_done","description":"Mark or unmark a single ingredient chip under a recipe instruction step (recipe detail page only — not the Ingredients list, not cook mode). Use step_index 0 and ingredient_index 0 for the first of each. When every chip under a step is checked, the step is marked complete; unchecking any chip reopens the step.","inputSchema":{"type":"object","required":["recipe_id","step_index","ingredient_index","done"],"properties":{"done":{"type":"boolean"},"recipe_id":{"type":"string"},"step_index":{"type":"number"},"ingredient_index":{"type":"number"}},"additionalProperties":false},"logicalName":"set_step_ingredient_done","displayName":"set_step_ingredient_done","title":"set_step_ingredient_done","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reset_step_progress","description":"Clear all step completion progress for a recipe, including per-step ingredient chips. Use when the user wants to cook the recipe again from scratch.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"recipe_id":{"type":"string"}},"additionalProperties":false},"logicalName":"reset_step_progress","displayName":"reset_step_progress","title":"reset_step_progress","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_cooking_plan","description":"Get the cooking plan for a source (a single recipe, a meal, or a meal-plan slot). Returns { status: \"fresh\", plan } when a cached plan exists and the underlying recipes have not changed. Otherwise returns { status: \"stale\" | \"missing\", recipes } with the full recipe data needed to author a new plan via save_cooking_plan.","inputSchema":{"type":"object","required":["source_type","source_key"],"properties":{"source_key":{"type":"string"},"source_type":{"enum":["recipe","meal","meal_plan_slot"],"type":"string"},"target_servings":{"type":"number"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_cooking_plan","displayName":"get_cooking_plan","title":"get_cooking_plan"},{"name":"set_cooking_step_done","description":"Mark or unmark a single cooking step as complete. Use step_index 0 for the first step. On /cook?recipe= pass recipe_id (applies on the client — no session). On a menu or meal-plan-slot cook pass session_id (preferred) or a legacy plan_id. Marking done does not advance the screen — call go_to_cooking_step after. Never use set_step_done here; that is recipe-page Convex.","inputSchema":{"type":"object","required":["step_index","done"],"properties":{"done":{"type":"boolean"},"plan_id":{"type":"string"},"recipe_id":{"type":"string"},"session_id":{"type":"string"},"step_index":{"type":"number"}},"additionalProperties":false},"logicalName":"set_cooking_step_done","displayName":"set_cooking_step_done","title":"set_cooking_step_done","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"go_to_cooking_step","description":"Move the cook to a specific step — this is what changes which step is shown center-stage on their screen. Use step_index 0 for the first step. Call this to advance (\"next step\"), go back (\"previous step\", \"repeat that\"), or jump (\"go to step 3\"). Marking a step done does NOT move the focus; call this afterward to advance. On /cook?recipe= pass recipe_id (client). On a menu or meal-plan-slot cook pass session_id (preferred) or a legacy plan_id.","inputSchema":{"type":"object","required":["step_index"],"properties":{"plan_id":{"type":"string"},"recipe_id":{"type":"string"},"session_id":{"type":"string"},"step_index":{"type":"number"}},"additionalProperties":false},"logicalName":"go_to_cooking_step","displayName":"go_to_cooking_step","title":"go_to_cooking_step","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reset_cooking_progress","description":"Clear all step completion progress. Use when the user wants to cook it again from scratch. On /cook?recipe= pass recipe_id (client). On a menu or meal-plan-slot cook pass session_id (preferred) or a legacy plan_id.","inputSchema":{"type":"object","properties":{"plan_id":{"type":"string"},"recipe_id":{"type":"string"},"session_id":{"type":"string"}},"additionalProperties":false},"logicalName":"reset_cooking_progress","displayName":"reset_cooking_progress","title":"reset_cooking_progress","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"start_cooking_timer","description":"Start a countdown timer. Pass step_index to time a step (duration and label default from the step on a generated plan; duration_minutes overrides). Omit step_index for an ad-hoc timer, in which case duration_minutes and label are required. On /cook?recipe= pass recipe_id (client local timer). On a menu or meal-plan-slot cook pass session_id (preferred) or a legacy plan_id.","inputSchema":{"type":"object","properties":{"label":{"type":"string"},"plan_id":{"type":"string"},"recipe_id":{"type":"string"},"session_id":{"type":"string"},"step_index":{"type":"number"},"duration_minutes":{"type":"number"}},"additionalProperties":false},"logicalName":"start_cooking_timer","displayName":"start_cooking_timer","title":"start_cooking_timer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cancel_cooking_timer","description":"Cancel (or dismiss a finished) cooking timer by its id. On /cook?recipe= also pass recipe_id so the client cancels the local timer.","inputSchema":{"type":"object","required":["timer_id"],"properties":{"timer_id":{"type":"string"},"recipe_id":{"type":"string"}},"additionalProperties":false},"logicalName":"cancel_cooking_timer","displayName":"cancel_cooking_timer","title":"cancel_cooking_timer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_cooking_timers","description":"List all timers, each with remaining_seconds (0 when finished). On /cook?recipe= pass recipe_id (client local timers). On a menu or meal-plan-slot cook pass session_id (preferred) or a legacy plan_id.","inputSchema":{"type":"object","properties":{"plan_id":{"type":"string"},"recipe_id":{"type":"string"},"session_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_cooking_timers","displayName":"list_cooking_timers","title":"list_cooking_timers"},{"name":"list_meals","description":"List all saved menus in the collection. User-facing language should call these menus.","inputSchema":{"type":"object","properties":{"cookbook_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_meals","displayName":"list_meals","title":"list_meals"},{"name":"read_meal","description":"Get a single saved menu by id, including all its courses.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"read_meal","displayName":"read_meal","title":"read_meal"},{"name":"create_meal","description":"Create a new named menu. Optionally seed it with an initial list of courses (each with a recipe_id). course_ids are generated server-side.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"courses":{"type":"array","items":{"type":"object","required":["recipe_id"],"properties":{"role":{"type":"string"},"recipe_id":{"type":"string"}}}}},"additionalProperties":false},"logicalName":"create_meal","displayName":"create_meal","title":"create_meal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_meal","description":"Update a menu's name, description, or replace its full courses array. When courses is supplied it replaces the entire array — use this for reordering. For adding/removing individual courses, prefer add_recipe_to_meal and remove_recipe_from_meal.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"courses":{"type":"array","items":{"type":"object","required":["course_id","recipe_id"],"properties":{"role":{"type":"string"},"course_id":{"type":"string"},"recipe_id":{"type":"string"}}}}},"additionalProperties":false},"logicalName":"update_meal","displayName":"update_meal","title":"update_meal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_meal","description":"Delete a menu by id. You MUST pass confirmed: true — only call this after the user has explicitly confirmed the deletion in the current conversation.","inputSchema":{"type":"object","required":["id","confirmed"],"properties":{"id":{"type":"string"},"confirmed":{"type":"boolean"}},"additionalProperties":false},"logicalName":"delete_meal","displayName":"delete_meal","title":"delete_meal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_recipe_to_meal","description":"Append a single recipe to a menu as a course, optionally with a role label. The course_id is generated server-side and returned in the response — use it if you later need to remove this specific course.","inputSchema":{"type":"object","required":["meal_id","recipe_id"],"properties":{"role":{"type":"string"},"meal_id":{"type":"string"},"recipe_id":{"type":"string"}},"additionalProperties":false},"logicalName":"add_recipe_to_meal","displayName":"add_recipe_to_meal","title":"add_recipe_to_meal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"remove_recipe_from_meal","description":"Remove a specific course from a menu by its course_id (not recipe_id — a recipe may appear in a menu twice). Use the course_id returned by add_recipe_to_meal or read_meal.","inputSchema":{"type":"object","required":["meal_id","course_id"],"properties":{"meal_id":{"type":"string"},"course_id":{"type":"string"}},"additionalProperties":false},"logicalName":"remove_recipe_from_meal","displayName":"remove_recipe_from_meal","title":"remove_recipe_from_meal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_preferences","description":"Get the current user diet, food, and cooking display preferences.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_preferences","displayName":"get_preferences","title":"get_preferences"},{"name":"update_preferences","description":"Update the user's food and cooking display preferences. All fields are optional — only pass the ones you want to change. To remove a disliked ingredient, pass the full new array without that item.","inputSchema":{"type":"object","properties":{"notes":{"type":"string"},"timezone":{"type":"string"},"cooking_days":{"type":"array","items":{"enum":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"],"type":"string"}},"pepper_voice":{"enum":["jacqueline","skylar","daniel","archie"],"type":"string"},"serving_size":{"type":"number"},"wake_word_enabled":{"type":"boolean"},"weekly_reset_hour":{"type":"number"},"measurement_system":{"enum":["us","metric"],"type":"string"},"preferred_cuisines":{"type":"array","items":{"type":"string"}},"disliked_ingredients":{"type":"array","items":{"type":"string"}},"weekly_reset_enabled":{"type":"boolean"},"weekly_reset_weekday":{"type":"number"},"cooking_days_per_week":{"type":"number"},"preferred_assistant_mode":{"enum":["chat","voice"],"type":"string"},"weekly_reset_skipped_week_of":{"type":"string"},"keep_screen_awake_in_cook_mode":{"type":"boolean"}},"additionalProperties":false},"logicalName":"update_preferences","displayName":"update_preferences","title":"update_preferences","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_cookbooks","description":"List all cookbooks belonging to the current user.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_cookbooks","displayName":"list_cookbooks","title":"list_cookbooks"},{"name":"log_cooked_recipe","description":"Record that the user cooked a recipe (or a full menu). Use when the user says they made something — \"we made the lasagna last night\". Provide exactly one of recipe_id or meal_id. Only include a verdict when the user explicitly said they liked or disliked it; never invent one.","inputSchema":{"type":"object","properties":{"notes":{"type":"string"},"meal_id":{"type":"string"},"verdict":{"enum":["up","down"],"type":"string"},"cooked_at":{"type":"string"},"recipe_id":{"type":"string"},"modifications":{"type":"string"},"servings_made":{"type":"number"}},"additionalProperties":false},"logicalName":"log_cooked_recipe","displayName":"log_cooked_recipe","title":"log_cooked_recipe","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_cook_log_entry","description":"Update an existing cook log entry (verdict, notes, modifications, date, servings).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"notes":{"type":"string"},"verdict":{"enum":["up","down"],"type":"string"},"cooked_at":{"type":"string"},"modifications":{"type":"string"},"servings_made":{"type":"number"}},"additionalProperties":false},"logicalName":"update_cook_log_entry","displayName":"update_cook_log_entry","title":"update_cook_log_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_cook_log_entry","description":"Delete a cook log entry by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"delete_cook_log_entry","displayName":"delete_cook_log_entry","title":"delete_cook_log_entry","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_cook_history","description":"Read the user's cooking history. Returns log entries (what was cooked, when, verdict, notes), newest first. Pass summary: true for per-recipe aggregates (times cooked, latest verdict, last cooked) instead of raw entries — use that to answer \"how often / how did we like it\" questions cheaply.","inputSchema":{"type":"object","properties":{"limit":{"type":"number"},"since":{"type":"string"},"until":{"type":"string"},"summary":{"type":"boolean"},"verdict":{"enum":["up","down"],"type":"string"},"recipe_id":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_cook_history","displayName":"get_cook_history","title":"get_cook_history"},{"name":"save_recipe_from_url","description":"Extract a recipe from a captured web page and save it to the library. page_text is REQUIRED: this call has no web-fetching tool of its own, so without the page's text it can never recover ingredients or instructions and will always return not_saved. Fetch the page yourself first and pass its visible text (or recipe JSON-LD) as page_text. Returns { status: \"saved\" | \"duplicate\" | \"not_saved\", ... }.","inputSchema":{"type":"object","required":["url","page_text"],"properties":{"url":{"type":"string"},"page_text":{"type":"string"},"selection":{"type":"string"},"cookbook_id":{"type":"string"}},"additionalProperties":false},"logicalName":"save_recipe_from_url","displayName":"save_recipe_from_url","title":"save_recipe_from_url","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_cooking_plan","description":"Generate (or fetch an already-cached) step-by-step cooking plan for a menu or meal-plan slot, plus a per-user cooking session. source_type \"recipe\" does not generate: it returns { status: \"skipped_recipe\", cook_path, source_key } with no plan or session. Meal/slot returns { status: \"fresh_hit\" | \"generated\", plan, session, recipe_summaries } or { error, error_code }.","inputSchema":{"type":"object","required":["source_type","source_key"],"properties":{"force":{"type":"boolean"},"source_key":{"type":"string"},"cookbook_id":{"type":"string"},"source_type":{"enum":["recipe","meal","meal_plan_slot"],"type":"string"},"target_servings":{"type":"number"}},"additionalProperties":false},"logicalName":"generate_cooking_plan","displayName":"generate_cooking_plan","title":"generate_cooking_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_usage","description":"Get the current user AI usage vs. rate limits (agent requests, tokens, image generation, voice, uploads, external AI activity).","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_usage","displayName":"get_usage","title":"get_usage"},{"name":"render_recipe_card","description":"Render an interactive Pepper recipe card for a saved recipe. First call read_recipe to identify and verify the recipe, then call this tool with that exact recipe id whenever showing one recipe would help the user inspect or cook it.","inputSchema":{"type":"object","required":["recipe_id"],"properties":{"recipe_id":{"type":"string","minLength":1}},"additionalProperties":false},"title":"Show recipe card","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"render_recipe_card","displayName":"Show recipe card"},{"name":"render_recipe_carousel","description":"Render an interactive Pepper carousel for two to eight saved recipes. After list_recipes returns the exact matches, call this tool with those recipe ids whenever the user asks for multiple options, recommendations, ideas, comparisons, or a shortlist.","inputSchema":{"type":"object","required":["recipe_ids"],"properties":{"heading":{"type":"string","maxLength":80,"minLength":1},"recipe_ids":{"type":"array","items":{"type":"string","minLength":1},"maxItems":8,"minItems":2,"uniqueItems":true}},"additionalProperties":false},"title":"Show recipe carousel","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"render_recipe_carousel","displayName":"Show recipe carousel"}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Hey-Pepper-&config=eyJ1cmwiOiAiaHR0cHM6Ly9oZXlwZXBwZXIuYXBwL2FwaS9tY3AvbWNwIn0%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Hey-Pepper-%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fheypepper.app%2Fapi%2Fmcp%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Hey-Pepper-%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fheypepper.app%2Fapi%2Fmcp%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Hey+Pepper%21&connectorUrl=https%3A%2F%2Fheypepper.app%2Fapi%2Fmcp%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Hey-Pepper-\" --url \"https://heypepper.app/api/mcp/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/heypepper-mcp-2e6e001034","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/heypepper-mcp-2e6e001034/tools/{tool}","mcpServerUrl":"https://heypepper.app/api/mcp/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/heypepper-mcp-2e6e001034?live=1"}