Inspiration

Creators who run live sessions juggle three systems for almost an hour before going live: the registration page, Zoom (Streaming platform), and email (registration, reminders and CTA). During these processes to launch a live session, failures are quiet, updates are not propagated to systems and email notifications might not been sent out. Say Host changes the time for a Zoom meeting, while the reminder email and registration link still shows the old time. This leaves a registrant with a wrong time and personal join link, and an updated email never get sent to the registrants. Nothing alerts the host that the registrant might not have received the new link and time. Hosts only find out when registrants cannot join the meeting.

We run EngageFoyer. We wanted one question — “Is tonight meeting ready?” — to check every system, say what is wrong, and fix it after a single yes. The same agent should also create the session on the right clock from speech, so the host does not hunt for the right dashboard page.

What it does

Same 10 tools on the EngageFoyer dashboard, Railway Concierge (speech + plan cards), and /mcp Streamable HTTP for Cursor, Claude Desktop, and Alexa+. v1 authenticates with an org API key. Production Alexa account linking (OAuth) is next.

  • Create a session: “Create Career Talk tomorrow at 5:30 PM Lagos time.” Code, not the model, asks for the next missing field (title → day → time → AM/PM). Named city wins; otherwise the account timezone. A country with several zones → it asks which city. DST-aware. Never invents a zone. First yes saves a draft on Events and opens a prefilled form — no Zoom, no public page, no email. Leave the chat: the draft is still there. Then they press Create on the form, or say “create it now.” That second yes creates the meeting (Zoom / Meet / Teams if connected) and the registration page, once. Repeat approve does nothing.
  • Check and go live: “What’s coming up?” / “Is tonight meeting ready?” It reads registrants, personal Zoom links, details email, Zoom vs EngageFoyer start time, and reminder windows (observe only — it does not send 24h/1h reminders). If times disagree it asks which clock is right. After one confirm it can: push EngageFoyer’s time to Zoom and wait until Zoom matches, register people missing a join link, email details. Each step is re-checked; already-fixed steps are skipped. Plans expire in 15 minutes. “What did you change?” is answered from the action log, not a new guess.
  • Time and meeting apps: “What time is this session in London?” / “What time is it in Tokyo?” / “If it’s 3 PM in Lagos, what’s that in New York?” / “Is Zoom connected?” Live check: Zoom, Meet, Teams — connected, needs reconnect, or paste-a-link still works.

What it Will Not Do: Change EngageFoyer’s event time, change Settings, guess a timezone, email or PATCH Zoom without a current planId, see another organisation, or see a registrant’s email address — tools return counts and statuses, never contact details.

How we built it

EngageFoyer SaaS predates this hackathon. The significant update is Creator Concierge: this repo plus thin org-scoped /api/agent/* routes. The API key is the tenant: every read and write goes through EngageFoyer’s org-scoped agent API. The Concierge never talks to Zoom or a database directly.

One handler file (src/tools/handlers.ts). Three doors, same tools:

  1. EngageFoyer dashboard AI Assistant: Where creators already work (hero for the video).
  2. Railway Concierge (demo-ui/): Spoken Alexa-style shell, plan cards, approve button.
  3. **/mcp Streamable HTTP (protocol 2025-11-25): Cursor, Claude Desktop — and what Alexa+ would connect to, once OAuth replaces org API keys.

Amazon Bedrock Converse + tool use, Claude Sonnet 4.6 (us.anthropic.claude-sonnet-4-6, us-east-1) picks tools. One Railway process serves MCP, chat, execute, and the UI.

Safety is code, not a prompt: confirmation binds to a planId, not the word “yes”; the approve path is POST /v1/agent/execute (the model is skipped); execute is idempotent and re-checks each step; scope can only shrink (“just fix Zoom”); plans expire in 15 minutes. Conversation memory keeps a compact tool log for follow-ups. 29 offline plan checks; live isolation probes refused both ways.

Challenges we ran into

  • Bedrock Access: Bare model IDs fail with an error that looks like an IAM approval problem. “Not available for this account” meant three different things: Anthropic use-case form, account not on that model yet, or we passed anthropic.* instead of an inference profile (us.anthropic.claude-sonnet-4-6). IAM for Converse is bedrock:InvokeModel, not bedrock:Converse. Cross-region inference profiles were the fix.
  • “Yes” is Ambiguous: Early builds re-planned on every confirmation because the planId was truncated out of the tool log. Binding execute directly to a unique planId + a 15-minute expiry fixed an entire class of tracking bugs.
  • The Model Must Not Convert Times: All clocks come directly from tools. The prompt is strictly forbidden from executing timezone math. The model also mis-spoke dates (“the 1 attendees”) until tools returned display-ready strings.
  • Zoom Quirks: Plus-addressed emails count as separate people. A disconnected Zoom silently leaves registrants without operational join links. ## Accomplishments that we're proud of
  • An agent that successfully creates a session and fixes Zoom + registrants + details email after confirmations it cannot talk past.
  • It uncovered a critical background operational failure: Pointed at a live session, it reported 24-hour reminders all late and 1-hour reminders 0 of 5 sent. The external trigger had been off for six weeks. Nothing in the product had said so. The agent only reported what it observed.
  • Measured live performance metrics: Generates its plan in ~4s on the server (~6s end-to-end); executes the Zoom PATCH then matches in hundreds of ms; shifts registrants from 15/16 → 16/16 personal links; successfully processes details email dispatch in ~3.7s.
  • Same 10 tools over Streamable HTTP MCP: Cursor called hello_concierge on the live /mcp endpoint. Dashboard chat is the same handlers. Every count and clock in the demo is a tool result, not text we wrote for the model.

What we learned

The model is the easy part. Trust is what the agent is allowed to do, how it proves it did it, and how precisely it reports. “0 of 5 sent, window opened 9 hours ago” beats “your reminder system is down.”

MCP Streamable HTTP will list tools and return results. It will not give you a confirmation handle. “Yes” after a plan is not “run whatever is next” — it is a specific planId. We had to build that ourselves. Same for clocks: if time lives in the prompt, DST is wrong; time has to live in a tool.

MCP is not a demo extra. It is the same operating layer as the dashboard, so Alexa+ is not a second backend.

What's next for EngageFoyer Creator Concierge

  • OAuth for Alexa+: v1 uses org API keys — enough for judging, not for every creator's account.
  • Session time by voice stays out of v1: A misheard “thirty” would email every attendee. The agent keeps pointing at event settings.
  • Screenless Echo support: The prefilled draft link belongs in the Alexa app, not only in dashboard chat.
  • Reminder alerts: Push when a 24h/1h window is missed, instead of waiting until they ask.
  • Membership applications: Same pulse + confirm: how many waiting, who needs review, invite or book-a-call after one yes — not a silent bulk approve.
  • Campaigns: “Email last night’s no-shows” / “Send an update to the waitlist.” Read back segment and headcount; send only after a second yes bound to a planId. Waitlist into tonight’s event uses the same loop.

This is still one agent, more EngageFoyer doors — not a second Alexa product.

Built With

Share this project:

Updates

Submission history