Tool Manager
The Tool Manager LOP discovers tools from connected LOPs operators and hosts them as an MCP (Model Context Protocol) server. This bridges TouchDesigner’s tool ecosystem with external AI clients like Claude Code, Cursor, and any MCP-compatible application.
Key Features
Section titled “Key Features”- Automatic tool discovery - Scans a Tool sequence parameter and collects all
GetTool()definitions from connected operators - Individual tool toggles - Enable or disable specific tools without removing operators
- MCP server hosting - Exposes enabled tools via stdio or streamable-HTTP transport
- Preset management - Save and load tool configurations for different workflows
- Config export - Copy MCP client configuration to clipboard for easy setup in external tools
Agent Tool Integration
Section titled “Agent Tool Integration”This operator exposes 0 tools that allow Agent and Gemini Live LOPs to proxy all enabled tools from connected operators to agents via GetTool.
Use the Tool Debugger operator to inspect exact tool definitions, schemas, and parameters.
The Tool Manager’s GetTool() returns all enabled tools from its Tool sequence, acting as a tool aggregator. Connect it to an Agent LOP to give the agent access to all discovered tools at once.
Requirements
Section titled “Requirements”- ChatTD Operator - Required for async server hosting
- Dependencies -
fastmcpandtd_mcp_adapter(install via ‘Install Dependencies’ on the Dependencies page)
Input/Output
Section titled “Input/Output”Inputs
Section titled “Inputs”None - tools are collected from the Tool sequence parameter on the Tools page.
Outputs
Section titled “Outputs”- Tools Table - All discovered tools with name, description, operator path, handler, enabled status, and parameter count
- MCP Tools Output - JSON array of currently enabled tools for the MCP server
- Tool Registry - Detailed handler info for each tool
Usage Examples
Section titled “Usage Examples”Setting Up Tool Discovery
Section titled “Setting Up Tool Discovery”- On the Tools page, add operators to the ‘External Op Tools’ sequence by referencing each LOP’s path.
- Set each entry’s ‘Active’ mode to ‘enabled’ (or ‘forced’ to always include, ‘disabled’ to skip).
- Pulse ‘Refresh Tools’ to scan all connected operators and discover their tools.
- The tools table will populate with all discovered tools.
Enabling and Disabling Tools
Section titled “Enabling and Disabling Tools”- After refreshing tools, toggle parameters appear on the Tool Toggle page - one for each discovered tool.
- Toggle individual tools On or Off as needed.
- Use ‘Enable All Tools’ as a master toggle.
- If the MCP server is running, pulse ‘Restart Server’ on the Config page to apply changes.
Starting the MCP Server
Section titled “Starting the MCP Server”- On the Config page, select ‘Transport’ - use ‘streamable-http’ for network access or ‘stdio’ for local process communication.
- Set ‘Host’ and ‘Port’ as needed (defaults: 0.0.0.0:18765).
- Enter a ‘Server Name’ to identify this instance.
- Pulse ‘Start Server’ to begin hosting.
- The ‘Server URL’ on the Config page shows the running endpoint.
Connecting Claude Code
Section titled “Connecting Claude Code”- Start the MCP server as above.
- Pulse ‘Copy Claude Code Config’ to copy the MCP configuration to your clipboard.
- Paste the configuration into your Claude Code MCP settings file.
- Claude Code can now call any enabled tools in your TouchDesigner project.
Using Presets
Section titled “Using Presets”- Configure your tool toggles for a specific workflow.
- On the Presets page, enter a name in ‘Preset Name’.
- Pulse ‘Save Preset’ to store the current toggle configuration.
- Later, select the preset name and pulse ‘Load Preset’ to restore that configuration.
Best Practices
Section titled “Best Practices”- Use presets to quickly switch between different tool sets for different tasks (e.g., “creative” vs “data” vs “full access”).
- The Tool Manager can also be connected to an Agent LOP via its
GetTool()method, giving LOPs agents access to the same tool set without MCP. - Pulse ‘Refresh Tools’ whenever you add or remove operators from the Tool sequence.
Parameters
Section titled “Parameters”Config
Section titled “Config”op('tool_manager').par.Servername Str Name for this MCP server instance
- Default:
"" (Empty String)
op('tool_manager').par.Host Str - Default:
"" (Empty String)
op('tool_manager').par.Port Int - Default:
0- Range:
- 0 to 1
- Slider Range:
- 0 to 1
op('tool_manager').par.Startserver Pulse - Default:
False
op('tool_manager').par.Stopserver Pulse - Default:
False
op('tool_manager').par.Restartserver Pulse Restart server to apply tool changes
- Default:
False
op('tool_manager').par.Copyconfig Pulse - Default:
False
op('tool_manager').par.Copyclaudecodeconfig Pulse - Default:
False
op('tool_manager').par.Serverurl Str - Default:
"" (Empty String)
op('tool_manager').par.Lastupdate Str Timestamp of last tool discovery
- Default:
"" (Empty String)
op('tool_manager').par.Running Toggle - Default:
False
op('tool_manager').par.Tool Sequence - Default:
0
op('tool_manager').par.Tool0op OP - Default:
"" (Empty String)
op('tool_manager').par.Refreshtools Pulse Scan Tool sequence and rebuild tool registry
- Default:
False
Tool Toggle
Section titled “Tool Toggle”op('tool_manager').par.Enablealltools Toggle Master toggle for all tools
- Default:
False
Presets
Section titled “Presets”op('tool_manager').par.Savepreset Pulse - Default:
False
op('tool_manager').par.Loadpreset Pulse - Default:
False
Dependencies
Section titled “Dependencies”op('tool_manager').par.Installdeps Pulse - Default:
False
op('tool_manager').par.Checkdeps Pulse - Default:
False
Changelog
Section titled “Changelog”v1.0.12025-12-06
## v1.0.1
Added
GetTool()method for agent integration - tool_manager can now be used as a single tool source in agent Tool sequences- Tool toggle state caching - preserves toggle values, mode, and expressions when refreshing tools
- Auto-generated preset names (
preset_1,preset_2, etc.) when saving with empty name
Fixed
- Tool Toggle page now properly clears when tools are removed from sequence
- Fixed parameter destroy method (using
par.destroy()instead of non-existentdestroyCustomPar)
Changed
- Commented out Autorefresh parameter (requires sequence monitoring - not yet implemented)