Michael Thomson
Conversational BI over live commerce data

Sightly

Ask a question about products, orders, and customers in plain English; get an answer computed against live data, pinned as a dashboard tile, and turned into a shareable report. Third generation of the product.

Overview

The engineering problem in conversational analytics isn't generating prose — it's that the model sits between a user and their real business data, and must never be able to change any of it. Sightly enforces read-only in depth: the agent's tool surface, each provider's catalogue, the system prompt, and the backend invoke proxies are four independently-owned layers, so a bug in one is caught by another.

What it does
  • 01Natural-language questions over connected sources
  • 02Answers pinned as dashboard tiles
  • 03Reports generated from the same answers
  • 04Read-only enforced at four layers
  • 05MCP tool surface with audit logging
  • 06Shopify OAuth and Stripe subscriptions

How a question becomes an answer

A FastAPI service wraps a LangGraph agent and reverse-proxies the LangGraph HTTP API, keeping the graph runtime an implementation detail. Tools call back into the Express backend forwarding the user's own token, so the agent can never reach data the user couldn't.

Query path
  1. Question→
  2. ReAct agent→
  3. Tool selection→
  4. Express API with the user's JWT→
  5. Provider or MCP source→
  6. Result→
  7. Tile or report

Read-only, four times over

Each outbound request passes through several independently-owned layers, ordered furthest from the socket to closest.

Agent tool surface
  • Only read tools registered
  • list_sources, describe_source, query_data
  • No delete, no update-source
Provider catalogues
  • Each catalogue lists read tools only
  • A small explicit list, so review catches additions
Prompt and proxies
  • System prompt states the surface is read-only
  • Backend invoke proxies enforce it again

Connected sources

Capabilities
  • Shopify, via OAuth and a mirrored Postgres
  • Stripe, Klaviyo, Recharge, and Meta
  • Everstream streams over MCP
  • Per-user custom MCP data connections
Built with
PythonFastAPILangGraphClaudeMCPNode.jsExpressNext.jsShopify OAuthStripePostgreSQL