Files
Faset_Engine/docs/manual/editor/mcp.md
T

3.9 KiB

Use the Editor through MCP

Faset exposes the same authoring commands to its native interface and to MCP. MCP runs in the Editor. It never provides access to a running game's entities, and is not linked into the Player or SchemaExporter.

Start a headless server after building Faset:

build/linux-debug/faset_editor --project /absolute/path/to/game --mcp

Configure your MCP client to launch that executable with those arguments using a stdio transport. On Windows select build/windows-debug/faset_editor.exe. Use absolute paths, including the project path. Add --gui when the same process should display the native Editor; a graphical session and supported GPU are then required. A separately launched Editor process owns a separate in-memory session.

The transport uses newline-delimited JSON-RPC and the MCP 2025-06-18 lifecycle. Initialize, send notifications/initialized, then discover commands with tools/list. Standard output is reserved for protocol messages. See the official MCP transport and tool contracts.

Authoring workflow

  1. Use faset_documents or create/open a document.
  2. Query faset_schema for stable type and field IDs and their constraints.
  3. Query the document for its persistent ID and current revision.
  4. Submit one faset_scene_edit batch with that revision.
  5. Save with faset_document_save. Use Undo/Redo for authoring changes.

For example, the arguments to faset_scene_edit can be:

{
  "document": "REPLACE_WITH_DOCUMENT_ID",
  "revision": 0,
  "idempotency_key": "create-first-object",
  "operations": [{"op": "entity.create", "name": "Player"}]
}

The command returns the new revision and scene with generated IDs. Repeating the same batch and retry key in the same session returns its previous result. Reusing the key for a different payload is an error. An outdated revision produces revision.conflict; query the new state and decide how to apply the intended change. Do not blindly retry a write using a fresh revision.

Each successful batch is one Undo step. A failed operation rejects the whole batch. Manual Inspector edits use this same service, including revision checks.

Jobs and capabilities

faset_import, faset_build, faset_export, and faset_play return job IDs. Use faset_job or faset_jobs for progress, diagnostics and results. faset_job_cancel requests cancellation; cancelling a build is separate from undoing a document change. Failed compilation/import preserves the last successful published generation.

faset_capabilities reports available services. faset_editor_capture is present only in a graphical Editor. It returns an MCP image and can save a project-relative PNG. A headless server has no screenshot tool. faset_play_control provides pause, resume and single-step process controls; it cannot read or modify game entities.

faset_recovery_list and faset_recovery_restore expose crash recovery, including scenes that have never been saved. Restoring an already open document requires its current revision. Recovery refuses to overwrite an externally changed scene file.

Single-command CLI

The CLI is useful for scripts that do not need an MCP session:

build/linux-debug/faset_editor --project /absolute/path/to/game \
  --command '{"name":"faset_import","arguments":{"path":"Assets/door/manifest.json"}}' --wait

--wait follows a returned job until completion. Failed, cancelled and conflicting jobs produce a nonzero exit code. This shell quoting example targets Bash; use the appropriate argument quoting for your Windows shell.

Validation: unit tests cover protocol errors and shared authoring semantics. editor_mcp_stdio launches the real Editor and verifies initialization, clean JSON stdout, conflicts, retry behavior, Undo/Redo, saving, reopening, and orderly EOF.