Skip to main content
Glama
rephol

plate-cost

by rephol

plate-cost

MCP-приложение, которое калькулирует себестоимость рецептов и устанавливает цены на позиции меню — интерактивный калькулятор, который модель открывает вместо того, чтобы самой выполнять арифметику.

Спросите Клода «помоги мне рассчитать цену моего наси горенг» — и вы получите рабочую таблицу: строки ингредиентов, закупочные цены, процент отходов, выход порции, ползунок наценки. Измените число — всё пересчитается. Нажмите Использовать эти числа — и модель продолжит разговор с цифрами, которые ввели вы, а не с теми, что она выдумала.

Построено на MCP Apps (ext-apps).

plate-cost в референсном хосте 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%» на кухне — и возвращает оба значения, так что разрыв виден, а не предполагается.

Также обрабатывается: преобразование единиц внутри семейств массы и объёма с отказом между ними (kgl требует плотность, которую вы не указали), доля стоимости на ингредиент и накладные расходы, применяемые на порцию, а не на партию.

Попробуйте

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 / #745callServerTool использует голые имена инструментов, поэтому это сломается за агрегатором. Это следующая задача, которую стоит решить, и здесь она не решена.

MIT.

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides basic arithmetic operations and advanced mathematical functions through the Model Context Protocol (MCP), with features like calculation history tracking and expression evaluation.
    1
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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.
    11
    1
    MIT
  • A
    license
    C
    quality
    B
    maintenance
    Deterministic 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 included
    24
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A deterministic what-if scenario simulation MCP server that projects business metrics over time with exact decimal arithmetic, offering sensitivity analysis and break-even solving.
    6
    47
    MIT

Latest Blog Posts

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