03 · Dusted · AI
River
Dusted's AI assistant: a custom MCP and RAG platform grounding answers in the agency's own content, serving rich interactive widgets inside ChatGPT and powering the website chatbot.
- Role
- AI engineer
- Client
- Dusted
- Timeframe
- 2024 — present
5
interchangeable LLM providers
10+
MCP retrieval tools
2
surfaces from one backend
Overview
The story
When people ask an AI about Dusted, the answer should come from Dusted — not from whatever the model half-remembers. River is the platform that makes that happen: a custom MCP server over a retrieval pipeline built on the agency's own content, surfaced two ways — as a ChatGPT app, and as the chat widget on dusted.com.
The retrieval side syncs the website's CMS into Postgres with pgvector embeddings, then answers through hybrid retrieval: semantic search, full-text and exact word match, with dedicated authoritative count queries so questions like “how many case studies” never hallucinate a number. Summaries are generated under anti-fabrication prompts, and quotes are only ever lifted verbatim from source content.
Answers arrive as more than text. Using the OpenAI Apps SDK, River returns interactive widgets inside the conversation — case-study media galleries, a video player, people grids, contact cards, even a draggable 3D brand cube — each rendered from its own HTML resource under a per-widget content-security policy, with a deterministic layout builder keeping narrative first and widgets in their declared positions.
The website chatbot runs the same brain through a different face: server-sent-event streaming, a provider-agnostic LLM layer that can swap OpenAI, Claude, Gemini, Grok or Perplexity by config, the same MCP tool loop, widgets in sandboxed same-origin iframes, and per-stage timing telemetry across the whole pipeline. It adds up to an early, working example of generative engine optimisation: the agency answering AI questions with its own verified content.
Highlights
What makes it tick
- RAG over the agency's own CMS — content synced into pgvector embeddings on Postgres
- Hybrid retrieval: semantic, full-text and exact match, plus authoritative counts that can't hallucinate
- Anti-fabrication guardrails — grounded summaries, quotes only ever verbatim from source
- Interactive ChatGPT widgets: galleries, video, people grids and contact cards, each under its own CSP
- Provider-agnostic website chat — OpenAI, Claude, Gemini or Grok behind one streaming MCP tool loop
- Per-tool tracing spans and timing telemetry across every retrieval stage
Stack
Built with
- TypeScript
- Next.js
- MCP
- OpenAI
- pgvector
- PostgreSQL
- Sanity CMS
- Vercel
Gallery
In the wild





