Skip to main content
Glama
Bitcraze26
by Bitcraze26

pizza-mcp

Server MCP per calcolare le dosi dell'impasto della pizza con il metodo diretto. A partire da numero e peso dei panetti, idratazione, farine e programma di lievitazione restituisce i grammi di ogni farina, acqua, sale e lievito, con le percentuali del fornaio.

Si può usare in due modi, con lo stesso codice e lo stesso tool:

  • in locale via stdio (Node.js), per Claude Code, Claude Desktop o qualsiasi client MCP;

  • su Cloudflare Workers come endpoint MCP remoto Streamable HTTP, senza server da mantenere.

Cosa fa

  • Calcola il peso totale dell'impasto dai panetti (panetti × peso).

  • Usa le percentuali del fornaio: la farina totale è 100%, mentre acqua, sale e lievito sono percentuali sul peso della farina.

  • Gestisce una o più farine con le rispettive percentuali (se la somma non è 100, normalizza automaticamente).

  • Stima il lievito in base a ore e temperatura, anche con una parte di lievitazione in frigorifero.

  • Supporta lievito fresco, secco attivo e istantaneo, con conversione automatica.

  • Restituisce sia un riepilogo leggibile in italiano sia un oggetto JSON strutturato.

Related MCP server: Jueshan Paipan MCP

Installazione

Richiede Node.js 18 o superiore.

npm install
npm run build

Configurazione in locale (stdio)

Registra il server con il percorso assoluto di dist/index.js (sostituisci C:\percorso\pizza-mcp con la cartella in cui hai clonato il progetto):

claude mcp add pizza-mcp -- node "C:\percorso\pizza-mcp\dist\index.js"

Per renderlo disponibile in tutti i progetti aggiungi --scope user:

claude mcp add --scope user pizza-mcp -- node "C:\percorso\pizza-mcp\dist\index.js"

In alternativa, aggiungi al file .mcp.json del progetto:

{
  "mcpServers": {
    "pizza-mcp": {
      "command": "node",
      "args": [
        "C:\\percorso\\pizza-mcp\\dist\\index.js"
      ]
    }
  }
}

Se il client non avvia il server su Windows, prova la variante con cmd:

claude mcp add pizza-mcp -- cmd /c node "C:\percorso\pizza-mcp\dist\index.js"

Deploy su Cloudflare Workers

Il Worker espone un endpoint MCP Streamable HTTP stateless su /mcp: ogni richiesta crea un server e un trasporto nuovi, quindi non servono Durable Objects né sessioni. Il tool è puro e non conserva stato.

  1. Accedi a Cloudflare (una volta sola):

    npx wrangler login
  2. Prova il Worker in locale:

    npm run dev:worker

    Il server risponde su http://localhost:8788 (/health per lo stato, /mcp per MCP).

  3. Pubblica:

    npm run deploy

    Wrangler stampa l'URL pubblico, del tipo https://pizza-mcp.<sottodominio>.workers.dev.

  4. Collega l'endpoint remoto a Claude Code:

    claude mcp add --transport http pizza-mcp https://pizza-mcp.<sottodominio>.workers.dev/mcp

L'endpoint è pubblico e senza autenticazione: chiunque conosca l'URL può chiamare il tool di calcolo. Se ti serve, puoi aggiungere un controllo su Authorization nel fetch di src/worker.ts o proteggere l'endpoint con Cloudflare Access.

Per cambiare nome del Worker, porta o compatibility date modifica wrangler.jsonc.

Tool: calculate_dough

Parametri

Parametro

Tipo

Default

Descrizione

balls

intero ≥ 1

obbligatorio

Numero di panetti

ball_weight_g

numero > 0

obbligatorio

Peso di ogni panetto in grammi

hydration_percent

30–120

62

Idratazione in % sulla farina

salt_percent

0–10

2.5

Sale in % sulla farina

flours

array

una farina al 100%

Elenco { name, percent }; le percentuali sono sul totale farina

yeast_type

fresh | dry | instant

fresh

Tipo di lievito

yeast_percent

0–10

—

Se indicato, forza la % di lievito (del tipo scelto) e ignora il modello tempo/temperatura

room_hours

0–240

24 (0 se usi solo il frigo)

Ore a temperatura ambiente

room_temperature_c

−5–45

20

Temperatura ambiente in °C

fridge_hours

0–360

0

Ore in frigorifero

fridge_temperature_c

−5–15

4

Temperatura del frigo in °C

Per una lievitazione solo in frigo indica fridge_hours e lascia room_hours: 0 (o aggiungi 1–2 ore a temperatura ambiente per l'appretto).

Esempio

Calcola l'impasto per 6 panetti da 250 g, 62% di idratazione, 70% Tipo 00 e 30% farina integrale, 22 ore in frigo a 4 °C più 2 ore a 20 °C, con lievito fresco.

Il server restituisce (estratto):

Ingrediente

Grammi

% sulla farina

Farina (totale)

909,7

100%

↳ Tipo 00 W300

636,8

70%

↳ Farina integrale

272,9

30%

Acqua

564

62%

Sale

22,7

2,5%

Lievito di birra fresco

3,54

0,39%

Totale impasto: 1500 g (6 × 250 g). Lievitazione: 22 h a 4 °C + 2 h a 20 °C ≈ 9,3 h equivalenti a 20 °C.

Output

Il tool restituisce due contenuti testuali: un riepilogo Markdown in italiano e il risultato completo in JSON. Il JSON include anche:

  • targetDoughGrams e doughGrams (verifica del peso totale);

  • percentuali del fornaio e grammi per ogni farina;

  • yeast.source (model oppure override), grammi e percentuale di lievito, equivalente in lievito fresco;

  • fermentation.effectiveHoursAt20C, averageTemperatureFactor e modelClamped;

  • warnings con avvisi su idratazione, sale, appretto, fermentazioni estreme e lievito da pesare con precisione.

Modello di calcolo

Percentuali e peso

Con farina totale = 100%:

peso_impasto = panetti × peso_panetto
farina = peso_impasto / (1 + idratazione/100 + sale/100 + lievito/100)
acqua  = farina × idratazione/100
sale   = farina × sale/100
lievito = farina × lievito/100

Dividendo il peso dell'impasto per la somma delle percentuali (incluso il lievito) si ottiene una ricetta che torna esattamente al peso dei panetti desiderato.

Stima del lievito

Il modello normalizza l'attività del lievito a 20 °C con un fattore Q10 = 2: ogni 10 °C in più raddoppia la velocità di fermentazione, ogni 10 °C in meno la dimezza.

ore_equivalenti = Σ (ore_i × 2^((T_i − 20)/10))
lievito_fresco_% = 3,6 / ore_equivalenti

La stima viene limitata tra 0,05% e 4% di lievito fresco; se viene applicato un limite il risultato contiene un avviso.

Valori indicativi:

Lievitazione

Lievito fresco stimato

8 h a 20 °C

~0,45%

24 h a 20 °C

~0,15%

48 h a 20 °C

~0,08%

24 h a 4 °C + 2 h a 20 °C

~0,36%

48 h a 4 °C + 2 h a 20 °C

~0,20%

72 h a 4 °C + 2 h a 20 °C

~0,14%

Conversioni usate:

  • 1 g di lievito secco attivo ≈ 2,5 g di lievito fresco;

  • 1 g di lievito istantaneo ≈ 3 g di lievito fresco.

Limiti

  • Il modello è una stima: usa la temperatura ambiente, non la temperatura reale dell'impasto, e non tiene conto della forza della farina, della temperatura dell'acqua o dell'umidità. Regola il risultato in base alla tua esperienza; puoi forzare la percentuale con yeast_percent.

  • Il calcolo riguarda il metodo diretto. Non è pensato per biga, poolish, lievito madre o altri prefermenti.

  • I grammi di lievito molto piccoli richiedono una bilancia con precisione di 0,1 g (il tool lo segnala).

Sviluppo

npm test          # test unitari del motore di calcolo
npm run smoke     # test end-to-end del server stdio (richiede npm run build)
npm run dev       # avvia il server stdio da sorgente con tsx
npm run dev:worker # avvia il Worker in locale su http://localhost:8788
npm run smoke:worker # test end-to-end dell'endpoint HTTP (con dev:worker attivo)
npm run typecheck # controllo dei tipi senza generare file
npm run deploy    # pubblica su Cloudflare Workers

La logica di calcolo è in src/calc.ts, la formattazione del riepilogo in src/format.ts, la registrazione del tool in src/server.ts, l'entry point stdio in src/index.ts e l'entry point Cloudflare in src/worker.ts.

Licenza

MIT

Available Tools

1 tool
calculate_doughCalcola dosi impasto pizzaA
Read-onlyIdempotent

Calcola tutte le dosi dell'impasto della pizza con il metodo diretto: grammi di ogni farina, acqua, sale e lievito, con le percentuali del fornaio.

Parametri principali: numero e peso dei panetti, idratazione desiderata, una o più farine con le rispettive percentuali, ore e temperatura di lievitazione (a temperatura ambiente e/o in frigorifero) e tipo di lievito.

Il lievito viene stimato con un modello tempo/temperatura: percentuale di lievito fresco = 3,6 / ore equivalenti a 20 °C, con attività che raddoppia ogni 10 °C. Se conosci già la percentuale di lievito, puoi forzarla con yeast_percent. Le percentuali di farina, acqua, sale e lievito sono tutte sul peso della farina (farina totale = 100%).

NameRequiredDescriptionDefault
ballsYesNumero di panetti da preparare.
floursNoUna o più farine con la percentuale sul totale della farina. Default: un'unica farina al 100%.
room_hoursNoOre di lievitazione a temperatura ambiente (default 24; usa 0 se fai tutto in frigo). Per l'appretto dopo il frigo usa 1-2 ore.
yeast_typeNoTipo di lievito: fresh = fresco (default), dry = secco attivo, instant = istantaneo.
fridge_hoursNoOre di lievitazione in frigorifero (default 0, cioè nessun frigo). Se usi il frigo, aggiungi 1-2 ore a temperatura ambiente per l'appretto.
salt_percentNoSale in percentuale sul peso della farina (default 2,5). Il valore tipico è 2-3%.
ball_weight_gYesPeso di ciascun panetto in grammi (es. 250).
yeast_percentNoOpzionale: forza la percentuale di lievito (del tipo scelto) sul peso della farina, ignorando il modello tempo/temperatura.
hydration_percentNoIdratazione desiderata in percentuale sul peso della farina (default 62). Es. 62 per il 62%.
room_temperature_cNoTemperatura ambiente in °C (default 20).
fridge_temperature_cNoTemperatura del frigorifero in °C (default 4).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish that this is a read-only, idempotent, non-destructive calculation. The description adds meaningful behavioral detail beyond annotations by disclosing the yeast estimation model, the 10 °C doubling rule, and the fact that yeast_percent overrides that model.

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

Conciseness4/5

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

The description is front-loaded with the purpose and then structured into parameter summary, yeast model, and percentage basis. It is somewhat lengthy but most content earns its place; the main parameter summary mildly repeats schema information.

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

Completeness5/5

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

For an 11-parameter calculator with no output schema, the description covers purpose, key parameters, percentage conventions, and the yeast estimation/override behavior. It also indicates the calculation results in grams of each ingredient, so an agent has enough context to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents each parameter thoroughly. The description still adds conceptual meaning by summarizing the key inputs and clarifying that all percentages are relative to total flour weight, with total flour equal to 100%.

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

Purpose5/5

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

The description states a specific verb and resource: calculating all pizza dough doses using the direct method, producing grams of each flour, water, salt, and yeast with baker's percentages. It is immediately clear what the tool does and what outputs are conceptually provided.

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

Usage Guidelines4/5

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

The description explains the main inputs and gives a clear conditional usage rule: if the yeast percentage is already known, use yeast_percent to override the time/temperature model. There are no sibling tools to differentiate against, and no explicit 'when not to use' guidance, but the operational context is clear.

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.

  1. 1 tool updatev1.0.0
    • First observedcalculate_dough

TDQS

A4.4/5.0

Scored across 1 tool

Disambiguation5/5

There is only one tool, so there is no possibility of misselection or overlapping purpose. Its purpose (compute pizza dough ingredient doses with baker's percentages) is unambiguous.

Naming Consistency5/5

The single name calculate_dough follows a clear verb_noun snake_case convention. With one tool there is no internal inconsistency, though the pattern cannot be stress-tested across a set.

Tool Count4/5

The domain is a single self-contained calculation, so one comprehensive tool is proportionate rather than artificially split. It is slightly thin in that the yeast model, fermentation scheduling, and flour handling are all fused into one call instead of being composable pieces.

Completeness4/5

The tool covers the core dough lifecycle inputs: flour blends and percentages, hydration, salt, yeast type, yeast forcing, fermentation time/temperature, and ball count/weight. Minor gaps exist, such as no reverse calculation (given yeast %, derive timing), no unit or temperature-scale conversion, and no output of a full step-by-step schedule.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Tracks caffeine decay and predicts safe bedtimes using a half-life model. No external integrations needed, intake is passed as parameters.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides precise Chinese metaphysics chart calculation (Bazi, Ziwei, Qimen) with true solar time correction, outputting structured JSON and Markdown for AI integration.
    3
    MIT