Inspiration
Following dirty money is slow and manual. An investigator clicks through accounts one at a time, building the picture by hand, while the money keeps moving. We wanted the person's own browser agent to do that tracing with them, live, on the page in front of them, and to keep the human in charge of the one irreversible action.
What it does
Ringlight is a fraud-ring investigation console that runs in the browser. You ask your agent to trace a suspicious transfer, and it follows the money account by account across a live money map, scores the risk, pulls a hidden ring of mule accounts out of the noise, and puts a dollar figure on the exposure. Then it proposes to freeze the ring. Freezing is irreversible, so it stops and asks: one human click approves it, and the ring goes dark while every clean account stays untouched. A time scrubber replays the whole investigation, every step recorded. It opens with a seeded case so it works instantly, and you can drop in your own transfers as CSV or JSON to investigate real data.
How we built it
Ringlight is built on WebMCP. The page registers about ten tools with document.modelContext.registerTool: traceFlow, scoreRisk, detectRing, dollariseExposure, buildCaseTimeline, freezeAccounts, fileSarReport, replayInvestigation, and more. The user's in-browser agent (ChatGPT's in-app browser, or Chrome with WebMCP) discovers those tools and calls them with structured arguments; our handlers run inside the page, do the real graph traversal and risk math, and mutate the live map. The agent is not clicking pixels or scraping a screen, it is calling real, typed functions we exposed, which is the whole point of WebMCP. freezeAccounts is registered as irreversible, so our substrate intercepts it and requires an explicit human approval before the handler runs. Everything is vanilla HTML, CSS, and ES modules, no framework, no build step, no runtime network, so it deploys as a static site and runs inside ChatGPT's browser. A small polyfill of document.modelContext lets the same tools run from a button when no WebMCP host is present, so it is always demoable.
Challenges we ran into
Making the agent operate a rich, live UI safely, not just answer questions. Designing the human-gate so an irreversible action always pauses for a person, on top of ordinary WebMCP tool calls. Rendering a readable force-directed money map by hand in SVG with no library, so the app stays self-contained. Keeping it keyless and offline so any judge can run it, while still accepting real bring-your-own data.
Accomplishments that we're proud of
An agent and a human co-investigating a fraud ring on a shared, live surface, with the irreversible action human-gated and every step replayable. A genuinely load-bearing use of WebMCP: remove it and there is no agent-to-page channel and no demo. It runs with zero setup in the browser and is covered by a real test suite.
What we learned
WebMCP flips the usual direction: the agent calls the page, not the other way round, which makes agent actions typed, permissioned, and inspectable instead of brittle screen-scraping. The most valuable safety primitive is a human-gate on the one action that cannot be undone.
What's next for Ringlight
Richer graph analytics, more bring-your-own formats, and a shareable case file so an investigator can hand a frozen ring to a colleague.
Built With
- ai-agents
- browser-agents
- chatgpt
- fraud-detection
- javascript
- model-context-protocol
- webmcp
Log in or sign up for Devpost to join the conversation.