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
- alexa
- argon2
- fastapi
- google-gemini
- jwt
- mcp
- model-context-protocol
- playwright
- postgresql
- python
- react
- sqlalchemy
- sqlite
- tavily
- typescript
- vite
- web-speech-api
Log in or sign up for Devpost to join the conversation.