Skip to main content
Glama

mcp-tools

An MCP server for working on a Roblox game from an AI assistant (Claude Code and other MCP clients), next to Roblox's own Studio MCP. It covers what that one can't: keeping Rojo running and connected without anyone clicking Connect, and importing models through Studio's own 3D Importer. Windows only.

Tool

What it does

rojo_start(project, port=34872)

Serves a Rojo project in a process that keeps running after the assistant's session ends. Does nothing if it's already being served; refuses if another project is on the port.

rojo_status(project, port)

Is a server for that project answering, and did rojo_start start it?

rojo_stop(port)

Stops the server rojo_start started (never one it didn't start).

rojo_build_plugin()

Builds a Rojo plugin that connects by itself in Edit mode (below), from the installed Rojo's own version.

rojo_install_plugin(configure_settings=True)

Installs that plugin (backing up the old one) and, with Studio closed, turns on Rojo's Auto Reconnect and "Unlisted PlaceId" confirmation.

studio_import(path)

Imports an FBX / OBJ / GLB / GLTF through Studio's 3D Importer, as a person would.

Install

Needs Windows, uv, Roblox Studio, and for the Rojo tools rojo (e.g. through aftman) and git.

Claude Code:

claude mcp add mcp-tools --scope user -- uvx --from git+https://github.com/gavinostler/mcp-tools mcp-tools

Other MCP clients (Claude Desktop, Cursor, ...):

{
  "mcpServers": {
    "mcp-tools": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/gavinostler/mcp-tools", "mcp-tools"]
    }
  }
}

Working files (pid files, server logs, the plugin build) go in %LOCALAPPDATA%\mcp-tools.

Related MCP server: Roblox Studio MCP Server (Posuceius Fork)

Rojo that stays up and connects by itself

rojo_start launches rojo serve through WMI (Win32_Process.Create), so the server isn't in the assistant's process tree and survives its session ending (assistants' background commands are usually killed after a while, and the sync with them).

Stock Rojo has no Edit-mode auto-connect: "Auto Reconnect" only tries once, when the plugin loads. The patch this builds (src/mcp_tools/autoconnect.patch) adds a loop: every 5 seconds in Edit mode, if Auto Reconnect is on and nothing is connected, it connects to a server on the configured host/port, but only if that server's project lists the open place in servePlaceIds. Disconnect or Abort pauses it until you next connect by hand. The build uses the installed CLI's version tag of rojo-rbx/rojo, so plugin and server always match, and stops with an error if a newer Rojo no longer takes the patch. Tested on 7.7.1.

Once: rojo_build_plugin, close Studio, rojo_install_plugin, then add your place to the project:

"servePlaceIds": [123456789],

(If Studio was open during rojo_install_plugin, set Auto Reconnect on and Confirmation Behavior to "Unlisted PlaceId" in Rojo's settings yourself; Studio rewrites its settings when it closes.)

Studio 3D import

studio_import drives Studio's UI with Windows UI Automation: File > Import, the file dialog, then Import in the Import Preview, leaving your importer settings as they are (so "Upload to Roblox" etc. behave as when you import by hand). It takes the mouse and keyboard for about 15 seconds. Returning means the importer accepted the file; Studio's Import Queue finishes it a few seconds later, so check the model arrived (with the Studio MCP) before using it.

Limits, because Studio draws the inside of the Import Preview itself (invisible to UI Automation):

  • The Import button is found by its position from the window's bottom-right corner and clicked only once that pixel is blue (enabled). If a Studio update moves it, the tool times out rather than clicking anything else: update IMPORT_BTN_FROM_BR in studio_import.py.

  • It can't read importer warnings: with the button enabled it imports anyway.

  • Exactly one Studio window, in Edit mode (check before calling: it doesn't), visible on screen.

  • Leave a few seconds between imports.

It also works without the server: python -m mcp_tools.studio_import <file>.

Licence

MIT (see LICENSE), except src/mcp_tools/autoconnect.patch, which modifies Rojo's plugin source and is under Rojo's licence, the Mozilla Public License 2.0.

Available Tools

6 tools
rojo_build_pluginA

Build the auto-connect Rojo plugin: the installed Rojo CLI's own version (from GitHub) plus a patch that, in Edit mode with Auto Reconnect on, connects every few seconds to a server whose project lists the open place in servePlaceIds. Needs git and rojo on this machine.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that it pulls the installed Rojo CLI's version from GitHub and patches it, plus the resulting auto-connect behavior and the git/rojo prerequisites. It still omits important build side effects, such as where the plugin is written and whether it overwrites existing files.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action and resource, then adds the relevant build source, patch behavior, and prerequisites. Every clause contributes useful context, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter build tool with an output schema, the description covers the source of the build, the resulting plugin behavior, and the machine prerequisites. The main remaining gap is the relationship to rojo_install_plugin and the exact filesystem effect of building.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics to compensate for. The baseline score of 4 applies because the empty schema is self-explanatory and the description does not need to document inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: build the auto-connect Rojo plugin. It explains the build composition (installed Rojo CLI version from GitHub plus a patch), which is more specific than the name alone. It does not explicitly distinguish this from the sibling rojo_install_plugin, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by naming prerequisites (git and rojo on the machine) and describing the auto-connect behavior. However, it gives no explicit guidance on when to choose this over rojo_install_plugin or other siblings, and no when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rojo_install_pluginA

Install the plugin rojo_build_plugin built as Studio's Rojo plugin (the old one is backed up to %LOCALAPPDATA%\Roblox\PluginBackups). With Studio closed it also turns on Rojo's Auto Reconnect and sets Confirmation Behavior to "Unlisted PlaceId", so listed places connect without a click. Studio picks the plugin up when it next opens. The project needs "servePlaceIds": [] for auto-connect to happen.

NameRequiredDescriptionDefault
configure_settingsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses that the old plugin is backed up to %LOCALAPPDATA%\Roblox\PluginBackups, that Rojo settings (Auto Reconnect, Confirmation Behavior 'Unlisted PlaceId') are mutated, and that changes take effect only on next Studio open. It omits whether the install itself fails or behaves differently when Studio is running, and never mentions the configure_settings opt-out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and every clause (backup path, settings mutation, Studio timing, servePlaceIds prerequisite) adds actionable information. It is dense but not padded; a small structural loosening comes from folding the settings behavior into the same run-on sentence as the install.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers side effects, prerequisites, and timing. The remaining gap is the interaction between Studio being open/closed and failure modes for the install itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter configure_settings has 0% schema coverage, so the description must compensate. The settings behavior it controls is described, but the description presents it as unconditional ('it also turns on...') rather than tying it to the parameter or explaining how to skip it, leaving the opt-out semantics to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Install the plugin rojo_build_plugin ... as Studio's Rojo plugin') and implicitly separates itself from the build step it depends on. An agent can tell this is the install/deploy step rather than the build or start step without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives strong operational context: settings are only configured 'with Studio closed', Studio picks the plugin up on next open, and auto-connect requires 'servePlaceIds' in the project. It does not explicitly state the precondition to run rojo_build_plugin first or what to do if Studio is currently open, so it stops short of explicit when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rojo_startA

Serve a Rojo project (rojo serve) in a background process that keeps running after this session ends. project: the project's folder or its .project.json. Does nothing if that project is already being served on the port; fails if another project is.

NameRequiredDescriptionDefault
portNo
projectYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the load and does well: it discloses that the process is detached and survives session end, that repeat calls are idempotent per project+port, and that a port collision with another project errors. It doesn't say where the serve log/output surfaces or how the process is later terminated (rojo_stop), which are the remaining operational unknowns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its persistence property, then the parameter hint, then the conflict semantics — no filler. The trailing clause 'fails if another project is' is slightly elliptical but still readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers persistence, idempotency, and conflict behavior for a two-parameter tool. It stops short of the lifecycle story (how to check or stop the served process), which is the only meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It defines `project` well (folder or .project.json path), but `port` is only alluded to via the conflict rule — its default (34872) and what it means to choose a non-default port are left to the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Serve a Rojo project (`rojo serve`)') and scopes it to a background process that outlives the session. That scope plus the port-conflict rule distinguishes it cleanly from rojo_stop and rojo_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear about the situation it is for and spells out the no-op case (already served on that port) and the failure case (a different project on the port). It doesn't explicitly point at rojo_status or rojo_stop as the follow-up/diagnostic alternatives, so routing to siblings is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rojo_statusA

Is a Rojo server for this project answering on the port (and did rojo_start start it)?

NameRequiredDescriptionDefault
portNo
projectYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. The interrogative form clearly signals a non-mutating probe, and the parenthetical discloses a behavioral trait beyond the schema - it also reports whether rojo_start was the origin of the running server. However, it doesn't state what happens when no server is found (error vs. a negative result), which matters for a status probe.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with the subject scoping ('for this project') and port condition up front, and no filler. The parenthetical clause is slightly awkward but carries real information about the rojo_start provenance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, low-complexity status probe with an output schema present (so return shape need not be explained), the description covers the resource, the port condition, the project scope, and the provenance question. The only missing piece is the failure-mode behavior when the server is not answering.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does reference both parameters semantically - 'for this project' and 'answering on the port' - tying each to its role in the check. But it adds no format or value guidance (e.g. project path vs. name, the 34872 default, whether a non-default port is common), so it only partially fills the documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource (a Rojo server for this project) and the check being performed (answering on the port, and whether rojo_start started it), which distinguishes it from rojo_start and rojo_stop. It is phrased as a question rather than a verb-led statement (e.g. 'Check server status'), which slightly softens the action, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the pre-flight/probe call to run before rojo_start, after rojo_stop, or when a build fails. There is no explicit 'use this when...' clause and no stated exclusions or alternatives, though the reference to rojo_start hints at the lifecycle relationship.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rojo_stopA

Stop the Rojo server rojo_start started on this port (never one it didn't start).

NameRequiredDescriptionDefault
portNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does disclose an important safety constraint — it will only stop a server this process started — but says nothing about behavior when no server exists on the port, whether the stop is graceful, or whether other clients are affected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with the resource and the scoping constraint front-loaded. The trailing parenthetical is slightly awkward but adds a real constraint rather than noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and an output schema exists, so return values need not be explained. However, for a lifecycle-terminating tool with no annotations, the description omits error/no-op behavior and the default-port relationship, leaving modest gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter and 0% schema description coverage, the description supplies the key meaning: the port identifies which started server to stop. It does not mention the default value 34872 or whether the port must match the one passed to rojo_start, but the core semantics are covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Stop the Rojo server') and ties it to the port the server was started on, which distinguishes it from rojo_start and rojo_status. It does not explicitly contrast with other siblings like studio_import, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scoping clause 'rojo_start started on this port', and the parenthetical '(never one it didn't start)' gives one useful exclusion. There is no explicit guidance on what to do if no server is running or how this relates to rojo_status as a check-first step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

studio_importA

Import a model file (FBX, OBJ, GLB or GLTF) through Roblox Studio's own 3D Importer, as a person would (File > Import, then Import), leaving the importer's settings as they are. Needs exactly one Studio window, in Edit mode (not playtesting), visible on screen; it takes the mouse and keyboard for about 15 s. Returning means the importer accepted the file: Studio's Import Queue finishes it a few seconds later, so check the model arrived before using it. Leave a few seconds between imports.

NameRequiredDescriptionDefault
pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to lean on, the description carries the full burden and does it well: it discloses that the call seizes mouse and keyboard for about 15 seconds, that returning only means the importer accepted the file, that the Import Queue completes a few seconds later, and that the caller should verify the model landed before using it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences with no filler, purpose front-loaded ahead of preconditions and then the async-completion caveat. Every clause carries operational meaning the agent would otherwise get wrong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a one-parameter tool, the real complexity is environmental, and the description covers all of it: window count, mode, visibility, input capture, timing, and post-call verification. An output schema exists, yet it still usefully explains what a successful return actually signifies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for the single 'path' parameter. It does that partially by implying the value is a model file in one of four formats, but it never states whether the path must be absolute, on the local disk, or relative to some working directory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Import a model file') and enumerates the supported formats (FBX, OBJ, GLB, GLTF), plus the exact mechanism used (Studio's 3D Importer via File > Import). That mechanism detail alone separates it from the rojo_* siblings, which belong to a different asset pipeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives hard preconditions: exactly one Studio window, Edit mode rather than playtesting, and the window must be visible on screen, plus a spacing rule between consecutive imports. It never explicitly contrasts itself with the rojo tools, so the agent must infer the alternative, which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedrojo_build_plugin
    • First observedrojo_install_plugin
    • First observedrojo_start
    • First observedrojo_status
    • First observedrojo_stop
    • First observedstudio_import

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation: server lifecycle (start/status/stop), plugin build, plugin install, and Studio import. The only closely related pair, build_plugin vs. install_plugin, is explicitly separated in the descriptions, and the start/status/stop trio has clear non-overlapping semantics.

Naming Consistency5/5

All names use snake_case with a consistent domain prefix and readable operation naming: rojo_start, rojo_status, rojo_stop, rojo_build_plugin, rojo_install_plugin, studio_import. The pattern is predictable, and rojo_status is a conventional command-style exception rather than a real inconsistency.

Tool Count5/5

Six tools is a well-scoped set for the apparent Rojo/Studio workflow, with each tool earning its place. Nothing feels padded, and the surface is not so thin that basic lifecycle operations are missing.

Completeness4/5

The core lifecycle is covered: start/status/stop the Rojo server, build/install the plugin, and import a model into Studio. Minor gaps exist around plugin status/uninstall, server logs, and common Rojo operations like a one-shot place build, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers