editor-mcp-server

MCP.Pizza Chef: playcanvas

One hundred and twenty-four tools drive a live project: placing and arranging objects in a scene, editing scripts, uploading and converting art, baking lighting, moving the camera, taking screenshots, launching the game to read its errors, and switching between branches and saved checkpoints. Nothing travels to a third party. The server runs on your own computer, listens only to itself, and accepts a connection only from PlayCanvas. You need a PlayCanvas account, your project open in the Editor, and one click on the Editor's MCP button.

Coding
Images/Design

Use This MCP server To

Build a scene layout by describing it in plain words Attach a script to an object and set its options Import a model from Sketchfab into my project Bake the lighting and show me a screenshot Launch my game and read the errors it prints Roll back to an earlier checkpoint of my project

README

PlayCanvas Editor MCP Server

CI NPM Version License Discord Reddit X

| User Manual | API Reference | Blog | Forum |

An MCP server for automating the PlayCanvas Editor with an LLM. The MCP client is built into the Editor — no browser extension needed. Install the server into your MCP client of choice (Claude Code, Codex, Claude Desktop, Cursor, …) and connect the Editor to it.

PlayCanvas Editor driven by an MCP client

Installation

Requires Node.js 22.18+. The server is published to npm as @playcanvas/editor-mcp-server — a self-contained, zero-dependency bundle — so every client below runs it with npx. Nothing to clone or build.

Claude Code

claude mcp add playcanvas -- npx -y @playcanvas/editor-mcp-server

To share the server with everyone working on a repo, commit a .mcp.json to the project root instead:

{
  "mcpServers": {
    "playcanvas": {
      "command": "npx",
      "args": ["-y", "@playcanvas/editor-mcp-server"]
    }
  }
}

Codex

The Codex CLI and the Codex app share ~/.codex/config.toml, so one command covers both:

codex mcp add playcanvas -- npx -y @playcanvas/editor-mcp-server

Note

On Windows, use codex mcp add playcanvas -- cmd /c npx -y @playcanvas/editor-mcp-server. If the server times out on first run (while npx downloads the package), raise startup_timeout_sec under [mcp_servers.playcanvas] in ~/.codex/config.toml. ChatGPT itself only supports remote MCP connectors, so Codex is the OpenAI surface to use.

Claude Desktop

Go to Claude > Settings > Developer > Edit Config and add to claude_desktop_config.json:

{
  "mcpServers": {
    "playcanvas": {
      "command": "npx",
      "args": ["-y", "@playcanvas/editor-mcp-server"]
    }
  }
}

Note

On Windows, use "command": "cmd" and "args": ["/c", "npx", "-y", "@playcanvas/editor-mcp-server"].

Cursor

Select File > Preferences > Cursor Settings > MCP > Add new global MCP server and add the same JSON as for Claude Desktop.

Custom Port

The server listens for the Editor on WebSocket port 52000 by default. To change it, append --port <number> to the npx args and set the same port in the Editor's MCP popover.

Connecting the Editor

  1. Open your project in the PlayCanvas Editor.
  2. Click the MCP button at the bottom of the toolbar (below the Publish button).
  3. Check that the port matches your MCP config (default 52000) and click CONNECT.

You can now issue commands from your MCP client.

Note

Only one Editor instance can be connected to the MCP server at a time.

Editor Driver Coverage

All tools act on the project open in the connected Editor. The server does not discover, select, create, delete, transfer, or administer projects, and project IDs are not tool inputs.

Category Driver coverage Tools
Entity Exact reads, filtered lists, resolution, search, script lookup, creation, schema-safe batch edits, duplication, hierarchy changes, deletion and component lifecycle list_entities, get_entity, resolve_entities, search_entities, find_entities_by_script, create_entities, modify_entities, duplicate_entities, reparent_entity, delete_entities, add_components, remove_components
Scripts Asset text reads and writes, parsing, attachment, attributes, ordering and removal get_asset_text, set_asset_text, set_script_text, script_parse, add_script_component_script, attach_script, add_entity_scripts, remove_entity_scripts, move_entity_script
Assets Exact reads, reference graphs, native creation, streamed upload and atomic download up to 512 MiB, schema-safe edits, moves, duplication, source replacement, reimport, deletion and materials list_assets, get_asset, get_asset_references, create_assets, upload_assets, modify_assets, move_assets, duplicate_assets, replace_asset, reimport_assets, download_asset, delete_assets, set_material_diffuse, set_material_properties
Templates Instantiation and instance override inspection, application, reversion and unlinking instantiate_template_assets, get_template_overrides, apply_template_overrides, revert_template_overrides, unlink_template_instances
Animation Animation state graph reads and edits, mapping-safe state renames and animation events get_anim_state_graph, modify_anim_state_graph, get_animation_events, modify_animation_events
Processing Lightmaps, model unwrap and cancellation, texture conversion, atlases, cubemaps, fonts, metadata, compressed variants, prefiltering, sprites and bundles bake_lightmaps, unwrap_model_asset, cancel_model_unwrap, convert_texture_asset, create_texture_atlas, create_cubemap_from_texture, process_font_asset, generate_texture_metadata, process_texture_variants, prefilter_cubemap, clear_cubemap_prefilter, modify_sprite_asset, modify_bundle_asset
Scene Exact reads, listing, loading, creation, duplication, rename, deletion and scene settings list_scenes, get_scene, load_scene, create_scene, duplicate_scene, rename_scene, delete_scene, query_scene_settings, modify_scene_settings
Settings Scoped project, private, user, session and scene settings reads and edits query_settings, modify_settings, query_project_settings, modify_project_settings
Viewport Camera and viewport state, visibility, capture and focus query_viewport_state, set_viewport_state, query_viewport_visibility, set_viewport_visibility, capture_viewport, focus_viewport, focus_camera
Editor Selection, edit-time logs, transform gizmo state, undo and redo get_selection, set_selection, clear_selection, read_editor_logs, set_transform_gizmo, undo, redo
Builds Listing, exact reads, creation options, streamed downloads, primary build selection and deletion list_builds, get_build, create_build, download_build, set_primary_build, delete_build
Store PlayCanvas Store search and import, licenses, Sketchfab search and import, and My Assets search and import store_search, store_get, store_download, list_store_licenses, sketchfab_search, sketchfab_get, sketchfab_import, my_assets_search, my_assets_import
Runtime Launch lifecycle and options, screenshots, logs, live state inspection and keyboard, mouse and touch input launch_start, launch_stop, capture_runtime, read_runtime_logs, query_runtime_state, inject_input
VCS Branches, checkpoints, restore and hard reset, merges, conflict resolution and checkpoint diffs vcs_status, list_branches, create_branch, switch_branch, close_branch, open_branch, delete_branch, list_checkpoints, create_checkpoint, get_checkpoint, restore_checkpoint, hard_reset_checkpoint, start_merge, get_merge, resolve_conflicts, get_conflict_file, apply_merge, cancel_merge, diff_checkpoints

Asset transfers over 20 MiB use 1 MiB chunks. The server reads and writes local files incrementally, while the Editor spools uploads to browser storage and consumes downloads as streams instead of buffering the entire transfer in memory.

The Runtime tools drive a real Launch instance (the Editor's Launch button) so an agent can verify that a scene actually runs: screenshot the running app, read its console output, query live entity state, and inject keyboard/mouse/touch input. Allow pop-ups for the editor origin so launch_start can open the launch window — it reuses your existing PlayCanvas login session.

Every tool returns a consistent { data, meta } envelope: meta.status is ok or error (with an actionable message), list tools paginate via limit/offset and meta.nextCursor, and mutating tools return the resulting entity/asset summaries so follow-up list calls are rarely needed.

Development

To hack on the server itself, ensure you have Node.js 22.18 or later installed. Follow these steps:

  1. Clone the repository:

    git clone https://github.com/playcanvas/editor-mcp-server.git
    cd editor-mcp-server
  2. Install dependencies:

    npm install
  3. Start the server (Node runs the TypeScript source directly — no build step):

    npm run watch
  4. Point your MCP client at the checkout instead of the npm package with "command": "node" and "args": ["/path/to/editor-mcp-server/src/server.ts"].

npm run debug starts the server under the MCP Inspector and npm run build produces the self-contained bundle that gets published.

editor-mcp-server FAQ

Do I need a key or a paid account?
No key at all. You need a PlayCanvas account with a project open in the Editor, and the connection is made by clicking the MCP button at the bottom of the Editor toolbar. Whatever your PlayCanvas plan allows is what the assistant can do.
Which apps does it work in?
Claude Code, Claude Desktop, Cursor and the Codex CLI, using a single install line. The ChatGPT app itself cannot use it, because ChatGPT only accepts hosted connectors and this one runs on your machine.
Can it delete my work?
Yes. Deleting objects, art files, scenes, branches and builds are all available, and object deletion is flagged as not reversible through the tool. The Editor's own undo and your saved checkpoints are your safety net, so take a checkpoint before a big session.
Is it safe to leave running?
Reasonably. It only listens to your own computer, refuses connections from anywhere other than PlayCanvas or your own machine, and only one Editor window can be attached at a time.
Can I use this to build a game without writing code?
Partly. You can describe scenes, objects, materials, lighting and camera moves and watch them appear. Anything with real game logic still ends up as a script, though the assistant can write and attach that for you.
How hard is it to set up?
Easy. One install line per app, no cloning and no building, and a recent Node install. The trickiest part is remembering to press Connect inside the Editor.
Why is nothing happening when I ask for changes?
Almost always the Editor is not connected. Open the project, click the MCP button below Publish, check the port matches, and press Connect.