create_opLABSCO SUMMARY
Shaped around one host app, down to the token budget.
Most MCP servers for a desktop app stop at "call the API". This one is built for a program that has no API, so the interesting part is what the tools refuse to do: CHOP and POP reads return statistics rather than raw arrays, table reads have a stats mode, capture_top writes the image to a temp file instead of inlining base64, and read_tdn exists so an agent can hold a whole network without a per-operator walk. The cost side is honest and short — you need TouchDesigner 2025.33070 on the machine, the component has to live in your .toe, and everything happens on loopback, so there is nothing to sign up for and nothing to expose. If you do not run TouchDesigner, none of it applies to you.
What it is
Embody is a TouchDesigner component you drag into a project. Inside it sits Envoy, an embedded MCP server that exposes the live TD session over HTTP on 127.0.0.1 — operators, parameters, connections, cook state and pixel output, not a saved snapshot. TouchDesigner has no external API of its own, so the server runs as a COMP extension in the .toe and starts and stops with your project. It also brings TDN, a YAML form of a network that Embody writes to disk, which is what lets an agent read a whole network as text and lets you diff one attempt against another.
What you get
- Authoring the network:
create_op,copy_op,rename_op,delete_op,connect_ops,disconnect_op,set_parameter,layout_children,set_op_position,create_extension, andbatch_operationsto send an ordered set of those in one round-trip - Reading it back:
query_network,find_children,get_op,get_parameter,get_connections,get_network_layout,get_op_flags - Network as text:
read_tdnreturns the live network in memory (the docs put it at 20-90× fewer tokens than walking the same subtree withget_op),export_networkwrites a.tdnfile,import_networkrebuilds from one,diff_tdnshows what is live but not yet on disk - Reads that reduce instead of dump:
get_chop_datagives per-channel min/max/mean,get_pop_datagives attribute metadata with value readback opt-in,get_dat_contenthas astatsformat for large tables,edit_dat_contentsends only the changed substring - Seeing the output:
capture_topsaves a TOP's frame to a temp file and returns a quality verdict (is_black/is_flat/fully_transparent/pass) so an empty render is caught without opening the image - Diagnosis:
get_op_errorscovers cook errors, Python tracebacks and GLSL compile failures;get_op_performanceandget_project_performanceread cook times, dropped frames and hotspots;get_logs,get_td_info,get_docs,get_guidance,get_focus - Running code and jobs:
execute_pythonin TD's main thread,exec_op_method,run_tests,save_project,update_embody, polled throughget_job_status - Externalization:
externalize_op,save_externalization,get_externalizations,get_externalization_status,remove_externalization_tag - Working alongside other agent sessions:
get_sessions,claim_scope,release_scope,announce_task,update_task,preflight_landing - Bridge tools that answer while TouchDesigner is closed:
get_td_status,launch_td,restart_td,switch_instance - Convoy, for Embody nodes on a trusted LAN:
convoy_list_nodes,convoy_ping,convoy_select_node,convoy_call,convoy_batch,convoy_get_job,convoy_restart_node,convoy_update_embodyand the rest of theconvoy_*set - MCP prompts ship alongside the tools:
search_op,check_op_errors,connect_ops,create_extension_guide
Requirements
TouchDesigner 2025.33070 or later, on Windows or macOS. There is no account and no API key: the server binds 127.0.0.1 only and is not reachable from the network, and the bridge that connects your client runs locally too. Install by dropping the Embody .tox into your project; a setup wizard opens, and turning the assistant on installs the Python MCP dependencies (~30 MB via uv) into a per-project .venv built against TouchDesigner's own interpreter. Envoy then serves on 127.0.0.1:9870 — the Envoy Port parameter moves it, and a second TD instance in the same repo claims the next free port through 9879. It writes .mcp.json plus an AGENTS.md at the root set by the AI Project Root parameter, and client-specific config for whichever assistant you name in AI Client (Claude Code, Codex, OpenCode, Gemini CLI, Cursor, Windsurf, GitHub Copilot via VS Code). Claude Code prompts per tool call unless you let the wizard write the mcp__envoy wildcard into .claude/settings.local.json. Known limits: the TD timeline has to be running or Embody raises an error; clone and replicant operators, and Engine, time and annotate COMPs, cannot be externalized; anything longer than the 30-second operation timeout has to run as a background job.
Setup effort
Follow the published steps
USE CASES
Building a chain from a description
Say what you want and the operators get created, positioned and wired in the network you are looking at, without you typing operator names or dragging boxes.
Finding out why an operator is red
One call covers all three surfaces TouchDesigner reports red — cook errors, Python tracebacks from callbacks and DAT scripts, and GLSL compile failures — so the agent reads the same thing you see on screen.
Confirming a render is actually rendering
Capture the TOP's current frame to a file the agent can open, with a pass/fail verdict computed from the raw pixels so a black or fully transparent frame is caught even when nobody looks at the image.
Handing an agent a large network without burning the context window
Read the live network as TDN instead of walking it operator by operator, then check what is live but not yet written to disk — the view git cannot give you.
Inspecting signal data without dumping it
Get per-channel range and statistics for a CHOP, attribute metadata for a POP, and column summaries for a big table, instead of pulling thousands of raw values into the conversation.
Restarting TouchDesigner without leaving the session
The bridge answers while TouchDesigner is closed, so the agent can check whether it is up, launch the project, or relaunch after a crash and pick the connection back up.
86 tools
Listed in project docs. Your client may show a different list.
create_extensiondelete_opcopy_oprename_opget_opquery_networkfind_childrencook_opset_parameterget_parameterget_dat_contentset_dat_contentedit_dat_contentget_chop_dataget_pop_dataget_op_flagsset_op_flagsget_op_positionget_network_layoutset_op_positionlayout_childrencreate_annotationget_annotationsset_annotationget_enclosed_opsconnect_opsdisconnect_opget_connectionsget_op_performanceget_project_performanceexecute_pythonget_td_infoget_op_errorsexec_op_methodget_td_classesget_td_class_detailsget_module_helpget_docsget_guidanceget_focusget_job_statussave_projectexternalize_opremove_externalization_tagget_externalizationssave_externalizationget_externalization_statusread_tdnexport_networkimport_networkdiff_tdncapture_topget_sessionsclaim_scoperelease_scopepreflight_landingget_logsrun_testsbatch_operationsget_td_statuslaunch_tdrestart_tdswitch_instanceconvoy_ack_jobconvoy_batchconvoy_callconvoy_cancel_jobconvoy_forget_nodeconvoy_get_artifactconvoy_get_jobconvoy_lifecycle_quitconvoy_lifecycle_stateconvoy_list_controllersconvoy_list_nodesconvoy_owletteconvoy_pingconvoy_restart_nodeconvoy_save_artifactconvoy_select_nodeconvoy_start_nodeconvoy_update_embodyannounce_taskupdate_taskupdate_embodyget_convoy_statusBEFORE YOU INSTALL
What to know first
Tools you get
86 tools named in the project's documentation.
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
Server setup
Prerequisites: TouchDesigner 2025.33070 or later (Windows/macOS) and an MCP-compatible AI client (Claude Code, OpenCode, Codex, Gemini CLI, Cursor, Windsurf, or Copilot via VS Code). No Python setup needed.
Install Embody, option A: grab the latest Embody .tox from GitHub Releases and drag it into the network of your open project
Install Embody, option B: open a Textport (Dialogs -> Textport and DATs, or Alt+T) and paste the one-line Python installer from the quickstart — it downloads the latest release, verifies its sha256 against the release manifest, and loads the .tox into the current network
The Setup Wizard opens automatically and walks through autonomy level, what to externalize, whether to enable Envoy and for which AI client, permissions, Convoy membership, and config-file location. Nothing changes until the final 'Set up Embody' click
That confirmation installs the MCP server's Python dependencies (~30 MB, in a background thread so TD stays responsive), starts the local server on 127.0.0.1:9870, and writes the AI config into your project root (.mcp.json, AGENTS.md, plus client-specific files such as CLAUDE.md + .claude/)
Open your AI assistant at that project root (or restart the IDE) — it picks up .mcp.json automatically
Manual alternative to the wizard: toggle the Envoy Enable (Envoyenable) parameter, or hand-write .mcp.json using either the STDIO bridge block (recommended, works before TD is running) or the HTTP block (simpler, requires TD running)
MCP Clients
Any MCP client
{
"mcpServers": {
"envoy": {
"type": "stdio",
"command": "python3",
"args": [
"-u",
".embody/envoy-bridge.py",
"--port",
"9870",
"--config",
".embody/envoy.json"
]
}
}
}