A household budget you plan with your browser agent — it proposes, you approve.
Built for the WebMCP Challenge. Open source under the MIT license.
Budgeting a household is a shared decision. Handing an AI agent full write access to your money is wrong; making it click through a UI like a human is worse. Budget Bench gives the agent structured tools instead — and keeps the human in the loop at the only moment that matters: approving the change.
- Agent tools, not agent autonomy. The agent reads the budget with
get_budget_summary, reasons about it, and usesfind_savings,set_category_budget,add_category,record_spendorpropose_planto act. - Every mutation is a proposal. Tools never write to the budget directly. Each call lands in the human-visible Proposal tray with a plain-English summary and the agent’s reason.
- One shared context. The page state is the app. There is no backend, no account, no database — the agent and the human work on the same live page state in the same tab, which is exactly the collaboration model WebMCP enables and backend integrations cannot.
- Open the site in ChatGPT’s in-app browser (or Chrome with WebMCP enabled).
- Ask: “Our energy bill is going up — add £35 to utilities and find the money from discretionary categories.”
- Watch the agent call
get_budget_summary, then propose: utilities +£35, entertainment −£20, eating out −£15 — all pending in the tray, budget untouched. - Ask: “What can we save if we tighten the belt by £150 a month?” →
propose_planscales discretionary categories and sets savings, still pending. - The human reviews the tray, approves the good parts, rejects the rest. The activity log shows every proposal and every decision.
Live demo: https://budget-bench.surge.sh
Pure static site — no build step, no dependencies.
# any static server works
python3 -m http.server 8080
# open http://localhost:8080To use the agent tools you need a WebMCP-capable client (ChatGPT in-app browser, or Chrome with WebMCP enabled). Without one, the bench still works fully by hand.
| Tool | Type | What it does |
|---|---|---|
get_budget_summary |
read | Full budget state, category statuses, pending proposals |
find_savings |
propose | Scans over/tight discretionary categories and proposes trims → savings |
set_category_budget |
propose | Propose a new monthly amount for a category |
add_category |
propose | Propose a new category |
record_spend |
propose | Propose recording a spend against a category |
propose_plan |
propose | Propose a full rebalance to hit a savings target |
All mutating tools return {status: "proposed"} — the budget only changes when a human
approves in the tray.
- WebMCP registration follows the
webmachinelearning/webmcpdraft:document.modelContext.registerTool({ name, description, inputSchema, execute }). - State is a single object rendered by one
render(); proposals carryapplyclosures so approval is atomic and the tray is a natural transaction log. - Sample household figures are fictional demo data.
- No external requests: fonts, styles and logic are inline; nothing leaves the browser.
MIT — see LICENSE.