Track fit: a self-hosted MCP server implementing MCP 2025-11-25 over Streamable HTTP, for the Alexa+ track. It is hosted on AWS and works today on a real Echo through Amazon Bedrock AgentCore, Strands and Amazon Nova 2 Lite.

The problem

Families with kids are one of Alexa's biggest opportunities, and most of them never get the value. The games exist. What's missing is an easy, practical way to find the right game, at the right time, for the right family. I believe this is the biggest barrier between families and Alexa, and I've talked with thousands of customers about it.

At SayKid's holiday pop-up shop alone, we talked with about 1,000 families a season for three seasons. 99% knew Alexa and about 25% owned a device. But only about 1 in 20 knew Alexa could do more than play music, set timers and, for some, make fart noises.

Everyone has tried to close that gap, and nothing has really worked:

  • SayKid made one-page handouts and a searchable game library online. We also built a decision-tree skill, the Learning Library, that asks five or six questions and then names one title. Its most repeated line is "Would you like to hear about another game like this?" Magic Card Trick has been in it for years, and almost nobody reaches it.
  • I email customers one on one.
  • Alexa sent long emails, built a website for educational games, and lists hundreds of kids' games in the Alexa app, many with near-identical names and pictures.

None of these worked because none of them are interactive, and none of them capture context: who's playing, what's happening right now, and what this family likes.

The one thing that does work doesn't scale: me. When I meet a family, I ask how many kids they have, whether they get along, what they like to do for fun, and whether they like board games or sports. Then I circle a short list of games to start with. Game Closet is that conversation, built into Alexa.

What it does

Game Closet is an MCP server for Alexa+. A parent says what's going on at home in their own words. Game Closet answers with one or two games that fit right now, in one line each, then says exactly how to open the one they pick. These are real replies from the server:

Parent: My two kids are fighting again. Alexa: Oh brother! In Kids Court, kids state their case and their ToyBot will determine if they're guilty or not! Would you like to try Kids Court? Parent: Yes. Alexa: Awesome! [gavel] Order in the court! Call my name, then say: open Kids Court! Thanks for checking out the Game Closet! It's open anytime! Buh bye! [door closes]

Parent: We have a deck of cards and want to show Grandma a trick. Alexa: All righty! In Card Trick, a player picks a card from the dealer's hand, and their ToyBot guesses it! Or in Magic Card Trick, a grown-up deals the cards, a player picks one, and their ToyBot guesses it! They need a deck of cards! Would you like to try Card Trick or Magic Card Trick?

The second exchange is the game the decision tree could never reach.

Tech Implementation

The language model never picks the game. A model that picks will eventually name a game that doesn't exist. Nova 2 Lite turns the parent's sentence into tool arguments (players, ages, minutes, what's in the room, purpose). A deterministic matcher in TypeScript does the choosing in two stages:

  • Hard filters decide what is possible. A game that needs a mat is excluded when there is no mat, not ranked lower. The same goes for a game needing an adult when a child is alone, a 20-minute game when there are 5 minutes, or an age range that doesn't fit.
  • Scoring decides what is best among the rest, on purpose, format, energy, skills, age fit, time fit and text match. Each result carries the reason it scored, so the reason Alexa could give is the real one.

At most one question, and only when it pays. For each missing fact, the server runs the matcher once per plausible answer and counts how far the shortlist moves. It asks only if the best question changes the shortlist by 2 or more games, and never twice in a conversation. "They're fighting over who goes first" gets no question. "We're bored" gets "Do you want to get them moving, playing a board game, or playing sports?" The question is an MCP elicitation on the open tool call, so the server decides whether to ask, not the model.

The server writes every spoken word. Each reply comes back as a finished speech string with markers for Alexa speechcons and sound effects. The agent reads it word for word, and the bridge's Lambda turns the markers into SSML. Keeping the words in code, not in a prompt, is what keeps the voice rules from drifting.

The conversation is guarded in code. "Yes" can only start a game from the most recent offer. "Something else" keeps the household facts (players, ages, time, room) and drops the intent, so the next two games are different but still fit. One game is offered as a plain yes-or-no question ("Would you like to try Kids Court?"). A "no" gets "Would you like to try something else?" before more titles are read. Optional arguments the model gets wrong are dropped instead of failing the call. And it knows its limits: "I like pickles" gets "Sorry, we don't have any games like that yet!" instead of three random games, while what kids are into still finds a game (dinosaurs and unicorns reach Animal Magic, garbage trucks reach Guess My Mover), and asking again when nothing fits closes the closet instead of looping. A misheard pick, like "join game" heard for Drawing Game, gets "Did you mean Drawing Game?" instead of a new search.

Hosting. MCP protocol 2025-11-25 over stateful Streamable HTTP, on one ARM EC2 instance (t4g.micro, about $6 a month) behind CloudFront, deployed with CDK. It is a long-running process rather than a Lambda because an elicitation's answer arrives as a separate request that has to reach the process that asked. Only CloudFront can reach the instance.

Tests. npm test runs 88 checks with no account or network, including one that the server negotiates MCP 2025-11-25 over Streamable HTTP: determinism (every demo query run twice must match), each hard filter on its own, conversations across turns through a real MCP client, and the question end to end over HTTP.

A multi-service AWS pipeline. Amazon Bedrock (Nova 2 Lite), AgentCore Runtime and a Strands agent understand the parent. AWS Lambda turns the server's speech into SSML. Amazon EC2 and CloudFront host the MCP server, and AWS CDK deploys all of it. Development itself was agentic: Claude wrote and tested the code with me, and I tested every change on a real Echo.

Design

Game Closet follows the voice rules SayKid uses in its games, and each one is enforced in code:

  • Two games at most, because a parent can't hold three titles by ear. The second game starts with "Or in" so the two sound like a choice, and a two-game offer asks "Would you like to try Card Trick or Magic Card Trick?" A "neither" brings two different games
  • The question goes last. Alexa keeps the microphone open after a question, so every reply ends on one.
  • Every reply opens with an acknowledgement, rotated so no two turns sound the same. After a "no" it is neutral (fiddlesticks, drat), never cheerful.
  • One line per game, in the same pattern: "In Kids Court, kids state their case...!" Lines live in a spreadsheet column and are read exactly as written.
  • What a game needs is said once, grouped: "Sink My Ship plays on a game mat from SayKid! Robot Ravers needs room to move!"
  • Sound carries the closet idea. A door creaks open on launch, "something else" gets one of five "keep looking" lines and a rummage through the closet, Kids Court gets a gavel and the card tricks get a shuffle. The door shuts after every hand-off and on goodbye.
  • It never says "quiet", because on Alexa that word can stop the skill.

Privacy. Game Closet is for parents, and it keeps nothing about their kids. The bridge's short-term and long-term memory are switched off, every Alexa session starts a fresh conversation, the server writes nothing to disk and it forgets a conversation after 30 idle minutes.

Potential Impact

  • For families: the 19 in 20 who don't know Alexa can do more than music and timers don't need to know a title. Game Closet starts from what's happening ("they're fighting", "we're in the car", "she loves dinosaurs") and asks only what a person would ask.
  • For SayKid: every live game reachable from one sentence, including ones the decision tree buried. The catalog filters out anything retired, in development or broken, so nothing is offered that a family can't play today.
  • For the Alexa ecosystem: every maker of kids' skills has the same discovery problem. The catalog is a plain spreadsheet with one row per game and 23 columns: lifecycle, players, ages, minutes, what it needs in the room, purpose, themes, the spoken line and the invocation name. Any maker could publish one in this shape, and Alexa+ could search all of them the same way.

Quality of the Idea

Game Closet is not a wrapper around an existing API, because there wasn't one. SayKid's games had no structured data, so we built the catalog model first (one row per game, 24 attributes). Then we put the product's logic in the MCP server itself:

  • The server decides when to ask. It uses MCP elicitation to ask one question in the middle of a tool call, and only when the answer would change the shortlist by two or more games. SayKid's old flow asked six questions every time.
  • It keeps state across turns. It remembers what it offered, what was turned down and what the family said about their household. So "something else" moves on, and "yes" can only start a game that was just offered.
  • It owns the voice. Every word Alexa says, including the speechcons and sounds, comes from the server, so a maker keeps its own voice inside Alexa+.
  • It hands off to the maker's game. start_game ends with the exact phrase that opens the game's own skill. That's the step we'd like Alexa+ to do directly.

We chose not to keep state across sessions. The audience is parents, and the data would be about their kids. The roadmap version is opt-in for parents and set up in the Alexa app. It would hold only which mats a family owns and the kids' ages, never transcripts.

Challenges

  • Alexa+ add-on tooling isn't public yet, so Game Closet runs on a real Echo through Kay Lerch's open-source Alexa Skill MCP Bridge (an Alexa skill, a Lambda, and a Strands agent on Bedrock AgentCore). With add-ons, a parent would just talk to Alexa; today they say "Alexa, open Game Closet" first.
  • The model wanted to ask before searching. Nova kept asking for the kids' ages instead of calling find_games. Server instructions helped; turning off the bridge's own ask tool fixed it.
  • An old agent kept answering after a deploy, because AgentCore keeps a runtime session per Alexa user. We added a fresh conversation per Alexa session.
  • AgentCore caps each environment variable at 2,048 characters. Our config with sound URLs was 2,458, so the agent now gets a trimmed copy.

What's next

  • Open the game directly. Today Alexa says "Call my name, then say: open Kids Court!" If Alexa+ lets an add-on open another skill, start_game is the only code that changes.
  • Household memory, opt-in, for parents. Which mats they own and the kids' ages, set up in the Alexa app, reviewable and deletable. Never transcripts, and not before a parent can consent in a way voice can't verify.
  • A maker preference. Families who trust a maker could ask Alexa to look in that maker's closet first.

Try it yourself

  1. Run the tests. With Node 20, run npm install and then npm test. No account or network is needed.
  2. Call the live server. Run npx @modelcontextprotocol/inspector, choose Streamable HTTP, and connect to https://dv22er0jjbymv.cloudfront.net/mcp. Call find_games with {"query": "my two kids are fighting again", "players": 2}, then start_game with {"gameId": "kids-court"}. Each reply shows the shortlist, the reason for each game and the exact words Alexa speaks.
  3. Run it on an Echo. The README's "Running it on a device" section has the steps.

Built on

Kay Lerch's Alexa Skill MCP Bridge, Apache 2.0. Our changes are listed in the repo's bridge/ folder: speechcon and sound markers rendered as SSML, the session kept open on any question, a fresh conversation per Alexa session, an option to turn off the agent's ask tool, a launch sound and goodbye line, the trimmed agent config, and a fix for deploying from Windows.

What's new

Everything in the repo was written during the submission period: the catalog model, the matcher, the one-question logic, the voice layer, the MCP tools, the tests and the AWS hosting. What existed before is the SayKid games that Game Closet recommends and hands off to, and the open-source bridge it runs through.

Built With

Share this project:

Updates

Submission history