Embody
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_td_statusA | Check if TouchDesigner is running and Envoy is reachable. Returns connection state, crash detection, process liveness, and project config. Works even when TD is down. envoy_unresponsive / main_thread_stalled flag a TouchDesigner that is alive but frozen. |
| launch_tdA | Launch TouchDesigner with this session's pinned instance's .toe (unpinned: the registry default's). Use to start TD for the first time or restart after a crash. Waits for Envoy to become reachable before returning. |
| restart_tdA | Quit this session's pinned TouchDesigner gracefully and relaunch its .toe (unpinned: the registry default's). Other TD instances are never touched. Waits for the process to exit before relaunching. Use when TD is running but needs a fresh start. |
| switch_instanceA | Switch THIS session's TouchDesigner instance or list all registered instances. Omit the instance parameter to list available instances with their status. Provide an instance name (toe basename) to re-pin this session's bridge to that instance -- other sessions' routing is untouched unless all_sessions=true. |
| list_dialogsA | List the modal dialogs a TouchDesigner instance currently shows (ui.messageBox, missing-file and save-changes prompts, the license box, file pickers). Runs on the bridge, so it works while TD's main thread is blocked by the dialog and every Envoy tool is timing out. TD draws its own dialogs, so their text is not readable through the OS: pass screenshot=true to save a PNG of each one and Read it. Returns blocked=true when a dialog is up. |
| dismiss_dialogA | Dismiss a modal dialog that is blocking a TouchDesigner instance, then verify it is gone. Default action=auto runs the ladder close (WM_CLOSE) -> escape -> enter until the window disappears; the main TouchDesigner window is never a target. Use list_dialogs (with screenshot=true) first so you know what you are dismissing: close/escape decline a question, enter accepts its default. |
| get_convoy_statusA | Report this machine's Convoy host presence and, when it is running, its realm, peer, queue, and identity status. This is a host-only read and never wakes TouchDesigner. Explicit convoy_* tools use this host for remote routing; ordinary Envoy tools remain local until convoy_select_node explicitly pins this session to a Convoy node. |
| convoy_select_nodeA | Pin this MCP session's ordinary Envoy tool calls to one exact Convoy node. The selection survives peer dropouts and never falls back to local TouchDesigner. Call with no arguments to inspect the selection, or clear=true to restore direct local routing. |
| convoy_owletteB | Use Convoy's optional, host-private consumer of Owlette's published API for site/machine inventory, online detail, and command status. Command submission requires a separate local host opt-in and an idempotency key. Owlette is not the Convoy LAN transport and mcp_tool_call is always refused here. |
| convoy_list_nodesA | List the local and reachable remote Embody nodes known to this machine's Convoy host. Returns stable host/node/runtime identities, connection state, address, and version metadata. Local nodes carry a capabilities field (td_python, full_shell); remote nodes deliberately do not -- absent means unknown, never allowed. |
| convoy_update_embodyA | Self-update Embody on Convoy nodes to the latest GitHub release -- one node or the whole fleet -- without the TD Python grant. Dispatches the bounded update_embody operation (sha256-pinned manifest, downgrade-refusing) as a durable job per node and returns the handles; poll convoy_get_job. Nodes must run Embody >= 6.0.257 to serve the operation. |
| convoy_list_controllersA | List live controller sessions, selected targets, leases, and active work across reachable Convoy hosts. Read-only and never wakes TouchDesigner. |
| convoy_pingB | Measure Convoy reachability to one explicit node through the host-native ping operation. It reports the node's known online state without starting or waking TouchDesigner. |
| convoy_start_nodeB | Start one exact, previously registered offline TouchDesigner node from its host-pinned launch profile. No executable, path, argv, or environment is accepted from the caller. |
| convoy_restart_nodeB | Restart one exact running TouchDesigner node. The default require_clean policy refuses dirty, unsaved, or unverifiable state; save_then_restart explicitly saves first. Destructive restart policies are not exposed by this build. |
| convoy_callC | Relay one Envoy operation to an explicit Embody node. The target is always identified by host_id and node_id; Convoy never silently falls back to a local TouchDesigner instance. |
| convoy_batchA | Run one ordered Envoy batch on each explicit Convoy target. Targets execute independently and may run concurrently; the result preserves input order and reports partial success. This does not promise distributed atomicity or rollback. |
| convoy_get_jobB | Read a previously relayed Convoy delivery from its owning peer. Use the target_host_id, convoy_id, and delivery_id returned by convoy_call. |
| convoy_ack_jobA | Acknowledge that this controller has safely observed one terminal Convoy delivery. This idempotent call lets the target release protected result artifacts and eventually reap the job. Verified artifact downloads and successful artifact saves acknowledge automatically; use this tool for other terminal results or to retry an indeterminate acknowledgement. |
| convoy_get_artifactA | Materialize one private Convoy artifact from its owning host onto this client machine. Images are returned as MCP image content; other files are verified and returned as a local temporary path. Use the artifact reference returned by a Convoy job rather than copying a remote filesystem path. |
| convoy_save_artifactB | Verify one Convoy artifact and explicitly save it in this bridge project's .embody/convoy/artifacts directory. The project is derived from this Envoy bridge's own configuration; remote paths and caller-selected project roots are never used. Existing files are preserved unless overwrite is true. |
| convoy_send_fileA | Send one file from this bridge's project to a Convoy node. The source must resolve inside this project. By default it lands in the target project's .embody/convoy/inbox/; with worktree= at dest inside the target's sibling -wt- worktree (create one with convoy_call convoy_git worktree_add); with live=true at dest inside the live project, which needs Allow Execute TD Python on the target because a synced .py reloads into TouchDesigner. dest defaults to the file name for the inbox and to the file's own project-relative path otherwise. Existing files are kept unless overwrite is true. |
| convoy_cancel_jobA | Request cancellation from the exact host that owns a durable delivery. Queued work cancels definitively; an active host subprocess receives best-effort process-tree cancellation. TouchDesigner work already past its host boundary is reported as non-cancellable, never simulated. Cancellation never wakes TouchDesigner. |
| convoy_forget_nodeA | Delete a stale node row (the row a renamed, moved, or deleted project left behind). Without host_id it acts on THIS machine's Convoy host app; with host_id (the owning host from convoy_list_nodes) the request is relayed to that host over its live session and its rules decide. Refuses while the node still has a delivery that has not FINISHED, and names the blocking delivery ids so they can be cancelled; a finished result never holds a row, because results are fetched by delivery id and outlive it; an online row is never forgotten. Rows unseen for a week are evicted automatically; this is the immediate manual path. The Convoy page's Forget Offline Nodes... button is the in-TD bulk equivalent, fleet-wide, with an enumerating confirmation. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 24 tools
Tools have largely distinct purposes: local TD lifecycle (get_td_status, launch_td, restart_td) versus Convoy remote orchestration (convoy_list_nodes, convoy_call, convoy_get_job) versus dialog handling. Minor potential confusion exists between switch_instance and convoy_select_node (both change routing) and between get_convoy_status and convoy_list_nodes, but descriptions differentiate them.
All names use snake_case, with a clear convoy_ prefix for most remote Convoy tools and no prefix for local bridge tools. Exceptions like get_convoy_status (Convoy-related but unprefixed) and convoy_owlette (noun rather than verb_noun) are minor deviations; overall the pattern is readable and consistent.
24 tools is on the heavy side for a single MCP server. While the domain (distributed TouchDesigner orchestration) justifies many operations, some niche tools such as convoy_owlette, convoy_forget_node, and convoy_ack_job could potentially be consolidated or exposed as options, placing it in the borderline 16-25 range.
Covers local TD launch/status/restart, dialog management, and extensive Convoy node/job/artifact lifecycle (list, start, restart, forget, update, call, batch, cancel, ack, get/save artifact, send file). Missing a direct local quit without relaunch and a way to discover available Envoy operations for convoy_call, but core workflows are present.