Skip to content

Start Builders MCP without a window and guard release deployment - #20

Merged
oddessentials merged 12 commits into
mainfrom
mcp-no-window-at-start
Nov 12, 2026
Merged

oddessentials merged 12 commits into
mainfrom
mcp-no-window-at-start

Conversation

@oddessentials

Copy link
Copy Markdown
Owner

MCP connections start through a headless relay, opening the Builders window when a world tool needs it. Closing the window leaves the connection available for subsequent calls, with process cleanup handled on Windows and macOS.

Windows update instructions now require stopping every running Builders MCP connection before extraction while keeping saved MCP registrations. Pages waits for successful release CI, checks the corresponding published release from its exact commit, and rechecks GitHub's latest release immediately before deployment. Superseded releases skip deployment; API errors block it.

Validation completed locally:

  • Built the Windows package and exercised the documented install, real MCP connection/window closure, failed extraction while locked, disconnect, successful update, and reconnect. Saved world files, custom uploads, and connection settings were preserved.
  • Added deterministic Windows update and Pages guard regressions; the Pages cases use controlled API responses.
  • Existing MCP smoke assertions, all nine site-command checks, local site build, and diff checks passed.

The full test suite was not rerun locally. This PR's CI is the merge gate.

oddessentials and others added 12 commits November 11, 2026 17:31
The connect command now launches Builders headless. It answers the MCP
handshake, list_worlds and list_items itself, and starts the Builders
window only when a tool needs the editor or the agent calls the new
show_window tool. Closing the window keeps the agent connected; its next
call opens the window again.

Existing connections must be re-added with --headless to stop the window
appearing at every session start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r rendering

Only the window's first reply is dropped, and only when the relay sent it
an initialize, so a client id equal to the internal one still gets its
answer. show_window restores a minimized window and answers while a
render runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The relay closed the window's pipe while its reader thread was still
reading it. If the window wrote anything after that, every later read
failed yet returned a byte, so the relay never quit and flooded stderr.

The relay now sends the window a notification, which only a window the
relay started acts on, once. The reader ends when the window exits.

Refs #18

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Opening a Claude Code session must not open Builders. Keep the headless
relay, in low-processor mode, that answers list_worlds and list_items
itself, starts the window when a call needs the editor, and hands
disconnects to it.

Remove the show_window tool, the delay before relaunching a window that
failed to start, and reaping of exited window processes. Keep the full
page check after pushes to main, so the page can't go live before the
release it describes. Tell connected users how to replace a
registration without --headless.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On macOS and Linux, Godot collects a child's exit status only when its
process status is checked, so every window closed during a session stayed
a zombie until the relay exited. Keep its PID and check it each frame
until it has gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
macOS answers is_process_running for an app from NSRunningApplication
without calling waitpid, so a closed window could stay a zombie. Keep its
PID until get_process_exit_code reports it has exited, which collects it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page check runs this branch's smoke test against the latest release,
which has no --mcp=headless and so never answered. Run it with a plain
--mcp window, which the release and this branch both serve the same way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@oddessentials
oddessentials merged commit a95b0a2 into main Nov 12, 2026
5 checks passed
@oddessentials
oddessentials deleted the mcp-no-window-at-start branch November 12, 2026 06:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant