Inspiration

Shutoff notices, school forms, landlord letters, jury summons: the letters that cost people money or trouble when they're misread. And the fake ones: older Americans reported over $3 billion in fraud losses in 2025, and the FTC estimates the real cost at $13.3 billion or more, with government impersonation the second-largest source (FTC, Protecting Older Consumers, report to Congress, October 2026).

Voice assistants are a natural fit for people who find paperwork hard. But a confident wrong answer about a deadline or an amount is worse than no answer. I wanted an assistant that answers every question about a letter by pointing at the exact line, and says "the letter doesn't say" instead of guessing.

What it does

  • Reads a letter: who sent it, what it asks, the deadline, the amount due, what happens if you don't act. Every fact cites its line; anything not stated is reported as not stated.
  • Answers any question ("Can I pay online?") only with a sentence that is actually in the letter.
  • Flags scam warning signs from the FTC's four signs of a scam: gift-card, wire, crypto or payment-app demands, pressure to act within hours, arrest threats, secrecy, prize fees, "send the money back". Each sign is cited by line. Quill never declares a letter genuine or fake: it gives the FTC's advice and refuses to set a payment reminder until you confirm you checked with the sender yourself.
  • Remembers across sessions: "What do I still need to deal with?" lists open letters by deadline. Reminders need a read-back and a clear yes.
  • Never reads sensitive numbers aloud: account, card and Social Security numbers are masked everywhere; only the last four digits are spoken.

How I built it

A model proposes, code decides. The model returns each field with a verbatim quote from the letter. Deterministic code, with no model in the loop, then decides:

  • the quote must be in the letter: at least 80% of its words, in order, inside one sentence (tolerates scanning noise, not invention);
  • critical tokens (numbers, month names, negations) must match exactly, so a quote can't turn $142.37 into $412.37 or "may be shut off" into "will not be shut off";
  • the value must be readable from the quote (dates, amounts); "within 30 days" deadlines are recomputed from the letter's own date; business-day rules are refused rather than guessed.

Stack: a self-hosted MCP server (Node.js, official MCP TypeScript SDK 1.32.1, Streamable HTTP, protocol 2025-11-25) with six tools: read_letter, find_in_letter, set_reminder, confirm_sender_verified, list_open_letters, mark_handled. The model is pluggable: Claude by default, or any OpenAI-compatible model; the live runs used Gemini 3.8 Flash on its free tier.

Demo client: the Alexa+ MCP Toolkit is available to select partners only, so the demo is a simulated Alexa+ experience: a web page that is a real MCP client. It sends initialize, tools/list and tools/call over Streamable HTTP, shows every call in a protocol log, highlights the cited lines (red for scam signs), speaks answers and takes voice questions.

Results

Evaluation on 20 fictional letters (14 genuine, 6 scams), with truth sheets.

Plain model Model + Quill
Things told to the user that the letter doesn't say (14 letters × 7 fields) 4 1
Correct "the letter doesn't say" 23 / 27 26 / 27
Stated facts left unsaid 0 / 71 3 / 71
  • The plain model's clear-cut errors: a future rent of $1,310 reported as an amount due, and "Unit 4B" reported as a reference number. Quill blocked both. The one error left ("payment is due" read as the requested action) is debatable, and both made it.
  • The cost: Quill stayed silent on 3 of 71 stated facts (twice because the model itself answered "not stated", once because Quill's check rejected an over-paraphrased value).
  • Injected errors (changed amounts, shifted months, deadlines off by days, flipped negations, invented requirements and fees): 64 / 64 rejected, while correct readings were accepted on 14 / 14 letters.
  • Scam signs: 6 / 6 scam letters flagged, 0 / 14 genuine letters wrongly flagged.

Caveat: I wrote the letters, the truth sheets and the rules myself, so the deterministic numbers show that the checks behave as designed, not real-world rates. One truth sheet was corrected after the first live run; the change is documented in the repo.

Challenges

  • The Alexa+ MCP Toolkit turned out to be partner-only after a day of planning around its CLI and simulator. I built a real MCP client page instead, as the FAQ allows.
  • My first model provider had no API credits, so I made the model pluggable and switched to Gemini's free tier. Its daily quota split the evaluation across three days; I added a per-letter cache so runs resume where they stopped.
  • On Windows, an antivirus intercepting HTTPS broke Node's TLS; fixed safely with --use-system-ca instead of disabling certificate checks.
  • Details are in the friction log.

What I learned

Grounding needs exactness where it matters (numbers, dates, negations) and tolerance where it doesn't (scanning noise). Writing the evaluation early found real bugs: a two-word sender could never be cited, and a full account number leaked through a citation's source text. Both are fixed and covered by tests.

What's next

Photo intake of paper letters, explanations in Spanish, reminders in the user's real calendar, account linking for per-household memory on Alexa+, a directory of official sender contacts, and testing with real caregivers.

Built during the submission window

Everything was written from 16 October 2026, except the grounding core (src/core/grounding.js), adapted from my earlier project Reticent AI by TRACE (28 September 2026) and used with TRACE's permission. The repository is private and shared with the Amazon Developer Relations team, as the rules allow, because the grounding engine is also used in ongoing research on LLM reliability.

Built With

Share this project:

Updates

Submission history