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.

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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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 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
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
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.