Inspiration
Chess is played by hundreds of millions of people, but almost every chess app assumes you can see a screen and use your hands. We wanted chess you can play the way you'd talk to a friend: "Alexa, let's play the bot… knight to f3… where are my pieces?" That makes the game open to people who are blind or have low vision, to people who are cooking or resting, and to anyone who simply likes to talk.
What it does
Vocal Chess is an Alexa+ add-on built as a self-hosted MCP server (spec 2025-11-25, Streamable HTTP), plus a web simulator of the Alexa+ experience.
- Play the bot at five levels, powered by Stockfish. The bot answers like a person ("Hmm, let me see. I'll take your knight on f6."), names the opening as it appears, and stays fast enough for Alexa's 500 ms limit.
- Checkmate puzzles: mate in one and mate in two (61 puzzles), plus a daily puzzle. You get a hint ladder, streaks, and "skip" or "another one".
- Natural speech, not notation. "Night to see three", "pound to h3" (speech-to-text for "pawn"), "knight takes bishop on d4", "take the queen", "castle long", "the left one". Ambiguous moves get a question ("Which knight? Say one for the knight on b1 or two for the knight on f3"). Illegal moves get an explanation and alternatives, never a dead end.
- Built for listening: "Where are my pieces?" and "What's on e4?" read the board aloud.
- Visual only when you want it: "show me the board" opens an MCP App board (
ui://voice-chess/board.html) on screen devices like Echo Show, and in the simulator. - Conversation that remembers context: yes/no follow-ups, "say that again", "main menu", small talk, and varied re-prompts instead of the same error line.
- Live MCP log in the simulator shows the real JSON-RPC traffic: initialize (protocol 2025-11-25), tools/call, results and timings.
How we built it
- MCP server: Node.js and Express with the official MCP TypeScript SDK v2 (
@modelcontextprotocol/server). It exposes 13 tools (start_game, make_move, get_game_state, describe_board, get_hint, undo_move, resign_or_draw, show_board, get_daily_puzzle, start_puzzle, solve_puzzle, puzzle_hint, give_up_puzzle). 10 of them link to the MCP App board built with@modelcontextprotocol/ext-apps. - Alexa+ account linking: OAuth 2.1 authorization code + PKCE (S256), RFC 9728 Protected Resource Metadata, and a 401 without WWW-Authenticate, as the Alexa+ add-on docs require.
- Chess: chess.js for rules. Stockfish 17 (WASM) runs inside the server with capped think time, so a full voice turn takes about 15 ms (p50) and 87 ms (p95) server-side.
- Speech understanding: a homophone- and mishearing-aware move parser that matches only against legal moves, tested with 170+ real phrasings.
- Puzzles: generated offline from Stockfish self-play analysis. Each one has a single correct line, verified to end in checkmate.
- AWS (free tier): Lambda (arm64) behind a Function URL, the Lambda Web Adapter, DynamoDB for games, puzzle streaks and one-time OAuth codes, SSM Parameter Store for secrets, EventBridge Scheduler for warm-ups, and CloudWatch Logs. Everything is deployed with AWS SAM.
- Simulator: a minimal Alexa-style web page with a voice-reactive orb (WebGL), always-on listening (Web Speech API), the board on demand, and the live MCP log. It calls the same
/mcpendpoint Alexa+ would. - Quality: 463 automated tests, an end-to-end smoke test (OAuth → every tool), and a latency benchmark.
Challenges we ran into
- Speech recognisers mangle chess. "b1" became "BB" and "Deewan"; "pawn" became "pound". We built a context-aware parser plus a remembered "which piece?" question, so short answers like "one" or "the left one" work.
- The 500 ms Alexa+ limit vs a chess engine. We cap Stockfish's think time and pool engines. The "thinking" pause is added in the speech and on screen, never on the server.
- Serverless state. Lambda forgets everything between calls, so games, streaks and OAuth codes live in DynamoDB with optimistic versioning.
- Tooling access. The
alexa-aiCLI needed to register an add-on is gated behind private-preview access, so we took the hackathon's simulated-Alexa+ path for the demo while keeping the MCP server fully compliant.
Accomplishments we're proud of
- Truly hands-free play: one tap to start, then just talk.
- No dead ends: every unclear or illegal move gets a helpful spoken answer.
- A spec-compliant MCP server with OAuth, MCP Apps and real latency numbers, running at $0 on the AWS free tier.
What we learned
How to design MCP tools for an LLM caller (clear names, "when to use" descriptions, voice-ready speech fields); how strict Alexa+ account linking is; and how much of voice UX is about recovering gracefully from mishearings.
What's next
Registering on Alexa+ once add-on access opens, online play against other people, a "show it on my Fire TV" board, and spoken coaching after each game.
Built With
- alexa
- alexa-plus
- amazon-cloudwatch
- amazon-dynamodb
- amazon-eventbridge
- aws-lambda
- aws-sam
- aws-systems-manager
- chess.js
- css3
- express.js
- html5
- javascript
- mcp
- mcp-apps
- model-context-protocol
- node.js
- oauth2
- stockfish
- vitest
- web-speech-api
- webassembly
- webgl
- zod
Log in or sign up for Devpost to join the conversation.