Skip to content

BloxForge 4.4.0

Latest

Choose a tag to compare

@princeofscale princeofscale released this 01 Sep 13:59
ef98c37

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_screenshot could 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_runtime and eval_client_runtime declare studio.execute, which reads as bounded by the local place — but the code reaches HttpService, MarketplaceService and DataStores. Clients gating on the annotation were treating unrestricted execution as local-only.
  • character_navigation never moved anyone. Navigation was signalled from the edit peer over LogService.MessageOut to 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. target defaults to "server"; "edit" was never a DataModel that could service the call.
  • get_instance_properties hid properties the write tools can set. Roblox exposes no property enumeration to plugins, so the read is a fixed list — and AnchorPoint, Font, TextScaled and ResetOnSpawn were 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_structure omits children on a leaf. A leaf is most of any tree. The matching upstream change that drops an empty attributes map from get_attributes is not taken: it saves two characters and would break a client enumerating response.attributes on the common case.

Full detail, including which upstream commits were triaged as not applicable and why, is in CHANGELOG.md.