unreal-engine-mcp-server 0.6.1-beta-a → 0.6.1-beta-b

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/CHANGELOG.md CHANGED
@@ -13,6 +13,61 @@ _Nothing yet._
13
13
 
14
14
  ---
15
15
 
16
+ ## 🏷️ [0.6.1-beta-b] - 2026-11-08
17
+
18
+ > [!NOTE]
19
+ > **Beta.** Published as a semver prerelease (`0.6.1-beta-b`) under the npm `beta` dist-tag, so `npm install` keeps serving the newest stable release, **`0.6.0`**. This section is everything on `dev` since the `v0.6.1-beta-a` tag, written from the code diff.
20
+
21
+ <details>
22
+ <summary><b>🔄 Changed</b></summary>
23
+
24
+ - **Inputs are held to their contract**: execute refuses a string or object key past its `maxLength`, or past the 1023 characters an FName holds where none is set (code, scripts and prose parameters take more); a vector or color sent as an array must hold exactly the type's numbers; `add_keyframe` requires `property`.
25
+
26
+ </details>
27
+
28
+ <details>
29
+ <summary><b>🔧 Fixed</b></summary>
30
+
31
+ - **Builds**: the plugin builds on macOS again and on UE 5.0 and 5.1, and a source check in CI keeps those compiler traps out.
32
+ - **Crashes**: an overlong tag, name or key and an `add_keyframe` with no `property` no longer close the editor.
33
+ - **Vectors and colors**: Niagara parameters, effect and skeleton `scale`, light, debug shape and texture colors, material vector defaults, blackboard vector and rotator keys and actor location, rotation and scale no longer pad, cut or zero an array that is not exactly their numbers and answer success.
34
+ - **Sequence keys**: an `add_keyframe` Transform whose value keys nothing is refused `INVALID_ARGUMENT` naming the value instead of reading as an unsupported property, a value that wraps `property` or `value` is refused, and every refusal shows a key's whole params (the old example put `property` inside `value`).
35
+
36
+ </details>
37
+
38
+ <details>
39
+ <summary><b>⚠️ Migration</b></summary>
40
+
41
+ - **Long text**: a string over 1023 characters, or over a parameter's own `maxLength`, is refused `OUT_OF_RANGE`; send long text only in the parameters that take it (code, scripts, descriptions, comments, subtitles, widget text).
42
+ - **Vector and color arrays**: send exactly the type's numbers (three for a vector, three or four for a color), or the object form.
43
+ - **Sequence keys**: send `property` beside `value` in `add_keyframe`; a Transform whose value keys nothing answers `INVALID_ARGUMENT`, not `UNSUPPORTED_PROPERTY`.
44
+
45
+ </details>
46
+
47
+ <details>
48
+ <summary><b>🔄 Dependencies</b></summary>
49
+
50
+ - **GitHub Actions**: `github/codeql-action` (init, autobuild, analyze) 4.39.0 → 4.39.2. No npm package changed, and the package still has no runtime dependencies.
51
+
52
+ </details>
53
+
54
+ <details>
55
+ <summary><b>📊 Change Statistics</b></summary>
56
+
57
+ | Metric | Count |
58
+ |--------|-------|
59
+ | Diff range | `v0.6.1-beta-a..v0.6.1-beta-b` |
60
+ | Commits | 12, the version bump and the release cut included |
61
+ | Files changed | 80 (65 hand-written, not counting generated files or line-ending-only changes) |
62
+ | Insertions / deletions | 2,035 / 540 (hand-written: 889 / 101) |
63
+ | Capability records | 489 |
64
+ | Callable `{tool, action}` pairs | 1,658 |
65
+ | C++ domain directories | 58 |
66
+
67
+ </details>
68
+
69
+ ---
70
+
16
71
  ## 🏷️ [0.6.1-beta-a] - 2026-11-06
17
72
 
18
73
  > [!NOTE]
@@ -38,28 +93,87 @@ _Nothing yet._
38
93
 
39
94
  </details>
40
95
 
96
+ <details>
97
+ <summary><b>🔄 Changed</b></summary>
98
+
99
+ - **Movie Render Queue, Takes and MetaSound are required plugins**: EngineWire links their modules, so enabling it turns them on (left off in a Blueprint-only project, EngineWire did not load on Windows and the editor crashed at startup on macOS).
100
+ - **Write replies pass on only lint errors**: the warnings (unreachable nodes, heavy Tick work) stay in Validate Assets, saves and `validate_assets`, so a graph built one node at a time is not told its newest node never runs.
101
+ - **No-op and mid-compile edits are refused**: an edit that changes nothing is refused instead of answered done, and so is any edit while a Live Coding compile runs.
102
+ - **Scopes follow what a call writes**: `export_level` needs `write`, and `export_mesh` `outputPath`, `screenshot` `path` and `get_transform` (`sample_motion`) `inputs` raise a call to `write`.
103
+
104
+ </details>
105
+
106
+ <details>
107
+ <summary><b>🛡️ Security</b></summary>
108
+
109
+ - **Native `/mcp` binds to loopback only**, whatever **Allow Non Loopback** says: it has no TLS, so a token would cross the network in clear text. A WebSocket listener on a LAN address needs the capability token and TLS.
110
+ - **The stdio proxy sends its token only to a loopback upstream** unless `UNREAL_MCP_ALLOW_REMOTE_TOKEN=1`, and `doctor` follows the same rule.
111
+ - **A path-restricted token's prefixes hold everywhere**: saves, deletes, reflection reads, searches and listings run as the request's principal, and a file the caller places is written through a handle checked inside the project.
112
+ - **Inputs and consent**: script, search and list inputs are bounded, and a consent grant comes back only when no handler ran.
113
+
114
+ </details>
115
+
41
116
  <details>
42
117
  <summary><b>🔧 Fixed</b></summary>
43
118
 
44
- - **Security**: hardening across the transports (native `/mcp` never binds off loopback; a LAN WebSocket bind needs the token and TLS), the path model (a path-restricted token's prefixes hold in every save, delete, search and listing), scopes and request inputs; a consent grant comes back only when nothing ran; the proxy sends its token only to a loopback upstream.
45
- - **Plugin loading**: Movie Render Queue, Takes and MetaSound are required plugin references (left off in a Blueprint-only project, EngineWire did not load on Windows and the editor crashed at startup on macOS); geometry and skinning actions refuse with `GEOMETRYSCRIPTING_PLUGIN_NOT_ENABLED` while GeometryScripting is off instead of crashing; the game features module compiles on UE 5.6 and 5.7.
119
+ - **Plugin loading**: geometry and skinning actions refuse with `GEOMETRYSCRIPTING_PLUGIN_NOT_ENABLED` while GeometryScripting is off instead of crashing, and the game features module compiles on UE 5.6 and 5.7.
46
120
  - **Crashes**: a glTF or GLB export and a key tapped with no Play session no longer take the editor down.
121
+ - **Input**: simulated game keys stay out of the editor's panels.
47
122
  - **Search**: about 250 more plain requests find their capability, and an alias a family member declared runs that member.
48
- - **Replies**: long lists page and aggregate from the reply's `data`; console replies stay short; a script step still running at the deadline says so; write replies pass on only lint errors; logpoints read an unwired input's own value; the tool says how to get a fresh consent grant.
49
- - **Input**: simulated game keys stay out of the editor, and `sample_motion` inputs need the write scope.
50
- - **Undo**: asset edits are one step each, an edit that changes nothing is refused instead of answered done, enum undo no longer crashes UE 5.7+, and a script's rollback undoes only its own steps.
123
+ - **Replies**: long lists page and aggregate from the reply's `data`; console replies stay short; a script step still running at the deadline says so; logpoints read an unwired input's own value; the tool says how to get a fresh consent grant.
124
+ - **Undo**: asset edits are one step each (notifies, sockets, physics bodies, blackboard keys, Behavior Trees and more), enum undo no longer crashes UE 5.7+, and a script's rollback undoes only its own steps.
51
125
  - **Graph as code**: `%`, `==` on text, calls used as values, ids with underscores, custom event calls, other classes' variables, expose-on-spawn inputs, calls on the Blueprint itself and events bound to a delegate write as `read_graph_as_code` prints them.
52
126
  - **Placement**: props in a room built as one mesh read as they are; a support with no collision is named; `fix_coplanar` checks each move against the others.
53
127
  - **Views**: frame readers warn while shaders, meshes or textures still build; `contact_sheet` draws beside water and titles small sheets in full.
54
128
  - **Geometry**: `bevel` and `chamfer` cut whole parts, and material and PolyGroup edits are their own undo steps.
55
129
  - **Assets**: `check_mesh` finds parts wound inside out, on skeletal meshes too; FBX imports open no Message Log window and convert units with options; material instances draw their parent; morph targets and skin weight profiles survive rebuilds; output files reach captures, exports and thumbnails.
56
- - **Editor state**: edits are refused during a Live Coding compile; `save_all` saves streaming sublevels; dry runs no longer compile or save; Blueprint compiles leave placed skeletal meshes posed; Behavior Trees build from their Root.
130
+ - **Editor state**: `save_all` saves streaming sublevels; dry runs no longer compile or save; Blueprint compiles leave placed skeletal meshes posed; Behavior Trees build from their Root.
57
131
  - **Niagara**: a created emitter keeps the name it was asked for.
58
132
  - **Game framework and materials**: `default_pawn_class` takes `None`, and material pins connect by the short names the material editor shows.
59
133
  - **Sequence sections**: a sound section plays in the editor and the game, and adding one is one undo step.
60
134
 
61
135
  </details>
62
136
 
137
+ <details>
138
+ <summary><b>⚠️ Migration</b></summary>
139
+
140
+ - **A client on another machine**: the native server no longer binds to a LAN address. Tunnel to it (`ssh -L 3000:127.0.0.1:3000 <user>@<editor machine>`) and keep `UNREAL_MCP_URL` at `http://127.0.0.1:3000/mcp`; a stdio proxy pointed at another machine sends no token unless `UNREAL_MCP_ALLOW_REMOTE_TOKEN=1`. A WebSocket listener on a LAN address also needs **Enable Tls**.
141
+ - **Scoped tokens**: a token without `write` no longer runs `export_level`, nor `export_mesh` with `outputPath`, `screenshot` with `path` or `get_transform` with `inputs`.
142
+ - **Projects that turned off Movie Render Queue, Takes or MetaSound**: enabling EngineWire turns them on again.
143
+ - **Lint warnings after a write**: read them with `lint_blueprint` or `validate_assets`; write replies carry only lint errors.
144
+
145
+ </details>
146
+
147
+ <details>
148
+ <summary><b>🔄 Dependencies</b></summary>
149
+
150
+ - None: no npm package and no GitHub Action changed, and the package still has no runtime dependencies.
151
+
152
+ </details>
153
+
154
+ <details>
155
+ <summary><b>👥 Contributors</b></summary>
156
+
157
+ - @SoloGorilla for keeping a created Niagara emitter's requested name (#669), and for reporting the crash when a key was tapped with no play session (#685) and simulated keys reaching editor panels, `sample_motion` inputs included (#686).
158
+ - @claudemlandry for reporting the macOS startup crash on UE 5.7.4 (#705).
159
+
160
+ </details>
161
+
162
+ <details>
163
+ <summary><b>📊 Change Statistics</b></summary>
164
+
165
+ | Metric | Count |
166
+ |--------|-------|
167
+ | Diff range | `v0.6.0..v0.6.1-beta-a` |
168
+ | Commits | 164, the version bump and the release cut included |
169
+ | Files changed | 767 (741 hand-written, not counting generated files or line-ending-only changes) |
170
+ | Insertions / deletions | 43,428 / 5,766 (hand-written: 29,413 / 3,729) |
171
+ | Capability records | 489 |
172
+ | Callable `{tool, action}` pairs | 1,658 |
173
+ | C++ domain directories | 58 |
174
+
175
+ </details>
176
+
63
177
  ---
64
178
 
65
179
  ## 🏷️ [0.6.0] - 2026-10-27
package/README.md CHANGED
@@ -141,7 +141,7 @@ Build the plugin once on a machine with the engine and a compiler, then hand out
141
141
  node scripts/package-plugin.mjs "C:/Program Files/Epic Games/UE_5.7"
142
142
  ```
143
143
 
144
- This writes `build/EngineWire-v<version>-UE5.7-<Platform>.zip`, where `<version>` is the `package.json` version (currently `0.6.1-beta-a`). Unzip it into `YourProject/Plugins/`. Binaries only work with the engine minor and platform they were built for: a 5.6 build won't load in 5.5, 5.7 or 5.8.
144
+ This writes `build/EngineWire-v<version>-UE5.7-<Platform>.zip`, where `<version>` is the `package.json` version (currently `0.6.1-beta-b`). Unzip it into `YourProject/Plugins/`. Binaries only work with the engine minor and platform they were built for: a 5.6 build won't load in 5.5, 5.7 or 5.8.
145
145
 
146
146
  </details>
147
147
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unreal-engine-mcp-server",
3
- "version": "0.6.1-beta-a",
3
+ "version": "0.6.1-beta-b",
4
4
  "mcpName": "io.github.ChiR24/unreal-engine-mcp",
5
5
  "description": "EngineWire: an MCP server and Unreal Editor plugin that let AI assistants build in Unreal Engine 5.0-5.8: levels, Blueprints, UI, materials, effects and more.",
6
6
  "homepage": "https://enginewire.dev",
package/server.json CHANGED
@@ -3,13 +3,13 @@
3
3
  "name": "io.github.ChiR24/unreal-engine-mcp",
4
4
  "description": "EngineWire: drive the Unreal Editor (UE 5.0-5.8): levels, Blueprints, UI, materials, VFX and more.",
5
5
  "websiteUrl": "https://enginewire.dev",
6
- "version": "0.6.1-beta-a",
6
+ "version": "0.6.1-beta-b",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "registryBaseUrl": "https://registry.npmjs.org",
11
11
  "identifier": "unreal-engine-mcp-server",
12
- "version": "0.6.1-beta-a",
12
+ "version": "0.6.1-beta-b",
13
13
  "transport": {
14
14
  "type": "stdio"
15
15
  },