Skip to main content
Glama
rephol

plate-cost

by rephol

plate-cost

Una MCP App que calcula el coste de las recetas y pone precio a los platos del menú: una calculadora interactiva que el modelo abre en lugar de hacer él mismo la aritmética.

Pídele a Claude «ayúdame a poner precio a mi nasi goreng» y obtendrás una hoja de cálculo funcional: filas de ingredientes, precios de compra, porcentajes de merma, rendimiento por porción, un control deslizante de margen. Cambia un número y todo se recalcula. Pulsa Usar estos números y el modelo continúa la conversación con las cifras que has introducido tú, no con las que él haya inventado.

Construido sobre MCP Apps (ext-apps).

plate-cost running in the ext-apps reference host

Se ejecuta en el host de referencia basic-host de ext-apps — no en Claude. El modelo propuso la receta, el widget la cargó, y «Usar estos números» envió las cifras corregidas de vuelta a la conversación.

Por qué esto es una app y no una herramienta

Calcular costes es exploración, no una pregunta. No sabes qué respuesta quieres hasta que has movido el tamaño de la ración y has visto moverse el margen. El chat es una mala interfaz para eso, y un modelo haciendo la aritmética mentalmente es peor: los LLM no son fiables en trabajo numérico de varios pasos, pero son completamente fiables a la hora de sonar seguros de sí mismos.

Así que la división es: el widget captura las entradas, el servidor hace las cuentas, el modelo habla.

Related MCP server: TradingCalc MCP Server

La parte interesante: saber de dónde vienen los números

MCP Apps tiene un vacío abierto — ext-apps#746: una tools/call desde un widget y una que el modelo decidió hacer son indistinguibles en el servidor. Para la mayoría de las herramientas eso no importa. Para una herramienta de costes, decide si estás haciendo aritmética o maquillando una conjetura.

mcp-app-attest lo cierra — extraído de este repositorio, que es su primer consumidor. El servidor acuña un token de corta duración cada vez que sirve el recurso de la app y lo sustituye en el documento; el widget lo devuelve en _meta en cada llamada. El modelo nunca ve el cuerpo del recurso, por lo que no puede generar el token. Las llamadas se responden de todas formas — la respuesta indica cuál ha recibido:

{ "perPortion": 3300, "inputsFrom": "model" }

y cuando las cifras proceden del modelo, la respuesta de texto lo dice:

Nota: estas cifras provienen del modelo, no de la calculadora. Confirme los precios de compra con el usuario antes de confiar en ellas.

Verificado de extremo a extremo contra el host de referencia, no solo en pruebas unitarias:

[provenance] inputsFrom=model  reason=missing  meta=null
[provenance] inputsFrom=app    meta={..."io.platecost/app-attestation":"XfqGVAiP…"}

Lo que esto no es. No es autorización, ni prueba de que un humano haya tecleado nada. Distingue rutas de código, no identidades. Si un host copia el texto del recurso al contexto del modelo, el modelo puede leer el token — nada aquí lo impide; es el contrato que el host debe mantener. Un widget comprometido puede enviar lo que quiera. Trátalo como la diferencia entre «escrito en mi formulario» y «producido por un modelo de lenguaje», que es exactamente lo que pide #746.

Desde entonces se ha extraído en mcp-app-attest, que pasó a usar tokens firmados en lugar de almacenados — véase la nota de «lo que no funcionó» más abajo para saber por qué.

Dos cosas en las que el dominio se equivoca

Ambas están en src/costing.ts y ambas tienen pruebas.

La merma significa comprar más, no usar más. El coste es used / (1 - wastePct), no used * (1 + wastePct). Con un 50 % de merma se compra el doble, no una vez y media. La versión ingenua subestima todos tus ingredientes con merma.

El margen y el recargo son números diferentes. El margen es (price - cost) / price; el recargo es (price - cost) / cost. Un recargo del 60 % es un margen del 37,5 %, y un margen del 60 % necesita un recargo del 150 %. priceForMargin toma el margen — que es lo que significa «queremos un 65 %» en una cocina — y devuelve ambos, para que la diferencia sea visible en lugar de asumida.

También se maneja: conversión de unidades dentro de las familias de masa y volumen, con un rechazo entre ellas (kgl necesita una densidad que no has dado), la parte del coste por ingrediente y los gastos generales aplicados por ración en lugar de por lote.

Pruébalo

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

Apunta un cliente MCP a server.ts. Fuera de un host, el marcador de posición de atestación nunca se sustituye, por lo que las llamadas se etiquetan como model — que es la respuesta honesta.

Lo que no funcionó

  • Un transporte HTTP sin estado. La primera versión creaba un servidor nuevo por petición, lo cual está bien para herramientas sin estado, pero rompe esta en silencio: la atestación se acuñaba en una instancia del servidor que ya no existía cuando el widget respondía, así que cada llamada del widget era rechazada como unknown. Las pruebas en memoria no podían verlo — comparten una única instancia. Solo al ejecutarlo contra un host real salió a la luz.

  • Culpar al SDK. Antes de encontrar lo anterior, el sospechoso obvio era que _meta se eliminaba en tránsito. No es así: el host de referencia lo reenvía intacto a través del proxy de sandbox. Merece la pena saberlo, porque todo el mecanismo depende de que los hosts lo hagan y la especificación no lo exige.

Estado

v0. Dos herramientas (cost-recipe, price-portion), un widget, 21 pruebas.

No construido: persistencia entre conversaciones, comparación de varias recetas y cualquier cosa que toque el problema de espacios de nombres en #753 / #745callServerTool utiliza nombres de herramienta sin calificar, por lo que esto se romperá detrás de un agregador. Esa es la próxima cuestión que merece la pena resolver y no está resuelta aquí.

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