New Studio Testing APIs and Assistant Improvements


We’re launching more improvements to AI-assisted development in Studio: three new Studio APIs for testing and automation, along with Skills, which teach Assistant how to use these APIs in specific workflows.

Together, these give you two ways to test and analyze your experience: drive things yourself from plugins or your build pipelines using the new APIs, or have Assistant pick the right tools for the job. Both paths use the same APIs.

New Studio Testing APIs

Whether you want to build your own plugins and CI tooling or have Assistant drive testing for you, these are the underlying APIs:

  • StudioDeviceSimulatorService — scriptable device simulation. Browse presets, switch devices, override resolution and DPI, control orientation and scaling, and create custom device profiles that persist to disk.

  • StudioTestService — programmatic multiplayer testing. Start a server with multiple clients, add players mid-session, pass arguments in, end tests from the server, and trigger client disconnects. Supports up to 8 simulated clients per session.

  • VirtualInput — simulated mouse, keyboard, and pointer events that are processed exactly like real hardware input. Drive your game through its UI, exercise real input paths in regression tests, or combine it with the multiplayer and device simulator APIs for richer automated testing. This is also what powers Assistant’s playtesting agent and the keyboard_input / mouse_input MCP tools.

Workflows These APIs Unlock

  • Cross-device multiplayer testing: cycle through device profiles, launch a multiplayer test at each, and collect pass/fail results.
  • Player join/leave stress testing: start a session, stagger joins, and trigger disconnects to verify cleanup and reconnection logic.
  • Orientation regression testing: loop through Portrait / LandscapeLeft / LandscapeRight and run a play-mode test at each orientation to catch layout regressions.
  • UI flow automation: drive your game’s menus end-to-end with simulated clicks, text input, and key presses from a plugin-driven test harness.

Examples for Each API

Switch the active simulated device and lock orientation:


local Simulator = game:GetService("StudioDeviceSimulatorService")

local devices = Simulator:GetDeviceListAsync()

Simulator:SetDeviceAsync(devices[1])

Simulator:SetOrientationAsync(Enum.ScreenOrientation.LandscapeLeft)

Launch a 4-player multiplayer test from a plugin and read the result the server reports back:


-- Plugin Script

local StudioTestService = game:GetService("StudioTestService")

local result = StudioTestService:ExecuteMultiplayerTestAsync(4, { testName = "LobbySpawnTest" })

print("Test result:", result)

Click a TextBox and type into it from a plugin:


local VirtualInput = game:GetService("UserInputService"):CreateVirtualInput()

VirtualInput:SendMouseButton(Vector2.new(400, 200), Enum.UserInputType.MouseButton1, true)

VirtualInput:SendMouseButton(Vector2.new(400, 200), Enum.UserInputType.MouseButton1, false)

VirtualInput:SendTextInput("Hello, world!")

Full method lists, the DeviceConfiguration schema, context rules, error models, and validation limits live in the API reference for each service.

Studio Assistant Improvements

To take advantage of these new APIs, Assistant needs focused expertise in the specific workflows they unlock. We’ve packaged that expertise into Skills: focused guides that teach Assistant how to handle a workflow end-to-end. Three Skills ship today:

  • Device Simulation: Drives StudioDeviceSimulatorService for cross-device and orientation testing. Assistant discovers device IDs, switches the simulator, and sets orientation on its own. By bringing your own API key into Assistant or using the MCP Server, screenshots are unlocked, so Assistant can visually validate orientations and layouts rather than running through them blind.
    • Try: “Test my main menu on a small phone in portrait.”
  • Scene Analysis: Drives SceneAnalysisService to diagnose rendering performance, memory usage, and instance health. Surfaces hotspots in your geometry with camera sweeps and frustum audits against triangle and draw call targets, traces script Luau heap usage and animation/audio asset memory with owner tracing, and finds leaked unparented instances back to the host script.
    • Try: “Check my game’s performance and tell me what’s most expensive.”
    • Requires the Scene Analysis beta to be enabled under File > Beta Features.
  • Docs Search: Teaches Assistant how to navigate Roblox’s API documentation efficiently. Assistant pulls in the right service, class, or method reference on demand whenever it needs additional context for your request, so you get more accurate code suggestions and references.

When your request matches one of these workflows, Assistant will automatically apply the relevant Skill.

What’s Next

We’ll keep building out both halves of this story over the coming months.

Today’s Skills are Roblox-authored and built into Assistant, but you’ll soon be able to author your own Skills and override the ones we ship, so you can capture reusable workflows that fit your team’s testing patterns, project conventions, or any other repeatable thing you’d rather not re-explain to Assistant every time. We’ll share more on this soon.

On the API side, we’re continuing to build out Scene Analysis tooling, APIs for interacting with the debugger, and APIs for controlling and accessing data from the MicroProfiler.

Please let us know if you run into any issues or have suggestions for new skills or APIs you’d find useful.

Happy testing!

The Roblox Studio Team

87 Likes

This topic was automatically opened after 10 minutes.

Something I want to be able to do through MCP is start a multiplayer test session in studio and then have it control each client individually so that I can have it playtest multiplayer features. Is that possible with this new API?

22 Likes

Agreed. Would love to be able to sit and watch two AI players battling rather than controlling one player and not being able to fully focus on the bugs i’m trying to squash. :crossed_fingers:

2 Likes

What I would love to have eventually, is to have an API for Script Analysis and the Language Server. It would pave the way for the eventual port of the Script Editor, and would allow the community to make alternatives.

6 Likes

I just came out of Studio .. after going through 3 cycles of repeat Assistant attempts to do a simple edit and also add debugging prints to solve the issue… then saw this post :man_facepalming:

Assistant has been a go-to for me for ages - and I have supported it from the start - knowing little scripting.
But between yesterday & today… seems it’s gone backwards - repeating the same thing over & over for almost 2 hrs - when there were really only about 5 medium sized scripts to deal.

I almost had a laugh when I saw “Assistant Improvements” - but will see soon enough.
I will do more inspection tmrw - and I hope it gets better.

2 Likes

I have to share one funny thing that has happened a few weeks ago when I experimented with this:

It walked towards a stand using MoveTo / Humanoid API

I didn’t even ask for a playtest at first, but it was cool to see

But my character was covering the stand
And it thought the stand wasn’t working & nothing spawned in so it freaked out and added like 10 debug prints and kept on ruminating (it was Claudes strongest model lol)

2 Likes

I love the new StudioDeviceSimulatorService, but there’s still one problem it doesn’t seem to address - user operating system scaling.

When Roblox renders the viewport it scales up everything inside it by the operating system scale while still providing the unscaled value via properties etc.

100% scaling

150% scaling

This leads to situations where Roblox will say something (i.e. a UI frame) is 100x100 pixels, but in reality if you actually measure it you get something like 150x150.

I understand why this is done but there are some cases where I want to be able measure the true pixel size of an object and currently that’s very difficult to do. It requires using the capture service and comparing the result resolution to the viewport to figure out what the os scale is.

I had hoped that ResolutionScale would somehow the solve this. Either I would be able to read the current resolution scale (which I thought would be os scale) or I could at the very least set it so that I could create a device that “undid” the os scale. It’s worth noting that ResolutionScale only seems to apply to physical size scaling mode which makes it not super useful since a user can calibrate it wrong.

Having the ability to generate emulated devices that render pixel-to-pixel consistently across user devices would be a huge boon for anyone looking for pixel perfection. Is there any possibility we can get something like this in a future update?

4 Likes

More providers would be cool, like OpenRouter, DeepSeek, and Anthropic. It would also be nice to support direct OpenAI and Claude account login through a proxy, similar to how Codex and Claude Code work, instead of requiring API keys.

1 Like

Great question, and it’s a real use case we want to support well. Today you can drive a test session and pass data in and out, so some of this is possible. Where it falls short is fine-grained control of individual clients in a multiplayer session, which is exactly the kind of thing you’d need for proper multiplayer playtesting.

It’s an area we’re actively investing in, and we have improvements coming. Stay tuned.

3 Likes

Appreciate the suggestions, these are reasonable asks.

Part of what makes this harder than it looks is that some of it depends on capabilities on the provider side that aren’t there today, so broader provider options and account-based login aren’t on the near-term plan. That said, this is useful signal on where creators want this to go, and we’ll keep it in mind as the space evolves.

4 Likes

Really great stuff, currently working on a Roblox Studio MCP Server designed to handle runtime debugging as a first class scenario and these APIs are major unlocks in tools that were previously impossible without elevated RobloxScript capabilities. Awesome to see, thank you!

1 Like

I hope that one day the MCP server (and/or plugins) can access the type errors and warnings of a script! This would allow AI to debug type issues, not just runtime behavior.

Could you expand on what APIs you’d like to have either to Script Analysis or the LanguageServer more generally?

In particular, for the script analysis API, does RegisterScriptAnalysisCallback not meet your needs?

1 Like

The roblox studio mcp can run that skills ?

Would you consider adding a way to quickly close all windows except outputs or user-defined windows (or conversely, only open specified windows) during server and client testing? Every time I use that, it’s a nightmare to spend time closing windows and popup plugin windows on every client.

1 Like

build your own plugins and CI tooling

Does this mean these APIs work in Luau Execution sessions?

Since the Language Server is only embedded into the Qt Script Editor plugin, there exists no way for Luau plugins to use the Language Server in their own scripting applications. Auto-complete and some typing features could greatly be implemented into Luau plugins if there was a service method or events for them.

The reason why I’m asking for this, is when the Script Editor (kind of inevitably) gets re-made in a built-in Luau plugin, if the methods it could use were already public and usable by developers, it would greatly expand the capabilities of all plugins.

InCommand for example, had to develop its own system from scratch. Which was rather difficult I would presume.

1 Like

I’m really thankful these APIs are being made accessible to plugins, its been a problem for ages that tooling can only be used by Roblox plugins, I’d still like to see some other systems have their security locks removed, drafts are an example of this.

I think I’ve asked for a way to retrieve information about script analysis and/or shape from the Luau side before but it fell on deaf ears, the API is incomplete since unless you want to write a 1000 line parser, theres no point to using it.

I just experimented a bit, and if you have 2 places at open & 2-3 chats, if one chat re-sets the active studio then the other chat also is like oh script read error, oh wrong studio selected