RestaurantDoctorAI
Server Details
Free restaurant profit check, recipe costing, calculators, website check, deadlines, guides, blog.
- Status
- Healthy
- Uptime
- 100.0% over 31 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 21 tools
Most tools map to a single, well-delimited calculator (cash_out, card_fees, tip_out, par_levels, check_website, deadlines), and the long descriptions clearly state inputs and outputs. A few clusters are genuinely close — cost_recipe vs plate_cost vs menu_calories (recipe pricing vs plate pricing vs calories) and break_even vs restaurant_budget (both produce break-even sales), plus labor_cost overlapping prime_cost — so an agent could occasionally pick the wrong one, but the descriptions mostly disambiguate.
Every tool uses the same restaurantdoctor_ prefix with snake_case noun/verb_noun style (restaurantdoctor_plate_cost, restaurantdoctor_run_free_check, restaurantdoctor_list_knowledge). No camelCase or mixed conventions appear, and names are descriptive of their resource/action.
21 tools is on the heavy side for a calculator suite and lands in the borderline band. Each tool does earn its place as a distinct calculator or knowledge operation, but the surface is large enough that selection burden is real.
Coverage of the restaurant financial domain is broad: food/plate/recipe costing, labor, prime cost, break-even, budget, cash-out, card and booking fees, delivery pricing, tip-out, FICA credit, par levels, deadlines, website check, and a full knowledge library (search/list/read) with questions and a scoring tool. Minor gaps exist (no menu-engineering/mix analysis or P&L reporting), but stateless calculators do not require update/delete lifecycle operations.
Available Tools
21 toolsrestaurantdoctor_booking_feesBooking fee checkARead-onlyIdempotentInspect
Works out what a US restaurant's reservation app costs it, as the free booking fee check on restaurantdoctorai.com does: a month, a year, per guest who booked through it and as a share of the average spend, from the plan's published price (dated, sourced) or the owner's invoice, plus fees per guest and the percentage on deposits. Of the apps checked, only OpenTable charges per guest: for guests from its own app and website, possibly from Google and partners, and on Basic from the restaurant's own website. Returns a one-sentence headline first, the month line by line, what isn't counted, what the owner can do (book direct, mark no-shows, the contract's notice date), other apps' published prices as information, not a recommendation, the caveats and sources. It answers what OpenTable, Resy, Tock, Yelp, Toast Tables, SpotOn or SevenRooms costs a restaurant per reservation or per guest. It needs the app and plan (on the invoice) and, for OpenTable, last month's guests from its covers report by where they booked; the rest is optional. A figure that isn't sent is never counted as 0. Not affiliated with any app; it reads no account. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | The app and plan, on the invoice. tock_ = Tock, now sold by Resy; other = any app not listed, with monthlyFee. | |
| firstMonth | No | ||
| monthlyFee | No | ||
| renewalDate | No | ||
| averageSpend | No | ||
| networkCovers | No | ||
| partnerCovers | No | ||
| prepaidAmount | No | ||
| websiteCovers | No | ||
| networkCoverFee | No | ||
| partnerCoverFee | No | ||
| websiteFlatAddOn | No | ||
| prepaidFeePercent | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| asOf | Yes | The day prices were read. |
| link | Yes | Opens the check with these figures. |
| name | Yes | The plan. |
| year | Yes | |
| month | Yes | US dollars, like every amount. |
| notes | Yes | |
| result | Yes | |
| caveats | Yes | |
| feeFrom | Yes | |
| ofSpend | Yes | |
| partial | Yes | True when the headline says at least. |
| sources | Yes | |
| headline | Yes | The result in one sentence. |
| noticeBy | Yes | |
| perGuest | Yes | |
| breakdown | Yes | The month. |
| freeCheck | Yes | |
| workedOut | Yes | |
| firstMonth | Yes | |
| notCounted | Yes | |
| alternatives | Yes | Other apps' monthly prices: information, not a recommendation. |
| whatYouCanDo | Yes | |
| ifBookedDirect | Yes | |
| perNetworkGuest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds real value beyond them: it is not affiliated with any app, reads no account, stores no figures, and keeps only an anonymous daily run count. It also discloses the output shape (one-sentence headline, month line by line, what isn't counted, caveats and sources) and that it is informational, not a recommendation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and required inputs are front-loaded, which is good, but the body is a dense, comma-spliced run-on that mixes output format, caveats, coverage list, input requirements and privacy notes into a single block. Given the tool's complexity some length is justified, but the packing makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still sketches them. Combined with the input requirements, the missing-value rule, the source/caveat disclosure and the privacy statement, an agent has enough to call this correctly for a 13-parameter calculator. The only shortfall is coverage of the less-common optional fee parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 13 parameters and very low reported schema coverage, the description has to carry weight, and it does partially: it names platform as the required input, states that OpenTable needs last month's guests by booking source, that sevenrooms/other need monthlyFee, that the rest is optional, and that a missing figure is never treated as 0. It does not add per-field semantics for the remaining fields (renewalDate, prepaidAmount, prepaidFeePercent, the various fee overrides), leaving those to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it computes what a US restaurant's reservation app (OpenTable, Resy, Tock, Yelp, Toast Tables, SpotOn, SevenRooms) costs per month, per year, per guest and as a share of average spend. That scope is clearly distinct from siblings like restaurantdoctor_card_fees or restaurantdoctor_delivery_price, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives the use context (reservation-app cost analysis, mirroring the free check on restaurantdoctorai.com) and lists which apps it answers for, which implies when to reach for it. But it never names an alternative tool or an explicit when-not condition, so selection against the other 20 restaurantdoctor tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_break_evenBreak-even calculatorARead-onlyIdempotentInspect
Works out a restaurant's break-even sales from the owner's figures for one typical month, as the free break-even calculator on restaurantdoctorai.com does: the sales a month needs to pay every bill, also a week, a day open and guests a day; how far the month was above or short of it; what was left over after every bill; what a point of cost moves it by; with and without the owner's own pay; and if prices were 10% lower or higher (an illustration). Hourly pay can rise with sales or stay fixed, or both ways as a range. Takes the month's figures in any currency; a figure not sent is never counted as 0. Returns the result, the working and a link that opens the calculator with the figures in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| sales | No | ||
| hourly | No | unsure | |
| ownerPay | No | ||
| hourlyPay | No | ||
| purchases | No | ||
| fixedBills | No | ||
| daysPerWeek | No | ||
| averageSpend | No | ||
| closingStock | No | ||
| openingStock | No | ||
| otherVariable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the calculator with these figures. |
| notes | Yes | |
| checks | Yes | Figures that look like a slip. |
| hourly | Yes | |
| result | Yes | The page's result, line by line. |
| whatIf | Yes | |
| figures | Yes | A month, in the currency of the figures sent. |
| leftOver | Yes | Left over after every bill and ownerPay at these sales, before income tax: below 0 when short. Not profit. |
| standing | Yes | Net sales against break-even (at: almost exactly; never: no break-even either way). |
| freeCheck | Yes | |
| scenarios | Yes | Hourly pay one way, or both (rising first). |
| workedOut | Yes | How it was worked out. |
| daysAMonth | Yes | |
| pointValue | Yes | 1% of sales: what a point of cost saved leaves a month. |
| usedStockCounts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower; the description still adds real context by disclosing currency-agnostic input, that a missing figure is never counted as 0, that the reply returns result + working + a deep link, and that figures are not stored (only an anonymous daily run count). Only light gaps remain, e.g. no note on output format beyond 'the working'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause carries content, but the body is a single dense run of semicolon-joined clauses ('also a week, a day open and guests a day; how far...; what was left over...; what a point of cost moves it by...') that is hard to scan, and the reference to 'the free break-even calculator on restaurantdoctorai.com' is low-value framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter computation the description is broadly complete: it explains the model, the variability assumption, currency handling, missing-figure behavior, and data retention, and an output schema exists so return values need not be spelled out. The main omission is any statement of which figures are required versus optional, which the agent must recover from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The reported schema description coverage is low, so the description would need to compensate; it adds model-level meaning (any currency, missing ≠ 0, hourly pay that rises, stays fixed, or both) but never maps to individual parameters like goal, ownerPay, openingStock/closingStock, otherVariable. The schema itself nonetheless carries very detailed per-parameter text, so the description and schema jointly cover most semantics, landing at minimum-viable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('works out a restaurant's break-even sales') and enumerates the scope precisely: month/week/day/guests, variance to break-even, profit left over, cost sensitivity, with/without owner pay, and ±10% price illustration. An agent can tell this apart from siblings like restaurantdoctor_restaurant_budget or restaurantdoctor_prime_cost 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a rich account of what the calculator produces and implicitly when it applies (owner has one month of figures and wants break-even), but never states when to prefer this over alternative tools such as restaurantdoctor_run_free_check, restaurantdoctor_restaurant_budget or price/menu tools, nor any exclusions. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_card_feesCard fees checkARead-onlyIdempotentInspect
Checks a US restaurant's card processing fees for one month, as the free card fees check on restaurantdoctorai.com does: the cost per 100 dollars of card sales (the effective rate), against a dated fair range for that type of restaurant (an estimate of a competitive interchange-plus account from Visa's published restaurant interchange, network fees and a fair markup); how far above it the fees are, a month and a year; how they compare with Square's, Toast's, Clover's or Stripe's published rate; what's realistic for that processor, words to read out to it, the fees to question on the statement by name, and the caveats. It answers whether card fees are too high, what the effective rate is, and what to ask the processor. It needs the month's total card sales and total card fees from the processor's statement (every fee, monthly and annual ones included), who processes the cards and what kind of restaurant it is; the number of card sales or the average sale narrows it. A figure that isn't sent is never counted as 0. It doesn't read statements, contact a processor or take payment. Returns the result, how it was worked out, and a link that opens the same check with the figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | The type of restaurant, which sets the likely mix of debit and credit cards: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| cardCount | No | ||
| cardSales | No | ||
| processor | Yes | Who processes the cards (the name at the top of the statement): bank = a bank or independent processor; other = another processor, or not sure. | |
| totalFees | No | ||
| pricingModel | No | ||
| averageTicket | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ask | Yes | Words the owner can read out to the processor. |
| fair | Yes | What a competitive interchange-plus account would cost, per $100: an estimate, not a published price. |
| link | Yes | Opens the check on the website with these figures filled in. |
| plan | Yes | |
| checks | Yes | Figures that look like a slip. They don't block the result. |
| format | Yes | |
| result | Yes | The page's words, in its order. |
| caveats | Yes | |
| sources | Yes | |
| verdict | Yes | |
| aboveTop | Yes | Fees above the range's top, whole dollars; 0 unless above it. |
| saleFrom | Yes | |
| cardCount | Yes | |
| cardSales | Yes | US dollars, like every amount here. |
| freeCheck | Yes | |
| processor | Yes | |
| realistic | Yes | |
| totalFees | Yes | |
| workedOut | Yes | |
| costPer100 | Yes | Total fees ÷ card sales × 100: the cost per $100 of card sales, also the effective rate in %. |
| aboveMiddle | Yes | The same above its middle. |
| averageSale | Yes | |
| pricingModel | Yes | |
| overTopPer100 | Yes | Dollars per $100 above the range's top; 0 unless above it. |
| feesToQuestion | Yes | By the names statements print. |
| yearlyCardSales | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' read-only/idempotent profile, it discloses that a missing figure is never counted as 0, what it returns (result, workings, prefilled link), retention behavior (figures not stored, only an anonymous daily run count), and what it will not do. Those are real behavioral facts an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the first sentence is a very long chain of parentheticals listing outputs, and later content (fair-range methodology, privacy) is interleaved in the same dense paragraph. Nearly every clause carries information, yet the heavy nesting makes it slower to scan than warranted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, an output schema, and a multi-part calculation, the description covers required inputs, optional narrowing inputs, non-goals, missing-data behavior, and data retention. An agent has everything needed to decide to call it and to know what it will do with incomplete input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (29%), and the description compensates by explaining which figures are needed and why: total card sales and total card fees (every fee, monthly and annual included), processor, restaurant type, with card count or average sale only narrowing the range. It omits pricingModel entirely, which the schema says changes the advice, so one parameter is left to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — checks a US restaurant's card processing fees for one month — and immediately names the concrete outputs (effective rate vs. a dated fair range, gap in dollars per month and year, comparison to Square/Toast/Clover/Stripe). That is clearly distinguishable from siblings like booking_fees or delivery_price by domain and by the fair-range comparison it performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when it applies (one month, US restaurant, needs total card sales and total card fees from the statement) and bounds it explicitly: it doesn't read statements, contact a processor or take payment. It never routes the agent to a sibling, e.g. that booking fees are a different check, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_cash_outNightly cash-outARead-onlyIdempotentInspect
Works out a restaurant's nightly cash close for one drawer and one day or shift, as the free cash-out sheet on restaurantdoctorai.com does: expected cash (starting bank + cash sales - cash tips paid out - paid outs), over or short against the cash counted, the deposit (counted minus the starting bank), the card difference (processor batch minus POS card sales) when both are sent, and comps, voids and discounts as a share of net sales. Takes the starting bank, cash sales and cash counted, plus optional paid outs, card figures and sales totals, in any currency; a figure that isn't sent is never counted as 0. It sets no normal for over or short. Returns the result, how it was worked out, and a link to the free cash-out sheet. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| comps | No | ||
| voids | No | ||
| netSales | No | ||
| paidOuts | No | ||
| cardBatch | No | ||
| cardSales | No | ||
| cashSales | No | ||
| discounts | No | ||
| cashCounted | No | ||
| startingBank | No | ||
| cashTipsPaidOut | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| card | Yes | |
| link | Yes | The free cash-out sheet, to print or download. |
| notes | Yes | |
| checks | Yes | Figures that look like a slip. |
| result | Yes | The result in the sheet's words. |
| shares | Yes | |
| deposit | Yes | Cash counted minus the starting bank, which stays in the drawer. Below 0 when the drawer holds less than its bank. |
| freeCheck | Yes | |
| overShort | Yes | |
| workedOut | Yes | How it was worked out. |
| cashCounted | Yes | |
| expectedCash | Yes | Starting bank + cash sales - cash tips paid out - paid outs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety bar is met. The description adds genuine context: no normal/threshold is imposed on over or short, figures are not stored (only an anonymous daily run count), and the reply includes the workings plus a link. Missing only error/permission behavior, which is minor for a stateless calculator.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and inputs are front-loaded in the first sentence, and the second covers semantics and storage. It is dense and the opening sentence runs long enumerating every output, but for an 11-parameter financial calculator nearly every clause adds usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a stateless calculator with an output schema, the description covers the essentials: required vs optional inputs, currency agnosticism, the missing-value rule, the non-storage behavior, and that no over/short threshold is applied. The only redundancy is re-describing return contents that the output schema already defines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema coverage is 0% because descriptions sit inside anyOf branches, so the description must carry the load. It does: it names the three needed inputs (starting bank, cash sales, cash counted), groups the optional ones (paid outs, card figures, sales totals), supplies the formula role for several, and states the key semantic rule that an unsent figure is never treated as 0.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: works out a restaurant's nightly cash close for one drawer and one day or shift, and names the exact outputs (expected cash, over/short, deposit, card difference, comps/voids/discounts share). This cleanly separates it from sibling calculators like prime_cost or labor_cost, which compute entirely different figures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Scope is implied well (one drawer, one day or shift; send optional figures only if you have them), and it ties itself to the free cash-out sheet for context. However, it never explicitly states when to choose this over a sibling tool or what prerequisite data must be gathered first, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_check_websiteCheck a restaurant's websiteARead-onlyInspect
Checks a restaurant's own website as the online check on restaurantdoctorai.com does: secure (https) and on its own address, made for phones, a menu written as text that phones and Google can read, online orders on its own terms or only through delivery apps, the address, hours and phone written on the page, tap to call, a way to get in touch, email sign-up and gift cards, what Google reads (a headline, title and description, not hidden from search, restaurant structured data), the preview a shared link shows, the page's text, story, questions, reviews, photo descriptions and social links, and Google's phone speed test with its measures one by one and real visitors' speed when Google has it (15 to 40 seconds; phoneSpeed: false skips it). Returns each check with what to fix, the three to fix first, and a link to the full online check, which adds the Google listing and places nearby, free on the website. A check it couldn't make (a page drawn by scripts, a security screen instead of the page) is marked "Couldn't check" and left out of the score, never failed; every check, its points and where its facts come from are listed at https://restaurantdoctorai.com/online-check/checks. Takes only the website address. The website isn't stored; only an anonymous daily count of checks is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| website | Yes | The restaurant's own website address, such as joesdiner.com or https://www.joesdiner.com. Not a DoorDash, Uber Eats or Google Maps page. | |
| phoneSpeed | No | Whether to run Google's phone speed test too (the default). It takes 15 to 40 seconds; false skips it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| grade | Yes | |
| score | Yes | 0 to 100, from the website and phone-speed checks only (the full check adds the Google listing). |
| checks | Yes | |
| website | Yes | Where the site answered after redirects: its scheme and host only, such as https://www.joesdiner.com. |
| fixFirst | Yes | Up to three checks to fix first, most important first. |
| fullCheckUrl | Yes | The full online check on restaurantdoctorai.com: adds the Google listing and the places nearby, free. |
| phoneSpeedSkipped | Yes | Google's phone speed test wasn't run, because phoneSpeed was false. It isn't in the score. |
| ordersOnlyThroughApps | Yes | The site links online orders only to delivery apps (DoorDash, Uber Eats, Grubhub…), which charge a commission on each. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, the description discloses latency (15–40 seconds, skippable via phoneSpeed: false), the privacy posture (website not stored, only an anonymous daily count), and an important failure semantic: checks that cannot be made are marked "Couldn't check" and excluded from the score rather than failed. That is real value-add over the annotations, though the scoring/return shape is left to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a single sprawling comma-list enumerating every individual check (email sign-up, gift cards, photo descriptions, social links...), which reads as marketing copy rather than selection guidance. The reader must wade through ~250 words to reach the genuinely useful parts about "Couldn't check" handling and data retention.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return values, and it still covers the essentials: input scope, runtime cost, failure handling, and data retention. The only material gap is the absence of routing guidance against the similar run_free_check sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented, including the same 15–40 second note for phoneSpeed. The description's "Takes only the website address" and its phoneSpeed aside merely restate the schema, adding no new syntax, format, or constraint information. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it audits a restaurant's own website, enumerating concrete check categories (https, mobile, text menu, tap-to-call, structured data, page speed). An agent can immediately tell this is a website audit rather than a calculator or knowledge tool. It does not, however, distinguish itself from the sibling restaurantdoctor_run_free_check, which is the most likely source of confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the schema's website description excludes DoorDash, Uber Eats and Google Maps pages, and the description notes that the returned link leads to a fuller check adding the Google listing and places nearby. There is no explicit statement of when to pick this over restaurantdoctor_run_free_check, nor any prerequisite guidance beyond latency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_cost_recipeCost a recipe (draft)ARead-onlyIdempotentInspect
Reads a recipe's ingredient lines as written, weighs each one with USDA FoodData Central and USDA yields, and prices it with the owner's own prices when given, else dated US public prices (BLS and USDA ERS store averages, USDA wholesale prices, and USDA weekly store-ad sale prices, which run low). Returns a draft in US dollars: each line's grams, cost and price source, what each line still needs, the cost per plate as a range, and a link that opens the draft on restaurantdoctorai.com, where the owner checks each line and adds prices for one plate cost and a menu price. The draft never gives one plate cost or a menu price, and says nothing about allergens or nutrition. The recipe isn't stored; only an anonymous daily count of drafts is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| prices | No | The owner's own prices, when they give them. Lines without one use US public prices: store averages (BLS, USDA ERS), wholesale prices (USDA) and, for items those don't cover, USDA weekly store-ad sale prices, which run low. None is the owner's cost. Tap water is costed at 0. | |
| recipe | Yes | The recipe as written: its name, its servings line ("Serves 6") and its ingredient lines, one a line, each amount and unit exactly as the recipe or the photo gives it. Method steps may follow under a heading such as "Instructions"; only ingredient lines are costed. The lines are read as sent, not converted, rounded or corrected: the owner checks them on the website. At most 8000 characters and 60 ingredient lines. | |
| source | No | Where the recipe came from: text the owner typed or pasted (text), a photo or scan of a printed or typed page (typed-photo), a handwritten card (handwriting), or a PDF (pdf). It sets how many lines the owner confirms on the website: handwriting, every line. | text |
| servings | No | How many plates the recipe makes, when its text doesn't say. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| link | Yes | Opens this draft on the website, where the owner checks each line. |
| lines | Yes | |
| notes | Yes | What the draft assumed about the whole recipe. |
| checks | Yes | Amounts that look like slips, such as a lot of salt for the plates. |
| recipe | Yes | |
| sources | Yes | The public prices used. |
| currency | Yes | |
| nextStep | Yes | |
| servings | Yes | |
| disclaimer | Yes | |
| priceFirst | Yes | The dearest lines not on the owner's prices yet: their prices move the cost the most. |
| unusedPrices | Yes | Prices sent that matched no line. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, yet the description adds substantial behavioral context: the draft never yields a single plate cost or menu price, it says nothing about allergens or nutrition, the recipe is not stored (only an anonymous daily draft count), public sale prices 'run low', and tap water is costed at 0. That is exactly the kind of constraint disclosure annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one dense paragraph, but it is front-loaded with the core verb chain and each sentence carries a distinct fact (pricing sources, output shape, limitations, storage). A few clauses duplicate what the schema already states about public/sale prices, which costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not detail returns, yet it still summarizes the draft's contents, states the key limitations, and explains the privacy/storage behavior and the website hand-off. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: how the prices array is used as an override versus the public-price fallback, that 'source' controls how many lines the owner must confirm on the website, and that recipe lines are read as sent without conversion or correction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource chain: it reads a recipe's ingredient lines, weighs them via USDA FoodData Central and USDA yields, prices them from owner prices or dated US public sources, and returns a draft in USD. This is far more specific than the sibling costing tools (plate_cost, prime_cost, menu_calories) and an agent can tell exactly what artifact it gets back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool applies: you have recipe text (typed, photo, handwriting, PDF) and want a draft costing, and the owner then completes prices on the website for a final plate/menu price. However, it never names an alternative sibling (e.g., restaurantdoctor_plate_cost) or states a when-not-to-use condition, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_deadlinesList a restaurant's deadlinesARead-onlyIdempotentInspect
Lists a US restaurant's coming tax, payroll, license and permit deadlines, as the deadline calendar on restaurantdoctorai.com does: federal dates (payroll forms, tip reports, W-2s, 1099s, returns, estimated tax) and the state's (sales tax, unemployment reports, yearly reports, franchise taxes, minimum wage changes, liquor and health permit dates where one date applies to everyone), each moved for weekends and holidays by the agency's rule, with the rule, what a miss costs and the official source. A state date is given only where the state's own page confirms it; the rest come as what to check with the agency. Also the rules for each hire, and a link that opens the same calendar on the website, where the owner adds their own license and permit dates and gets free email reminders. Takes the state and yes/no answers, no names or emails; scope (federal or state) and withinDays (the next so many days) cut the list. Reminders, not legal or tax advice. The answers aren't stored; only an anonymous daily count of calendars is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | A city with its own minimum wage, as an id like los-angeles or chicago; left out, the state's rate applies. | |
| tips | No | Customers usually tip the staff. | |
| scope | No | Optional, to cut the list: federal (the IRS's and other federal dates only), state (the state's and the city's only) or all (the default). The rules for each hire are listed either way. | |
| staff | Yes | Has anyone on payroll. | |
| state | Yes | The restaurant's US state, two letters (DC for Washington DC). | |
| formed | No | The month the LLC or corporation was formed with the state, YYYY-MM. Some states set the yearly report by it. | |
| months | No | How many months ahead to list, 1 to 15 (default 3). The calendar runs to the end of 2027. withinDays, when sent, sets the window instead. | |
| alcohol | Yes | Sells alcohol. | |
| caterer | No | Mainly catering or a food truck, not a restaurant or bar (OSHA's injury log). | |
| business | No | How the business is set up: sole (sole owner, no LLC), llc_single, llc_multi, partnership (no LLC), s_corp or c_corp. Decides the tax return and the state's yearly report. Left out, both return dates come with an "If". | |
| deposits | No | Who pays the payroll taxes to the IRS: provider (a payroll company), monthly (the owner, by the 15th), semiweekly (the owner, after each payday). | |
| salesTax | No | How often the state has the restaurant file sales tax (on its permit letter or state account). | |
| bigTipped | No | Tipped, and staff worked more than 80 hours in total on a typical day last year, all locations together (Form 8027). | |
| estimated | No | The owner pays quarterly estimated tax on the business's profit. | |
| fullTime50 | No | 50 or more full-time staff on average, counting part-timers' hours, related businesses together (ACA forms). | |
| withinDays | No | Optional: only the dates in the next so many days, 1 to 460, from today in the state (7 for the coming week). Sent, it replaces months. | |
| contractors | No | Pays a contractor, or rent to a landlord that isn't a corporation, $2,000 or more a year (1099 forms). |
Output Schema
| Name | Required | Description |
|---|---|---|
| from | Yes | The first day listed (today in the state), YYYY-MM-DD. |
| note | Yes | |
| state | Yes | |
| through | Yes | The last day listed, YYYY-MM-DD. |
| eachHire | Yes | Rules that run each time the restaurant hires (or something happens), not on a date. |
| checkWith | Yes | What we can't date for this owner: their own schedule or papers, or a state page not yet confirmed. No date here is guessed. |
| deadlines | Yes | |
| calendarUrl | Yes | The same calendar on restaurantdoctorai.com, where the owner can add the dates printed on their own licenses and permits and get email reminders or a calendar link, free. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly/idempotent/non-destructive): it discloses data provenance ('A state date is given only where the state's own page confirms it; the rest come as what to check with the agency'), what gets stored ('The answers aren't stored; only an anonymous daily count of calendars is kept'), and the week/holiday adjustment rule. This is exactly the kind of context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the single dense paragraph runs long and restates schema content ('Takes the state and yes/no answers... scope... withinDays cut the list') alongside genuinely new information. It is comprehensive rather than economical; trimming the input re-description would tighten it without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 17 parameters, an output schema, and safety annotations already present, the description supplies the remaining pieces an agent needs: data provenance, fallback behavior when no state page confirms a date, privacy handling, and the website link. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter carries a rich enum/detail description, so the schema does the heavy lifting. The description restates scope and withinDays generally but adds no syntax or format detail beyond what the schema already documents, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (a US restaurant's coming tax, payroll, license and permit deadlines) and enumerates the concrete content (federal forms, state reports, holiday-moved dates). It is instantly distinguishable from every sibling, which are all cost/fee/knowledge calculators rather than a deadline calendar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: it names the driving inputs ('Takes the state and yes/no answers'), explains the scope/withinDays trimming, and sets expectations ('Reminders, not legal or tax advice'). It does not name an explicit alternative or a when-not-to-use condition, but no sibling overlaps this function, so the gap is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_delivery_priceDelivery app price calculatorARead-onlyIdempotentInspect
Works out a dish's break-even price on a delivery app, the app price that leaves the owner the same money as selling it in their dining room, as the free delivery app price calculator on restaurantdoctorai.com does: the in-house price ÷ (1 − the app's real commission rate), the markup on the in-house price that takes (rounded up to a whole percent), and what the app keeps. Takes the dish's in-house price, in any currency, and one app's real commission rate from its payout statements; a figure that isn't sent is never counted as 0. Returns the calculator's result, how it was worked out, and a link that opens the calculator with the same figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | No | ||
| price | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the calculator on the website with these figures filled in. |
| rate | Yes | The real commission rate, %. |
| notes | Yes | |
| price | Yes | The in-house price it was worked out from, in the currency it was sent in. |
| result | Yes | The result in the page's words, in its order. |
| appKeeps | Yes | What the app keeps at the break-even app price, to the cent as the page shows it. |
| appPrice | Yes | The break-even app price, price ÷ (1 − rate), to the cent as the page shows it: the app price that leaves the owner the in-house price. |
| freeCheck | Yes | |
| workedOut | Yes | How it was worked out, with the figures in each step. |
| markupPercent | Yes | The markup on the in-house price that takes, %, rounded up to a whole number so it's never short. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real value on top: 'The figures aren't stored; only an anonymous daily count of calculator runs is kept,' plus the note that a missing figure is never treated as 0 and triggers a follow-up request. That is meaningful behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and formula are front-loaded in the first sentence, and each subsequent sentence carries distinct information (inputs, missing-value behavior, outputs, storage). It is dense and appositive-heavy — the opening sentence is a long chain of dashes and clauses — but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, yet the description still summarizes them (result, working, prefilled link) and adds storage/privacy behavior plus missing-input handling. For a 2-parameter, zero-required calculator, nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description must carry the load, and it does: it defines the in-house price as what a dining-room guest pays in the owner's own currency and the rate as the app's real commission drawn from payout statements, and clarifies that an omitted figure is not defaulted to 0. It adds meaning but does not restate the percent-vs-decimal convention or the 0–89 bound that the schema actually documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (computes a dish's break-even delivery-app price) and immediately defines the scope: the app price that nets the owner the same as an in-house sale, plus the markup and app's cut. The explicit formula and the naming of the real commission rate distinguish it cleanly from siblings like restaurantdoctor_break_even and restaurantdoctor_card_fees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage conditions: one app's real commission rate per call, taken from a month of payout statements rather than the plan rate, with each app worked out on its own. It does not name an alternative tool or state when-not to use this one, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_fica_tip_creditFICA tip credit checkARead-onlyIdempotentInspect
Estimates a US restaurant's FICA tip credit (IRS Form 8846, the 45B credit) for a year like the one in its payroll figures, as the free FICA tip credit check on restaurantdoctorai.com does: the employer's 7.65% Social Security and Medicare tax on reported tips, less the tips needed to bring tipped staff's cash wage up to the 5.15 dollars an hour the law fixes for restaurants. Returns the reasons the real answer may be zero first (already claimed, no federal income tax owed, service charges aren't tips, only the business can claim it), then the credit as a range, its worth after the deduction it replaces, the years that may still be open, and sources. It answers questions about taxes on tips, Form 8846, the 45B credit or money the business may be missing on tips. It needs the state, a year's tips reported through payroll (never service charges) and, where the cash wage is under 5.15 dollars, tipped staff's hours that year; whether the return already includes Form 8846 comes first, if known. A figure that isn't sent is never counted as 0. It files nothing, isn't tax advice and takes no payment: the result is an estimate to take to the accountant, with a link that opens the same check with the figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | ||
| cashWage | No | ||
| tippedHours | No | ||
| businessType | No | ||
| reportedTips | No | ||
| owesIncomeTax | No | ||
| alreadyClaimed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| base | Yes | $5.15: tips needed to bring the cash wage up to this don't count. |
| link | Yes | Opens the check on the website with these figures filled in. |
| state | Yes | |
| checks | Yes | Figures that look like a slip. They don't block the result. |
| credit | Yes | The gross FICA tip credit for a year like this; exact when the cash wage is $5.15 or more. |
| result | Yes | The page's words, in its order. |
| sources | Yes | |
| afterTax | Yes | After the deduction it replaces, before state tax: federal rates assumed, share of each credit dollar kept. |
| cashWage | Yes | |
| headline | Yes | |
| setAside | Yes | Hours × the gap. |
| freeCheck | Yes | |
| hoursUsed | Yes | Only when the cash wage is under $5.15. |
| openYears | Yes | Years a missed credit may still be claimed for. |
| gapPerHour | Yes | |
| irsWebPage | Yes | At the IRS web page's $7.25: the most cautious reading. |
| tippedHours | Yes | |
| tipsPerHour | Yes | |
| zeroReasons | Yes | Why the real answer may be $0 (applies: these answers say so; check: one to rule out), said before any dollar figure. |
| businessType | Yes | |
| headlineKind | Yes | |
| reportedTips | Yes | US dollars, like every amount here. |
| tipsBelowGap | Yes | |
| allTipsCredit | Yes | 7.65% of every tip: the most it can be. |
| assumedUnsure | Yes | Left out, read as unsure. |
| owesIncomeTax | Yes | |
| alreadyClaimed | Yes | |
| creditableTips | Yes | |
| usableThisYear | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description adds substantial context beyond them: it files nothing, isn't tax advice, takes no payment, figures aren't stored (only an anonymous daily count), and it returns zero-reasons first. That is rich behavioral disclosure an agent can rely on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence and every clause carries real information, but the description is a dense run-on block that crams multiple ideas (output order, disclaimers, data handling, inputs) into very long sentences, reducing scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description fills the remaining gaps: what it returns (zero-reasons first, then a range, after-tax worth, open years, sources), disclaimers, and data handling. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already carries detailed per-parameter descriptions, so the baseline is 3; the description adds meaning on top by stating which inputs drive a result ('needs the state, a year's tips reported through payroll... and, where the cash wage is under 5.15, tipped staff's hours'), the priority of alreadyClaimed, and that 'a figure that isn't sent is never counted as 0.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Estimates a US restaurant's FICA tip credit (IRS Form 8846, the 45B credit).' It scopes precisely (US restaurants, per year) and is clearly distinguishable from siblings like tip_out or labor_cost. An agent knows exactly what this computes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: 'It answers questions about taxes on tips, Form 8846, the 45B credit or money the business may be missing on tips,' and lists the inputs needed. However, it names no alternative sibling tool or an explicit when-not-to-use condition, so routing against other tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_get_questionsProfit check questionsARead-onlyIdempotentInspect
Lists the 12 multiple-choice questions of the free restaurant profit check, with the answer values each one accepts. Money ranges, delivery apps and review sites follow the restaurant's country (default US).
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Where the restaurant is: a two-letter ISO 3166-1 code such as US, CA, AU or DE (GB for the United Kingdom). Sets the currency and local wording. Defaults to US. | US |
Output Schema
| Name | Required | Description |
|---|---|---|
| country | Yes | |
| currency | Yes | Of the money ranges (ISO 4217). |
| countries | Yes | |
| questions | Yes | |
| countryName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description still adds useful context beyond them: exactly 12 questions, that each question enumerates its accepted answer values, and that country drives money ranges, delivery apps and review sites with a US default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with what is returned and followed by the country-dependent variation. Every clause carries information and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details need not be in the description. With the question count, answer-value enumeration, and country effects covered, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single country parameter is fully documented in the schema, so baseline would be 3. The description adds meaning beyond the schema by explaining what the country actually affects (money ranges, delivery apps, review sites) and confirming the US default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Lists) and resource (the 12 multiple-choice questions of the free restaurant profit check), plus the scope of the returned data (answer values each question accepts). It is clear without opening the schema, but it never names the closely related sibling run_free_check, so the boundary is only implicitly distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this retrieves the question set, presumably as groundwork for run_free_check, but the description gives no explicit when-to-use, when-not-to-use, or alternative routing. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_labor_costLabor cost calculatorARead-onlyIdempotentInspect
Works out a restaurant's labor cost from the owner's own payroll figures for one week or month, as the free labor cost calculator on restaurantdoctorai.com does, in one of its three modes: share (labor as a % of net sales, against the range for its type of restaurant, with what the points over are worth), hours (next period's labor budget and the hourly staff hours it pays for once salaries are paid) or line (the cut line: the sales per labor hour below which the first person goes home). Takes net sales, hourly pay and hours worked, plus optional salaries, payroll taxes and benefits, expected sales, a target and more, in any currency; a figure that isn't sent is never counted as 0. Returns the calculator's result, how it was worked out, and a link that opens the calculator with the same figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | What to work out, as the page's tabs. share: last period's labor cost, % of net sales, against the range (needs sales, hourlyWages). hours: the labor budget for next period's expected sales and the hourly staff hours it pays for (needs forecast, hourlyWages, hours). line: the cut line, the sales per labor hour below which the first person goes home (needs hourlyWages, hours, and sales or forecast). | |
| hours | No | ||
| sales | No | ||
| format | Yes | The type of restaurant, which sets the labor range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| period | Yes | Whether the figures are a week's or a month's: last period's, all for the same dates, and forecast for the next. Sets how a year is worked out (52 weeks or 12 months). | |
| target | No | ||
| forecast | No | ||
| ownerPay | No | ||
| salaries | No | ||
| hourSales | No | ||
| hourlyWages | No | ||
| payrollCosts | No | ||
| overtimeHours | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the calculator with these figures. |
| mode | Yes | |
| guide | Yes | |
| notes | Yes | |
| range | Yes | |
| share | Yes | |
| checks | Yes | Figures that look like a slip, as the page flags them. |
| format | Yes | |
| period | Yes | |
| result | Yes | The result in the page's words, in its order. |
| target | Yes | |
| cutLine | Yes | |
| hourCost | Yes | |
| freeCheck | Yes | |
| workedOut | Yes | How it was worked out. |
| nextPeriod | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description adds real value on top: figures are not stored, only an anonymous daily count is kept, and a missing figure is never treated as zero. It also says the response includes the derivation and a pre-filled calculator link, though part of that overlaps with the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the opening clause, which is good, but the rest is a single dense run-on sentence of roughly 140 words where mode definitions, input lists, and retention notes all blur together. Splitting the mode table out would make it far more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, three-mode calculator, the description covers the mode semantics, currency handling, missing-value behavior, retention, and return contents, and an output schema exists so return values need no further explanation. Only the less common optional parameters are left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 23% schema description coverage, the description carries real weight, and it does name the key inputs (net sales, hourly pay, hours worked, salaries, payroll costs, forecast, target, any currency). However, several parameters (hourSales, overtimeHours, ownerPay) are never mentioned, and the trailing "and more" leaves the rest to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (works out a restaurant's labor cost from payroll figures) and enumerates the three computational modes with what each produces. This clearly separates it from neighbors like prime_cost or break_even, which calculate different cost structures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong mode-selection guidance by naming each mode's required inputs (share needs sales and hourlyWages, hours needs forecast, etc.), so an agent can pick the right mode. It stops short of saying when to prefer this tool over siblings such as prime_cost, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_list_knowledgeList RestaurantDoctorAI's libraryARead-onlyIdempotentInspect
Lists the entries of RestaurantDoctorAI's sourced library, all or one kind (guide, post, play, targets, fact or knowledge), up to 50 at a time: each with its id, kind, title, link and source, and for guides and blog posts the day it was published and last updated. It shows what the library has, such as every blog post and its date. Pages with offset and limit; nextOffset gives the next page. Nothing about the request is stored; only an anonymous daily count of searches (a list counts as one) is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which kind of entry to list: guide (the website's guides), post (blog posts), play (RestaurantDoctorAI's step-by-step fixes), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists); or all (the default). | all |
| limit | No | How many entries to return, 1 to 50 (default 20). | |
| offset | No | How many entries to skip (default 0). The next page starts at the nextOffset the previous list returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| note | Yes | |
| total | Yes | How many entries of this kind there are. |
| offset | Yes | |
| entries | Yes | In the library's order: guides, blog posts, playbook fixes, targets, facts, then knowledge entries. |
| nextOffset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real behavioral context beyond them: the 50-item cap per call, offset/limit paging with nextOffset as the cursor, and the privacy statement that nothing about the request is stored except an anonymous daily search count.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening is well front-loaded, but the paragraph is longer than needed: "It shows what the library has, such as every blog post and its date" re-states the field list already enumerated in the preceding clause, and the pagination statement duplicates the schema. Several sentences could be dropped without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read-only list with an output schema, so return values need not be explained. With 0 required params, full schema coverage, and pagination plus privacy notes covered, the agent has essentially everything needed to call it correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (including the full kind enum and the offset/limit defaults and bounds) are already documented in the schema. The description largely restates the kind list and pagination behavior rather than adding new syntax or format meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and resource ("Lists the entries of RestaurantDoctorAI's sourced library") and scopes it to all-or-one kind. That is unambiguous, but it never names or contrasts the obvious siblings (read_knowledge, search_knowledge), so the agent must infer the enumeration-vs-lookup distinction itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"It shows what the library has, such as every blog post and its date" implies a browse/inventory use case, which is useful context. However there is no explicit when-to-use guidance and no exclusions or pointers to read_knowledge/search_knowledge, so the selection logic against alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_par_levelsPrep list and par sheetARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | ||
| daysCovered | No | ||
| daysOpenPerWeek | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | The free prep and par sheet, to print or download. |
| items | Yes | |
| notes | Yes | |
| result | Yes | The result in the sheet's words. |
| totals | Yes | |
| toOrder | Yes | The items that need an order. |
| freeCheck | Yes |
TDQS
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.
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.
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.
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.
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.
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.
restaurantdoctor_plate_costPlate cost and menu price calculatorARead-onlyIdempotentInspect
Works out what one plate of a dish costs and what to charge for it, as the free plate cost calculator on restaurantdoctorai.com does: from each ingredient's pack price and the amount used (with a usable % for trim), or from a plate cost the owner already knows; then the food cost at the menu price, what's left per plate, the price for their target food cost and the prices inside the range for their type of restaurant, with the tax taken out of a tax-inclusive menu. It works from the owner's own prices and amounts, in any currency; a figure that isn't sent is never counted as 0. Returns the calculator's result, how it was worked out, and a link that opens the calculator with the same figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | ingredients: from each ingredient's pack price and the amount used. known: from a plate cost the owner already has. | |
| sold | No | ||
| extras | No | ||
| format | Yes | The type of restaurant, which sets the food cost range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| target | No | ||
| taxRate | No | ||
| portions | No | ||
| menuPrice | No | ||
| plateCost | No | ||
| ingredients | No | ||
| taxIncluded | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens the calculator with these figures. |
| mode | Yes | |
| batch | Yes | |
| guide | Yes | |
| notes | Yes | |
| range | Yes | The format's whole-menu food and drink cost range, % of sales. |
| checks | Yes | Figures to look at again. They don't hold up the result. |
| format | Yes | |
| result | Yes | The result in the page's words, in its order. |
| target | Yes | |
| taxPct | Yes | The tax rate in menu prices; 0 when they don't include it. |
| standing | Yes | |
| freeCheck | Yes | |
| plateCost | Yes | One plate's ingredient cost. |
| workedOut | Yes | How it was worked out. |
| priceRange | Yes | |
| atMenuPrice | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world, so the bar is lower; the description still adds genuine behavioral context: figures are not stored, only an anonymous daily run count is kept, a missing figure is never treated as 0, and any currency works. It does not state validation/failure behavior (e.g. what happens when portions is missing in ingredients mode).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, which is good, but the body is a long chain of clauses joined by semicolons and commas that mixes what it computes with privacy notes and provenance. It is information-dense rather than padded, yet a bulleted split of inputs / outputs / data handling would read far faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter calculator with an output schema, the description covers the domain model (mode selection, currency, tax treatment, target vs range), the return shape in prose, and the data-retention stance. The remaining gap is that the ingredient-array and volume parameters (sold, extras, portions) are not explained beyond the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 18%, so the description must carry weight. It explains the mode split, the usable-% trim concept, the target food cost, the restaurant-type range and tax-inclusive handling, but it never mentions sold, extras, portions or the ingredient array's per-line fields, leaving several parameters unaccounted for outside the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource pair (cost one plate, set the menu price) and enumerates the outputs: food cost at menu price, what's left per plate, price for a target food cost, and the range for the restaurant type. It never names a sibling such as cost_recipe or prime_cost, so the boundary with those tools is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the two data paths ('from each ingredient's pack price and the amount used ... or from a plate cost the owner already knows') and through 'as for a new dish' when menuPrice is absent, which hints at new-dish vs existing-dish situations. There is no explicit when-to-use / when-not-to-use statement and no routing to alternatives like cost_recipe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_prime_costPrime cost calculatorARead-onlyIdempotentInspect
Works out a restaurant's prime cost from the owner's own figures for one week or month, as the free prime cost calculator on restaurantdoctorai.com does: food and drink used plus labor, as a share of net sales, against the target for its type of restaurant, with what the points over or under are worth, food and labor each against their own range, and which to look at first. Takes net sales, food and drink purchases and wages, plus optional payroll taxes and benefits, stock counts and the owner's unpaid hours, in any currency; a figure that isn't sent is never counted as 0. Returns the calculator's result, how it was worked out, and a link that opens the calculator with the same figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| sales | No | ||
| wages | No | ||
| format | Yes | The type of restaurant, which sets the targets: prime cost, and the ranges for food and drink and for labor: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| period | Yes | Whether every figure covers one week or one month, the same dates for all of them. Sets how a year is worked out (52 weeks or 12 months). | |
| ownerPay | No | ||
| purchases | No | ||
| closingStock | No | ||
| openingStock | No | ||
| payrollCosts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| left | Yes | |
| link | Yes | Opens the calculator on the website with these figures filled in. |
| guide | Yes | |
| notes | Yes | |
| checks | Yes | Figures that look like a slip, as the page flags them. They don't block the result. |
| format | Yes | |
| period | Yes | |
| points | Yes | Points over the target, or to spare under it; 0 right at it. |
| result | Yes | The result in the page's words, in its order. |
| target | Yes | The prime cost ceiling for this type of restaurant, % of net sales. |
| figures | Yes | In the currency of the figures sent. |
| standing | Yes | Against the target, on the share as shown. |
| freeCheck | Yes | |
| workedOut | Yes | How it was worked out, with the figures in each step. |
| laborShare | Yes | |
| overTarget | Yes | |
| pointValue | Yes | One point of prime cost (1% of net sales), a period and a year, rounded as the page shows it. |
| primeCostPct | Yes | Food and drink used plus labor, % of net sales, one decimal. |
| withOwnerPay | Yes | |
| usedStockCounts | Yes | |
| foodAndDrinkShare | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/closed-world annotations: it discloses that figures are not stored (only an anonymous daily run count), that a missing figure is never treated as 0, and that the reply includes the result, the derivation, and a prefilled link. These are behaviors an agent could not infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome and followed by inputs, return shape, and privacy note in a logical order. It is a single dense block with some run-on accumulation of clauses, but nearly every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter calculator with an output schema, this covers the gap: what it computes, required vs optional inputs, currency-agnostic handling, null semantics, no-storage behavior, and the prefilled link. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 22%, the description must compensate, and it does: it names net sales, purchases, wages, optional payroll taxes/benefits, opening and closing stock, and unpaid owner hours, and clarifies they are 'in any currency' and that unsent values are never coerced to 0. It summarizes rather than fully specifying per-parameter interplay (e.g. the opening+closing pairing is only in the schema), keeping it just below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource — 'works out a restaurant's prime cost' — and immediately scopes it to one week or month against type-of-restaurant targets. This is clearly distinguishable from narrower siblings like labor_cost, plate_cost and cost_recipe, which cover only a slice of what this computes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Establishes clear context: a full prime-cost computation for a single week or month, using the owner's own figures, mirroring the free web calculator. It doesn't explicitly say when to prefer it over siblings such as restaurantdoctor_labor_cost or restaurantdoctor_break_even, so no exclusions are stated, but the intended use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_read_knowledgeRead a library entryARead-onlyIdempotentInspect
Reads one entry of RestaurantDoctorAI's library in full (a guide, a blog post, a playbook fix, the targets, a fact or a knowledge entry), by its id (such as 'guide:restaurant-prime-cost'), with its title, link and source. A long entry comes 8,000 characters at a time, with its total length: the next part starts at the nextOffset it returns. The query isn't stored; only an anonymous daily count of searches and reads is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | An entry id, as the library's search and list give it, e.g. 'guide:restaurant-prime-cost' or 'post:restaurant-break-even-point'. | |
| offset | No | Where to start, in characters (default 0, the start). A long entry comes 8,000 characters at a time: the next part starts at the nextOffset the previous read returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | The entry's id, which reading the entry in full takes. |
| url | Yes | Where a reader can check it: the page on restaurantdoctorai.com, or the fact's own source. |
| kind | Yes | |
| note | Yes | |
| text | Yes | The entry's text from offset, up to 8,000 characters. |
| title | Yes | |
| offset | Yes | Where this part starts, in characters. |
| source | Yes | Who says so, with the date it was checked or updated where there is one. |
| truncated | Yes | More of the entry follows this part (nextOffset says where). |
| nextOffset | Yes | |
| totalLength | Yes | The whole entry's length, in characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds meaningful context beyond those annotations: it explains the 8,000-character pagination behavior, the nextOffset return value for continuing, and that queries are not stored beyond anonymous daily counts. It does not cover error behavior or rate limits, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and remains compact across three sentences. The parenthetical list of entry types is somewhat long, but each sentence contributes useful detail about scope, pagination, or privacy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values. It covers the key operational detail for long entries through pagination and nextOffset, and annotations cover the safety profile. It would be stronger if it explicitly routed users from search/list to this read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents both the id and offset parameters with examples and character-count semantics. The description reinforces pagination but does not add meaning beyond what the schema provides, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it reads one entry of RestaurantDoctorAI's library in full by id, including guides, posts, playbook fixes, targets, facts, and knowledge entries. This clearly distinguishes it from sibling tools like list_knowledge and search_knowledge, which would return multiple or matched entries rather than one full entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the id format and the phrase 'by its id' suggest this tool is used after obtaining an id from search or list. However, the description does not explicitly say when to use this tool instead of search_knowledge or list_knowledge, nor does it state exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_restaurant_budgetRestaurant budget calculatorARead-onlyIdempotentInspect
Works out a restaurant's monthly budget from the owner's expected sales and type of restaurant, as the free restaurant budget calculator on restaurantdoctorai.com does: food and drink, labor, prime cost and rent with utilities as money ranges by RestaurantDoctorAI's targets for that type, other operating costs at the owner's share or a 20% working assumption, what's left after every bill, and break-even sales with labor counted both ways. Takes expected net sales and the type, plus optional rent, the owner's own pay and the other costs share, in any currency; a figure that isn't sent is never counted as 0. Returns the calculator's result, how it was worked out, and a link that opens the calculator with the same figures filled in. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| rent | No | ||
| sales | No | ||
| format | Yes | The type of restaurant, which sets RestaurantDoctorAI's targets the budget is split by: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| otherPct | No | ||
| ownerPay | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| left | Yes | Left over after every bill, before income tax, not profit; low is the budget at the top of the targets. |
| link | Yes | Opens the calculator with these figures. |
| rent | Yes | |
| lines | Yes | A month, low to high, money to the unit. primeCost is food and drink plus labor, a subtotal. |
| notes | Yes | |
| sales | Yes | |
| checks | Yes | Figures that look like a slip. |
| format | Yes | |
| result | Yes | The result in the page's words, in its order. |
| breakEven | Yes | With the budget at the top of the targets, rounded up to the unit. |
| freeCheck | Yes | |
| workedOut | Yes | How it was worked out. |
| otherCostsAssumed | Yes | True when the other operating costs share is the working assumption. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: figures aren't stored, only an anonymous daily count of runs is kept, a missing figure is never treated as 0, other costs default to a 20% working assumption rather than a published target, and the response includes a pre-filled link. These disclosure details (privacy, defaults, currency-agnostic handling) are exactly what annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose well in the opening clause, but the rest is one sprawling sentence chained with 'and...and...', packing outputs, inputs, currency, defaults, return shape, and data retention into a single breath. The content earns its place; the structure makes it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, and the description still gestures at the shape (result, how it was worked out, link). Combined with the mutation-free, closed-world annotations, the privacy note, defaults, and missing-input behavior, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning on top of the schema: identifies which inputs are optional versus needed for a result, states all figures are in any owner currency, and clarifies that an omitted value is not zero. The 20% default for other costs is reinforced in prose, though it is already in the schema, and the description does not expand on the enum values themselves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (work out a restaurant's monthly budget) and enumerates the outputs: food and drink, labor, prime cost, rent, other operating costs, remainder, and break-even. That is far more concrete than a generic 'calculate budget', though it never explicitly distinguishes itself from siblings like restaurantdoctor_break_even or restaurantdoctor_prime_cost, which produce overlapping sub-figures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description notes it mirrors the free calculator on restaurantdoctorai.com and takes expected sales and restaurant type, so an agent can infer 'use when the owner wants a full monthly budget'. There is no explicit when-not guidance and no mention of when to prefer the narrower siblings (prime cost, labor cost, break-even) that this tool partly subsumes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_run_free_checkRun the free profit checkARead-onlyIdempotentInspect
Scores a restaurant's 12 answers against RestaurantDoctorAI's targets for its type of restaurant and returns the free result the website shows: an overall grade, grades by area, the estimated profit leak of all the leaks together a month and a year, the biggest leak or opportunity with its estimated money a month, what one point of prime cost is worth, and the first fix. Includes a link that opens the same result on restaurantdoctorai.com. Takes only the 12 answers and the country, each answer one of the values its question accepts. The answers aren't stored; only an anonymous daily count of checks is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Where the restaurant is: a two-letter ISO 3166-1 code such as US, CA, AU or DE (GB for the United Kingdom). Sets the currency and local wording. Defaults to US. | US |
| laborFlexing | Yes | When a shift gets slow, what happens to staffing? realtime_cuts_splh = We cut staff based on sales per labor hour; fixed_shifts_regardless = Everyone works their scheduled shift anyway; overtime_above_8_percent = Overtime is common (More than 8% of hours); chronic_understaffing_owner_covers = We're short-staffed (The owner or GM works the line). | |
| serviceModel | Yes | What kind of restaurant do you run? quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food). | |
| contactCapture | Yes | How do you bring guests back? automated_pos_loyalty_50plus = Loyalty or email list with automatic campaigns (50+ new contacts a week); occasional_checkout_emails = We collect some emails but rarely use them; no_database_social_only = Social media and walk-ins only; paid_ads_no_list = Paid ads, but no guest list of our own. | |
| monthlyRevenue | Yes | About how much do you sell in a typical month? Amounts are in US dollars, or in the local currency where that's the euro, pound sterling, Swiss franc, or Canadian, Australian or New Zealand dollar. under_25k = Under $25,000 (Under $300K a year); 25k_60k = $25,000 – $60,000 ($300K – $720K a year); 60k_120k = $60,000 – $120,000 ($720K – $1.44M a year); 120k_200k = $120,000 – $200,000 ($1.44M – $2.4M a year); over_200k = Over $200,000 (Over $2.4M a year). | |
| seatingDynamics | Yes | How full is your dining room across the week? consistent_weekround = Steady all week; packed_weekends_dead_midweek = Packed on weekends, quiet midweek; strong_lunch_weak_dinner = Busy lunches, slow dinners; erratic_unpredictable = Hard to predict week to week. | |
| reputationHealth | Yes | What's your average rating on Google and Yelp? 4_5_to_5_0 = 4.5 – 5.0 stars; 4_0_to_4_4 = 4.0 – 4.4 stars; 3_5_to_3_9 = 3.5 – 3.9 stars; under_3_5 = Below 3.5 stars. | |
| beverageMonitoring | Yes | How do you control drink pours? no_alcohol = We don't serve alcohol; measured_pour_keg_audits = Measured pours, plus weekly pour-cost checks; occasional_spot_checks = Spot checks when bottles run out early; free_pour_no_audit = Free pours, no pour-cost checks. | |
| deliveryDependency | Yes | How much of your sales come through DoorDash, Uber Eats or similar apps? zero_direct_only = None (Dine-in and our own ordering only); under_15_with_markup = Under 15% (With higher app prices to cover fees); 15_to_35_standard_cut = 15% – 35% (At regular menu prices); over_35_heavy_drag = More than 35%. | |
| occupancyCostRatio | Yes | What share of sales goes to rent, property costs and utilities? under_8_percent = Under 8%; 8_to_12_percent = 8% – 12%; over_12_percent = More than 12%; unsure_ratio = I'm not sure. | |
| primeCostAwareness | Yes | What's your prime cost: food, drink and labor costs as a share of sales? under_58 = Under 58%; 58_to_64 = 58% – 64%; over_65 = 65% or more; not_tracked_weekly = I don't track it regularly. | |
| wasteTrackingMethod | Yes | How do you track kitchen waste and spoilage? daily_signed_log = A daily log the chef signs off; weekly_visual_estimate = A rough estimate during weekly inventory; bulk_loss_only = Only when a big batch or case goes bad; no_formal_logging = We don't track it. | |
| plateCostingFrequency | Yes | How often do you update recipe costs with current supplier prices? live_monthly_software = Monthly or live, with software (Synced to supplier invoices); 6_to_12m_manual = Once or twice a year (In a spreadsheet); new_menu_only = Only when the menu changes; rarely_gut_feeling = Rarely (Prices are set by feel or by competitors). |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Opens this result on the website. |
| risk | Yes | |
| areas | Yes | |
| grade | Yes | A (best) to F. |
| notes | Yes | What the result assumes. |
| biggest | Yes | The biggest leak, or the biggest sales opportunity when nothing leaks. |
| country | Yes | |
| leakText | Yes | |
| alsoCheck | No | |
| areasNote | Yes | |
| dayOneFix | Yes | |
| disclaimer | Yes | |
| primePoint | Yes | What one point of prime cost (1% of sales) is worth a month, at the working figure for the sales range. |
| yearlyLeak | Yes | The same total a year. null when no major leak was found. |
| countryName | Yes | |
| monthlyLeak | Yes | The total of all the leaks a month, as the website leads with it. null when no major leak was found. |
| needsAttention | Yes | |
| needsAttentionText | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, closed-world. The description adds genuinely new behavior: the answers are not stored, only an anonymous daily count of checks is kept, and a link to the same result on restaurantdoctorai.com is returned. It omits rate limiting or what happens with an invalid answer, but the privacy/data-retention disclosure is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single long sentence enumerating every returned field is padded and largely redundant with the output schema. The valuable parts (answer constraint, country, privacy note, link) are buried at the end rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not restate return values, and it covers inputs, source of the answers, currency effect of country, data retention, and the shareable link. Only an explicit pointer to get_questions and invalid-input behavior are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with enums and descriptions for all 13 parameters, so the schema does the heavy lifting. The description only restates that the 12 answers must be accepted enum values and that country is separate; it adds no format, currency, or validation nuance beyond what the schema already declares.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (scores 12 answers against targets, returns the free result) and enumerates the returned artifacts, making the purpose unambiguous. It is clearly distinguishable from calculation siblings like restaurantdoctor_prime_cost or restaurantdoctor_break_even, and from restaurantdoctor_get_questions which presumably supplies the answers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes prerequisite context by saying it takes only the 12 answers plus country, 'each answer one of the values its question accepts', which implicitly points to get_questions for obtaining them. It offers no explicit when-not guidance or named alternative, so it stops short of full routing clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_search_knowledgeSearch RestaurantDoctorAI's libraryARead-onlyIdempotentInspect
Searches RestaurantDoctorAI's sourced library: the website's guides and blog posts, RestaurantDoctorAI's step-by-step fixes, RestaurantDoctorAI's targets by type of restaurant, sourced industry facts, and an expert knowledge base of sourced how-tos, rules and checklists (costs, labor, money, growth, compliance, operations). Keyword search: "break-even", "breakeven" and "break even" are one term, and plurals match. Returns the best passages, each with its id, kind, title, link and source; kind narrows the search to one kind of entry. RestaurantDoctorAI's targets are its own, not industry benchmarks. The query isn't stored; only an anonymous daily count of searches and reads is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only this kind of entry: guide (the website's guides), post (blog posts), play (RestaurantDoctorAI's step-by-step fixes), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists). Left out, every kind. | |
| limit | No | How many passages to return, 1 to 8 (default 5). | |
| query | Yes | What to look up, in plain words, e.g. 'how to lower food cost', 'tip pool rules' or 'delivery app commission'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | Best match first. Empty when nothing matches. |
| note | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world. The description adds genuinely non-obvious behavior: keyword normalization ('break-even', 'breakeven', 'break even' are one term; plurals match), that only the best passages are returned, and a privacy note that queries aren't stored while an anonymous daily count of searches and reads is kept. That privacy and matching behavior is information the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content scope is front-loaded in the first sentence, followed by search behavior, return shape, the targets caveat, and the privacy note. It is dense and runs long, but nearly every sentence carries information an agent could act on; only the enumeration of library contents and the brief return-field list have mild overlap with structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obligated to explain return values, and annotations carry the safety profile. With those covered, the remaining gap is routing guidance relative to list_knowledge and read_knowledge; otherwise the definition gives enough for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the matching semantics of the query parameter (hyphen/space/plural equivalence) and by clarifying the meaning of the 'targets' kind ('RestaurantDoctorAI's targets are its own, not industry benchmarks'), which is a semantic distinction the enum description does not make.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (searches) and a well-defined resource (RestaurantDoctorAI's sourced library), enumerating exactly which content families it covers: guides, blog posts, step-by-step fixes, targets, sourced facts, and an expert knowledge base. This is far more specific than a generic 'search' tool, though it never names the closely related siblings (list_knowledge, read_knowledge) that an agent might otherwise confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the tool is a keyword search, and 'kind narrows the search to one kind of entry' hints at narrowing behavior. There is no explicit when-to-use, when-not-to-use, or routing to alternatives such as list_knowledge (browsing) or read_knowledge (fetching a specific entry), which are exactly the siblings an agent would need to disambiguate against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restaurantdoctor_tip_outTip-out sheetARead-onlyIdempotentInspect
Works out how a restaurant shares tips, two ways, as the free tip-out sheet on restaurantdoctorai.com does. method percent: a server's tip-out to support roles, each a percentage of the server's net sales or tips, with the total tip-out, what the server keeps from their tips, and an error-level check when the tip-out is more than the tips. method pool: a tip pool shared by hours, with optional points for each role, rounded to the cent with the rounding remainder placed on the largest share. Takes the figures in any currency; a figure that isn't sent is never counted as 0. Returns the split, how it was worked out, the Department of Labor's published points on tips with their sources, and a link to the free tip-out sheet. It only works out a split from the numbers sent; it doesn't say whether a tip-out or a tip pool is allowed. The figures aren't stored; only an anonymous daily count of calculator runs is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | ||
| pool | No | ||
| tips | No | ||
| roles | No | ||
| method | Yes | percent: one server's tip-out to support roles, each a % of the base. pool: a tip pool shared by hours, with optional points. | |
| members | No | ||
| baseKind | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| law | Yes | The Department of Labor's published points on tips and its state minimum wage page, each with its source. |
| link | Yes | The free tip-out sheet, to print or download. |
| pool | Yes | |
| notes | Yes | |
| checks | Yes | An error when the tip-out is more than the tips. |
| method | Yes | |
| result | Yes | The result in the sheet's words. |
| percent | Yes | |
| freeCheck | Yes | |
| workedOut | Yes | How it was worked out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the readOnly/idempotent/non-destructive annotations: rounding to the cent with remainder pushed onto the largest share, an error-level check when tip-out exceeds tips, currency-agnostic input, and the rule that an unsent figure is never counted as 0. It also discloses data handling ('figures aren't stored; only an anonymous daily count is kept'), which annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and mode definitions before the return and privacy details, so the essential information comes first. It is dense but mostly earns its length; the recurring plug for the free tip-out sheet (mentioned twice) is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, single-required-field tool with an output schema, the description covers both modes, edge cases, and limitations well enough to invoke correctly without the output schema explaining returns. The only shortfall is the absence of sibling cross-references among the many restaurantdoctor_* calculators.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains how parameters interlock across modes — base vs. pool, baseKind determining whether percentages come off net sales or tips, and that omitted figures are ignored rather than zeroed. This adds real meaning beyond the field-level schema text, though it doesn't enumerate every constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — works out how a restaurant shares tips — and names the two modes (percent, pool) with a one-line definition of each. An agent can distinguish this from siblings like restaurantdoctor_fica_tip_credit 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for each mode: percent is one server's tip-out to support roles off net sales or tips; pool is shared by hours with optional points. It also states a scope exclusion ('it doesn't say whether a tip-out or tip pool is allowed'), but never routes the agent to a sibling tool for related tip questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
restaurantdoctor_card_fees1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the likely mix of debit and credit cards: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"The type of restaurant, which sets the likely mix of debit and credit cards: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
- Changed
restaurantdoctor_labor_cost1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the labor range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"The type of restaurant, which sets the labor range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
- Changed
restaurantdoctor_plate_cost1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the food cost range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"The type of restaurant, which sets the food cost range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
- Changed
restaurantdoctor_prime_cost1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the targets: prime cost, and the ranges for food and drink and for labor: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"The type of restaurant, which sets the targets: prime cost, and the ranges for food and drink and for labor: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
- Changed
restaurantdoctor_restaurant_budget1 field changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets RestaurantDoctorAI's targets the budget is split by: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"The type of restaurant, which sets RestaurantDoctorAI's targets the budget is split by: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
- Changed
restaurantdoctor_run_free_check1 field changed- changed
Input schema / properties / serviceModel / descriptionPrevious value: -"What kind of restaurant do you run? quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."New value: +"What kind of restaurant do you run? quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, served at the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)."
7 tool updates
- Changed
restaurantdoctor_deadlines1 field changed- changed
Output schema / properties / checkWith / descriptionPrevious value: -"What we can't date for this owner: their own schedule or papers, or a state page not yet confirmed. Never a guessed date."New value: +"What we can't date for this owner: their own schedule or papers, or a state page not yet confirmed. No date here is guessed."
- Changed
restaurantdoctor_list_knowledge2 fields changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Which kind of entry to list: guide (the website's guides), post (blog posts), play (the step-by-step fixes from the paid report's playbook), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists); or all (the default)."New value: +"Which kind of entry to list: guide (the website's guides), post (blog posts), play (RestaurantDoctorAI's step-by-step fixes), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists); or all (the default)." - changed
Output schema / properties / nextOffset / anyOfPrevious value: -[ - { - "description": "Send it as offset for the next page.", - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Where the next page starts: the offset of the next list.", + "type": "number" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_menu_calories1 field changed- changed
Input schema / properties / ingredients / anyOfPrevious value: -[ - { - "description": "What goes into the dish or batch, one entry each. Needed for a result; if missing, the reply asks for it.", - "items": { - "additionalProperties": false, - "properties": { - "amount": { - "anyOf": [ - { - "description": "How much goes in, after trimming, in unit. Weighed if possible. Needed for a result; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "food": { - "anyOf": [ - { - "description": "The food: its name on the counter's list of USDA foods, as an earlier answer gave it, or the owner's words for it, matched to that list. Words that fit several foods, or none, come back as a tool error naming the foods to pick from, or saying it isn't on the list. With kcalPer100g, just its name.", - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - { - "type": "null" - } - ] - }, - "kcalPer100g": { - "anyOf": [ - { - "description": "For a food not on the list: kcal per 100 g from the nutrition panel on the owner's own pack, as the owner reads it (a US label gives a serving: its calories ÷ its grams × 100). Never an estimate by the assistant: if the owner has no label, the ingredient can't be counted yet. Weighed only.", - "maximum": 900, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "unit": { - "description": "g, kg, oz or lb for any food. ml, l, floz, cup, tbsp or tsp (US measures) for liquids and fats only; each for foods counted by the piece.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "cup", - "tbsp", - "tsp", - "each" - ], - "type": "string" - } - }, - "required": [ - "unit" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "What goes into the dish or batch, one entry each. Needed for a result; if missing, the reply asks for it.", + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "anyOf": [ + { + "description": "How much goes in, after trimming, in unit. Weighed if possible. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "food": { + "anyOf": [ + { + "description": "The food: its name on the counter's list of USDA foods, as an earlier answer gave it, or the owner's words for it, matched to that list. Words that fit several foods, or none, come back as a tool error naming the foods to pick from, or saying it isn't on the list. With kcalPer100g, just its name.", + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ] + }, + "kcalPer100g": { + "anyOf": [ + { + "description": "For a food not on the list: kcal per 100 g from the nutrition panel on the owner's own pack, as the owner reads it (a US label gives a serving: its calories ÷ its grams × 100). It's the label's figure, not an estimate by the assistant: without the owner's label, the ingredient can't be counted yet. Weighed only.", + "maximum": 900, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unit": { + "description": "g, kg, oz or lb for any food. ml, l, floz, cup, tbsp or tsp (US measures) for liquids and fats only; each for foods counted by the piece.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "cup", + "tbsp", + "tsp", + "each" + ], + "type": "string" + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_par_levels1 field changed- changed
Output schema / properties / items / items / properties / par / anyOfPrevious 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" + } +]
- Changed
restaurantdoctor_plate_cost1 field changed- changed
Input schema / properties / ingredients / anyOfPrevious value: -[ - { - "description": "With mode ingredients: each ingredient. A sauce or side already costed is one: its cost for a pack of 1 each, 1 each used.", - "items": { - "additionalProperties": false, - "properties": { - "name": { - "anyOf": [ - { - "description": "Optional: what it is, as the owner calls it.", - "maxLength": 100, - "type": "string" - }, - { - "type": "null" - } - ] - }, - "packSize": { - "anyOf": [ - { - "description": "How much one pack holds, in packUnit: 5 for a 5 lb bag. A case of 6 cans is 6 each; a 4 × 5 lb case is 20 lb.", - "exclusiveMinimum": 0, - "maximum": 1000000000, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "packUnit": { - "description": "The pack's unit: floz and gal are US fluid ounces and gallons.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "gal", - "each" - ], - "type": "string" - }, - "paid": { - "anyOf": [ - { - "description": "What the owner paid for one pack, from their latest invoice, before any VAT or GST they claim back.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "usable": { - "anyOf": [ - { - "description": "Optional: of what's bought, the % left after trimming or cooking: 85 for 1 kg that trims to 850 g. Left out, 100.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "used": { - "anyOf": [ - { - "description": "The amount that goes in the pot or on the plate, after trimming, for the plates in portions. Spoons or cups: weigh it once.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ] - }, - "usedUnit": { - "description": "The amount's unit, of the pack's kind: weight, volume and count don't convert into each other.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "gal", - "each" - ], - "type": "string" - } - }, - "required": [ - "packUnit", - "usedUnit" - ], - "type": "object" - }, - "maxItems": 30, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "With mode ingredients: each ingredient. A sauce or side already costed is one: its cost for a pack of 1 each, 1 each used.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "anyOf": [ + { + "description": "Optional: what it is, as the owner calls it.", + "maxLength": 100, + "type": "string" + }, + { + "type": "null" + } + ] + }, + "packSize": { + "anyOf": [ + { + "description": "How much one pack holds, in packUnit: 5 for a 5 lb bag. A case of 6 cans is 6 each; a 4 × 5 lb case is 20 lb.", + "exclusiveMinimum": 0, + "maximum": 1000000000, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "packUnit": { + "description": "The pack's unit: floz and gal are US fluid ounces and gallons.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "gal", + "each" + ], + "type": "string" + }, + "paid": { + "anyOf": [ + { + "description": "What the owner paid for one pack, from their latest invoice, before any VAT or GST they claim back.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "usable": { + "anyOf": [ + { + "description": "Optional: of what's bought, the % left after trimming or cooking: 85 for 1 kg that trims to 850 g. Left out, 100.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "used": { + "anyOf": [ + { + "description": "The amount that goes in the pot or on the plate, after trimming, for the plates in portions. Spoons or cups: weighed once.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "usedUnit": { + "description": "The amount's unit, of the pack's kind: weight, volume and count don't convert into each other.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "gal", + "each" + ], + "type": "string" + } + }, + "required": [ + "packUnit", + "usedUnit" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_run_free_check3 fields changed- removed
Output schema / properties / fullReportRemoved value: -{ - "additionalProperties": false, - "properties": { - "note": { - "type": "string" - }, - "prices": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "premium": { - "anyOf": [ - { - "description": "With the owner's own numbers and a check-up.", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "standard": { - "type": "string" - } - }, - "required": [ - "standard", - "premium" - ], - "type": "object" - }, - { - "type": "null" - } - ], - "description": "null when they couldn't be read." - } - }, - "required": [ - "note", - "prices" - ], - "type": "object" -} - removed
Output schema / properties / fullReportAddsRemoved value: -{ - "description": "What the paid full report adds.", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Output schema / requiredPrevious value: -[ - "country", - "countryName", - "grade", - "risk", - "needsAttention", - "needsAttentionText", - "areas", - "areasNote", - "monthlyLeak", - "yearlyLeak", - "leakText", - "biggest", - "primePoint", - "notes", - "dayOneFix", - "link", - "fullReport", - "fullReportAdds", - "disclaimer" -]New value: +[ + "country", + "countryName", + "grade", + "risk", + "needsAttention", + "needsAttentionText", + "areas", + "areasNote", + "monthlyLeak", + "yearlyLeak", + "leakText", + "biggest", + "primePoint", + "notes", + "dayOneFix", + "link", + "disclaimer" +]
- Changed
restaurantdoctor_search_knowledge1 field changed- changed
Input schema / properties / kind / descriptionPrevious value: -"Only this kind of entry: guide (the website's guides), post (blog posts), play (the step-by-step fixes from the paid report's playbook), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists). Left out, every kind."New value: +"Only this kind of entry: guide (the website's guides), post (blog posts), play (RestaurantDoctorAI's step-by-step fixes), targets (RestaurantDoctorAI's targets by type of restaurant), fact (sourced industry facts) or knowledge (sourced how-tos, rules and checklists). Left out, every kind."
4 tool updates
- Changed
restaurantdoctor_cost_recipe1 field changed- changed
Input schema / properties / recipe / descriptionPrevious value: -"The recipe as written: its name, its servings line (\"Serves 6\") and its ingredient lines, one a line, each amount and unit exactly as the recipe or the photo gives it. Method steps may follow under a heading such as \"Instructions\"; only ingredient lines are costed. Don't convert, round or correct anything: the owner checks the lines on the website. At most 8000 characters and 60 ingredient lines."New value: +"The recipe as written: its name, its servings line (\"Serves 6\") and its ingredient lines, one a line, each amount and unit exactly as the recipe or the photo gives it. Method steps may follow under a heading such as \"Instructions\"; only ingredient lines are costed. The lines are read as sent, not converted, rounded or corrected: the owner checks them on the website. At most 8000 characters and 60 ingredient lines."
- Changed
restaurantdoctor_fica_tip_credit1 field changed- changed
Input schema / properties / reportedTips / anyOfPrevious value: -[ - { - "description": "A year's tips reported through payroll for one business, in US dollars: line 5b of the year's four Forms 941 added up, W-2 box 7 totals, or the year's total from the payroll tips report (Toast, Gusto). Never service charges, automatic gratuities or delivery fees: they're wages. Needed for a result; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "A year's tips reported through payroll for one business, in US dollars: line 5b of the year's four Forms 941 added up, W-2 box 7 totals, or the year's total from the payroll tips report (Toast, Gusto). Service charges, automatic gratuities and delivery fees don't count: they're wages. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_list_knowledge1 field changed- changed
Input schema / properties / offset / descriptionPrevious value: -"How many entries to skip (default 0). Send the nextOffset a list gave for the next page."New value: +"How many entries to skip (default 0). The next page starts at the nextOffset the previous list returned."
- Changed
restaurantdoctor_read_knowledge1 field changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Where to start, in characters (default 0, the start). A long entry comes 8,000 characters at a time: send the nextOffset a read gave for the next part."New value: +"Where to start, in characters (default 0, the start). A long entry comes 8,000 characters at a time: the next part starts at the nextOffset the previous read returned."
7 tool updates
- Changed
restaurantdoctor_booking_fees1 field changed- changed
Output schema / properties / headline / descriptionPrevious value: -"Show it first."New value: +"The result in one sentence."
- Changed
restaurantdoctor_get_questions1 field changed- changed
Output schema / properties / questions / items / properties / key / descriptionPrevious value: -"The answer's name in restaurantdoctor_run_free_check."New value: +"The answer's name, as the free check takes it."
- Changed
restaurantdoctor_list_knowledge1 field changed- changed
Output schema / properties / entries / items / properties / id / descriptionPrevious value: -"The entry's id, for restaurantdoctor_read_knowledge."New value: +"The entry's id, which reading the entry in full takes."
- Changed
restaurantdoctor_par_levels1 field changed- changed
Input schema / properties / items / anyOfPrevious 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" + } +]
- Changed
restaurantdoctor_read_knowledge2 fields changed- changed
Output schema / properties / id / descriptionPrevious value: -"The entry's id, for restaurantdoctor_read_knowledge."New value: +"The entry's id, which reading the entry in full takes." - changed
Output schema / properties / nextOffset / anyOfPrevious value: -[ - { - "description": "Where the next part starts: send it as offset to restaurantdoctor_read_knowledge.", - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Where the next part starts, in characters: the offset of the next read.", + "type": "number" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_restaurant_budget2 fields changed- changed
Output schema / properties / left / descriptionPrevious value: -"Left over after every bill, before income tax; low is the budget at the top of the targets. Never call it profit."New value: +"Left over after every bill, before income tax, not profit; low is the budget at the top of the targets." - changed
Output schema / properties / rent / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "The owner's rent against the occupancy range.", - "properties": { - "band": { - "enum": [ - "under", - "inside", - "over" - ], - "type": "string" - }, - "pct": { - "type": "number" - } - }, - "required": [ - "pct", - "band" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "description": "The owner's rent against the occupancy ceiling, the top of the range: within it or over it.", + "properties": { + "band": { + "enum": [ + "within", + "over" + ], + "type": "string" + }, + "pct": { + "type": "number" + } + }, + "required": [ + "pct", + "band" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
restaurantdoctor_search_knowledge1 field changed- changed
Output schema / properties / hits / items / properties / id / descriptionPrevious value: -"The entry's id, for restaurantdoctor_read_knowledge."New value: +"The entry's id, which reading the entry in full takes."
3 tool updates
- Added
restaurantdoctor_cash_out - Added
restaurantdoctor_par_levels - Added
restaurantdoctor_tip_out
1 tool update
- Changed
restaurantdoctor_break_even27 fields changed- changed
Input schema / properties / averageSpend / anyOfPrevious value: -[ - { - "description": "Optional: average spend per guest, the POS average check or net sales ÷ guests or orders. Turns sales into guests.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Optional: average spend per guest, the POS average check or net sales ÷ guests. Turns sales into guests.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / daysPerWeek / anyOfPrevious value: -[ - { - "description": "Optional: days open a week, a whole number from 1 to 7. Turns the month into sales a day open (and guests a day, with averageSpend); left out, the day figures are left out.", - "maximum": 7, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Optional: days open a week, a whole number from 1 to 7. Turns the month into a day open (and guests a day, with averageSpend).", + "maximum": 7, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / fixedBills / anyOfPrevious value: -[ - { - "description": "A month of the bills that stay the same however busy it is: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full, and the owner's own pay if it isn't on payroll (left out, break-even assumes they work for free). No depreciation. Yearly bills ÷ 12. Needed for a result; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "A month of the bills that stay the same: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full. No depreciation. Yearly bills ÷ 12. Not the owner's pay. Needed; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / goal / anyOfPrevious value: -[ - { - "description": "Optional: what the owner would like left over each month after every bill, before income tax. Adds the sales a month that would take.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Optional: what the owner would like left over a month after every bill, before income tax. Adds the sales for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / hourly / anyOfPrevious value: -[ - { - "description": "Whether hourly staff time goes up and down with sales: yes if shifts are added and cut as it gets busy or quiet; no if about the same team works every shift, so hourly pay is a bill that stays the same; unsure (the default) works it out both ways, as a range.", - "enum": [ - "yes", - "no", - "unsure" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Whether hourly staff time goes up and down with sales: yes, shifts are added and cut as it gets busy or quiet; no, about the same team every shift (a bill that stays the same); unsure (the default): both ways, as a range.", + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / hourlyPay / anyOfPrevious value: -[ - { - "description": "That month's hourly wages from payroll, plus the employer's payroll taxes and benefits on them; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Needed for a result (0 with no hourly staff); if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "That month's hourly wages from payroll, plus the employer's payroll taxes and benefits; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Needed (0 with no hourly staff); if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / openingStock / anyOfPrevious value: -[ - { - "description": "Optional: stock at cost at the start of the month. Used only with closingStock: food and drink then becomes what was used, opening + purchases - closing. Skip both if stock stayed about the same.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Optional: stock at cost at the start of the month. Used only with closingStock: food and drink is then opening + purchases - closing. Skip both if stock stayed steady.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / otherVariable / anyOfPrevious value: -[ - { - "description": "That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Needed for a result (0 if none); if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "That month's other costs that rise with every sale: card fees, app commissions (app sales minus payouts, without tax and tips), packaging, percentage rent, royalties, ad fund fees; nothing in the food and drink invoices. Needed (0 if none); if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - added
Input schema / properties / ownerPayAdded value: +{ + "anyOf": [ + { + "description": "Optional: the owner's own pay a month, if not on payroll. Counted as a bill; break-even is also given without it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] +} - changed
Input schema / properties / purchases / anyOfPrevious value: -[ - { - "description": "That month's food and drink supplier invoices, added up by delivery date. Needed for a result; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "That month's food and drink supplier invoices, by delivery date. Needed; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / sales / anyOfPrevious value: -[ - { - "description": "Net sales for one typical month, in the owner's own currency like every figure here: the POS sales summary, before tax and tips, delivery app orders at menu price. Not a holiday rush or a one-off: every figure is for that same month. Needed for a result, and more than 0; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Net sales for one typical month, in the owner's own currency: the POS sales summary, before tax and tips, app orders at menu price. Not a holiday rush: every figure is for that month. Needed, more than 0; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / checks / descriptionPrevious value: -"Figures that look like a slip, as the page flags them."New value: +"Figures that look like a slip." - changed
Output schema / properties / figures / properties / foodAndDrink / descriptionPrevious value: -"Used: opening + purchases - closing with both stock counts, else purchases."New value: +"Opening + purchases - closing with both stock counts, else purchases." - added
Output schema / properties / figures / properties / ownerPayAdded value: +{ + "anyOf": [ + { + "description": "Null: not sent.", + "type": "number" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / figures / requiredPrevious value: -[ - "sales", - "foodAndDrink", - "hourlyPay", - "otherVariable", - "fixedBills" -]New value: +[ + "sales", + "foodAndDrink", + "hourlyPay", + "otherVariable", + "fixedBills", + "ownerPay" +] - changed
Output schema / properties / leftOver / descriptionPrevious value: -"Left over after every bill at this month's sales, before income tax, to the unit: below 0 when short. Never call it profit."New value: +"Left over after every bill and ownerPay at these sales, before income tax: below 0 when short. Not profit." - changed
Output schema / properties / pointValue / descriptionPrevious value: -"1% of sales, to the unit: what each point of cost saved leaves a month."New value: +"1% of sales: what a point of cost saved leaves a month." - changed
Output schema / properties / result / descriptionPrevious value: -"The result in the page's words, in its order."New value: +"The page's result, line by line." - changed
Output schema / properties / scenarios / descriptionPrevious value: -"Hourly pay one way, or both (rising first) when the owner isn't sure and has hourly pay."New value: +"Hourly pay one way, or both (rising first)." - changed
Output schema / properties / scenarios / items / properties / breakEven / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Sales and guests rounded up to the unit, the rest to the nearest, as the page shows them. Null: no amount of sales breaks even this way.", - "properties": { - "cushion": { - "description": "Net sales minus break-even: below 0 when short.", - "type": "number" - }, - "cushionPct": { - "description": "The cushion, % of net sales, one decimal.", - "type": "number" - }, - "dayOpen": { - "anyOf": [ - { - "description": "Needs daysPerWeek.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "goalSales": { - "anyOf": [ - { - "description": "Sales a month to have the goal left over. Needs goal.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "guestsADay": { - "anyOf": [ - { - "description": "Needs daysPerWeek and averageSpend.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "guestsAMonth": { - "anyOf": [ - { - "description": "Needs averageSpend.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "monthly": { - "type": "number" - }, - "moreGuestsADay": { - "anyOf": [ - { - "description": "When short, with daysPerWeek and averageSpend: the guests a day that close it.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "perThousandOffBills": { - "description": "The same, for each 1,000 a month off fixedBills.", - "type": "number" - }, - "pointOffFixed": { - "description": "The same, for one point off a fixed bill (salaries).", - "type": "number" - }, - "pointOffRising": { - "description": "How far break-even falls a month for one point of sales off a rising cost.", - "type": "number" - }, - "shortADayOpen": { - "anyOf": [ - { - "description": "When short, with daysPerWeek: the gap a day open.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "weekly": { - "type": "number" - } - }, - "required": [ - "monthly", - "weekly", - "dayOpen", - "guestsADay", - "guestsAMonth", - "cushion", - "cushionPct", - "shortADayOpen", - "moreGuestsADay", - "goalSales", - "pointOffRising", - "pointOffFixed", - "perThousandOffBills" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "description": "Sales and guests rounded up, the rest to the nearest unit. Null: never breaks even this way.", + "properties": { + "cushion": { + "description": "Net sales minus break-even.", + "type": "number" + }, + "cushionPct": { + "description": "The cushion, % of net sales.", + "type": "number" + }, + "dayOpen": { + "anyOf": [ + { + "description": "Needs daysPerWeek.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "goalSales": { + "anyOf": [ + { + "description": "Sales a month for the goal. Needs goal.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "guestsADay": { + "anyOf": [ + { + "description": "Needs daysPerWeek and averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "guestsADayWithoutPay": { + "anyOf": [ + { + "description": "Needs ownerPay, daysPerWeek, averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "guestsAMonth": { + "anyOf": [ + { + "description": "Needs averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthly": { + "type": "number" + }, + "moreGuestsADay": { + "anyOf": [ + { + "description": "When short, with daysPerWeek and averageSpend: guests a day to close it.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "perThousandOffBills": { + "description": "The same, 1,000 a month off the bills.", + "type": "number" + }, + "pointOffFixed": { + "description": "The same, a point off a fixed bill.", + "type": "number" + }, + "pointOffRising": { + "description": "Fall in break-even for a point of sales off a rising cost.", + "type": "number" + }, + "shortADayOpen": { + "anyOf": [ + { + "description": "When short, with daysPerWeek: the gap a day open.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "weekly": { + "type": "number" + }, + "withoutPay": { + "anyOf": [ + { + "description": "Without ownerPay. Needs it.", + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "monthly", + "weekly", + "dayOpen", + "guestsADay", + "guestsAMonth", + "withoutPay", + "guestsADayWithoutPay", + "cushion", + "cushionPct", + "shortADayOpen", + "moreGuestsADay", + "goalSales", + "pointOffRising", + "pointOffFixed", + "perThousandOffBills" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / scenarios / items / properties / costsThatRisePct / descriptionPrevious value: -"% of net sales, one decimal. At 100 or more, no amount of sales breaks even."New value: +"% of net sales. At 100 or more, it never breaks even." - changed
Output schema / properties / scenarios / items / properties / hourlyPay / descriptionPrevious value: -"With the costs that rise with sales, or as a fixed bill."New value: +"Rising with sales, or a fixed bill." - added
Output schema / properties / scenarios / items / properties / pricesAdded value: +{ + "description": "Prices -10%, as now, +10%: same guests, plates, hourly pay, bills. An illustration.", + "items": { + "additionalProperties": false, + "properties": { + "changePct": { + "type": "number" + }, + "guestsADay": { + "anyOf": [ + { + "description": "Needs daysPerWeek, averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthly": { + "anyOf": [ + { + "description": "Null: never.", + "type": "number" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "changePct", + "monthly", + "guestsADay" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / properties / scenarios / items / requiredPrevious value: -[ - "hourlyPay", - "costsThatRisePct", - "breakEven" -]New value: +[ + "hourlyPay", + "costsThatRisePct", + "breakEven", + "prices" +] - changed
Output schema / properties / standing / descriptionPrevious value: -"Net sales against break-even (at: almost exactly); never: no amount of sales breaks even, either way."New value: +"Net sales against break-even (at: almost exactly; never: no break-even either way)." - added
Output schema / properties / whatIfAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "hourly", - "standing", - "figures", - "usedStockCounts", - "daysAMonth", - "scenarios", - "leftOver", - "pointValue", - "result", - "checks", - "notes", - "workedOut", - "link", - "freeCheck" -]New value: +[ + "hourly", + "standing", + "figures", + "usedStockCounts", + "daysAMonth", + "scenarios", + "leftOver", + "pointValue", + "result", + "checks", + "whatIf", + "notes", + "workedOut", + "link", + "freeCheck" +]
2 tool updates
- Changed
restaurantdoctor_read_knowledge1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"An entry id from restaurantdoctor_search_knowledge or restaurantdoctor_list_knowledge, e.g. 'guide:restaurant-prime-cost' or 'post:restaurant-break-even-point'."New value: +"An entry id, as the library's search and list give it, e.g. 'guide:restaurant-prime-cost' or 'post:restaurant-break-even-point'."
- Changed
restaurantdoctor_run_free_check1 field changed- changed
Input schema / properties / monthlyRevenue / descriptionPrevious value: -"About how much do you sell in a typical month? Amounts are in US dollars, or in the local currency where that's the euro, pound sterling, Swiss franc, or Canadian, Australian or New Zealand dollar; restaurantdoctor_get_questions shows the exact ranges for a country. under_25k = Under $25,000 (Under $300K a year); 25k_60k = $25,000 – $60,000 ($300K – $720K a year); 60k_120k = $60,000 – $120,000 ($720K – $1.44M a year); 120k_200k = $120,000 – $200,000 ($1.44M – $2.4M a year); over_200k = Over $200,000 (Over $2.4M a year)."New value: +"About how much do you sell in a typical month? Amounts are in US dollars, or in the local currency where that's the euro, pound sterling, Swiss franc, or Canadian, Australian or New Zealand dollar. under_25k = Under $25,000 (Under $300K a year); 25k_60k = $25,000 – $60,000 ($300K – $720K a year); 60k_120k = $60,000 – $120,000 ($720K – $1.44M a year); 120k_200k = $120,000 – $200,000 ($1.44M – $2.4M a year); over_200k = Over $200,000 (Over $2.4M a year)."
6 tool updates
- Changed
restaurantdoctor_card_fees3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the likely mix of debit and credit cards: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more)."New value: +"The type of restaurant, which sets the likely mix of debit and credit cards: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)." - changed
Input schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +] - changed
Output schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +]
- Changed
restaurantdoctor_labor_cost3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the labor range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more)."New value: +"The type of restaurant, which sets the labor range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)." - changed
Input schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +] - changed
Output schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +]
- Changed
restaurantdoctor_plate_cost3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the food cost range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more)."New value: +"The type of restaurant, which sets the food cost range and the starting target: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)." - changed
Input schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +] - changed
Output schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +]
- Changed
restaurantdoctor_prime_cost3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"The type of restaurant, which sets the targets: prime cost, and the ranges for food and drink and for labor: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more)."New value: +"The type of restaurant, which sets the targets: prime cost, and the ranges for food and drink and for labor: quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)." - changed
Input schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +] - changed
Output schema / properties / format / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +]
- Added
restaurantdoctor_restaurant_budget - Changed
restaurantdoctor_run_free_check2 fields changed- changed
Input schema / properties / serviceModel / descriptionPrevious value: -"What kind of restaurant do you run? quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more)."New value: +"What kind of restaurant do you run? quick_service = Quick service (Counter or kiosk, fast turnover); fast_casual = Fast casual (Order at the counter, food brought to the table); full_service = Full service / casual dining (Servers, moderate check); fine_dining = Fine dining (Chef-driven, higher check); bar_lounge = Bar, taproom or lounge (Drinks are about half of sales or more); cafe = Café or coffee shop (Drinks lead, with pastries and light food)." - changed
Input schema / properties / serviceModel / enumPrevious value: -[ - "quick_service", - "fast_casual", - "full_service", - "fine_dining", - "bar_lounge" -]New value: +[ + "quick_service", + "fast_casual", + "full_service", + "fine_dining", + "bar_lounge", + "cafe" +]
1 tool update
- Changed
restaurantdoctor_check_website1 field changed- changed
Output schema / properties / website / descriptionPrevious value: -"The address that answered, after redirects."New value: +"Where the site answered after redirects: its scheme and host only, such as https://www.joesdiner.com."
2 tool updates
- Added
restaurantdoctor_booking_fees - Changed
restaurantdoctor_run_free_check1 field changed- added
Output schema / properties / alsoCheckAdded value: +{ + "type": "string" +}
9 tool updates
- Changed
restaurantdoctor_break_even63 fields changed- added
Input schema / properties / averageSpend / anyOfAdded value: +[ + { + "description": "Optional: average spend per guest, the POS average check or net sales ÷ guests or orders. Turns sales into guests.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / averageSpend / descriptionRemoved value: -"Optional: average spend per guest, the POS average check or net sales ÷ guests or orders. Turns sales into guests." - removed
Input schema / properties / averageSpend / maximumRemoved value: -1000000000 - removed
Input schema / properties / averageSpend / minimumRemoved value: -0 - removed
Input schema / properties / averageSpend / typeRemoved value: -"number" - added
Input schema / properties / closingStock / anyOfAdded value: +[ + { + "description": "Optional: stock at cost at the end of the month. Used only with openingStock.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / closingStock / descriptionRemoved value: -"Optional: stock at cost at the end of the month. Used only with openingStock." - removed
Input schema / properties / closingStock / maximumRemoved value: -1000000000 - removed
Input schema / properties / closingStock / minimumRemoved value: -0 - removed
Input schema / properties / closingStock / typeRemoved value: -"number" - added
Input schema / properties / daysPerWeek / anyOfAdded value: +[ + { + "description": "Optional: days open a week, a whole number from 1 to 7. Turns the month into sales a day open (and guests a day, with averageSpend); left out, the day figures are left out.", + "maximum": 7, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / daysPerWeek / descriptionRemoved value: -"Optional: days open a week, a whole number from 1 to 7. Turns the month into sales a day open (and guests a day, with averageSpend); left out, the day figures are left out." - removed
Input schema / properties / daysPerWeek / maximumRemoved value: -7 - removed
Input schema / properties / daysPerWeek / minimumRemoved value: -1 - removed
Input schema / properties / daysPerWeek / typeRemoved value: -"integer" - added
Input schema / properties / fixedBills / anyOfAdded value: +[ + { + "description": "A month of the bills that stay the same however busy it is: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full, and the owner's own pay if it isn't on payroll (left out, break-even assumes they work for free). No depreciation. Yearly bills ÷ 12. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / fixedBills / descriptionRemoved value: -"A month of the bills that stay the same however busy it is: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full, and the owner's own pay if it isn't on payroll (left out, break-even assumes they work for free). No depreciation. Yearly bills ÷ 12. Needed for a result; if missing, the reply asks for it." - removed
Input schema / properties / fixedBills / maximumRemoved value: -1000000000 - removed
Input schema / properties / fixedBills / minimumRemoved value: -0 - removed
Input schema / properties / fixedBills / typeRemoved value: -"number" - added
Input schema / properties / goal / anyOfAdded value: +[ + { + "description": "Optional: what the owner would like left over each month after every bill, before income tax. Adds the sales a month that would take.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / goal / descriptionRemoved value: -"Optional: what the owner would like left over each month after every bill, before income tax. Adds the sales a month that would take." - removed
Input schema / properties / goal / maximumRemoved value: -1000000000 - removed
Input schema / properties / goal / minimumRemoved value: -0 - removed
Input schema / properties / goal / typeRemoved value: -"number" - added
Input schema / properties / hourly / anyOfAdded value: +[ + { + "description": "Whether hourly staff time goes up and down with sales: yes if shifts are added and cut as it gets busy or quiet; no if about the same team works every shift, so hourly pay is a bill that stays the same; unsure (the default) works it out both ways, as a range.", + "enum": [ + "yes", + "no", + "unsure" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / hourly / descriptionRemoved value: -"Whether hourly staff time goes up and down with sales: yes if shifts are added and cut as it gets busy or quiet; no if about the same team works every shift, so hourly pay is a bill that stays the same; unsure (the default) works it out both ways, as a range." - removed
Input schema / properties / hourly / enumRemoved value: -[ - "yes", - "no", - "unsure" -] - removed
Input schema / properties / hourly / typeRemoved value: -"string" - added
Input schema / properties / hourlyPay / anyOfAdded value: +[ + { + "description": "That month's hourly wages from payroll, plus the employer's payroll taxes and benefits on them; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Needed for a result (0 with no hourly staff); if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / hourlyPay / descriptionRemoved value: -"That month's hourly wages from payroll, plus the employer's payroll taxes and benefits on them; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Needed for a result (0 with no hourly staff); if missing, the reply asks for it." - removed
Input schema / properties / hourlyPay / maximumRemoved value: -1000000000 - removed
Input schema / properties / hourlyPay / minimumRemoved value: -0 - removed
Input schema / properties / hourlyPay / typeRemoved value: -"number" - added
Input schema / properties / openingStock / anyOfAdded value: +[ + { + "description": "Optional: stock at cost at the start of the month. Used only with closingStock: food and drink then becomes what was used, opening + purchases - closing. Skip both if stock stayed about the same.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / openingStock / descriptionRemoved value: -"Optional: stock at cost at the start of the month. Used only with closingStock: food and drink then becomes what was used, opening + purchases - closing. Skip both if stock stayed about the same." - removed
Input schema / properties / openingStock / maximumRemoved value: -1000000000 - removed
Input schema / properties / openingStock / minimumRemoved value: -0 - removed
Input schema / properties / openingStock / typeRemoved value: -"number" - added
Input schema / properties / otherVariable / anyOfAdded value: +[ + { + "description": "That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Needed for a result (0 if none); if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / otherVariable / descriptionRemoved value: -"That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Needed for a result (0 if none); if missing, the reply asks for it." - removed
Input schema / properties / otherVariable / maximumRemoved value: -1000000000 - removed
Input schema / properties / otherVariable / minimumRemoved value: -0 - removed
Input schema / properties / otherVariable / typeRemoved value: -"number" - added
Input schema / properties / purchases / anyOfAdded value: +[ + { + "description": "That month's food and drink supplier invoices, added up by delivery date. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / purchases / descriptionRemoved value: -"That month's food and drink supplier invoices, added up by delivery date. Needed for a result; if missing, the reply asks for it." - removed
Input schema / properties / purchases / maximumRemoved value: -1000000000 - removed
Input schema / properties / purchases / minimumRemoved value: -0 - removed
Input schema / properties / purchases / typeRemoved value: -"number" - added
Input schema / properties / sales / anyOfAdded value: +[ + { + "description": "Net sales for one typical month, in the owner's own currency like every figure here: the POS sales summary, before tax and tips, delivery app orders at menu price. Not a holiday rush or a one-off: every figure is for that same month. Needed for a result, and more than 0; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / sales / descriptionRemoved value: -"Net sales for one typical month, in the owner's own currency like every figure here: the POS sales summary, before tax and tips, delivery app orders at menu price. Not a holiday rush or a one-off: every figure is for that same month. Needed for a result, and more than 0; if missing, the reply asks for it." - removed
Input schema / properties / sales / maximumRemoved value: -1000000000 - removed
Input schema / properties / sales / minimumRemoved value: -0 - removed
Input schema / properties / sales / typeRemoved value: -"number" - changed
Output schema / properties / checks / descriptionPrevious value: -"Figures that look like a slip, as the page flags them. They don't block the result."New value: +"Figures that look like a slip, as the page flags them." - changed
Output schema / properties / link / descriptionPrevious value: -"Opens the calculator on the website with these figures filled in."New value: +"Opens the calculator with these figures." - changed
Output schema / properties / pointValue / descriptionPrevious value: -"One point of sales (1%), to the unit: what each point of cost saved leaves a month."New value: +"1% of sales, to the unit: what each point of cost saved leaves a month." - changed
Output schema / properties / scenarios / descriptionPrevious value: -"Hourly pay counted one way, or both ways (rising first) when the owner isn't sure and has hourly pay."New value: +"Hourly pay one way, or both (rising first) when the owner isn't sure and has hourly pay." - changed
Output schema / properties / scenarios / items / properties / breakEven / anyOfPrevious value: -[ - { - "additionalProperties": false, - "description": "Break-even sales and guests rounded up to the unit, the rest to the nearest unit, as the page shows them. Null: no amount of sales breaks even this way.", - "properties": { - "cushion": { - "description": "Net sales minus break-even: below 0 when short.", - "type": "number" - }, - "cushionPct": { - "description": "The cushion, % of net sales, one decimal.", - "type": "number" - }, - "dayOpen": { - "anyOf": [ - { - "description": "Needs daysPerWeek.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "goalSales": { - "anyOf": [ - { - "description": "Sales a month to have the goal left over. Needs goal.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "guestsADay": { - "anyOf": [ - { - "description": "Needs daysPerWeek and averageSpend.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "guestsAMonth": { - "anyOf": [ - { - "description": "Needs averageSpend.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "monthly": { - "type": "number" - }, - "moreGuestsADay": { - "anyOf": [ - { - "description": "When short, with daysPerWeek and averageSpend: the guests a day that close it.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "perThousandOffBills": { - "description": "The same, for each 1,000 a month off the bills that stay the same.", - "type": "number" - }, - "pointOffFixed": { - "description": "The same, for one point off a fixed bill (salaries).", - "type": "number" - }, - "pointOffRising": { - "description": "How far break-even falls a month for one point of sales off a cost that rises with sales.", - "type": "number" - }, - "shortADayOpen": { - "anyOf": [ - { - "description": "When short, with daysPerWeek: the gap a day open.", - "type": "number" - }, - { - "type": "null" - } - ] - }, - "weekly": { - "type": "number" - } - }, - "required": [ - "monthly", - "weekly", - "dayOpen", - "guestsADay", - "guestsAMonth", - "cushion", - "cushionPct", - "shortADayOpen", - "moreGuestsADay", - "goalSales", - "pointOffRising", - "pointOffFixed", - "perThousandOffBills" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "description": "Sales and guests rounded up to the unit, the rest to the nearest, as the page shows them. Null: no amount of sales breaks even this way.", + "properties": { + "cushion": { + "description": "Net sales minus break-even: below 0 when short.", + "type": "number" + }, + "cushionPct": { + "description": "The cushion, % of net sales, one decimal.", + "type": "number" + }, + "dayOpen": { + "anyOf": [ + { + "description": "Needs daysPerWeek.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "goalSales": { + "anyOf": [ + { + "description": "Sales a month to have the goal left over. Needs goal.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "guestsADay": { + "anyOf": [ + { + "description": "Needs daysPerWeek and averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "guestsAMonth": { + "anyOf": [ + { + "description": "Needs averageSpend.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "monthly": { + "type": "number" + }, + "moreGuestsADay": { + "anyOf": [ + { + "description": "When short, with daysPerWeek and averageSpend: the guests a day that close it.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "perThousandOffBills": { + "description": "The same, for each 1,000 a month off fixedBills.", + "type": "number" + }, + "pointOffFixed": { + "description": "The same, for one point off a fixed bill (salaries).", + "type": "number" + }, + "pointOffRising": { + "description": "How far break-even falls a month for one point of sales off a rising cost.", + "type": "number" + }, + "shortADayOpen": { + "anyOf": [ + { + "description": "When short, with daysPerWeek: the gap a day open.", + "type": "number" + }, + { + "type": "null" + } + ] + }, + "weekly": { + "type": "number" + } + }, + "required": [ + "monthly", + "weekly", + "dayOpen", + "guestsADay", + "guestsAMonth", + "cushion", + "cushionPct", + "shortADayOpen", + "moreGuestsADay", + "goalSales", + "pointOffRising", + "pointOffFixed", + "perThousandOffBills" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / scenarios / items / properties / costsThatRisePct / descriptionPrevious value: -"Costs that rise with sales, % of net sales, one decimal. At 100 or more, no amount of sales breaks even."New value: +"% of net sales, one decimal. At 100 or more, no amount of sales breaks even." - changed
Output schema / properties / scenarios / items / properties / hourlyPay / descriptionPrevious value: -"Counted with the costs that rise with sales, or as a bill that stays the same."New value: +"With the costs that rise with sales, or as a fixed bill." - changed
Output schema / properties / standing / descriptionPrevious value: -"The month's net sales against break-even: above it, at it almost exactly, short of it, or never (no amount of sales breaks even, either way)."New value: +"Net sales against break-even (at: almost exactly); never: no amount of sales breaks even, either way." - changed
Output schema / properties / workedOut / descriptionPrevious value: -"How it was worked out, with the figures in each step."New value: +"How it was worked out."
- Added
restaurantdoctor_card_fees - Changed
restaurantdoctor_deadlines8 fields changed- added
Output schema / properties / deadlines / items / properties / appliesIf / anyOfAdded value: +[ + { + "description": "When an answer that decides it wasn't given: the condition it depends on.", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / deadlines / items / properties / appliesIf / descriptionRemoved value: -"When an answer that decides it wasn't given: the condition it depends on." - removed
Output schema / properties / deadlines / items / properties / appliesIf / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / deadlines / items / properties / missCost / anyOfAdded value: +[ + { + "description": "What missing it costs, from its source, when the source says.", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / deadlines / items / properties / missCost / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / deadlines / items / properties / movedFrom / anyOfAdded value: +[ + { + "description": "The date before a weekend or holiday moved it, and why.", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / deadlines / items / properties / movedFrom / descriptionRemoved value: -"The date before a weekend or holiday moved it, and why." - removed
Output schema / properties / deadlines / items / properties / movedFrom / typeRemoved value: -[ - "string", - "null" -]
- Changed
restaurantdoctor_delivery_price10 fields changed- added
Input schema / properties / price / anyOfAdded value: +[ + { + "description": "The dish's price on the owner's own menu, as a dining room guest pays it, in the owner's own currency (14 or 18.5). Needed for a result, and more than 0; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / price / descriptionRemoved value: -"The dish's price on the owner's own menu, as a dining room guest pays it, in the owner's own currency (14 or 18.5). Needed for a result, and more than 0; if missing, the reply asks for it." - removed
Input schema / properties / price / maximumRemoved value: -1000000000 - removed
Input schema / properties / price / minimumRemoved value: -0 - removed
Input schema / properties / price / typeRemoved value: -"number" - added
Input schema / properties / rate / anyOfAdded value: +[ + { + "description": "One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout without tax and tips) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Needed for a result: 0, or from 1 to 89; if missing, the reply asks for it.", + "maximum": 89, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / rate / descriptionRemoved value: -"One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout without tax and tips) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Needed for a result: 0, or from 1 to 89; if missing, the reply asks for it." - removed
Input schema / properties / rate / maximumRemoved value: -89 - removed
Input schema / properties / rate / minimumRemoved value: -0 - removed
Input schema / properties / rate / typeRemoved value: -"number"
- Added
restaurantdoctor_fica_tip_credit - Changed
restaurantdoctor_labor_cost50 fields changed- added
Input schema / properties / forecast / anyOfAdded value: +[ + { + "description": "Net sales expected next period, more than 0: the last 4 weeks' (or 3 months') average, adjusted for events and holidays. Needed for hours; for line, the line is then for these sales.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / forecast / descriptionRemoved value: -"Net sales expected next period, more than 0: the last 4 weeks' (or 3 months') average, adjusted for events and holidays. Needed for hours; for line, the line is then for these sales." - removed
Input schema / properties / forecast / maximumRemoved value: -1000000000 - removed
Input schema / properties / forecast / minimumRemoved value: -0 - removed
Input schema / properties / forecast / typeRemoved value: -"number" - added
Input schema / properties / hourSales / anyOfAdded value: +[ + { + "description": "Optional, for line: net sales in the last hour of a shift, for how many hourly staff it pays for.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / hourSales / descriptionRemoved value: -"Optional, for line: net sales in the last hour of a shift, for how many hourly staff it pays for." - removed
Input schema / properties / hourSales / maximumRemoved value: -1000000000 - removed
Input schema / properties / hourSales / minimumRemoved value: -0 - removed
Input schema / properties / hourSales / typeRemoved value: -"number" - added
Input schema / properties / hourlyWages / anyOfAdded value: +[ + { + "description": "Last period's gross pay for everyone paid by the hour, from payroll: by the days worked, overtime in, tips out. 0 if all are salaried (share only). Needed in every mode.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / hourlyWages / descriptionRemoved value: -"Last period's gross pay for everyone paid by the hour, from payroll: by the days worked, overtime in, tips out. 0 if all are salaried (share only). Needed in every mode." - removed
Input schema / properties / hourlyWages / maximumRemoved value: -1000000000 - removed
Input schema / properties / hourlyWages / minimumRemoved value: -0 - removed
Input schema / properties / hourlyWages / typeRemoved value: -"number" - added
Input schema / properties / hours / anyOfAdded value: +[ + { + "description": "Hours those staff worked last period, from the time clock: overtime in, salaried managers out. Needed for hours and line.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / hours / descriptionRemoved value: -"Hours those staff worked last period, from the time clock: overtime in, salaried managers out. Needed for hours and line." - removed
Input schema / properties / hours / maximumRemoved value: -1000000000 - removed
Input schema / properties / hours / minimumRemoved value: -0 - removed
Input schema / properties / hours / typeRemoved value: -"number" - added
Input schema / properties / overtimeHours / anyOfAdded value: +[ + { + "description": "Optional, for share: how many of the hours worked were overtime.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / overtimeHours / descriptionRemoved value: -"Optional, for share: how many of the hours worked were overtime." - removed
Input schema / properties / overtimeHours / maximumRemoved value: -1000000000 - removed
Input schema / properties / overtimeHours / minimumRemoved value: -0 - removed
Input schema / properties / overtimeHours / typeRemoved value: -"number" - added
Input schema / properties / ownerPay / anyOfAdded value: +[ + { + "description": "Optional, for share: if the owner works without a salary, what someone doing their hours would cost, payroll taxes in. Shown as a second figure.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / ownerPay / descriptionRemoved value: -"Optional, for share: if the owner works without a salary, what someone doing their hours would cost, payroll taxes in. Shown as a second figure." - removed
Input schema / properties / ownerPay / maximumRemoved value: -1000000000 - removed
Input schema / properties / ownerPay / minimumRemoved value: -0 - removed
Input schema / properties / ownerPay / typeRemoved value: -"number" - added
Input schema / properties / payrollCosts / anyOfAdded value: +[ + { + "description": "Optional: the employer's payroll taxes and benefits on that pay, such as health insurance. Left out, labor reads lower, unless the pay already includes them.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / payrollCosts / descriptionRemoved value: -"Optional: the employer's payroll taxes and benefits on that pay, such as health insurance. Left out, labor reads lower, unless the pay already includes them." - removed
Input schema / properties / payrollCosts / maximumRemoved value: -1000000000 - removed
Input schema / properties / payrollCosts / minimumRemoved value: -0 - removed
Input schema / properties / payrollCosts / typeRemoved value: -"number" - added
Input schema / properties / salaries / anyOfAdded value: +[ + { + "description": "Optional: salaried pay for the period (a yearly salary ÷ 52, or ÷ 12 for a month).", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / salaries / descriptionRemoved value: -"Optional: salaried pay for the period (a yearly salary ÷ 52, or ÷ 12 for a month)." - removed
Input schema / properties / salaries / maximumRemoved value: -1000000000 - removed
Input schema / properties / salaries / minimumRemoved value: -0 - removed
Input schema / properties / salaries / typeRemoved value: -"number" - added
Input schema / properties / sales / anyOfAdded value: +[ + { + "description": "Last period's net sales, in the owner's own currency like every amount here, from the POS: after discounts and comps, before tax and tips, plus any service charge paid out to staff. Needed for share, and for line without forecast.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / sales / descriptionRemoved value: -"Last period's net sales, in the owner's own currency like every amount here, from the POS: after discounts and comps, before tax and tips, plus any service charge paid out to staff. Needed for share, and for line without forecast." - removed
Input schema / properties / sales / maximumRemoved value: -1000000000 - removed
Input schema / properties / sales / minimumRemoved value: -0 - removed
Input schema / properties / sales / typeRemoved value: -"number" - added
Input schema / properties / target / anyOfAdded value: +[ + { + "description": "Optional, for hours and line: the owner's labor target, % of net sales (1 to 99). Left out: the top of the range, where the page starts.", + "maximum": 99, + "minimum": 1, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / target / descriptionRemoved value: -"Optional, for hours and line: the owner's labor target, % of net sales (1 to 99). Left out: the top of the range, where the page starts." - removed
Input schema / properties / target / maximumRemoved value: -99 - removed
Input schema / properties / target / minimumRemoved value: -1 - removed
Input schema / properties / target / typeRemoved value: -"number"
- Changed
restaurantdoctor_menu_calories27 fields changed- removed
Input schema / properties / cookedWeight / additionalPropertiesRemoved value: -false - added
Input schema / properties / cookedWeight / anyOfAdded value: +[ + { + "additionalProperties": false, + "description": "With weight: the whole batch, weighed after cooking. Needed then; if missing, the reply asks for it.", + "properties": { + "amount": { + "maximum": 1000000000, + "minimum": 0.001, + "type": "number" + }, + "unit": { + "enum": [ + "g", + "kg", + "oz", + "lb" + ], + "type": "string" + } + }, + "required": [ + "amount", + "unit" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / cookedWeight / descriptionRemoved value: -"With weight: the whole batch, weighed after cooking. Needed then; if missing, the reply asks for it." - removed
Input schema / properties / cookedWeight / propertiesRemoved value: -{ - "amount": { - "maximum": 1000000000, - "minimum": 0.001, - "type": "number" - }, - "unit": { - "enum": [ - "g", - "kg", - "oz", - "lb" - ], - "type": "string" - } -} - removed
Input schema / properties / cookedWeight / requiredRemoved value: -[ - "amount", - "unit" -] - removed
Input schema / properties / cookedWeight / typeRemoved value: -"object" - added
Input schema / properties / dish / anyOfAdded value: +[ + { + "description": "Optional: the dish's name, for the record.", + "maxLength": 100, + "minLength": 0, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / dish / descriptionRemoved value: -"Optional: the dish's name, for the record." - removed
Input schema / properties / dish / maxLengthRemoved value: -100 - removed
Input schema / properties / dish / minLengthRemoved value: -0 - removed
Input schema / properties / dish / typeRemoved value: -"string" - added
Input schema / properties / ingredients / anyOfAdded value: +[ + { + "description": "What goes into the dish or batch, one entry each. Needed for a result; if missing, the reply asks for it.", + "items": { + "additionalProperties": false, + "properties": { + "amount": { + "anyOf": [ + { + "description": "How much goes in, after trimming, in unit. Weighed if possible. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "food": { + "anyOf": [ + { + "description": "The food: its name on the counter's list of USDA foods, as an earlier answer gave it, or the owner's words for it, matched to that list. Words that fit several foods, or none, come back as a tool error naming the foods to pick from, or saying it isn't on the list. With kcalPer100g, just its name.", + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ] + }, + "kcalPer100g": { + "anyOf": [ + { + "description": "For a food not on the list: kcal per 100 g from the nutrition panel on the owner's own pack, as the owner reads it (a US label gives a serving: its calories ÷ its grams × 100). Never an estimate by the assistant: if the owner has no label, the ingredient can't be counted yet. Weighed only.", + "maximum": 900, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "unit": { + "description": "g, kg, oz or lb for any food. ml, l, floz, cup, tbsp or tsp (US measures) for liquids and fats only; each for foods counted by the piece.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "cup", + "tbsp", + "tsp", + "each" + ], + "type": "string" + } + }, + "required": [ + "unit" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + { + "type": "null" + } +] - removed
Input schema / properties / ingredients / descriptionRemoved value: -"What goes into the dish or batch, one entry each. Needed for a result; if missing, the reply asks for it." - removed
Input schema / properties / ingredients / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "amount": { - "description": "How much goes in, after trimming, in unit. Weighed if possible. Needed for a result; if missing, the reply asks for it.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - "food": { - "description": "The food: its name on the counter's list of USDA foods, as an earlier answer gave it, or the owner's words for it, matched to that list. Words that fit several foods, or none, come back as a tool error naming the foods to pick from, or saying it isn't on the list. With kcalPer100g, just its name.", - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "kcalPer100g": { - "description": "For a food not on the list: kcal per 100 g from the nutrition panel on the owner's own pack, as the owner reads it (a US label gives a serving: its calories ÷ its grams × 100). Never an estimate by the assistant: if the owner has no label, the ingredient can't be counted yet. Weighed only.", - "maximum": 900, - "minimum": 0, - "type": "number" - }, - "unit": { - "description": "g, kg, oz or lb for any food. ml, l, floz, cup, tbsp or tsp (US measures) for liquids and fats only; each for foods counted by the piece.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "cup", - "tbsp", - "tsp", - "each" - ], - "type": "string" - } - }, - "required": [ - "unit" - ], - "type": "object" -} - removed
Input schema / properties / ingredients / maxItemsRemoved value: -30 - removed
Input schema / properties / ingredients / typeRemoved value: -"array" - added
Input schema / properties / plates / anyOfAdded value: +[ + { + "description": "With plates: how many plates it makes, 1 for a single plate. Needed then; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0.001, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / plates / descriptionRemoved value: -"With plates: how many plates it makes, 1 for a single plate. Needed then; if missing, the reply asks for it." - removed
Input schema / properties / plates / maximumRemoved value: -1000000000 - removed
Input schema / properties / plates / minimumRemoved value: -0.001 - removed
Input schema / properties / plates / typeRemoved value: -"number" - removed
Input schema / properties / portionWeight / additionalPropertiesRemoved value: -false - added
Input schema / properties / portionWeight / anyOfAdded value: +[ + { + "additionalProperties": false, + "description": "With weight: one portion. Needed then; if missing, the reply asks for it.", + "properties": { + "amount": { + "maximum": 1000000000, + "minimum": 0.001, + "type": "number" + }, + "unit": { + "enum": [ + "g", + "kg", + "oz", + "lb" + ], + "type": "string" + } + }, + "required": [ + "amount", + "unit" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Input schema / properties / portionWeight / descriptionRemoved value: -"With weight: one portion. Needed then; if missing, the reply asks for it." - removed
Input schema / properties / portionWeight / propertiesRemoved value: -{ - "amount": { - "maximum": 1000000000, - "minimum": 0.001, - "type": "number" - }, - "unit": { - "enum": [ - "g", - "kg", - "oz", - "lb" - ], - "type": "string" - } -} - removed
Input schema / properties / portionWeight / requiredRemoved value: -[ - "amount", - "unit" -] - removed
Input schema / properties / portionWeight / typeRemoved value: -"object"
- Changed
restaurantdoctor_plate_cost45 fields changed- added
Input schema / properties / extras / anyOfAdded value: +[ + { + "description": "Optional, mode ingredients: small extras without a line of their own (salt, oil, garnish), % of the ingredients; often 5 to 10.", + "maximum": 100, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / extras / descriptionRemoved value: -"Optional, mode ingredients: small extras without a line of their own (salt, oil, garnish), % of the ingredients; often 5 to 10." - removed
Input schema / properties / extras / maximumRemoved value: -100 - removed
Input schema / properties / extras / minimumRemoved value: -0 - removed
Input schema / properties / extras / typeRemoved value: -"number" - added
Input schema / properties / ingredients / anyOfAdded value: +[ + { + "description": "With mode ingredients: each ingredient. A sauce or side already costed is one: its cost for a pack of 1 each, 1 each used.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "anyOf": [ + { + "description": "Optional: what it is, as the owner calls it.", + "maxLength": 100, + "type": "string" + }, + { + "type": "null" + } + ] + }, + "packSize": { + "anyOf": [ + { + "description": "How much one pack holds, in packUnit: 5 for a 5 lb bag. A case of 6 cans is 6 each; a 4 × 5 lb case is 20 lb.", + "exclusiveMinimum": 0, + "maximum": 1000000000, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "packUnit": { + "description": "The pack's unit: floz and gal are US fluid ounces and gallons.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "gal", + "each" + ], + "type": "string" + }, + "paid": { + "anyOf": [ + { + "description": "What the owner paid for one pack, from their latest invoice, before any VAT or GST they claim back.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "usable": { + "anyOf": [ + { + "description": "Optional: of what's bought, the % left after trimming or cooking: 85 for 1 kg that trims to 850 g. Left out, 100.", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "used": { + "anyOf": [ + { + "description": "The amount that goes in the pot or on the plate, after trimming, for the plates in portions. Spoons or cups: weigh it once.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ] + }, + "usedUnit": { + "description": "The amount's unit, of the pack's kind: weight, volume and count don't convert into each other.", + "enum": [ + "g", + "kg", + "oz", + "lb", + "ml", + "l", + "floz", + "gal", + "each" + ], + "type": "string" + } + }, + "required": [ + "packUnit", + "usedUnit" + ], + "type": "object" + }, + "maxItems": 30, + "type": "array" + }, + { + "type": "null" + } +] - removed
Input schema / properties / ingredients / descriptionRemoved value: -"With mode ingredients: each ingredient. A sauce or side already costed is one: its cost for a pack of 1 each, 1 each used." - removed
Input schema / properties / ingredients / itemsRemoved value: -{ - "additionalProperties": false, - "properties": { - "name": { - "description": "Optional: what it is, as the owner calls it.", - "maxLength": 100, - "type": "string" - }, - "packSize": { - "description": "How much one pack holds, in packUnit: 5 for a 5 lb bag. A case of 6 cans is 6 each; a 4 × 5 lb case is 20 lb.", - "exclusiveMinimum": 0, - "maximum": 1000000000, - "type": "number" - }, - "packUnit": { - "description": "The pack's unit: floz and gal are US fluid ounces and gallons.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "gal", - "each" - ], - "type": "string" - }, - "paid": { - "description": "What the owner paid for one pack, from their latest invoice, before any VAT or GST they claim back.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - "usable": { - "description": "Optional: of what's bought, the % left after trimming or cooking: 85 for 1 kg that trims to 850 g. Left out, 100.", - "maximum": 100, - "minimum": 1, - "type": "number" - }, - "used": { - "description": "The amount that goes in the pot or on the plate, after trimming, for the plates in portions. Spoons or cups: weigh it once.", - "maximum": 1000000000, - "minimum": 0, - "type": "number" - }, - "usedUnit": { - "description": "The amount's unit, of the pack's kind: weight, volume and count don't convert into each other.", - "enum": [ - "g", - "kg", - "oz", - "lb", - "ml", - "l", - "floz", - "gal", - "each" - ], - "type": "string" - } - }, - "required": [ - "packUnit", - "usedUnit" - ], - "type": "object" -} - removed
Input schema / properties / ingredients / maxItemsRemoved value: -30 - removed
Input schema / properties / ingredients / typeRemoved value: -"array" - added
Input schema / properties / menuPrice / anyOfAdded value: +[ + { + "description": "Optional: the dish's price on the menu. Left out, the result gives the prices to charge, as for a new dish.", + "exclusiveMinimum": 0, + "maximum": 1000000000, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / menuPrice / descriptionRemoved value: -"Optional: the dish's price on the menu. Left out, the result gives the prices to charge, as for a new dish." - removed
Input schema / properties / menuPrice / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / menuPrice / maximumRemoved value: -1000000000 - removed
Input schema / properties / menuPrice / typeRemoved value: -"number" - added
Input schema / properties / plateCost / anyOfAdded value: +[ + { + "description": "With mode known, needed: what the ingredients on one plate cost, from a recipe card or costing sheet, in the owner's own currency like every money figure here.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / plateCost / descriptionRemoved value: -"With mode known, needed: what the ingredients on one plate cost, from a recipe card or costing sheet, in the owner's own currency like every money figure here." - removed
Input schema / properties / plateCost / maximumRemoved value: -1000000000 - removed
Input schema / properties / plateCost / minimumRemoved value: -0 - removed
Input schema / properties / plateCost / typeRemoved value: -"number" - added
Input schema / properties / portions / anyOfAdded value: +[ + { + "description": "With mode ingredients, needed: how many plates the amounts make, 1 for a single plate.", + "exclusiveMinimum": 0, + "maximum": 1000000000, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / portions / descriptionRemoved value: -"With mode ingredients, needed: how many plates the amounts make, 1 for a single plate." - removed
Input schema / properties / portions / exclusiveMinimumRemoved value: -0 - removed
Input schema / properties / portions / maximumRemoved value: -1000000000 - removed
Input schema / properties / portions / typeRemoved value: -"number" - added
Input schema / properties / sold / anyOfAdded value: +[ + { + "description": "Optional: how many of this dish sold last month (POS item sales), for the figures a month.", + "maximum": 1000000000, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / sold / descriptionRemoved value: -"Optional: how many of this dish sold last month (POS item sales), for the figures a month." - removed
Input schema / properties / sold / maximumRemoved value: -1000000000 - removed
Input schema / properties / sold / minimumRemoved value: -0 - removed
Input schema / properties / sold / typeRemoved value: -"integer" - added
Input schema / properties / target / anyOfAdded value: +[ + { + "description": "Optional: the owner's target food cost, %. Left out, the middle of the format's range (32 for full service); none for a bar.", + "maximum": 99, + "minimum": 1, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / target / descriptionRemoved value: -"Optional: the owner's target food cost, %. Left out, the middle of the format's range (32 for full service); none for a bar." - removed
Input schema / properties / target / maximumRemoved value: -99 - removed
Input schema / properties / target / minimumRemoved value: -1 - removed
Input schema / properties / target / typeRemoved value: -"number" - added
Input schema / properties / taxIncluded / anyOfAdded value: +[ + { + "description": "true when menu prices include VAT or GST (UK, EU, Australia, New Zealand); left out when tax is added at the till (US, Canada).", + "type": "boolean" + }, + { + "type": "null" + } +] - removed
Input schema / properties / taxIncluded / descriptionRemoved value: -"true when menu prices include VAT or GST (UK, EU, Australia, New Zealand); left out when tax is added at the till (US, Canada)." - removed
Input schema / properties / taxIncluded / typeRemoved value: -"boolean" - added
Input schema / properties / taxRate / anyOfAdded value: +[ + { + "description": "With taxIncluded, needed: the tax rate in this dish's price, %. Food and drinks can have different rates.", + "maximum": 50, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / taxRate / descriptionRemoved value: -"With taxIncluded, needed: the tax rate in this dish's price, %. Food and drinks can have different rates." - removed
Input schema / properties / taxRate / maximumRemoved value: -50 - removed
Input schema / properties / taxRate / minimumRemoved value: -0 - removed
Input schema / properties / taxRate / typeRemoved value: -"number" - changed
Output schema / properties / link / descriptionPrevious value: -"Opens the calculator on the website with these figures filled in."New value: +"Opens the calculator with these figures." - changed
Output schema / properties / workedOut / descriptionPrevious value: -"How it was worked out, with the figures in each step."New value: +"How it was worked out."
- Changed
restaurantdoctor_prime_cost35 fields changed- added
Input schema / properties / closingStock / anyOfAdded value: +[ + { + "description": "Optional: stock at cost at the end of the period, counted on the same items the invoices cover. Used only with openingStock.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / closingStock / descriptionRemoved value: -"Optional: stock at cost at the end of the period, counted on the same items the invoices cover. Used only with openingStock." - removed
Input schema / properties / closingStock / maximumRemoved value: -1000000000 - removed
Input schema / properties / closingStock / minimumRemoved value: -0 - removed
Input schema / properties / closingStock / typeRemoved value: -"number" - added
Input schema / properties / openingStock / anyOfAdded value: +[ + { + "description": "Optional: stock at cost at the start of the period. Used only with closingStock: food and drink then becomes what was used, opening + purchases - closing.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / openingStock / descriptionRemoved value: -"Optional: stock at cost at the start of the period. Used only with closingStock: food and drink then becomes what was used, opening + purchases - closing." - removed
Input schema / properties / openingStock / maximumRemoved value: -1000000000 - removed
Input schema / properties / openingStock / minimumRemoved value: -0 - removed
Input schema / properties / openingStock / typeRemoved value: -"number" - added
Input schema / properties / ownerPay / anyOfAdded value: +[ + { + "description": "Optional: when the owner works in the restaurant without a salary, what they'd pay someone to do their hours, plus the payroll taxes on it. It's a second figure; the main one stays as the books have it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / ownerPay / descriptionRemoved value: -"Optional: when the owner works in the restaurant without a salary, what they'd pay someone to do their hours, plus the payroll taxes on it. It's a second figure; the main one stays as the books have it." - removed
Input schema / properties / ownerPay / maximumRemoved value: -1000000000 - removed
Input schema / properties / ownerPay / minimumRemoved value: -0 - removed
Input schema / properties / ownerPay / typeRemoved value: -"number" - added
Input schema / properties / payrollCosts / anyOfAdded value: +[ + { + "description": "Optional: the employer's payroll taxes and benefits for the period, such as health insurance or a pension, when the wages figure leaves them out.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / payrollCosts / descriptionRemoved value: -"Optional: the employer's payroll taxes and benefits for the period, such as health insurance or a pension, when the wages figure leaves them out." - removed
Input schema / properties / payrollCosts / maximumRemoved value: -1000000000 - removed
Input schema / properties / payrollCosts / minimumRemoved value: -0 - removed
Input schema / properties / payrollCosts / typeRemoved value: -"number" - added
Input schema / properties / purchases / anyOfAdded value: +[ + { + "description": "Food and drink supplier invoices for the same dates, added up by delivery date, minus credits. No packaging. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / purchases / descriptionRemoved value: -"Food and drink supplier invoices for the same dates, added up by delivery date, minus credits. No packaging. Needed for a result; if missing, the reply asks for it." - removed
Input schema / properties / purchases / maximumRemoved value: -1000000000 - removed
Input schema / properties / purchases / minimumRemoved value: -0 - removed
Input schema / properties / purchases / typeRemoved value: -"number" - added
Input schema / properties / sales / anyOfAdded value: +[ + { + "description": "Net sales for the period, in the owner's own currency like every figure here, from the POS sales summary: after discounts and comps, before tax and tips, with any service charge paid out to staff added back. Needed for a result, and more than 0; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / sales / descriptionRemoved value: -"Net sales for the period, in the owner's own currency like every figure here, from the POS sales summary: after discounts and comps, before tax and tips, with any service charge paid out to staff added back. Needed for a result, and more than 0; if missing, the reply asks for it." - removed
Input schema / properties / sales / maximumRemoved value: -1000000000 - removed
Input schema / properties / sales / minimumRemoved value: -0 - removed
Input schema / properties / sales / typeRemoved value: -"number" - added
Input schema / properties / wages / anyOfAdded value: +[ + { + "description": "Every wage and salary for the same dates, from payroll, managers included (a salary counts as a 52nd of a year for a week, a 12th for a month). No tips, but a service charge paid to staff stays in. Needed for a result; if missing, the reply asks for it.", + "maximum": 1000000000, + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } +] - removed
Input schema / properties / wages / descriptionRemoved value: -"Every wage and salary for the same dates, from payroll, managers included (a salary counts as a 52nd of a year for a week, a 12th for a month). No tips, but a service charge paid to staff stays in. Needed for a result; if missing, the reply asks for it." - removed
Input schema / properties / wages / maximumRemoved value: -1000000000 - removed
Input schema / properties / wages / minimumRemoved value: -0 - removed
Input schema / properties / wages / typeRemoved value: -"number"
11 tool updates
- Changed
restaurantdoctor_break_even5 fields changed- changed
Input schema / properties / fixedBills / descriptionPrevious value: -"A month of the bills that stay the same however busy it is: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full, and the owner's own pay if it isn't on payroll (left out, break-even assumes they work for free). No depreciation. Yearly bills ÷ 12. Required."New value: +"A month of the bills that stay the same however busy it is: rent and utilities, salaries with their payroll taxes and benefits, insurance, software, marketing, loan and lease payments in full, and the owner's own pay if it isn't on payroll (left out, break-even assumes they work for free). No depreciation. Yearly bills ÷ 12. Needed for a result; if missing, the reply asks for it." - changed
Input schema / properties / hourlyPay / descriptionPrevious value: -"That month's hourly wages from payroll, plus the employer's payroll taxes and benefits on them; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Required: 0 with no hourly staff."New value: +"That month's hourly wages from payroll, plus the employer's payroll taxes and benefits on them; no tips. Paid every two weeks: one pay run × 26 ÷ 12. Needed for a result (0 with no hourly staff); if missing, the reply asks for it." - changed
Input schema / properties / otherVariable / descriptionPrevious value: -"That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Required: 0 if none."New value: +"That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Needed for a result (0 if none); if missing, the reply asks for it." - changed
Input schema / properties / purchases / descriptionPrevious value: -"That month's food and drink supplier invoices, added up by delivery date. Required."New value: +"That month's food and drink supplier invoices, added up by delivery date. Needed for a result; if missing, the reply asks for it." - changed
Input schema / properties / sales / descriptionPrevious value: -"Net sales for one typical month, in the owner's own currency like every figure here: the POS sales summary, before tax and tips, delivery app orders at menu price. Not a holiday rush or a one-off: every figure is for that same month. Required, and more than 0."New value: +"Net sales for one typical month, in the owner's own currency like every figure here: the POS sales summary, before tax and tips, delivery app orders at menu price. Not a holiday rush or a one-off: every figure is for that same month. Needed for a result, and more than 0; if missing, the reply asks for it."
- Changed
restaurantdoctor_check_website2 fields changed- added
Output schema / properties / phoneSpeedSkippedAdded value: +{ + "description": "Google's phone speed test wasn't run, because phoneSpeed was false. It isn't in the score.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "website", - "score", - "grade", - "checks", - "fixFirst", - "ordersOnlyThroughApps", - "fullCheckUrl" -]New value: +[ + "website", + "score", + "grade", + "checks", + "fixFirst", + "phoneSpeedSkipped", + "ordersOnlyThroughApps", + "fullCheckUrl" +]
- Changed
restaurantdoctor_deadlines3 fields changed- changed
Input schema / properties / months / descriptionPrevious value: -"How many months ahead to list, 1 to 15 (default 3). The calendar runs to the end of 2027."New value: +"How many months ahead to list, 1 to 15 (default 3). The calendar runs to the end of 2027. withinDays, when sent, sets the window instead." - added
Input schema / properties / scopeAdded value: +{ + "description": "Optional, to cut the list: federal (the IRS's and other federal dates only), state (the state's and the city's only) or all (the default). The rules for each hire are listed either way.", + "enum": [ + "all", + "federal", + "state" + ], + "type": "string" +} - added
Input schema / properties / withinDaysAdded value: +{ + "description": "Optional: only the dates in the next so many days, 1 to 460, from today in the state (7 for the coming week). Sent, it replaces months.", + "maximum": 460, + "minimum": 1, + "type": "integer" +}
- Changed
restaurantdoctor_delivery_price2 fields changed- changed
Input schema / properties / price / descriptionPrevious value: -"The dish's price on the owner's own menu, as a dining room guest pays it, in the owner's own currency (14 or 18.5). Required, and more than 0."New value: +"The dish's price on the owner's own menu, as a dining room guest pays it, in the owner's own currency (14 or 18.5). Needed for a result, and more than 0; if missing, the reply asks for it." - changed
Input schema / properties / rate / descriptionPrevious value: -"One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout without tax and tips) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Required: 0, or from 1 to 89."New value: +"One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout without tax and tips) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Needed for a result: 0, or from 1 to 89; if missing, the reply asks for it."
- Added
restaurantdoctor_list_knowledge - Changed
restaurantdoctor_menu_calories5 fields changed- changed
Input schema / properties / cookedWeight / descriptionPrevious value: -"With weight: the whole batch, weighed after cooking. Required then."New value: +"With weight: the whole batch, weighed after cooking. Needed then; if missing, the reply asks for it." - changed
Input schema / properties / ingredients / descriptionPrevious value: -"What goes into the dish or batch, one entry each. Required."New value: +"What goes into the dish or batch, one entry each. Needed for a result; if missing, the reply asks for it." - changed
Input schema / properties / ingredients / items / properties / amount / descriptionPrevious value: -"How much goes in, after trimming, in unit. Weighed if possible. Required."New value: +"How much goes in, after trimming, in unit. Weighed if possible. Needed for a result; if missing, the reply asks for it." - changed
Input schema / properties / plates / descriptionPrevious value: -"With plates: how many plates it makes, 1 for a single plate. Required then."New value: +"With plates: how many plates it makes, 1 for a single plate. Needed then; if missing, the reply asks for it." - changed
Input schema / properties / portionWeight / descriptionPrevious value: -"With weight: one portion. Required then."New value: +"With weight: one portion. Needed then; if missing, the reply asks for it."
- Changed
restaurantdoctor_plate_cost3 fields changed- changed
Input schema / properties / plateCost / descriptionPrevious value: -"With mode known, required: what the ingredients on one plate cost, from a recipe card or costing sheet, in the owner's own currency like every money figure here."New value: +"With mode known, needed: what the ingredients on one plate cost, from a recipe card or costing sheet, in the owner's own currency like every money figure here." - changed
Input schema / properties / portions / descriptionPrevious value: -"With mode ingredients, required: how many plates the amounts make, 1 for a single plate."New value: +"With mode ingredients, needed: how many plates the amounts make, 1 for a single plate." - changed
Input schema / properties / taxRate / descriptionPrevious value: -"With taxIncluded, required: the tax rate in this dish's price, %. Food and drinks can have different rates."New value: +"With taxIncluded, needed: the tax rate in this dish's price, %. Food and drinks can have different rates."
- Changed
restaurantdoctor_prime_cost3 fields changed- changed
Input schema / properties / purchases / descriptionPrevious value: -"Food and drink supplier invoices for the same dates, added up by delivery date, minus credits. No packaging. Required."New value: +"Food and drink supplier invoices for the same dates, added up by delivery date, minus credits. No packaging. Needed for a result; if missing, the reply asks for it." - changed
Input schema / properties / sales / descriptionPrevious value: -"Net sales for the period, in the owner's own currency like every figure here, from the POS sales summary: after discounts and comps, before tax and tips, with any service charge paid out to staff added back. Required, and more than 0."New value: +"Net sales for the period, in the owner's own currency like every figure here, from the POS sales summary: after discounts and comps, before tax and tips, with any service charge paid out to staff added back. Needed for a result, and more than 0; if missing, the reply asks for it." - changed
Input schema / properties / wages / descriptionPrevious value: -"Every wage and salary for the same dates, from payroll, managers included (a salary counts as a 52nd of a year for a week, a 12th for a month). No tips, but a service charge paid to staff stays in. Required."New value: +"Every wage and salary for the same dates, from payroll, managers included (a salary counts as a 52nd of a year for a week, a 12th for a month). No tips, but a service charge paid to staff stays in. Needed for a result; if missing, the reply asks for it."
- Added
restaurantdoctor_read_knowledge - Changed
restaurantdoctor_run_free_check6 fields changed- changed
Input schema / properties / monthlyRevenue / descriptionPrevious value: -"About how much do you sell in a typical month? Amounts are in US dollars, or in the local currency where that's the euro, pound sterling, Swiss franc, or Canadian, Australian or New Zealand dollar; restaurantdoctor_get_questions shows the exact ranges for a country. under_25k = Under $25,000 (Under $300K a year); 25k_60k = $25,000 – $60,000 ($300K – $720K a year); 60k_120k = $60,000 – $120,000 ($720K – $1.44M a year); over_120k = Over $120,000 (Over $1.44M a year)."New value: +"About how much do you sell in a typical month? Amounts are in US dollars, or in the local currency where that's the euro, pound sterling, Swiss franc, or Canadian, Australian or New Zealand dollar; restaurantdoctor_get_questions shows the exact ranges for a country. under_25k = Under $25,000 (Under $300K a year); 25k_60k = $25,000 – $60,000 ($300K – $720K a year); 60k_120k = $60,000 – $120,000 ($720K – $1.44M a year); 120k_200k = $120,000 – $200,000 ($1.44M – $2.4M a year); over_200k = Over $200,000 (Over $2.4M a year)." - changed
Input schema / properties / monthlyRevenue / enumPrevious value: -[ - "under_25k", - "25k_60k", - "60k_120k", - "over_120k" -]New value: +[ + "under_25k", + "25k_60k", + "60k_120k", + "120k_200k", + "over_200k" +] - added
Output schema / properties / monthlyLeakAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "currency": { + "type": "string" + }, + "high": { + "type": "number" + }, + "low": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "low", + "high", + "currency", + "text" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The total of all the leaks a month, as the website leads with it. null when no major leak was found." +} - added
Output schema / properties / primePointAdded value: +{ + "description": "What one point of prime cost (1% of sales) is worth a month, at the working figure for the sales range.", + "type": "string" +} - changed
Output schema / properties / yearlyLeak / descriptionPrevious value: -"null when no major leak was found."New value: +"The same total a year. null when no major leak was found." - changed
Output schema / requiredPrevious value: -[ - "country", - "countryName", - "grade", - "risk", - "needsAttention", - "needsAttentionText", - "areas", - "areasNote", - "yearlyLeak", - "leakText", - "biggest", - "notes", - "dayOneFix", - "link", - "fullReport", - "fullReportAdds", - "disclaimer" -]New value: +[ + "country", + "countryName", + "grade", + "risk", + "needsAttention", + "needsAttentionText", + "areas", + "areasNote", + "monthlyLeak", + "yearlyLeak", + "leakText", + "biggest", + "primePoint", + "notes", + "dayOneFix", + "link", + "fullReport", + "fullReportAdds", + "disclaimer" +]
- Added
restaurantdoctor_search_knowledge
1 tool update
- Added
restaurantdoctor_deadlines
1 tool update
- Added
restaurantdoctor_check_website
2 tool updates
- Changed
restaurantdoctor_break_even1 field changed- changed
Input schema / properties / otherVariable / descriptionPrevious value: -"That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Required: 0 if none."New value: +"That month's other costs that rise with every sale: card fees, delivery app commissions (app sales minus payouts, both without tax and tips), to-go packaging, any percentage rent, royalties or ad fund fees. Nothing already in the food and drink invoices. Required: 0 if none."
- Changed
restaurantdoctor_delivery_price1 field changed- changed
Input schema / properties / rate / descriptionPrevious value: -"One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Required: 0, or from 1 to 89."New value: +"One delivery app's real commission rate, as a percent: 30 for 30%, not 0.30. From a month of that app's payout statements: (menu sales before tax and tips − the app's payout without tax and tips) ÷ those menu sales × 100, so marketing fees, promotions the owner funds and refunds are in it; the rate in the app's plan leaves them out. Each app is worked out on its own. Required: 0, or from 1 to 89."
1 tool update
- Changed
restaurantdoctor_run_free_check1 field changed- changed
Output schema / properties / biggest / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "kind": { - "enum": [ - "leak", - "opportunity" - ], - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "kind", - "title" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "kind": { + "enum": [ + "leak", + "opportunity" + ], + "type": "string" + }, + "monthly": { + "additionalProperties": false, + "description": "Its estimated money a month, as the website shows it big: lost for a leak, added sales for an opportunity.", + "properties": { + "currency": { + "type": "string" + }, + "high": { + "type": "number" + }, + "low": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "required": [ + "low", + "high", + "currency", + "text" + ], + "type": "object" + }, + "title": { + "type": "string" + } + }, + "required": [ + "kind", + "title", + "monthly" + ], + "type": "object" + }, + { + "type": "null" + } +]
Publisher details
- Operator
- Gomorra Labs LLC
- Operator website
- https://restaurantdoctorai.com/
- Vendor relationship
- Unknown
- Documentation
- https://restaurantdoctorai.com/ai-assistants · Publisher source
- Trust center
- Unknown
- Restrictions
- Unknown
Related MCP Connectors
Read-only kitchen costing, recipe scaling, UK GP, starter menus, and prep lists for chefs.
Money, tax & business calculators kept current with 2026 rules — plus operator insights.
The brain for restaurant costs, pricing, and true profit (read/edit menu, recipes, costs).
Free profit check-up for Etsy, Shopify and Amazon sellers: fees, sales, ads, shipping, plans, rates.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides hospitality intelligence tools for restaurant optimization, including menu profitability analysis, food cost calculation, reservation management, review sentiment analysis, and allergen checking.0MIT
- FlicenseBqualityDmaintenanceEnables restaurant management through natural language, allowing import of Toast CSV data, labor/sales analysis, tip pool calculations, task management, and note-taking.14-
- AlicenseNot gradedqualityCmaintenanceProvides free read-only business checks for IBANs, EU VAT number format, Peppol e-invoice rules, supplier bank-detail changes, and CSV/XLSX data cleaning.MIT
- AlicenseAqualityDmaintenanceFranchise evaluation tools built from 81+ closed deals. Validate FDD investment ranges, identify red flags, assess readiness, and connect with a free franchise consultant. E-2 visa guide in English and Spanish.84 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.