For the judges (60 seconds)

Links: Echo Show demo · Website · Code · Alexa+ fit table · Friction log (16) · Countertop · Upstream fix: mcp-handler#200

  1. Open https://d1soo7510nfzf4.cloudfront.net/echo. No sign-in; a demo household in London is made for you.
  2. Say or type "When should I run the dishwasher? It needs to be done by seven", then "Yes please", then "How much have I saved?"
  3. Watch the Conversation panel: every MCP tool call Amazon Nova Micro makes on Bedrock, live, with Amazon Polly speaking the answer.
  • Live data, three markets: Octopus Agile in all 14 British regions (any postcode or city), ComEd hourly in Illinois, EPEX day-ahead in Germany, plus the grid's carbon forecast. No mocks.
  • Alexa+ ready: an MCP server (2026-07-28 and the 2025 revisions), nine voice-first tools, an MCP App view for the Echo Show screen, elicitation, OAuth 2.1 for Alexa+ account linking.
  • Runs on AWS: Lambda behind CloudFront in Sydney, Nova Micro on Bedrock, Polly, S3, EventBridge Scheduler planning tonight for every household, CloudWatch. No access keys: each function signs with its own role.
  • Proof: 147 tests and CI, a live smoke test of every tool, 16 friction-log entries.

A real conversation on a simulated Echo Show: Amazon Nova Micro on Bedrock picks Lowtide's MCP tools; the screen is its MCP App view.

Inspiration

Millions of homes now pay a different price for electricity every half hour: Octopus Agile in Britain, ComEd Hourly Pricing in Illinois, and dynamic tariffs in Germany, which every supplier has had to offer since 1 January 2025. On 15 October in London a unit cost 19p in the afternoon and 55p at six in the evening. The money is in the big loads: charging a car at the cheapest time that day cost £4.25 instead of £7.30, and heating a hot-water cylinder £1.16 instead of £1.97. On peaky days like that one, two habits are worth about £610 a year. But nobody reads a price table while loading the dishwasher. "When should I run it?" is a question you ask out loud, with your hands full, in the kitchen. That is exactly where Alexa lives.

What it does

  • You ask Alexa when to run the dishwasher, the washing, the tumble dryer, the car charger or the immersion heater, with a deadline ("done by seven", "by tomorrow morning"), a start ("not before 10pm") or a goal ("greenest, please"). A deadline it can't make gets a straight "it can't be done by then" and the earliest finish.
  • Lowtide prices every start that finishes in time and answers twice: one sentence to say, with the cost and the saving, and an MCP App view for the Echo Show screen, the next 24 hours on a dial with the run marked.
  • Say yes and it saves the run for the household, then counts what you've saved. "Is now a good time to put the tumble dryer on?" gets a straight answer.
  • Tonight's plan, before anyone asks: after tomorrow's prices are published, Amazon EventBridge Scheduler plans the coming night for every household, and the Echo shows it as a waiting notification.
  • Savings are quoted against a typical start, never against the evening peak. The car alone moves 7.3 kW of load out of the evening.
  • The same server works in Claude, ChatGPT and VS Code: add the guest endpoint, or sign in with OAuth and pick a household.

Tonight's prices as a tide: high water is dear, low tide is cheapest, and the display says when to start the dishwasher.

How we built it

  • MCP server: Next.js route handlers with mcp-handler and the MCP TypeScript SDK v2, stateless Streamable HTTP, serving MCP 2026-07-28 natively and 2025-11-25, 2025-06-18 and 2025-03-26 through initialize. Nine tools with voice-first results, all four annotations and Alexa+'s invoking/invoked strings.
  • MCP App view: one ui:// resource with an inline layout for chat hosts and a full-screen device layout for the Echo Show.
  • Alexa+ simulation: the Echo Show simulator is a real MCP host in the browser. Each turn goes to Amazon Nova Micro on Bedrock (Converse API, SigV4 in a few lines of node:crypto, no SDK); Nova picks the tool, the browser runs it over MCP and Polly speaks the reply. Each model turn takes 1.0 to 1.3 seconds end to end from India to Sydney.
  • On AWS: the whole Next.js app on Lambda (Node.js 22, arm64) behind a response-streaming Function URL and CloudFront, which adds a secret origin header so nothing reaches the function around it. Households, tonight's plans and OAuth token hashes in S3 with If-Match writes. Two EventBridge Scheduler runs a night; on 18 October the 16:45 run planned about 70 households. CloudWatch turns one log line per tool call into metrics, a dashboard and an alarm. One CloudFormation stack, deployed by one boto3 script.
  • Planner: every half-hour start that fits is priced across the slots it covers, with cheapest, greenest and balanced goals.
  • The website draws tonight's prices as a moonlit tide, server-rendered SVG on screen with the first paint, and shows each answer the way an appliance would: an orange LCD and a delay-start knob for each of tonight's four loads.

On AWS: one Lambda function behind CloudFront, Nova Micro on Bedrock, Polly, S3, EventBridge Scheduler and CloudWatch.

Challenges we ran into

  • Alexa+ MCP integrations are in preview for brands only, so there was no way to try Lowtide inside a real Alexa+. We built the closest honest substitute: a real MCP host with a real model on Bedrock, rendering the real MCP App view on a device-sized screen.
  • Voice changes everything: one sentence, times said the way people say them ("half seven", "by tomorrow morning"), and a screen readable across a kitchen. The exact start the model needs to save a run goes in a line marked for the assistant, never spoken.
  • AWS in an organisation: the policy blocked Bedrock API keys, IAM OIDC providers and every region but Sydney, so we signed every request with SigV4 and kept everything in ap-southeast-2.
  • Behind a Lambda Function URL, the OAuth challenge header is renamed, and CloudFront Functions don't run on error responses (friction log 15 and 16); clients discover sign-in through the well-known documents instead.
  • The nightly schedule's first guard refused the real scheduled call; a per-deploy token fixed it (friction log 14).

Accomplishments that we're proud of

  • A full voice conversation (plan, yes, saved, "is now a good time") on Amazon Nova Micro against live prices, 2.6 to 3.3 seconds from question to answer on AWS.
  • One MCP App view that works as a chat card and as a full device screen, and OAuth 2.1 for Alexa+ account linking, tested end to end with the MCP SDK's own client.
  • Countertop, an open-source bench (17 tests, CI) to test any MCP server the way a smart display would, and a fix sent upstream: vercel-labs/mcp-handler#200, an opt-in CORS option with 11 tests.
  • Honest numbers: savings against a typical start, latency measured on the live stack, and 16 friction-log entries for the Amazon teams.

What we learned

  • MCP Apps are the natural shape for Alexa+ on screens: the server owns its view, and every host renders it the same way.
  • The first line of every tool result should be something you'd be happy to hear spoken.
  • The impact is in kilowatts: the car and the hot water are what move real load.

What's next

  • Who pays: the household keeps the saving, but the natural buyer is the energy supplier, which needs load moved out of the evening peak. Britain already pays for that: the Demand Flexibility Service had 2.46 million households and businesses signed up by March 2026 and paid £943,983 for 3,917.7 MWh in winter 2024/25. With every British meter moving to half-hourly settlement by 7 May 2027, the route to market is a supplier-branded Lowtide on Alexa+.
  • Proactive notifications on a real Echo, once Alexa+ opens them to MCP servers.
  • Matter smart plugs and appliance APIs, so a confirmed plan can start the machine itself.
  • More tariffs (Octopus Go and Intelligent, PG&E, Tibber) and US carbon data.

Built With

  • agent-skills
  • alexa-plus
  • amazon-bedrock
  • amazon-cloudfront
  • amazon-cloudwatch
  • amazon-eventbridge
  • amazon-iam
  • amazon-nova
  • amazon-polly
  • amazon-web-services
  • aws-cloudformation
  • aws-lambda
  • aws-sigv4
  • carbon-intensity-api
  • mcp
  • mcp-apps
  • model-context-protocol
  • next.js
  • octopus-energy-api
  • streamable-http
  • svg
  • typescript
  • web-speech-api
Share this project:

Updates

Submission history