MCP connector for Claude

Dry Run: live the year before you spend it.

Dry Run plays the next 52 weeks of a small services business 10,000 times. Calls come in, some close, jobs queue behind the crews you have, materials go out when the work starts, and customers pay when they feel like it, while payroll runs every week regardless. It reports the odds the business runs short of money, the week it most likely happens, what separated the bad years from the good ones, and which single change takes the most risk off. No model guesses anything: every number is arithmetic on what you tell it.

Connector URL

https://mcp.modernmustardseed.com/dry-run

Streamable HTTP. No sign-in. Every tool is read-only and makes no network calls.

Connect it

  1. In Claude, open Settings, then Connectors.
  2. Choose Add custom connector, paste https://mcp.modernmustardseed.com/dry-run, and save. No account or key is needed.
  3. In a chat, describe a business the way you would to a friend. Claude fills in the inputs and calls the tools when the question needs them.

In Claude Code: claude mcp add --transport http dry-run https://mcp.modernmustardseed.com/dry-run

Try these

The tools

simulate_cash_year

Simulate a cash year

Runs the next 52 weeks of the business 10,000 times. Returns the chance it runs short of money, the most dangerous week, the 10th, 50th and 90th percentile of reachable money every week, the drivers that separated the futures that ran short from the ones that survived, and the profit the business makes at its own averages.

Inputs: preset (default general) and any of: start_cash, credit_line, credit_drawn, credit_apr, opening_receivables, opening_backlog_weeks, crews, crew_cost_weekly, overhead_weekly, owner_draw_weekly, fixed_costs, leads_per_week, leads_cv, close_rate, seasonality, job_types, collection_shape, bad_debt_rate, tax_rate, surprises, start_month, seed, name.

rank_levers

Rank levers

Tests nine single changes an owner can make on Monday (deposits, shorter terms, a 5 percent price rise, a smaller owner draw, less overhead, a bigger credit line, one crew fewer, one crew more, more enquiries) and ranks them by how much each lowers the chance of running short. Each lever runs 3,000 simulated years with the same seed as the baseline.

Inputs: The same business description as simulate_cash_year.

list_presets

List presets

Lists the six built-in businesses (excavation and septic, plumbing and drain, heating and cooling, landscaping and snow, roofing, and a general small services business) with every default input and what each makes at its own averages.

Inputs: None.

How the simulation works

One simulated year is 52 weeks. Each week, enquiries arrive (scaled by the month's seasonality and a week-to-week spread), some close, and each win draws a job type, an invoice value and the crew-weeks it needs. Jobs queue in the order they were won behind a hard ceiling of crew capacity. Random setbacks take their cost and their bite out of capacity first. A job pays its deposit when it is won, buys its materials when the crew starts it, and invoices its balance when it is done; that balance arrives after a payment delay drawn around the job's terms, with a long tail of late payers, or never, at the bad debt rate. Payroll, overhead, owner draw and monthly bills leave whether or not anyone paid. Tax is set aside on profit and paid each quarter, with a bad quarter reducing the bill. When the bank goes below zero the line of credit covers it, with interest; a week the line cannot cover is a week the business ran short.

Five choices make the answer true of real businesses rather than flattering or alarming: materials are paid when a job starts, not when it is sold; materials are weighted by revenue, not by job count; money already owed and work already sold on day one are part of the model; tax falls on profit, not revenue; and the backlog is tracked exactly. One audited future of every preset balances to the cent: end cash equals start cash plus everything in, minus everything out.

Causes. Every simulated year records twelve drivers, such as jobs won, days to get paid, bad debt, setbacks and the deepest backlog. The futures that ran short are compared with the ones that survived, and the drivers are ranked by the size of the difference (a standardised effect size), with the median of each driver in both groups so the gap is readable.

Levers. rank_levers applies each of these changes on its own and runs it against the same seed as the baseline:

Levers are ordered by how much they lower the chance of running short. Money at year end only separates levers that move the odds by the same amount.

The presets

Every call starts from a preset and overrides whatever you give it. The defaults are starting points, meant to be replaced with the business's own numbers.

Every input

All optional. Money is in dollars. Rates and shares of an invoice are fractions, so 0.3 is 30 percent.

What comes back

Limits

Troubleshooting

Every future runs short
Check at_averages. If left_after_owner_draw is negative, the business loses money at its own averages and no amount of luck saves it; a mistyped crew cost or a missing job type is the usual cause.
The odds look too good for a seasonal business
Set start_month to the month the year actually starts, and give opening_receivables and opening_backlog_weeks. A year that starts in January with nothing owed and nothing booked looks different from one that starts after a busy autumn.
“wins about N jobs in its busiest week”
The model is busier than the public engine runs. Group small, similar jobs into one larger job type, or lower leads_per_week.
The answer changed between two runs
The default start month is the current month. Pass start_month and seed to get the same answer every time.

For reviewers

No account, key or setup is needed. Add the connector URL above, then:

  1. list_presets with no arguments returns six presets with every input.
  2. simulate_cash_year with {"preset": "plumbing", "start_month": 1} runs 10,000 years and reports about a 4 percent chance of running short, with causes.
  3. simulate_cash_year with {"preset": "general", "start_cash": 5000, "credit_line": 0, "start_month": 1} shows a riskier custom business, its most dangerous week and its causes.
  4. rank_levers with {"preset": "general", "start_month": 1} ranks the nine levers.
  5. Errors: {"crews": 0} and {"credit_line": 10000, "credit_drawn": 20000} each return a specific message.

Support and security

Questions, problems and security reports go to sarah@modernmustardseed.com. A machine-readable contact is at /.well-known/security.txt. How we handle data is in the privacy policy.