Repository navigation
EN Create Working With An AI
Français · Type: how-to · Audience: author · Context: engine repository, created project · Status: ready · Applies from: 4.2.5
quest'n'click is built to be written with an AI assistant: the game is data, every step has a tool that says whether it is right, and the human sees each change in the Studio. This page gives the method, the MCP server that hands the Studio's operations to any assistant, a typical session, the documentation search an agent uses, and how to split a big game between sub-agents.
An assistant (Claude Code, Claude Desktop, Cursor, Codex CLI, Gemini CLI, or an agent you wrote) that reads and edits
your game the way the Studio does, checks its own work with the validator, the solver, the lint and the tests, and
asks you through the notes when it should not guess. You watch the result live in npm run studio.
-
Engine repository:
npm run mcp, withGAME=<id>(orGAME_DIR=<folder>) for another game thanpackage.json→config.game.AGENTS.mdat the root is the operating manual for any assistant;CLAUDE.mdpoints to it. The skills of.claude/skills/(/storyboard,/new-room,/placement,/review,/production-plan…) are in this repository only. -
Created project: the same server is
npx quest-n-click mcp, on the game ingame/. - Hosted Studio: the same tools reach a Studio Server, as a member, through its checks: see Remote MCP.
- The MCP server exists since 1.0.0, when the project was still named web-scumm; it is named
quest-n-clicksince 4.2.5 (D47). The documentation toolssearch_docsandlist_docs, andread_doc { id }, come with 4.5.0.
- A working game:
npm run validateandnpm run solvepass (Checking your game). - Node 22.12 or later, the version the tools need.
- An MCP client configured for this server: one block per client in
Local MCP: setting up each client. In the engine repository, Claude Code finds
.mcp.jsonand Cursor finds.cursor/mcp.json: approve thequest-n-clickserver when asked.
On your machine, in the engine repository (or in the created project). The MCP client starts the server itself, with the repository as its working folder; you start the Studio in another terminal to watch.
This is the method that produced the first game built with this engine: a 9-room, 15-character family adventure, written and shipped in a single day by one person working with Claude Code. Each step has a tool in this repository, and each step ends with something the author can validate on a phone before the next one starts.
| Step | What the AI does | What you validate | Page |
|---|---|---|---|
| 1. Story first, as data | writes games/<id>/storyboard.json (skill /storyboard) |
the story, the lines, the hints | The storyboard |
| 2. The storyboard on a page |
npm run page:storyboard, published so you annotate from a phone |
your notes under each panel | Review pages |
| 3. The art |
npm run prompts, one prompt per sheet |
the sheets you generate | Images |
| 4. Cut, key, review |
tools/cut-sheet.py, npm run page:review
|
keep / redo / unused per cell | Images |
| 5. The rooms | one file per room (skill /new-room), then validate and solve
|
— | Rooms |
| 6. Placement | never types coordinates: asks you | you drag in the Studio, ?edit=<room> or the placement page |
Geometry |
| 7. Prove it plays |
npm test, npm run e2e, looks at the screenshots |
a playthrough on your phone | Checking your game |
| 8. Ship | npm run build |
the link you send | Build and release a game |
The rules an agent follows are those of AGENTS.md: content is data; logic in rooms/*.ts, geometry in
layout/*.json; the storyboard changes first, then the room; after any content change, npm run validate && npm run solve && npm test with the output reported, not summed up; a screenshot looked at after any visual change; never
delete an asset; a note in notes.json rather than a guess.
-
Start the Studio, so you see what the agent changes.
# in the engine repository, on your machine (created project: npm run studio) npm run studio
-
Connect your client to the MCP server. The command it runs is:
# in the engine repository: what the client starts, over stdio npm run -s mcp# in a created project: what the client starts, over stdio npx quest-n-click mcpKeep
-s(silent): without it, npm prints its> quest-n-click mcpbanner on stdout, which carries the protocol only, and strict clients reject it. The server's own logs go to stderr; it says[quest-n-click mcp] ready: game "<id>" (<folder>)there. The per-client blocks are in Local MCP: setting up each client.
- Ask for the work, and let the agent run a session like the one below.
- Answer the agent in the Studio's Notes tab, or by editing the storyboard. It reads you back with
get_notes.
npm run mcp starts a Model Context Protocol server over stdio, named
quest-n-click, that exposes the Studio's operations (studio-server/src/ops/core.ts) as tools. Any MCP client then
reads and edits a game exactly as the Studio does, and the human sees the result live in npm run studio, which
watches the files.
- Server:
tools/mcp/server.ts, SDK@modelcontextprotocol/sdk1.x. Its version is the engine's, read frompackage.json. - The tools are defined once, in
tools/studio/tools.ts, and shared with the Studio's Assistant (The Assistant). Each one, with its arguments: MCP tools. In short:list_rooms,get_room,set_layout,set_text,set_value,add_entity,get_storyboard,set_storyboard,get_notes,add_note,validate,solve,content_report,get_ir,world_graph,dialogue_tree,puzzle_graph,storyboard_coverage,playtests,lint,screenshot,search_docs,list_docs,read_doc,run_tests,asset_prompts,speedrun_verify. - A failing operation (an unknown room, a bad path, a broken edit…) returns a tool error with its message; the server keeps running.
Limit ·
screenshot-needs-dev-serverscreenshotrenders through a running dev server (npm run studioornpm run dev, atWEB_SCUMM_DEV_URL, defaulthttp://localhost:5173/) and Playwright; without them it says why it is unavailable. A tool whose ability the backend lacks is not offered at all.
It still works. The AI edits the files; the Studio reloads (it watches them); the human sees the result and answers in
Notes or in the Storyboard; the AI reads games/<id>/notes.json back. Git carries the history.
- Learn the game and the format:
list_rooms,get_storyboard,get_notes, and the documentation (below:search_docsthenread_doc { id, section }; or, whole,read_doc { name: "CONTENT_GUIDE" }). - Edit:
set_storyboardfirst, thenset_text/add_entityin the rooms. - Check:
validate,solve,lint,run_tests;screenshotif the human runs the Studio. - Ask:
add_notefor anything the human must decide or place; read their answer withget_notes. Notes withtask: trueare requests the human wrote from the Studio's Assistant: the agent does them, then answers withadd_noteon the sameabout.
Applies from 4.5.0 · feature since 4.5.0
An agent does not need to read whole pages. search_docs { query } searches the pages of this wiki, in English or
French: titles and questions first, then aliases, keywords and identifiers (a DSL command, an npm script, an HTTP code
such as 423), then section headings, then section text. Accents and case do not matter, and the glossary adds the
other language's words. Each result is id#section, with its title, type, context, versions and an excerpt: read it
with read_doc { id, section } (lang en or fr, at most 20,000 characters per answer by default, a cursor for
the rest). version leaves out what does not apply to that version. list_docs lists the pages by audience,
context, type, language or state. With no confident match, search_docs gives an empty list and the index pages to
try.
read_doc { name } still returns one of the eight historical pages whole: CONTENT_GUIDE, ENGINE, TOOLS,
STUDIO, WORKFLOW, AUDIO, UPGRADING, CLASSICS. Give name or id, not both.
The review pages (npm run page:storyboard, page:review, page:placement) let the author annotate from a phone.
With Claude Code:
- Build the page, then publish it with the Artifact tool, declaring the database:
capabilities: { db: {} }. Republish to the same URL after each regeneration (same file path in the same session, or passurl): the database is kept across versions. - Send the link to the author. Only people with edit rights (Contributor or more) can write.
- Read the annotations with the ArtifactData tool,
action: "list", on the artifact'surl:- storyboard: collection
notes; answer by writingrewrites/<panel id>with{ "text": "…" }(set); - review: collection
decide; list theredocells with their notes, one regeneration prompt per sheet; - placement: collection
layouts; save the documents to a JSON file and import them.
- storyboard: collection
- If the author used a plain file instead, they send the exported JSON: same content, read it directly.
The pages themselves: Review pages.
For a game of several rooms, split the work into packages that an orchestrator hands to sub-agents: engine changes,
content per group of rooms, assets, minigames, QA. The plan we used is the
Production template; in the engine repository, the /production-plan skill fills it
from the storyboard. Each package ends with validate + solve + tests + screenshots.
The client lists the quest-n-click server with its tools. Ask it to call list_rooms: it answers with the game's id,
title, hero, rooms, characters and items. An edit it makes shows in the Studio as soon as the file is written, and validate returns
{ ok, errors, warnings, ms }.
| Symptom | Cause | Fix |
|---|---|---|
| The client says the server's output is not valid JSON, or drops the connection at start |
npm run mcp without -s: npm's banner went to stdout |
Use npm run -s mcp in the client's configuration |
| The agent edits another game than the one open in the Studio |
GAME differs between the two, or config.game changed |
Give the same GAME=<id> to the client's env and to the Studio |
screenshot answers that it is unavailable |
No dev server at WEB_SCUMM_DEV_URL, or Playwright's Chromium is not installed |
Start npm run studio; npx playwright install chromium
|
read_doc answers "give either name … or id, not both" |
Both name and id, or neither |
Give one |
read_doc { id } answers that reading by id needs the documentation of wiki/
|
The backend it runs on has no documentation set | Read the page on the wiki, or use name
|
| An edit is taken back after the write |
set_value validates the game after the write and undoes an edit that adds an error |
Read the error it returns, fix the value |
What the tools write: games/<id>/rooms/<room>.ts (set_text, set_value, add_entity), games/<id>/layout/<room>.json
(set_layout, add_entity), games/<id>/storyboard.json (set_storyboard), games/<id>/notes.json (add_note), the
game file for its objectives (set_value on @game). screenshot writes a PNG under .cache/studio/. The other tools
read only. Commit small, and review the diff the agent made.
Every write is a file change in your working copy: git diff shows it and git restore <file> takes it back.
-
AGENTS.md: the rules and commands for any assistant. -
tools/mcp/server.ts,tools/studio/tools.ts. - Local MCP: setting up each client, MCP tools, Remote MCP, The Assistant.
- Production template, Contributing with AI agents.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Start (6)
Play (9)
Install (17)
- Requirements
- Install from the release archive
- Install from npm, once published
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits