Inspiration
Every month, Indian workers in the UAE send part of their pay home to family. Voice suits the job: "send two thousand to Mum" is one sentence. But voice is also the weakest way to approve a payment: a misheard number, an assistant that improvises, anyone in the room saying yes. We wanted to know what an Alexa+ add-on would need before it could be trusted to move someone's money.
What it does
Nuvio Remit is an Alexa+ add-on for one remittance provider on the UAE-to-India corridor. Priya, in Dubai, can ask what's waiting, check today's rate, send dirhams to Mum's bank account in rupees, track the transfer to its bank reference, cancel before payout, check her limits and set a rate alert, all by voice. The ledger is simulated, so no real money moves; the exchange rates are live.
Money moves only after four checks that the server enforces, not the model:
- Read-back: the server writes the exact sentence Alexa+ reads back.
- Single-use token: a five-minute token ties her yes to that read-back.
- Server-side limits: KYC tier, daily, monthly and cash pickup caps.
- Step-up code: a one-time code is texted to her phone. Money moves only when she reads it back, or types it into the transfer view. The model never sees the code.
It remembers across conversations without storing chats: at the start of each one, get_pending reads what's waiting from the ledger, such as a transfer under review and the document it needs.
Try it
- Hosted: xqnsayyu6m.us-east-1.awsapprunner.com, live through November 20, 2026, with Amazon Bedrock and Amazon Polly. The access code is in the testing instructions for judges.
- On your own machine, with nothing but Node: clone github.com/debashish17/Nuvio and follow "Run it locally with no AWS account" in the README. No AWS account or API key is needed.
How we built it
- The Alexa+ add-on is an MCP server in TypeScript (MCP spec 2025-11-25, stateless Streamable HTTP) with 14 tools. Every reply is written to be spoken: amounts in words, "recipient" rather than "beneficiary", "under review" rather than "on hold".
- An MCP Apps view,
ui://nuvio-remit/transfer, shows the transfer on screens: quote, read-back with countdown, code entry and live receipt. A code typed there goes to the server through the host, never through the model. - An Agent Skill (
skills/nuvio-remit/SKILL.md) teaches any agent the same consent flow the server enforces. - A web simulator stands in for Alexa+, whose CLI, MCP Toolkit and simulator aren't available to participants. It calls the server over real JSON-RPC, exactly as Alexa+ would. Its live assistant runs on Amazon Bedrock (Nova 2 Lite, Converse tool use, prompt caching) and speaks with Amazon Polly's Kajal voice. With no AWS account, a scripted mode drives the real tools through the whole demo.
- The hosted copy runs on AWS App Runner from one CloudFormation template. GitHub Actions deploys it through OIDC with no stored AWS keys, and every deploy checks the p95 latency of all 14 tools against a 500 ms budget.
- Testing: more than 340 tests, conversation evals against the live model, and Playwright end-to-end runs in GitHub Actions.
- Open source: the confirmation gate is published on npm as
mcp-confirm-gate, for any MCP server.
The money math
Every amount is an integer in minor units (fils and paise), never a float, and rates are stored as integers of ten-thousandths. The ECB publishes no dirham rate, so the live mid-market rate comes through the dirham's dollar peg:
$$\text{mid rate} = \frac{\text{USD/INR rate}}{3.6725}$$
Nuvio's rate takes a 0.90% margin off the mid rate, rounded down to four decimal places. The guaranteed receive amount converts what is left after the fee, rounded down to the paisa:
$$\text{Nuvio rate} = \left\lfloor \text{mid rate} \times (1 - 0.0090) \right\rfloor \text{ (to 4 decimal places)}$$
$$\text{receive in paise} = \left\lfloor (\text{send in fils} - \text{fee in fils}) \times \text{Nuvio rate} \right\rfloor$$
So for 2,000 dirhams with the 15 dirham fee, 1,985 dirhams are converted. The quote locks that rate for 30 minutes, and the receive amount Alexa+ reads back is the one that arrives.
Challenges we ran into
- No Alexa+ toolchain. The track links to the Alexa+ CLI, MCP Toolkit and web simulator, but participants can't get them. We built our own simulator instead, and made it run with nothing but Node, so judges need no account.
- Word-for-word consent. Out of the box the model paraphrased read-backs, spoke raw status values, and once quoted the mid-market rate as "the rate". Strict prompt rules and conversation evals fixed all of them.
- Prompt caching by trial and error. Every call resends the instructions and 14 tool definitions, so input tokens were 94.5% of the Bedrock cost. Nova 2 Lite accepts a cache point only in some places, and the docs don't list them. Once we found them, Bedrock's cost per demo run fell 77%, from about 6 cents to about 1.4.
- Keeping the step-up code away from the model. The code never appears in a tool result. On screens, the MCP Apps view sends it straight to the server through the host.
- Hosting. AWS closed App Runner to new customers in April 2026. Our account could still create a service, so the hosted copy runs there; the same image runs on Amazon ECS Express Mode if an account can't.
Accomplishments that we're proud of
- The model cannot approve a payment on its own, because it never sees the code.
- A clean clone runs the whole demo with no AWS account.
- A full live demo run with voice costs about 7 cents.
- An external review found a race in our published package. Version 0.2.0 fixed it with an atomic reservation for each try, and 0.1.0 is deprecated.
What we learned
- Safety belongs on the server. The model explains a refusal; it can't talk its way past one.
- "Under review" must never say why. Screening rules forbid tipping a customer off, so the add-on gives the next step and never the reason.
- The ledger is a better memory than chat transcripts. It is always current, and nothing said in an old conversation can resurface.
- Voice needs a second factor. A spoken yes proves agreement, not identity, so the yes and the texted code do different jobs.
What's next for Nuvio Remit
- Secure document upload. Today every document step (Emirates ID, salary proof, proof of funds, a sale agreement) ends with "upload it in the Nuvio app". Next: a single-use link texted to the phone, and an upload box in the transfer view, so a document goes straight to Nuvio and never through the model.
- Run on Alexa+ itself once add-on testing opens to builders and outside the US, with account linking (OAuth 2.1 and PKCE).
- An approval in the Alexa app instead of an SMS code.
- Hindi first, then more Indian languages, and more corridors.
- A licensed partner behind the ledger module.
Built With
- agent-skills
- alexa+
- amazon-bedrock
- amazon-cloudwatch
- amazon-ecr
- amazon-nova
- amazon-polly
- aws-app-runner
- aws-cloudformation
- aws-iam
- aws-secrets-manager
- claude-code
- docker
- express.js
- frankfurter
- github-actions
- mcp-apps
- model-context-protocol
- node.js
- npm
- playwright
- sqlite
- typescript
- vitest
- zod
Log in or sign up for Devpost to join the conversation.