Skip to main content
Glama

RestaurantDoctorAI

Prep list and par sheet

restaurantdoctor_par_levels
Read-onlyIdempotent

Works out par levels and what to order for up to 50 kitchen or bar items, as the free prep and par sheet on restaurantdoctorai.com does. Par = use per day × days covered + safety stock (days covered: from the day of the count and the order until the next delivery after this one arrives); order = par minus what's on hand, never below 0, rounded up to whole packs when a pack size is sent. Takes each item's use per day (or per week and the days open a week), days covered, optional safety stock and pack size, and what's on hand, in the owner's own units; a figure that isn't sent is never counted as 0, and an item missing one is returned as incomplete. Returns each item's par and order, the items that need an order, and a link to the free prep and par sheet. The figures aren't stored; only an anonymous daily count of calculator runs is kept.

Input Schema

NameRequiredDescriptionDefault
itemsNo
daysCoveredNo
daysOpenPerWeekNo

Output Schema

NameRequiredDescriptionDefault
linkYesThe free prep and par sheet, to print or download.
itemsYes
notesYes
resultYesThe result in the sheet's words.
totalsYes
toOrderYesThe items that need an order.
freeCheckYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / items / items / properties / par / anyOf
      Previous value: -[
      -  {
      -    "description": "Use per day × days covered + safety, rounded up to 0.01.",
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "The use per day × days covered + safety, rounded up to 0.01.",
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / items / anyOf
      Previous value: -[
      -  {
      -    "description": "Needed: the items, up to 50.",
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "daysCovered": {
      -          "anyOf": [
      -            {
      -              "description": "This item's days covered. Left out, the list's daysCovered.",
      -              "exclusiveMinimum": 0,
      -              "maximum": 60,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "name": {
      -          "anyOf": [
      -            {
      -              "description": "Optional: the item.",
      -              "maxLength": 60,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "onHand": {
      -          "anyOf": [
      -            {
      -              "description": "Units on hand when the order is placed. Needed.",
      -              "maximum": 1000000000,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "packSize": {
      -          "anyOf": [
      -            {
      -              "description": "Optional: units in one pack. With it, the order is whole packs.",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000000000,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "safety": {
      -          "anyOf": [
      -            {
      -              "description": "Optional: units kept on top for a busy day or a late truck. Left out, 0.",
      -              "maximum": 1000000000,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "unit": {
      -          "anyOf": [
      -            {
      -              "description": "Optional: the unit, such as lb or each.",
      -              "maxLength": 60,
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "usePerDay": {
      -          "anyOf": [
      -            {
      -              "description": "Units used in a day open. Needed, or usePerWeek.",
      -              "maximum": 1000000000,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "usePerWeek": {
      -          "anyOf": [
      -            {
      -              "description": "Units used in a week: divided by daysOpenPerWeek. Not used when usePerDay is sent.",
      -              "maximum": 1000000000,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "maxItems": 50,
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Needed: the items, up to 50.",
      +    "items": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "daysCovered": {
      +          "anyOf": [
      +            {
      +              "description": "This item's days covered. Left out, the list's daysCovered.",
      +              "exclusiveMinimum": 0,
      +              "maximum": 60,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "name": {
      +          "anyOf": [
      +            {
      +              "description": "Optional: the item.",
      +              "maxLength": 60,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "onHand": {
      +          "anyOf": [
      +            {
      +              "description": "Units on hand when the order is placed. Needed.",
      +              "maximum": 1000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "packSize": {
      +          "anyOf": [
      +            {
      +              "description": "Optional: units in one pack, to 3 decimals. With it, the order is whole packs.",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000000000,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "safety": {
      +          "anyOf": [
      +            {
      +              "description": "Optional: units kept on top for a busy day or a late truck. Left out, 0.",
      +              "maximum": 1000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "unit": {
      +          "anyOf": [
      +            {
      +              "description": "Optional: the unit, such as lb or each.",
      +              "maxLength": 60,
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "usePerDay": {
      +          "anyOf": [
      +            {
      +              "description": "Units used in a day open. Needed, or usePerWeek.",
      +              "maximum": 1000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "usePerWeek": {
      +          "anyOf": [
      +            {
      +              "description": "Units used in a week: divided by daysOpenPerWeek. Not used when usePerDay is sent.",
      +              "maximum": 1000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "maxItems": 50,
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Added

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond them: the exact formulas for par and order, rounding to whole packs, the rule that an unsent figure is never treated as 0 and yields an 'incomplete' item, and the privacy statement that figures are not stored with only an anonymous daily run count kept. That is rich disclosure of computation and side-effect posture.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first clause, and the two paragraphs stay on task. It is dense and somewhat long, with parenthetical restatements of the days-covered window that the schema already carries, so it is efficient rather than tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite three parameters and a nested item array, the description covers inputs, formula behavior, error handling for incomplete items, and the non-persistence guarantee. An output schema exists, yet the description still names the returns (par, order, items needing order, link), leaving nothing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Reported schema description coverage is 0%, so the description carries the burden and largely does: it explains use-per-day vs use-per-week with daysOpenPerWeek, the days-covered window definition, safety stock as optional, pack size forcing whole-pack rounding, and that on-hand is required. It stops short of mapping every nested field (name, unit) and of clarifying all requiredness rules, so it is strong but not exhaustive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: works out par levels and order quantities for up to 50 kitchen or bar items. It clearly distinguishes itself from sibling costing tools (cost_recipe, plate_cost, prime_cost) by naming its domain and anchoring to the public prep and par sheet. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when the tool applies: a kitchen or bar prep/par calculation with use-per-day, days covered, safety stock and pack size inputs. It never names an alternative sibling or an explicit when-not condition, so it falls short of the top band. There is enough context to select it correctly but no routing guidance against the other costing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources