Sideline
Inspiration
You want the score. So you stop what you are doing, unlock your phone, open an app, search for the match, scroll. Or you just ask. For someone who cannot see a screen, asking is not a shortcut: it is the only way in. A televised match is a picture with an audio track attached. The score sits in a corner, the line-ups flash on a graphic nobody reads out, and the commentary talks to the picture ("what a chance!"). A blind fan watching with a friend turns and asks. Alone, there is nobody to ask. Sideline is that friend, and the same friend helps anyone whose hands or eyes are busy, or who would simply rather not search and type to find out what is happening.
What it does
You ask out loud, it answers in a sentence or two, and you can interrupt at any time.
- It remembers you. The server keeps what each listener has already been told, so "what did I miss?" needs no time range and never repeats itself.
- It says what it knows and what it does not. Every fact comes from a tool, never from a model's memory. It will tell you the feed has no referee, no honours, no half-time score, no play-by-play for an NFL game if it fails to fetch, and it will not guess.
- Five sports, one set of tools: football, basketball, American football, hockey and baseball. The clock changes its own words (90', Q3, P2, an inning), a player's night comes from the box score, and league leaders, standings, schedules, line-ups and injuries work the same way.
- A screen for the people who can use one. A bare score strip with a full-width timeline, a pitch of the line-ups drawn home-left and away-right, large type and high contrast, a typing mode that still reads the answer aloud, and live commentary that never talks over you.
How we built it
An MCP server (spec 2025-11-25, Streamable HTTP) written in standard-library Python, 30 tools, in one folder. A web page plays the part of Alexa+, so it can be tried by voice. Four AWS services do real work:
- Amazon Bedrock: Amazon Nova Pro reads the tool list and chooses the tool in the simulator (it picked the intended tool on 77 of 79 phrasings in our routing check); Mistral Voxtral and Amazon Nova 2 Sonic turn speech into text.
- Amazon Polly: the voice, with word timings so the screen follows along.
- Amazon DynamoDB: one table with each listener's memory and the match event log, behind a write-through cache after we measured the round trip from Mauritius.
- Live data from ESPN's public endpoints, cached for seconds only, never longer.
The official MCP Python SDK client connects to it, lists the tools and calls them. It also runs on its own: a test copies
the sideline/ folder alone to an empty directory and starts it there.
Challenges
We kept a friction log of 28 entries (task, steps, expected, actual, severity, workaround, suggestion) and 9 feature requests. The add-on tooling is partner-only, so we built a faithful simulated client. A "one attempt" setting in the Bedrock SDK was two. A first question took 11 seconds because 26 DynamoDB calls ran in a row at about 340 ms each. We told a listener the wrong team had scored, because we believed a goal list over the feed's own score. Our simulated assistant was slower than we had documented.
The most useful thing we did was ask it the questions fans actually ask, 150 of them on real matches (50 about one
football match, 100 across basketball, American football, hockey, baseball and football), read every answer, and fix the
tools. The first pass was poor: 23 of the first 50 were weak, and in the second batch a false "Did you mean...?" blocked
about 15 of 100 questions. We fixed the tool descriptions and the lookups, added league leaders, a player's night, who
pitched and the playoff series, and re-asked. The final run of the 100 was 85 good, 13 honestly "not in the feed" and 2
partly right. Every question and answer is in docs/CURIOSITY_QA.md, including the ones that were wrong.
What we are proud of
- A server that holds what no client can: per-listener memory and a clock-exact spoiler guard, both under test.
- Truth over fluency: it declines rather than guesses, and says so.
- 65 offline test suites that need no network or credentials, 150 real questions with their answers published, a routing check across four Bedrock models, and the official SDK run against the server.
- Candour: the README lists what is not done. It is not on real Alexa+, there is no OAuth, it serves one listener per deployment, and the data source is unofficial.
What we learned
A tool's description is product surface: most of our routing failures were fixed by saying what a tool is not for. The model picks the always-offered tool for anything out of scope, so out-of-scope questions need a plain answer, not a tool. Live means live: caching a score for a minute makes an assistant wrong in front of the person who trusts it.
What's next
- Host it and connect a real client: the README has the steps. The Alexa+ add-on with account linking is the step Amazon controls.
- More leagues and sports as new profiles, not rewrites.
- A way for a server to speak first, so "goal" can arrive the moment it happens, still held back to the listener's picture.
- The same design, a marker per listener and a list of what changed since they last asked, suits a delivery, a flight or a market.
Built With
- alexa+
- amazon-bedrock
- amazon-dynamodb
- amazon-nova-pro
- amazon-nova-sonic
- amazon-polly
- amazon-web-services
- boto3
- espn-public-api
- html5
- javascript
- json
- mistral-voxtral
- model-context-protocol
- node.js-(tests)
- python
- streamable-http
- web-audio-api

Log in or sign up for Devpost to join the conversation.