Inspiration

In Costa Rica — and everywhere — scammers hit the people we love most with fake bank messages: "Your account will be blocked today, confirm your code here." My own family receives these. Most scam checkers just answer "this looks like a scam" with no proof, and older adults don't trust a black box. We wanted a shield that shows its reasoning: real, verifiable evidence a 70-year-old can understand, and that quietly pulls a trusted family member into the loop when danger is high.

What it does

Faro analyzes any suspicious message (SMS, email, WhatsApp pasted as text) and returns a verdict — low / medium / high risk — with:

  • Verifiable evidence, not a guess: a look-alike bank domain, a request for your verification code, urgency/pressure language, URL shorteners, IP-based links, each shown as its own item.
  • A plain-language explanation in the user's language (English or Spanish).
  • A trust circle: register your real bank's official domains, phones and emails, and Faro detects impersonators of exactly those entities.
  • A family alert: if risk is high, Faro notifies a trusted relative with a suggested verification question to ask you.
  • A voice mode (Alexa+ simulation): ask out loud "is this message a scam?" and hear the verdict spoken back — powered by the same MCP tools.

Crucially, Faro never opens, visits or downloads the links in a message, and never stores the analyzed message. Only your trust circle and family contacts are saved.

How we built it

  • Backend: Python + FastAPI, async SQLAlchemy, provider-agnostic LLM layer.
  • Analysis pipeline: (1) an LLM extracts structured signals from the message; (2) deterministic Python checks (no LLM) detect look-alike/homoglyph/punycode domains, OTP/gift-card/crypto requests, bidi-control tricks — each producing an evidence item; (3) Tavily searches for the organization's real domain and scam reports; (4) a reasoning model writes the final verdict.
  • Two hard rules in the orchestrator: the model may not invent evidence — any reason that doesn't cite a real evidence item is dropped — and a deterministic severe floor means that if the checks see an impersonator domain or an OTP request, the model cannot lower the risk below high (fail closed).
  • MCP server (Alexa+ track): official MCP Python SDK, Streamable HTTP, protocol revision 2025-11-25, with three tools — check_message, add_trusted_contact, alert_family — per-request bearer auth and Origin validation against DNS rebinding. The web "Alexa+" screen uses the Web Speech API and calls the same tools.
  • Frontend: React + TypeScript + Vite, designed for older adults — large text, high contrast, keyboard & screen-reader friendly, fully bilingual (ES/EN).
  • Evaluation: a script compares a plain single-LLM baseline against the full Faro pipeline on a balanced public set.

Challenges we ran into

  • Zero budget, no credit card. We kept the entire project free: Google Gemini's free tier for real AI, a full mock mode so everything runs without any keys, and SQLite as a fallback database.
  • A brand-new MCP SDK. The 2.x SDK renamed classes and changed result fields; we introspected the installed package to get the Streamable HTTP server and the 2025-11-25 revision working end to end.
  • Security without shortcuts. Argon2id, pinned-algorithm JWT, IDOR protection (404 not 403), strict CSP, rate limiting, URL "defanging" (hxxps://bank-fake[.]com) and prompt-injection defenses were built in from the start, not bolted on.

Accomplishments that we're proud of

  • A measurable result: on our evaluation set, Faro's false-positive rate was 0.00 vs 0.19 for the plain-LLM baseline — it stops crying wolf on normal messages.
  • Evidence you can verify, a real working MCP server, and a voice experience — all in an accessible, bilingual UI.

What we learned

Deterministic checks + an LLM beat an LLM alone: the rules give you a safety floor and the evidence that makes a verdict trustworthy. And treating every external input (the message, search results) as untrusted data is the core of safe LLM apps.

What's next for Faro

Screenshot/OCR analysis, a WhatsApp integration, and a real Alexa+ skill on top of the MCP server that already exists.

Built With

Share this project:

Updates

Submission history