Skip to main content
Glama

spawn_client_join

Join a Spawn world as a real player to boot a live room for running commands and reading logs without a browser or GPU; the body self-expires at ttl.

Instructions

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
asNoDisplay name for the body (defaults to your account's name).
ttlNoSeconds 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.
bodyNoModel URL to wear (a /cdn/ address or an https .glb), instead of the default body.
worldNoWorld to join: an @user/world address, or a world id. Defaults to this project's SPAWN_VARIANT_ID, which is usually what you want.
sessionNoSession name, so one machine can stand more than one body (default 'default'). Every verb takes it; a session self-expires at its ttl.
projectDirNoAbsolute path to the Spawn game project (.env). Defaults to SPAWN_PROJECT_DIR or the MCP process cwd.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv2.0.0

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.