mcp-tools
Provides tools for working on a Roblox game by serving a Rojo project in a persistent process, checking or stopping that Rojo server, and managing the Rojo plugin used for syncing with Roblox development.
Provides tools for Roblox Studio: building and installing a Rojo plugin with auto-connect settings, and driving Studio's 3D Importer through UI Automation to import FBX, OBJ, GLB, or GLTF models.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-toolsstart serving my Rojo project on port 34872"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| 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. |
| Is a server for that project answering, and did |
| Stops the server |
| Builds a Rojo plugin that connects by itself in Edit mode (below), from the installed Rojo's own version. |
| Installs that plugin (backing up the old one) and, with Studio closed, turns on Rojo's Auto Reconnect and "Unlisted PlaceId" confirmation. |
| 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-toolsOther 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_BRinstudio_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 toolsrojo_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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| configure_settings | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | ||
| project | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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)?
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | ||
| project | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| port | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
rojo_build_plugin - First observed
rojo_install_plugin - First observed
rojo_start - First observed
rojo_status - First observed
rojo_stop - First observed
studio_import
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
- DNS-DATA RemoteDeprecatedcom.dns-data
Connect AI assistants to authorized Windows and macOS devices for files, commands, and management.
Connect ChatGPT, Claude, Cursor or VS Code to your Windows PC: files, terminal, browser, apps.
Connect AI assistants to your approved computer for files, commands, browser and desktop tasks.
Connect your AI assistant to Blender for 3D modeling, Geometry Nodes, materials, lighting, animation, rendering and export. Inspect real scenes and viewport images, refine the result and restore checkpoints. OAuth connects your chat to Blender Bridge Desktop on an online Windows 10/11 x64 computer running Blender 4.2+. The chat can run on another device. Requires an active Blender Bridge account; 7-day trial available. AI model access is separate.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to explore Roblox Studio game structure, read and edit scripts, and perform bulk changes locally and safely.MIT
- AlicenseNot gradedqualityCmaintenanceConnects AI assistants like Claude and Gemini to Roblox Studio, enabling game structure exploration, script editing, UI generation, style extraction, and bulk changes locally and safely.5 npmMIT
- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to Roblox Studio, enabling them to interact with instance hierarchy, edit Luau scripts, manage properties, and sync files over a local connection.11 npm2MIT
- AlicenseAqualityDmaintenanceConnects AI coding assistants to Roblox Studio, enabling direct manipulation of the DataModel through natural language commands with undo support.1454 npm2MIT