-
-
“Alexa, plan my groceries this week.” Three dinners built from my pantry and this week’s Kroger sales, with photos. Tap to pick.
-
Two picked recipes become one list, priced at my own Kroger with real products: 5 items on sale, $7.46 saved.
-
Each ingredient matched to a real Kroger product by Amazon Nova. Salt and pepper are already in the pantry, so they’re left off.
-
“Add it to my cart.” All 8 items go straight into a real Kroger cart for pickup, through Kroger’s official Cart API.
-
“Email me my shopping list and recipes.” The priced list and recipes go to the linked account’s own inbox.
-
Alexa+ reaches SaleSavor’s MCP server on Amazon Bedrock AgentCore through API Gateway and OAuth. Nova matches products; Polly speaks.
-
The SaleSavor for Alexa+ simulator: an Echo Show-style screen that talks to the live MCP server, since the Alexa+ toolkit is partner-only.
-
SaleSavor: save money on groceries with live flyer deals from stores near you.
-
How the app works: set preferences, see what's on sale, get recipe ideas, then shop and save.
-
Set your family size, diet and meal style once. SaleSavor and Alexa+ use it for every suggestion.
-
Recipe suggestions built around what's on sale near you this week.
-
One tap turns chosen recipes into a shopping list, with stores to visit and estimated savings.
Inspiration
Grocery prices across Canada and the US have climbed faster than almost anything else in the household budget. The deals are out there, but they're scattered across stores, apps and weekly flyers, and nobody has time to check them all before deciding what's for dinner.
We built SaleSavor to fix that: it finds grocery deals near you, suggests recipes built around what's on sale and what's already in your pantry, and turns it all into a shopping list. It's been live on the Apple App Store for over six months.
During Google Play testing, a retired tester on a fixed income told us the app would help him stay within his grocery budget. That stuck with us. The people who need SaleSavor most are often the ones least likely to dig through an app every week. So the next step was obvious: let them just ask.
What it does
SaleSavor for Alexa+ turns weekly meal planning into one conversation:
- "Alexa, I bought eggs, rice and green onions." Added to your SaleSavor pantry.
- "Plan my groceries this week." Three recipes built from your pantry and this week's sales, shown as cards with photos. They respect your ingredients to avoid (no garlic or onion, if that's your rule). "Anything with ground beef?" works too.
- "Make a list for the first two." Every item is matched to a real product at your nearest Kroger with this week's price: "Your list has 14 items, about $34.68 at Kroger. 8 are on sale, so you save $7.23 making these recipes this week."
- "Email it to me." The list and full recipes arrive in your inbox, leading with what you save.
- "Add it to my Kroger cart." The products go straight into your own Kroger cart for pickup. You pick a time and check out in the Kroger app.
Also: "Where are eggs cheapest this week?" (compared by price per egg, not sticker price), "Is anything in my pantry on sale?" and "Do I have soy sauce?"
It's built for an Echo Show screen: Alexa speaks a short answer while the screen shows the recipe cards, the priced list with SALE tags, and a "You save" banner.
How we built it
- MCP server on Amazon Bedrock AgentCore Runtime. Python, MCP Streamable HTTP (spec 2025-11-25), 17 tools. It only calls SaleSavor's existing API, so the app's data stays behind it.
- Account linking the way Alexa+ requires it. We added an OAuth 2.1 authorization server to SaleSavor's backend: PKCE S256, rotating refresh tokens, RS256 JWTs and protected-resource metadata. An Amazon API Gateway front door serves the metadata and proxies to AgentCore, whose custom JWT authorizer validates each token and forwards it, so every tool acts only for the signed-in user.
- Amazon Bedrock (Nova Lite) for price matching. A search for "eggs" also returns egg noodles and liquid egg whites. Nova reads each listing with a forced tool call and reports whether it's the real thing, the pack size and multi-buy deals. Python computes the unit price, so the model never does arithmetic.
- Amazon Bedrock (Nova Pro) for filling the cart. A word search picked lemon-ginger tea for "lemon" and a cornstarch baby powder for "cornstarch". Now, for every list item, SaleSavor fetches Kroger's candidates with their store departments, and Nova Pro picks, in one call for the whole list, the product a home cook would actually buy, or none rather than a near miss. Prices and savings are then calculated by the backend, never the model.
- Licensed data only. Prices come from Kroger's official Products API. Carts are filled with Kroger's public Cart API after the user connects their own Kroger account (OAuth,
cart.basic:write). Canadian coverage is pending data partnerships, so Alexa says it's coming soon rather than answering from unlicensed data. - An Alexa+ simulator. The Alexa+ add-on tools are in private preview, so we built an Echo Show-style web simulator. It runs the same account linking as Alexa+, and Amazon Nova Pro on Bedrock chooses which SaleSavor tool to call. It listens with the browser's speech recognition, speaks SaleSavor's answers aloud with Amazon Polly, and renders each tool result as cards.
- Existing backend: FastAPI + MongoDB on Railway, with Spoonacular and Edamam for recipes and Resend for email.
The cheapest option is the one with the lowest unit price:
$$ \text{best} = \arg\min_{i \in \text{matches}} \frac{p_i / k_i}{q_i} $$
where p is the price, k the number of packs it buys and q the units per pack. A list's savings are the regular price minus the sale price, added up over the items on sale.
Challenges we ran into
- Doing data the right way. Grocery flyer data is easy to find and hard to license. We moved the voice experience onto Kroger's official APIs, applied for Walmart's affiliate APIs, are seeking a licensed flyer data partnership, and chose to tell Canadian users "coming soon" rather than cut corners.
- Words aren't products. Our first cart test put herbal tea, coffee creamer and baby powder in a real Kroger cart. Keyword matching can't tell "lemon" from "lemon-ginger tea", so we handed that judgement to Nova Pro with each product's department, plus store spellings ("corn starch") and main-word fallbacks ("asparagus tips" → asparagus).
- No Alexa+ developer access. The Alexa+ add-on toolkit is partner-only, so we built a simulator that exercises the real MCP server, OAuth and tools end to end.
- Designing for voice. A screen can show 40 deals; a spoken answer has to pick the best three and stop. We capped every reply at about three short sentences, spoke prices the way people say them ("3 for $5", "$1.49 a pound"), and stopped saying zip codes aloud after the voice read 45202 as "forty-five thousand, two hundred two".
- Keeping voice answers honest. When the model paraphrased tool results, it sometimes named recipes that weren't on screen. Now Alexa speaks SaleSavor's own answer verbatim, which is also one model call faster.
- Cleaning up before building. Much of SaleSavor was built with an AI coding platform, and preparing for this hackathon exposed hidden problems:
- the Android build contained file paths that only existed on that platform's machines;
- a dependency on its private package server had silently blocked every backend deploy for a month;
- one malformed flyer item could discard every other result for a search;
- Android keyboards capitalized the first letter of passwords, so users who reset their password on the web couldn't sign in on their phone.
We learned to treat generated code as a starting point, not a finished product.
- Payments that didn't work on Android. Android testers got stuck at the subscription screen because purchases were only ever checked against Apple. We removed the lock on Android until Google Play billing is properly supported.
Accomplishments that we're proud of
- Voice to a real cart. One conversation took a pantry, planned three meals, priced 14 items at a real Kroger, emailed the list showing $7.23 in savings, and put 18 products into a real Kroger cart.
- A real product, not a demo. SaleSavor has real users on the App Store, is now live on Google Play, and Alexa+ is a new way into something people already use.
- Licensed data and real accounts, end to end. Every price comes from Kroger's API, and Alexa only touches the user's own SaleSavor and Kroger accounts, each through OAuth.
- Built on tester feedback. A tester asked to filter out garlic and onion, so we shipped an "ingredients to avoid" list, and it carries through to voice recipe suggestions.
- The app stayed private while getting a voice. The MCP server is a separate layer, so the core app and its data never had to be exposed.
What we learned
- Real users find the bugs you can't: one tester's two-line email uncovered a lockout we'd missed for months.
- Voice changes the product. A screen can show 40 deals; a voice answer has to pick the best three and let the screen carry the rest.
- Price per unit matters more than price: an 18-pack can beat a dozen even when the sticker is higher.
- Let the model judge, let code count. Nova is great at "is this the lemon a cook means?"; Python does every price and total.
- MCP plus OAuth makes a voice assistant safe to connect to personal data: the token decides whose pantry and whose cart, not the prompt.
What's next for SaleSavor
- Canadian coverage through licensed data partnerships.
- More stores as connectors: Walmart and Instacart shoppable links alongside Kroger's cart, and Amazon Fresh through Amazon Associates.
- Multi-store comparison and price-match prompts: tell shoppers when another store is cheaper ("Eggs are $0.81 less at Walmart this week. Add them to your Walmart cart?"), compare a whole list across stores, and in Canada, where chains like No Frills price match, tell them when their own store will match it.
- Reading and pricing the user's Alexa shopping list once add-ons can access it, so everyday lists ("bacon, milk, bananas") get the same sale prices and savings.
- Weekly spoken deal digests: "Here are this week's best deals on things you usually buy."
- Publishing the add-on on Alexa+ when add-on development opens up.
- Google Play billing so Android and iPhone match.
Built With
- alexa-plus
- amazon-api-gateway
- amazon-bedrock
- amazon-bedrock-agentcore
- amazon-cloudwatch
- amazon-nova
- amazon-polly
- amazon-web-services
- aws-iam
- edamam
- expo.io
- fastapi
- javascript
- kroger-api
- mcp
- model-context-protocol
- mongodb
- oauth2
- python
- railway
- react-native
- resend
- spoonacular
- typescript
Log in or sign up for Devpost to join the conversation.