@el4cteo/rbx-studio-mcp 0.6.7 → 0.7.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/package.json CHANGED
@@ -1,74 +1,74 @@
1
- {
2
- "name": "@el4cteo/rbx-studio-mcp",
3
- "version": "0.6.7",
4
- "description": "MCP server for Roblox Studio. 35 tools, push-based SSE bridge, editor-safe script edits, one-step undo.",
5
- "type": "module",
6
- "license": "MIT",
7
- "bin": {
8
- "rbx-studio-mcp": "dist/index.js"
9
- },
10
- "files": [
11
- "dist",
12
- "plugin",
13
- "scripts",
14
- "config/dsh.cordis.yml",
15
- "README.md",
16
- "LICENSE"
17
- ],
18
- "dsh": {
19
- "bundle": {
20
- "patch": "./config/dsh.cordis.yml"
21
- }
22
- },
23
- "engines": {
24
- "node": ">=22.15"
25
- },
26
- "scripts": {
27
- "build": "tsc",
28
- "watch": "tsc --watch",
29
- "typecheck": "tsc --noEmit",
30
- "start": "node dist/index.js",
31
- "build:plugin": "node scripts/check-plugin.mjs && node scripts/build-plugin.mjs",
32
- "sourcemap": "node scripts/sourcemap.mjs",
33
- "test": "node scripts/test-plugin.mjs && node scripts/test-transport.mjs && node scripts/test-bridge.mjs && node scripts/test-console.mjs && node scripts/test-failover.mjs",
34
- "build:all": "npm run build && npm run build:plugin",
35
- "install:plugin": "node scripts/install-plugin.mjs",
36
- "check:plugin": "node scripts/check-plugin.mjs",
37
- "doctor": "node dist/index.js doctor",
38
- "prepack": "npm run build"
39
- },
40
- "keywords": [
41
- "mcp",
42
- "mcp-server",
43
- "model-context-protocol",
44
- "roblox",
45
- "roblox-studio",
46
- "roblox-development",
47
- "luau",
48
- "claude",
49
- "claude-code",
50
- "cursor",
51
- "ai",
52
- "ai-agent"
53
- ],
54
- "dependencies": {
55
- "@modelcontextprotocol/sdk": "^1.30.0",
56
- "zod": "^4.6.2"
57
- },
58
- "devDependencies": {
59
- "@types/node": "^26.5.1",
60
- "typescript": "^7.0.2"
61
- },
62
- "author": "EL4CTEO",
63
- "repository": {
64
- "type": "git",
65
- "url": "git+https://github.com/EL4CTEO/rbx-studio-mcp.git"
66
- },
67
- "homepage": "https://github.com/EL4CTEO/rbx-studio-mcp#readme",
68
- "bugs": {
69
- "url": "https://github.com/EL4CTEO/rbx-studio-mcp/issues"
70
- },
71
- "publishConfig": {
72
- "access": "public"
73
- }
74
- }
1
+ {
2
+ "name": "@el4cteo/rbx-studio-mcp",
3
+ "version": "0.7.0",
4
+ "description": "MCP server for Roblox Studio. 35 tools, push-based SSE bridge, editor-safe script edits, one-step undo.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "rbx-studio-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "plugin",
13
+ "scripts",
14
+ "config/dsh.cordis.yml",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "dsh": {
19
+ "bundle": {
20
+ "patch": "./config/dsh.cordis.yml"
21
+ }
22
+ },
23
+ "engines": {
24
+ "node": ">=22.15"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "watch": "tsc --watch",
29
+ "typecheck": "tsc --noEmit",
30
+ "start": "node dist/index.js",
31
+ "build:plugin": "node scripts/check-plugin.mjs && node scripts/build-plugin.mjs",
32
+ "sourcemap": "node scripts/sourcemap.mjs",
33
+ "test": "node scripts/test-plugin.mjs && node scripts/test-transport.mjs && node scripts/test-server.mjs && node scripts/test-bridge.mjs && node scripts/test-console.mjs && node scripts/test-failover.mjs",
34
+ "build:all": "npm run build && npm run build:plugin",
35
+ "install:plugin": "node scripts/install-plugin.mjs",
36
+ "check:plugin": "node scripts/check-plugin.mjs",
37
+ "doctor": "node dist/index.js doctor",
38
+ "prepack": "npm run build"
39
+ },
40
+ "keywords": [
41
+ "mcp",
42
+ "mcp-server",
43
+ "model-context-protocol",
44
+ "roblox",
45
+ "roblox-studio",
46
+ "roblox-development",
47
+ "luau",
48
+ "claude",
49
+ "claude-code",
50
+ "cursor",
51
+ "ai",
52
+ "ai-agent"
53
+ ],
54
+ "dependencies": {
55
+ "@modelcontextprotocol/sdk": "^1.30.0",
56
+ "zod": "^4.6.5"
57
+ },
58
+ "devDependencies": {
59
+ "@types/node": "^26.6.1",
60
+ "typescript": "^7.0.2"
61
+ },
62
+ "author": "EL4CTEO",
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/EL4CTEO/rbx-studio-mcp.git"
66
+ },
67
+ "homepage": "https://github.com/EL4CTEO/rbx-studio-mcp#readme",
68
+ "bugs": {
69
+ "url": "https://github.com/EL4CTEO/rbx-studio-mcp/issues"
70
+ },
71
+ "publishConfig": {
72
+ "access": "public"
73
+ }
74
+ }
@@ -9,7 +9,7 @@
9
9
 
10
10
  local Config = {}
11
11
 
12
- Config.PLUGIN_VERSION = "0.6.7"
12
+ Config.PLUGIN_VERSION = "0.7.0"
13
13
 
14
14
  -- Fingerprint of plugin/src, stamped in by scripts/build-plugin.mjs. The server
15
15
  -- computes the same hash from its own copy of the sources and compares, so a
@@ -60,6 +60,16 @@ function Serialize.value(value: any): any
60
60
  return value
61
61
  end
62
62
  if kind == "number" then
63
+ -- JSON has no inf or nan, and HttpService:JSONEncode turns them into a
64
+ -- `{"m":null,"t":"numeric","v":"inf"}` object nobody asked for. Written as
65
+ -- text instead, in the same words `modify` accepts back.
66
+ if value ~= value then
67
+ return "nan"
68
+ elseif value == math.huge then
69
+ return "inf"
70
+ elseif value == -math.huge then
71
+ return "-inf"
72
+ end
63
73
  -- Kept numeric so the agent can do arithmetic without parsing.
64
74
  return math.round(value * 10 ^ PRECISION) / 10 ^ PRECISION
65
75
  end
@@ -98,7 +98,7 @@ function TextEdit.validate(edit: Edit, position: number)
98
98
  if typeof(edit.path) ~= "string" or edit.path == "" then
99
99
  Dispatch.fail(
100
100
  "BAD_PARAMS",
101
- string.format("edits[%d] has no `path`.", position),
101
+ string.format("edits[%d] has no `path`.", position - 1),
102
102
  'Every edit needs the path of the script to change, e.g. "ServerScriptService.Main".'
103
103
  )
104
104
  end
@@ -117,7 +117,7 @@ function TextEdit.validate(edit: Edit, position: number)
117
117
  if modes == 0 then
118
118
  Dispatch.fail(
119
119
  "BAD_PARAMS",
120
- string.format("edits[%d] (%s) says what to edit but not how.", position, edit.path),
120
+ string.format("edits[%d] (%s) says what to edit but not how.", position - 1, edit.path),
121
121
  "Give exactly one of: `find` + `replace`, `startLine` (+ `endLine`) + "
122
122
  .. "`replacement`, or `source` to replace the whole script."
123
123
  )
@@ -125,7 +125,7 @@ function TextEdit.validate(edit: Edit, position: number)
125
125
  if modes > 1 then
126
126
  Dispatch.fail(
127
127
  "BAD_PARAMS",
128
- string.format("edits[%d] (%s) combines more than one edit mode.", position, edit.path),
128
+ string.format("edits[%d] (%s) combines more than one edit mode.", position - 1, edit.path),
129
129
  "Use `find`, `startLine` or `source` -- one per edit. Send several entries "
130
130
  .. "in the array if you need several changes."
131
131
  )
@@ -135,13 +135,13 @@ function TextEdit.validate(edit: Edit, position: number)
135
135
  if edit.find == "" then
136
136
  Dispatch.fail(
137
137
  "BAD_PARAMS",
138
- string.format("edits[%d] (%s) has an empty `find`.", position, edit.path)
138
+ string.format("edits[%d] (%s) has an empty `find`.", position - 1, edit.path)
139
139
  )
140
140
  end
141
141
  if typeof(edit.replace) ~= "string" then
142
142
  Dispatch.fail(
143
143
  "BAD_PARAMS",
144
- string.format("edits[%d] (%s) has `find` but no `replace`.", position, edit.path),
144
+ string.format("edits[%d] (%s) has `find` but no `replace`.", position - 1, edit.path),
145
145
  "Pass an empty `replace` to delete the matched text."
146
146
  )
147
147
  end
@@ -149,7 +149,7 @@ function TextEdit.validate(edit: Edit, position: number)
149
149
  if typeof(edit.replacement) ~= "string" then
150
150
  Dispatch.fail(
151
151
  "BAD_PARAMS",
152
- string.format("edits[%d] (%s) has `startLine` but no `replacement`.", position, edit.path),
152
+ string.format("edits[%d] (%s) has `startLine` but no `replacement`.", position - 1, edit.path),
153
153
  "Pass an empty `replacement` to delete those lines."
154
154
  )
155
155
  end