MCP App Store
by KeenEthics

Overview

Yokitup is a restaurant inventory and operations management platform designed for restaurant operators and managers. The Yokitup MCP server connects Claude to operational data so users can explore, analyze and better understand their restaurant performance using natural language. Claude can access data such as products, recipes, food costs, inventories, stock losses and waste, stock transfers, and sales. It can combine information from different areas of the business to answer operational questions, identify trends and highlight anomalies. For example, users can ask Claude to identify the products generating the highest losses, analyze food costs and margins, review inventory data, investigate stock movements, compare sales with operational data, or compare performance across locations. The integration is particularly useful for restaurant groups and multi-site operators who need to analyze large amounts of operational data without manually exporting and combining reports. Yokitup helps restaurant teams turn inventory, recipe, cost and sales data into actionable insights, with a particular focus on controlling food costs, understanding margins and improving operational performance.

Tools

analyze_food_cost

ChatGPT
Analyze the food cost in Yokitup over a period: revenue excluding tax, theoretical food cost (justified consumption: POS sales, declared losses, internal/external orders, productions), actual food cost (theoretical plus inventory variances) and the gap between the two. Use this whenever the user asks about food cost, margin control or theoretical vs actual comparisons: "food cost by restaurant last month", "which locations drift the most from their theoretical food cost", "explain the variance between theoretical and actual". Groupable by restaurant or by period. Returns groups (one row per location or time bucket, with display names resolved, sorted by sort_by and truncated to limit) and totals (the same metrics over the whole filtered scope). Each row carries: revenue_excluding_tax, theoretical_food_cost_amount / _percent, actual_food_cost_amount / _percent, variance_amount and variance_percentage_points (the variance is exactly the inventory adjustments: stock missing with no explanation), plus a components breakdown of the consumption by origin. Percentages are null when the revenue is zero. To drill into a component, use analyze_losses (top lost products and loss categories) or analyze_stock_movements (per-product movements, including inventory adjustments). Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - location_ids (array of string, optional): restrict to these locations. - group_by (array of enum "location" | "day" | "week" | "month", optional): dimensions to group by, at most one time dimension. Omit for overall totals only. - sort_by (enum "revenue_excluding_tax" | "theoretical_food_cost_amount" | "actual_food_cost_amount" | "variance_amount" | "variance_percentage_points" | "actual_food_cost_percent", optional, default "variance_amount"): metric used to sort the groups; the default puts the most drifting groups first. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of groups returned (top N), applied after sorting; groups beyond it are silently dropped. With a time dimension in group_by, set it to at least the number of expected groups, otherwise periods go missing from the series: 31 for a month grouped by day, multiplied by the number of locations when also grouping by location. Above 100 groups, split the period or the location_ids across several calls. Groups are sorted by sort_by, not chronologically: order them by period_start to read a time series. A result holding exactly limit groups is most likely truncated.

analyze_losses

ChatGPT
Analyze declared stock losses (write-offs) in Yokitup over a period: aggregated cost and quantities. Use this whenever the user asks about waste, shrinkage or loss causes: "top 10 lost products last month", "losses by category", "which location loses the most", "weekly loss trend". Prefer it over listing losses one by one: the aggregation is done server-side over the whole period. Only saved losses are counted (drafts and canceled ones are excluded). Cross-check with analyze_pos_sales to relate losses to sales of the same products, or with analyze_stock_movements for the full stock picture. Returns groups (one row per combination of the group_by dimensions, with display names resolved, sorted by sort_by and truncated to limit) and totals (the same metrics summed over the WHOLE filtered scope, so you can compute shares like "top 10 products = 70% of loss cost"). Metrics: cost, base_quantity (in the product's base unit, only meaningful when grouped by product). Each group keeps the raw ids so you can drill down with get_product or search_losses. Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - location_ids (array of string, optional): restrict to losses recorded at these locations. - product_ids (array of string, optional): restrict to losses of these products. - loss_category_ids (array of string, optional): restrict to these loss categories (list them with search_losses results or the loss categories of existing losses). - group_by (array of enum "location" | "product" | "loss_category" | "day" | "week" | "month", optional): dimensions to group by, combinable, at most one time dimension. Omit for overall totals only. - sort_by (enum "cost" | "base_quantity", optional, default "cost"): metric used to sort the groups. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of groups returned (top N), applied after sorting; groups beyond it are silently dropped. With a time dimension in group_by, set it to at least the number of expected groups, otherwise periods go missing from the series: 31 for a month grouped by day, multiplied by the number of locations when also grouping by location. Above 100 groups, split the period or the location_ids across several calls. Groups are sorted by sort_by, not chronologically: order them by period_start to read a time series. A result holding exactly limit groups is most likely truncated. - limit_per (enum, one of the group_by dimensions, optional): apply limit within each value of this dimension instead of overall, e.g. group_by: ["location", "product"], limit_per: "location" and limit: 5 for the top 5 lost products of each location, in a single call. group_by must hold at least one other dimension. At most 250 groups are returned overall.

analyze_pos_sales

ChatGPT
Analyze POS sales in Yokitup over a period: aggregated sold quantities, revenue excluding/including tax, cost of goods sold and gross margin. Use this whenever the user asks about sales performance: "top 10 best sellers", "revenue by location", "sales by POS category", "which products have the best margin", "daily sales trend". Prefer it over listing POS orders one by one: the aggregation is done server-side over the whole period. Cross-check with analyze_losses (lost vs sold quantities of a product) or analyze_purchases (purchases vs revenue). Returns groups (one row per combination of the group_by dimensions, with display names resolved, sorted by sort_by and truncated to limit) and totals (the same metrics summed over the WHOLE filtered scope, so you can compute shares like "top 10 products = 45% of revenue"). Metrics: quantity, amount_excluding_tax, amount_including_tax, cost, gross_margin (revenue excluding tax minus cost). Each group keeps the raw ids so you can drill down with get_product or search_pos_orders. Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - location_ids (array of string, optional): restrict to sales recorded at these locations. - product_ids (array of string, optional): restrict to sales of these products. - pos_category_ids (array of string, optional): restrict to these POS categories (e.g. on site, takeaway, delivery). - group_by (array of enum "location" | "product" | "pos_category" | "day" | "week" | "month", optional): dimensions to group by, combinable, at most one time dimension. Omit for overall totals only. - sort_by (enum "quantity" | "amount_excluding_tax" | "amount_including_tax" | "cost" | "gross_margin", optional, default "amount_excluding_tax"): metric used to sort the groups. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of groups returned (top N), applied after sorting; groups beyond it are silently dropped. With a time dimension in group_by, set it to at least the number of expected groups, otherwise periods go missing from the series: 31 for a month grouped by day, multiplied by the number of locations when also grouping by location. Above 100 groups, split the period or the location_ids across several calls. Groups are sorted by sort_by, not chronologically: order them by period_start to read a time series. A result holding exactly limit groups is most likely truncated. - limit_per (enum, one of the group_by dimensions, optional): apply limit within each value of this dimension instead of overall, e.g. group_by: ["location", "product"], limit_per: "location" and limit: 5 for the top 5 sold products of each location, in a single call. group_by must hold at least one other dimension. At most 250 groups are returned overall.

analyze_purchases

ChatGPT
Analyze purchases (received goods) in Yokitup over a period: aggregated amounts, quantities and receipt counts computed from the received goods receipts. Use this whenever the user asks about purchase spend, purchase volumes, supplier comparison or purchase trends: "how much did we buy last month", "top 10 purchased supplier products", "purchases by supplier per location", "monthly purchase trend". Prefer it over listing goods receipts one by one: the aggregation is done server-side over the whole period. Only received goods receipts are counted (drafts and canceled ones are excluded). Cross-check with analyze_pos_sales (purchases vs revenue) or analyze_stock_movements for a full stock picture. Returns groups (one row per combination of the group_by dimensions, with display names resolved, sorted by sort_by and truncated to limit) and totals (the same metrics summed over the WHOLE filtered scope, so you can compute shares like "top 10 = 62% of spend"). Metrics: accepted_amount_excluding_tax, shipped_amount_excluding_tax (a gap between the two reveals billing discrepancies), accepted_quantity (only meaningful when grouped by supplier_product), receipts_count (number of distinct goods receipts). Each group keeps the raw ids so you can drill down with get_supplier_product, get_product or search_supplier_goods_receipts. Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - location_ids (array of string, optional): restrict to goods received at these locations. - supplier_ids (array of string, optional): restrict to these suppliers. - supplier_product_ids (array of string, optional): restrict to these supplier products. - product_ids (array of string, optional): restrict to supplier products linked to these products. - group_by (array of enum "location" | "supplier" | "supplier_product" | "product" | "day" | "week" | "month", optional): dimensions to group by, combinable, at most one time dimension. Omit for overall totals only. - sort_by (enum, optional, default "accepted_amount_excluding_tax"): metric used to sort the groups. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of groups returned (top N), applied after sorting; groups beyond it are silently dropped. With a time dimension in group_by, set it to at least the number of expected groups, otherwise periods go missing from the series: 31 for a month grouped by day, multiplied by the number of locations when also grouping by location. Above 100 groups, split the period or the location_ids across several calls. Groups are sorted by sort_by, not chronologically: order them by period_start to read a time series. A result holding exactly limit groups is most likely truncated. - limit_per (enum, one of the group_by dimensions, optional): apply limit within each value of this dimension instead of overall, e.g. group_by: ["location", "supplier"], limit_per: "location" and limit: 5 for the top 5 suppliers of each location, in a single call. group_by must hold at least one other dimension. At most 250 groups are returned overall.

analyze_stock_movements

ChatGPT
Analyze stock movements in Yokitup over a period: every stock entry and exit (deliveries, sales, losses, transfers, productions, inventory adjustments...) aggregated by type, product, location or time. Quantities and amounts are signed: positive for stock increases, negative for decreases, so summing them gives the net stock variation. Use this whenever the user asks where stock went or came from: "stock movement summary for last month", "how much stock did we consume vs receive", "movements of a given product", "explain the stock variation of a product". With include_stock_boundaries, you get the start/end stock level per product, enabling the reconciliation "start stock + inflows - outflows = end stock". For a single dedicated angle prefer the specialized tools: analyze_purchases, analyze_losses, analyze_pos_sales. Returns groups (one row per combination of the group_by dimensions, with display names resolved, sorted by sort_by and truncated to limit) and totals (net variation over the WHOLE filtered scope). Metrics: quantity (product base unit, only meaningful when grouped by product), amount (valued at product cost). Movement types: supplier_order (deliveries), purchase (quick purchases), pos_order (POS sales), transfer_in / transfer_out, loss, inventory_loss (inventory count adjustments), sales_internal_order / sales_external_order, production_in (ingredients consumed) / production_out (recipes produced), supplier_credit_note. Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - location_ids (array of string, optional): restrict to movements at these locations. - product_ids (array of string, optional): restrict to movements of these products. - operation_types (array of enum, optional): restrict to these movement types (see the list above). - group_by (array of enum "location" | "product" | "operation_type" | "day" | "week" | "month", optional): dimensions to group by, combinable, at most one time dimension. Omit for overall totals only. - sort_by (enum "quantity" | "amount", optional, default "amount"): metric used to sort the groups. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of groups returned (top N), applied after sorting; groups beyond it are silently dropped. With a time dimension in group_by, set it to at least the number of expected groups, otherwise periods go missing from the series: 31 for a month grouped by day, multiplied by the number of locations when also grouping by location. Above 100 groups, split the period or the location_ids across several calls. Groups are sorted by sort_by, not chronologically: order them by period_start to read a time series. A result holding exactly limit groups is most likely truncated. - limit_per (enum, one of the group_by dimensions, optional): apply limit within each value of this dimension instead of overall, e.g. operation_types: ["inventory_loss"], group_by: ["location", "product"], limit_per: "location", sort_direction: "asc" and limit: 5 for the 5 biggest inventory losses of each location, in a single call. group_by must hold at least one other dimension. At most 250 groups are returned overall. - include_stock_boundaries (boolean, optional, default false): add start_quantity / end_quantity (stock level at the period boundaries) to each group; only allowed when group_by is exactly ["product"] or ["product", "location"].

analyze_supplier_product_prices

ChatGPT
Analyze supplier product price evolution in Yokitup over a period: for each supplier product with recorded price changes, the reference price before the period, the first/last/lowest/highest prices of the period, and the resulting change percentage. Use this whenever the user asks about price increases, supplier inflation or purchase price history: "which supplier prices increased the most this quarter", "price evolution of a given supplier product", "did any supplier raise prices by more than 5%". By default the results are sorted by absolute change (biggest movers first), so calling it with a small limit directly gives a "top price changes" ranking. Cross-check with analyze_purchases to weigh a price increase by the purchased volumes. Returns supplier_products (one row per supplier product with at least one price point in the period, with names and supplier resolved, sorted and truncated to limit). Prices are unit prices excluding tax in the supplier's billing packaging. change_percent compares the last price of the period to the reference price (last known before the period, or the first price of the period when none exists). Each row keeps the raw ids so you can drill down with get_supplier_product or get_supplier. Parameters: - date_from (string, required): start of the analyzed period (inclusive), formatted as YYYY-MM-DD. - date_to (string, required): end of the analyzed period (inclusive), formatted as YYYY-MM-DD. - supplier_ids (array of string, optional): restrict to supplier products of these suppliers. - supplier_product_ids (array of string, optional): restrict to these supplier products. - min_change_percent (number, optional): keep only supplier products whose absolute price change is at least this percentage (e.g. 5 for ±5%). - sort_by (enum "change_percent" | "last_price_excluding_tax" | "changes_count", optional, default "change_percent"): metric used to sort; "change_percent" sorts by absolute change. - sort_direction (enum "asc" | "desc", optional, default "desc"): sort direction. - limit (number, optional, default 25, max 100): maximum number of supplier products returned (top N). - include_price_points (boolean, optional, default false): include the dated list of price points of the period for each returned supplier product; keep it false unless analyzing a small filtered set.

create_product

ChatGPT
Create a purchased product in Yokitup: the generic item the organization buys and tracks, such as Tomate, Huile d'olive or Coca-Cola 33cl. Stock levels, inventories, losses, transfers, recipes and analyses all run on the product; the price and the packaging of one supplier belong to a supplier product, not here. Use it when the user buys something the organization does not track yet. For an item produced internally from other components, use create_recipe instead. Make sure the product does not exist yet before creating it, because a duplicate splits the stock, the cost and the history of the item in two. Run search_products on the shortest distinctive word rather than on a whole label (huile rather than Huile d'olive vierge extra bidon 5L), with and without the brand, in the singular and in the plural, then search_supplier_products on the supplier's own label, because the item may already be bought under a product named differently. When a plausible match comes back, keep that product and only add a supplier product to it; ask the user when several candidates are equally plausible. Call list_measurement_units to get the identifier of the unit to use. Name the product generically, without the packaging it is bought in: Huile d'olive where the supplier sells Huile d'olive bidon 5L, Paille where the supplier sells 500 PAILLE PAP KRAFT D6 20CM, Bière 1664 where the supplier sells Bière 1664 FUT 30L. An item counted one by one may carry the format it is sold in, which is what one piece is: Coca-Cola 33cl. The main packaging is the important decision: it is the unit the product is counted in everywhere, and its base unit can NEVER be changed afterwards. Enter a quantity of 1 with kg, L or pièce, and no other unit, these three being what the whole business works in: - kg for goods handled by weight (tomato, beef, flour, peanuts). - L for goods handled by volume (olive oil, beer keg, spirits). - pièce for an item bought and resold as it is and counted one by one (a can of soda, a straw, a sugar stick), even when it holds a volume. - Wine, and wine only (red, white, rosé, champagne), takes 0.75 with L: it is counted in bottles yet poured by the glass, and only ever comes in that format. Every other bottle follows the general rule, so a 70 cL bottle of Aperol is 1 with L. - Never enter the supplier's format as the quantity: a 5 L can of oil is 1 with L, not 5. Two ways of buying the same oil, a 2 L can and a 5 L can, only compare when the product is counted per litre, and every analysis is expected per kilogram, litre or piece. The can itself is declared afterwards with create_product_packaging. Returns the created product with its id, name, type, status and main packaging. Then declare each container the team handles with create_product_packaging, and give the product a price with create_supplier_product. Parameters: - name (string, required): generic name of the product, without the packaging it is bought in. - main_packaging_measurement_unit_id (string, required): id of kg, L or pièce, from list_measurement_units. - main_packaging_quantity (number, required): 1, except 0.75 with L for wine. - main_packaging_name (string, optional): what one main packaging is, only when it is a physical object (BOUTEILLE, CANETTE, PAILLE, DOSETTE); leave it out for goods counted in kg or L.

create_product_packaging

ChatGPT
Add a packaging to a product: another way of counting the same product, next to the main packaging it is tracked in. This is what lets a team count a stock in cans, in packs or in cartons, and record an inventory, a loss or a transfer in that container, while the product itself stays counted per kilogram, litre or piece. Declare one packaging per container the team actually handles, the one the supplier bills as well as the one it delivers: - An olive oil counted per litre, bought in 5 L cans: 5 L, named BIDON. - A soda counted per piece, bought in packs of 24: 24 pièce, named PACK. - A wine counted per 0.75 L bottle, bought by cartons of 6: 4.5 L, named CARTON x 6 — the litres the carton holds, not the six bottles. - Peanuts counted per kilogram, billed by 250 g bags and ordered by cases of 6: a 0.25 kg SACHET and a 1.5 kg COLIS x 6. Nothing is needed when the container is already the main packaging, such as a tomato billed per kilogram. Resolve the identifiers first: search_products or get_product for the product, list_measurement_units for the unit, and list_product_packagings to check the same packaging is not already declared. Express the quantity in the unit the product itself is counted in, with decimals where needed (0.25 kg rather than 250 g). It must in any case share the base unit of the product, fixed when the product was created: a product counted in kg never takes a packaging in L nor in pièce. Returns the created packaging with its id. Parameters: - product_id (string, required): id of the product or recipe. - measurement_unit_id (string, required): id of the measurement unit the product is counted in. - quantity (number, required): how much of the product one container holds. - name (string, optional): display name of the container, such as BIDON or CARTON x 6; omitted, Yokitup labels it from the quantity and the unit.

create_product_tag

ChatGPT
Attach an existing tag to a product or a recipe. This is how a product joins a category, and how it becomes reachable through the tag_ids filter of search_products and search_recipes. Resolve both identifiers first: list_tags for the tag (or create_tag when it does not exist yet) and search_products, search_recipes or get_product for the product. A product carries as many tags as needed, so attaching one never replaces another. Tags are attached one by one: to categorize a product under several tags, call this tool once per tag. Attaching a tag the product already carries is rejected. Returns the product id along with every tag the product carries after the change. Parameters: - product_id (string, required): id of the product or recipe to tag. - tag_id (string, required): id of the tag to attach.

create_recipe

ChatGPT
Create a recipe in Yokitup: an item produced internally from other products, whether it is a dish sold to the customer or a sub-recipe used inside other recipes. Use it when the user wants to add a new preparation. For an item bought from a supplier and used as it is, use create_product instead. Make sure it does not exist yet, a duplicate splitting the cost and the history of the preparation in two: run search_recipes on the shortest distinctive word of the name rather than on the whole label, and search_products as well when the preparation could also be bought ready-made. Call list_measurement_units to get the identifier of the unit to use. The recipe is created empty: add its components one by one with create_recipe_ingredient, using the id returned here as the recipe. The unit and the quantity describe the batch the ingredient list is written for, and the base unit can NEVER be changed afterwards: - A finished recipe sold to the customer as an item (a burger, a pizza, a cocktail) is 1 with pièce: its ingredients are those of one burger, and nothing finer is needed. - A sub-recipe produced in bulk (a sauce, a dough, a stock) takes kg or L with the size of its batch: a ketchup whose ingredients are written for 5 litres is 5 with L. The recipes using it then consume it in litres or centilitres, for the share of the batch they take. - A sub-recipe produced as discrete items (pre-portioned patties) takes pièce, with the number one batch yields. A sub-recipe can itself be built on other sub-recipes, with no limit to the nesting. Returns the created recipe with its id, name, type, status and production batch. Parameters: - name (string, required): display name of the recipe. - main_packaging_measurement_unit_id (string, required): id of the measurement unit, from list_measurement_units. - main_packaging_quantity (number, required): what one batch produces; 1 for a recipe sold per item, the batch size for a bulk sub-recipe. - main_packaging_name (string, optional): name of the batch when it is a physical container (e.g. BAC 5L); leave it out otherwise.

create_recipe_ingredient

ChatGPT
Add one ingredient to an existing recipe: the product it consumes and how much of it. Call it once per ingredient, right after create_recipe, or later when the user wants to complete an existing recipe. An ingredient can be a purchased product or another recipe used as a sub-recipe. The measurement unit of the line must share the base unit of the ingredient product (or of its conversion packaging), otherwise the API rejects the call: a product tracked in kg can be consumed in g or kg but not in L. Call get_product or get_recipe on the ingredient to read the unit it is actually counted in instead of assuming it, and list_measurement_units to pick a compatible one. The quantity is what ONE batch of the recipe consumes, consistently with the batch the recipe was created for: a recipe of 1 pièce takes the quantity for one portion, a recipe of 5 L the quantity for the whole 5 litres. A sub-recipe is consumed for the share of its own batch used here, so a burger sauced with two centilitres of a ketchup produced in 5 L batches is 2 cL. Returns the created ingredient line with its id, the recipe and ingredient ids, and the quantity with its unit. To see the recipe with its full costed ingredient list, call get_recipe afterwards. Parameters: - recipe_product_id (string, required): id of the recipe receiving the ingredient. - ingredient_product_id (string, required): id of the product consumed. - quantity (number, required): quantity consumed by one batch of the recipe. - measurement_unit_id (string, required): id of the measurement unit the quantity is expressed in, from list_measurement_units.

create_supplier

ChatGPT
Create a supplier: a vendor the organization buys from, which may also be an internal provider such as a central kitchen. Use it before recording the items it sells, since create_supplier_product needs a supplier id. Always run search_suppliers on the name first: suppliers are often already there under a slightly different spelling, and a duplicate splits the purchase history in two. The new supplier is created active and available to every location. Its currency and locale default to the organization's own, so only pass them for a supplier that invoices in another currency or expects its purchase orders in another language. Returns the created supplier with its id, ready to be used in create_supplier_product. Parameters: - name (string, required): display name of the supplier. - currency_code (string, optional): ISO 4217 code when the supplier invoices in another currency (e.g. CHF). - locale (string, optional): BCP 47 tag when documents sent to the supplier must use another language (e.g. en-GB).

create_supplier_product

ChatGPT
Create a supplier product: one purchasing option for a Yokitup product, saying at which price and in which packaging one supplier sells it. Orders and deliveries run on supplier products, while stock, recipes, inventories, losses and analyses run on the product itself, which is why a price and a purchase packaging live here and never on the product. A product carries as many supplier products as there are ways of buying it: a 2 L can and a 5 L can of the same olive oil, or that same oil from two suppliers. Use it when the user starts buying an existing product from a new supplier, or right after create_product so the new product gets a price. To change the price of an existing line, use update_supplier_product instead of creating a second one. Gather the identifiers first: search_suppliers for the supplier, search_products for the product (or create_product when the organization does not track the item yet), list_taxes for the tax, and search_supplier_products on the supplier reference, filtered on that supplier, to check the line is not declared already. A supplier naming the item its own way is never a reason to create a second product: attach this line to the product that already exists. unit_price_excluding_tax is the price of ONE billing packaging, in the supplier's currency and in its major unit: pass 12.5 for 12.50 EUR, not 1250. product_unit_per_billing_packaging says how much of the product ONE BILLED packaging holds, in kilograms, litres or pieces — never in main packagings, and never in what is ordered. Billed by the kilogram it is 1, by the can 1, by a 5 L can 5, by a 250 g bag 0.25, by a 880 g tin 0.88, by a 30 L keg 30, by a box of 500 straws 500, by a 75 cL bottle of wine 0.75. Yokitup derives the cost per unit of stock from it, so a wrong value distorts every food cost. The packaging ordered is described separately, and only when it differs from the billed one: set use_different_order_packaging, name it in order_packaging, and count in billing_packaging_per_order_packaging how many BILLED packagings it holds. A wine billed by the bottle and ordered by cartons of 6 bottles is 6 there, its product_unit_per_billing_packaging staying 0.75; a soda billed by the can and ordered by packs of 24 is 24. A catch weight item is billed by weight but ordered per piece, typical of fresh meat, fresh fish and sometimes cheese: few products are concerned, yet most kitchens have a handful of them. A whole salmon billed by the kilogram and ordered per fish of about 1.5 kg takes billing_packaging KG with product_unit_per_billing_packaging 1, weighted true, use_different_order_packaging true (a catch weight item needs an order packaging distinct from the billed one), order_packaging PIECE and billing_packaging_per_order_packaging 1.5, the average weight of one piece. Meat billed and ordered by the kilogram is not a catch weight item. name keeps the wording of the supplier, its packaging included (Huile d'olive bidon 5L), unlike the product name, which stays generic. Returns the created supplier product with its id, supplier, product, price, tax and packaging. Parameters: - supplier_id (string, required): id of the supplier. - product_id (string, required): id of the Yokitup product being purchased. - tax_id (string, required): id of the tax applied by the supplier. - name (string, required): name of the item as the supplier sells it. - unit_price_excluding_tax (number, required): price excluding tax of one billing packaging, in the major currency unit. - billing_packaging (string, required): label of the packaging billed (e.g. KG, BOUTEILLE 75 cL, BIDON 5L). - product_unit_per_billing_packaging (number, required): content of one billed packaging, in kilograms, litres or pieces. - supplier_reference (string, optional): the supplier's own reference for the item. - use_different_order_packaging (boolean, optional, default false): true when orders use another packaging than the billed one. - order_packaging (string, optional): label of the ordering pac…

create_tag

ChatGPT
Create a product tag: a label used to categorize products, for example a family (Viandes), a storage area (Cave) or a purchasing habit (Bio). Once it exists, attach it to products with create_product_tag and filter on it with the tag_ids parameter of search_products and search_recipes. Call list_tags first and reuse an existing tag whenever one fits: near-duplicate tags such as Viande and Viandes make every later filter unreliable. Tags form a tree. Pass parent_id to place the new tag under an existing one, which is how a category is refined, for instance Vins rouges under Boissons. Products keep their own tags: tagging a product with a child tag does not tag it with the parent. Returns the created tag with its id. Parameters: - name (string, required): display name of the tag. - parent_id (string, optional): id of the parent tag; omit or pass null for a top-level tag.

delete_product_packaging

ChatGPT
Delete an additional packaging of a product. Get its id from list_product_packagings. Use it when a packaging no longer exists in the fridge, or to replace a wrong quantity by creating the right packaging afterwards. The packaging stops being offered when counting or moving that product. Stock already recorded stays as it is, since Yokitup stores quantities in the product's base unit. The main packaging of the product is not affected, and this cannot be undone. Returns a short confirmation message. Parameters: - id (string, required): id of the packaging to delete.

delete_product_tag

ChatGPT
Detach one tag from one product or recipe. Use it when a product no longer belongs to a category, or to correct a tag attached by mistake. Identify the pair rather than a link id: pass the product and the tag, and the link between them is removed. get_product lists the tags a product currently carries. Only this product loses the tag. The tag itself stays in the account and keeps applying to every other product; use delete_tag when the whole tag must disappear. Returns a short confirmation message. Parameters: - product_id (string, required): id of the product or recipe to untag. - tag_id (string, required): id of the tag to detach from it.

delete_recipe_ingredient

ChatGPT
Remove one ingredient line from a recipe. Use it when the user drops an ingredient, or as the first half of replacing one ingredient with another (delete the line, then call create_recipe_ingredient with the new product, since the ingredient product of an existing line cannot be changed). Get the line id from the recipe_ingredients returned by get_recipe. This removes the ingredient from the recipe and changes its cost. It does not delete the ingredient product itself, which stays in the catalogue and in every other recipe using it. The removal cannot be undone, so confirm with the user which line is meant when several are close. Returns a short confirmation message. Parameters: - id (string, required): id of the ingredient line to remove.

delete_tag

ChatGPT
Delete a tag from the account. Get its id from list_tags. Deleting a tag detaches it from every product carrying it, so any saved filter or report built on that tag stops returning those products. The products themselves are untouched. This cannot be undone: to remove the tag from a single product, use delete_product_tag instead, and to fix a wrong name, use update_tag. Confirm with the user before deleting a tag that is in use. Returns a short confirmation message. Parameters: - id (string, required): id of the tag to delete.

explain_inventory_valuation

ChatGPT
Explain how the unit cost of a single product on a single inventory (stock count) is computed. Each inventory is valued with its own valuation method, either weighted average cost (WAC, a.k.a. CMP/CUMP/PMP) or FIFO (first in, first out, a.k.a. PEPS); the method of an inventory is given by valuation_method on search_inventories. Use this whenever a user asks why a product is valued at a given cost, e.g. "how is the tomato cost computed on this inventory", "explain the valuation / weighted average cost / FIFO cost of this product". Compare computed_unit_cost with inventory.unit_cost to spot a mismatch: when they differ, a stock entry was usually added, modified or back-dated before the inventory date after the inventory was closed. Works only on a product actually counted with a real stock; otherwise the call is rejected. Returns components (the previous inventories and incoming stock movements entering the valuation, with quantity and value), total_quantity / total_amount, computed_unit_cost and the inventory values as stored (including its unit_cost). To find the inventory and product ids first, use search_inventories / search_inventory_items and the product search tools. Parameters: - inventory_id (string, required): identifier of the inventory to analyze. - product_id (string, required): identifier of the counted product to analyze.

explain_inventory_variance

ChatGPT
Explain the stock variance of a single product on a single inventory (stock count): justify the inventory loss by reconciling the theoretical stock with the real counted stock. It takes the starting stock (the previous inventory, or 0 built from the first stock movement within the last 3 months when there is no prior inventory), adds every stock movement over the period (deliveries, quick purchases, POS sales, losses, transfers, productions...), and compares the resulting theoretical stock to the real counted stock. Use this whenever a user asks to understand or justify a gap seen at inventory, e.g. "explain the variance on tomatoes for this inventory", "why did I lose stock on this product", "reconcile theoretical vs real stock". Works only on a product actually counted with a real stock; otherwise the call is rejected. Returns start (baseline stock with its origin), movements (each non-zero movement type, quantity and value signed: positive for increases, negative for decreases), theoretical_stock (start + movements), real_stock (counted) and variance (theoretical - real, i.e. the unexplained inventory loss). To pinpoint the inventory and product ids first, use search_inventories / search_inventory_items and the product search tools. Parameters: - inventory_id (string, required): identifier of the inventory to analyze. - product_id (string, required): identifier of the counted product to analyze.

get_current_organization

ChatGPT
Retrieve the Yokitup organization (brand/company) the current session is connected to. Use this whenever you need to know or display which organization the user is currently working in. Returns the organization: its id and name. Parameters: none (this tool takes no arguments).

get_current_stock

ChatGPT
List the current stock levels of products in Yokitup, with their unit cost. Returns one entry per product and location. Use this whenever the user asks "how much do we have in stock?", "what is the current stock of ...?", or wants stock quantities and their cost across products or locations. Returns each stock entry with its product_id, product_name, location_id, location_name, the quantity currently in stock (expressed in the product's base unit) and the unit_cost per base unit, plus a next_cursor for pagination. Only actively tracked stock is returned; products with no tracked stock are omitted. Parameters: - product_ids (array of string, optional): keep only the current stock of these product ids; use it to look up stock for specific products. - location_ids (array of string, optional): keep only the current stock held at these location ids. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

get_loss

ChatGPT
Retrieve a single Yokitup loss (stock write-off) by its id, with all of its details and its lost items. Use this as the follow-up to search_losses once you have identified a relevant loss id, or whenever the user asks about the products written off in a loss, their lost quantities, or their valued cost. Returns the full loss (with its location_name and loss_category_name) and embeds loss_items: one entry per lost product, each with its product_name, its own loss_category_name, the lost quantities (with their packaging measurement unit names), the total lost base quantity, and the valued cost. Note: when the loss has processing set to true, its computed cost and quantities are still being recalculated and are not final yet. Parameters: - id (string, required): the loss id, typically taken from a search_losses result.

get_pos_order

ChatGPT
Retrieve a single Yokitup POS order (sales transaction) by its id, with all of its details and its sold items. Use this as the follow-up to search_pos_orders once you have identified a relevant order id, or whenever the user asks about the products sold in an order, their sold quantities, or their sales amounts and cost. Returns the full POS order (with its location_name and pos_category_name) and embeds pos_order_items: one entry per sold product, each with its product_name, the sold quantity, the total sold base quantity, the sales amount_including_tax and amount_excluding_tax, and the cost. Note: when the order has processing set to true, its computed amounts and cost are still being recalculated and are not final yet. The order's amount_excluding_tax and amount_including_tax are the real POS receipt totals, so they can differ from the sum of the items' amounts: item amounts only cover POS products mapped to a Yokitup product, so unmapped products are missing. Parameters: - id (string, required): the POS order id, typically taken from a search_pos_orders result.

get_product

ChatGPT
Retrieve a single Yokitup product by its id, enriched with its complementary purchasing, stock and cost information. Use this as the follow-up to search_products once you have identified a relevant product id, or whenever the user asks for the product's supplier products, stock levels or cost, which are not carried directly on the product and are not returned by search_products. Returns the product's own fields (identifiers, name, type, status, and its main and conversion packaging, each with quantity and the measurement unit) plus complementary information not stored directly on the product: supplier_products (the active supplier products for this product across suppliers, with pricing and packaging), product_stocks (the current stock level per location), costs (the cost of one main packaging per location), average_cost (the average cost of one main packaging across all locations, a single overall cost without inspecting each site) and tags (the tags directly assigned to this product, each with its id, name and parent_id). Use this instead of separately calling search_supplier_products when you need this product's purchasing, stock or cost details. The main packaging returned is the unit this product is actually counted in, and stock quantities, costs and recipe lines are all expressed against it. Read it here instead of assuming the 1 kg / 1 L / 1 pièce new products are created with: a product may well be counted in the format it is bought in, such as a 5 L can. Parameters: - id (string, required): the product id, typically taken from a search_products result.

get_recipe

ChatGPT
Retrieve a single Yokitup recipe by its id, enriched with its complementary stock, cost and ingredient breakdown. Recipes are products produced internally from other components (ingredients or other recipes), as opposed to purchased items. Use this as the follow-up to search_recipes once you have identified a relevant recipe id, or whenever the user asks for the recipe's stock or cost per site or ingredient breakdown, which are not carried directly on the product and are not returned by search_recipes. Returns the recipe's own fields (identifiers, name, type, status, and its main and conversion packaging, each with quantity and the measurement unit) plus complementary information not stored directly on the product: product_stocks (the current stock level per location), costs (the cost of goods for one main packaging per location), average_cost (the average cost of goods for one main packaging across all locations, a single overall cost of goods without inspecting each site), recipe_ingredients (the ingredient lines, each with its ingredient_product_id, ingredient_product_name, the quantity + measurement unit consumed by the recipe, costs: the cost of that ingredient consumed by the recipe broken down per location, and average_cost: the average of those costs across all locations) and tags (the tags directly assigned to this recipe, each with its id, name and parent_id). The main packaging returned is the batch this recipe is produced and costed for, and its ingredient quantities are those of that batch. Read it here instead of assuming a single portion: a sub-recipe is often produced by batches of several litres or kilograms. Parameters: - id (string, required): the recipe id, typically taken from a search_recipes result.

get_stock_transfer

ChatGPT
Retrieve a single Yokitup stock transfer by its id, with all of its details and its transferred item lines. Use this as the follow-up to search_stock_transfers once you have identified a relevant transfer id, or whenever the user asks about the products moved in a transfer, their ordered/shipped/accepted quantities, or their costs. Returns the full transfer (with its source_location_name and destination_location_name) and embeds stock_transfer_items: one entry per transferred line, each with its product_name, its ordered/shipped/accepted costs, and its ordered/shipped/accepted quantities (with their packaging measurement unit names) and base quantities. Note: when the transfer has processing set to true, its computed costs are still being recalculated and are not final yet. Parameters: - id (string, required): the stock transfer id, typically taken from a search_stock_transfers result.

get_supplier

ChatGPT
Retrieve a single Yokitup supplier (vendor) by its id, with all of its details. Use this as the follow-up to search_suppliers once you have identified a relevant supplier id, or whenever the user asks for a specific supplier by id. Returns the full supplier: id, location group, name, status, locale, and currency code. The status is there to be read, not changed: archiving or reactivating a supplier is done by the user in Yokitup, because archiving one deactivates every item bought from it. To stop buying a single item, use update_supplier_product_status. Parameters: - id (string, required): the supplier id, typically taken from a search_suppliers result.

get_supplier_goods_receipt

ChatGPT
Retrieve a single Yokitup supplier goods receipt by its id, with all of its details and its received item lines. Use this as the follow-up to search_supplier_goods_receipts once you have identified a relevant receipt id, or whenever the user asks about the products received in a delivery, the quantities the supplier declared shipping on its delivery note against those actually accepted, or their amounts. Returns the full goods receipt (with its supplier_name, its location_name and the supplier_purchase_order_id of the purchase order it belongs to, or null when there is none) and embeds supplier_goods_receipt_items: one entry per received line, each with its supplier_product_name, its linked product_name (or null when unlinked), the shipped and accepted amounts (including and excluding tax), the shipped and accepted quantities (with their packaging measurement unit names), and an optional secondary accepted quantity. All monetary amounts are expressed in the supplier's currency. Parameters: - id (string, required): the supplier goods receipt id, typically taken from a search_supplier_goods_receipts result.

get_supplier_product

ChatGPT
Retrieve a single Yokitup supplier product by its id, with all of its purchasing details (units and pricing: unit price excluding tax, billing and order packaging, catch weight...). Use this as the follow-up to search_supplier_products once you have identified a relevant supplier product id, or whenever the user asks for the purchase details of a specific supplier product by id. Returns the full supplier product, including the supplier name. Parameters: - id (string, required): the supplier product id, typically taken from a search_supplier_products result.

get_supplier_purchase_order

ChatGPT
Retrieve a single Yokitup supplier purchase order by its id, with all of its details and its ordered item lines. Use this as the follow-up to search_supplier_purchase_orders once you have identified a relevant order id, after reading the supplier_purchase_order_id of a goods receipt, or whenever the user asks which products and quantities were ordered. To compare the order with what was actually delivered, call search_supplier_goods_receipts with supplier_purchase_order_ids set to this id and statuses set to ["draft", "received", "canceled"], then get_supplier_goods_receipt on the receipt found. Returns the full purchase order (with its reference_number, supplier_name and location_name) and embeds supplier_purchase_order_items: one entry per ordered line, each with its supplier_product_name, its linked product_name (or null when unlinked), the ordered amounts (including and excluding tax) and the ordered quantity (with its packaging measurement unit name). All monetary amounts are expressed in the supplier's currency. Parameters: - id (string, required): the supplier purchase order id, typically taken from a search_supplier_purchase_orders result or from the supplier_purchase_order_id of a goods receipt.

list_location_groups

ChatGPT
List all location groups of the Yokitup organization the current session is connected to, together with the locations each one contains. A location group is a named collection of locations (e.g. by region, brand, or store type), and a single location can belong to several groups. Use this whenever the user talks about a group of locations rather than a single one, or to turn a location_group_id returned by another tool (on a product, supplier, supplier product or menu) into a group name and the actual locations it covers. Returns every location group, each with its id, name, and its locations with their id, name, currency code and time zone. All location groups are returned in a single response (no pagination). A group with no location assigned comes back with an empty location list. Parameters: none (this tool takes no arguments).

list_locations

ChatGPT
List all locations of the Yokitup organization the current session is connected to. A location is a physical site (restaurant, retail outlet, bar, storage cellar, central stock...) with its own inventory and operations. Use this whenever you need to know, display, or let the user pick among the organization's locations. Returns every location, each with its id, name, currency code, and time zone. All locations are returned in a single response (no pagination). Parameters: none (this tool takes no arguments).

list_measurement_units

ChatGPT
List all measurement units available to the Yokitup organization the current session is connected to (kg, g, L, cL, mL, pièce...). Use this as the FIRST step before create_product, create_recipe, update_product, create_recipe_ingredient or update_recipe_ingredient, which all reference a measurement unit by its id. Returns every measurement unit, each with its id, name, base_quantity and base_unit. All units are returned in a single response (no pagination). The base_unit (ea, g, ml or cm) tells which family the unit belongs to, and base_quantity how many of those base units it contains: kg is 1000 g, L is 1000 ml, pièce is 1 ea. Two units can be combined in the same operation only when they share the same base_unit. Parameters: none (this tool takes no arguments).

list_menus

ChatGPT
List all menus of the Yokitup organization the current session is connected to. A menu (French "carte") is the list of dishes sold to customers together with their selling prices; an organization usually maintains several of them (e.g. "Lunch", "Winter menu", "Bar"), each applying either to a location group or to the whole organization. Use this as the FIRST step whenever the user asks about menus, selling prices or dish margins, to know which menus exist and pick the relevant one. Returns every menu, each with its id, name, and the location group it applies to. All menus are returned in a single response (no pagination). The dishes and their prices are NOT included, to keep responses small: once you identify a relevant menu, call search_menu_items with its id to read the dishes it lists. Parameters: none (this tool takes no arguments).

list_product_packagings

ChatGPT
List the additional packagings declared for one product: the other ways the same product is counted and handled, on top of the main packaging returned by get_product (a carton of 6 bottles, a 25 kg sack, a pack of 24). Use it to see what already exists before calling create_product_packaging, and to get the id needed by update_product_packaging and delete_product_packaging. Returns every packaging of the product, each with its id, name, quantity and measurement unit. The list is empty when the product is only ever handled in its main packaging. Parameters: - product_id (string, required): id of the product or recipe.

list_tags

ChatGPT
List every product tag of the account in a single call. Tags categorize products and can be nested hierarchically. Use this to discover which tags exist and to resolve tag names to their ids before filtering with the tag_ids parameter of search_products or search_recipes. Returns all tags at once (typically a few dozen), each with its id, name and parent_id. There is no search or pagination: the full list is always returned. Parameters: none.

list_taxes

ChatGPT
List all taxes defined for the Yokitup organization the current session is connected to (VAT rates such as 20%, 10%, 5.5%). Use this before create_supplier_product or update_supplier_product, which reference a tax by its id, or to turn a tax_id returned by another tool into a readable rate. Returns every tax, each with its id, name and rate as a percentage. All taxes are returned in a single response (no pagination). Parameters: none (this tool takes no arguments).

search_help_center

ChatGPT
Search the Yokitup help center for articles that may answer a user's question. Runs a free-text search across article titles and bodies and returns relevance-ranked matches. Use this as the FIRST step whenever a user asks something the Yokitup documentation might cover. Returns a list of matching articles, each with its id, public URL, last update date, title, short description, and full body content (as HTML). Parameters: - phrase (string, required): the search query, matched against article title and body. - locale (enum "fr" | "en", optional, default "fr"): the end user's language, inferred from the conversation; determines the language of the returned title, description and URL.

search_inventories

ChatGPT
Search and list inventories (stock counts) in Yokitup. An inventory is a stock count performed at a location on a given date, optionally scoped to an area or a category, and possibly consolidated from several partial counts. Use this whenever the user asks about inventory counts, stock takes, or their valued amounts, and to find an inventory to inspect. To narrow down, filter by location and by date range. Returns the matching inventories in full, each with its location_name, inventory_category_name and inventory_area_name, plus a next_cursor for pagination. The counted items of each inventory are NOT included, to keep responses small: once you identify a relevant inventory, call search_inventory_items with its id to read its items. Note: when an inventory has processing set to true its computed amounts are still being recalculated and are not final yet. Parameters: - location_ids (array of string, optional): keep only inventories performed at these locations. - date_from (string, optional): keep only inventories dated on or after this date (inclusive), formatted as YYYY-MM-DD. - date_to (string, optional): keep only inventories dated on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only inventories with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_inventory_items

ChatGPT
List the counted items of a Yokitup inventory (stock count), one entry per counted product. Use this whenever the user asks about the products counted in an inventory, their counted quantities, or their valued amounts, once you have an inventory id from search_inventories. Returns a page of inventory_items, each with its product_name, the counted quantities (with their packaging measurement unit names), the counted/theoretical/actual base quantities, and the valued amount and loss_amount, plus a next_cursor for pagination. An inventory can hold several thousand items: only fetch further pages when the question needs the full list (e.g. a total or a ranking across all products). Note: when the inventory has processing set to true, its computed amounts and quantities are still being recalculated and are not final yet. Parameters: - inventory_id (string, required): the inventory id, typically taken from a search_inventories result. Pass the same value again when paginating. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page.

search_losses

ChatGPT
Search and list losses (stock write-offs) in Yokitup. A loss is a recorded stock write-off at a location on a given date, optionally classified by a loss category (e.g. breakage, spoilage, theft, staff meal), and valued at cost. Use this whenever the user asks about losses, waste, breakage or their valued cost, and to find a loss to inspect. To narrow down, filter by location and by date range. Returns the matching losses in full, each with its location_name and loss_category_name, plus a next_cursor for pagination. The lost items of each loss are NOT included, to keep responses small: once you identify a relevant loss, call get_loss with its id to read its items. Note: when a loss has processing set to true its computed cost is still being recalculated and is not final yet. Parameters: - location_ids (array of string, optional): keep only losses recorded at these locations. - date_from (string, optional): keep only losses dated on or after this date (inclusive), formatted as YYYY-MM-DD. - date_to (string, optional): keep only losses dated on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only losses with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_menu_items

ChatGPT
Search and list the dishes sold on the menus of a Yokitup organization, with their selling prices and their profitability. A menu item is one dish listed on one menu: the product sold, the price the customer pays, and the cost of making it. Use this whenever the user asks about selling prices, dish costs, margins or profitability, or wants to know at what price a product is sold. To narrow down, filter by menu (ids from list_menus) or by product. Returns the matching dishes, plus a next_cursor for pagination. Each dish carries its menu_name and product_name, its selling price including and excluding tax, and locations: the cost of goods and the resulting margin (in currency and as a percentage of the price excluding tax) at each location the menu applies to, since purchase prices differ per location. average_cost, average_margin and average_margin_rate summarize those locations into a single figure, so you can answer about a dish's profitability without inspecting each location. A location where the dish is unavailable or has never been valued is still listed, with a null cost and margin. Parameters: - menu_ids (array of string, optional): keep only the dishes listed on these menus. - product_ids (array of string, optional): keep only the dishes selling these products. - ids (array of string, optional): keep only menu items with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_pos_orders

ChatGPT
Search and list POS orders (sales transactions) in Yokitup. A POS order is a sale recorded by a Point-of-Sale system at a location on a given date, optionally classified by a POS category (e.g. on site, takeaway, delivery), with its sales amounts and cost of goods sold. Use this whenever the user asks about sales, revenue, POS transactions or their cost, and to find an order to inspect. To narrow down, filter by location and by date range. Returns the matching POS orders in full, each with its location_name and pos_category_name, plus a next_cursor for pagination. The sold items of each order are NOT included, to keep responses small: once you identify a relevant order, call get_pos_order with its id to read its items. Note: when an order has processing set to true its computed amounts and cost are still being recalculated and are not final yet. Parameters: - location_ids (array of string, optional): keep only POS orders recorded at these locations. - date_from (string, optional): keep only POS orders dated on or after this date (inclusive), formatted as YYYY-MM-DD. - date_to (string, optional): keep only POS orders dated on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only POS orders with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_products

ChatGPT
Search and list purchased products in Yokitup. Runs a filtered lookup over the products bought from suppliers (never recipes or fees) and returns the matching products, most useful for answering questions like "which products do we buy?", finding a product by name, or fetching several products by id. Use this as the FIRST step whenever the user refers to purchased items, articles, or supplier products. Call it as well before every create_product, to make sure the item is not tracked already: a duplicate product splits the stock, the cost and the history of that item in two. Search the shortest distinctive word rather than a whole label (huile rather than Huile d'olive vierge extra bidon 5L), with and without the brand, in the singular and in the plural, and include the inactive status so an archived product comes back too, to be reactivated instead of created again. Returns each matching product (id, location group, name, type, status, and main/conversion packaging with each measurement unit) plus a next_cursor for pagination. The results deliberately omit the supplier products and stock levels, which are complementary information not carried directly on the product: call get_product with a product id to get those purchasing and stock details. Only purchased products are ever returned. Parameters: - query (string, optional): free-text search matched against product name and reference. - statuses (array of "active" | "inactive", optional, default ["active"]): which product statuses to include; add "inactive" to also list archived products. - tag_ids (array of string, optional): keep only products carrying at least one of these tag ids. - ids (array of string, optional): keep only products with these exact ids; use it to fetch several products by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_recipes

ChatGPT
Search and list recipes in Yokitup. Recipes are products produced internally from other components (ingredients or other recipes), as opposed to purchased items. Use this as the FIRST step whenever the user refers to recipes, preparations, or internally produced products. Call it as well before every create_recipe, to make sure the preparation does not exist already: search the shortest distinctive word rather than a whole label, and include the inactive status so an archived recipe comes back too, to be reactivated instead of created again. Returns each matching recipe (id, location group, name, type, status, and main/conversion packaging with each measurement unit) plus a next_cursor for pagination. To read a single recipe with its complementary per-location stock/cost and ingredient breakdown you can also call get_recipe with its id. Parameters: - query (string, optional): free-text search matched against recipe name and reference. - statuses (array of "active" | "inactive", optional, default ["active"]): which statuses to include; add "inactive" to also list archived recipes. - tag_ids (array of string, optional): keep only recipes carrying at least one of these tag ids. - ids (array of string, optional): keep only recipes with these exact ids; use it to fetch several recipes by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_stock_transfers

ChatGPT
Search and list stock transfers in Yokitup. A stock transfer is an internal movement of stock between two locations, tracked through order, shipment and reception, with its valued costs. Use this whenever the user asks about transfers between locations, internal movements or their costs, and to find a transfer to inspect. To narrow down, filter by source and destination location, and by order or reception date range. Returns the matching transfers in full, each with its source_location_name and destination_location_name, plus a next_cursor for pagination. The transferred item lines of each transfer are NOT included, to keep responses small: once you identify a relevant transfer, call get_stock_transfer with its id to read its items. Note: when a transfer has processing set to true its computed costs are still being recalculated and are not final yet. Parameters: - source_location_ids (array of string, optional): keep only transfers whose source location is one of these. - destination_location_ids (array of string, optional): keep only transfers whose destination location is one of these. - order_date_from (string, optional): keep only transfers ordered on or after this date (inclusive), formatted as YYYY-MM-DD. - order_date_to (string, optional): keep only transfers ordered on or before this date (inclusive), formatted as YYYY-MM-DD. - received_date_from (string, optional): keep only transfers received on or after this date (inclusive), formatted as YYYY-MM-DD. - received_date_to (string, optional): keep only transfers received on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only transfers with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_supplier_goods_receipts

ChatGPT
Search and list supplier goods receipts in Yokitup. A supplier goods receipt records a delivery arriving at a location, with both the quantities and amounts the supplier announced on its delivery note and those actually accepted on reception. Use this whenever the user asks what a supplier delivered or what was actually received, and to find a delivery to inspect. To narrow down, filter by location, by supplier, by purchase order, by status, and by reception date range. To link an order to its reception, pass the order ids from search_supplier_purchase_orders in supplier_purchase_order_ids; conversely, call get_supplier_purchase_order with a receipt's supplier_purchase_order_id to read what was ordered. By default only goods receipts that have actually been received are returned, which hides receptions not validated yet; pass statuses to include draft or canceled ones, for instance ["draft", "received", "canceled"] when looking up the reception of an order. Returns the matching goods receipts in full, each with its supplier_name, its location_name and the supplier_purchase_order_id of the purchase order it belongs to (or null when there is none), plus a next_cursor for pagination. The received item lines of each receipt are NOT included, to keep responses small: once you identify a relevant receipt, call get_supplier_goods_receipt with its id to read its items. All monetary amounts are expressed in the supplier's currency. Parameters: - location_ids (array of string, optional): keep only goods receipts received at these locations. - supplier_ids (array of string, optional): keep only goods receipts from these suppliers. - supplier_purchase_order_ids (array of string, optional): keep only goods receipts of these supplier purchase orders. - statuses (array of enum "draft" | "received" | "canceled", optional, default ["received"]): keep only goods receipts with these statuses; "draft" while the reception is not confirmed yet, "received" once the goods have been received, "canceled" when the reception was canceled. - received_date_from (string, optional): keep only goods receipts received on or after this date (inclusive), formatted as YYYY-MM-DD. - received_date_to (string, optional): keep only goods receipts received on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only goods receipts with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_supplier_invoices

ChatGPT
Search and list supplier invoices in Yokitup. A supplier invoice is the bill a supplier issued for what it sold, with its invoice number and its total amounts. Use this whenever the user asks what a supplier billed, how much is invoiced over a period, or to find a specific invoice. To narrow down, filter by supplier and by issue date range. Returns the matching invoices in full, each with its supplier_name, plus a next_cursor for pagination. The goods receipts and credit notes attached to an invoice are NOT included. All monetary amounts are expressed in the supplier's currency. Parameters: - supplier_ids (array of string, optional): keep only invoices issued by these suppliers. - issue_date_from (string, optional): keep only invoices issued on or after this date (inclusive), formatted as YYYY-MM-DD. - issue_date_to (string, optional): keep only invoices issued on or before this date (inclusive), formatted as YYYY-MM-DD. - ids (array of string, optional): keep only invoices with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_supplier_products

ChatGPT
Search and list supplier products in Yokitup. A supplier product defines the purchasing details of a product from a specific supplier, including its units and pricing (unit price excluding tax, billing and order packaging, catch weight...). Use this whenever the user asks about purchase prices, how a product is bought from a supplier, or the supplier catalog. To find the supplier products for a given product or supplier, filter with product_ids or supplier_ids. Two uses come before a creation. Before create_supplier_product, search the supplier's reference filtered on that supplier_ids to check the purchase line is not declared already, one reference being normally sold once per supplier. Before create_product, search the supplier's own label: a result points to the product already behind it, which is then reused instead of creating a duplicate product. Returns the matching supplier products in full plus a next_cursor for pagination. The product_id of a result is the Yokitup product the purchase line feeds, and the name of a supplier product is the supplier's wording, which often differs from the product's own name. Parameters: - query (string, optional): free-text search matched against supplier product name and supplier reference. - statuses (array of "active" | "inactive", optional, default ["active"]): which statuses to include; add "inactive" to also list archived supplier products. - supplier_ids (array of string, optional): keep only supplier products belonging to these suppliers. - product_ids (array of string, optional): keep only supplier products linked to these Yokitup products. - ids (array of string, optional): keep only supplier products with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_supplier_purchase_orders

ChatGPT
Search and list supplier purchase orders in Yokitup. A supplier purchase order records what a location ordered from a supplier, with its order date, the delivery date requested from the supplier and the ordered amounts. Use this whenever the user asks what was ordered, which orders are pending or late, or mentions an order by its reference number (e.g. "PO-7AF3-00360"), and to find an order to inspect. To narrow down, filter by location, supplier, status, reception progress, order date range, requested delivery date range or reference number. Status "ordered" covers every order sent to the supplier, including those whose goods have since been received. To tell them apart, use supplier_goods_receipt_statuses: ["draft"] returns the orders still awaiting delivery (combine it with requested_delivery_date_to set to today to find late deliveries), ["received"] the orders already received. To see what was actually accepted on reception, call search_supplier_goods_receipts with supplier_purchase_order_ids set to the order ids and statuses set to ["draft", "received", "canceled"]. Returns the matching purchase orders, each with its reference_number, supplier_name and location_name, plus a next_cursor for pagination. The ordered item lines are NOT included, to keep responses small: once you identify a relevant order, call get_supplier_purchase_order with its id to read its items. All monetary amounts are expressed in the supplier's currency. Parameters: - location_ids (array of string, optional): keep only purchase orders placed for these locations. - supplier_ids (array of string, optional): keep only purchase orders placed with these suppliers. - statuses (array of enum "draft" | "ordered" | "canceled", optional, default every status): keep only purchase orders with these statuses. - supplier_goods_receipt_statuses (array of enum "draft" | "received", optional): keep only sent purchase orders whose goods receipt has these statuses; "draft" for orders not received yet, "received" for orders already received. Draft and canceled orders are never returned when set. - order_date_from (string, optional): keep only purchase orders sent on or after this date (inclusive), formatted as YYYY-MM-DD. - order_date_to (string, optional): keep only purchase orders sent on or before this date (inclusive), formatted as YYYY-MM-DD. - requested_delivery_date_from (string, optional): keep only purchase orders whose requested delivery date is on or after this date (inclusive), formatted as YYYY-MM-DD. - requested_delivery_date_to (string, optional): keep only purchase orders whose requested delivery date is on or before this date (inclusive), formatted as YYYY-MM-DD. - reference_numbers (array of string, optional): keep only purchase orders with these exact reference numbers. - ids (array of string, optional): keep only purchase orders with these exact ids; use it to fetch several by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

search_suppliers

ChatGPT
Search and list suppliers (vendors) in Yokitup. Suppliers provide products to the organization and may also be internal providers such as a central kitchen. Use this as the FIRST step whenever the user refers to suppliers, vendors, or where products are bought from. Returns the matching suppliers in full (id, location group, name, status, locale, currency code) plus a next_cursor for pagination. Parameters: - query (string, optional): free-text search matched against supplier name. - statuses (array of "active" | "inactive", optional, default ["active"]): which statuses to include; add "inactive" to also list archived suppliers. - ids (array of string, optional): keep only suppliers with these exact ids; use it to fetch several suppliers by id at once. - cursor (string, optional): opaque pagination token from a previous next_cursor; pass it to get the next page. When set, the other filters are ignored because they are already encoded in the cursor.

update_product

ChatGPT
Update an existing Yokitup product or recipe: its name and its main packaging. This single tool covers both purchased products (from search_products / get_product) and recipes (from search_recipes / get_recipe), which share the same fields. Only the fields you pass are modified; every other field, including the ones this tool does not expose (location group, conversion packaging), is left untouched. To archive a product or bring an archived one back, use update_product_status. The product's base unit is fixed at creation and cannot be changed: a new main_packaging_measurement_unit_id must share the base unit of the current one. Moving a product from kg to g works, moving it from kg to L or to pièce is rejected. Call list_measurement_units to find a compatible unit, and get_product / get_recipe to see the current one. Changing the packaging re-expresses the stock levels and costs of the product, so only do it when the user explicitly asks for it. A product is meant to be counted per 1 kg, 1 L or 1 pièce, wine per 0.75 L. One created with a supplier's format instead, such as a 5 L can or a 25 kg sack, is brought back to that here by setting main_packaging_quantity to 1, the container itself being declared with create_product_packaging. Nothing forces an existing product to follow the convention, so read its current packaging before offering to change it. A new name follows the same rule as at creation: the generic item, without the packaging it is bought in. Returns the product as it stands after the update. Parameters: - id (string, required): id of the product or recipe to update. - name (string, optional): new display name. - main_packaging_measurement_unit_id (string, optional): new measurement unit, sharing the current base unit. - main_packaging_quantity (number, optional): new number of measurement units per main packaging. - main_packaging_name (string, optional): new display name for the packaging.

update_product_packaging

ChatGPT
Rename a product packaging, so the team recognizes it under the name it actually uses (CARTON, PACK DE 6, SAC). Get its id from list_product_packagings. Only the name can change. The quantity and the measurement unit are what the packaging means, and stock movements already recorded rely on them: to correct them, delete the packaging with delete_product_packaging and create the right one with create_product_packaging. Returns the packaging as it stands after the update. Parameters: - id (string, required): id of the packaging to rename. - name (string or null, required): new display name, or null to fall back to the automatic label.

update_product_status

ChatGPT
Archive a product or a recipe by setting its status to inactive, or bring an archived one back with active. Products and recipes are never deleted in Yokitup: archiving is how the user retires something that is no longer bought, made or sold, while keeping its purchase and stock history intact. Works for both purchased products and recipes. Archiving is not a reversible flag, it cascades: - the product is removed from every recipe that uses it as an ingredient, and those ingredient lines are gone for good, which changes the cost of each of those recipes; - all its supplier products become inactive, so it can no longer be ordered or received; - it stops being proposed in stock counts and daily operations. Setting the status back to active only reactivates the product itself. The ingredient lines deleted along the way are not restored, and each recipe has to be rebuilt with create_recipe_ingredient. There is no way to know beforehand which recipes use the product, so confirm with the user before archiving anything, and mention that the recipes using it will lose the ingredient. When the user only wants to stop buying an item from one supplier, use update_supplier_product instead of archiving the whole product. Returns the product or recipe with its new status. Parameters: - id (string, required): id of the product or recipe. - status (string, required): inactive to archive it, active to bring it back.

update_recipe_ingredient

ChatGPT
Change how much of an ingredient a recipe consumes: its quantity, its measurement unit, or both. Use it when the user adjusts a recipe without changing which products it uses. Get the line id from the recipe_ingredients returned by get_recipe. Only the fields you pass are modified. The recipe and the ingredient product of a line cannot be changed: to replace one ingredient with another, call delete_recipe_ingredient then create_recipe_ingredient. A new measurement unit must share the base unit of the ingredient product (or of its conversion packaging), otherwise the API rejects the call. Returns the ingredient line as it stands after the update. Parameters: - id (string, required): id of the ingredient line to update. - quantity (number, optional): new quantity consumed by one batch of the recipe. - measurement_unit_id (string, optional): new measurement unit for that quantity, from list_measurement_units.

update_supplier_product

ChatGPT
Update an existing supplier product: most often its price, sometimes its packaging, tax, name or supplier reference. Use it whenever a supplier announces a new tariff. Get the id from search_supplier_products, get_supplier_product, or the supplier_products of a get_product result. Only the fields you pass are modified; every other field is left untouched. The supplier and the product of a line cannot be changed here: a purchasing line always belongs to the same supplier and feeds the same product. To stop buying the item from this supplier, use update_supplier_product_status. unit_price_excluding_tax is the price of ONE billing packaging, in the supplier's currency and in its major unit: pass 12.5 for 12.50 EUR. Changing the price changes the cost of every recipe using the product, so state the old and new values back to the user. The billed packaging and the ordered one are two separate things. product_unit_per_billing_packaging says how much of the product ONE BILLED packaging holds, in kilograms, litres or pieces: a 5 L can is 5, a 250 g bag 0.25, a 75 cL bottle of wine 0.75, a billing by the kilogram 1. billing_packaging_per_order_packaging counts how many of those billed packagings one ordered packaging holds, so a carton of 6 bottles is 6 while the bottle stays 0.75; for a catch weight item it carries the average weight of one piece instead. Returns the supplier product as it stands after the update. Parameters: - id (string, required): id of the supplier product to update. - unit_price_excluding_tax (number, optional): new price excluding tax of one billing packaging. - name (string, optional), supplier_reference (string, optional), tax_id (string, optional): identity and tax of the line. - billing_packaging (string, optional), product_unit_per_billing_packaging (number, optional): billed packaging and how much of the product it holds, in kilograms, litres or pieces. - use_different_order_packaging (boolean, optional), order_packaging (string, optional), billing_packaging_per_order_packaging (number, optional): ordering packaging when it differs from the billed one. - weighted (boolean, optional): catch weight item, ordered per piece but billed by actual weight.

update_supplier_product_status

ChatGPT
Deactivate a supplier product, or reactivate one that was deactivated. Supplier products are never deleted: setting the status to inactive is how the user stops buying an item from a supplier, for a reference the supplier dropped or a price line that is no longer used, while keeping its purchase history and past prices. An inactive supplier product can no longer be ordered or received, and it stops feeding the purchase price of the product. The product itself stays active and keeps its other suppliers, which is what makes this the right tool when the user says they stop buying an item from one supplier in particular. Archiving the product everywhere is update_product_status. Reactivating is refused when the supplier or the product is inactive, since a line cannot be ordered from either. An archived product is brought back with update_product_status. An archived supplier has to be reactivated by the user in Yokitup: no tool here changes a supplier's status, because doing so would deactivate every item bought from that supplier in one go. Get the id from search_supplier_products or get_supplier_product. Returns the supplier product with its new status. Parameters: - id (string, required): id of the supplier product. - status (string, required): inactive to stop buying it, active to make it orderable again.

update_tag

ChatGPT
Rename a tag or move it in the tag tree. Get its id from list_tags. Only the fields you pass are modified. The change is immediate everywhere: every product already carrying the tag shows the new name, so a rename is the right way to fix a typo, and the wrong way to split a tag in two. Pass parent_id to move the tag under another one, or null to bring it back to the top level. Moving a tag carries its child tags with it. Returns the tag as it stands after the update. Parameters: - id (string, required): id of the tag to update. - name (string, optional): new display name. - parent_id (string or null, optional): new parent tag, or null to make it top-level.

analyze_food_cost

Claude

analyze_losses

Claude

analyze_pos_sales

Claude

analyze_purchases

Claude

analyze_stock_movements

Claude

analyze_supplier_product_prices

Claude

explain_inventory_valuation

Claude

explain_inventory_variance

Claude

get_current_organization

Claude

get_current_stock

Claude

get_inventory

Claude

get_loss

Claude

get_pos_order

Claude

get_product

Claude

get_recipe

Claude

get_stock_transfer

Claude

get_supplier

Claude

get_supplier_goods_receipt

Claude

get_supplier_product

Claude

list_locations

Claude

list_tags

Claude

search_help_center

Claude

search_inventories

Claude

search_losses

Claude

search_pos_orders

Claude

search_products

Claude

search_recipes

Claude

search_stock_transfers

Claude

search_supplier_goods_receipts

Claude

search_supplier_products

Claude

search_suppliers

Claude

Capabilities

Writes

App Stats

90

Tools

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily