Skip to content
← All work

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

ChatGPT answering “tell me about dusted” with a River widget header and grounded brand copy
Ask ChatGPT about Dusted and River answers with the agency's own words.
Rich River widget inside ChatGPT showing the Dusted brand panel and campaign imagery
Rich media in the conversation: brand panels and imagery, not just text.
River widget scrolled to show case-study screens and brand statement inside ChatGPT
Case-study galleries render inline, straight from the website's CMS.
Interactive 3D Dusted brand cube widget rendered inside a ChatGPT conversation
The obligatory party trick: a draggable 3D brand cube, live in ChatGPT.
River chat widget open on dusted.com showing quick prompts and a services media carousel
The same brain on dusted.com — quick prompts and an inline services gallery.
River website chat answering with a formatted breakdown of Dusted's digital and brand services
Streamed, formatted answers in the site widget, grounded in the same MCP tools.