An upstream-parity pass against Chrrxs/robloxstudio-mcp v2.22.3..v3.0.5, on top of sixteen merged PRs that had been sitting unreleased since 4.3.1. Tool count 227 → 228; test count 1123 → 1504.
Added
manage_selection — the write half of the selection, plus camera framing. The server could read the selection and never set it, and nothing could point the camera, which made capture_screenshot only as useful as wherever the camera already was. action is set, add, remove or focus; set with an empty paths clears. A path that does not resolve fails the whole call rather than selecting the subset that happened to exist. get_selection keeps its name and its read-only annotation.
Fixed
- A screenshot was shipped from Studio as raw RGBA at native resolution — 44MB in one HTTP body on a 4K display, 176MB on an 8K one, for an image the server downscales to 1568px wide anyway. Studio now bounds that read and downscales before transfer. Click coordinates are unaffected: the logical viewport is read from the camera, not the image.
capture_screenshotcould return an image it had already found too large. The JPEG quality loop stops at q25 whether or not the result fits, and returned the oversized buffer — the case the code's own comment calls catastrophic, because an oversized inline image closes the MCP connection and drops every Studio registration instead of failing gracefully.- Arbitrary Luau was not marked
openWorldHint.execute_luau,execute_luau_async,eval_server_runtimeandeval_client_runtimedeclarestudio.execute, which reads as bounded by the local place — but the code reachesHttpService,MarketplaceServiceand DataStores. Clients gating on the annotation were treating unrestricted execution as local-only. character_navigationnever moved anyone. Navigation was signalled from the edit peer overLogService.MessageOutto an injected Script — reflection that does not cross into the play server. The signal was written, nothing heard it, and the call sat out its timeout. The walk now happens locally in the play DataModel.targetdefaults to"server";"edit"was never a DataModel that could service the call.get_instance_propertieshid properties the write tools can set. Roblox exposes no property enumeration to plugins, so the read is a fixed list — andAnchorPoint,Font,TextScaledandResetOnSpawnwere absent from it, making them writable and then unreadable.- Undo waypoints read
"MCP: MCP: ..."when a caller supplied a label that already carried the prefix.
Changed
get_project_structureomitschildrenon a leaf. A leaf is most of any tree. The matching upstream change that drops an emptyattributesmap fromget_attributesis not taken: it saves two characters and would break a client enumeratingresponse.attributeson the common case.
Full detail, including which upstream commits were triaged as not applicable and why, is in CHANGELOG.md.