Try it, and where each criterion is met

Live demo: https://imali-ai-alexa-plus.vercel.app (sign in with the judge account from the testing instructions; it runs against our MCP servers on Amazon Bedrock AgentCore Runtime). Code: https://gitlab.com/ebenworks-systems/imali-ai-alexa-plus (MIT). Film: 2:48.

  • MCP spec 2025-11-25 over Streamable HTTP, at runtime: a self-hosted MCP server on the official TypeScript SDK; the handshake test checks the negotiated version (src/mcp.js, test/mcp.test.js; film 1:35).
  • Agentic workflow across services: the books server asks a second MCP server, the supplier network, for a live quote, confirms with the owner, then places the order there and keeps the supplier's order number (src/mcp.js, src/supplier.js; gallery 2 and 3).
  • Purchasing: every purchase is confirmed by the owner through MCP elicitation, with a choice of how to pay (film 0:39; gallery 2).
  • State across sessions: each shop's books persist across sessions and microVMs, in DynamoDB, tied to the signed-in user (film 1:53; gallery 6).
  • Cards and carousels, MCP Apps: a receipt card and a stock carousel served as ui:// resources; the carousel's button calls a tool through the host (ui/; gallery 1, 3, 4).
  • Agent Skills: a skill that teaches any skills-aware agent the workflow (skills/imali-ai-shop-books).
  • AWS Builder: two MCP runtimes on AgentCore talking MCP to each other, Cognito sign-in, DynamoDB, ECR, least-privilege IAM, one deploy script (deploy/; film 2:10).

What it does

Say what you sold. Ask what you made. A shop owner keeps her books by talking to the assistant on the counter, and the books stay exact.

  • Records the day by voice. "Sold three bread and two cooking oil, cash." The assistant answers "Got it: 3 bread and 2 cooking oil, cash, $12.30" and shows a receipt card with the four journal lines: cash and sales, cost of goods out of stock, balanced to the cent. Credit sales go on the customer's tab; deliveries, running costs, tab payments and supplier payments each have a tool.
  • Answers from the books. "How are we doing today?", "Who owes me money?" and "What's running low?" are read from the ledger. Low stock comes back as a carousel.
  • Buys only with the owner's yes, from a real quote. "Order what's low from Kudzai Wholesale" drafts an order sized to a week of sales. The books server then asks the supplier network's MCP server for a quote: its prices, what it can send (it may fill only part of a line) and when. The owner sees that quote and confirms it through MCP elicitation, and the order is placed with the supplier, who answers with an order number and a delivery date. Stock and money move only when the delivery is recorded.
  • Asks instead of guessing. A sale larger than the stock the books show, money paid out of a till that does not hold it, or a total that does not match the price list gets one short question, not a wrong entry. Undo and reset ask first too.
  • Closes the day. "Closing up, I counted fifty dollars in the till" compares the count with the books, records any shortage, and says how the day went.
  • Remembers every shop. Close the page and come back: a new MCP session, the same books.

The model never calculates a figure. It passes the owner's words and numbers to the tools; the server's code computes every total, balance and order quantity and refuses any entry that does not balance; each tool returns the sentence to say. Before a reply is spoken, the page checks every number written in digits against the owner's words and the tools' results, and falls back to the tools' own lines if one does not match.

How we built it

The shop books MCP server implements spec 2025-11-25 over Streamable HTTP on the official MCP TypeScript SDK (1.32.1): 13 tools with input and output schemas, structured content and annotations; a journal resource; two prompts; elicitation; stateful sessions; and an optional request id in each call's _meta, so a retried request is recorded once.

The supplier network is a second MCP server with quote_order and place_order. The books server is its MCP client. On AgentCore each server is its own runtime from the same image, and the books runtime calls the supplier runtime over MCP, passing the caller's sign-in token on. If the supplier cannot be reached, the order stays in the books and the owner is told.

MCP Apps: the server ships two views as ui:// resources with MIME type text/html;profile=mcp-app. They speak the MCP Apps protocol by postMessage, with no third-party code inside, and the stock carousel's Reorder button asks the host to call reorder_stock.

The simulated Alexa+ experience: Alexa+'s developer tools are open to select partners only, so, as the FAQ suggests, we built the simulated path. A web page is a real MCP client (the official SDK, bundled for the browser): it sends initialize, tools/list, tools/call and resources/read, answers elicitation with a sheet you can tap or answer by voice, hosts the MCP Apps views in a sandboxed iframe, listens through the browser's speech recognition and speaks replies. It has an Echo Show-style device view, an "Under the hood" panel with every JSON-RPC message, and a guided mode in which each suggestion calls its tool directly, so it works with no model at all. The agent model is any OpenAI-compatible endpoint with tool calling; ours is Claude Sonnet 5.5 through our model gateway, and judges can bring their own.

AWS: both MCP runtimes run on Amazon Bedrock AgentCore Runtime in us-east-1 with stateful sessions (one microVM per session), so elicitation works in the cloud. Amazon Cognito signs callers in through AgentCore's JWT authorizer, and each shop is tied to the signed-in user. Amazon DynamoDB holds each shop's books as one version-checked item. Amazon ECR holds the ARM64 image; IAM gives the runtimes a role that can only pull the image, write logs and use the books table. One script deploys all of it with the plain AWS CLI. The hosted page runs on Vercel, and its model relay answers only callers whose Cognito token it has verified.

Claude Code also connected to the same server over HTTP, negotiated 2025-11-25, recorded a sale and read back the day (measured 23 Oct 2026: 4 turns, 10.6 s).

Who it is for

Imali AI is our AI business operating system for small shops: one AI agent runs sales, stock, staff, suppliers and double-entry books from a text, voice note or photo. It launched on 21 October 2026 and is live on Google Play and WhatsApp, for shops in Africa first. The owner's problem is the same anywhere: she is serving a queue, so the books wait until closing time. In the United States alone there were 151,975 convenience stores at the end of 2025, and 63% of them belonged to companies with ten or fewer stores (NACS 2026 store count). A voice assistant on the counter fits that owner, and because the books are an open MCP server, the same shop can use them from Alexa+, from Imali AI's chat, or from any other assistant. The supplier side matters as much: Imali AI already has a supplier edition, and the supplier network server shows how an assistant can order from a supplier's own system with the owner's yes.

Challenges we ran into

  • Designing for Alexa+ without access to its tools. We followed what the judges call creative and kept the servers standard, so they work in any MCP host.
  • Elicitation needs stateful sessions, which a plain stateless function cannot give. AgentCore Runtime's stateful MCP sessions solved it.
  • Calling one AgentCore runtime from another as the same user. We forward the caller's token; the first reorder of a session waits for both runtimes' cold starts (8.8 s cold against 3.5 s warm, measured).
  • AgentCore wants ARM64 images and our workstation had no emulator, so the Dockerfile has no build-time commands.
  • Voice makes long replies painful, so every spoken line is cut to what a shopkeeper needs.

Accomplishments that we're proud of

  • The model never calculates a figure, and the code proves every entry balances.
  • One assistant request drives two MCP servers, a human confirmation and a supplier's order, all on AWS.
  • Measured on 23 October 2026: all 28 automated tests pass; on AgentCore, single tool calls took 0.46 to 1.01 s from Korea and the whole reorder across both servers 3.5 s on warm runtimes; on the hosted page, signed in as the judge (two runs of four requests), everyday requests took 6.5 to 8.2 s from request to spoken reply and the reorder through the supplier 9.6 to 10.4 s, and every reply passed the figures check.

What we learned

MCP gives a voice assistant the boundary money needs: the model decides what the owner meant, and the server decides what the books say. Elicitation turns "should I buy this?" into a protocol step instead of a prompt instruction, and a second MCP server turns a purchase order into a real order.

What's next

Account linking so each Alexa+ user reaches their own Imali AI books; the rest of Imali AI's tools (invoices, staff) as MCP tools; real suppliers on the supplier network; and the real Alexa+ path as soon as the developer tools open beyond partners.

The demo shop, its people, the supplier network and every figure are invented, and the film's voices are synthesized; replies and timings in it are live. The film was recorded before the supplier network was added; the gallery and the live demo show it.

Code repository: the company's GitHub account is under review by GitHub, so the code is on GitLab, public and MIT-licensed: https://gitlab.com/ebenworks-systems/imali-ai-alexa-plus. A GitHub copy follows as soon as access returns.

Built With

Share this project:

Updates

Submission history