← WebMCP Directory

Tool tree

pantryos.pressplay-subai.workers.dev

Productivity & BusinessTools verified
Website
PantryOS is a local-first kitchen inventory and recipe demo powered by WebMCP.
Explore capabilities

    page: Every page

    get_inventoryAnswer

    Use to inspect the current fridge, freezer, or pantry before planning or changing food. Do not use for groceries or recipe instructions.

    View tool JSON
    {
      "name": "get_inventory",
      "kind": "answer",
      "impl": "imperative",
      "description": "Use to inspect the current fridge, freezer, or pantry before planning or changing food. Do not use for groceries or recipe instructions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "description": "Only return items stored in this kitchen location.",
            "type": "string",
            "enum": [
              "fridge",
              "freezer",
              "pantry"
            ]
          },
          "includeExpired": {
            "description": "Set true to include unusable expired items in a separate expired bucket.",
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "page": "/"
    }
    get_expiring_itemsAnswer

    Use to find non-expired inventory that should be used within a number of days. Do not use to include already expired food; call get_inventory with includeExpired instead.

    View tool JSON
    {
      "name": "get_expiring_items",
      "kind": "answer",
      "impl": "imperative",
      "description": "Use to find non-expired inventory that should be used within a number of days. Do not use to include already expired food; call get_inventory with includeExpired instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "withinDays": {
            "description": "Return non-expired items expiring from today through this many days; defaults to 3.",
            "type": "integer",
            "minimum": 0,
            "maximum": 30
          }
        },
        "additionalProperties": false
      },
      "page": "/"
    }
    add_inventory_itemAction

    Use after the user states a food, amount, unit, and storage location to add. Do not use for shopping intentions; use add_grocery_item instead.

    View tool JSON
    {
      "name": "add_inventory_item",
      "kind": "act",
      "impl": "imperative",
      "description": "Use after the user states a food, amount, unit, and storage location to add. Do not use for shopping intentions; use add_grocery_item instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S",
            "description": "The food or ingredient name to add."
          },
          "quantity": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000,
            "description": "How much is being added."
          },
          "unit": {
            "type": "string",
            "enum": [
              "g",
              "kg",
              "ml",
              "l",
              "count",
              "package",
              "serving"
            ],
            "description": "The unit used by the quantity."
          },
          "location": {
            "type": "string",
            "enum": [
              "fridge",
              "freezer",
              "pantry"
            ],
            "description": "Where the item is stored."
          },
          "expiryDate": {
            "description": "Optional local expiry date in YYYY-MM-DD form; use null when undated.",
            "anyOf": [
              {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "quantity",
          "unit",
          "location"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    consume_inventory_itemAction

    Use when the user says food was eaten, cooked, or otherwise used. Omit quantity and unit only when they clearly used all of it; do not use for spoilage or throwing food away.

    View tool JSON
    {
      "name": "consume_inventory_item",
      "kind": "act",
      "impl": "imperative",
      "description": "Use when the user says food was eaten, cooked, or otherwise used. Omit quantity and unit only when they clearly used all of it; do not use for spoilage or throwing food away.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "description": "An exact or unambiguous inventory item name.",
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S"
          },
          "itemId": {
            "description": "The exact id returned by get_inventory.",
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S"
          },
          "quantity": {
            "description": "Amount used; omit with unit to consume the whole item.",
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000
          },
          "unit": {
            "description": "Unit for quantity; omit with quantity to consume the whole item.",
            "type": "string",
            "enum": [
              "g",
              "kg",
              "ml",
              "l",
              "count",
              "package",
              "serving"
            ]
          }
        },
        "additionalProperties": false,
        "allOf": [
          {
            "oneOf": [
              {
                "required": [
                  "item"
                ],
                "not": {
                  "required": [
                    "itemId"
                  ]
                }
              },
              {
                "required": [
                  "itemId"
                ],
                "not": {
                  "required": [
                    "item"
                  ]
                }
              }
            ]
          },
          {
            "anyOf": [
              {
                "required": [
                  "quantity",
                  "unit"
                ]
              },
              {
                "not": {
                  "anyOf": [
                    {
                      "required": [
                        "quantity"
                      ]
                    },
                    {
                      "required": [
                        "unit"
                      ]
                    }
                  ]
                }
              }
            ]
          }
        ]
      },
      "page": "/"
    }
    remove_inventory_itemAction

    Use only when the user wants food discarded rather than consumed. Always opens a human confirmation in PantryOS; do not assume chat wording alone authorizes removal.

    View tool JSON
    {
      "name": "remove_inventory_item",
      "kind": "act",
      "impl": "imperative",
      "description": "Use only when the user wants food discarded rather than consumed. Always opens a human confirmation in PantryOS; do not assume chat wording alone authorizes removal.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "item": {
            "description": "An exact or unambiguous inventory item name.",
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S"
          },
          "itemId": {
            "description": "The exact id returned by get_inventory.",
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S"
          }
        },
        "additionalProperties": false,
        "oneOf": [
          {
            "required": [
              "item"
            ],
            "not": {
              "required": [
                "itemId"
              ]
            }
          },
          {
            "required": [
              "itemId"
            ],
            "not": {
              "required": [
                "item"
              ]
            }
          }
        ]
      },
      "page": "/"
    }
    find_recipesAnswer

    Use to rank up to five available recipes by current ingredients, expiry urgency, time, and missing-item limits. This includes recipes the user saved. Use get_recipe afterward for full instructions; do not invent recipes here.

    View tool JSON
    {
      "name": "find_recipes",
      "kind": "answer",
      "impl": "imperative",
      "description": "Use to rank up to five available recipes by current ingredients, expiry urgency, time, and missing-item limits. This includes recipes the user saved. Use get_recipe afterward for full instructions; do not invent recipes here.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "description": "Optional recipe title or ingredient search text.",
            "type": "string",
            "maxLength": 120
          },
          "maxMinutes": {
            "description": "Only return recipes at or under this total time.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 480
          },
          "maxMissingIngredients": {
            "description": "Maximum missing required non-staple ingredients.",
            "type": "integer",
            "minimum": 0,
            "maximum": 40
          },
          "prioritizeExpiring": {
            "description": "Set true to strongly favor recipes using food expiring soon.",
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "page": "/"
    }
    get_recipeAnswer

    Use with a recipeId from find_recipes to read its ingredients and method. Do not use to search, rank, or change groceries.

    View tool JSON
    {
      "name": "get_recipe",
      "kind": "answer",
      "impl": "imperative",
      "description": "Use with a recipeId from find_recipes to read its ingredients and method. Do not use to search, rank, or change groceries.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recipeId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S",
            "description": "The exact recipeId returned by find_recipes."
          }
        },
        "required": [
          "recipeId"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    add_recipeAction

    Use to save a complete recipe, including one extracted from text or an image attached in the AI conversation. Send one timing form plus structured ingredients and steps; PantryOS recipe photos are added separately in the browser form.

    View tool JSON
    {
      "name": "add_recipe",
      "kind": "act",
      "impl": "imperative",
      "description": "Use to save a complete recipe, including one extracted from text or an image attached in the AI conversation. Send one timing form plus structured ingredients and steps; PantryOS recipe photos are added separately in the browser form.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S",
            "description": "The recipe name."
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "pattern": "\\S",
            "description": "A concise description of the finished recipe."
          },
          "servings": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 24,
            "description": "How many servings the unscaled recipe makes."
          },
          "timing": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "totalMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 960,
                    "description": "Total elapsed minutes when separate prep and cooking times are unavailable."
                  }
                },
                "required": [
                  "totalMinutes"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "prepMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent preparing ingredients."
                  },
                  "cookMinutes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent cooking the recipe."
                  }
                },
                "required": [
                  "prepMinutes",
                  "cookMinutes"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "prepMinutes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent preparing ingredients."
                  },
                  "cookMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent cooking the recipe."
                  }
                },
                "required": [
                  "prepMinutes",
                  "cookMinutes"
                ],
                "additionalProperties": false
              }
            ],
            "description": "Use either one total time or separate prep and cooking times; PantryOS derives the total for separate times."
          },
          "ingredients": {
            "minItems": 1,
            "maxItems": 40,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "pattern": "\\S",
                      "description": "The ingredient name as it should appear."
                    },
                    "optional": {
                      "description": "True only when the recipe can be made without this ingredient.",
                      "type": "boolean"
                    },
                    "section": {
                      "description": "Optional ingredient group, such as Sauce or To finish.",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80,
                      "pattern": "\\S"
                    },
                    "quantity": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "maximum": 1000000,
                      "description": "The numeric ingredient amount."
                    },
                    "displayUnit": {
                      "type": "string",
                      "enum": [
                        "g",
                        "kg",
                        "ml",
                        "l",
                        "count",
                        "package",
                        "serving",
                        "tsp",
                        "tbsp",
                        "cup",
                        "oz",
                        "lb"
                      ],
                      "description": "The unit paired with the ingredient quantity."
                    }
                  },
                  "required": [
                    "name",
                    "quantity",
                    "displayUnit"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "pattern": "\\S",
                      "description": "The ingredient name as it should appear."
                    },
                    "optional": {
                      "description": "True only when the recipe can be made without this ingredient.",
                      "type": "boolean"
                    },
                    "section": {
                      "description": "Optional ingredient group, such as Sauce or To finish.",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80,
                      "pattern": "\\S"
                    }
                  },
                  "required": [
                    "name"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "description": "The complete ingredient list in recipe order."
          },
          "steps": {
            "minItems": 1,
            "maxItems": 30,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "instruction": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 800,
                  "pattern": "\\S",
                  "description": "One complete recipe direction."
                },
                "section": {
                  "description": "Optional method group, such as Prepare or Bake.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80,
                  "pattern": "\\S"
                },
                "note": {
                  "description": "A useful cook's note tied to this step.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300,
                  "pattern": "\\S"
                }
              },
              "required": [
                "instruction"
              ],
              "additionalProperties": false
            },
            "description": "The complete ordered method."
          }
        },
        "required": [
          "title",
          "description",
          "servings",
          "timing",
          "ingredients",
          "steps"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    update_recipeAction

    Use to replace the complete structured content of a user-saved recipe after reading it with get_recipe. Send every recipe field; the recipeId and any browser-added photo stay unchanged. Built-in recipes cannot be edited.

    View tool JSON
    {
      "name": "update_recipe",
      "kind": "act",
      "impl": "imperative",
      "description": "Use to replace the complete structured content of a user-saved recipe after reading it with get_recipe. Send every recipe field; the recipeId and any browser-added photo stay unchanged. Built-in recipes cannot be edited.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recipeId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S",
            "description": "The exact custom recipeId returned by add_recipe or find_recipes."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S",
            "description": "The recipe name."
          },
          "description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "pattern": "\\S",
            "description": "A concise description of the finished recipe."
          },
          "servings": {
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 24,
            "description": "How many servings the unscaled recipe makes."
          },
          "timing": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "totalMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 960,
                    "description": "Total elapsed minutes when separate prep and cooking times are unavailable."
                  }
                },
                "required": [
                  "totalMinutes"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "prepMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent preparing ingredients."
                  },
                  "cookMinutes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent cooking the recipe."
                  }
                },
                "required": [
                  "prepMinutes",
                  "cookMinutes"
                ],
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "prepMinutes": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent preparing ingredients."
                  },
                  "cookMinutes": {
                    "type": "integer",
                    "exclusiveMinimum": 0,
                    "maximum": 480,
                    "description": "Minutes spent cooking the recipe."
                  }
                },
                "required": [
                  "prepMinutes",
                  "cookMinutes"
                ],
                "additionalProperties": false
              }
            ],
            "description": "Use either one total time or separate prep and cooking times; PantryOS derives the total for separate times."
          },
          "ingredients": {
            "minItems": 1,
            "maxItems": 40,
            "type": "array",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "pattern": "\\S",
                      "description": "The ingredient name as it should appear."
                    },
                    "optional": {
                      "description": "True only when the recipe can be made without this ingredient.",
                      "type": "boolean"
                    },
                    "section": {
                      "description": "Optional ingredient group, such as Sauce or To finish.",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80,
                      "pattern": "\\S"
                    },
                    "quantity": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "maximum": 1000000,
                      "description": "The numeric ingredient amount."
                    },
                    "displayUnit": {
                      "type": "string",
                      "enum": [
                        "g",
                        "kg",
                        "ml",
                        "l",
                        "count",
                        "package",
                        "serving",
                        "tsp",
                        "tbsp",
                        "cup",
                        "oz",
                        "lb"
                      ],
                      "description": "The unit paired with the ingredient quantity."
                    }
                  },
                  "required": [
                    "name",
                    "quantity",
                    "displayUnit"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120,
                      "pattern": "\\S",
                      "description": "The ingredient name as it should appear."
                    },
                    "optional": {
                      "description": "True only when the recipe can be made without this ingredient.",
                      "type": "boolean"
                    },
                    "section": {
                      "description": "Optional ingredient group, such as Sauce or To finish.",
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80,
                      "pattern": "\\S"
                    }
                  },
                  "required": [
                    "name"
                  ],
                  "additionalProperties": false
                }
              ]
            },
            "description": "The complete ingredient list in recipe order."
          },
          "steps": {
            "minItems": 1,
            "maxItems": 30,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "instruction": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 800,
                  "pattern": "\\S",
                  "description": "One complete recipe direction."
                },
                "section": {
                  "description": "Optional method group, such as Prepare or Bake.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 80,
                  "pattern": "\\S"
                },
                "note": {
                  "description": "A useful cook's note tied to this step.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 300,
                  "pattern": "\\S"
                }
              },
              "required": [
                "instruction"
              ],
              "additionalProperties": false
            },
            "description": "The complete ordered method."
          }
        },
        "required": [
          "recipeId",
          "title",
          "description",
          "servings",
          "timing",
          "ingredients",
          "steps"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    remove_recipeAction

    Use only when the user wants a user-saved recipe deleted. Always opens a human confirmation in PantryOS; built-in recipes cannot be deleted, and grocery items already added from the recipe remain on the list.

    View tool JSON
    {
      "name": "remove_recipe",
      "kind": "act",
      "impl": "imperative",
      "description": "Use only when the user wants a user-saved recipe deleted. Always opens a human confirmation in PantryOS; built-in recipes cannot be deleted, and grocery items already added from the recipe remain on the list.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recipeId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S",
            "description": "The exact custom recipeId returned by add_recipe or find_recipes."
          }
        },
        "required": [
          "recipeId"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    add_grocery_itemAction

    Use once per named shopping item the user wants added. Quantity and unit are optional together. Do not use for food already brought home; use add_inventory_item instead.

    View tool JSON
    {
      "name": "add_grocery_item",
      "kind": "act",
      "impl": "imperative",
      "description": "Use once per named shopping item the user wants added. Quantity and unit are optional together. Do not use for food already brought home; use add_inventory_item instead.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "pattern": "\\S",
            "description": "The grocery item to add."
          },
          "quantity": {
            "description": "Optional amount; must be paired with unit.",
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 1000000
          },
          "unit": {
            "description": "Optional quantity unit; must be paired with quantity.",
            "type": "string",
            "enum": [
              "g",
              "kg",
              "ml",
              "l",
              "count",
              "package",
              "serving"
            ]
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "anyOf": [
          {
            "required": [
              "quantity",
              "unit"
            ]
          },
          {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "quantity"
                  ]
                },
                {
                  "required": [
                    "unit"
                  ]
                }
              ]
            }
          }
        ]
      },
      "page": "/"
    }
    add_recipe_to_grocery_listAction

    Use after a recipe is chosen to add only its currently missing required non-staple ingredients, scaled to optional targetServings. Do not add optional ingredients or duplicate existing grocery items.

    View tool JSON
    {
      "name": "add_recipe_to_grocery_list",
      "kind": "act",
      "impl": "imperative",
      "description": "Use after a recipe is chosen to add only its currently missing required non-staple ingredients, scaled to optional targetServings. Do not add optional ingredients or duplicate existing grocery items.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "recipeId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S",
            "description": "The exact recipeId returned by find_recipes."
          },
          "targetServings": {
            "description": "Scale missing ingredient amounts for this many servings.",
            "type": "integer",
            "exclusiveMinimum": 0,
            "maximum": 24
          }
        },
        "required": [
          "recipeId"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    get_grocery_listAnswer

    Use to inspect the current grocery checklist and whether items were picked up. Do not use to read kitchen inventory or recipe ingredients.

    View tool JSON
    {
      "name": "get_grocery_list",
      "kind": "answer",
      "impl": "imperative",
      "description": "Use to inspect the current grocery checklist and whether items were picked up. Do not use to read kitchen inventory or recipe ingredients.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/"
    }
    navigate_pantryosAction

    Use only when the user asks to see a PantryOS section or an exact recipe already identified by recipeId. Do not use for browser tabs, external URLs, or recipe search.

    View tool JSON
    {
      "name": "navigate_pantryos",
      "kind": "act",
      "impl": "imperative",
      "description": "Use only when the user asks to see a PantryOS section or an exact recipe already identified by recipeId. Do not use for browser tabs, external URLs, or recipe search.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "destination": {
            "type": "string",
            "enum": [
              "dashboard",
              "kitchen",
              "recipes",
              "groceries"
            ],
            "description": "The PantryOS section to open."
          },
          "recipeId": {
            "description": "Optional exact recipeId to open; valid only with the recipes destination.",
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "pattern": "\\S"
          }
        },
        "required": [
          "destination"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "required": [
                "recipeId"
              ]
            },
            "then": {
              "properties": {
                "destination": {
                  "const": "recipes"
                }
              }
            }
          }
        ]
      },
      "page": "/"
    }