-
-
Spoken Letter for Alexa+
-
The simulated Alexa+ client at alexa.spokenletter.com/demo
-
Architecture: one MCP server behind OAuth 2.1, an agent on Bedrock, a real Echo and a simulated Alexa+ client
-
Opening the skill on an Echo Show 5 under Alexa+
-
Now Playing: a family story on the Echo Show, read by the aunt who recorded it
-
3-2-1: the recording countdown
-
The storyteller reads her script from the on-screen teleprompter
-
Name the story, then add music and sound effects
-
Recording saved, ready to send
Inspiration
Spoken Letter started from a simple wish: children who live far from their family should still hear their family's voices. In the Spoken Letter app, an aunt, a grandparent or a friend records a story in their own voice, and the parent delivers it to the child. Before this hackathon the stories played on a Yoto player. Many families already have an Echo in the kitchen or the bedroom, so we wanted a parent to be able to say "Alexa, play the story Aunt Jordan sent" and hear that voice right away.
What it does
- Plays family stories by voice. A parent asks for the newest story, a story from a named storyteller ("the story Aunt Jordan sent"), a story by title, the next one, or a shuffle. The real recording plays on the Echo through the AudioPlayer, with pause, resume, next and start over.
- Keeps the family loop going. The parent can save a wish for a new story ("I want a story about mermaids"), share a reaction, and hear their updates. An opted-in Echo can get an Alexa notification when there is an update.
- Shows how a story gets made on Alexa+. On an Echo Show, a storyteller starts a story by voice, picks a story pack, confirms the listener, answers a few questions, reads the script from an on-screen teleprompter with a 3-2-1 countdown, plays the take back, names it, adds music and sound effects, and sends it.
- Runs as an Alexa+ add-on. Behind the voice front end is a self-hosted Streamable HTTP MCP server with an OAuth 2.1 authorization server: the shape Amazon specifies for Alexa+ add-ons. A simulated Alexa+ client at alexa.spokenletter.com/demo runs a real agent (Strands Agents on Amazon Bedrock) against the same MCP server, with voice in through Amazon Transcribe and voice out through Amazon Polly.
What is real and what is staged in the video. Amazon does not yet give external developers a way to put an MCP add-on in front of Alexa+ customers, and a custom skill never receives the user's audio. So the device footage uses a development-stage custom skill on a real Echo Show under Alexa+, following a fixed demo script. Real: story playback by storyteller or title (skill, agent API, MCP server, delivered stories, AudioPlayer), the on-screen teleprompter, and saved creation progress in DynamoDB. Staged: the credit purchase (nothing is charged), the listener and the wish, the story conversation, the recording (playback plays a take recorded beforehand in the Spoken Letter app), the music mix and the send (nothing is delivered). The README lists this step by step.
Child safety. The add-on is the parent's tool. It exposes only stories the parent has deliberately delivered. No child account, voice or data exists on this path, and the video shows adults talking to the device.
How we built it
- MCP server. TypeScript with the MCP TypeScript SDK v2. One tool registration serves the 2026-07-28 specification and also answers the 2025-era
initializehandshakes (2025-03-26, 2025-06-18, 2025-11-25) that Alexa+ and the Local Inspector send. Three read-only tools: list family stories, get a family story, suggest the next story. Zod schemas give JSON Schema and validated structured output. - OAuth 2.1 authorization server. PKCE S256, client_credentials, RFC 8414 and RFC 9728 metadata, JWTs signed by an asymmetric AWS KMS key, state in DynamoDB with conditional writes ("use once", "rotate once").
- Agent. Strands Agents with a Bedrock model (Claude Haiku 4.5 by default) and an MCP client on the same
/mcpendpoint, reached through Amazon Bedrock AgentCore Gateway with outbound client_credentials. Transcribe streaming for voice in, Polly for spoken replies (never for the family's stories). - Alexa front end. A custom skill (Alexa Skills Kit, ASK CLI) on Lambda with AudioPlayer and APL for the teleprompter and Now Playing screens, deployed to the development stage and shared with Jordan through a beta test on her US account. A Spanish (es-ES) version runs the same skill.
- Infrastructure. AWS CDK with seven stacks: CloudFront in front of a streaming Lambda function URL (Hono), Lambda@Edge, S3, DynamoDB, KMS, Secrets Manager, AgentCore Gateway, CloudWatch dashboards and alarms, and X-Ray. One command deploys it.
- Quality. Test-driven development throughout: over 900 unit and integration tests, a Playwright smoke test of the simulator, and one CI job that runs typecheck, lint, tests and CDK synth.
Challenges we ran into
- No public Alexa+ developer path. The MCP Toolkit, the
alexa-aiCLI and the Alexa+ simulator are partner-gated. We built the add-on to Amazon's published checklist, prepared the packaging path, and used a custom skill to reach a real device. - Alexa+ is not the classic NLU. On the device, short replies such as "Record" arrived as
AMAZON.FallbackIntentand "Yes" asWhatIsNewIntent, while the NLU profiler and the console simulator mapped every one correctly. We rebuilt the create flow so each step follows the script whatever intent Alexa+ picks, and replayed every script line through each plausible route before deploying. - Invocation is not deterministic under Alexa+. On recording day, "Alexa, open spoken letter" started answering "not supported on this device" on every device of the account, without ever calling the skill. "Alexa, open the Spoken Letter skill" worked, and that is what the video uses.
- Account geography. English Alexa+ is not supported on a Spain account. Jordan's US account, a beta-test invitation and a re-registered Echo made the English demo possible.
- CloudFront and function URLs. The origin access control overwrites the viewer's
Authorizationheader and the function URL renamesWWW-Authenticate. A viewer-request copy and a Lambda@Edge origin-response function restore both, so OAuth discovery works end to end.
Accomplishments that we're proud of
- A real family's stories playing on a real Echo Show under Alexa+, asked for by name.
- A dual-era MCP server that speaks both the 2026 specification and the handshake Alexa+ actually sends, from one codebase.
- A detailed, dated friction log with a severity and a suggested fix for every finding, written while building.
What we learned
- Agentic turns and the custom-skill time budget pull against each other: each model round trip costs about 2.8 seconds while the MCP backend costs milliseconds, so the number of model calls per turn is the only latency lever.
- Alexa+ routing must be tested on the device. The simulator and the NLU profiler cannot show it.
- Voice history in the Alexa app is the best evidence of how Alexa+ handled an utterance.
What's next for Spoken Letter for Alexa+
- Deploy the same MCP server through the
alexa-aitoolkit as soon as Amazon opens access, so parents can link their Spoken Letter account to Alexa+ directly. - Turn on account linking in production: the OAuth link flow already runs end to end against a stand-in for the Spoken Letter app.
- Bring story creation to the device for real when a consented audio-capture path exists.
Team
- Juan González Ponce: product, architecture and engineering.
- Jordan Lynn: the storyteller in the demo, author of the demo script, and US Alexa+ device testing.
Built With
- alexa
- alexa-plus
- alexa-skills-kit
- amazon-bedrock
- amazon-cloudfront
- amazon-cloudwatch
- amazon-dynamodb
- amazon-polly
- amazon-transcribe
- amazon-web-services
- apl
- ask-cli
- aws-cdk
- aws-kms
- aws-lambda
- aws-secrets-manager
- bedrock-agentcore
- hono
- mcp
- node.js
- oauth2
- react
- strands-agents
- typescript
- zod



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