Inspiration

Many households pay for several streaming services all year, but each service is only needed for the few months when a show someone follows is airing. Turning services off and on by hand is the obvious fix, and almost nobody does it, because it means tracking every person's shows, every billing day and every price. It is also a household decision: one person is still halfway through a show, a grandparent wants the cooking channel this month, a teenager wants everything.

A kitchen Echo Show is where the whole family already talks to one assistant. That made Alexa+ the right place for this: one device, several voices, a screen that can show the plan, and an assistant that can speak first before a billing day.

What it does

Season Pass is an Alexa+ add-on built as a remote MCP server. It keeps a household's streaming plan: which service is on in which month, so that nobody misses an episode they follow, at the lowest cost. Anyone in the family changes the plan by talking to the kitchen Echo Show; the planner re-plans in about a tenth of a second.

In the demo household (fictional people, services and shows), the plan through April costs $96.90 against $368.70 for keeping every service on. After Marcus adds his show it is $112.39, still $256.31 below keeping everything on.

  • Morning briefing. Three days before a billing day, Alexa+ speaks first: "Lumen renews Thursday for 15 dollars and 49 cents. The plan lets it go."
  • One sentence re-plans. Marcus says "Hold on, I'm still watching that show." The exact planner re-plans the six months in about 100 ms. Lumen still goes off Thursday but comes back November 26, inside Marcus's 30-day catch-up window, for $15.49 more, with every followed episode still in time.
  • Speaking for someone else. Dana says "Grandma wants the cooking channel this month." Tidewell comes on November 5, and Lumen's month moves to December 5 to stay under the household's limit of two services at once.
  • Two-step money. "Okay, set it up" computes every amount and date in code. Nothing changes yet.
  • The server, not the model, decides who may approve. Leah, 15, says "Yes! Do it." Claude passes her yes to confirm_switch, and the server refuses it with not_authorized. Marcus says yes and it goes through.
  • Undo until the billing day, reminders that are spoken in the briefing on the right morning, and explanations per person ("Orbit is on November 25 for The Copper Meridian, episodes 1 to 7, for Dana and Marcus").

Every reply has a symbol-free speech field for voice-only devices and a small card plus a rotation calendar for the Echo Show screen.

Who uses it and who pays. The household uses it, on a device it already owns. The money saved is the difference between paying for every service every month and paying only for the months in the plan; in the demo household that is about $256 over six months. Season Pass itself would be a free add-on; the services keep their normal prices. Nothing here is a new subscription.

Pre-existing work. The repository started on 2026-10-13 as "RenewWise", an earlier idea in the same repository about renewal decisions. Kept from it: the stateless MCP transport, the simulator shell and the two-step confirmation pattern. Built during the hackathon period for Season Pass: the rotation model and exact planner, the 50-household evaluation and the hard set, voice-sourced re-planning, the calendar screen, the pluggable conversation layer (rules and Claude), reminders, undo and explanations.

How I built it

MCP server. TypeScript, official MCP SDK, protocol version 2025-11-25 over Streamable HTTP, stateless, served at /mcp from a Next.js app on Vercel. Eight assistant tools:

Tool What it does
get_household Members, who can approve charges, services, the plan, pending confirmations. With briefing=true, the proactive morning opener.
plan_rotation Recomputes the cheapest month-by-month rotation.
explain_plan Which shows and which people each paid month is for. Read-only.
record_preference A voice change (follow_title, drop_title, want_service, set_pace, set_limit). Re-plans immediately and returns what changed and what it costs.
propose_switch Step 1 of 2: the plan's actions in the next days, with amounts and dates. Nothing changes.
confirm_switch Step 2 of 2. Idempotent.
schedule_reminder Spoken in the briefing on the due morning.
undo_switch Reverts the latest switch until its first date.

Two host-only tools (demo_advance_clock, demo_reset) are marked in _meta and never offered to the model. Refusals come back as isError with a rule code, so the screen can show that the server said no.

Planner. An exact mixed-integer program solved with HiGHS (WebAssembly, inside the MCP server). For each optional service and each day, a binary variable says whether a one-month paid period starts there. Constraints: never pay twice for the same days; at most N services at once, counting access that is already paid; each (episode, follower) pair needs at least one day of access between the release and that person's "watch within" days, or it counts as a miss. Objective: fewest misses first, then lowest cost. A tie-break keeps the previous plan's months when cost is equal, so one sentence does not reshuffle unrelated services. The planner is cross-checked against brute force on 25 small households in the tests.

Money and confirmations in code. confirm_switch only succeeds for an adult with billing authority, in a later turn than the proposal, within 10 minutes, and only if the plan did not change in between (otherwise stale). Adults can record a preference for another member; a teen cannot. Amounts, dates and savings in every spoken line come from tool results.

Claude as the conversation layer. The simulator is a real MCP host: the official SDK client talks Streamable HTTP to the server, and a panel shows every JSON-RPC call. In Claude mode, Claude (Opus 5.5, low effort) gets the server's own tool list over MCP and decides which tool to call; the browser runs the call against the MCP server and sends the result back. The system prompt tells Claude to use tools for every fact and to pass any "yes" to confirm_switch and let the server decide. A full run of the 8-step demo script took 16 API calls and about US$0.16. There is also a rules mode with no AI that runs the same tools, so the demo works without a key.

Caps. The public demo limits Claude mode per browser per day (US$0.35 or 40 steps), per day (US$0.75) and per month (US$2). When a cap is reached the simulator says so and finishes in rules mode with the same tools. The Anthropic workspace has its own monthly limit as the hard backstop. The log of the Claude-mode run used in the video is in the repository at eval/out/claude-mode-video-run-2026-10-14.json (18 API calls including the reminder morning, about US$0.18, every tool call and reply).

Baseline. To check what the planner adds, I gave Claude Opus (medium effort, 32k output tokens, no tools) the same household data and rules text and asked for a plan, then scored both plans with the same code.

16 hard households (3 to 5 people, limit of 1 or 2 services) Planner Model alone
Matches the optimum (no extra misses, cost within 5%) 16 / 16 5 / 16
No answer (ran out of tokens) 0 4
Households with avoidable misses (episode, viewer pairs) 0 6
Time per plan (median) 0.2 s 249 s
Cost per plan no API cost US$0.50

On an easier set of 44 households the model matched the optimum 75% of the time with a 33-second median. It never broke a rule. Its misses are the kind a family notices: an episode that becomes unwatchable, a plan up to 21% more expensive, or no answer. On the hard set the model also overspent by up to 22% in two households.

Challenges I ran into

  • No Alexa+ test host. The Alexa+ developer tools are limited to launch partners, so I built an Echo Show style simulator that is a real MCP client, and kept the server independent of it.
  • Stateless Streamable HTTP on serverless. The official client opens a GET stream after initialize; the stateless transport answered 200 and closed it, and the client reconnected in a loop. Answering GET with 405, as the spec allows, fixed it.
  • Who is speaking. I found no documented way for an add-on to learn which family member spoke, and the whole money rule depends on it. The simulator sends the speaker in a header that stands in for voice recognition.
  • A proactive moment. I found no documented way for an add-on to ask Alexa+ to speak first. The morning briefing is a host event that calls get_household with briefing=true.
  • Budget for the baseline. Answers on the hard set cost about US$0.50 each and took about four minutes, so a US$9 cap covered 16 of 50 hard households. I report those 16, not an extrapolation.

Accomplishments that I'm proud of

  • The planner is exact, and the tests check it against brute force.
  • A teenager's "yes" cannot approve a charge, even when the model passes it on. That rule lives in server code and the tool panel shows the refusal.
  • One spoken sentence re-plans six months in about a tenth of a second, fast enough to do on every turn.
  • The same eight tools work with Claude or with no AI at all.

What I learned

  • A model on its own gets this kind of problem right often, but not reliably, and slowly. The useful split was: the model listens and picks tools, code does the arithmetic and the money rules.
  • Voice output needs its own field. Writing speech separately from the card (money in words, no symbols) made the replies sound right.
  • Measuring the plain model on the first day told me what the planner had to add, before I built the rest.

What's next for Season Pass

  • A real schedule source for release dates and real billing dates per household.
  • Plugging switches into the services' own subscription management, starting with channels billed through an Amazon account.
  • Speaker identity and a scheduled trigger from Alexa+ itself, if add-ons get them.
  • Viewing pace from history instead of a fixed "watch within" number per person.

Limits

  • Alexa+ is simulated. The web simulator is the MCP host.
  • Every service, show, price and family member is fictional. Not affiliated with Amazon.
  • No money moves. Switches and charges are written to a ledger; no real service is turned on or off.
  • Speaker identity and the proactive trigger are simulated: the simulator sends the speaker in a header, and a "morning routine" button stands in for a scheduled trigger, because I found no documented way for an add-on to receive either from Alexa+ (friction log rows 4 and 7).
  • Claude mode is capped on the public demo. Rules mode understands only the demo's kinds of sentences.
  • The baseline used one model setting (Claude Opus, medium effort, no tools). A model with tools might do better.
  • In the video, the 3 to 10 seconds Claude takes per turn are cut; a caption on each turn shows the real wait.
  • The Alexa+ voice in the video reads the first sentence or two of Claude's actual reply for each turn, so the video stays under three minutes; the full replies are in the run log in the repository.

Built With

  • anthropic-api
  • claude
  • highs
  • mcp-typescript-sdk
  • model-context-protocol
  • next.js
  • react
  • typescript
  • vercel
  • vitest
  • web-speech-api
  • webassembly
Share this project:

Updates

Submission history