Repository navigation
Releases
v0.5.0
Security
Every version before 0.5.0 let any program that could reach the add-on's port drive Blender and run
Python as you, and a web page you opened could do it too (some browsers block or ask first). 0.5.0
requires a token on every connection and keeps execute_script off until you click Allow Python.
Upgrade, and remove the old blender_mcp_addon add-on. Details are in
SECURITY.md.
Added
- The add-on installs as a Blender extension. The release ZIP is now
meshwire-addon-<version>.zip,
with ablender_manifest.tomlat its root, and installs from Edit > Preferences > Get Extensions >
dropdown > Install from Disk... on Blender 4.2 and later. CI validates the built ZIP, installs it into a
fresh Blender and runs the handshake andpingagainst it, on 4.5 and 5.2. The manifest declares the
networkandfilespermissions, andbl_infois gone. An older Meshwire add-on still enabled
(installed from a pre-0.5.0 ZIP asblender_mcp_addon) makes the new one show a warning in its sidebar
tab and refuse to start its server, so two servers never run together. Remove the old copy in
Preferences > Add-ons and restart Blender. The Start and Stop operators and the panel were renamed
(meshwire.start_server,meshwire.stop_server,MESHWIRE_PT_server) so they cannot collide with the old
copy's, which would otherwise replace them while both are enabled. A keymap entry or script that calls
bpy.ops.mcp.start_serverorbpy.ops.mcp.stop_servermust call themeshwireoperator instead. - Several Blenders at once. Each running add-on now writes a small file,
instances/<port>.json, in the
Meshwire config folder next to the token, and removes it when its server stops or Blender quits normally. The file names the port,
process, Blender version, add-on version and.blendfile, and holds no token. With no--port, the
server reads these files, tries each port, deletes the files of Blenders it finds are gone (on Windows a file left by a
crash stays until a Blender binds that port again), and connects to
the most recently started live one. It looks again at every connection, and logs the port, Blender version
and file it chose. It moves on to an older Blender only past a program that is not a Meshwire add-on with
your token (connection refused, a reply that is not Meshwire's, or no valid proof). A newest Blender that
is busy, full, closes before answering, or needs updating gives an error naming its port, instance file
and process ID instead of a switch. Pass--portor setMESHWIRE_PORTto pick one. The order is now--port, then the newMESHWIRE_PORTvariable, then discovery, then
9876. Discovery runs only for a loopback--host. The--portdefault is no longer 9876, so a setup that
relied on that exact default still works whenever Blender is on 9876, and finds the right Blender when it is not. - Two Blenders no longer fight over a port. The add-on binds the first free port from 9876 to 9885 when
Preferences says 0, and exactly the port you set otherwise, failing with a message that says why. On
Windows the port is now bound exclusively, so another program cannot share it. CI also runs the token,
instance file and socket tests on Windows and macOS.
Fixed
- Only a client with the token can use the add-on's socket. Until now any program on the machine could
connect to the port and drive Blender, andexecute_scriptran any Python it was sent. This affects
every version before this one (the releases were v0.2.0, v0.3.0, v0.4.0 and v0.5.0a1); seeSECURITY.md.
What testing confirmed: on the last commit before authentication, a rawobject_createsent with no hello
was served and the connection stayed open (unauthenticated_call_refusedfails there, on Blender 4.5.15).
On v0.4.0 in Blender 4.5.15, a rawobject_createand an HTTP POST (as a browserfetchwith
Content-Type: text/plainsends it, with one command line as the body) both created an object, so a web
page could make Blender run a command, and withexecute_script, any Python. v0.5.0a1 has the same socket
code. Some current browsers block or ask before a public page requests a local address, so this depends
on the browser. The host was also a Scene property saved in the.blend, so a shared file could carry a
non-loopback host; it is now an add-on Preference.
The add-on now makes a token in your Meshwire config folder (~/.config/meshwire/tokenon Linux, mode 0600). A connection
must open with ahelloand then ahello_proof, each step within 2 seconds, in lines of at most 4 KiB. The two
sides prove they hold the token with HMAC-SHA256 over fresh nonces, so the token itself never crosses the
socket. The add-on's proof also covers the address it received the connection at, and the server refuses a
connection that reached a different address, so a program relaying the traffic from another port or
address is caught (an SSH tunnel on purpose needsMESHWIRE_ADDON_ADDRESS). Anything else is closed at
once; a wrong proof, or a client that does not speakhello, gets one error that says what to update. Sockets
that have not finished the handshake have their own pool, so idle ones cannot lock out the real client, and
a flood evicts the oldest of them, and a client that is evicted gets a clear error instead of being sent to another Blender. A client that failed its
handshake can make the add-on read at most 64 KiB more from it.SECURITY.mdnow says how to rotate the
token: stop the server in every Blender that runs Meshwire (each keeps the token it started with), delete
the token file, start the servers again, and restart the MCP clients.
The server reads the token file on every connect, so it needs no setup. For another machine, set
MESHWIRE_TOKENthere (it overrides the file) and use Copy token in the Meshwire tab. After the
handshake the traffic is neither encrypted nor integrity-protected, so a non-loopback host sends commands
and results in plaintext; use an SSH tunnel for remote use. A new server
against an older add-on, and the reverse, now say which side to update instead of hanging. exit()in a script no longer ends the session. A script that callsexit(),sys.exit()or raises
SystemExitused to escape the add-on's timer, which could close Blender or leave the server deaf. It now
returns a normal error ("The script called exit() or sys.exit(); Blender keeps running.") with the output so
far, and any other handler that does the same gets an error reply.- Large replies arrive whole, and bad requests get an answer. The add-on used to cut off any reply
bigger than the socket buffer; a 32 MiB reply now arrives complete. A malformed, non-object, non-UTF-8 or
oversized request, and a client past the connection limit, now get an error reply that says what was wrong,
and the add-on then closes that connection. The server reports that reason instead of "Disconnected". execute_scriptnow needs the panel switch. It refuses every call, before running anything, until you
click Allow Python in the Meshwire sidebar tab in Blender. The switch is off every time Blender starts
and stays on only until it closes. No tool, socket message or saved file can turn it on. Anything that
calledexecute_scriptmust be allowed once per Blender session.- Settings moved from the scene to add-on Preferences. Host, port and the new Rodin key, Meshy key and
ComfyUI workflow path are stored per user in Preferences, not inside the.blendfile, so a shared file
no longer carries them. Port 0, the new default, picks the first free port from 9876 to 9885. Starting the
server now reports an error in Blender when it cannot bind, instead of claiming it started. ai_configure_backendtakes only safe keys. It acceptsenabled,api_key,host,timeout,deviceand
model(an Ollama model name), andhostmust be an http or https URL with no user name or password. Any other key, such as
workflow,python_path,model_pathorapi_base_url, is refused with a message that names it and
points to Preferences (Meshwire add-on).- An MCP client can now see that a tool failed. A reply from Blender that carries an error, or reports
success: false, now comes back withisErrorset, so the client treats it as a failure. The JSON text
is unchanged. The server's argument log also no longer holds API keys or whole scripts: values under
keys such asapi_key,token,secretandpasswordare logged as<redacted>, and any string over
200 characters is logged as its length. - The socket lane runs nightly on 4.2, 4.3, 4.4, 5.0 and 5.1. Before, the viewport and sculpt tools
that the background driver cannot reach were checked on 4.5 and 5.2 only. The nightly job now runs the
lane after the driver as a best-effort step, andsocket-lane.jsonholds a baseline for all seven
series. The README says which series run the lane, and lists each failing socket check with the series it
fails on. All of this is generated byscripts/tool_status.py. sculpt_mesh_filterwithERASE_DISPLACEMENTworks on Blender 4.2. 4.2 spells that filter type
ERASE_DISCPLACEMENTinsculpt.mesh_filter, so the call failed with an enum error there. The add-on
now reads the operator's enum items and uses whichever spelling the running Blender offers.- The
annotation_addnote names the right series. The harness reason and the README table said
Blender 4.3 to 4.5 has no Python call for annotation strokes. The baselines show 4.3, 4.4, 4.5, 5.0 and
5.1 return that message, and only 4.2 and 5.2 draw the stroke, so the text now says 4.3 to 5.1. - The truth harness no longer lets an allowed failure hide a new one. Each row in
SOFT_FAIL_ALLOWEDandKNOWN_UNREACHEDnow c...
v0.5.0a1
What's Changed
- docs: README and brand pass by @RFingAdam in #43
- docs: install mcp-blender and TripoSR from GitHub by @RFingAdam in #44
- ci: run on GitHub-hosted runners again by @RFingAdam in #45
- docs: make the README match what the code does by @RFingAdam in #46
- test: add a truth harness that runs every tool on real Blender by @RFingAdam in #47
- Rename the project to Meshwire and add a logo by @RFingAdam in #49
- Prepare the first PyPI release, 0.5.0a1 by @RFingAdam in #50
Full Changelog: https://github.com/RFingAdam/meshwire/commits/v0.5.0a1
v0.4.0 — Relicense to AGPL-3.0-or-later
License: MIT → AGPL-3.0-or-later. Aligns with eng-mcp-suite toolkit-wide AGPL move. Blender itself (GPL-3.0+) is invoked at runtime, not redistributed.
v0.3.0 - 218 Tools, Live-Tested on Blender 4.2
The Most Comprehensive Blender MCP Server
218 tools across 23 categories, fully MIT-licensed, live-tested on Blender 4.2.19 LTS.
New in v0.3.0 (63 new tools)
- Materials & Shaders (7): Node graph introspection, 23 procedural presets
- Measurement & Validation (7): Surface area, volume, clearance, dimensions, mesh quality
- Baking (6): Batch PBR bake, high-to-low poly, curvature maps, ID maps
- Geometry Nodes (7): First-ever GN via MCP - scatter, arrays, inspect
- Sculpting (8): Pipeline-focused mesh filters, sculpt-to-retopo
- Rigging & Armature (8): Auto-rig presets, constraints, MSFS validation
- Physics (6): Rigid body, cloth with 7 presets, fluid
- Annotations (6): 3D annotations, dimension lines, grease pencil
- Collections & System (8): Collection CRUD, undo/redo, save
Quality
- 84 unit tests, 0 lint errors
- Live-tested on Blender 4.2.19 LTS
- 9 bugs found and fixed during testing
- GitHub issue/PR templates added
v0.2.0
What's New
AI Self-Refinement Loop (7 new tools)
Iterative render-analyze-fix pipeline using vision AI for quality convergence:
execute_script— Run arbitrary Python/bmesh code in Blenderrender_multi_angle— Render from front, right, top, perspectiveanalyze_viewport— Analyze renders with Ollama vision modelrefine_iteration— Render + analyze + convergence checkrefine_create_session/refine_get_session/refine_list_sessions— Session management
New Backends & Modules
- Stable Fast 3D backend for local image-to-3D generation
- Refinement session state management module (
refinement.py) - Ollama Vision
analyze_for_refinement()method for structured model feedback - TripoSR subprocess execution — runs via system Python for PyTorch/CUDA support
Multi-Backend AI 3D Generation System
- Backend Management: list_backends, set_backend, get_backend_info, configure_backend
- Generation: generate_variations, cancel_generation, redo_generation
- Mesh Processing: mesh_cleanup, mesh_decimate, mesh_remesh, mesh_optimize, auto_uv, fix_mesh_issues, mesh_stats
- Queue Management: queue_list, queue_clear, get_history
- Cloud backends: Hyper3D Rodin, Meshy.ai, Tripo AI
- Local backends: TripoSR, Hunyuan3D 2.1, Stable Fast 3D, Ollama Vision, ComfyUI
MSFS 2020/2024 Content Creation (20 tools)
LOD hierarchy, MSFS materials, collision meshes, animation tags, and glTF export with MSFS properties.
MSFS Aircraft Livery Tools (18 tools)
Texture painting, aircraft templates (FBW A32NX, Fenix, PMDG, iniBuilds, etc.), AI-assisted livery transfer, and MSFS package creation.
Changed
- Total tool count: 86 → 93
- TripoSR backend rewritten to use subprocess (avoids Blender Python limitations with PyTorch/CUDA)
- Simplified
compat.py— removed redundant BSDF input branching get_event_loop()→get_running_loop()deprecation fix- Removed unused imports across multiple modules
Full Changelog: v0.1.0...v0.2.0