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/dist/index.js ADDED
@@ -0,0 +1,323 @@
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
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
18
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
19
+ import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
20
+ import { createHttpServer } from './http-server.js';
21
+ import { RobloxStudioTools } from './tools/index.js';
22
+ import { BridgeService } from './bridge-service.js';
23
+ class RobloxStudioMCPServer {
24
+ server;
25
+ tools;
26
+ bridge;
27
+ constructor() {
28
+ this.server = new Server({
29
+ name: 'robloxstudio-mcp',
30
+ version: '1.0.0',
31
+ }, {
32
+ capabilities: {
33
+ tools: {},
34
+ },
35
+ });
36
+ this.bridge = new BridgeService();
37
+ this.tools = new RobloxStudioTools(this.bridge);
38
+ this.setupToolHandlers();
39
+ }
40
+ setupToolHandlers() {
41
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
42
+ return {
43
+ tools: [
44
+ // File System Tools
45
+ {
46
+ name: 'get_file_tree',
47
+ description: 'Get complete hierarchy of the Roblox Studio project with script types, models, and folders',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ path: {
52
+ type: 'string',
53
+ description: 'Optional path to start from (defaults to workspace root)',
54
+ default: ''
55
+ }
56
+ }
57
+ }
58
+ },
59
+ {
60
+ name: 'get_file_content',
61
+ description: 'Retrieve script source code from a specific file',
62
+ inputSchema: {
63
+ type: 'object',
64
+ properties: {
65
+ path: {
66
+ type: 'string',
67
+ description: 'Path to the script file'
68
+ }
69
+ },
70
+ required: ['path']
71
+ }
72
+ },
73
+ {
74
+ name: 'search_files',
75
+ description: 'Find files by name, type, or content patterns',
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ query: {
80
+ type: 'string',
81
+ description: 'Search query (name, type, or content pattern)'
82
+ },
83
+ searchType: {
84
+ type: 'string',
85
+ enum: ['name', 'type', 'content'],
86
+ description: 'Type of search to perform',
87
+ default: 'name'
88
+ }
89
+ },
90
+ required: ['query']
91
+ }
92
+ },
93
+ {
94
+ name: 'get_file_properties',
95
+ description: 'Get script properties and parent/child relationships',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ path: {
100
+ type: 'string',
101
+ description: 'Path to the script file'
102
+ }
103
+ },
104
+ required: ['path']
105
+ }
106
+ },
107
+ // Studio Context Tools
108
+ {
109
+ name: 'get_place_info',
110
+ description: 'Get place ID, name, and game settings',
111
+ inputSchema: {
112
+ type: 'object',
113
+ properties: {}
114
+ }
115
+ },
116
+ {
117
+ name: 'get_services',
118
+ description: 'Get available Roblox services and their children',
119
+ inputSchema: {
120
+ type: 'object',
121
+ properties: {
122
+ serviceName: {
123
+ type: 'string',
124
+ description: 'Optional specific service name to query'
125
+ }
126
+ }
127
+ }
128
+ },
129
+ {
130
+ name: 'get_selection',
131
+ description: 'Get currently selected objects in Studio',
132
+ inputSchema: {
133
+ type: 'object',
134
+ properties: {}
135
+ }
136
+ },
137
+ {
138
+ name: 'search_objects',
139
+ description: 'Find instances by name, class, or properties',
140
+ inputSchema: {
141
+ type: 'object',
142
+ properties: {
143
+ query: {
144
+ type: 'string',
145
+ description: 'Search query'
146
+ },
147
+ searchType: {
148
+ type: 'string',
149
+ enum: ['name', 'class', 'property'],
150
+ description: 'Type of search to perform',
151
+ default: 'name'
152
+ },
153
+ propertyName: {
154
+ type: 'string',
155
+ description: 'Property name when searchType is "property"'
156
+ }
157
+ },
158
+ required: ['query']
159
+ }
160
+ },
161
+ // Property & Instance Tools
162
+ {
163
+ name: 'get_instance_properties',
164
+ description: 'Get all properties of a specific instance',
165
+ inputSchema: {
166
+ type: 'object',
167
+ properties: {
168
+ instancePath: {
169
+ type: 'string',
170
+ description: 'Path to the instance'
171
+ }
172
+ },
173
+ required: ['instancePath']
174
+ }
175
+ },
176
+ {
177
+ name: 'get_instance_children',
178
+ description: 'Get child objects and their types',
179
+ inputSchema: {
180
+ type: 'object',
181
+ properties: {
182
+ instancePath: {
183
+ type: 'string',
184
+ description: 'Path to the parent instance'
185
+ }
186
+ },
187
+ required: ['instancePath']
188
+ }
189
+ },
190
+ {
191
+ name: 'search_by_property',
192
+ description: 'Find objects with specific property values',
193
+ inputSchema: {
194
+ type: 'object',
195
+ properties: {
196
+ propertyName: {
197
+ type: 'string',
198
+ description: 'Name of the property to search'
199
+ },
200
+ propertyValue: {
201
+ type: 'string',
202
+ description: 'Value to search for'
203
+ }
204
+ },
205
+ required: ['propertyName', 'propertyValue']
206
+ }
207
+ },
208
+ {
209
+ name: 'get_class_info',
210
+ description: 'Get available properties/methods for Roblox classes',
211
+ inputSchema: {
212
+ type: 'object',
213
+ properties: {
214
+ className: {
215
+ type: 'string',
216
+ description: 'Roblox class name'
217
+ }
218
+ },
219
+ required: ['className']
220
+ }
221
+ },
222
+ // Project Tools
223
+ {
224
+ name: 'get_project_structure',
225
+ description: 'Get complete game hierarchy',
226
+ inputSchema: {
227
+ type: 'object',
228
+ properties: {}
229
+ }
230
+ },
231
+ {
232
+ name: 'get_dependencies',
233
+ description: 'Get module dependencies and relationships',
234
+ inputSchema: {
235
+ type: 'object',
236
+ properties: {
237
+ modulePath: {
238
+ type: 'string',
239
+ description: 'Optional specific module path to analyze'
240
+ }
241
+ }
242
+ }
243
+ },
244
+ {
245
+ name: 'validate_references',
246
+ description: 'Check for broken script references',
247
+ inputSchema: {
248
+ type: 'object',
249
+ properties: {}
250
+ }
251
+ }
252
+ ]
253
+ };
254
+ });
255
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
256
+ const { name, arguments: args } = request.params;
257
+ try {
258
+ switch (name) {
259
+ // File System Tools
260
+ case 'get_file_tree':
261
+ return await this.tools.getFileTree(args?.path || '');
262
+ case 'get_file_content':
263
+ return await this.tools.getFileContent(args?.path);
264
+ case 'search_files':
265
+ return await this.tools.searchFiles(args?.query, args?.searchType || 'name');
266
+ case 'get_file_properties':
267
+ return await this.tools.getFileProperties(args?.path);
268
+ // Studio Context Tools
269
+ case 'get_place_info':
270
+ return await this.tools.getPlaceInfo();
271
+ case 'get_services':
272
+ return await this.tools.getServices(args?.serviceName);
273
+ case 'get_selection':
274
+ return await this.tools.getSelection();
275
+ case 'search_objects':
276
+ return await this.tools.searchObjects(args?.query, args?.searchType || 'name', args?.propertyName);
277
+ // Property & Instance Tools
278
+ case 'get_instance_properties':
279
+ return await this.tools.getInstanceProperties(args?.instancePath);
280
+ case 'get_instance_children':
281
+ return await this.tools.getInstanceChildren(args?.instancePath);
282
+ case 'search_by_property':
283
+ return await this.tools.searchByProperty(args?.propertyName, args?.propertyValue);
284
+ case 'get_class_info':
285
+ return await this.tools.getClassInfo(args?.className);
286
+ // Project Tools
287
+ case 'get_project_structure':
288
+ return await this.tools.getProjectStructure();
289
+ case 'get_dependencies':
290
+ return await this.tools.getDependencies(args?.modulePath);
291
+ case 'validate_references':
292
+ return await this.tools.validateReferences();
293
+ default:
294
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
295
+ }
296
+ }
297
+ catch (error) {
298
+ throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
299
+ }
300
+ });
301
+ }
302
+ async run() {
303
+ // Start HTTP server for Studio plugin communication
304
+ const httpServer = createHttpServer(this.tools, this.bridge);
305
+ httpServer.listen(3002, () => {
306
+ console.error('HTTP server listening on port 3002 for Studio plugin');
307
+ });
308
+ // Start MCP server
309
+ const transport = new StdioServerTransport();
310
+ await this.server.connect(transport);
311
+ console.error('Roblox Studio MCP server running on stdio');
312
+ // Periodic cleanup of old requests
313
+ setInterval(() => {
314
+ this.bridge.cleanupOldRequests();
315
+ }, 5000);
316
+ }
317
+ }
318
+ const server = new RobloxStudioMCPServer();
319
+ server.run().catch((error) => {
320
+ console.error('Server failed to start:', error);
321
+ process.exit(1);
322
+ });
323
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { BridgeService } from '../bridge-service.js';
2
+ export declare class RobloxStudioTools {
3
+ private client;
4
+ constructor(bridge: BridgeService);
5
+ getFileTree(path?: string): Promise<{
6
+ content: {
7
+ type: string;
8
+ text: string;
9
+ }[];
10
+ }>;
11
+ getFileContent(path: string): Promise<{
12
+ content: {
13
+ type: string;
14
+ text: string;
15
+ }[];
16
+ }>;
17
+ searchFiles(query: string, searchType?: string): Promise<{
18
+ content: {
19
+ type: string;
20
+ text: string;
21
+ }[];
22
+ }>;
23
+ getFileProperties(path: string): Promise<{
24
+ content: {
25
+ type: string;
26
+ text: string;
27
+ }[];
28
+ }>;
29
+ getPlaceInfo(): Promise<{
30
+ content: {
31
+ type: string;
32
+ text: string;
33
+ }[];
34
+ }>;
35
+ getServices(serviceName?: string): Promise<{
36
+ content: {
37
+ type: string;
38
+ text: string;
39
+ }[];
40
+ }>;
41
+ getSelection(): Promise<{
42
+ content: {
43
+ type: string;
44
+ text: string;
45
+ }[];
46
+ }>;
47
+ searchObjects(query: string, searchType?: string, propertyName?: string): Promise<{
48
+ content: {
49
+ type: string;
50
+ text: string;
51
+ }[];
52
+ }>;
53
+ getInstanceProperties(instancePath: string): Promise<{
54
+ content: {
55
+ type: string;
56
+ text: string;
57
+ }[];
58
+ }>;
59
+ getInstanceChildren(instancePath: string): Promise<{
60
+ content: {
61
+ type: string;
62
+ text: string;
63
+ }[];
64
+ }>;
65
+ searchByProperty(propertyName: string, propertyValue: string): Promise<{
66
+ content: {
67
+ type: string;
68
+ text: string;
69
+ }[];
70
+ }>;
71
+ getClassInfo(className: string): Promise<{
72
+ content: {
73
+ type: string;
74
+ text: string;
75
+ }[];
76
+ }>;
77
+ getProjectStructure(): Promise<{
78
+ content: {
79
+ type: string;
80
+ text: string;
81
+ }[];
82
+ }>;
83
+ getDependencies(modulePath?: string): Promise<{
84
+ content: {
85
+ type: string;
86
+ text: string;
87
+ }[];
88
+ }>;
89
+ validateReferences(): Promise<{
90
+ content: {
91
+ type: string;
92
+ text: string;
93
+ }[];
94
+ }>;
95
+ }
96
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,aAAa;IAK3B,WAAW,CAAC,IAAI,GAAE,MAAW;;;;;;IAY7B,cAAc,CAAC,IAAI,EAAE,MAAM;;;;;;IAe3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe;;;;;;IAYtD,iBAAiB,CAAC,IAAI,EAAE,MAAM;;;;;;IAgB9B,YAAY;;;;;;IAYZ,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM;;;;;;IAYhC,YAAY;;;;;;IAYZ,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe,EAAE,YAAY,CAAC,EAAE,MAAM;;;;;;IAiB/E,qBAAqB,CAAC,YAAY,EAAE,MAAM;;;;;;IAe1C,mBAAmB,CAAC,YAAY,EAAE,MAAM;;;;;;IAexC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;;;;;;IAkB5D,YAAY,CAAC,SAAS,EAAE,MAAM;;;;;;IAgB9B,mBAAmB;;;;;;IAYnB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM;;;;;;IAYnC,kBAAkB;;;;;;CAWzB"}
@@ -0,0 +1,202 @@
1
+ import { StudioHttpClient } from './studio-client.js';
2
+ export class RobloxStudioTools {
3
+ client;
4
+ constructor(bridge) {
5
+ this.client = new StudioHttpClient(bridge);
6
+ }
7
+ // File System Tools
8
+ async getFileTree(path = '') {
9
+ const response = await this.client.request('/api/file-tree', { path });
10
+ return {
11
+ content: [
12
+ {
13
+ type: 'text',
14
+ text: JSON.stringify(response, null, 2)
15
+ }
16
+ ]
17
+ };
18
+ }
19
+ async getFileContent(path) {
20
+ if (!path) {
21
+ throw new Error('Path is required for get_file_content');
22
+ }
23
+ const response = await this.client.request('/api/file-content', { path });
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: JSON.stringify(response, null, 2)
29
+ }
30
+ ]
31
+ };
32
+ }
33
+ async searchFiles(query, searchType = 'name') {
34
+ const response = await this.client.request('/api/search-files', { query, searchType });
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: JSON.stringify(response, null, 2)
40
+ }
41
+ ]
42
+ };
43
+ }
44
+ async getFileProperties(path) {
45
+ if (!path) {
46
+ throw new Error('Path is required for get_file_properties');
47
+ }
48
+ const response = await this.client.request('/api/file-properties', { path });
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: JSON.stringify(response, null, 2)
54
+ }
55
+ ]
56
+ };
57
+ }
58
+ // Studio Context Tools
59
+ async getPlaceInfo() {
60
+ const response = await this.client.request('/api/place-info', {});
61
+ return {
62
+ content: [
63
+ {
64
+ type: 'text',
65
+ text: JSON.stringify(response, null, 2)
66
+ }
67
+ ]
68
+ };
69
+ }
70
+ async getServices(serviceName) {
71
+ const response = await this.client.request('/api/services', { serviceName });
72
+ return {
73
+ content: [
74
+ {
75
+ type: 'text',
76
+ text: JSON.stringify(response, null, 2)
77
+ }
78
+ ]
79
+ };
80
+ }
81
+ async getSelection() {
82
+ const response = await this.client.request('/api/selection', {});
83
+ return {
84
+ content: [
85
+ {
86
+ type: 'text',
87
+ text: JSON.stringify(response, null, 2)
88
+ }
89
+ ]
90
+ };
91
+ }
92
+ async searchObjects(query, searchType = 'name', propertyName) {
93
+ const response = await this.client.request('/api/search-objects', {
94
+ query,
95
+ searchType,
96
+ propertyName
97
+ });
98
+ return {
99
+ content: [
100
+ {
101
+ type: 'text',
102
+ text: JSON.stringify(response, null, 2)
103
+ }
104
+ ]
105
+ };
106
+ }
107
+ // Property & Instance Tools
108
+ async getInstanceProperties(instancePath) {
109
+ if (!instancePath) {
110
+ throw new Error('Instance path is required for get_instance_properties');
111
+ }
112
+ const response = await this.client.request('/api/instance-properties', { instancePath });
113
+ return {
114
+ content: [
115
+ {
116
+ type: 'text',
117
+ text: JSON.stringify(response, null, 2)
118
+ }
119
+ ]
120
+ };
121
+ }
122
+ async getInstanceChildren(instancePath) {
123
+ if (!instancePath) {
124
+ throw new Error('Instance path is required for get_instance_children');
125
+ }
126
+ const response = await this.client.request('/api/instance-children', { instancePath });
127
+ return {
128
+ content: [
129
+ {
130
+ type: 'text',
131
+ text: JSON.stringify(response, null, 2)
132
+ }
133
+ ]
134
+ };
135
+ }
136
+ async searchByProperty(propertyName, propertyValue) {
137
+ if (!propertyName || !propertyValue) {
138
+ throw new Error('Property name and value are required for search_by_property');
139
+ }
140
+ const response = await this.client.request('/api/search-by-property', {
141
+ propertyName,
142
+ propertyValue
143
+ });
144
+ return {
145
+ content: [
146
+ {
147
+ type: 'text',
148
+ text: JSON.stringify(response, null, 2)
149
+ }
150
+ ]
151
+ };
152
+ }
153
+ async getClassInfo(className) {
154
+ if (!className) {
155
+ throw new Error('Class name is required for get_class_info');
156
+ }
157
+ const response = await this.client.request('/api/class-info', { className });
158
+ return {
159
+ content: [
160
+ {
161
+ type: 'text',
162
+ text: JSON.stringify(response, null, 2)
163
+ }
164
+ ]
165
+ };
166
+ }
167
+ // Project Tools
168
+ async getProjectStructure() {
169
+ const response = await this.client.request('/api/project-structure', {});
170
+ return {
171
+ content: [
172
+ {
173
+ type: 'text',
174
+ text: JSON.stringify(response, null, 2)
175
+ }
176
+ ]
177
+ };
178
+ }
179
+ async getDependencies(modulePath) {
180
+ const response = await this.client.request('/api/dependencies', { modulePath });
181
+ return {
182
+ content: [
183
+ {
184
+ type: 'text',
185
+ text: JSON.stringify(response, null, 2)
186
+ }
187
+ ]
188
+ };
189
+ }
190
+ async validateReferences() {
191
+ const response = await this.client.request('/api/validate-references', {});
192
+ return {
193
+ content: [
194
+ {
195
+ type: 'text',
196
+ text: JSON.stringify(response, null, 2)
197
+ }
198
+ ]
199
+ };
200
+ }
201
+ }
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BridgeService } from '../bridge-service.js';
2
+ export declare class StudioHttpClient {
3
+ private bridge;
4
+ constructor(bridge: BridgeService);
5
+ request(endpoint: string, data: any): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=studio-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-client.d.ts","sourceRoot":"","sources":["../../src/tools/studio-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,aAAa;IAI3B,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAazD"}