spawn-mcp
spawn-mcp is a local MCP server that lets an AI coding agent build, push, inspect, and play Spawn games end-to-end across both engine lanes (pre-6.0 document worlds and 6.0+ git-repo worlds).
Project setup & auth: bootstrap keys into durable tokens, create/list games, set variants, scaffold or clone projects, fetch world docs and skills.
Build & push: validate projects, push changes live (PUT for document worlds; commit+git push for 6.0 worlds), pull/merge upstream work, check status and engine version.
Live world inspection: run read-only JS in a live room, fetch logs, list active rooms — after booting a room with a player body or browser.
Play as a body: join/leave/status a headless player session, move, look, query players/inputs, witness, take screenshots, run play scripts.
Play via browser: open headed Chromium on the game, screenshot, send keyboard/mouse input, reload, read console output, evaluate top-frame page JS.
Asset management: sync/scan a cross-project asset bank, search for previously used assets, add notes/verdicts, preview CDN assets.
Local auditing: scan exported functions for auditability, run numeric invariant checks on pure functions, and check which UI surfaces exist.
Multi-agent & team mode: delegate work to Savi's sub-agents, monitor Savi's fleet, and use team-mode tools for shared ledgers, claims, briefs, and serialized pushes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@spawn-mcpPush my latest changes and take a screenshot of the live game."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
spawn-mcp
Local Model Context Protocol server for the Spawn Games agent API — on both of Spawn's engines: pre-6.0 worlds, which are a spec document, and 6.0+ worlds, which are a git repository. It also carries two ways to be in the game: a body in the world as a real player (no browser), and a Playwright Chromium play client so the LLM can open the live game, screenshot it, drive input, and debug without asking you to look.
New here? Read GETTING-STARTED.md instead: a plain-language walkthrough from install to your first game, no MCP experience assumed. The rest of this file is the technical reference.
Install
git clone https://github.com/wfbcargo/wfbcargo_spawn_mcp.git
cd wfbcargo_spawn_mcp
npm install
npm run build
npm run setup # one-time: downloads Chromium (~150MB) for the play clientnpm run setup is separate on purpose, so npm install never downloads a browser behind your back. The API tools work fine without it; only the spawn_play_* tools need Chromium. Equivalent: npx playwright install chromium.
What else you need
For | Needed when | |
Node 18+ | everything | always |
git on |
| the world is on engine 6.0+ — its code is a git repo |
Chromium ( |
| you want to see the world |
| you want a body in the world (the client's session shell is spawned as |
None of the last three are needed for a pre-6.0 world you only push to. Nothing here is bundled: each tool says what is missing, and why, if you reach for it without.
Related MCP server: mcp-devtools
Cursor config
{
"mcpServers": {
"spawn": {
"command": "node",
"args": ["/absolute/path/to/wfbcargo_spawn_mcp/dist/index.js"],
"env": {
"SPAWN_PROJECT_DIR": "/absolute/path/to/your-spawn-game"
}
}
}
}See mcp.example.json. On Windows use forward slashes (C:/Users/you/...).
Env var | Default | Purpose |
| process cwd | Game project holding |
|
|
|
| unset |
|
| shared | Ledger location, for agents that are not worktrees of one repo |
|
| Cross-project asset catalog directory |
|
| Abort API calls that hang |
|
| Abort a git command that hangs (6.0 worlds) |
| pinned in | Dev override only; must be |
| Playwright default | Override where Chromium is installed |
Loop
edit → spawn_validate → spawn_push (PUT on pre-6.0; commit + git push on 6.0+)
→ spawn_client_join (once) a body in the world: boots the room, no browser
→ spawn_play_open (once) your eyes: headed Chromium
→ spawn_play_screenshot / spawn_play_input
→ spawn_logs / spawn_play_console / spawn_exec if broken
→ fix → push → screenshot againspawn_client_join and spawn_play_open answer different questions. A body makes the room live
so spawn_exec / spawn_logs / spawn_rooms read anything at all, and lets you play the game —
walk, look, press what the world declares. The browser is the only thing that tells you whether
the frame is any good. Join to query, look to judge.
Spawn is WebGPU/canvas, so accessibility snapshots won't see the world. Screenshots are the ground truth.
Play client (a body in the world)
Tool | Purpose |
| Stand your own body in the world as a real player — boots the room, no browser, no GPU |
| Which sessions are standing, and how much ttl is left |
| Despawn the body; the room folds when the last one goes |
| Any other client verb — |
A room boots for a player and never for a door: spawn_exec, spawn_logs and spawn_rooms
read nothing until a body stands. Before this the only way to boot one was spawn_play_open, which
needs a headed Chromium with a working WebGPU adapter. A join needs neither and takes a few seconds.
Sessions are detached and outlive the tool call, so join once and query freely. They self-expire
at ttl (default 600s) — that is what stops a forgotten body standing in someone's world — so
raise it for long work and call spawn_client_leave when done.
Requires Bun. The client's session shell is literally spawned as bun, so
Node alone gets as far as shell process failed to spawn (no pid). The client package itself needs
no install: bun x @spawnco/client is the fallback, and a global bun add -g @spawnco/client is
used when present.
Env var | Purpose |
| Path to the Bun binary, when it is somewhere unusual |
| Path to |
| Abort a client command that hangs (default |
Known upstream bug:
spawn client rundoes not work on Windows (#6). The session shell validatesscriptPathas POSIX-absolute, so aC:\…path is refused — and-efails identically, because it writes the source to a temp file and passes that path.spawn_clientdetects this and says so rather than reporting it as your script's fault. Every other verb works on Windows.Running the client under Node on Windows fails earlier still, for a related path bug (#5) — which is part of why these tools require Bun. Both issues carry the cause and a suggested patch; neither is fixable from here.
Play browser rules
Three things that cost real debugging time if you learn them the hard way:
Headed only. Headless Chromium gets no WebGPU adapter (
requestAdapter()returnsnull, SwiftShader flags included), so Spawn refuses to start and every screenshot is its "One graphics fix away" gate rather than your game.spawn_play_openprobes this and reportswebgpu: "ok" | "unavailable"with an explanation. LeaveSPAWN_PLAY_HEADEDunset, and only useheaded: falseto reach a non-Spawn page.spawn_play_evalcannot touch your game UI.ui.jsrenders into a cross-origin sandboxed iframe, sodocument.querySelectorin the top frame finds none of your buttons and reaching into the frame throws. Click UI withspawn_play_inputcoordinates: screenshot, read the button's position off the image, click it. (spawn_play_evalalso takes an expression, not a function body: wrap statements in an IIFE.)spawn_execneeds a live room and cannot read your database. Rooms exist only while a player is connected, so callspawn_play_openfirst or you get a 5xx (the error says so). The endpoint is read-only server-side and refusesapi.sqloutright, evenSELECT, so there is no way to query the game's SQLite from this server. Verify persistence through replicated state instead.
Two engines, two lanes
Spawn worlds come in two eras, and they are not two versions of one protocol — they are two different write paths. Every tool that reads or writes a world detects which one it is on and routes itself, so the tool names below are the same on both.
pre-6.0 — the document lane | 6.0+ — the git lane | |
the world is | a compiled | a git repository |
you save with |
|
|
the tree |
|
|
| scaffold the project, pull the spec | clone the repo into |
| compile + PUT | commit + push, and report the rooms' verdicts |
| pull a spec, sync scripts, |
|
| server-side schema check | local tree pre-flight — there is no server validator |
| base version, receipts, head vs published | branch, HEAD, ahead/behind, uncommitted |
| — | identical on both lanes |
On a 6.0 world the document PUT does not degrade or fall back: it answers 409 world_is_git
before it reads the body. That is what a pre-1.9 spawn_push was hitting.
engineVersion
Every lane-sensitive tool takes an optional engineVersion. Omit it and the engine is read from
the API and cached. Pass it — a semver (6.0.0, 5.4) or an era name (6.0, document) — and it
is checked against the world's real pin; a disagreement fails the call without writing
anything.
engineVersion omitted → detect from the API, cache it
engineVersion "6.0" → git lane, and verify the world really is on it
engineVersion "document" → document lane, same verification
mismatch → error, nothing writtenIt is an assertion, not an override, because the failure it prevents is a document-lane push aimed
at a git world — or a game.json scaffolded over a live clone. spawn_exec, spawn_logs and
spawn_rooms do not take it: those endpoints are identical on both lanes.
The API answers the engine question in three places, and all three are used —
GET /api/agent/v1/me and /api/agent/v1/worlds carry engine: { semver, era, git } per world,
and GET /api/sdk/v1/{id}/agent/docs carries engineVersion + era.
Working a 6.0 world
spawn_initclones. The agent token is the git password, passed per-command and never written to.git/config..envis hidden through.git/info/exclude, and this server's own files (docs, caches, screenshots) live under.git/spawn-mcp/— never in the tree, because a 6.0 world tracks.spawn/itself.Clones are shallow (
depth: 20,depth: 0for the full history). A live world'smainran to 18,500 objects and 80 MB and would not finish fetching; its tip is a few hundred objects and a few seconds. Editing, committing and pushing all work from a shallow clone.git log --notes=spawnneedsdepth: 0.spawn_pushneeds amessage, and it is not a log line. Its first line lands in the creator's chat and their changes list under your name — one plain sentence about what changed for the player.bodycarries the how, and is the only channel to Savi an agent has.Read
AGENTS.mdat the clone root; it is that world's own grammar. Then read.git/spawn-mcp/tome-api.mdin full before writing code — every shape in it is exact, and a push in another shape is refused naming the row, the line and the field.The push is the validator, and it is live. There is no dev/live split to absorb a broken tree.
spawn_validateruns a local pre-flight first (scripts ESM-parse, scene headers and cell keys agree, image bytes match their extension, no binaries underassets/), andspawn_pushruns it again over the changed files and refuses on failure — but clean locally does not mean the push will land.Worlds move fast. Savi,
execand other clones commit to the same repo, so a non-fast-forward rejection is ordinary. Pull withspawn_latest, then push again.
First connection
Spawn gear → Build with a coding agent → fresh
sbk_…key (~5 min, once).spawn_bootstrap→ token lands in project.env(masked in tool output). Use a distinctnameper agent.spawn_me, thenspawn_create_game(or list +spawn_set_variant).spawn_init— scaffolds a pre-6.0 project, or clones a 6.0 world's repo. Then read the guide and the Tome API reference it saved (.spawn/on the document lane,.git/spawn-mcp/on the git lane; a 6.0 clone also carriesAGENTS.mdat its root).spawn_play_open: agent joins as its own browser client (creator can still keep their tab open).
Multi-agent
Same creator account needs no crew setup. Each agent gets its own key (settings → build with your own agent) and can push the same game concurrently, the same model Savi's background builders use.
Publish in the Spawn UI before unleashing agents. Published (
mode=live) stays stable for players while agents mutate dev head. There is no agent publish API; agents only read live viaspawn_latest/spawn_status.One project dir (or worktree) per agent. A shared
SPAWN_PROJECT_DIRwill thrashgame.json, scripts, and.spawn/base-version. SameSPAWN_VARIANT_IDfor everyone. Credentials resolve from the project's own.envfirst, so a git worktree each (.envand.spawn/are untracked) is what makes them separate connections. A key in the MCP config env is only a fallback for projects that carry none.Start with 2 to 3 agents, partition script/area ownership, treat 409
version_conflictas normal:spawn_latest→ merge.theirs→ push.Label bootstraps (
terrain-agent, …) and callspawn_saviafter meaningful pushes — withtaskto hand Savi a slice outright, since it fans work out across its own sub-agents (up to 8) with no key, worktree, or GPU cost on your side. Cheapest capacity available, andspawn_savi_statustells you how much of it is idle; see Delegating to Savi.
spawn_status # head vs published, local base, .theirs, credential source
spawn_latest # pull head (conflict recovery)
spawn_latest mode=live # inspect published (no local write)
spawn_latest mode=live applyLocal=true # reset local to published snapshotDelegating to Savi
spawn_savi writes into the creator's studio chat, and Savi acts on what it reads there. Pass task and it can pick the work up and fan it out across its own sub-agents — up to 8, none of which cost you a bootstrap key, a worktree, a checkout, or a headed Chromium holding a GPU context. Compared to standing up another sbk_ agent it is free capacity, and it is the widest parallelism reachable from this server.
spawn_savi
message: "Pushed v12: parkour course in the north canyon."
task: "Give the canyon a night pass — lighting, ambient audio, and whatever set dressing sells it."
subAgents: 4 # optional; omit to let Savi split it as far as it splits
keepOff: ["scripts/player/**", "world.terrain"]Two rules make it work:
Delegate broad, not prescriptive. "Give the canyon a night pass" splits across sub-agents; a numbered list of edits does not. The decomposition is the part Savi's fan-out is good at, so a narrow task spends 8 agents on a job for one.
Never wait on it. The channel is one-way — no reply, no acknowledgement, no completion event. Declare your boundary with
keepOffinstead of asking for one, keep building your own area, and notice the work arriving as a head-version bump you did not cause (spawn_status), thenspawn_latestto take it.
Seeing the fleet
spawn_savi_status answers the question that makes the rest of this actionable: how many of the 8 lanes are burning right now.
spawn_savi_status
→ Savi's fleet: 4/8 wisps burning — 4 lanes free
workingOn: ["Sent wisp to rebuild the nine set pieces out of real geometry", …]
advice: "4 of 8 lanes are idle. That is 4 sub-agents you are not using…"The wisps are the little flames along the top of the play page — one per sub-agent, eight slots. No endpoint reports them, so this reads the play client you already have open (spawn_play_open): the studio broadcasts its state to that page, and the server keeps the latest broadcast plus a direct count of the flames on screen. Two readings of the same thing, so the count survives either one changing shape.
Use it in both directions. Before a handoff it sizes the slice — eight idle lanes is a bigger ask than one. After one, a new wisp lighting up is uptake, which is as close to an acknowledgement as this channel gets. It still reports no author: a burning wisp means Savi is busy and on what, never that it is busy on your task.
Idle lanes are the finding worth acting on. They are parallelism nobody had to key, check out, or supervise, and an agent building serially past four of them is choosing the slow route to the same place.
Team mode
Opt-in bookkeeping for the above. Set SPAWN_TEAM=1 in the first session's MCP config and run spawn_team_init in each agent's worktree. That writes a roster into the repo's shared .git/spawn-team/, which every worktree finds with no configuration and nobody can commit by accident, so later sessions pick the mode up on their own and need no extra config.
Tool | Purpose |
| Create the ledger if absent, register this worktree under a label |
| Every agent, how far behind head each rail is, who has unresolved receipts, open claims, recent pushes |
| Take or give up ownership of |
| Stand up a new agent's worktree: variant, own token, scaffold, roster entry |
| Ready-to-paste opening prompt for one builder, or the whole team |
Four behaviours change while it is on:
One session drives one agent.
spawn_push,spawn_latest applyLocal,spawn_revoke, andspawn_play_openlatch to the first project directory they see and refuse a second one. Identity, the version rail, and the single Chromium session all belong to one directory, so driving two from one session pushes one agent's work onto the other's rail and points its screenshots at the wrong client. Read-only tools stay free to inspect any worktree, andspawn_bootstrap/spawn_initstay free so a new worktree can be provisioned from anywhere.A globally configured
SPAWN_PROJECT_DIRis refused, with an explanation, rather than used. It would resolve every session to one.env, so every agent would push as the same connection while appearing to work in its own worktree. An explicitprojectDirargument is never refused.Pushes serialise and rebase.
spawn_pushtakes a ledger-wide lock, and from inside it "behind head" can only mean a teammate landed a push since your last sync, so it pulls first. A clean rebase costs you nothing and the 409 never happens. A rebase that collides stops the push with your work intact and the conflicts named, because that needs a decision no server should make.force: trueskips the rebase, since it is a deliberate whole-replace.Claims warn on push. Changes are diffed against the base rails, so what gets checked is exactly your own edits, and touching another agent's claim is reported alongside the successful push. Advisory by design: a stale claim must never become a hostage situation.
Claim game.json key paths (entities.player, world.terrain) and script globs (scripts/hud/**). Everything except scripts/** is claimed by key path, because spawn_init puts the whole spec in game.json; a world/foo.json-style pattern is rejected rather than silently never matching.
Solo, none of this exists: the tool list stays at 35, nothing latches, and pushes take no lock.
Adding an agent is two calls plus one command you run yourself:
spawn_team_add label="terrain" worktreePath="../game-terrain" branch="terrain"
→ returns: git worktree add -b terrain ../game-terrain # run it; this server never executes git
spawn_team_add label="terrain" worktreePath="../game-terrain" bootstrapKey="sbk_…"
→ writes its variant, trades the key for its OWN token, scaffolds, registers it
spawn_team_brief label="terrain"
→ the opening prompt to paste into a session started in that worktreeMint the sbk_ key just before the second call: they are single-use and expire in about five minutes. spawn_team_brief with no label briefs the whole team at once.
The fuller design, including what is deliberately not built and why, is in TEAM-MODE.md.
What a pull merges
spawn_latest three-way merges against the last-seen upstream, tracked in .spawn/base-scripts.json and .spawn/base-game.json. Disjoint edits compose; only genuine overlap conflicts.
Content | Merged | Conflict lands as |
| per file, by content |
|
| per key path |
|
| no | nothing, see below |
A conflict always keeps your value and names what collided (a path, or a dotted key like entities.player.hp). spawn_push refuses to run until every receipt is resolved and deleted.
world/*.json overlays are the gap. They are deep-merged onto game.json at compile time and never reconciled, so a stale overlay re-applies over freshly pulled content and pushes back up. Disjoint overlays are fine; two agents writing the same key are not, and nothing will warn you.
Projects created before this rail existed have no .spawn/base-game.json. Their first pull keeps the old whole-replace behaviour, copies the previous game.json to .spawn/replaced-game.json if that drops anything, and establishes the rail. spawn_status reports hasSpecRail.
Tools
API
Tool | Purpose |
| Trade |
| Whoami |
| Pick a game |
| Whole workflow + what this project already has (no credentials needed) |
| Scaffold project + docs (pre-6.0), or clone the world's repo (6.0+) |
| Guide, tome API, skills index — and the world's engine era + semver |
| Browse the skill menu / load a set of skills by id |
| Pull head / published / version / updateSlug (+ script sync); |
| Schema check (pre-6.0) or local tree pre-flight (6.0+) / live push — PUT or commit+push |
| Live world inspect (needs a live room; no SQL) |
| Context for Savi, or hand it a task to fan out across its sub-agents |
| How many of Savi's 8 sub-agents are running, and on what (needs a play session) |
| Disconnect / local + engine + remote health (versions, or git divergence) |
Asset bank
Tool | Purpose |
| Pull every game on your account and harvest its live spec (slow; the authoritative fill) |
| Harvest |
| Find an asset you already used, before inventing a new name ( |
| Name, categorize, describe, mark good/bad, point a bad name at its replacement |
| Check existence on the CDN; render images inline so the model can see them |
Local audit
Tool | Purpose |
| List exported functions and say which are auditable without a live room |
| Sweep pure functions across declared input domains and check invariants |
| Count which of the 21 Interface In Game UI surfaces the project has |
Play browser
Tool | Purpose |
| Launch Chromium on the play URL (headed; screenshot by default) |
| See the world after a push (jpeg by default; |
| Keys/mouse (WASD, click, drag, type); the only way to click game UI |
| Hard reload if the client didn't reshape |
| Page console / pageerror |
| Top-frame page JS only; cannot see or click game UI |
| Session health (incl. a one-line fleet read) / teardown |
Also: spawn_session prompt with the full loop (including multi-agent). spawn_getting_started returns the same text as a tool call, because most clients never surface prompts to the model.
Social baseline and drop-in games
Spawn owns a social layer that games do not rebuild: text and voice chat, parties of friends, and
doors that carry a player (and the party they came with) from one world into another. A game can
still break it — a chat box of its own, a HUD under the platform's rail, a team shuffle that splits a
party, an arrival hook that drops someone who came through a portal into the middle of a running
match. So every game is held to a social baseline, and it ships in the server rather than in a
skill: it is a requirement on every build, and spawn_getting_started is the one text every agent in
every client actually reads.
The baseline | On 6.0 | On pre-6.0 |
Chat is Spawn's; keep UI off the right-edge rail | no chat of your own; | same |
Parties arrive together and stay together |
| no party field in the docs |
A door out, and arrival from any door |
|
|
Invites are links |
|
|
Leaving never stalls a round or loses progress |
|
|
Two parts of it are deliberately stated as unknown rather than written down. The 6.0 chat skill,
which describes scripts/chat.js and the voice keys, is not served by the skills endpoint, so the
guide tells agents not to write that file from a guess. And no fetched doc says how a party follows
a member through a door, so the guide asks games to receive parties together rather than claiming a
mechanism. The reasoning is in .wiki/decisions/0002.
Drop-in games are the optional half: the shape that suits the weekly Spawn Jam
and most open briefs — playable within three seconds, one verb in one small space, safe to leave and
come back to, solo-viable but better with a party, cheap to run. spawn_getting_started nudges
towards it only when the creator has not fixed a design. The depth lives in a Claude skill,
.claude/skills/drop-in-games/: six tests a concept must
pass, eight archetypes (round-based party, course, king of the hill, social deduction, create and vote,
idle garden, hangout, co-op survival) with the Roblox, Fortnite Creative, Rec Room, .io and Jackbox
games that proved them, a design order, the 6.0 moves that make each cheap, jam-specific advice, and a
review checklist. The sourced research behind it sits beside it in reference/research.md. It is a
lens, not a rule: a creator with a vision gets their game.
Art and UI
The most common quality gap in an agent build is visual, and it has two causes worth knowing.
The engine's craft lives in skills, not in the API reference. There are ~60 of them, and the visual cluster (drawn-art, game-ui, looks, custom-materials, fx, 3d-sprites, world-composition, match-a-reference) is where textures, HUDs, colour grade, and shader surfaces are actually explained. An agent that skips them writes untextured primitives and default DOM.
Rather than rely on a prompt telling the model to go and read them, the endpoints are shaped to pull skills in: spawn_skill takes ids: [...] so the natural call carries the whole set (mechanic and look), spawn_push and spawn_play_screenshot say in their own descriptions that a plain-looking result is a missing skill rather than a missing feature, and a wrong id answers with the full menu, so guessing is cheaper than looking up.
Naming is creating. A cdn/ asset is generated on first fetch of its path and cached there forever, so the path is the asset: reference /cdn/moodboard-<slug>/<category>-<name>.<ext> and that model, texture, or clip comes into being. Agents create art by naming it, and the name is the prompt. Two consequences the tools are built around: a path cannot be re-rolled (a bad result means picking a different name, permanently), and a bare /cdn/<name>.<ext> with no moodboard folder shares one global namespace with every other game. See the asset bank below and ASSET-BANK.md.
spawn_skill ids=["game-ui","drawn-art","looks"] # load a set; a bad id returns the menu
spawn_skills # all 60, id + name + description
spawn_skills search="ui" # filter over id, name, description
spawn_skills detail="brief" # id + name only (the full index is ~9k tokens)The index is read from .spawn/skills.json when spawn_init / spawn_docs has already saved it, so browsing costs no network call; refresh: true re-fetches.
Asset bank
Because a path is an asset, the same path in two games is the same asset — cross-project sharing costs nothing and needs no tooling. What Spawn has no API for is a catalog: the guide says so outright ("there is no catalog"). So a name that produced something great is unrecoverable knowledge the moment you forget how you spelled it, and a name that produced something bad is permanently bad, because you cannot re-roll a path.
The bank is the local record of that judgment, kept in ~/.spawn-mcp/assets/ — user-level, not per-repo, since its whole value is crossing games.
spawn_asset_sync # every game on your account (start here)
spawn_asset_scan dirs=["../game-one","../game-two"] # local-only: harvest what the checkouts cite
spawn_asset_note path="cdn/…/texture-packed-earth.png" name="dirt" category="terrain" verdict="good"
spawn_asset_search query="dirt" # before inventing a name
spawn_asset_search category="terrain" # or by your own grouping
spawn_asset_search facets=true # what categories/kinds/families exist
spawn_asset_search minGames=2 # proven: reused across games
spawn_asset_preview path="dirt" # a name works anywhere a path doesStart with spawn_asset_sync. There is no asset API on Spawn (/api/agent/v1/assets and friends are 404), so the only account-wide record is what your games have pushed. The sync lists every game you own, fetches each one's current spec, and harvests it — which sees things a local scan cannot: games with no checkout on this machine, and assets a teammate or Savi pushed that never reached your disk. On the account this was built against a local scan of three projects found 169 assets and the sync found 408. It is slow by design (one spec fetch per game, four at a time; six games ≈ 3s), so it is a tool you run deliberately.
Every asset tool reports a syncAdvice line when the bank is empty, never synced, or over a week stale — not just search. A stale bank answers "no match", the model coins a fresh path, and an asset that already exists under a good name gets regenerated under a second one. Since a path cannot be re-rolled, those two names can never be merged.
Name your assets. A name is a short unique handle, and every tool that takes a path takes a name instead — spawn_asset_preview path="knight" rather than 60 characters of style family and hyphenation. Alongside it, category is your own grouping ("enemies", "ui-icons"), kept separate from the filename's prefix (model-, texture-) so a rescan can never overwrite a judgement.
Results report how many games use an asset, not how many directories. In team mode one game is several worktrees, so counting directories would report a three-agent team as three games. Each use records the variant id from that project's own .env, and the count collapses on it. Reuse across games is the best evidence an asset actually worked, so it feeds ranking and minGames filters on it.
One file per style family, plus _meta.json, with the root namespace split by prefix (root-effect.json, root-sfx.json) since it is usually the biggest group. At a measured 821 bytes/asset a 10k-asset bank is ~7.8 MB and parses in ~19 ms, so this is not about search speed — it keeps a one-field note from rewriting the whole catalog, and keeps each file openable.
spawn_asset_preview checks the storage host directly rather than the /cdn/ cook route. Storage answers a plain 200/404 and never generates, so a 404 honestly means "not created yet" instead of "not allowed to ask" — and for images it hands the bytes back inline, so the model judges the art instead of guessing from the filename. Models and audio report existence only; put those in the world and use spawn_play_screenshot.
Paths are classified as moodboard (the documented namespaced form), root (a bare global name, shared with every other Spawn game), custom, or ingested (opaque public.<base64> uploads, which carry no naming guidance and rank last).
A namespace warning is loud only while the name can still change. A path that is already generated — or already referenced by a game — cannot be re-rolled, so telling you to rename it is not advice; those collapse to one counted line per kind. A path storage has never seen gets the full recommendation, because that is the only moment it can be acted on.
The design, including what is deliberately not built, is in ASSET-BANK.md.
Local audit
Reviewing a build is slow because every question gets asked through the same instrument: a headed browser, a screenshot, and a judgement call. Plenty of those questions are arithmetic, and arithmetic does not need a browser.
Game scripts are plain JS, and the engine injects objectApi as a parameter rather than an
import — so a function that does not take api cannot reach the engine and runs fine in Node.
That is the whole basis for these two tools. Neither needs credentials, a push, a live room or
Chromium.
spawn_audit_scan # what can be checked locally, and what needs a room
spawn_audit_math # run audit/math.json
spawn_audit_math checks=[…] # try one rule without saving it firstspawn_audit_scan classifies by signature: no api parameter and no engine-only require
means the function is pure. On a real 77-script game that is 185 of 271 exported functions.
spawn_audit_math reads audit/math.json in the game project, because per-game invariants
are not knowledge a generic server can hold. This server owns the runner; the game owns the
assertions — a test runner, and tests.
{
"checks": [
{
"id": "wave-bodies-all-fit",
"module": "scripts/battle-system.js",
"export": "planWave",
"args": [
{ "name": "tier", "range": [1, 12] },
{ "name": "waveInTier", "range": [1, 5] },
{ "name": "popMult", "values": [1, 1.5, 2, 3] }
],
"select": "dropped",
"assert": { "finite": true, "max": 0 }
}
]
}Domains are range (with optional step), values, or const. Assertions cover finite
(NaN and Infinity), integer, min/max, the four monotonicity forms (increasingIn,
nondecreasingIn, decreasingIn, nonincreasingIn, naming an argument), and expr for
anything else. select pulls a field out of an object result. Failures report the exact
arguments that produced them, so a finding is a line you can paste into a REPL.
On the game this was built against, six checks over 1,020 calls run in 72 ms and pin a
formation that does not fit its zone to one wave: T3.3.
Two deliberate refusals. A sweep that exceeds its call budget reports CAPPED from N rather
than truncating quietly, because a bounded sweep reported as a full one reads as "covered
everything". And the engine-only builtins (fx, geom, three, tsl, vibe,
room-routing, primitives) are refused rather than stubbed — a stub lets a check pass
against behaviour that never ran, which is worse than a check that declines to run.
module.exports = { … } helpers are loaded and scanned alongside export function ones. Both
systems are in use, and in practice the pure math lives in the CommonJS half.
spawn_audit_ui counts something different: not "is this function correct" but "does a
pause overlay exist at all." It walks the project's scripts and scenes (git lane) or
game.json plus any folded-out scripts (document lane) and looks for each of
Interface In Game's 21 named UI surface types —
main-menu, inventory, skill-tree, and so on — scoring each found (the surface's
name turned up in a path or identifier) or missing (no evidence anywhere).
spawn_audit_ui # check audit/ui.json's `expect`, or the 6-surface baseline
spawn_audit_ui expect=[…] # try a different surface set without writing the filefound means "the name showed up," not "looks right" — or even "is built." A static
text scan cannot see a rendered screen, so it doesn't try to grade one: found is as
much as a name match can honestly claim. spawn_play_screenshot is the only thing that
can look, and every report says so.
Like audit/math.json, audit/ui.json lives in the game project, because which
surfaces a given game actually needs is not knowledge a generic server can hold:
{
"expect": ["main-menu", "in-game", "settings", "overlay", "game-over", "inventory", "map"],
"ignore": ["credits"],
"genre": "rpg",
"theme": "fantasy"
}expect replaces the 6-surface baseline (main-menu, in-game, settings, overlay,
game-over, loading) when present; ignore drops surfaces from the report entirely,
so a puzzle game with no skill tree isn't scored against having one. genre and theme
are validated against interfaceingame.com's own filter vocabulary and appended to every
reference link; an unknown surface, genre, or theme fails with the full menu rather than
scoring silently.
Every missing finding names the craft skill to load (spawn_skill) and an
interfaceingame.com/screenshots/?elements=… link. That link is handed back as a URL
for a human to open — this tool never fetches, crawls, or caches the site itself.
Its terms of use prohibit scraping, the screenshots are the games' own copyright to
begin with, and a filename this tool can't render would be worthless as reference
anyway; the 21-surface vocabulary is the useful part, and that much is hardcoded here.
Three places wire this in rather than leaving it a report someone has to remember to
run. spawn_push's own description points here for the question a screenshot can't
answer — not how a surface looks, but whether it exists at all. spawn_team_brief runs
the same check per worktree and names any missing surfaces in the brief it hands a
builder. And the savi-conductor skill checks it on its slower Maintain cadence, turning
each missing surface into a ready backlog entry that a later tick dispatches to Savi.
Development
npm run typecheck # tsc over src/ + test/
npm test # node:test suite (no browser needed)
npm run check # both
npm run build # emit dist/Tests cover the parts that silently corrupt a project when they regress: the spec compiler, the script path guards, and the three-way pull/merge in syncPulledScripts. CI runs them on Node 20/22 across Linux and Windows.
Release notes live in CHANGELOG.md. Versions are tagged v<major>.<minor>.<patch>.
The
testscript lists test files explicitly rather than globbing, becausenode --testonly expands globs itself on Node 21+, and Windows shells don't expand them either. Add newtest/*.test.tsfiles to that script or they won't run.
Security
SPAWN_AGENT_KEYlives in the game project's.envonly.Tools never echo the full token;
spawn_bootstrapandspawn_statusreturn a masked prefix..envand.spawn/are gitignored by init/bootstrap on the document lane. In a 6.0 clone.envgoes in.git/info/excludeinstead — the world's own.gitignoreis never touched — and this server's files live under.git/spawn-mcp/, because a 6.0 world tracks.spawn/itself.spawn_pushrefuses to run while any of this session's artifacts are sitting in the tree, since a 6.0 push isgit add -A.The git credential is never written down. The helper is passed per-invocation with
-c(nothing in.git/config, nothing ingit remote -v) and its body references$SPAWN_TOKEN, expanded by the shell git runs it in — so the token is never an argv element and reaches the child through its environment only. Git output is scrubbed of the token before it is returned, andGIT_TERMINAL_PROMPT=0makes a credential failure fail rather than hang.The play browser is a normal player client. It runs in a fresh, credential-free context and does not inject the agent key into the page.
Trust model
This server hands an LLM real capabilities on your machine. Worth knowing before you run it:
Filesystem writes. Every tool takes a
projectDirand writes.env,.gitignore,game.json,scripts/**, and.spawn/**under it. There is no sandbox beyond the path you pass.Git execution (6.0 worlds).
spawn_init/spawn_latest/spawn_pushrungitin that directory — clone, fetch, rebase,add -A, commit, push. A push to a 6.0 world is live in every open room within about a second; there is no staging step and no dev/live split.Code execution.
spawn_execruns JS in your live room;spawn_play_evalruns JS in the play page;spawn_play_openwill navigate to any URL it's given.Untrusted text flows back to the model.
spawn_logs,spawn_exec, andspawn_play_consolereturn server- and player-influenced content, andspawn_audit_uirenders paths and text out of the game project itself (game.json, scripts, scenes — a cloned repo may not be yours). Treat it as data, not instructions.The API origin is pinned to
https://www.spawn.coinsrc/config.ts. It is deliberately not read from the project.envand not a tool argument, so neither a cloned game repo nor the model can redirect your bearer token. Only theSPAWN_API_URLprocess env, set by whoever wrote the MCP config, can override it, and only to anhttpsorigin (or localhost).
License
MIT. See LICENSE. Unofficial community project; not affiliated with or endorsed by Spawn.
Available Tools
40 toolsspawn_asset_noteA
Name, categorize, describe or judge an asset in the bank — including a path that has not been scanned or even used yet. A name is a short handle you can use in place of the path in every other asset tool. This is the memory the platform does not keep: a Spawn asset is generated once from its path and cached there forever, so you cannot re-roll a name, and 'this name produced the wrong thing, use that one instead' is information nothing else records. Write the description while you can still see the asset.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Short unique handle, e.g. "knight" — usable instead of the path everywhere. Must be unique in the bank. | |
| path | Yes | The asset: either its bank name ("knight") or its path ("cdn/moodboard-lowpoly-cozy/model-humanoid-knight.glb"). A leading slash and a ?animations= query are normalized away. | |
| tags | No | Replaces the existing tags. | |
| verdict | No | "good" ranks it higher in search; "bad" ranks it below everything and warns on retrieval. | |
| category | No | Your own grouping, e.g. "enemies", "ui-icons", "ambient-music". Free-form; searchable and listable. | |
| replacedBy | No | For a bad name: the name or path to use instead. This is the whole point of recording a bad one. | |
| description | No | What the asset actually looks or sounds like. Write it as if for someone who cannot see it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals a non-obvious constraint: names are permanent ('cannot re-roll a name') and only this tool records which name is a bad replacement. It also hints at a temporal caveat (write description while visible). However, it does not disclose side-effects like whether fields are updated or replaced (schema says tags replace, but not in description), or if the tool triggers asset generation. This is partial transparency, not full.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose, and every sentence earns its place: function, name-handle explanation, permanence rationale, and timing advice. It is concise, readable, and avoids redundant repetition of schema parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters, no annotations, and no output schema, the description gives sufficient context for selection and invocation: what it does, when to use it, and a critical behavioral constraint. The schema already documents parameter semantics, so the description doesn't need to enumerate them. Remaining gaps include how updates/merging work for existing notes and what the return value is, but these are not essential for an agent to correctly call the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds context for the 'name' parameter (usable in place of path everywhere) and for 'replacedBy' (explains the 'wrong thing' information gap), but these mostly rephrase schema descriptions. No new syntax or format details are added beyond what the schema already provides, so the description adds marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb list ('Name, categorize, describe or judge') on the resource 'asset in the bank', and explicitly distinguishes this tool from siblings by noting it can annotate paths not yet scanned. It also frames the unique value proposition (a persistent handle usable across all asset tools), making it immediately clear what the tool does and how it differs from scan/sync/search/preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you can still see the asset ('Write the description while you can still see the asset') and for paths that have not been scanned yet. It gives context that names become reusable handles and that recording 'wrong thing' is only possible here. It does not explicitly name alternative tools or provide when-not-to-use exclusions, but the sibling list and the stated purpose make the usage context sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_asset_previewA
Check whether an asset actually exists on Spawn's CDN, and LOOK AT IT if it is an image (returned inline, so you can judge it rather than guess from the filename). Use it on an unfamiliar path before building around it, and after generating a new one to see what the name produced. Safe to call: it queries the storage host directly, which never triggers generation — a 404 means the asset has not been created yet, not that you are forbidden to ask.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Record the result (exists, size) in the bank, adding the path if it is new. | |
| path | Yes | The asset: either its bank name ("knight") or its path ("cdn/moodboard-lowpoly-cozy/model-humanoid-knight.glb"). A leading slash and a ?animations= query are normalized away. | |
| render | No | Return the image inline for image assets. false checks existence only (a HEAD request). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains safety: it queries the storage host directly without triggering generation and clarifies that a 404 means not created rather than forbidden. This prevents common misconceptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences: purpose, usage scenarios, and safety. No fluff, front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, and safety for a simple 3-parameter tool. With no output schema, it could clarify return format for non-image assets, but the schema and description together are sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds minimal parameter meaning beyond the schema, mainly reinforcing inline rendering which is already documented in the render parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks asset existence and returns images inline for visual inspection. The verb 'check' and 'look at' specify the resource and distinguish it from sibling tools like search, sync, and scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage contexts are given: use on unfamiliar paths before building, and after generating a new asset. However, it does not explicitly mention exclusions or alternatives beyond implied context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_asset_scanA
Harvest every cdn/ asset path used in a project (or any directory) into the local cross-project asset bank, recording which files and which game use it. Spawn generates an asset on first fetch of its path and keeps it there forever, so the same path in another game is the same asset — but there is no catalog API, and this bank is the only record of which names you have already used and how they turned out. Run it on each of your game projects once, then use spawn_asset_search before inventing a new asset name.
| Name | Required | Description | Default |
|---|---|---|---|
| dirs | No | Scan several directories in one call, e.g. every game project you have. Overrides projectDir. | |
| projectDir | No | Directory to scan. Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses key behavioral traits: 'Spawn generates an asset on first fetch of its path and keeps it there forever', 'there is no catalog API', and 'this bank is the only record of which names you have already used and how they turned out.' This reveals persistence, irreversibility, and sole-source-of-truth nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: first states the core action, second explains the behavioral consequence and rationale, third gives the required operational order. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description must cover purpose, side effects, and relationship to siblings. It does all that: it explains what is harvested, why the bank is the only record (no catalog API), and how to use the tool in conjunction with spawn_asset_search. The full workflow is conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both dirs and projectDir already well-described. The description adds workflow context ('any directory', 'each of your game projects') but no new syntactic or semantic detail about the parameters beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it 'Harvest every cdn/ asset path used in a project (or any directory) into the local cross-project asset bank' with a specific verb ('harvest') and resource ('cdn/ asset paths'). It distinguishes from sibling tools by explicitly directing users to spawn_asset_search for searching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage workflow: 'Run it on each of your game projects once, then use spawn_asset_search before inventing a new asset name.' This names an alternative tool and gives a clear sequence of when to use this scan tool versus searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_asset_searchA
Search the local asset bank for assets you (or your other projects) have already used. Call this BEFORE inventing a new cdn/ asset name: a path that already produced good art is reusable across games verbatim, and a path marked bad tells you what not to spell. Every result reports how many distinct GAMES use it — the strongest signal that an asset actually worked. Pass facets:true with no query to see what categories, kinds and style families the bank holds.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| name | No | Exact bank name you assigned with spawn_asset_note. | |
| slug | No | Moodboard style family without the prefix, e.g. "gothic-horror". | |
| limit | No | ||
| query | No | Free text over name, path, category, tags and description, e.g. "knight" or "mud texture". | |
| facets | No | Include counts by category, kind, style family and namespace over the whole match set. | |
| prefix | No | First token of the FILENAME, e.g. "model", "texture", "sfx". Derived from the path, not assigned by you. | |
| project | No | Only assets used in this project directory. | |
| verdict | No | "good" for names known to have worked, "bad" for names to avoid. | |
| category | No | Exact category you assigned, e.g. "enemies". Use facets:true to list what exists. | |
| minGames | No | Only assets reused in at least this many distinct games — proven-good filter. | |
| namespace | No | moodboard = the documented namespaced form; root = bare global names; ingested = opaque uploads. | |
| variantId | No | Only assets used by this game. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses result semantics ('Every result reports how many distinct GAMES use it'), the meaning of good/bad paths, and the facets behavior. It stops short of explicitly stating side effects or output shape, but 'search' implies read-only and the added detail exceeds a bare description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct value: purpose, when-to-use, result interpretation, and advanced facet exploration. It is front-loaded with the main purpose and contains no redundancy or filler. Efficient for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no required fields, and no output schema, the description covers the crucial workflow context well: when to call, how to reuse paths, how to judge signals, and how to browse facets. It doesn't enumerate return fields (e.g., pagination or limit behavior), but the rich input schema compensates, making this a strong, near-complete description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high (85%+), so baseline is 3. The description adds extra meaning for key parameters: it explains the `facets` usage pattern, ties result game-count to `minGames` filtering, and links 'bad' verdicts to spelling pitfalls. This supplements the schema descriptions meaningfully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Search the local asset bank') and clearly defines the scope ('assets you (or your other projects) have already used'). It also differentiates from siblings by emphasizing 'search' versus scan/sync/note, and by connecting to the workflow of reusing verified assets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Call this BEFORE inventing a new cdn/ asset name'. It also provides a concrete alternate usage ('Pass facets:true with no query to see what categories, kinds and style families the bank holds') and explains how to interpret results (distinct GAMES usage count, good/bad paths). This is actionable and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_asset_syncA
Sync the asset bank with your Spawn ACCOUNT: list every game you own, fetch each one's current server-side spec, and harvest the cdn/ assets it actually uses. This is the authoritative fill — it covers games you have no local checkout of, and assets a teammate or Savi added that never landed on your disk, neither of which a local spawn_asset_scan can see. SLOW BY DESIGN: one spec fetch per game, each carrying every script source, so expect seconds to low minutes on a large account. Run it once to populate an empty bank, and again when the other asset tools say the bank is stale. There is no asset API on Spawn — the specs are the only account-wide record of which assets exist.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | dev = current head, what agents push to (default). live = the published snapshot players see. | dev |
| projectDir | No | Project whose .env supplies the agent key. Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| variantIds | No | Sync only these games. Defaults to every game on the account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels. It discloses the operation is 'SLOW BY DESIGN' with expected duration, explains what it overcomes, and notes the absence of an asset API. It also implies account-wide scope and the authoritative nature of the sync, giving the agent a clear behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded. It opens with the core action, then explains value, performance, usage triggers, and underlying rationale. Every sentence adds meaningful context without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (account-wide sync, slow, no output schema), the description is remarkably complete. It covers purpose, what it can see beyond local scans, performance expectations, when to run, and why it's necessary. No crucial context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add parameter-specific details beyond the schema, but it provides context for the overall behavior that involves these parameters (e.g., account-wide sync). The schema descriptions suffice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Sync') plus resource ('asset bank') and method ('list every game you own, fetch each one's current server-side spec, and harvest the cdn/ assets'). It explicitly differentiates from sibling spawn_asset_scan by noting coverage of games without local checkout and assets added by teammates or Savi.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use: 'Run it once to populate an empty bank, and again when the other asset tools say the bank is stale.' It also contrasts with spawn_asset_scan, explaining what this tool covers that the scan cannot, giving an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_audit_mathA
Run declared numeric invariants over the game's pure functions, locally: no browser, no live room, no push, no credentials. Sweeps each function across its declared input domain and reports the exact arguments that broke a rule. Catches what playing the game catches slowly and unreliably — NaN and Infinity, divide-by-zero at boundary inputs, difficulty curves that flatten or invert, values escaping their declared bounds. Reads audit/math.json by default; pass manifest for another path or checks to try one inline without writing a file. Use spawn_audit_scan first to see what is auditable.
| Name | Required | Description | Default |
|---|---|---|---|
| json | No | Return the full machine-readable report instead of the compact summary | |
| checks | No | Inline checks, same shape as the manifest's `checks`. Overrides the file. | |
| manifest | No | Manifest path, relative to the project. Default audit/math.json | |
| projectDir | No | Absolute path to the Spawn game project. Defaults to SPAWN_PROJECT_DIR or cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that execution is local with 'no browser, no live room, no push, no credentials,' and that it sweeps the declared input domain and reports exact failing arguments. It stops short of stating the read/write profile of the project (the 'without writing a file' clause only hints at it) and says nothing about failure exit behavior or runtime limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope before the elaboration, and the parameter notes come last. The em-dash enumeration of failure classes (NaN, Infinity, divide-by-zero, flattened curves, out-of-bounds values) is slightly long but each item adds discriminating information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must imply the return shape; it does so by promising 'the exact arguments that broke a rule' and the `json` param documents 'full machine-readable report instead of the compact summary.' Combined with the local-execution and prerequisite context, an agent has enough to call it correctly, though the precise report structure is only sketched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema for two params: it clarifies that the default manifest is read from audit/math.json and that `checks` is an inline alternative that overrides the file without writing one. It says nothing extra about `json` or `projectDir`, which is acceptable given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Run declared numeric invariants over the game's pure functions, locally.' It further scopes the tool against siblings by naming spawn_audit_scan as the discovery step and contrasting with 'playing the game,' so an agent can place it precisely among the audit tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use spawn_audit_scan first to see what is auditable,' which is a concrete prerequisite and alternative. It also gives the usage context ('catches what playing the game catches slowly and unreliably'), so the when-to-use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_audit_scanA
List a game's exported functions and say which can be audited locally. Engine-coupled functions take objectApi as a parameter (the engine injects it, never imports it), so the signature alone decides: no api parameter and no engine-only require means the function is pure and runnable in plain Node. Run this BEFORE writing an audit manifest — it tells you what there is to check. No browser, no room, no credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project. Defaults to SPAWN_PROJECT_DIR or cwd. | |
| auditableOnly | No | Hide functions that need a live room (the usual case when writing a manifest) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does useful work: it discloses that the scan needs "No browser, no room, no credentials," implying a static, side-effect-free read, and explains the classification heuristic it applies. It never explicitly states that it does not modify the project or how large projects are handled, so it leaves a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the remaining sentences explain the classification rule and the call-site timing without filler. It is slightly dense in the middle (objectApi/engine-only require), but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description still tells the agent what comes back (exported functions plus an auditability verdict) and what the tool requires. It omits the concrete shape/format of the result and any pagination or scale caveats, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so projectDir and auditableOnly are already documented, establishing a baseline of 3. The description's discussion of objectApi concerns the game's functions rather than this tool's parameters, and it never explains what auditableOnly=true actually filters, so it adds little parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List a game's exported functions") plus the discriminating output ("say which can be audited locally"), which cleanly separates it from siblings like spawn_audit_math and spawn_audit_ui that consume the manifest rather than discover it. An agent can tell what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance: "Run this BEFORE writing an audit manifest — it tells you what there is to check." That is a clear when-to-use condition. It stops short of naming the sibling tools it precedes or stating when NOT to use it, so it is short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_audit_uiA
Locally count which of the 21 Interface In Game UI surfaces this Spawn game project has: no browser, no live room, no push, no credentials. This is a text scan, not a look at the screen, so it can only tell you found or missing, never whether a surface is actually built or styled — a missing verdict means go build that surface: load the skills the report names with spawn_skill, then re-run this tool to confirm it. found means only that the surface's name turned up in a path or identifier; it is not a verdict on completeness or appearance, and spawn_play_screenshot is the only authority on how a surface actually looks. Reads audit/ui.json's expect list by default, falling back to a 6-surface baseline (main-menu, in-game, settings, overlay, game-over, loading) when the file is absent; pass expect to try a different surface set without writing the file. Every finding also carries an interfaceingame.com reference link for a human to open — this tool never fetches that site itself. An unknown surface id, in expect here or in audit/ui.json's expect/ignore, fails with the full 21-slug menu instead of silently scoring it as missing.
| Name | Required | Description | Default |
|---|---|---|---|
| genre | No | Interface In Game genre to add to every reference link for this call, overriding audit/ui.json's `genre`. | |
| theme | No | Interface In Game theme to add to every reference link for this call, overriding audit/ui.json's `theme`. | |
| expect | No | Surface ids to check instead of audit/ui.json's `expect` (or the 6-surface baseline, if neither exists) — try a set without writing the file first. An unknown id fails with the full 21-slug menu. | |
| projectDir | No | Absolute path to the Spawn game project. Defaults to SPAWN_PROJECT_DIR or cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so richly: no browser/live room/push/credentials needed, text-scan-only semantics, found/missing limits, default expect list from audit/ui.json with a 6-surface fallback, and the failure mode for unknown surface ids.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the key caveat (text scan, cannot judge appearance) are front-loaded, and each sentence covers a distinct behavior. It is dense and somewhat long, but the complexity justifies most of the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates by explaining return verdicts (found/missing), the reference link it attaches, and the failure mode. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: the default source and fallback for expect, the ability to try a set without writing the file, and the error behavior on unknown ids. It adds less for genre/theme beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: locally count which of the 21 Interface In Game UI surfaces a Spawn game project has. It explicitly distinguishes itself from siblings by naming spawn_play_screenshot as the authority on appearance and spawn_skill as the follow-up action, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use and when-not-to-use guidance: missing means go build the surface, load skills with spawn_skill then re-run; for appearance use spawn_play_screenshot instead. It also spells out that a found verdict is not a completeness verdict, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_bootstrapA
Trade a one-time setup bootstrap key (sbk_…) for a durable agent token. Writes SPAWN_AGENT_KEY to the project .env. The full token is NEVER returned — only a masked prefix. Bootstrap keys expire in ~5 minutes and work once.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Human-readable label for this agent connection (use a distinct name per concurrent agent, e.g. terrain-agent) | Cursor Spawn MCP |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| bootstrapKey | Yes | One-time setup key from Spawn settings (sbk_…) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it excels. It explicitly states the side effect (writes SPAWN_AGENT_KEY to project .env), the response behavior (full token NEVER returned, only masked prefix), and the key lifecycle (expires in ~5 minutes, works once). This gives the agent a complete picture of what to expect without needing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact set of four sentences, each serving a distinct purpose: stating the core exchange, the side effect, the security-masked response, and the key's time/usage limits. No redundant phrasing or filler exists. It is front-loaded with the primary action and immediately provides critical operational details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema and no annotations, the description provides a complete operational picture for a 3-parameter tool of moderate complexity. It explains the return value (masked prefix), the persistent side effect (.env write), and the constraints on the input key (expiry and single-use). This is sufficient for an agent to invoke the tool correctly and interpret the result, making it contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with descriptions for all three parameters, so the baseline is 3. The description adds minimal parameter-specific meaning beyond the schema: it reinforces the bootstrap key format (sbk_…) and its one-time nature, but it does not add value to the 'name' or 'projectDir' parameters beyond their schema descriptions. The schema does the heavy lifting here, so no additional credit is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb "trade" to explain the exchange of a bootstrap key for a durable agent token, clearly identifying the resource and action. It also mentions the side effect of writing to .env, which distinguishes it from sibling tools like spawn_revoke or spawn_me. The purpose is unmistakable and unique among the listed siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when you possess a one-time setup bootstrap key) and provides critical timing constraints (keys expire in ~5 minutes and work once). However, it does not explicitly name alternatives or situations where this tool should not be used, such as when a durable token already exists. Overall, the context is clear but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_clientA
Run any other verb of the packaged client against your standing body — spawn client <verb> …. Join first (spawn_client_join); these all act through that session.
The verbs the current client serves: where (your pose, world, place and the nearest objects — a sim read, no pixels), players (every body in the room and where it is), inputs (the world's declared actions — what a key actually does HERE, read it before sending any), move <x> <y> <z> or move --to <objectId> with --speed walk|run|teleport, look --at <objectId|x,y,z>, witness (the room as a picture), crossing (portals and slot census), screenshot, run <file> or run -e "<source>" (a play script: play.key / press / hold / release / walk / face / moveTo / where / players / entities / state / until).
The verb list belongs to the client the STACK serves, not to this server, so it can gain verbs without this tool changing — if one is not recognised, spawn_client verb:"--help" is not it; the client's own error names what it takes. --origin is refused: it would send your token to another stack.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | Arguments, one array element each — never one joined string. `move 8 0 18 --speed walk` is ["8","0","18","--speed","walk"]. | |
| verb | Yes | The client verb: where, players, inputs, move, look, witness, crossing, screenshot, run, … | |
| session | No | Session name, so one machine can stand more than one body (default 'default'). Every verb takes it; a session self-expires at its ttl. | |
| projectDir | No | Absolute path to the Spawn game project (.env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose key behaviors: `--origin` is refused and why (token exfiltration), unknown verbs surface the client's own error, and the verb set can evolve independently of this tool. It is silent on permissions and return shapes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and prerequisite are front-loaded, but the middle is dense with long parentheticals enumerating verbs, and the closing note about `verb:"--help"` is convoluted. Most content earns its place, yet the prose is heavier than needed for a dispatcher.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a passthrough dispatcher with no output schema and no annotations, the description covers prerequisites, verb semantics, session behavior (ttl via schema), and the security constraint. It does not describe return formats, but that gap is modest given the open-ended verb surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 is the baseline, but the description meaningfully enriches the `verb` parameter by explaining what each accepted value does (e.g. `where` is a sim read, no pixels; `inputs` describes key semantics HERE) and clarifies the arg-array convention that the schema also states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (dispatcher that runs any client verb against a standing body) and names the prerequisite sibling (spawn_client_join). It does not, however, differentiate itself from other exec-style siblings such as spawn_exec or spawn_play_console, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance ('Join first'), a routing hint to read `inputs` before sending any, and notes the verb list belongs to the client rather than this server. It stops short of stating when NOT to use this tool versus the narrower play/screenshot siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_client_joinA
Put YOUR OWN BODY in the world as a real player — no browser, no GPU. This is the cheap way to get a LIVE ROOM, and a live room is what spawn_exec and spawn_logs need: a room boots for a player and never for a door, so until a body stands they answer 409 no_live_room / 5xx. Before this, the only way to boot one was spawn_play_open (headed Chromium with a working WebGPU adapter); this needs neither, so it works on a machine with no GPU and costs a fraction of the time. It is also how you PLAY the game you are building: the body is a real player wearing your name, it appears in the room's census beside the creator and Savi, and the world's own player hooks fire for it like anyone's.
The session is a detached background process that outlives this call, so join once and then use spawn_exec / spawn_logs / spawn_client freely. It SELF-EXPIRES at ttl (default 600s) — that is the safety net that stops a forgotten body standing in someone's world forever — so raise ttl for a long session and call spawn_client_leave when you are done. Needs Bun (the client's session shell is spawned as bun); the error says so if it is missing.
Joining is the same on every engine — it is the play door, not the write path — so this takes no engineVersion.
| Name | Required | Description | Default |
|---|---|---|---|
| as | No | Display name for the body (defaults to your account's name). | |
| ttl | No | Seconds the body stands before it self-departs. The room stays live for exactly this long, so size it to the work: a screenshot loop is minutes, not hours. | |
| body | No | Model URL to wear (a /cdn/ address or an https .glb), instead of the default body. | |
| world | No | World to join: an @user/world address, or a world id. Defaults to this project's SPAWN_VARIANT_ID, which is usually what you want. | |
| session | No | Session name, so one machine can stand more than one body (default 'default'). Every verb takes it; a session self-expires at its ttl. | |
| projectDir | No | Absolute path to the Spawn game project (.env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does so: it discloses that the session is a detached background process outliving the call, that it SELF-EXPIRES at ttl, that Bun is required and the error surfaces if missing, and that the body appears in the room census with player hooks firing. It even states the failure modes (409 no_live_room / 5xx) an agent will hit before joining.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense – the first sentence establishes what it is and its key advantage. Three paragraphs are long for a six-param tool, and the 'live room / no browser, no GPU' framing is restated in slightly different words, but every sentence still carries substantive information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description supplies what an agent needs: prerequisites (Bun), process lifetime semantics, expiry defaults and how to change them, error conditions, and the follow-up verbs to use or to call on cleanup. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents all six parameters. The description adds real meaning on top: ttl is framed as the safety net bounding how long the room stays live, with advice to size it to the work (minutes for a screenshot loop), plus the note that no engineVersion is accepted because joining is the engine-agnostic play door.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Put YOUR OWN BODY in the world as a real player') and immediately positions it against the obvious alternative (spawn_play_open's headed Chromium). It also names the downstream verbs it unblocks (spawn_exec, spawn_logs) and the exit verb (spawn_client_leave), so the agent can differentiate it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: you need it because spawn_exec/spawn_logs answer 409 no_live_room until a body stands. Explicit when-to-prefer-it: no GPU and cheaper than spawn_play_open. Explicit lifecycle guidance: raise ttl for a long session, call spawn_client_leave when done.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_client_leaveA
End the session and despawn the body — the graceful departure (the despawn is journaled before the socket closes). The room folds when the last body leaves, so spawn_exec and spawn_logs stop working after this until something else is standing. Call it when you are done; a session left alone self-expires at its ttl anyway.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Session name, so one machine can stand more than one body (default 'default'). Every verb takes it; a session self-expires at its ttl. | |
| projectDir | No | Absolute path to the Spawn game project (.env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: the despawn is journaled before the socket closes, the room folds when the last body leaves, spawn_exec and spawn_logs stop working after this, and sessions self-expire at ttl. It does not cover failure modes such as calling with no active session, but the key side effects and state transitions are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded in the first clause, and each subsequent sentence adds a distinct consequence (journaling, room folding, dependent-tool breakage, self-expiry) rather than padding. Slightly dense with em-dash clauses, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, zero-required teardown tool with no annotations or output schema, the description covers purpose, side effects, and timing sufficiently. It omits return value and error behavior, but no output schema exists to require the former, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (session, projectDir) are already fully documented in the schema. The description echoes the ttl self-expiry behavior but adds no syntax or format detail beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource and scope: 'End the session and despawn the body.' It clearly distinguishes itself from siblings like spawn_client_join and spawn_client_status by describing a teardown operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call it when you are done' gives clear invocation context, and 'a session left alone self-expires at its ttl anyway' tells the agent this is optional and offers an implicit alternative (do nothing). It stops short of naming a sibling alternative or explicit when-not conditions, but the context is well established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_client_statusA
Is a body standing, and for how much longer? Reports each session's pid, world, connection phase, entity id and REMAINING TTL. Check it before spawn_exec / spawn_logs when they answer no_live_room: an expired session is the usual reason, and the fix is to join again rather than to debug the endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| session | No | Session name, so one machine can stand more than one body (default 'default'). Every verb takes it; a session self-expires at its ttl. | |
| projectDir | No | Absolute path to the Spawn game project (.env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose real behavior: sessions self-expire at their ttl, remaining TTL is reported, and an expired session is the common cause of no_live_room. It stops short of stating that the call is strictly read-only/polling and whether it has side effects, but the reporting framing makes the safe-read nature reasonably clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the decision question and then the actionable routing advice. The rhetorical opening costs a few words, but nothing is filler and the trailing guidance is the highest-value content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly enumerates the returned fields (pid, world, connection phase, entity id, remaining TTL), which is exactly what an agent needs to consume a status report. Combined with the failure-mode routing, nothing essential is missing for a simple two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (session, projectDir) are already documented with defaults, and the schema itself explains that a session self-expires at its ttl. The description reinforces the TTL concept but adds no syntax, format, or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('reports each session's pid, world, connection phase, entity id and REMAINING TTL') and answers the question the tool exists for (is a body standing and for how long). This is unmistakably distinct from spawn_client_join, spawn_client_leave, and the generic spawn_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call it ('Check it before spawn_exec / spawn_logs when they answer no_live_room'), diagnoses the usual cause (expired session), and prescribes the remedy (join again rather than debug the endpoint). Both the trigger condition and the follow-up action are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_create_gameB
Create a new game in the creator's account. Optionally writes SPAWN_VARIANT_ID to .env. Creator should open the play URL and keep it open. The engine a new world is pinned to is the platform's choice, not an argument here — the result reports which lane it landed on, and spawn_init then provisions for that lane (a clone on 6.0+, a scaffold on pre-6.0).
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| setVariant | No | Write SPAWN_VARIANT_ID into the project .env |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: the .env write side effect, the platform-chosen engine lane, and that the result reports the lane. It omits auth/permission requirements, idempotency of game creation, and any error or revert behavior, leaving notable gaps for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main action is front-loaded in the first sentence, and subsequent sentences each carry non-redundant information (side effect, play URL, lane behavior, follow-up tool). The final sentence is dense and slightly winding but earns its place by explaining pinning behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema creation tool the description covers purpose, a side effect, the follow-up tool, and partial return behavior ('reports which lane'). It still leaves out what the result actually returns (play URL format, game id), auth needs, and failure modes, so it is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both projectDir and setVariant, so the schema already documents them; baseline is 3. The description only adds the loose mapping of the .env write to setVariant and clarifies that engine is not a parameter, without new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new game in the creator's account') that an agent can act on directly. It also clarifies a non-obvious scoping detail: the engine/world pinning is not a caller argument. However, it never explicitly distinguishes itself from nearby siblings like spawn_bootstrap or spawn_init, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the workflow note that 'spawn_init then provisions for that lane' and the instruction to keep the play URL open, which tells the agent what comes next. It stops short of explicit when-to-use/when-not guidance or naming an alternative creation path, so it is adequate but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_docsA
Fetch this world's guide, the Tome API reference, and the skills index — all matched to the engine version the world is pinned to, and this is also the cheapest authoritative answer to WHICH engine that is (era + semver come back in the result). On engine 6.0+ the guide IS the world's AGENTS.md: the tree grammar, the API in one screen, the git loop. On a pre-6.0 world it is the document lane's one paragraph. Optionally save under .spawn/. For just the skill menu with descriptions, spawn_skills is cheaper.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Write guide.md, tome-api.md, skills.json under .spawn/ | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses side effects (writes guide.md/tome-api.md/skills.json under .spawn/), that a passed engineVersion is an assertion that FAILS without writing on mismatch, and that engine detection is cached. It stops short of describing return shape or what the failure looks like, but the mutation and idempotency profile is unusually well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then alternatives, in three tight sentences. Vocabulary is dense ('Tome API reference', 'document lane's one paragraph', capitalized 'IS') and assumes domain familiarity, which costs a point but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly compensates by naming what comes back (era + semver) and how guide content differs by engine era. Combined with the schema's full coverage of projectDir/engineVersion, an agent has enough to call it correctly; only the precise failure/output format is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the three parameters are already fully documented in the schema (including the assertion semantics of engineVersion). The description adds only marginal value here — the 'Optionally save under .spawn/' note mirrors the save parameter and the engine-detection note duplicates the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and three concrete resources (this world's guide, the Tome API reference, the skills index), scoped to the pinned engine version. It explicitly distinguishes itself from the sibling spawn_skills ('For just the skill menu with descriptions, spawn_skills is cheaper'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('cheapest authoritative answer to WHICH engine that is') and an explicit alternative for the narrower need (spawn_skills for the skill menu). It also describes the version-dependent content an agent will get, which is decision-relevant context for choosing it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_execA
Run a read-only JavaScript snippet against the live room (e.g. query objects, read an object's state). Pushing is the only write path. Needs a LIVE ROOM, and a room boots for a PLAYER, never for a door: the cheapest way to get one is spawn_client_join, which stands your own body in the world with no browser and no GPU (spawn_play_open boots one too, and is the right call when you need to SEE rather than query). Without either you get 409 no_live_room or a 5xx. api.sql is NOT available here at all (the endpoint is read-only server-side and refuses SQL outright, even SELECT) — there is no way to read the game database through this server.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | JS to eval in the live room, e.g. return api.query({}).slice(0,50).map(o => ({id:o.id, pos:o.feetPosition, tags:o.tags})) | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it declares the operation read-only, notes pushing is the only write path, discloses error codes for missing preconditions, and explicitly rules out api.sql (even SELECT). This is rich disclosure of constraints and failure behavior beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraint, and each sentence adds a real constraint (write-path rule, room prerequisite, error codes, SQL exclusion). The parenthetical aside about spawn_play_open is slightly dense but earns its place by routing the agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param read-only tool with no output schema, the description covers prerequisites, alternatives, failure modes, and a key limitation (no SQL). It does not describe the return value or pagination behavior, a minor gap given the schema's example mapping mitigates it somewhat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (script, projectDir) are already documented in the schema, including an example return shape. The description adds context about what the script can do but no syntax or format details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Run a read-only JavaScript snippet against the live room,' with clarifying examples (query objects, read an object's state). It differentiates itself from spawn_play_open ('the right call when you need to SEE rather than query') and spawn_client_join. It does not, however, explicitly contrast with the close sibling spawn_play_eval, which an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (a LIVE ROOM), the cheapest alternative to establish one (spawn_client_join), and the alternative for visual needs (spawn_play_open). It also names the failure modes (409 no_live_room or 5xx) when neither is used. This is clear when-to-use and when-not guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_getting_startedA
START HERE before any other spawn tool. The whole workflow in one call: setup order, the art/UI skills to load BEFORE building anything visual, the push → screenshot → fix loop, and the multi-agent rules. Also reports what this project already has (token, variant, game.json, docs) so you know which step you're on. Needs no credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose one genuinely useful trait: 'Needs no credentials.' It implies a read/orientation call that inspects the project, but never explicitly states it performs no writes, so the safety profile is inferred rather than declared.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the imperative 'START HERE,' then a compact enumeration of what the call covers and what it reports. Dense but each clause carries real information; only mild redundancy between 'the whole workflow in one call' and the list that follows.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description must stand alone, and it does describe both the returned workflow content and the project-state summary, which is what an agent needs to orient. It could be slightly more explicit about the return shape, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly, including engineVersion's assertion-not-override behavior. The description's mention of what it reports (token, variant, game.json, docs) loosely maps to projectDir but adds no semantics the schema lacks; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific resource (the whole Spawn workflow) and states exactly what the call returns: setup order, skills to load, the push→screenshot→fix loop, multi-agent rules, plus the project's current state. The opening 'START HERE before any other spawn tool' explicitly separates it from siblings like spawn_docs, spawn_status and spawn_me.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The when-to-use is unambiguous: call this first, before any other spawn tool, and it tells you which step you're on from the reported project state. It stops short of naming when a sibling is the better choice once onboarding is done (e.g. spawn_docs for reference), but the routing intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_initA
Provision the project directory for this world — what that means depends on the engine, and this detects it. On engine 6.0+ (the git lane) the world's code IS a git repository: this CLONES it into projectDir (the agent token is the git password, supplied per-command and never written to .git/config), fetches the spawn notes ref, keeps .env and .spawn/ out of the tree via .git/info/exclude, and saves the docs. A non-empty directory that is not already this world's clone is refused rather than cloned over. On a pre-6.0 world (the document lane) it scaffolds as before: gitignore secrets, world/ + scripts/, pull current spec → game.json, materialize scripts. Either way the docs land in .spawn/ (guide.md, tome-api.md, skills.json).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Engine 6.0+ only: how many commits of history to clone (default 20). A live world's full history is tens of thousands of objects and may not finish fetching at all, and nothing here needs it — editing, committing and pushing all work from the tip. Pass 0 for the full history (slow, and the only way to get `git log --notes=spawn`). | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the agent token being used per-command and never persisted to .git/config, .env/.spawn exclusion, shallow vs full history behavior, and the safety refusal of a non-empty non-matching directory. It also states the side effects concretely (what files land in .spawn/).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and engine-branching are front-loaded, and the dense single block is mostly informative rather than padding. A few clauses, such as 'scaffolds as before', are vague filler, but nothing is repetitive enough to obscure the main point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema tool this covers the important ground: both execution paths, side effects, exclusion rules, auth handling and the failure mode on a version mismatch. It never states what the call returns on success beyond the docs it writes, which leaves a small gap for an agent deciding what to do next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains depth, projectDir and the engineVersion assertion in detail, so the description adds little parameter-level meaning beyond the alias 'projectDir (the clone target)'. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Provision the project directory') and goes further than most by describing the two engine-dependent modes (git-lane clone vs document-lane scaffold). It does not explicitly differentiate itself from plausible siblings such as spawn_create_game or spawn_bootstrap, so an agent still has to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the reader infers this is a first-step setup call, and the engine-version branch tells them which path will run. There is no explicit when-to-use or when-not-to-use guidance and no alternative tool is named, even though several siblings (spawn_create_game, spawn_bootstrap) could be confused with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_latestA
Take upstream's work into your project. ON ENGINE 6.0+ (git lane) this is git pull --rebase: Savi, exec, and other clones commit to the same repo, so pull before you build and again after a refused push. A dirty tree is refused rather than stashed, and a rebase that collides is aborted with your commits intact and the colliding paths named. mode / version / updateSlug / applyLocal are document-lane concepts and are refused there. ON A PRE-6.0 WORLD (document lane) it is unchanged: pull a saved spec — head (mode=dev, default), published live (mode=live), an exact version, or a published updateSlug. Head pulls sync scripts (untouched fast-forward; both-changed → .theirs) and update the base-version rail — use after version_conflict. Non-head pulls are read-only unless applyLocal:true. version and updateSlug are mutually exclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 'dev' = saved head (default); 'live' = published live version | dev |
| version | No | Exact saved spec version (mutually exclusive with updateSlug) | |
| applyLocal | No | Write pulled scripts/base-version (and game.json when saveGameJson). Defaults true for plain head pulls, false for mode=live / version / updateSlug | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| updateSlug | No | Published update slug → pinned spec version (mutually exclusive with version) | |
| saveGameJson | No | When applying: write pulled spec to game.json | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so richly: dirty trees are refused (not stashed), colliding rebases are aborted with commits intact and paths named, behavior is asserted by engineVersion rather than overridden, and lane-specific parameters are refused. This is unusually detailed behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then splits behavior into ON ENGINE 6.0+ and ON PRE-6.0 blocks, which is sensible structure. It is dense and jargon-heavy (Savi, exec, clones, rail) but nearly every sentence conveys a behavioral fact rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-annotation mutation/sync tool with no output schema, the description covers the behavioral surface an agent needs: lane differences, refusals, mutual exclusivity, and read-only vs write semantics. Return-value shape is left implicit, though 'colliding paths named' hints at it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents each parameter, but the description adds cross-parameter semantics beyond it: version and updateSlug mutual exclusivity in effect, mode/version/updateSlug/applyLocal being 'document-lane concepts' refused on git lanes, and applyLocal defaults differing per pull type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening 'Take upstream's work into your project' states a specific action (pulling/syncing upstream) and the description distinguishes two engine lanes clearly. It is distinguishable from spawn_push through the mention of 'a refused push,' though it never names the sibling tool directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use cues: 'pull before you build and again after a refused push,' and 'use after version_conflict'; non-head pulls are read-only unless applyLocal. It stops short of explicit when-not-to-use framing or naming sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_list_gamesA
List games this token can push to: { games: [{ appId, variantId, name, playUrl }] }. Ask the creator which one by name.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the transparency burden. It discloses the output format and token-based restriction, but it does not explicitly state the operation is read-only, nor does it cover error conditions or authentication details. Some behavior is clarified, but gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently communicates the tool's purpose, output shape, and a follow-up instruction. No wasted words, and the structure is clear and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with one optional parameter and no output schema, the description covers the core context: what is listed, the return shape, and the next step. It could add a brief note on read-only behavior or how projectDir affects results, but overall it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has full coverage for the single optional parameter projectDir, so the baseline is 3. The description does not add any meaning beyond the schema for this parameter; it focuses on the output and usage, not the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists games the current token can push to, with a specific verb ('List') and resource ('games'), and it distinguishes itself from sibling tools like spawn_push or spawn_create_game. It also provides the exact output shape, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for selecting a game to push to and instructs asking the creator which one by name, but it does not explicitly state when to use this tool versus alternatives, nor does it mention exclusions or prerequisites. The guidance is present but implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_logsA
Variant logs + live room script logs. Use when behavior doesn't match what you pushed — script syntax and runtime errors surface here, not in a push receipt. Needs a live room: spawn_client_join stands your own body and boots one without a browser.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses a hard prerequisite (a live room must exist, and spawn_client_join can boot one headless), but says nothing about output format, freshness/live-tailing behavior, or log volume limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it returns, then when to use it, then the prerequisite. No filler, though the em-dash aside is slightly loose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Purpose, trigger, and prerequisite are covered, but there is no output schema and the description never characterizes the return payload (format, scoping, whether logs stream or snapshot). For a diagnostics tool an agent must parse, that is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter exists and schema coverage is 100%, with the schema already documenting the absolute path, default resolution order (SPAWN_PROJECT_DIR / process cwd). The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (variant logs plus live room script logs) and the kind of content retrieved, which is enough to distinguish it from the sparse sibling set. It is a noun phrase rather than a clean verb+resource, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('use when behavior doesn't match what you pushed') and contrasts the source of truth with the push receipt. It also names spawn_client_join as the prerequisite path to obtain a live room, though it does not survey true alternative log sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_meA
Whoami — returns { userId, username } for the connected Spawn agent token.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the key behavioral detail that the tool uses the 'connected Spawn agent token' and specifies exactly what is returned. While it does not explicitly state that the operation is read-only or free of side effects, that is reasonably inferable from the 'whoami' nature, and the description adds meaningful context beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It immediately communicates the tool's essence and return format, making it highly scannable and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple identity-lookup tool, the description is highly complete: it says what the tool does, what token it uses, and what it returns. The only optional parameter is fully documented in the schema. The description could add a note about behavior when no token is available, but the low complexity does not demand it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the only parameter (`projectDir`) with a clear description of its default behavior, giving 100% schema coverage. The main description does not mention `projectDir`, but since the schema already fully documents it, the description does not need to compensate. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('returns') and resource ('connected Spawn agent token'), and explicitly specifies the return shape `{ userId, username }`. This distinguishes it from sibling tools like spawn_list_games or spawn_status, which focus on other aspects of the Spawn environment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended usage is implied: use this tool when you need the current user's identity. However, there is no explicit when-to-use guidance or mention of alternatives. No sibling tool appears to offer the same functionality, so the lack of exclusions is not problematic, but the description stops at stating what it does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_closeA
Close the Playwright Chromium session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly states the primary action (closing the session) but does not disclose edge cases such as idempotency, behavior when no session exists, or resource cleanup details. This is adequate for a simple close operation but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action and target directly. There is no redundant or unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema, basic lifecycle action), the description is largely complete. It could mention calling behavior when no session is open, but the core context is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so per guidelines the baseline is 4. The empty schema fully covers the input contract; no additional semantic explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') and resource ('Playwright Chromium session'), clearly distinguishing it from sibling tools like spawn_play_open or spawn_play_screenshot. It leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, nor any mention of prerequisites or consequences. The intended use is implied only by the name and domain, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_consoleA
Return recent browser console / pageerror messages from the play session. Pair with spawn_logs for server-side script errors.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| types | No | Filter e.g. ["error","warning","pageerror"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for disclosing behavioral traits. While 'Return' implies a read-only operation, it does not specify whether messages are cleared, the meaning of 'recent' (time window), or any side effects. This lack of detail could mislead the agent about the tool's effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The first sentence front-loads the action and subject, and the second provides a cross-reference. Structure is optimal for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description captures the essential purpose and context (browser console vs server logs), and the schema covers the filter types. However, without an output schema, it doesn't describe the return format or ordering, and the semantics of 'limit' remain unclear. For a simple read tool, this is adequate but leaves noticeable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: only the 'types' parameter has a description with example values, while 'limit' has no description. The tool description adds no parameter-specific meaning, leaving 'limit' ambiguous (e.g., count limit, default value, application scope). The description should have compensated for this missing schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('recent browser console / pageerror messages from the play session'), clearly distinguishing it from server-side logging. It also explicitly names the sibling tool spawn_logs, making the differentiation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance by stating 'Pair with spawn_logs for server-side script errors.' This tells the agent when to use this tool (client-side messages) and implicitly when not (server-side errors), offering a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_evalA
Evaluate JavaScript in the play page's TOP frame (browser context — not the Spawn room api). Use it for page-level diagnostics: WebGPU support, network state, document title. It CANNOT see or click the game's UI: Spawn renders the UI in a cross-origin sandboxed iframe, so document.querySelector finds none of your ui.js buttons and reaching into the frame throws. Click game UI with spawn_play_input coordinates instead, and read live world state with spawn_exec.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | A JS EXPRESSION evaluated in the page's top frame (not a function body — a bare `return` is a syntax error). Wrap statements in an IIFE: (() => { ...; return x; })() |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the transparency burden. It discloses the cross-origin sandbox limitation, that reaching into the frame throws, and that the tool cannot access game UI. It also explains that the script must be an expression, not a function body, which is critical behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then expands into usage scenarios, limitations, and alternatives in a compact, well-organized way. Every sentence contributes meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with no output schema, the description comprehensively covers purpose, usage, limitations, and alternatives. The only minor gap is not explicitly stating that the expression's return value is returned to the caller, but this is reasonably inferred from 'Evaluate JavaScript'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with a detailed description of the 'script' parameter (expression vs. function body, IIFE syntax). The tool description adds contextual value by clarifying what the script can access (top frame) and the sandboxing limitations, which enriches parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool evaluates JavaScript in the play page's top frame, distinguishing it from the Spawn room API and sibling tools like spawn_exec and spawn_play_input. It explicitly lists diagnostic use cases (WebGPU support, network state, document title), making the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance (page-level diagnostics) and when-not-to-use (cannot see/click game UI). It names alternatives: spawn_play_input for clicking UI and spawn_exec for reading world state, making the usage boundaries very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_inputA
Send keyboard/mouse actions to the play session (WASD, jump, click UI, etc.). Clicks the canvas center ONCE per session to give it keyboard focus — later batches send only the actions you list, so no stray clicks fire your weapon or dismiss UI. This is also the ONLY way to click your game's UI (ui.js renders into a cross-origin iframe that spawn_play_eval cannot reach): screenshot first, read the button's position off the image, then click those coordinates. After acting, call spawn_play_screenshot to see the result.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | jpeg (default) is 7-14x smaller on lit/textured 3D scenes (~1.3MB png vs ~90KB jpeg) and reads the same. Prefer png for flat-shaded or pixel-art worlds, where large uniform areas compress better losslessly, or when you need exact pixels. | jpeg |
| actions | Yes | Ordered list of input actions | |
| quality | No | JPEG quality 1-100 (ignored for png) | |
| refocus | No | Force a canvas-center click before the actions (use if the game lost keyboard focus). Fires a real left click. | |
| screenshot | No | Screenshot after the sequence |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does well: it discloses the one-time canvas-center click for keyboard focus, the batching behavior without stray clicks, and the cross-origin iframe limitation. Minor inconsistency: the description says to call spawn_play_screenshot after, but the schema has screenshot=true by default; this is not a direct contradiction but could cause slight confusion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a clear purpose: definition, focus behavior, and UI workflow. It is front-loaded with the primary action and contains no fluff; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, 7 action types), the description covers the critical behavioral context: the one-time click, the UI-click method, and the follow-up screenshot step. It does not explicitly describe return values, but since the primary output is a visual screenshot and schema handles details, this is adequate. Could mention the screenshot parameter indirectly but not necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, so baseline is 3. The description adds value beyond the schema by explaining the canvas-center click behavior (relevant for click coordinates and refocus), and the pixel-from-screenshot workflow for x/y, improving practical understanding of the actions parameter and coordinate fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Send keyboard/mouse actions to the play session' with a specific verb and resource. It also distinguishes itself by noting it is the ONLY way to click the game's UI, separating it from sibling tools like spawn_play_eval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance by explaining that spawn_play_eval cannot reach the cross-origin UI iframe, so this tool is required. It also gives a concrete workflow: screenshot first, read button coordinates, then click those positions, and suggests a follow-up with spawn_play_screenshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_openA
Open the live Spawn play URL in a local Chromium (Playwright). Headed by default so you can watch. Use this as the agent's eyes/hands on the game — Spawn is WebGPU/canvas, so screenshot + input beat accessibility trees. Resolves play URL from the variant if omitted. Keep it HEADED: headless Chromium has no WebGPU adapter, so Spawn refuses to start and every screenshot shows its 'One graphics fix away' gate instead of the game. The result reports webgpu:'ok'|'unavailable'.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | ||
| format | No | jpeg (default) is 7-14x smaller on lit/textured 3D scenes (~1.3MB png vs ~90KB jpeg) and reads the same. Prefer png for flat-shaded or pixel-art worlds, where large uniform areas compress better losslessly, or when you need exact pixels. | jpeg |
| headed | No | Show a real browser window (default true). false = headless, which CANNOT render Spawn (no WebGPU adapter) — only useful for reaching a non-Spawn page. | |
| height | No | ||
| waitMs | No | Settle time after navigation before returning (default 4000) | |
| playUrl | No | Absolute play URL; otherwise resolved from the API | |
| quality | No | JPEG quality 1-100 (ignored for png) | |
| projectDir | No | Absolute path to the Spawn game project. Defaults to SPAWN_PROJECT_DIR or cwd. | |
| screenshot | No | Return an image of the viewport after open |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it reveals the default headed mode, the critical failure of headless (no WebGPU adapter, 'One graphics fix away' gate), and that the result reports webgpu status. It also explains why screenshot and input are preferred. It doesn't explicitly state that a screenshot is returned by default, but that is covered in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is six sentences and slightly verbose, but every sentence earns its place—covering purpose, usage context, and the headless pitfall. It is well-structured and front-loaded with the primary action, avoiding unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is fairly complete: it explains what the tool does, when to use it, the critical headless limitation, and what the result reports. It does not explicitly mention the default screenshot return (though the schema does), and width/height are not described, but overall it provides substantial context for an opening tool in a Playwright-based workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, just below the 80% threshold, so the description should compensate. It does add one useful semantic: playUrl resolves from the variant if omitted, and it reinforces the headed parameter. However, width and height remain undocumented in both description and schema, and the description doesn't enhance the other parameter meanings beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it opens the live Spawn play URL in a local Chromium via Playwright, using a specific verb 'Open' and resource. It distinguishes itself from siblings like spawn_play_screenshot and spawn_play_input by framing itself as the agent's 'eyes/hands' on the game.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: it should be used as the agent's primary interface, and it explicitly warns against headless mode because it cannot render WebGPU. It does not mention alternatives by name, but implies this is the entry point before using screenshot/input tools, and gives a conditional note about playUrl resolution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_reloadA
Reload the play tab (e.g. if a push didn't hot-apply to this client). Prefer waiting ~1s after spawn_push first — rooms usually reshape in place.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | jpeg (default) is 7-14x smaller on lit/textured 3D scenes (~1.3MB png vs ~90KB jpeg) and reads the same. Prefer png for flat-shaded or pixel-art worlds, where large uniform areas compress better losslessly, or when you need exact pixels. | jpeg |
| waitMs | No | ||
| quality | No | JPEG quality 1-100 (ignored for png) | |
| screenshot | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the burden falls on the description. It states the action (reload) and hints at system behavior (rooms reshape in place), but doesn't disclose potential side effects (e.g., whether state is lost, if it's safe, or if it's synchronous). This is adequate for a simple reload but lacks the depth expected without annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse sentences: the first clearly states the tool's action, the second provides a practical tip. No redundant phrasing or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's core purpose and a key usage scenario, but with no output schema and partial parameter documentation, it's incomplete. It doesn't mention return values or behavior of the undocumented parameters, leaving gaps for a tool with four optional parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only documents format and quality; waitMs and screenshot lack descriptions. The description doesn't clarify these parameters—its 'waiting ~1s' advice refers to waiting before invoking the tool, not to the waitMs parameter. Since schema coverage is only 50%, the description should compensate but doesn't, leaving agent uncertain about half the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific action 'Reload the play tab' and contextualizes it with an example ('if a push didn't hot-apply to this client'). This clearly differentiates it from sibling tools like spawn_play_screenshot or spawn_play_input, which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('if a push didn't hot-apply') and a strong recommendation to wait before reloading ('Prefer waiting ~1s after spawn_push first'), which effectively tells the agent when NOT to use this tool. It references the alternative (spawn_push) and explains the expected behavior (rooms usually reshape in place).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_screenshotA
Screenshot the open play session. Primary visual check after spawn_push — look at the image before calling the change done. Judge it as a player would: if it reads as grey boxes, flat untextured shapes, or default browser UI, that is a missing skill rather than a missing feature — load the relevant craft (spawn_skill ids: drawn-art, custom-materials, looks, game-ui, world-composition) and rewrite that code, since none of it is discoverable from the API reference. Optionally save under the project.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Also write the image to <project>/.spawn/screenshots/<timestamp>.<ext> | |
| format | No | jpeg (default) is 7-14x smaller on lit/textured 3D scenes (~1.3MB png vs ~90KB jpeg) and reads the same. Prefer png for flat-shaded or pixel-art worlds, where large uniform areas compress better losslessly, or when you need exact pixels. | jpeg |
| quality | No | JPEG quality 1-100 (ignored for png) | |
| fullPage | No | ||
| projectDir | No | Absolute path to the Spawn game project. Defaults to SPAWN_PROJECT_DIR or cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It explains the tool's purpose and implies read-only behavior (screenshot), but does not disclose return value semantics (e.g., what is returned when save=false), potential side effects, or authentication requirements. It does add valuable context about interpreting the screenshot, which exceeds a bare description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a few sentences long but each one earns its place: action, primary usage, troubleshooting guidance, and optional behavior. It front-loads the core purpose and stays focused, though it could be slightly condensed without losing value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description gives enough context for an agent to know what to do with the result ('look at the image'). It covers workflow timing, failure interpretation, and optional saving. The only notable gap is an explicit statement of the return format when save=false, but the overall guidance is robust for a screenshot tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so baseline is 3. The description adds no real parameter-level detail beyond the schema; it merely mentions 'Optionally save under the project,' which duplicates the save parameter description. The parameter semantics are adequately handled by the schema, and the description does not add further meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Screenshot the open play session.' It clearly differentiates this tool from siblings by identifying it as the primary visual check after spawn_push. No other sibling tool performs screenshots, so purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context: use it after spawn_push and before declaring the change done. It also gives a decision path (interpret the image, identify missing skills, load relevant craft) and notes an optional save. It doesn't list alternatives or when-not-to-use, but the workflow guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_play_statusA
Whether a play browser session is open, its URL, headed mode, recent error count, and a one-line read of Savi's fleet (spawn_savi_status has the detail).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations and no output schema, the description carries the full burden and does disclose what the return covers (open state, URL, headed mode, error count, fleet read), which tells the agent this is a read-only status probe. It says nothing about auth requirements, side effects, or freshness of the data, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler and the scoping/routing note parenthesized at the end. It is slightly hard to parse because it opens mid-thought ('Whether a...') instead of front-loading a verb, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument status read with no output schema and no annotations, the description does the heavy lifting by enumerating the returned fields. An agent knows what it will get and where to go for more detail; only behavioral caveats like auth or data freshness are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify; baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (play browser session status) and enumerates what state it reports, plus it points to spawn_savi_status for detail, which distinguishes it from that sibling. It is phrased as a fragment of outputs rather than an explicit verb+resource, but the purpose — reporting play session status — is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent away for detail: '(spawn_savi_status has the detail)', implying this tool gives the summary and the sibling gives depth. However there is no explicit statement of when to call this versus spawn_status, spawn_client_status, or spawn_play_open, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_pushA
Push your work live (~1s in every open room). The lane is detected from the world's engine. ON ENGINE 6.0+ (git lane) this stages, commits and git-pushes the clone: message is REQUIRED and is not a log line — its first line lands in the creator's chat and their changes list under your name, so write one plain sentence about what changed for the PLAYER ("the getaway car keeps its grip on wet streets"), never how you did it, never a file or a function; put the how in body, which is also where you leave Savi what she needs. The result carries the remote: verdict lines — rooms, players, and each room's reading of your change. A push refused as non-fast-forward means origin moved: spawn_latest, then push again. ON A PRE-6.0 WORLD (document lane) it is unchanged: compile the project and PUT the spec; on 409 version_conflict call spawn_latest, merge .theirs receipts and push again. In team mode document-lane pushes are serialised and rebased onto head first. Either way a successful push proves it parsed, nothing more — look at spawn_play_screenshot before calling the work done, and if what you pushed is visual and untextured or plainly styled, the missing piece is a skill you did not load (spawn_skill ids: drawn-art, custom-materials, looks, game-ui); spawn_audit_ui answers the other question, what UI you never built at all.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Engine 6.0+ only: the commit body — the how, and anything Savi needs. She reads it on the creator's next turn; there is no other door into her chat. | |
| force | No | Document lane only: whole-replace without base-version rail / discard .theirs (destructive) | |
| dryRun | No | Document lane: validate the push without saving. Git lane: run the local pre-flight and report what WOULD be committed, without committing or pushing. | |
| message | No | Engine 6.0+ ONLY, and required there: the commit's first line, which IS the creator's chat line. One plain sentence about what changed for the player — "the tram now stops at the north platform". Not a file, not a function, not a diagnosis. Ignored on the document lane. | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses lane detection from the world's engine, that `message` is REQUIRED on 6.0+ and lands in the creator's chat, that `body` is the only door into Savi's chat, that pushes are serialised/rebased in team mode, and that 'a successful push proves it parsed, nothing more'. It also warns that a refused non-fast-forward means origin moved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and nearly every clause carries operational weight (latency, error paths, chat-line rules). It is very dense and mixes usage, semantics and follow-ups into one block, which hurts scanability, but there is little padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, annotation-free, no-output-schema tool spanning two engine lanes and six parameters, the description covers both code paths, the required-field asymmetry, the result's `remote:` verdict lines, and the correct follow-up checks. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: `message` is explicitly framed as the creator's chat line rather than a log line, with content rules ('never how you did it, never a file or a function'), and `body` is explained as the channel for the how and for Savi. `force`/`dryRun` semantics are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a concrete verb and resource ('Push your work live') plus scope ('~1s in every open room'), and the body distinguishes this tool from spawn_latest, spawn_play_screenshot, spawn_skill and spawn_audit_ui by name. An agent can tell what it does and how it differs from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance for both engine eras, names the recovery path for two failure modes (non-fast-forward -> spawn_latest then re-push; 409 version_conflict -> spawn_latest, merge .theirs receipts, push again), and routes the agent to sibling tools for the questions this tool does not answer (spawn_play_screenshot, spawn_audit_ui, spawn_skill). Little is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_revokeA
Revoke the durable agent token (disconnect). Removes SPAWN_AGENT_KEY from project .env after success.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It clearly discloses the side effect of removing SPAWN_AGENT_KEY from project .env and adds 'after success', implying transactional behavior. It does not cover all edge cases (e.g., missing .env), but it provides meaningful behavioral context beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that front-load the primary action and then provide a specific detail about the effect on .env. No redundant or irrelevant information is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter and no output schema, the description adequately explains what the tool does and its side effect. It could mention success/failure reporting, but the core functionality and context are sufficiently covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, projectDir, is fully described in the input schema with a clear description, so schema coverage is 100%. The tool description does not add any additional parameter semantics, but the baseline of 3 applies because the schema already explains the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Revoke'), a clear resource ('the durable agent token'), and adds a parenthetical '(disconnect)' plus an explicit effect ('Removes SPAWN_AGENT_KEY from project .env after success'). This clearly distinguishes it from sibling tools like spawn_init or spawn_exec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by stating the tool is for revoking a durable agent token and includes the purpose '(disconnect)'. It does not explicitly name alternatives or exclusion criteria, but the use case is evident and sufficient for a focused revocation operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_roomsA
Active rooms + player counts for the current variant, and the room exec/logs will target. An empty list is a room you can boot yourself: spawn_client_join puts your body in the world and it appears here while the body stands.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden. It discloses return content (active rooms and player counts), the target room for exec/logs, and what an empty list implies, plus that spawn_client_join makes a body appear. It does not cover permissions, side effects beyond the empty-list case, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The first sentence front-loads the returned data; the second handles the empty-list case and routing to spawn_client_join. Slightly compressed grammar ('the room exec/logs will target') costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with no annotations and no output schema, the description explains the return concept and a key empty-state behavior. It leaves the room object structure implicit, but an agent can still invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents projectDir, so the baseline is 3. The description adds no parameter semantics beyond the schema, but none is needed for this simple optional path parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (rooms), key attributes (player counts), variant scope, and relation to exec/logs targeting, so the agent can infer this is a listing tool. It stops short of an explicit verb like 'List' and does not fully contrast with all siblings, but it is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a specific edge case: if the list is empty, use spawn_client_join to boot a room. It does not state when to call spawn_rooms versus other status/play tools, nor does it list exclusions, leaving broad usage implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_saviA
Write into the creator's studio chat, where Savi (their in-game AI companion) reads it. Two uses, and the second is the valuable one. (1) Context after a meaningful push, so you don't fight over the world. (2) HAND OFF WORK: pass task and Savi can take it on, fanning it out across its own sub-agents — up to 8 in the studio, needing no bootstrap key, worktree, or browser of its own. Check spawn_savi_status first: it counts the lanes already burning, and every idle one is a sub-agent that would be finishing work while you build. The strongest targets are the ones where your own lane is weakest: you make art by naming a cdn/ path, and that path is spent on first fetch and cannot be re-rolled, so art that needs iterating — or that the creator wants to steer — is better handed to Savi, who can try it again with them in the loop. Delegate BROAD and GENERAL ("build out the northern district"), never as a step list — the splitting is what the fan-out is good at, and a narrow task wastes it. NOTHING COMES BACK: no reply, no acknowledgement, no completion event, and no endpoint on this API reports who pushed. So declare your boundary with keepOff rather than asking for one, and never put a delegated task on your own critical path. Uptake is visible even though acknowledgement is not: spawn_savi_status shows a new wisp lighting up and what Savi has it doing, which tells you the fan-out started — not that it started on YOUR task, since nothing here reports an author. Detect the finished work by inference rather than by reading a field — head moving past your own last push (spawn_status remote.headVersion) is Savi or the creator, and in team mode spawn_team_status recentPushes is what rules out a teammate. Then spawn_latest to take it and LOOK at it: work arriving on your rail is unverified until you screenshot it, exactly like your own.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | Work to hand over, stated broadly, e.g. "Give the north canyon a night pass — lighting, ambient audio, and whatever set dressing sells it." Omit for a pure status note. | |
| keepOff | No | Areas you are still working in, so Savi routes its sub-agents around you, e.g. ["scripts/player/**", "world.terrain"]. Advisory — the same trust model as spawn_team_claim. | |
| message | Yes | What just happened, e.g. "Pushed v12: parkour course in the north canyon. Atmosphere untouched if you want it." | |
| subAgents | No | Pin how wide Savi should fan the task out (the studio allows up to 8; 1 asks it NOT to split). Omit to let Savi split it as far as it splits, which is usually the better ask. | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so richly: 'NOTHING COMES BACK: no reply, no acknowledgement, no completion event,' plus 'no endpoint on this API reports who pushed' and no author attribution. It explains how to detect uptake (wisp lighting up in spawn_savi_status) and how to infer completion (remote.headVersion advancing, spawn_team_status recentPushes). This is exactly the non-obvious mutation/side-effect context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, which is good, but the body is a dense wall of prose with repetition and asides (the status-detection recipe, the art-path tangent, the re-statement of 'nothing comes back'). Most sentences earn their place, but the block could be tightened considerably without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-standard, annotation-free tool with no output schema, the description covers everything an agent needs: what happens side-effect-wise (no reply/ack), how to verify the work landed, where to look for status, and the constraint against blocking your own critical path. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters and a baseline of 3 applies. The description adds genuine meaning beyond it: `task` must be 'BROAD and GENERAL... never as a step list' because the fan-out does the splitting, and `keepOff` declares your own boundary under the advisory 'spawn_team_claim' trust model. It also implicitly frames `subAgents` by describing the fan-out default. Slightly more value than the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a concrete verb and resource: 'Write into the creator's studio chat, where Savi (their in-game AI companion) reads it.' It distinguishes itself from the related 'spawn_savi_status' by telling the agent to check that first. The purpose is clear, though the 'write' framing is metaphorical enough that the real action (posting a message/task for an AI agent to pick up) only becomes fully explicit several sentences in.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use cases ('(1) Context after a meaningful push'; '(2) HAND OFF WORK'), a precondition ('Check spawn_savi_status first'), a boundary instruction ('never put a delegated task on your own critical path'), and guidance on target selection ('the ones where your own lane is weakest'). It also names the sibling tools to consult (spawn_savi_status, spawn_status, spawn_team_status, spawn_latest).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_savi_statusA
How many sub-agents Savi is running right now, and what they are doing. Savi's fan-out is EIGHT lanes wide, and this is the only way to see how much of it is spoken for — no API endpoint reports it. Call it BEFORE spawn_savi to size a handoff, and after one to see whether it was picked up. Idle lanes are the finding worth acting on: they are parallelism that costs you nothing and finishes work while you build, so free lanes mean you should be delegating a broader slice, not building it yourself. Reads the open play session (spawn_play_open) — the wisps are the flames along the top of the play page, one per sub-agent, and the studio broadcasts what each is working on to that same page. Attribution still does not exist: this shows that Savi is busy and on what, never that the work is yours.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the data source (the open play session from spawn_play_open), that no API endpoint exposes this, and that attribution does not exist. It does not state what happens if no play session is open or otherwise confirm read-only safety explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the answer to 'what does this return' before the routing advice, and the wisps/flames mapping is a useful concrete detail. It is somewhat long for a status tool, with the idle-lane rationale running several sentences, but little is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must cover behavior — and it does, explaining the lane model, the source session, and the attribution limitation. The exact return shape (count plus per-agent task text) is only implied rather than spelled out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no per-parameter meaning to add and the baseline is 4. The description correctly implies the tool is callable with no arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope — how many sub-agents Savi is running and what they are doing — with a concrete mechanism (the eight fan-out lanes). It is clearly distinguished from the adjacent siblings spawn_savi (which spawns), spawn_status, and spawn_play_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the call sites: before spawn_savi to size a handoff, and after one to confirm pickup. It also tells the agent what to do with the result (free lanes mean delegate a broader slice), which is actionable routing rather than vague advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_set_variantA
Set SPAWN_VARIANT_ID in the project .env (join an existing game from spawn_list_games).
| Name | Required | Description | Default |
|---|---|---|---|
| variantId | Yes | variantId from list/create games | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It states the primary mutation (setting an env var in .env) and its purpose, but does not disclose potential side effects such as overwriting existing values, validation behavior, or impact on any running game.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action ('Set SPAWN_VARIANT_ID in the project .env') and appends a clarifying parenthetical. There is no redundant language; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description captures the essential purpose and behavior. It lacks explicit return/error information but is largely sufficient given the schema coverage and simplicity, making it almost complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters fully described in the input schema. The description adds no new parameter details beyond reinforcing that variantId comes from spawn_list_games, so it meets the baseline for well-documented schema parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Set') and resource ('SPAWN_VARIANT_ID in the project .env'), then clarifies the purpose ('join an existing game from spawn_list_games'). This clearly distinguishes it from sibling tools like spawn_create_game, which create new games.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical explicitly frames usage as joining an existing game from spawn_list_games, providing clear context and a workflow hint. It does not enumerate alternatives or explicit 'when not to use' scenarios, but the context strongly implies the correct scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_skillA
Load the craft for what you are about to build — pass EVERY skill the work touches, not one. This is where the engine's real technique lives (how a HUD is actually built, how a material is written, how terrain is sculpted); the API reference only lists fields, so code written without the skills works but looks and behaves like a default. Anything visual should carry the look skills alongside the mechanic: a HUD is game-ui + drawn-art, a glowing surface is custom-materials + looks, a scene is world-composition + looks. Guessing an id is fine and cheap — a miss answers with the real menu.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Single skill id — prefer ids: [...] and load the whole set at once | |
| ids | No | Skill ids to load together, e.g. ["game-ui","drawn-art","looks"]. Pass every domain the next chunk of work touches — mechanic AND look. These are long documents (~7k tokens each), so 2-4 ids for the work actually in front of you, not the whole menu. Visual: drawn-art, game-ui, looks, custom-materials, fx, slash-vfx, 3d-sprites, world-composition, match-a-reference. Motion/camera: platformer-movement, vehicles, camera-first-person, camera-third-person, camera-isometric, camera-top-down. Systems: scripted-systems, data-and-saves, npc, enemy-ai, combat, projectiles, leaderboard, interactive-objects. Terrain/build: heightmap-terrain, voxel-terrain, structures, custom-geometry. spawn_skills is the authoritative live list. | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses that skill documents are ~7k tokens each, that loading is cheap, that a miss returns the real menu, and that skipping skills yields default-looking output. This is rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While dense, the description front-loads the core action and each sentence provides actionable guidance (what, why, combinations, error behavior). It is moderately long but earns its length for a tool with this conceptual complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description covers the essential context: when to call, what parameters to choose, size constraints, and failure behavior. It also points to spawn_skills for the authoritative list (in schema), making it sufficiently complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all three parameters in detail (100% coverage), so the bar is at 3. The description adds value by giving concrete combination examples (HUD = game-ui + drawn-art) and the token-budget rule, which are not explicit in the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool loads the 'craft' (skills) needed for upcoming work, with an explicit directive to pass all relevant skills. It differentiates from the API reference, but does not explicitly name sibling tools like spawn_skills for list retrieval within the description, slightly limiting sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: load skills before building, pass every domain touched, limit to 2-4 ids, and combine visual skills for visual work. It also notes that guessing ids is safe and cheap, with a miss returning the real menu.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_skillsA
The menu of skill ids to pass to spawn_skill, each with what it covers. Browse it when planning a build so the spawn_skill call can carry every domain the work touches — mechanic and look together. Reads .spawn/skills.json when present (no network, no credentials) and falls back to the API. If you already know roughly what you need, skip this and pass ids straight to spawn_skill; a wrong id answers with this list anyway.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | 'full' includes each skill's description (the whole index is ~9k tokens); 'brief' is id + name only | full |
| search | No | Case-insensitive filter over id, name, and description (e.g. "ui", "camera", "terrain") | |
| refresh | No | Re-fetch the index from the API and rewrite .spawn/skills.json (needs credentials) | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description properly carries the transparency burden. It discloses that it reads .spawn/skills.json when present, falls back to the API without network/credentials in that case, and that refresh requires credentials. It also mentions the approximate token size for 'full' detail, giving a sense of cost. A minor gap is that it doesn't explicitly describe the response structure or error handling for API failures, but the provided context is already strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a few well-organized sentences with no filler. The core purpose and high-level usage appear first, followed by behavior and fallback guidance. Each sentence contributes new information, and the warning about skipping the tool when you already know what you need is a valuable inclusion without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a lookup/index tool with no output schema, so the description must explain what to expect, and it does. It explains where the data comes from (local file or API), when credentials are needed, and that a wrong ID yields the list anyway. It also gives enough context about the content (skill domains, mechanic and look) to help an agent decide when to call it. The combination of purpose, usage, fallback behavior, and token-size note makes it complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with descriptions, so baseline is 3. The description adds meaningful value beyond the schema: it explains the detail parameter's token size implication, notes that search is case-insensitive over id/name/description, and clarifies that refresh rewrites the local index and needs credentials. projectDir also gets context about default resolution, though the schema already covers that. This lifts it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a menu of skill IDs for use with spawn_skill, each with what it covers. It distinguishes itself from the sibling tool spawn_skill by framing itself as the lookup/index companion to that tool. The phrase 'Browse it when planning a build' gives a concrete verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: use it when planning a build to gather all relevant skill domains, and skip it if you already know what you need, passing IDs directly to spawn_skill. It also notes that a wrong ID will answer with this list anyway, giving a fallback behavior. This clearly differentiates when to use this tool versus the sibling spawn_skill.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_statusB
Where this project stands. Always reports env (masked), credential source, docs present, and — once credentials allow — the world's ENGINE (era + semver), which decides everything else. On engine 6.0+ the remote block is git: branch, HEAD, how many commits ahead of and behind origin, and the uncommitted files. On a pre-6.0 world it is the version rail: base version, conflict receipts, headVersion vs publishedVersion.
| Name | Required | Description | Default |
|---|---|---|---|
| remote | No | When credentials exist, also read the remote (git divergence, or head + published versions) | |
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose meaningful traits: env is masked, the remote block is credential-gated, engine is detected/cached, and the engine era changes what the remote block contains. However it omits read-only/permission expectations and any rate or cost considerations, leaving gaps for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then organized by engine era (6.0+ git block vs pre-6.0 version rail). Slightly wordy with figurative phrasing ('the world's ENGINE ... which decides everything else', 'version rail'), but most sentences carry useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey return values, and it does so thoroughly for both engine eras. It is essentially complete for a status tool, though it could note that output shape depends on credential availability and detection caching more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (remote, projectDir, engineVersion) including the assertion-vs-override semantics. The description adds the concept of a 'remote block' but no parameter syntax or format beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies this as a project-level status/diagnostic readout and enumerates specific content (masked env, credential source, docs, engine era+semver, git or version rail). This makes the resource and scope concrete. It does not explicitly differentiate from sibling status tools like spawn_savi_status or spawn_play_status, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives such as spawn_getting_started, spawn_latest, spawn_me, or the other *_status siblings. Usage is only implied by the description of what it reports, which is not enough guidance for an agent choosing among many tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_validateA
Check the project before pushing. ON ENGINE 6.0+ (git lane) there is no server-side validator — the push itself is the authority and refuses typed, naming the row, the line and the field — so this runs a LOCAL pre-flight over the tree instead: every script and template is ESM-parsed, .scene files are checked against the # spawn-scene v2 yaml <cellKey> header and their filename's cell key, image bytes are checked against their extension, and binaries under assets/ are caught (law.git.asset-kind refuses them). Clean here does NOT mean the push will land. ON A PRE-6.0 WORLD it is unchanged: compile the project and run authoritative server-side schema validation. Either way, valid is not the same as good — it says nothing about how the result looks or feels, which comes from the skills you loaded (spawn_skill) before writing the code.
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | No | Absolute path to the Spawn game project (game.json / .env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd. | |
| engineVersion | No | Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it enumerates what is actually checked (ESM parse of scripts/templates, .scene header vs filename cell key, image bytes vs extension, binaries under assets/), discloses that clean does not guarantee the push lands, and that valid is not the same as good. This is exactly the behavioral context an agent needs for a validator.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the engine-era branching, and every clause is information-dense. It is long and slightly repetitive (the local-vs-server contrast is restated), but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description is nearly complete: it explains both engine-era behaviors, the assertion semantics, and the limits of the result. A brief note on the failure/return shape would close the last gap, though the absence of an output schema lessens the obligation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents projectDir and the engineVersion 'assertion, not override' semantics. The description repeats the assertion idea but adds no parameter detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check the project before pushing') and immediately distinguishes itself from spawn_push by explaining that on engine 6.0+ the push is the authority and this is a LOCAL pre-flight, while pre-6.0 it runs server-side schema validation. An agent can tell exactly what this tool does and how it differs from the sibling that ships code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly says when to use it ('before pushing') and names the related tools (spawn_push as the authority, spawn_skill as the source of visual/feel quality). It does not state an explicit when-not-to-use condition, but the pre-push context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v2.0.0- Added
spawn_audit_math - Added
spawn_audit_scan - Added
spawn_audit_ui - Added
spawn_client - Added
spawn_client_join - Added
spawn_client_leave - Added
spawn_client_status - Changed
spawn_docs1 field changed- added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +}
- Changed
spawn_getting_started1 field changed- added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +}
- Changed
spawn_init2 fields changed- added
Input schema / properties / depthAdded value: +{ + "description": "Engine 6.0+ only: how many commits of history to clone (default 20). A live world's full history is tens of thousands of objects and may not finish fetching at all, and nothing here needs it — editing, committing and pushing all work from the tip. Pass 0 for the full history (slow, and the only way to get `git log --notes=spawn`).", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +}
- Changed
spawn_latest1 field changed- added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +}
- Changed
spawn_push5 fields changed- added
Input schema / properties / bodyAdded value: +{ + "description": "Engine 6.0+ only: the commit body — the how, and anything Savi needs. She reads it on the creator's next turn; there is no other door into her chat.", + "type": "string" +} - added
Input schema / properties / dryRun / descriptionAdded value: +"Document lane: validate the push without saving. Git lane: run the local pre-flight and report what WOULD be committed, without committing or pushing." - added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +} - changed
Input schema / properties / force / descriptionPrevious value: -"Whole-replace without base-version rail / discard .theirs (destructive)"New value: +"Document lane only: whole-replace without base-version rail / discard .theirs (destructive)" - added
Input schema / properties / messageAdded value: +{ + "description": "Engine 6.0+ ONLY, and required there: the commit's first line, which IS the creator's chat line. One plain sentence about what changed for the player — \"the tram now stops at the north platform\". Not a file, not a function, not a diagnosis. Ignored on the document lane.", + "minLength": 1, + "type": "string" +}
- Changed
spawn_savi5 fields changed- added
Input schema / properties / keepOffAdded value: +{ + "description": "Areas you are still working in, so Savi routes its sub-agents around you, e.g. [\"scripts/player/**\", \"world.terrain\"]. Advisory — the same trust model as spawn_team_claim.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / message / descriptionPrevious value: -"e.g. \"Pushed v12: parkour course in the north canyon. Atmosphere untouched if you want it.\""New value: +"What just happened, e.g. \"Pushed v12: parkour course in the north canyon. Atmosphere untouched if you want it.\"" - added
Input schema / properties / message / minLengthAdded value: +1 - added
Input schema / properties / subAgentsAdded value: +{ + "description": "Pin how wide Savi should fan the task out (the studio allows up to 8; 1 asks it NOT to split). Omit to let Savi split it as far as it splits, which is usually the better ask.", + "maximum": 8, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / taskAdded value: +{ + "description": "Work to hand over, stated broadly, e.g. \"Give the north canyon a night pass — lighting, ambient audio, and whatever set dressing sells it.\" Omit for a pure status note.", + "type": "string" +}
- Added
spawn_savi_status - Changed
spawn_status2 fields changed- added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +} - changed
Input schema / properties / remote / descriptionPrevious value: -"When credentials exist, also fetch head + published (mode=live) versions"New value: +"When credentials exist, also read the remote (git divergence, or head + published versions)"
- Changed
spawn_validate1 field changed- added
Input schema / properties / engineVersionAdded value: +{ + "description": "Optional engine version this call assumes: a semver ('6.0.0', '5.4') or an era name ('6.0' for a git world, 'document' for a pre-6.0 one). Omit it and the world's engine is detected from the API and cached. When passed it is CHECKED against the real pin and a mismatch fails the call without writing anything — it is an assertion, not an override.", + "type": "string" +}
5 tool updates
v1.5.0- Added
spawn_asset_note - Added
spawn_asset_preview - Added
spawn_asset_scan - Added
spawn_asset_search - Added
spawn_asset_sync
5 tool updates
v1.4.0- Added
spawn_getting_started - Changed
spawn_play_eval1 field changed- changed
Input schema / properties / script / descriptionPrevious value: -"JS expression/function body evaluated in the page"New value: +"A JS EXPRESSION evaluated in the page's top frame (not a function body — a bare `return` is a syntax error). Wrap statements in an IIFE: (() => { ...; return x; })()"
- Changed
spawn_play_open1 field changed- changed
Input schema / properties / headed / descriptionPrevious value: -"Show a real browser window (default true). Set false for headless."New value: +"Show a real browser window (default true). false = headless, which CANNOT render Spawn (no WebGPU adapter) — only useful for reaching a non-Spawn page."
- Changed
spawn_skill3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Skill id from .spawn/skills.json"New value: +"Single skill id — prefer ids: [...] and load the whole set at once" - added
Input schema / properties / idsAdded value: +{ + "description": "Skill ids to load together, e.g. [\"game-ui\",\"drawn-art\",\"looks\"]. Pass every domain the next chunk of work touches — mechanic AND look. These are long documents (~7k tokens each), so 2-4 ids for the work actually in front of you, not the whole menu. Visual: drawn-art, game-ui, looks, custom-materials, fx, slash-vfx, 3d-sprites, world-composition, match-a-reference. Motion/camera: platformer-movement, vehicles, camera-first-person, camera-third-person, camera-isometric, camera-top-down. Systems: scripted-systems, data-and-saves, npc, enemy-ai, combat, projectiles, leaderboard, interactive-objects. Terrain/build: heightmap-terrain, voxel-terrain, structures, custom-geometry. spawn_skills is the authoritative live list.", + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "id" -]
- Added
spawn_skills
25 tool updates
v1.2.0- First observed
spawn_bootstrap - First observed
spawn_create_game - First observed
spawn_docs - First observed
spawn_exec - First observed
spawn_init - First observed
spawn_latest - First observed
spawn_list_games - First observed
spawn_logs - First observed
spawn_me - First observed
spawn_play_close - First observed
spawn_play_console - First observed
spawn_play_eval - First observed
spawn_play_input - First observed
spawn_play_open - First observed
spawn_play_reload - First observed
spawn_play_screenshot - First observed
spawn_play_status - First observed
spawn_push - First observed
spawn_revoke - First observed
spawn_rooms - First observed
spawn_savi - First observed
spawn_set_variant - First observed
spawn_skill - First observed
spawn_status - First observed
spawn_validate
TDQS
Scored across 40 tools
The 40 tools are mostly distinguishable by domain prefix and explicit descriptions, but several clusters can be confused: spawn_exec vs spawn_play_eval vs spawn_client (read-only JS vs browser JS vs client verbs), and spawn_logs vs spawn_play_console (room script logs vs browser console). Status tools also overlap across domains (spawn_status, spawn_play_status, spawn_client_status, spawn_savi_status). Descriptions mitigate but do not fully remove ambiguity.
All names use a consistent spawn_ prefix and snake_case, making grouping predictable. However, the token pattern is not uniformly verb_noun: some are domain_action (spawn_play_open, spawn_asset_sync), others are verb_noun (spawn_create_game, spawn_list_games), and a few are bare nouns or phrases (spawn_me, spawn_getting_started). This is mostly consistent with minor deviations.
40 tools is well above the 3–15 sweet spot and exceeds the 25-tool threshold for 'too many', even for a complex development platform. The surface covers many sub-domains (auth, project, play, client, audit, asset, Savi), each adding tools that could have been consolidated under fewer multiplexed commands. The count feels heavy and increases selection cost.
The surface covers the major lifecycle stages: auth, game creation/selection, project provisioning, push/pull/validate, live-room interaction, play-browser control, skills, audits, asset bank, and Savi delegation. However, a referenced tool (spawn_team_status) is absent, and there is no explicit game/variant deletion or team-management surface, leaving minor dead ends. Otherwise coverage is strong.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
FlicenseNot gradedqualityBmaintenanceRemote MCP server that gives LLMs access to run network commands63-- AlicenseBqualityDmaintenanceProduction-grade MCP server that gives AI agents safe access to your local dev environment: filesystem, databases, processes, and OpenAPI specs.1528 npm3MIT
- AlicenseNot gradedqualityDmaintenanceLocal MCP server that gives AI agents 44 engine tools to build, run, and debug real 2D and 3D games through conversation.MIT
- FlicenseNot gradedqualityBmaintenanceMCP server for the OffByOne website factory, enabling agents to generate, validate, and manage full-stack web projects through safe, deterministic tools.-