Cost-benefit analysis for anything you can describe as a flow. Describe the decision — to your own AI assistant, or right here in the browser — and get back a real model: seeded, repeatable, checked knob by knob, instead of a confident guess.
The diagnostics pass doesn't just simulate — it ranks every knob by measured influence, so "add more capacity" gets checked instead of assumed. It has found capacity that hurts the objective as often as capacity that helps: a café's pantry stock, a hospital's ED bays, a software team's engineering headcount.
Staffing, equipment, inventory — the classic what-if: how many baristas, vans, or ED bays actually move the outcome.
cafe: pantry stock is inert, staffing isn'tWhat to build next is a cost-benefit question too: a backlog gated by evaluation, capacity-constrained engineering, telemetry that validates or kills.
feature-lab: more engineers can hurt the objectiveEvery model gets the same automated knob-ranking pass — no bespoke code, no guessing. It checks "add more" instead of assuming it.
ward-flow: 2 more ED bays don't move the needleHand any of these to your AI assistant once it's connected below, or describe your own in the browser — no Petri-net vocabulary required, the model gets built from the conversation.
Point any MCP-capable AI assistant at the hosted server — no install,
no API key to copy. Public tools
(sim_list_models, sim_get_model,
sim_scenario, sim_diagnose,
sim_dataset, sim_verify, …) work signed out;
creating, licensing, calibrating or publishing a model opens PFlow OAuth
2.1 with PKCE the first time you use one.
Then just describe the decision: "My team's feature backlog is gated by cost-benefit review — tell me whether adding engineers actually helps."
Or point any client that takes JSON config at the hosted server:
{
"mcpServers": {
"sim": {
"type": "http",
"url": "https://sim.pflow.xyz/mcp"
}
}
}
Streamable HTTP, OAuth 2.1 with dynamic client registration — full tool list and the guide at /llms.txt and /llms-full.txt.
A model is a stored data item, not a deployment. POST a Petri-net JSON and the id that comes back — the content hash, stable forever — carries the whole API. Nothing to register, no routes to code.
# store a model
curl -X POST https://sim.pflow.xyz/api/models \
-H 'Content-Type: application/json' -d @model.json
# → {"id":"…","url":"/api/models/…"}
# ask it a hypothetical (pure read, seeded)
curl -X POST https://sim.pflow.xyz/api/models/$ID/scenario \
-d '{"hours":8,"realizations":16,"seed":7,
"marking":{"staff":3}}'
Every model answers the same six endpoints:
GET /api/models/$ID the model
GET /api/models/$ID/rates declared knobs
POST /api/models/$ID/scenario one hypothetical
POST /api/models/$ID/scenario/compare
seeded side-by-side
GET /api/models/$ID/dataset synthetic event log
(?seed=&cases=&format=csv|jsonl)
POST /api/models/$ID/publish → your Google Sheets
Every model built so far, including the ones behind the examples above. Most people get here by asking their assistant a question, not by browsing — this is for exploring what other decisions have already been modeled, or poking at the raw Petri net behind one.
Fetching /api/catalog.