TouchDesigner MCP
Built-in MCP server inside TouchDesigner. Connects AI agents (Claude Code, Cursor, Codex) to your live TD session over HTTP — they create operators, wire networks, read errors, run Python, capture screenshots, and reason about your patch through natural language.
What you can do
Things your agent can act on directly:
"Check errors inside *this comp" "Why is this slow? List the top slow ops with cook times" "Audit *this op and the surrounding chain — don't change anything yet" "Refactor *this network: same result, fewer ops, no broken refs" "Rebuild [.html / .pen] ui example into TD native panels, exactly and responsive to par.w/h" "Find <name> in my twozero Cloud and place it into *this network" The agent traverses your project, executes changes live in the editor, and returns structured results — all while you watch. It can also reach your Cloud — list repos and files, download a component and place it in the current network — without you leaving the chat.
Setup

Connect your agent in one click. The connection wizard opens right after installation, and any time from Settings → Reconnect agents. It lists Claude Code (in the terminal or in the Code section of the Claude desktop app), Cursor and Codex, and writes the twozero_td entry into the config of the ones you pick:
- CONNECT next to an agent — twozero merges the entry into that agent's own config file (
~/.claude.json,~/.cursor/mcp.json,~/.codex/config.toml). Nothing else in the file is touched. Already-connected agents show CONNECTED, and DISCONNECT removes the entry again. - Reload the client so it reads the new entry: start a new Claude Code session (or run
/mcp), reload Cursor, restartcodex. - The wizard waits until the agent actually connects, then shows a starter prompt you can copy.
What we recommend: Claude Code — either in the terminal, or the Code section inside Claude Desktop. Both talk to twozero directly, with nothing else to install.
The Chat section of the Claude desktop app is not something the wizard sets up: it reaches local servers only through npx mcp-remote and Node.js. Use the Code section instead.
Auto-start on TD launch — Settings → MCP → Auto start → Yes. The server boots on the next TD launch using the port from Settings → MCP → Port (default 40404).
Manual config, if you prefer to do it yourself — add one server named twozero_td pointing at http://localhost:40404/mcp, or just ask your agent:
Add twozero TD MCP for me with server key "twozero_td" and URL "http://localhost:40404/mcp". Configure it globally (user scope). After that the agent picks up TD automatically from any project / workspace. Configure only one MCP URL — twozero handles additional TD instances internally; do not add separate client entries per instance.
Starting a chat
The twozero MCP server has to be running before you open the chat. It comes up together with TouchDesigner — Settings → MCP → Auto start is on by default — and the MCP status in the twozero window reads connected once the server is up and reachable.
Only then open the chat. An agent connects to twozero once, at the moment the chat starts, and does not retry — a chat that was already open when the server came up stays without the twozero tools for good, no matter how many times you reconnect from inside it. Server first, then a new chat.
Open every new agent chat with a priming prompt so the agent immediately uses MCP and confirms it can see your current TD context (project, network, selected ops):
Show me what you can see in my TD project. check in TD: <your task here> *here in TD: <your task here> Check *this op in TD: <your task here> Once the agent confirms context, drop the ritual and just talk normally.
Pointers — *here and *this
Two phrases that resolve to your current viewport / selection:
The asterisk is the magic: it never appears in normal code or text, so the agent treats these as unambiguous pointers and the response is rock-solid. Plain "here" / "this op" works too, but the asterisk version is bulletproof — use it when precision matters.
Handing the agent exact operators
Pointers cover "the thing I'm looking at right now". When you need to name specific operators instead — several at once, or ones sitting in another network — select them in the network editor and press Ctrl/Cmd+C. twozero puts their full paths on the clipboard, comma-separated, after a [td <project>.toe] tag that tells the agent which open TouchDesigner they came from. Paste them into the chat and write the task around them:
[td myProject.toe] /project1/base1/noise1, /project1/base1/blur1 make these two audio-reactive The copy includes the operator under the white outline, not only the highlighted ones, and it works even with the twozero window closed — the only requirement is that a network editor pane is in focus. On by default: Settings → Copy paths to clipboard.
Built-in triggers
Phrases the agent recognises as named flows:
twozero is required so generic "report a bug" doesn't trigger it accidentally.Working safely
Two workflow phrases that keep the agent from breaking your patch:
Plan first, then change: diagnose, propose, wait for my approval. After fixes: re-run error and performance checks to verify. Combine with the asterisk pointers — *this to scope the work, *here to keep the agent inside the network you're looking at.
Russian and TD slang
Mix English and Russian freely — the agent normalises TD terms across languages:
How it works
Agent → MCP request → twozero server (inside TD) → executes in your live project → result back to agent. Your patch is read and changed on your machine. What leaves it: whatever your agent's LLM provider sees in the conversation, and anonymous plugin usage statistics (no account, no email, no IP address).
When several TD instances are open at once, all of them register with the one twozero server on your port (40404 by default). The agent lists them and asks which one to act on. There is nothing to configure per instance.
Troubleshooting
twozero_td tools are there. Going back to the old chat will not help, and the setup screen showing the connection as done only means your config file is right, not that a live connection exists.curl http://localhost:40404/ (use your own port if you changed it in Settings). JSON back means the server is running; its instances list should not be empty, which means your TouchDesigner is attached. *Connection refused* means it never started: confirm twozero is running in TD and that nothing else holds the port. In Claude Code you can also do /mcp → twozero_td → reinitialize.Notes
- twozero must be running in TouchDesigner for the MCP server to be reachable.
- The MCP server accepts connections from this machine only. Connecting an agent over the network is not supported.
- Use the strongest model your agent offers (e.g. Claude Opus) — smaller models hallucinate operator parameters more often.
- Source & issues: github.com/twozero-team/twozero-td-mcp