Skip to content

Releases

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 07 Nov 03:20
fc53b84

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 a blender_manifest.toml at 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 and ping against it, on 4.5 and 5.2. The manifest declares the
    network and files permissions, and bl_info is gone. An older Meshwire add-on still enabled
    (installed from a pre-0.5.0 ZIP as blender_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_server or bpy.ops.mcp.stop_server must call the meshwire operator 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 .blend file, 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 --port or set MESHWIRE_PORT to pick one. The order is now --port, then the new MESHWIRE_PORT variable, then discovery, then
    9876. Discovery runs only for a loopback --host. The --port default 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, and execute_script ran 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); see SECURITY.md.
    What testing confirmed: on the last commit before authentication, a raw object_create sent with no hello
    was served and the connection stayed open (unauthenticated_call_refused fails there, on Blender 4.5.15).
    On v0.4.0 in Blender 4.5.15, a raw object_create and an HTTP POST (as a browser fetch with
    Content-Type: text/plain sends it, with one command line as the body) both created an object, so a web
    page could make Blender run a command, and with execute_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/token on Linux, mode 0600). A connection
    must open with a hello and then a hello_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 needs MESHWIRE_ADDON_ADDRESS). Anything else is closed at
    once; a wrong proof, or a client that does not speak hello, 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.md now 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_TOKEN there (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 calls exit(), sys.exit() or raises
    SystemExit used 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_script now 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
    called execute_script must 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 .blend file, 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_backend takes only safe keys. It accepts enabled, api_key, host, timeout, device and
    model (an Ollama model name), and host must be an http or https URL with no user name or password. Any other key, such as
    workflow, python_path, model_path or api_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 with isError set, 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 as api_key, token, secret and password are 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, and socket-lane.json holds 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 by scripts/tool_status.py.
  • sculpt_mesh_filter with ERASE_DISPLACEMENT works on Blender 4.2. 4.2 spells that filter type
    ERASE_DISCPLACEMENT in sculpt.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_add note 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_ALLOWED and KNOWN_UNREACHED now c...
Read more

v0.5.0a1

v0.5.0a1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 01 Nov 16:05
913c92a

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

Choose a tag to compare

@RFingAdam RFingAdam released this 13 May 14:37

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

Choose a tag to compare

@RFingAdam RFingAdam released this 25 Mar 18:21

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

Choose a tag to compare

@RFingAdam RFingAdam released this 06 Feb 04:33

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 Blender
  • render_multi_angle — Render from front, right, top, perspective
  • analyze_viewport — Analyze renders with Ollama vision model
  • refine_iteration — Render + analyze + convergence check
  • refine_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