Web-based chat interface for exploring the Rijksmuseum collection through the Rijksmuseum MCP+ server. Split-pane layout with an OpenSeadragon deep-zoom viewer and a chat interface.
An LLM (Mistral Large 3) uses 13 MCP tools to search, filter, and retrieve artworks from the Rijksmuseum's ~830,000-object collection. When an artwork is opened, the IIIF image loads directly in the viewer. Users can zoom, pan, rotate, select regions, and ask the LLM about what they see.
Browser ──→ POST /api/chat ──→ OpenRouter (LLM streaming)
Browser ──→ POST /api/mcp ──→ Rijksmuseum MCP+ server (tool execution)
The backend proxies LLM requests (API key stays server-side) and acts as an MCP client to the Rijksmuseum server.
- Deep-zoom IIIF viewer (OpenSeadragon) with navigation controls, rotation, fullscreen
- Region selection — drag to select an area, coordinates are added to the chat prompt
- Viewer navigation and overlays driven by LLM tool calls
- Markdown rendering in chat (tables, code blocks, lists, links)
- Optional skill file that provides the LLM with detailed research workflows
- Stop button to cancel in-progress queries
npm installCreate a .env file:
OPENROUTER_API_KEY=your-openrouter-api-key
npm run devStarts the Vite dev server (frontend) and the Express backend concurrently.
npm run build
npm startConfigured for Railway. Set OPENROUTER_API_KEY as an environment variable on the service. Railway provides PORT automatically.
| Package | Role |
|---|---|
ai |
streamText() with tool execution and multi-step loops |
@ai-sdk/openai-compatible |
OpenRouter adapter |
@ai-sdk/react |
useChat() hook for message history and streaming |
express |
Backend server and MCP client proxy |
openseadragon |
IIIF deep-zoom viewer |
react |
UI framework |
react-markdown |
Markdown rendering in chat |
vite |
Frontend build |
Password-protected.
MIT