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