Inspiration
I build small products, and the bill that hurts is never the one I planned for. One month it was S3 cross-region transfer, another month a GPU instance nobody stopped. Teams like mine pay for AWS, model inference and a dozen SaaS seats, and we usually find out about a spike when the invoice lands. I wanted something I could simply ask, "how long can we last?", and get a straight answer from our real numbers. I also wanted it to act before the invoice, not after.
What it does
FinOrchestrate is a voice budget guardian for developer teams. It is a self hosted MCP server that Alexa+ or any MCP client can talk to.
- Ask in plain words. "How is the budget looking?", "What if cloud costs go up 25 percent?", "Can we afford a 600 dollar GPU run?" Every answer is one or two spoken sentences built from the ledger.
- Hands-free, like a smart speaker. Turn it on and say "Hey Fino, any unusual charges?" The console chimes, answers and goes back to waiting. Speech is recognized on the device when the browser has an on-device model, so room audio stays on the machine, and it never listens while it is talking.
- Log money by voice. Merchants such as AWS, GitHub or Datadog are categorised automatically, and a charge that looks like a duplicate is called out the moment it is logged.
- A guardian that acts. It projects every budget envelope to month end, moves small gaps on its own (up to $250 per move and $600 a month by default, from the reserve first) and asks for approval above that. I can approve by voice ("approve it"), from an interactive card, or on the dashboard.
- It remembers. "What did I miss?" reports only what changed since that device last asked, and the memory survives restarts.
- Cards that do things. Every result renders as an MCP Apps card with working buttons: approve, reject, mark a charge as expected, make room for a purchase.
- A live dashboard. Runway, a cash outlook with an uncertainty band, envelopes, transactions, the guardian's audit trail and a Connect page with the MCP endpoint and ready to paste client settings.
How I built it
- MCP server on the official TypeScript SDK v2 (
createMcpHandler) over Streamable HTTP. One stateless endpoint serves MCP 2025-11-25 and 2026-07-28. It has 13 tools with input and output schemas and behavior annotations, 3 resources, 2 prompts, and bearer token auth with Host and Origin checks against DNS rebinding. - MCP Apps: the card is a single file view built on the ext-apps
Appclass. The voice console hosts it withAppBridgein a sandboxed iframe. - Voice console: a real MCP host in the browser. It uses the MCP client SDK, the Web Speech API to listen and speak, and a protocol inspector that shows every JSON-RPC message. It plans with a deterministic intent engine, or with Amazon Bedrock (Converse API, Amazon Nova) when AWS is configured.
- Hands-free wake phrase: continuous recognition in on-device mode where Chrome supports it, with contextual biasing toward the name. A phonetic matcher with an edit distance budget hears "Hey Fino" however the recognizer spells it, rejects lookalikes like "fine", and splits "Hey Fino, what is our runway" into wake phrase and request. It pauses while the console speaks, waits through short pauses, and restarts itself when the browser ends a session.
- The math lives in a framework free TypeScript package. Money is integer cents. Month end projections use what each envelope usually spends in the rest of a month, because cloud invoices land early and contractor invoices land mid month. Runway uses the last three complete months, and the cash forecast treats net burn as a random walk to get a 10th to 90th percentile band. Unusual charges are found with duplicate checks plus a median and MAD based modified z-score per merchant.
- Dashboard: React with GraphQL Yoga and a live subscription, so a voice command updates every open screen.
- AWS: DynamoDB single table storage, SNS alerts, EventBridge Scheduler for guardian sweeps, and a SAM template that runs everything on one Lambda container with the Lambda Web Adapter.
- Deploy anywhere: the same server runs as one Vercel container (
Dockerfile.vercel) for the public demo, or on AWS Lambda with the SAM template. - Quality: 112 automated tests, including the MCP server driven by the official client over Streamable HTTP in both protocol eras, the wake phrase matcher, and a check that replays the guardian on every day of a quarter.
Challenges I ran into
- I could not find a documented way to attach a self hosted MCP server to Alexa+, so I built the server to the spec and wrote a browser host that behaves like an Alexa+ connector.
- My first month end projection was a straight line. It said cloud would finish at $4,642 when a normal month is about $1,600, because most cloud cost lands in the first days. A seasonal method fixed it.
- MCP Apps cards in sandboxed srcdoc iframes inherit the page's Content Security Policy, which blocked the card's script. The server now hashes the card's inline code and allows exactly that.
- Cards did not report their size in background tabs, because the SDK measures inside an animation frame. The card now also reports its size right after rendering.
- The demo ledger is generated relative to today, and a planned $640 GPU run was flagged as unusual on some days but not others. A test that replays the guardian on every day of a quarter caught it, and also caught that two identical charges with the same timestamp, like a statement imported twice, were not called duplicates. Both are fixed.
- Chrome's speech recognizer cannot be fed a test recording in automation, so I tested hands-free mode with a scripted recognizer that behaves like Chrome's: interim results, final results, and sessions that end on silence.
The full list, with suggestions for the tool owners, is in the friction log in the repo.
Accomplishments that I'm proud of
- The guardian makes the call a careful person would: in the demo it moves a small gap into Dev Tools on its own and asks before moving about $800 into Cloud.
- "What if cloud costs go up 25 percent?" changes only the Cloud envelope's share of spending, and the answer says so, instead of quietly stressing the whole budget.
- Pressing Approve inside a card travels from the card through the host and the MCP server to the ledger, and back to every open dashboard, in about a fifth of a second.
- It runs fully locally with no paid services, and every AWS integration is optional.
What I learned
- How MCP's two protocol eras differ, and how to serve both from one stateless endpoint.
- How MCP Apps hosts and views talk over postMessage, and what sandboxing means for security policy and sizing.
- Writing for the ear is different from writing for a screen: round numbers, one idea per sentence, and the decision at the end.
What's next for FinOrchestrate
- Connect to a real Alexa+ account as soon as self hosted MCP registration is available.
- Read real cloud bills through the AWS Billing and Cost Management MCP server and feed them to the guardian.
- Import bills from AWS Cost Explorer and bank feeds.
- Several workspaces, and approval rights per person.
Built With
- amazon-bedrock
- amazon-dynamodb
- amazon-eventbridge
- amazon-nova
- amazon-sns
- amazon-web-services
- aws-lambda
- aws-sam
- docker
- github
- graphql
- graphql-yoga
- mcp-apps
- model-context-protocol
- node.js
- react
- typescript
- vercel
- vite
- vitest
- web-audio-api
- web-speech-api
- zod
Log in or sign up for Devpost to join the conversation.