Skip to content

v0.2.0

Choose a tag to compare

@mrinalghosh mrinalghosh released this 20 Jul 01:08
· 2 commits to main since this release
6eac223

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 to 127.0.0.1 and 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('/').children or dumped DAT table can't land megabytes in the model's context.
  • get_module_help scalpel modes — new grep= and member= 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 of 5; now duck-typed via tolist().
  • Non-finite floats emit valid Pythonrepr(float('inf')) was a NameError when the generated code ran in TD; _lit now rewrites inf/-inf/nan to float(...) 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 .tox re-saved — the embedded callbacks now match webserver_callbacks.py, so all of the above ship live in the drag-and-drop component with no manual re-paste.

Full log: CHANGELOG.md