Releases: mrinalghosh/touchdesigner-mcp
Release list
v0.2.1 — Fan docked companion ops
Layout fix for auto-spawned docked companion ops. Creating a GLSL TOP spawns docked companion DATs — <name>_pixel (your fragment shader), <name>_info, <name>_compute — beneath it. TD only carries docked ops along on a UI drag; every placement tool here sets nodeX/nodeY from Python, which moved the host alone and stranded the companions across the network with a long dock-tether line.
Changes
move_operatorandbuild_networkre-fan docked ops after placing a host. A shared_fan_dockedhelper snaps a host's docked companions into a clean row directly beneath it (_pixel/_vertexshader closest, right under the TOP) — the native spawn layout, re-applied.tidy_dockedtool — repair pass for networks already sprawled. Pass a single op, or a COMP withrecursive=trueto sweep nested COMPs. Returns{tidied, companions}.glsl_top_vec4_uniformtemplate no longer leaves an orphan DAT — it writes the starter shader into the auto-spawned_pixelDAT (pixeldat.eval()) instead of a redundant_shaderDAT, then fans.- Docked-op gotcha shipped in
CLAUDE.mdand the MCP serverinstructions.
Verified live against TouchDesigner 2025.32460.
Install
Download touchdesigner-mcp.mcpb below and double-click it in Claude Desktop, then drag td_component/touchdesigner_mcp.tox into /project1 in TouchDesigner. See the README for setup.
Full changelog: https://github.com/mrinalghosh/touchdesigner-mcp/blob/main/CHANGELOG.md
v0.2.0
A context-and-round-trip reduction pass for the TouchDesigner MCP bridge, plus three latent serialization fixes. The bridge itself is frame-locked (~17 ms/call); the real cost was many sequential tool calls and oversized results bloating the model's context. This release attacks both.
Install
1. Server half (Claude Desktop): download touchdesigner-mcp.mcpb below and double-click it to install. Fill in the TD host/port form (defaults: 127.0.0.1:9980, path /mcp).
2. TouchDesigner half: the .mcpb also bundles td_component/touchdesigner_mcp.tox. Drag that component into /project1 (or any persistent COMP) — it ships a pre-wired Web Server DAT with the callbacks attached — and save your .toe. See the README for the manual fallback.
⚠️ The bridge executes arbitrary Python against your live project. Keep the Web Server DAT bound to127.0.0.1and never expose the port to the open internet.
What's new
build_network— batch create/wire/param/layout in a single main-thread exec, collapsing a many-POST network build (e.g. 6 ops + 5 wires + 3 params = 14 round-trips) into one call.- Bridge result size cap — 500 items/level, 100 KB/string, depth 6, with explicit truncation markers, so an accidental
op('/').childrenor dumped DAT table can't land megabytes in the model's context. get_module_helpscalpel modes — newgrep=andmember=params slice a class's help (~70× smaller for one member) instead of dumping ~40 KB.- Efficiency + gotcha doctrine now ships as MCP server
instructions, so it travels to every install in any client (repo-scoped CLAUDE.md/skills can't reach end users).
Fixes
- numpy scalars/arrays serialize as numbers, not
str()—np.int64/np.float32/np.bool_were serializing as an opaque'5'instead of5; now duck-typed viatolist(). - Non-finite floats emit valid Python —
repr(float('inf'))was aNameErrorwhen the generated code ran in TD;_litnow rewritesinf/-inf/nantofloat(...)calls, recursing through containers. - Screenshots exempt from the size cap — the string cap would clip a base64 PNG and break
base64.b64decode; large intentional payloads now pass through uncapped, and truncation markers are ASCII. - Bundled
.toxre-saved — the embedded callbacks now matchwebserver_callbacks.py, so all of the above ship live in the drag-and-drop component with no manual re-paste.
Full log: CHANGELOG.md