robloxstudio-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE.md ADDED
@@ -0,0 +1,63 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Development Commands
6
+
7
+ - `npm run dev` - Start development server with hot reload using tsx
8
+ - `npm run build` - Build TypeScript to JavaScript in dist/
9
+ - `npm start` - Run the built MCP server (requires build first)
10
+ - `npm run lint` - Run ESLint on TypeScript source files
11
+ - `npm run typecheck` - Run TypeScript compiler without emitting files
12
+
13
+ ## Architecture Overview
14
+
15
+ This is a dual-component system that bridges Roblox Studio with MCP (Model Context Protocol) for AI tool integration:
16
+
17
+ ### Core Components
18
+
19
+ 1. **MCP Server** (`src/index.ts`): Stdio-based MCP server that exposes 15 tools for Studio data access
20
+ 2. **Bridge Service** (`src/bridge-service.ts`): Request/response queue manager using Promise-based async handling with UUID tracking
21
+ 3. **Studio Plugin** (`studio-plugin/plugin.lua`): Luau plugin that polls the HTTP server and executes Studio API calls
22
+ 4. **HTTP Server** (`src/http-server.ts`): Express server on port 3002 providing polling endpoints for the Studio plugin
23
+
24
+ ### Communication Flow
25
+
26
+ The system uses a polling architecture because Roblox plugins cannot run HTTP servers:
27
+
28
+ 1. AI tools call MCP server via stdio
29
+ 2. MCP server queues requests in BridgeService
30
+ 3. Studio plugin polls `/poll` endpoint every 500ms
31
+ 4. Plugin processes requests using Studio APIs
32
+ 5. Plugin sends responses via `/response` endpoint
33
+ 6. BridgeService resolves promises and returns data to MCP tools
34
+
35
+ ### Key Design Patterns
36
+
37
+ - **Async Bridge Pattern**: BridgeService uses Map<string, PendingRequest> to track requests with Promise resolve/reject
38
+ - **Polling Architecture**: Studio plugin maintains connection state and polls for work rather than receiving pushes
39
+ - **Tool Proxy Pattern**: Each MCP tool proxies through HTTP to Studio plugin endpoints
40
+ - **Timeout Management**: 30-second request timeouts with periodic cleanup
41
+
42
+ ### Tool Categories
43
+
44
+ All 15 tools follow the same request/response pattern but are organized into:
45
+ - File System Tools (file tree, content, search, properties)
46
+ - Studio Context Tools (place info, services, selection, object search)
47
+ - Property & Instance Tools (instance data, children, property search, class info)
48
+ - Project Tools (structure, dependencies, reference validation)
49
+
50
+ ### Studio Plugin Integration
51
+
52
+ The plugin uses proper Roblox Studio APIs:
53
+ - `plugin:CreateToolbar()` and `plugin:CreateDockWidgetPluginGui()` for UI
54
+ - `HttpService:RequestAsync()` for HTTP communication
55
+ - `RunService.Heartbeat` for polling timer
56
+ - Studio services (Selection, StudioService, etc.) for data extraction
57
+
58
+ ### Build System
59
+
60
+ - TypeScript with ES modules (`"type": "module"`)
61
+ - ESLint with TypeScript parser
62
+ - Builds to `dist/` directory
63
+ - Uses tsx for development hot reload
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Roblox Studio MCP Server
2
+
3
+ An MCP (Model Context Protocol) server that provides AI tools access to Roblox Studio data through a plugin-based architecture.
4
+
5
+ ## Quick Installation
6
+
7
+ ### For End Users (Easy Setup)
8
+
9
+ Add to your MCP configuration (like in Claude Desktop or other MCP clients):
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "robloxstudio": {
15
+ "command": "npx",
16
+ "args": ["-y", "robloxstudio-mcp"],
17
+ "description": "Roblox Studio integration for AI assistants"
18
+ }
19
+ }
20
+ }
21
+ ```
22
+
23
+ Or use with Claude Code MCP add command:
24
+ ```bash
25
+ claude mcp add robloxstudio -- npx -y robloxstudio-mcp
26
+ ```
27
+
28
+ ### For Developers
29
+
30
+ 1. **Clone and install:**
31
+ ```bash
32
+ git clone <repo-url>
33
+ cd robloxstudio-mcp
34
+ npm install
35
+ ```
36
+
37
+ 2. **Build and test:**
38
+ ```bash
39
+ npm run build
40
+ npm start
41
+ ```
42
+
43
+ ## Studio Plugin Setup
44
+
45
+ **Required for both installation methods:**
46
+
47
+ 1. **Install the Studio plugin:**
48
+ - See [studio-plugin/INSTALLATION.md](studio-plugin/INSTALLATION.md) for detailed instructions
49
+ - Enable HTTP Requests in Game Settings
50
+ - Activate the plugin using the toolbar button
51
+
52
+ ## Architecture
53
+
54
+ - **MCP Server** (TypeScript/Node.js) - Handles AI tool calls via stdio
55
+ - **Studio Plugin** (Luau) - Extracts Studio data and communicates with MCP server
56
+ - **HTTP Bridge** - Communication layer between plugin and server (localhost:3002)
57
+
58
+ ## Development
59
+
60
+ - `npm run dev` - Start development server with hot reload
61
+ - `npm run build` - Build TypeScript to JavaScript
62
+ - `npm run lint` - Run ESLint
63
+ - `npm run typecheck` - Run TypeScript type checking
64
+
65
+ ## Available Tools
66
+
67
+ ### File System Tools
68
+ - `get_file_tree` - Complete hierarchy with script types, models, folders
69
+ - `get_file_content` - Retrieve script source code
70
+ - `search_files` - Find files by name, type, or content patterns
71
+ - `get_file_properties` - Script properties, parent/child relationships
72
+
73
+ ### Studio Context Tools
74
+ - `get_place_info` - Place ID, name, game settings
75
+ - `get_services` - Available Roblox services and their children
76
+ - `get_selection` - Currently selected objects in Studio
77
+ - `search_objects` - Find instances by name, class, properties
78
+
79
+ ### Property & Instance Tools
80
+ - `get_instance_properties` - All properties of a specific instance
81
+ - `get_instance_children` - Child objects and their types
82
+ - `search_by_property` - Find objects with specific property values
83
+ - `get_class_info` - Available properties/methods for Roblox classes
84
+
85
+ ### Project Tools
86
+ - `get_project_structure` - Complete game hierarchy
87
+ - `get_dependencies` - Module dependencies and relationships
88
+ - `validate_references` - Check for broken script references
89
+
90
+ ## Communication Protocol
91
+
92
+ The MCP server exposes tools via stdio for AI integration. The Studio plugin polls the server on port 3002 using HTTP requests. When an AI tool is called:
93
+
94
+ 1. MCP server queues the request
95
+ 2. Studio plugin polls and receives the request
96
+ 3. Plugin extracts data using Studio APIs
97
+ 4. Plugin sends response back to server
98
+ 5. Server returns result to AI tool
99
+
100
+ ## Configuration
101
+
102
+ The server can be configured through environment variables:
103
+ - `MCP_SERVER_PORT` - Server port (default: 3001)
104
+ - `STUDIO_PLUGIN_URL` - Studio plugin URL (default: http://localhost:3002)
@@ -0,0 +1,16 @@
1
+ export declare class BridgeService {
2
+ private pendingRequests;
3
+ private requestTimeout;
4
+ sendRequest(endpoint: string, data: any): Promise<any>;
5
+ getPendingRequest(): {
6
+ requestId: string;
7
+ request: {
8
+ endpoint: string;
9
+ data: any;
10
+ };
11
+ } | null;
12
+ resolveRequest(requestId: string, response: any): void;
13
+ rejectRequest(requestId: string, error: any): void;
14
+ cleanupOldRequests(): void;
15
+ }
16
+ //# sourceMappingURL=bridge-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-service.d.ts","sourceRoot":"","sources":["../src/bridge-service.ts"],"names":[],"mappings":"AAWA,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAS;IAEzB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAyB5D,iBAAiB,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,GAAG,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI;IAuB3F,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;IAQ/C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAS3C,kBAAkB;CASnB"}
@@ -0,0 +1,70 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ export class BridgeService {
3
+ pendingRequests = new Map();
4
+ requestTimeout = 30000; // 30 seconds timeout
5
+ async sendRequest(endpoint, data) {
6
+ const requestId = uuidv4();
7
+ return new Promise((resolve, reject) => {
8
+ const request = {
9
+ id: requestId,
10
+ endpoint,
11
+ data,
12
+ timestamp: Date.now(),
13
+ resolve,
14
+ reject
15
+ };
16
+ this.pendingRequests.set(requestId, request);
17
+ // Set timeout
18
+ setTimeout(() => {
19
+ if (this.pendingRequests.has(requestId)) {
20
+ this.pendingRequests.delete(requestId);
21
+ reject(new Error('Request timeout'));
22
+ }
23
+ }, this.requestTimeout);
24
+ });
25
+ }
26
+ getPendingRequest() {
27
+ // Get oldest pending request
28
+ let oldestRequest = null;
29
+ for (const request of this.pendingRequests.values()) {
30
+ if (!oldestRequest || request.timestamp < oldestRequest.timestamp) {
31
+ oldestRequest = request;
32
+ }
33
+ }
34
+ if (oldestRequest) {
35
+ return {
36
+ requestId: oldestRequest.id,
37
+ request: {
38
+ endpoint: oldestRequest.endpoint,
39
+ data: oldestRequest.data
40
+ }
41
+ };
42
+ }
43
+ return null;
44
+ }
45
+ resolveRequest(requestId, response) {
46
+ const request = this.pendingRequests.get(requestId);
47
+ if (request) {
48
+ this.pendingRequests.delete(requestId);
49
+ request.resolve(response);
50
+ }
51
+ }
52
+ rejectRequest(requestId, error) {
53
+ const request = this.pendingRequests.get(requestId);
54
+ if (request) {
55
+ this.pendingRequests.delete(requestId);
56
+ request.reject(error);
57
+ }
58
+ }
59
+ // Clean up old requests
60
+ cleanupOldRequests() {
61
+ const now = Date.now();
62
+ for (const [id, request] of this.pendingRequests.entries()) {
63
+ if (now - request.timestamp > this.requestTimeout) {
64
+ this.pendingRequests.delete(id);
65
+ request.reject(new Error('Request timeout'));
66
+ }
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=bridge-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-service.js","sourceRoot":"","sources":["../src/bridge-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { RobloxStudioTools } from './tools/index.js';
2
+ import { BridgeService } from './bridge-service.js';
3
+ export declare function createHttpServer(tools: RobloxStudioTools, bridge: BridgeService): import("express-serve-static-core").Express;
4
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,+CA2K/E"}
@@ -0,0 +1,170 @@
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ export function createHttpServer(tools, bridge) {
4
+ const app = express();
5
+ app.use(cors());
6
+ app.use(express.json());
7
+ // Health check endpoint
8
+ app.get('/health', (req, res) => {
9
+ res.json({ status: 'ok', service: 'robloxstudio-mcp' });
10
+ });
11
+ // Polling endpoint for Studio plugin
12
+ app.get('/poll', (req, res) => {
13
+ const pendingRequest = bridge.getPendingRequest();
14
+ if (pendingRequest) {
15
+ res.json({ request: pendingRequest.request, requestId: pendingRequest.requestId });
16
+ }
17
+ else {
18
+ res.json({ request: null });
19
+ }
20
+ });
21
+ // Response endpoint for Studio plugin
22
+ app.post('/response', (req, res) => {
23
+ const { requestId, response, error } = req.body;
24
+ if (error) {
25
+ bridge.rejectRequest(requestId, error);
26
+ }
27
+ else {
28
+ bridge.resolveRequest(requestId, response);
29
+ }
30
+ res.json({ success: true });
31
+ });
32
+ // MCP tool proxy endpoints - these will be called by AI tools
33
+ app.post('/mcp/get_file_tree', async (req, res) => {
34
+ try {
35
+ const result = await tools.getFileTree(req.body.path);
36
+ res.json(result);
37
+ }
38
+ catch (error) {
39
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
40
+ }
41
+ });
42
+ app.post('/mcp/get_file_content', async (req, res) => {
43
+ try {
44
+ const result = await tools.getFileContent(req.body.path);
45
+ res.json(result);
46
+ }
47
+ catch (error) {
48
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
49
+ }
50
+ });
51
+ app.post('/mcp/search_files', async (req, res) => {
52
+ try {
53
+ const result = await tools.searchFiles(req.body.query, req.body.searchType);
54
+ res.json(result);
55
+ }
56
+ catch (error) {
57
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
58
+ }
59
+ });
60
+ app.post('/mcp/get_file_properties', async (req, res) => {
61
+ try {
62
+ const result = await tools.getFileProperties(req.body.path);
63
+ res.json(result);
64
+ }
65
+ catch (error) {
66
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
67
+ }
68
+ });
69
+ app.post('/mcp/get_place_info', async (req, res) => {
70
+ try {
71
+ const result = await tools.getPlaceInfo();
72
+ res.json(result);
73
+ }
74
+ catch (error) {
75
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
76
+ }
77
+ });
78
+ app.post('/mcp/get_services', async (req, res) => {
79
+ try {
80
+ const result = await tools.getServices(req.body.serviceName);
81
+ res.json(result);
82
+ }
83
+ catch (error) {
84
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
85
+ }
86
+ });
87
+ app.post('/mcp/get_selection', async (req, res) => {
88
+ try {
89
+ const result = await tools.getSelection();
90
+ res.json(result);
91
+ }
92
+ catch (error) {
93
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
94
+ }
95
+ });
96
+ app.post('/mcp/search_objects', async (req, res) => {
97
+ try {
98
+ const result = await tools.searchObjects(req.body.query, req.body.searchType, req.body.propertyName);
99
+ res.json(result);
100
+ }
101
+ catch (error) {
102
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
103
+ }
104
+ });
105
+ app.post('/mcp/get_instance_properties', async (req, res) => {
106
+ try {
107
+ const result = await tools.getInstanceProperties(req.body.instancePath);
108
+ res.json(result);
109
+ }
110
+ catch (error) {
111
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
112
+ }
113
+ });
114
+ app.post('/mcp/get_instance_children', async (req, res) => {
115
+ try {
116
+ const result = await tools.getInstanceChildren(req.body.instancePath);
117
+ res.json(result);
118
+ }
119
+ catch (error) {
120
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
121
+ }
122
+ });
123
+ app.post('/mcp/search_by_property', async (req, res) => {
124
+ try {
125
+ const result = await tools.searchByProperty(req.body.propertyName, req.body.propertyValue);
126
+ res.json(result);
127
+ }
128
+ catch (error) {
129
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
130
+ }
131
+ });
132
+ app.post('/mcp/get_class_info', async (req, res) => {
133
+ try {
134
+ const result = await tools.getClassInfo(req.body.className);
135
+ res.json(result);
136
+ }
137
+ catch (error) {
138
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
139
+ }
140
+ });
141
+ app.post('/mcp/get_project_structure', async (req, res) => {
142
+ try {
143
+ const result = await tools.getProjectStructure();
144
+ res.json(result);
145
+ }
146
+ catch (error) {
147
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
148
+ }
149
+ });
150
+ app.post('/mcp/get_dependencies', async (req, res) => {
151
+ try {
152
+ const result = await tools.getDependencies(req.body.modulePath);
153
+ res.json(result);
154
+ }
155
+ catch (error) {
156
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
157
+ }
158
+ });
159
+ app.post('/mcp/validate_references', async (req, res) => {
160
+ try {
161
+ const result = await tools.validateReferences();
162
+ res.json(result);
163
+ }
164
+ catch (error) {
165
+ res.status(500).json({ error: error instanceof Error ? error.message : 'Unknown error' });
166
+ }
167
+ });
168
+ return app;
169
+ }
170
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Roblox Studio MCP Server
4
+ *
5
+ * This server provides Model Context Protocol (MCP) tools for interacting with Roblox Studio.
6
+ * It allows AI assistants to access Studio data, scripts, and objects through a bridge plugin.
7
+ *
8
+ * Usage:
9
+ * npx robloxstudio-mcp
10
+ *
11
+ * Or add to your MCP configuration:
12
+ * "robloxstudio": {
13
+ * "command": "npx",
14
+ * "args": ["-y", "robloxstudio-mcp"]
15
+ * }
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG"}