Inspiration

Every couple and family knows the ritual: forty minutes of scrolling, then giving up on the remote. Star ratings don't settle it either. Critics aren't normal viewers, and a 7.1 on one site tells you nothing about whether you (or the person next to you) will enjoy it. We wanted to just ask out loud, "What should we watch tonight?", and get three good answers that someone in the room hasn't already seen.

What it does

Tonight's Pick recommends three movies or shows you haven't seen, that fit your taste, and that real viewers actually liked.

  • Ask by voice. We built a real, self-hosted MCP server with five voice tools that an Alexa+ device can connect to:
    • tonights_pick: "a fun family movie about Halloween" returns three picks, read out with their scores.
    • real_people_score: "How good is Hereditary?" returns "94 percent of viewers liked it, based on 314 opinions."
    • rate_title: "Thumbs up for Hereditary." It always asks before saving.
    • pick_for_two: "Pick something for the two of us; my partner loves Ted Lasso." It returns the title the less-excited person still likes.
    • link_profile: a one-time 6-digit code links the voice profile to the web profile.
  • The Real People Score: the share of ordinary viewers who liked a title, read from public YouTube comments, Bluesky posts and TMDB reviews, and compared within its genre ("beats 82% of horror we've scored").
  • Requests the server actually enforces:
    • runtime ("under 2 hours"), streaming service, family rating, original language;
    • topic ("about Halloween", via TMDB keywords);
    • never anything you've seen, disliked or skipped.
  • Pick together for 2–5 people: one link, everyone brings their own likes, and the pick favors what the least-excited person still likes. A taste match for every pair, plus shareable cards.

Important: we don't have an Alexa+ device, so the demo uses our simulated Alexa+ page (/alexa), which the rules allow. It calls the exact same /mcp endpoint an Alexa+ device would, and shows every tool call live. Phrase matching picks the tool in the simulation; on a real device, Alexa+ decides.

How we built it

  • MCP server: the official MCP TypeScript SDK (protocol 2025-11-25) over Streamable HTTP on Fastify, with bearer-token auth.
    • It returns structured content plus a short spoken answer (scores in words, at most 25 words per pick, never a URL).
    • We verified it with MCP Inspector (tools/list, tools/call).
  • API: Node 22, Fastify, Prisma and Postgres (Neon), with pg-boss jobs on Railway.
  • Web: Next.js 15 on Vercel.
  • The picker: an agent on NVIDIA Nemotron (Nebius Token Factory) that calls tools for taste (Qloo), titles, keywords and where to watch (TMDB), and scores.
    • The server checks every answer: picks must come from tool results, meet every constraint, and clear a reception floor.
    • The server writes the "why it fits you" line from verified facts, so the model can't invent one.
  • The score:
    • Comments are collected through official APIs and cleaned (spam, duplicates, off-topic, comments about the video itself).
    • Nemotron 3 Nano classifies each comment as liked, mixed, disliked or not an opinion; Nemotron 3 Super double-checks the hard cases.
    • We count confident, first-hand opinions with a Wilson confidence margin, then compute the percentile within the genre.

Challenges we ran into

  • Voice answers have to be short and true. Raw taste tags read aloud sounded broken ("Think comics." for Succession), so spoken picks give just the title, year and score.
  • "We" is ambiguous. "What should we watch?" briefly turned into a group pick for an older group. Now a group pick needs clear wording ("both of us", "my partner") or the group page.
  • Two people, one TV. Picking what both like means ranking every candidate for each person separately and choosing by the worse fit, not the average.
  • Quotas and costs:
    • YouTube's quota resets at midnight Pacific, not UTC.
    • Model reasoning tokens silently used up a summary's whole budget.
    • We added spend caps, a visible "scoring paused until…" state, and restart recovery.

Accomplishments that we're proud of

  • A real, standards-based MCP server behind the voice experience, not a mock. The same server powers the web app.
  • rate_title confirms before saving anything, and the voice rules are covered by unit tests.
  • Honest answers: if a topic can't be checked, or a score isn't ready yet, it says so instead of guessing.
  • Pick together for up to five people, with taste matches and shareable cards.

What we learned

  • Voice UX is mostly about what not to say: no URLs, no long lists, numbers in words, and always a confirmation before writing.
  • Let the server enforce the rules, and let the model talk. Grounding every claim in checked data made the answers both shorter and more trustworthy.
  • MCP made it easy to build one server for voice and the web.

What's next for Tonight's Pick

  • A real Alexa+ device and Fire TV: picks shown on the TV and "play the second one", then a thumbs-up when the credits roll.
  • Account linking with OAuth (replacing the 6-digit code), so households can link several profiles.
  • Getting off the hackathon key: replacing Qloo with TMDB recommendations plus our own users' ratings after the hackathons.
  • A small subscription: 3 free picks, then $1.99/month or $15/year.

Open source: MIT licensed, github.com/gunnerhowe/TodaysWatch. The same codebase is also entered in the Nebius x NVIDIA and Qloo hackathons.

Live app: https://todays-watch.vercel.app · Voice demo: https://todays-watch.vercel.app/alexa

Built With

Share this project:

Updates

Submission history