Build a world
with a conversation.
Worldly MCP connects an AI partner to your projects and scenes. It can inspect a scene, enter the editor as a named collaborator, and move its camera in realtime.
Your project access
The connection sees the same projects and scenes your Worldly account can open.
Collaborative by default
Each agent is a distinct peer with a visible camera, colour, and name tag.
Scoped authoring
Read and presence grants stay limited. Explicit authoring scopes unlock project creation and transactional generation.
Connect an MCP client
Add an endpoint to a remote-MCP client. The client opens Worldly in your browser, where you sign in and approve its read and presence permissions.
Use https://mcp.had3d.app/mcp. Authentication is discovered by the
client and completed through the Worldly editor; no API key is copied into a prompt.
Use http://localhost:8799/mcp with the stack running locally. You
sign in at the local editor, which shares the local JWT secret; no hosted account
or API key is needed.
Connect in three steps
-
1
Add the server
Enter
https://mcp.had3d.app/mcpin a client that supports remote MCP. -
2
Approve access
Sign in at the Worldly editor and review the requested read, presence, and optional authoring scopes.
-
3
Connect a partner
Choose a name—or use Agent—then enter a scene and move its camera.
VS Code
VS Code ships a full MCP client with OAuth support, so a workspace
mcp.json is the whole setup. Add this file, trust the workspace,
and Worldly’s tools appear in Copilot Chat.
Workspace file — .vscode/mcp.json (VS Code format):
{
"servers": {
"worldly": {
"type": "http",
"url": "https://mcp.had3d.app/mcp"
}
}
}
For a portable config that other MCP-aware tools also read, use
.mcp.json at the project root with a top-level
mcpServers object instead. On first connection VS Code opens the
Worldly editor in your browser, where you sign in and approve the requested scopes;
no API key is stored in the file. With the stack running locally, use
http://localhost:8799/mcp and the local editor instead.
Agents are collaborators,
not a second write path.
MCP uses Worldly membership data and the existing per-project room. Scene reads come from the same stored document the editor opens, while camera presence is broadcast through the same peer channel used by people.
A city generated by an agent uses the same validation, conflict handling, run attribution, and undo stack as a city generated from the editor.
Tool catalog
Inspect scenes, connect a visible partner, or create a game through generation scripts. Authoring checks OAuth scopes, project roles, generator schemas, and scene versions.
list_generatorsRead the available generator schemas, including characters.create.
create_projectCreate an owned project and its first scene with worldly:projects:write.
create_sceneCreate another scene with worldly:scenes:write and an editor or owner role.
save_generation_scriptSave one script at an expected scene version with worldly:scenes:write.
run_generation_scriptRun a saved script without an open editor. Requires worldly:scripts:run and worldly:scenes:write; commits only a validated result at the expected version.
create_scopeCreate a game: one save across many worlds. Optionally put a project that is in no game yet into it. Requires worldly:projects:write.
add_worldAdd a world key before its scene exists, as planned, so travel can name it. Requires worldly:projects:write and the editor role.
set_world_accessSet planned, private, coming_soon, live or closed, with a note and an opening date. Never republishes. Requires worldly:projects:write and the owner role.
publish_scopeRun the game’s scope script and publish its document, with the compatibility report. A breaking change is a new scope, which means fresh saves, and is refused. Also requires worldly:scripts:run.
publish_scenePublish a project’s saved scene as a new version of its world and return the version and play URL. Never changes access. Requires worldly:projects:write, the editor role and a verified email address.
attach_world_projectBuild a planned world in a project that is in no game yet, so its first publish lands on that world. Requires worldly:projects:write and the owner role.
list_scopesEvery game you can see, with your role and its universe membership. Requires worldly:read.
get_scopeOne game’s worlds, access, play URLs, projects and published scope version; full adds the saved script and published document. Requires worldly:read.
travel_mapHow the game’s worlds connect: travel out and entries in, dead ends, unreachable worlds, and links whose destination or entry is missing. Requires worldly:read.
scope_numbersPlayers, returning players and play time per world. Requires worldly:read.
rename_scopeChange the name players see. Requires worldly:projects:write and the owner role.
delete_scopeDelete a game that has published nothing and is in no universe; its projects stay. Requires worldly:projects:write and owning the game.
list_testersadd_testerremove_testerWho may enter the game’s private worlds besides its members. Requires the owner role; adding and removing also require worldly:projects:write.
create_universeCreate a universe: a set of games that agree to let players carry value between them. You become its steward. Requires worldly:projects:write.
publish_charterRun a charter script (must call universe.charter exactly once) and publish the document it declares: tier rates and needs, headroom, idle income, the border and exchange sinks, what may cross, and import defaults. expectedVersion defaults to the current charter version. Requires worldly:projects:write, worldly:scripts:run and being the steward.
apply_to_universeApply one of your games to join a universe. Auto-approved when you are the steward; otherwise the steward reviews it. Requires worldly:projects:write and being the game’s publisher.
approve_universe_memberActivate a game that applied, after core re-checks it against the current charter. Requires worldly:projects:write and being the steward.
list_universesThe universes you steward, with their ids. Requires worldly:read.
get_universeAny universe and its latest charter, to read before declaring universe.join. Requires worldly:read.
suspend_universe_memberStop crossings into and out of a member game until it is approved again. Requires worldly:projects:write and being the steward.
leave_universeTake your game out of its universe. Requires worldly:projects:write and being the game’s publisher.
resume_universe_exportsUndo the kill switch once the steward has reviewed the anomaly. Requires worldly:projects:write and being the steward.
universe_reportThe validator report for one game’s live worlds against its universe charter: every task’s tier, which needs are met, and issues like tier_unmet and no_time_bound, so an agent can fix what it names. Requires worldly:read.
quote_crossingCustoms without a player: price holdings in one member game carried into another, against both games’ latest published documents and the latest charter. Requires worldly:read.
universe_overviewThe steward’s dashboard: the charter, every member and its status, and crossing totals in, out and overall. Requires worldly:projects:write and being the steward.
list_publishesEvery published version, which one is live, and whether any is held for review. Requires worldly:read.
rollback_publishMake an earlier version live again. Requires worldly:projects:write, the editor role and a verified email address.
take_world_offlineStop the address serving anything; nothing is deleted. Requires worldly:projects:write and the editor role.
update_projectRename a project, or change its description or slug. Requires worldly:projects:write and the owner role.
delete_projectDelete a project for good. Requires worldly:projects:write and being its owner.
update_scenedelete_sceneRename, reorder or delete a scene; a project keeps at least one. Requires worldly:scenes:write.
get_scene_screenshotThe editor’s last picture of a scene, as an image. Requires worldly:read.
list_assetsupload_assetThe project’s files, and adding one from base64 or a public URL (images, models, audio; 25 MB). Uploading requires worldly:scenes:write.
list_membersMembers, their roles, and for an owner the pending invitations. Requires worldly:read.
invite_memberrevoke_inviteEmail an invitation to edit or view, or withdraw one. Requires worldly:projects:write, the owner role and a verified email address.
set_member_roleremove_memberChange a member’s role, remove them, or leave yourself. Requires worldly:projects:write.
get_arcadeYour arcade: its games, featuring, visibility, theme and invitations. Requires worldly:read.
update_arcadeRename it, or set its visibility or theme. Requires worldly:projects:write.
set_arcade_entryremove_arcade_entryList, feature, pin or unlist one of your games. Requires worldly:projects:write.
invite_to_arcadeuninvite_from_arcadeGet the arcade’s link, or name or un-name an invited account. Requires worldly:projects:write.
list_projectsList every project the connected account can access.
list_scenesList the scenes in one project.
inspect_sceneRead scene structure with paged entities.
map_sceneA compact spatial summary: boxes for solids, triggers and spawns, travel gates and entries, paths and areas as simplified lines, every action at the point it is done, and a top-down character grid. A few kilobytes for a city.
review_gameplayCheck that what a scene tells the player matches what its quest objectives and logic rules actually do, and that stated odds, prices and currencies match the game’s drop tables, shops and currencies. Advisory; read claims to tell “all agreed” from “nothing to check”.
connect_agentEnter a scene with an optional name, defaulting to Agent.
move_cameraMove its position, look target, and lens in realtime.
disconnect_agentRemove it from the project room immediately.
No tools match that search.
A partner you can see.
Connecting an agent publishes a synthetic camera through the project room. Every editor on that scene sees the same frustum and name tag update.
- Distinct agent identity
- Realtime camera updates
- Scene-specific name tag
- No raw entity writes
- No whole-document overwrite
- No bypass around project membership
Scene editing comes
through collaboration.
Generator and scene-editing tools are intentionally not exposed in the first phase. They will arrive after collaborative operations can attribute, validate, and undo an agent change through the project room.
const cityGrid = {
id: "roads.cityGrid",
description: "Create a seeded city road network…",
params: z.object({
seed: z.number(),
blockSize: z.number().default(120),
}),
run(params, context) { /* emit entities */ },
};
registry.registerGenerator(cityGrid);
Tool schema
Tools have stable names, descriptions written for a client that may not see the viewport, and strict JSON Schema inputs.
{
"name": "move_camera",
"description": "Move a connected agent camera…",
"inputSchema": {
"type": "object",
"properties": {
"position": { "type": "array", "minItems": 3 },
"target": { "type": "array", "minItems": 3 }
},
"required": ["position", "target"]
}
}
defaultsUp and lens have useful editor defaults.
vectorsPosition and target are three-number world coordinates.
descriptionsWritten for an agent that may not see the viewport.
Errors
Failures are reported at the tool boundary and do not mutate scene documents.
invalid argumentsA required id or camera value is absent or has the wrong shape.
not accessibleThe project or agent is not available to the connected account.
not connectedMove was called before the agent entered a scene.
expired authorizationThe browser consent request was not completed within ten minutes.
Account access, checked per project.
OAuth grants the scopes you approve, including optional authoring access. Every tool still checks current project membership and agent ownership; credentials never enter a scene or prompt.
Approve scopes in the Worldly editor. Authoring access must be requested explicitly.
Each partner has its own agent id, colour, and name tag.
Remote calls check project access when each tool runs.
The editor session token is never handed to the MCP client.