plate-cost
plate-cost
MCP-приложение, которое калькулирует себестоимость рецептов и устанавливает цены на позиции меню — интерактивный калькулятор, который модель открывает вместо того, чтобы самой выполнять арифметику.
Спросите Клода «помоги мне рассчитать цену моего наси горенг» — и вы получите рабочую таблицу: строки ингредиентов, закупочные цены, процент отходов, выход порции, ползунок наценки. Измените число — всё пересчитается. Нажмите Использовать эти числа — и модель продолжит разговор с цифрами, которые ввели вы, а не с теми, что она выдумала.
Построено на MCP Apps (ext-apps).

Работает в референсном хосте basic-host из ext-apps — не в Клоде. Модель предложила рецепт, виджет загрузил его, а «Использовать эти числа» отправило исправленные цифры обратно в разговор.
Почему это приложение, а не инструмент
Калькуляция — это исследование, а не вопрос. Вы не знаете, какой ответ вам нужен, пока не подвинете размер порции и не посмотрите, как движется маржа. Чат — плохой интерфейс для этого, а модель, считающая в уме, — ещё хуже: LLM ненадёжны в многошаговых числовых операциях и абсолютно надёжны в уверенном звучании.
Поэтому разделение такое: виджет собирает ввод, сервер делает математику, модель ведёт разговор.
Related MCP server: TradingCalc MCP Server
Интересная часть: знание, откуда взялись числа
В MCP Apps есть открытый пробел — ext-apps#746: вызов tools/call из виджета и вызов, который решила сделать модель, неразличимы на сервере. Для большинства инструментов это неважно. Для инструмента калькуляции это решает, выполняете ли вы арифметику или отмываете догадку.
mcp-app-attest закрывает этот пробел — извлечён из этого репозитория, который стал его первым потребителем. Сервер выпускает короткоживущий токен каждый раз, когда отдаёт ресурс приложения, и подставляет его в документ; виджет возвращает его в _meta при каждом вызове. Модель никогда не видит тело ресурса, поэтому не может создать токен. Вызовы получают ответ в любом случае — в ответе указано, какой именно:
{ "perPortion": 3300, "inputsFrom": "model" }а когда числа пришли от модели, текстовый ответ говорит об этом:
Примечание: эти цифры получены от модели, а не из калькулятора. Подтвердите закупочные цены у пользователя, прежде чем полагаться на них.
Проверено сквозным образом на референсном хосте, а не только в юнит-тестах:
[provenance] inputsFrom=model reason=missing meta=null
[provenance] inputsFrom=app meta={..."io.platecost/app-attestation":"XfqGVAiP…"}Чем это не является. Это не авторизация и не доказательство того, что человек что-то вводил. Это различает пути кода, а не личности. Если хост копирует текст ресурса в контекст модели, модель может прочитать токен — ничто здесь этому не препятствует, это контракт хоста — сохранять это. Скомпрометированный виджет может отправить что угодно. Относитесь к этому как к разнице между «введено в мою форму» и «создано языковой моделью» — именно это и требуется в #746.
С тех пор это было извлечено в mcp-app-attest, который перешёл на подписанные токены вместо хранимых — см. примечание «что не сработало» ниже, почему.
Две вещи, в которых домен ошибается
Обе находятся в src/costing.ts, обе имеют тесты.
Отходы означают покупать больше, а не использовать больше. Стоимость равна used / (1 - wastePct), а не used * (1 + wastePct). При 50% отходов вы покупаете вдвое, а не в полтора раза. Наивная версия занижает каждый обрезанный ингредиент, который у вас есть.
Маржа и наценка — разные числа. Маржа — это (price - cost) / price; наценка — (price - cost) / cost. Наценка 60% — это маржа 37,5%, а маржа 60% требует наценки 150%. priceForMargin принимает маржу — именно это означает «мы хотим 65%» на кухне — и возвращает оба значения, так что разрыв виден, а не предполагается.
Также обрабатывается: преобразование единиц внутри семейств массы и объёма с отказом между ними (kg → l требует плотность, которую вы не указали), доля стоимости на ингредиент и накладные расходы, применяемые на порцию, а не на партию.
Попробуйте
npm install
npm run build # bundles the widget to a single inlined HTML
npm test # 21 tests
npm run dev # widget standalone in a browser, no hostУкажите MCP-клиенту на server.ts. Вне хоста плейсхолдер аттестации никогда не подставляется, поэтому вызовы помечаются как model — это честный ответ.
Что не сработало
Транспорт без сохранения состояния по HTTP. Первая версия создавала новый сервер на каждый запрос, что нормально для инструментов без состояния и молча ломает этот: аттестация выпускалась экземпляром сервера, которого уже не существовало, когда виджет делал обратный вызов, поэтому каждый вызов виджета отклонялся как
unknown. Тесты в памяти не могли этого увидеть — они используют один экземпляр. Только работа с реальным хостом выявила это.Обвинение SDK. Прежде чем найти вышеуказанное, очевидным подозреваемым было то, что
_metaтеряется при передаче. Это не так: референсный хост пересылает его без изменений через прокси песочницы. Это стоит знать, потому что весь механизм зависит от того, что хосты так делают, а спецификация этого не требует.
Статус
v0. Два инструмента (cost-recipe, price-portion), один виджет, 21 тест.
Не реализовано: сохранение между разговорами, сравнение нескольких рецептов и всё, что касается проблемы пространства имён в
#753 /
#745 — callServerTool использует голые имена инструментов, поэтому это сломается за агрегатором. Это следующая задача, которую стоит решить, и здесь она не решена.
MIT.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
The brain for restaurant costs, pricing, and true profit (read/edit menu, recipes, costs).
Auditable construction takeoffs with locked waste and conservative purchase rounding.
AI-callable calculators and engineering models with real formulas. No hallucinated math.
Deterministic what-if & scenario simulation for AI agents: projections, sensitivity & break-even.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides basic arithmetic operations and advanced mathematical functions through the Model Context Protocol (MCP), with features like calculation history tracking and expression evaluation.1
- AlicenseNot gradedqualityBmaintenanceProvides deterministic trading calculations for PnL, risk, margin, and funding, enabling users to get exact numbers for trade planning and risk assessment via MCP or REST API.111MIT
- AlicenseCqualityBmaintenanceDeterministic Odoo ERP calculators: implementation, migration and upgrade cost, ROI and TCO, US/Canada/EU sales tax and VAT, Canadian payroll source deductions, and inventory maths (reorder point, safety stock, EOQ, landed cost, OEE). 24 tools, each a pure function, the numbers are arithmetic rather than a model's guess. Hosted remote server, no install and no API key; a stdio bridge is included24MIT
- AlicenseAqualityAmaintenanceA deterministic what-if scenario simulation MCP server that projects business metrics over time with exact decimal arithmetic, offering sensitivity analysis and break-even solving.647MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rephol/plate-cost'
If you have feedback or need assistance with the MCP directory API, please join our Discord server