Case study · Virtual worlds · AI agents · Built with the Ethora MCP server

A 3D multiplayer world built from a book, with AI characters, on Ethora chat and agents, in one weekend

Pick a public domain book. A generator reads it and lays out its locations as rooms on a map; each room becomes an Ethora chat room, each character an Ethora AI agent that knows the text. Visitors walk between rooms in first person, meet whoever is there, and talk to the characters, who answer in character. Ethora’s founder built it over the weekend of 17 to 19 October 2026 on the public SDK, API and MCP server, without changing a line of Ethora, and the team tested it live on the Monday call.

Start Free
Every room is an Ethora chat Every character is an Ethora AI agent Provisioned over MCP in minutes
The Hatter, an AI character in a 3D tea party room, greeting team members by name in the chat panel during the live test

By the numbers

The weekend at a glance

1 weekend

from a one-page brief on Friday afternoon to a live test server for the team on Monday morning, 23 commits

3 worlds

Alice’s Adventures in Wonderland, The Tempest and A Christmas Carol: 16 rooms and 8 AI characters between them

$3

and about four minutes of model time to turn a book into a world file, rooms, characters and knowledge

changes to Ethora: everything runs on the public SDK, API and hosted MCP server, with 19 improvement notes logged for the roadmap

An internal R&D showcase, not a customer project. Built by Taras Filatov, Ethora’s founder and CEO, with Claude Code, between Friday 17 and Monday 19 October 2026. Working name “bookworld”; the source will be published on GitHub under the MIT licence once the name is settled. The test server is for the team only while the content and cost rules are finalised.

Overview

A chat server is already a map: the project just lets you walk it

The idea started as a question about Ethora itself. A chat room is a place. People are in it or not, they arrive and leave, and in Ethora an AI agent can live there too. What if a visitor could only be in one room at a time, had to walk to the next one, and saw the others in the room around them instead of a list of messages? And what if the rooms and the characters came from a book?

The challenge. Four things had to be true at once. Presence had to feel like a world: one room at a time, doors between adjacent rooms, a system line in the chat when someone walks in or out. Characters had to stay in character for hours in a public room and answer from the text of the book, not from a model’s general memory. A new world had to come from any text in minutes, not from hand-written content. And a public world must not run up an unbounded AI bill.

The approach. Three small pieces around an unchanged Ethora. A world service that knows where every visitor stands and which door leads where. A 3D client in the browser that renders the room, the avatars and the characters, with the standard Ethora chat panel pinned to the current room. And a generator plus provisioner that reads a book, writes a world file, and then creates the Ethora app, the rooms, the agents and their knowledge over the hosted MCP server. Ethora is used only through its public surface; anything it lacked was written down for the Ethora team instead of patched.

The Hatter character at a 3D tea party table turning towards the visitor, with a speech bubble answering a question about his watch from the text of the book
The whole idea in one frame, from the first evening: the visitor typed “Hatter, your watch is two days wrong”, the character turned round, and the Ethora agent answered from chapter seven of the book.

Requirements

What the world needed, and how Ethora met it

Each row says what came from Ethora as it ships today, what the project built on top, and what was handed to the Ethora roadmap.

One chat room per location, and a visitor is only ever in one of them

Every location in a world is an Ethora chat room, created over MCP by the provisioner. When a visitor walks through a doorway the world service validates the move, grants the next room and narrates “Alice has left (E)” and “Alice has joined (W)” through the chat API’s broadcast endpoint, and the client re-pins the chat panel to the new room. Rooms created over MCP are public app chats, so the one-room-at-a-time rule is enforced by the client for now; provisioning rooms as group chats with per-user access is the next step.

Ethora, as shipped Built in the project Noted for the Ethora roadmap

Characters that answer in character, from the book

Each character is an Ethora AI agent with a persona written by the generator, the room’s setting and a few house rules (stay in character, under 80 words). It answers only when named, with a cooldown, so a room full of people does not trigger a reply on every line. Its knowledge is the book itself: the provisioner points the agent’s knowledge base at the Project Gutenberg text with one crawl call, and retrieval does the rest. The first in-world question to the Hatter was answered in about five seconds.

Ethora, as shipped

Walk in from a link with just a name

No sign-up. The world service creates a guest user with the Ethora backend SDK and hands the browser a client token; the standard React chat component logs in with it, pinned to the current room with the room list hidden. A reload brings the same visitor back to the same room and spot with the same chat identity, and a dropped connection has a minute to come back before the seat is given up.

Ethora, as shipped Built in the project

Speech bubbles over avatars, narration in the panel

The chat component exposes the room’s messages to a custom scroll area, so every new line from another person or a character floats above their avatar for a few seconds while the full conversation stays in the panel. Narration lines (arrivals, departures, a character walking off to the garden) are app broadcasts rendered as quiet italic system text.

Ethora, as shipped Built in the project

Characters with a daily life, and a play that performs itself

The world service runs one simulation per world: the Hatter strolls near his seat, turns to face whoever names him, walks to the garden every twenty minutes and greets newcomers with “No room! No room!”. The Tempest was generated as an enacted play: Prospero, Ariel, Caliban and Miranda follow hourly schedules that bring the right pair to the right room before each of seven scripted scenes, with lines taken from the text, and no AI tokens are spent until a visitor speaks to them. Ethora agents store a schedule but do not yet run one, so the world service drives it; that worker is on the roadmap.

Built in the project Noted for the Ethora roadmap

A world from any text in minutes

The generator fetches a book from Project Gutenberg, splits it into chapters, and asks a model for rooms on a grid with doors between them, props from a catalogue of free assets, personas, greetings and schedules. A converter fixes what models get wrong (diagonal doors, unreachable rooms, props standing in doorways) and a validator checks the result. The provisioner then drives the hosted MCP server exactly as a person would from Claude Desktop: create the app, one chat per room, one agent per character, crawl the knowledge, invite each agent home. Every step is recorded so a rerun continues where it stopped. Alice in Wonderland took one attempt, four minutes and $2.93.

Ethora, as shipped Built in the project

A daily budget so a public world cannot bankrupt its host

Two meters. Character replies are counted per world and per visitor per day; at the limit the characters “rest”, the rooms get a narration line, and the agents are switched to answer with probability zero over MCP until the reset. Generator runs and dollars have their own daily cap. A lesson from the weekend: scripted scenes were playing to empty rooms and a line that names another character can draw a paid reply with nobody reading it, so scheduled lines now post only to rooms with a visitor in them. A per-app reply cap inside Ethora is on the roadmap.

Built in the project Noted for the Ethora roadmap

Sound, voices and a sense of place

Panorama rooms from CC0 HDRIs, textured walls and floors, one music track per room with the credit in the corner, footsteps that follow the floor material and come from where the other person stands, a door creak on every room change, and procedural ambience (drips in the well, a clock at the tea party, birds in the garden). Characters can read their lines aloud through the browser’s own speech synthesis, off by default. All of it runs client side; the server did not change.

Built in the project

From book to world

What the generator made

The first generated world was Alice in Wonderland with six rooms and three characters. The model chose the Rabbit Hole, a Long Hall with three exits, the Mushroom Wood with the Caterpillar, the Mad Tea Party as an open panorama room, the Queen’s Croquet Ground and the Court of Justice; it wrote personas that quote the book, gave the Queen a schedule that takes her to the court every two hours, and put “Off with their heads!” on the three-quarter hour. The Tempest followed as a seven-room island with four characters and seven scheduled scenes, then A Christmas Carol, made through the “your own book” form on the join screen in four minutes.

A generated 3D room: the Long Hall from Alice in Wonderland with a checkered floor, lamps, a glass table and three doorways labelled with the rooms they lead to
The generated Long Hall. Every doorway is labelled with the room behind it; the map in the corner is drawn from the grid the model laid out.
The Wreck on the Shore from The Tempest: a plank floor in front of a sea panorama, with the room description written over the scene
The Tempest’s first room. The description over the scene is the generator’s, written from the play; the sea is a free panorama from Poly Haven.
The join screen with world cards for A Christmas Carol, Alice in Wonderland and The Tempest, and a Your own book form showing the generator log after making a world
The join screen after making A Christmas Carol through the form: five rooms, three characters, $3.33, and the card appeared before the log finished scrolling.

Architecture

Three small pieces around an unchanged Ethora

The world file is the product: the client, the generator and the provisioner all read it. Ethora Cloud supplies chat, agents, knowledge and provisioning as an external service, so the whole thing is one small Node service and a static client. The same stack runs on a laptop for a family on the home Wi-Fi, or against a self-hosted Ethora.

Where it ran this weekend

A laptop on the home Wi-Fi A shared DigitalOcean droplet behind Caddy and Cloudflare Ethora Cloud for chat, agents and MCP
The project: one Node service and a static site. Ethora stays an external service.
In the visitor’s browser
3D client React Three Fiber, first person, physics
Ethora chat component Pinned to the current room, guest login
Sound and voices Web Audio, browser speech synthesis
Ethora Cloud, unchanged
Hosted MCP server App, rooms, agents, knowledge
Chat server XMPP rooms, archive, broadcasts
AI agents Personas, mention gating, RAG over the book
Platform API + backend SDK Guest users, membership, tokens
Built in the project custom
World service Colyseus: positions, doors, simulation, budget, public stats
Generator Book to world file with Claude
Provisioner World file to Ethora over MCP
Data and assets
world.json per world Rooms, exits, props, characters, schedules
Event log + budget file Anonymous usage report, daily caps
Free assets Kenney, KayKit, Poly Haven (CC0), Kevin MacLeod (CC BY)
Browser Ethora Cloud Built in the project Data

The live test

Monday morning: the team walks into the tea party

On Monday 19 October the project went up on the shared server that already hosts Ethora’s smaller websites, as a fifth small service behind the same reverse proxy, and the link went into the weekly team call. Within a couple of minutes five people were in the Tea Party at once. The Hatter greeted each of them by name as they came through the door (“Oh, very well, Nick. There is plenty of room. Your hair wants cutting.”), speech bubbles appeared over the avatars as people typed, and the chat on the right carried the same conversation as an ordinary Ethora room. The group then moved to The Tempest, switched on spoken lines, and listened to Caliban complain about Prospero from the text of the play.

A knight avatar named Dmytro in the 3D tea party room, with five team members chatting in the Ethora chat panel on the right
Five team members in one room during the call. The chat panel is the standard Ethora React component; the avatars are free CC0 models assigned at random.
Miranda, an AI character, next to a team member's avatar on the plank floor of The Wreck on the Shore, with Ariel's lines from The Tempest in the chat panel
The Tempest during the call: Miranda beside a colleague on the shore, Ariel’s scripted lines in the panel, and a question to Miranda being typed.

The questions and ideas that came out of the session are the useful part. The real-time movement does not go over XMPP: the chat does, while positions and doors go over the project’s own WebSocket service, which raised the idea of a version that carries movement over Ethora so that a student could host a world on a free static tier with nothing but an Ethora account. The team asked for voice chat that fades with distance (Ethora already has WebRTC calls to plug in), for holding the next team meeting inside the world, and for multimodal models so characters can see what they are shown. The founder’s children, who tested it over the weekend, asked for weapons.

Watch

The live demo from the team call

What we learned about our own product

Nineteen notes for the Ethora roadmap

Building on nothing but the public surface is the point of a showcase like this: it is the same experience an outside builder gets. The project kept a running list of everything Ethora should do that it does not do today, each with the workaround used here, and that list now feeds the roadmap. A few of them:

  • The App Secret stays in the dashboard. The provisioner can create an app, its rooms, agents and knowledge over MCP, but the secret that signs server tokens is only shown to the app owner in the web dashboard, so a world made by a visitor through the form has rooms and characters but no chat until the owner pastes one line. Returning it once to the creating owner would make the whole flow unattended.
  • Rooms created over MCP are public app chats. Every app user is a member of all of them, so one-room-at-a-time cannot be enforced by membership yet; group chats with per-user access are the fix.
  • Rooms carry no custom metadata, so a world cannot live entirely inside Ethora; the world file holds the map, wallpapers and exits.
  • No outbound webhooks per app. A server that wants to react to chat events still needs a client in the loop; the world service drives its scripts on its own timer instead.
  • Agent schedules are stored but not run, so character life is simulated by the world service rather than by Ethora.
  • Guests need a last name. A visitor who types one name shows as “Alice (guest)”; a display-name field would fix it.

None of these blocked the project, which is the other half of the finding: a chat server, a hosted MCP server, an agent model with mention gating and retrieval, and a backend SDK for guest identities were enough to stand up a multiplayer world with living characters in a weekend.

The tea party room with a notice that the characters are resting until the daily reset, and the Hatter's earlier answers about the riddle in the chat panel
The daily budget in action during testing: after the limit the characters rest, the notice appears at the top, and visitors can still talk to each other.

Where it goes next

A place to study groups of agents and groups of people together

Beyond the demo, the project is a test bed for a research question Ethora cares about: what happens when several AI agents with different roles share an environment with several people over a long time. Stanford’s Generative Agents work showed agents with memory and reflection forming plans and relationships in a small simulated town; here the town is a book, the agents are Ethora agents, and the other inhabitants are real people. Ethora agents already have a long-term memory they can write to themselves; the next step is social memory, so that a character remembers who asked it for a song, who was kind and who was rude, and behaves differently with each of them, inside a world and in an ordinary team chat alike.

Also on the list: the source on GitHub under MIT, a name that is not a working name, worlds described in a prompt rather than taken from a book, a 2D client on the same world file, voice between visitors that fades with distance, and a self-hosted guide for running the whole thing against Ethora Core.

The join screen with three world cards showing who is in which room, the characters, messages today and last activity
The join screen during the call: each card shows who is in which room right now, the characters, messages today and when the world was last active, from a small public stats API.

The outcome

A weekend, three books, and a live world the team could walk into

From a Friday afternoon brief to a Monday morning test server: three public domain books turned into sixteen rooms and eight characters, a generator that does it again for any book in minutes for about three dollars, guests who enter from a link, characters that answer from the text and a budget that keeps them affordable. All of it on Ethora as it ships today. If your product needs rooms that feel like places, AI participants that stay in character, or a quick way to provision apps, rooms and agents from a script, the same pieces are available to you.

FAQ

Can I build a 3D or game-like world on Ethora chat?

Yes. This project uses Ethora only through its public surface: the React chat component for the conversation, the backend SDK for guest users and room membership, and AI agents for the characters. The 3D rendering and the movement are a separate service you own.

How were the rooms and characters created so quickly?

A script drives the hosted Ethora MCP server with a user API key: create an app, one chat per room, one agent per character with a persona, crawl the book into each agent’s knowledge, invite each agent into its home room. It is the same set of tools a person uses from Claude Desktop or Cursor.

How do the characters stay in character?

Each agent has a persona and house rules in its instructions, answers only when named (with a cooldown), and retrieves from the text of the book rather than relying on the model’s general knowledge. Scripted scenes and greetings are posted by the world service and cost no tokens.

What does it cost to run?

Two things cost money: every message that names a character makes its agent answer, and every generated world calls a model (about $3 per book here). The project caps both per day and puts the characters to rest at the limit. Ethora’s own plan limits apply first.

Can it run self-hosted?

The world service and client are one Node process and a static site; Ethora can be the cloud service or a self-hosted Ethora Core with the same API and MCP server.

Is the code available?

It will be published on GitHub under the MIT licence once the project has a settled name. Until then the test server is for the Ethora team.

More case studies

Healthcare: HIPAA-compliant AI assistant (RAG) over a medical video library

Dr. Talks is one of the most prominent organizers of online healthcare conferences and summits.

Ethora enabled them to create a context-aware AI-powered chatbot to help users navigate thousands of pages of medical content, correctly referencing pages, authors, videos and timestamps. 100% secure and HIPAA-compliant.

This assistant enhances user experience by simplifying interaction with the platform and reducing search time.

  • 1000+ summits indexed by AI bot
  • Instant user engagement
  • Vector embeddings enable intelligent domain expert AI responses
Read the case study: Healthcare: HIPAA-compliant AI assistant (RAG) over a medical video library

Healthcare: self-hosted patient messaging for a multi-clinic digital health platform in Canada

VITALL is a Canadian digital health platform used by hospitals, clinics and private practices.

Ethora runs as a self-hosted chat server in VITALL’s own AWS account in Canada, with one isolated tenant per clinic, chat in the practitioner portal and in native iOS, Android and React Native patient apps.

Users, rooms and clinics are provisioned by VITALL’s backend through the Ethora API.

  • Self-hosted in the customer’s AWS account in Canada
  • One isolated tenant per clinic, created by API
  • Web portal, iOS, Android and React Native SDKs
Read the case study: Healthcare: self-hosted patient messaging for a multi-clinic digital health platform in Canada

Insurance: in-app chat for a workers’ comp health insurance provider (HIPAA compliant)

Atom Advantage provides workers’ compensation and health insurance solutions in the United States.

On Ethora they built Atom Connect: secure, case-based chat between injured workers, nurses and case managers, embedded in their claims portal and a white-label mobile app. HIPAA and SOC 2 compatible.

Less manual work for case managers and a better experience for injured workers.

  • Chat embedded in the case managers’ web portal
  • White-label iOS and Android app for injured workers
  • One secure room per claim, created automatically by API
Read the case study: Insurance: in-app chat for a workers’ comp health insurance provider (HIPAA compliant)

Communities: fan chat app with second-screen rooms and digital collectibles

A cross-platform social app uniting the automotive community around racing events.

Fan rooms for teams and drivers, second-screen events, and collectibles handed out and traded through chat bots.

  • Cross-platform iOS and Android app
  • Fan rooms and second-screen events
  • Collectibles distributed in chat
Read the case study: Communities: fan chat app with second-screen rooms and digital collectibles

Energy: dedicated chat server, AI-agent rooms and a React Native app for a procurement platform

Preshent is a US platform for energy-project procurement with AI-driven decision support.

Ethora provides the conversation layer: a chat room per project workspace shared by people and the AI agent, a dedicated chat server in Preshent’s own cloud, push notifications and a React Native app.

  • 1,130 chat rooms, one per workspace
  • AI agent as a participant in every room
  • Dedicated chat server, 99.99%+ uptime
Read the case study: Energy: dedicated chat server, AI-agent rooms and a React Native app for a procurement platform

Professional services: a private, self-hosted AI assistant for a corporate intelligence firm

A London corporate intelligence and investigations firm whose analysts could not use public AI assistants on confidential client work.

Ethora designed a private AI assistant: a single-tenant server with AI agents, document search and an open-weight model on the firm’s own GPU, managed by Ethora in a London cloud region or installed on a workstation in the office.

  • Local open-weight LLM, no public AI services
  • Single-tenant server, UK hosting
  • Cloud GPU or on-premise workstation
Read the case study: Professional services: a private, self-hosted AI assistant for a corporate intelligence firm
Get started

Rooms that feel like places, characters that stay in character

Chat rooms, guest identities, AI agents with knowledge and an MCP server to provision all of it from a script. Start on Ethora Cloud or self-host.

Start Free
Chat + AI agents in one platform Hosted MCP server Cloud or self-hosted