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
- In Claude, open Settings, then Connectors.
- Choose Add custom connector, paste
https://mcp.modernmustardseed.com/dry-run, and save. No account or key is needed. - 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
- “I run a plumbing shop with 4 techs, $35,000 in the bank and a $50,000 line of credit. What are the odds I run short of cash in the next 12 months, and when?”
- “Simulate a landscaping and snow company starting in July with $40,000 in the bank and no line of credit. Which week is the most dangerous, and what separates the years it runs short from the years it does not?”
- “My roofing company takes 10 percent down on insurance jobs and waits about 60 days to get paid. Rank the changes that would most lower my risk of running out of money this year.”
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:
- Take a third up front on every job. Some customers will not like it. A few will go elsewhere.
- Take fifteen days off your terms. Chasing. Somebody has to make the calls on day thirty-one.
- Put prices up five percent. You lose about one job in twenty to somebody cheaper.
- Take a fifth less out for six months. It comes straight out of your household.
- Take ten percent out of overhead. Something you are paying for now stops.
- Get the line raised by half. A conversation with the bank while things still look good.
- Run one crew lighter. You turn work away in your best weeks.
- Put another crew on. The wage bill starts before the work does.
- Buy three more enquiries a week. About two thousand a month, spent whether it works or not.
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.
excavationExcavation and septic
Big tickets, hard winters, and general contractors who pay when they feel like it.
plumbingPlumbing and drain
High volume, small tickets, and most of it paid before the van leaves.
hvacHeating and cooling
Two peaks a year and a long shoulder season to get across.
landscapingLandscaping and snow
Contract revenue in two seasons and a gap in the middle of both.
roofingRoofing
Weather, insurance work, and material prices that move under you.
generalSomething else
A small, ordinary services business to edit into your own.
Every input
All optional. Money is in dollars. Rates and shares of an invoice are fractions, so 0.3 is 30 percent.
presetStarting template: excavation, plumbing, hvac, landscaping, roofing, or general for any other small services business. Every field below overrides it. Default general.
nameBusiness name, used only to label the result.
start_cashMoney in the bank on the day the year starts, in dollars.
credit_lineSize of the line of credit, in dollars. 0 for none.
credit_drawnHow much of the line is already drawn, in dollars.
credit_aprAnnual interest on the drawn balance, as a fraction. 0.11 is 11 percent.
opening_receivablesWork already invoiced and not yet paid on day one, in dollars.
opening_backlog_weeksCrew-weeks of work already sold and waiting to start.
crewsCrews (or technicians, or production units) working in parallel. One crew delivers one crew-week a week.
crew_cost_weeklyFully loaded weekly cost of one crew: wages, burden, fuel, vehicle.
overhead_weeklyWeekly overhead that runs whether or not anyone works: office, software, admin wages.
owner_draw_weeklyWhat the owner takes out each week.
fixed_costsMonthly fixed bills such as rent, insurance and equipment notes. Replaces the preset list.
leads_per_weekEnquiries in an average week before seasonality.
leads_cvWeek to week spread of enquiries. Default 0.35.
close_rateShare of enquiries that become jobs, as a fraction.
seasonalityTwelve multipliers on enquiry volume, January first. 1 is an average month.
job_typesThe kinds of work sold. Replaces the preset list.
collection_shapeHow disciplined customers are about paying on time: 2 is ragged with a long tail of late payers, 6 is disciplined.
bad_debt_rateShare of invoiced balances never collected, as a fraction.
tax_rateShare of profit set aside for tax, paid quarterly.
surprisesRandom setbacks such as a machine breakdown or someone quitting. Replaces the preset list.
start_monthMonth the simulated year starts, 1 for January. Default: the current month.
seedSeed for the random draws. The same inputs and seed always return the same answer. Default "dry-run".
What comes back
- chance_of_running_short_pct: the share of simulated years with at least one week the bank and the line together could not cover.
- most_dangerous_week and first_shortfalls_by_month: when the trouble starts.
- weekly_reachable_money: bank balance plus unused credit at the end of each week, at the 10th percentile, the median and the 90th percentile.
- causes: the drivers that separated the years that ran short from the years that survived.
- at_averages: revenue, costs and profit with all randomness removed. If this loses money, every simulated year will too.
- For rank_levers, each lever's chance of running short and the change against the baseline, in percentage points and in dollars.
Limits
- simulate_cash_year runs 10,000 simulated years. rank_levers runs 3,000 for the baseline and for each of the nine levers. A simulation usually returns in a few seconds and a lever ranking in under half a minute.
- Models that win more than 20 jobs in their busiest week run fewer simulated years so every call keeps the same time budget, and the result says how many ran. Models past 100 jobs a week are declined with a note on how to group small jobs.
- Daily limits are shared by all users: simulate_cash_year 1,000 runs a day and rank_levers 300. Each server also answers at most 20 simulations and 6 lever rankings a minute. Over a limit, the tool says so and gives the time to try again.
- The model is built for businesses that sell jobs and deliver them with crews: trades, home services, field services, agencies and studios that book work by the week. A shop that sells products off a shelf fits less well.
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:
list_presetswith no arguments returns six presets with every input.simulate_cash_yearwith{"preset": "plumbing", "start_month": 1}runs 10,000 years and reports about a 4 percent chance of running short, with causes.simulate_cash_yearwith{"preset": "general", "start_cash": 5000, "credit_line": 0, "start_month": 1}shows a riskier custom business, its most dangerous week and its causes.rank_leverswith{"preset": "general", "start_month": 1}ranks the nine levers.- 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.