Inspiration

Most US cities run a 311 service for problems that are not emergencies: potholes, broken streetlights, missed trash pickups, graffiti etc. It works, but it asks a lot. You call during office hours, or you find the right app, the right category and the right form. Many people never bother, and the ones who do often report the same pothole as their neighbors, so the city gets duplicates instead of a clear picture.

Talking to a speaker in your kitchen is the easiest way there is to ask for something. We wanted reporting a problem in your street to be that easy, for everyone, including people who will never fill in a form on a phone.

What it does

You tell Alexa what you see: "there's a huge pothole at 14th and U". CityVoice:

  • finds the place;
  • asks the one or two questions the city needs, then reads the report back;
  • files it only after a clear yes, and gives you a request number;
  • notices when a neighbor already reported the same thing close by, and offers to add your support instead of filing a duplicate;
  • sends anything dangerous, like a gas smell or a downed power line, to 911, and files nothing;
  • answers "what's happening with my reports?" in plain words, with a map on screens, colored by status.

It runs on Open311 GeoReport v2, the open standard many US cities already use. The pilot uses Washington DC with demo data, and San Francisco with its real 311 requests, read live from the city's own Open311 feed. Reports go to a sandbox that behaves like a city's 311 server, and anyone can check a report in its public, read-only Open311 feed, in the exact format a city would receive.

How we built it

CityVoice is an MCP server, written in TypeScript and running on Cloudflare Workers, with its data in D1. Alexa+ understands what the resident says and calls CityVoice's tools; the tools are plain code, with no language model inside, and each one returns a sentence ready to be spoken along with the data behind it. That keeps every answer fast, predictable and testable.

  • Account linking is OAuth 2.1 with PKCE, as the Alexa+ MCP Toolkit requires.
  • The map is an MCP App: a page Alexa+ shows next to the answer on a screen. It draws exactly what was said, so the voice and the screen always agree.
  • San Francisco's feed takes seconds to answer and cannot search by place, too slow for a voice turn, so a scheduled job mirrors its recent requests every ten minutes.
  • The Alexa+ simulator is a web page with speech in and out and a model that calls the same MCP server, so anyone can try CityVoice without a device. A "behind the scenes" panel shows every MCP call.
  • The tests play the demo scenarios end to end and check every spoken sentence against voice rules: short, no codes, nothing visual.

Challenges we ran into

  • Language models improvise. In testing, the model sometimes answered "Call 911" on its own, or made up a resident's reports instead of looking them up. Safety and facts now stay in code: the server decides what an emergency is, and the simulator checks that every answer about reports comes from a tool.
  • Voice is slow when every step counts. A report used to take four tool calls before the first question. One tool, start_report, now does the first answer in a single call.
  • A real city's feed is not built for voice. San Francisco's feed ignores search by place and takes seconds per page, hence the mirror. Washington DC, Boston and Chicago had no feed we could read at all.
  • Free tiers have limits. Rate limits, a daily budget for account linking, and a mirror that only writes what changed keep the demo running on free plans.

We kept a friction log of everything that slowed us down, with what happened and how we worked around it.

Accomplishments that we're proud of

  • The same code works on a real city, with real requests, and finds real duplicates.
  • Nothing about safety is left to a model.
  • Every report filed by voice can be checked by anyone in a standard Open311 feed.
  • The add-on is packaged for Alexa+, with its manifest, images, privacy policy and terms.

What we learned

Voice changes how you design a service. Every sentence has to work without a screen, every list has to stay short, and every question has to come one at a time. We also learned how much an open standard helps: because cities speak Open311, one connector can serve many of them.

What's next for CityVoice

  • Sending reports to a real city, which takes a write adapter and an API key from that city. We did not do it without a partnership.
  • More cities through Open311, and through the 311 platforms many cities already use.
  • A receipt by email or text, the way cities confirm a report today.
  • Other channels on the same MCP server: other assistants, and a phone line for people without a smart speaker.

Built With

Share this project:

Updates

Submission history