Touchdesigner Mcp
Управляйте запущенным экземпляром TouchDesigner через twozero MCP — создавайте операторы, задавайте параметры, соединяйте узлы, выполняйте Python, стройте визуализации в реальном времени. 36 встроенных инструментов.
Метаданные навыка
| Источник | Встроенный (устанавливается по умолчанию) |
| Путь | skills/creative/touchdesigner-mcp |
| Версия | 1.1.0 |
| Автор | kshitijk4poor |
| Лицензия | MIT |
| Платформы | linux, macos, windows |
| Теги | TouchDesigner, MCP, twozero, creative-coding, real-time-visuals, generative-art, audio-reactive, VJ, installation, GLSL |
| Связанные навыки | native-mcp, ascii-video, manim-video, vibeos-video |
Справочник: полный SKILL.md
Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Агент видит эти инструкции, когда навык активен.
Интеграция TouchDesigner (twozero MCP)
КРИТИЧЕСКИ ВАЖНЫЕ ПРАВИЛА
- НИКОГДА не угадывайте имена параметров. Сначала вызовите
td_get_par_infoдля типа оператора. Ваши обучающие данные неверны для TD 2025.32. - Если возникает
tdAttributeError, ОСТАНОВИТЕСЬ. Вызовитеtd_get_operator_infoдля проблемного узла, прежде чем продолжать. - НИКОГДА не прописывайте жёстко абсолютные пути в скриптовых колбэках. Используйте
me.parent()/scriptOp.parent(). - Отдавайте предпочтение встроенным инструментам MCP перед
td_execute_python. Используйтеtd_create_operator,td_set_operator_pars,td_get_errorsи т.д. Прибегайте кtd_execute_pythonтолько для сложной многошаговой логики. - Перед построением вызывайте
td_get_hints. Он возвращает шаблоны, специфичные для типа оператора, с которым вы работаете.
Архитектура
VibeOS -> MCP (Streamable HTTP) -> twozero.tox (порт 40404) -> TD Python
36 встроенных инструментов. Бесплатный плагин (без оплаты/лицензии — подтверждено апрель 2026).
Контекстно-зависим (знает выбранный OP, текущую сеть).
Проверка работоспособности хаба: GET http://localhost:40404/mcp возвращает JSON с PID экземпляра, именем проекта, версией TD.
Настройка (автоматизированная)
Запустите скрипт настройки, который сделает всё необходимое:
bash "${VIBEOS_HOME:-$HOME/.vibeos}/skills/creative/touchdesigner-mcp/scripts/setup.sh"
Скрипт выполнит следующее:
- Проверит, запущен ли TD
- Загрузит twozero.tox, если его ещё нет в кэше
- Добавит MCP-сервер
twozero_tdв конфигурацию VibeOS (если отсутствует) - Протестирует MCP-соединение на порту 40404
- Сообщит, какие ручные действия остались (перетащить .tox в TD, включить MCP)
Ручные действия (однократные, не поддаются автоматизации)
- Перетащите
~/Downloads/twozero.toxв редактор сети TD → нажмите Install - Включите MCP: нажмите на иконку twozero → Settings → mcp → «auto start MCP» → Yes
- Перезапустите сессию VibeOS, чтобы новый MCP-сервер был обнаружен
После настройки проверьте:
nc -z 127.0.0.1 40404 && echo "twozero MCP: READY"
Примечания по окружению
- Non-Commercial TD ограничивает разрешение до 1280×1280. Используйте
outputresolution = 'custom'и явно задавайте ширину/высоту. - Кодеки:
prores(предпочтительно на macOS) илиmjpaкак запасной вариант. H.264/H.265/AV1 требуют коммерческой лицензии. - Всегда вызывайте
td_get_par_infoперед установкой параметров — имена различаются в зависимости от версии TD (см. КРИТИЧЕСКИ ВАЖНЫЕ ПРАВИЛА #1).
Рабочий процесс
Шаг 0: Разведка (перед любым построением)
Вызовите td_get_par_info с op_type для каждого типа, который планируете использовать.
Вызовите td_get_hints с темой, которую вы строите (например, «glsl», «audio reactive», «feedback»).
Вызовите td_get_focus, чтобы узнать, где находится пользователь и что выбрано.
Вызовите td_get_network, чтобы увидеть, что уже существует.
Никаких временных узлов, никакой очистки. Это полностью заменяет старую процедуру разведки.
Шаг 1: Очистка + Построение
ВАЖНО: Разделите очистку и создание на ОТДЕЛЬНЫЕ вызовы MCP. Уничтожение и повторное создание узлов с одинаковыми именами в одном скрипте td_execute_python приводит к ошибкам «Invalid OP object». См. подводные камни #11b.
Используйте td_create_operator для каждого узла (автоматически позиционирует во вьюпорте):
td_create_operator(type="noiseTOP", parent="/project1", name="bg", parameters={"resolutionw": 1280, "resolutionh": 720})
td_create_operator(type="levelTOP", parent="/project1", name="brightness")
td_create_operator(type="nullTOP", parent="/project1", name="out")
Для массового создания или соединения используйте td_execute_python:
# td_execute_python script:
root = op('/project1')
nodes = []
for name, optype in [('bg', noiseTOP), ('fx', levelTOP), ('out', nullTOP)]:
n = root.create(optype, name)
nodes.append(n.path)
# Wire chain
for i in range(len(nodes)-1):
op(nodes[i]).outputConnectors[0].connect(op(nodes[i+1]).inputConnectors[0])
result = {'created': nodes}
Шаг 2: Установка параметров
Отдавайте предпочтение встроенному инструменту (проверяет параметры, не вызовет сбой):
td_set_operator_pars(path="/project1/bg", parameters={"roughness": 0.6, "monochrome": true})
Для выражений или режимов используйте td_execute_python:
op('/project1/time_driver').par.colorr.expr = "absTime.seconds % 1000.0"
Шаг 3: Соединение
Используйте td_execute_python — встроенного инструмента для соединения нет:
op('/project1/bg').outputConnectors[0].connect(op('/project1/fx').inputConnectors[0])
Шаг 4: Проверка
td_get_errors(path="/project1", recursive=true)
td_get_perf()
td_get_operator_info(path="/project1/out", detail="full")
Шаг 5: Отображение / Захват
td_get_screenshot(path="/project1/out")
Или откройте окно через скрипт:
win = op('/project1').create(windowCOMP, 'display')
win.par.winop = op('/project1/out').path
win.par.winw = 1280; win.par.winh = 720
win.par.winopen.pulse()
Краткий справочник инструментов MCP
Основные (используйте чаще всего):
| Инструмент | Назначение |
|---|---|
td_execute_python | Выполнить произвольный Python в TD. Полный доступ к API. |
td_create_operator | Создать узел с параметрами + авто-позиционирование |
td_set_operator_pars | Безопасно задать параметры (проверяет, не вызовет сбой) |
td_get_operator_info | Проверить один узел: соединения, параметры, ошибки |
td_get_operators_info | Проверить несколько узлов за один вызов |
td_get_network | Просмотреть структуру сети по пути |
td_get_errors | Найти ошибки/предупреждения рекурсивно |
td_get_par_info | Получить имена параметров для типа OP (заменяет разведку) |
td_get_hints | Получить шаблоны/советы перед построением |
td_get_focus | Узнать, какая сеть открыта, что выбрано |
Чтение/Запись:
| Инструмент | Назначение |
|---|---|
td_read_dat | Прочитать текстовое содержимое DAT |
td_write_dat | Записать/изменить содержимое DAT |
td_read_chop | Прочитать значения каналов CHOP |
td_read_textport | Прочитать вывод консоли TD |
Визуальные:
| Инструмент | Назначение |
|---|---|
td_get_screenshot | Захватить вьювер одного OP в файл |
td_get_screenshots | Захватить несколько OP одновременно |
td_get_screen_screenshot | Захватить реальный экран через TD |
td_navigate_to | Переместить редактор сети к OP |
Поиск:
| Инструмент | Назначение |
|---|---|
td_find_op | Найти OP по имени/типу во всём проекте |
td_search | Искать в коде, выражениях, строковых параметрах |
Системные:
| Инструмент | Назначение |
|---|---|
td_get_perf | Профилирование производительности (FPS, медленные OP) |
td_list_instances | Список всех запущенных экземпляров TD |
td_get_docs | Подробная документация по теме TD |
td_agents_md | Чтение/запись markdown-документов для каждого COMP |
td_reinit_extension | Перезагрузить расширение после редактирования кода |
td_clear_textport | Очистить консоль перед сеансом отладки |
Автоматизация ввода:
| Инструмент | Назначение |
|---|---|
td_input_execute | Отправить мышь/клавиатуру в TD |
td_input_status | Проверить статус очереди ввода |
td_input_clear | Остановить автоматизацию ввода |
td_op_screen_rect | Получить экранные координаты узла |
td_click_screen_point | Кликнуть по точке на скриншоте |
td_screen_point_to_global | Преобразовать пиксель скриншота в абсолютные экранные координаты |
Таблица выше охватывает 32 инструмента, используемых в типичных творческих рабочих процессах. Оставшиеся 4 инструмента (td_project_quit, td_test_session, td_dev_log, td_clear_dev_log) являются административными/режимными утилитами — полный справочник по всем 36 инструментам с полными схемами параметров см. в references/mcp-tools.md.
Ключевые правила реализации
Время в GLSL: В GLSL TOP нет uTDCurrentTime. Используйте страницу Values:
# Сначала вызовите td_get_par_info(op_type="glslTOP") для подтверждения имён параметров
td_set_operator_pars(path="/project1/shader", parameters={"value0name": "uTime"})
# Затем задайте выражение через скрипт:
# op('/project1/shader').par.value0.expr = "absTime.seconds"
# В GLSL: uniform float uTime;
Запасной вариант: Constant TOP в формате rgba32float (8-битный режим зажимает значения в диапазон 0-1, «замораживая» шейдер).
Feedback TOP: Используйте ссылку на параметр top, а не прямое входное соединение. Ошибка «Not enough sources» исчезает после первого кука. Предупреждение «Cook dependency loop» ожидаемо.
Разрешение: Non-Commercial ограничивает до 1280×1280. Используйте outputresolution = 'custom'.
Большие шейдеры: Записывайте GLSL в /tmp/file.glsl, затем используйте td_write_dat или td_execute_python для загрузки.
Доступ к вершинам/точкам (TD 2025.32): point.P[0], point.P[1], point.P[2] — НЕ .x, .y, .z.
Расширения: Формат ext0object — "op('./datName').module.ClassName(me)" в режиме CONSTANT. После редактирования кода расширения с помощью td_write_dat вызовите td_reinit_extension.
Скриптовые колбэки: ВСЕГДА используйте относительные пути через me.parent() / scriptOp.parent().
Очистка узлов: Всегда используйте list(root.children) перед итерацией + проверку child.valid.
Запись / Экспорт видео
# через td_execute_python:
root = op('/project1')
rec = root.create(moviefileoutTOP, 'recorder')
op('/project1/out').outputConnectors[0].connect(rec.inputConnectors[0])
rec.par.type = 'movie'
rec.par.file = '/tmp/output.mov'
rec.par.videocodec = 'prores' # Apple ProRes — не ограничен лицензией на macOS
rec.par.record = True # старт
# rec.par.record = False # стоп (вызвать отдельно позже)
H.264/H.265/AV1 требуют коммерческой лицензии. Используйте prores на macOS или mjpa как запасной вариант.
Извлечение кадров: ffmpeg -i /tmp/output.mov -vframes 120 /tmp/frames/frame_%06d.png
TOP.save() бесполезен для анимации — каждый раз захватывает одну и ту же текстуру GPU. Всегда используйте MovieFileOut.
Перед записью: контрольный список
- Убедитесь, что FPS > 0 через
td_get_perf. Если FPS=0, запись будет пустой. См. подводные камни #38-39. - Убедитесь, что вывод шейдера не чёрный через
td_get_screenshot. Чёрный вывод = ошибка шейдера или отсутствующий вход. См. подводные камни #8, #40. - Если запись со звуком: сначала запустите аудио, затем задержите запись на 3 кадра. См. подводные камни #19.
- Установите путь вывода до начала записи — установка обоих параметров в одном скрипте может привести к состоянию гонки.
Аудио-реактивный GLSL (проверенный рецепт)
Правильная цепочка сигналов (проверено апрель 2026)
AudioFileIn CHOP (playmode=sequential)
→ AudioSpectrum CHOP (FFT=512, outputmenu=setmanually, outlength=256, timeslice=ON)
→ Math CHOP (gain=10)
→ CHOP to TOP (dataformat=r, layout=rowscropped)
→ GLSL TOP input 1 (текстура спектра, 256x2)
Constant TOP (rgba32float, время) → GLSL TOP input 0
GLSL TOP → Null TOP → MovieFileOut
Критические правила аудио-реактивности (эмпирически проверены)
- TimeSlice должен оставаться ВКЛЮЧЁННЫМ для AudioSpectrum. ВЫКЛ = обработка всего аудиофайла → 24000+ семплов → переполнение CHOP to TOP.
- Установите Output Length вручную на 256 через
outputmenu='setmanually'иoutlength=256. По умолчанию выводится 22050 семплов. - НЕ ИСПОЛЬЗУЙТЕ Lag CHOP для сглаживания спектра. Lag CHOP работает в режиме timeslice и расширяет 256 семплов до 2400+, усредняя все значения почти до нуля (~1e-06). Шейдер не получает полезных данных. Это была причина №1 сбоя аудио-синхронизации в тестах.
- НЕ ИСПОЛЬЗУЙТЕ Filter CHOP — та же проблема расширения timeslice с данными спектра.
- Сглаживание, если необходимо, делайте в GLSL шейдере через временную интерполяцию с текстурой обратной связи:
mix(prevValue, newValue, 0.3). Это даёт покадровую синхронизацию с нулевой задержкой конвейера. - CHOP to TOP dataformat = 'r', layout = 'rowscropped'. Вывод спектра — 256x2 (стерео). Семплируйте при y=0.25 для первого канала.
- Math gain = 10 (не 5). Сырые значения спектра — ~0.19 в басовом диапазоне. Усиление 10 даёт шейдеру полезные ~5.0.
- Resample CHOP не нужен. Управляйте размером вывода напрямую через параметр
outlengthAudioSpectrum.
Семплирование спектра в GLSL
// Input 0 = время (1x1 rgba32float), Input 1 = спектр (256x2)
float iTime = texture(sTD2DInputs[0], vec2(0.5)).r;
// Семплируйте несколько точек на полосу и усредняйте для стабильности:
// ПРИМЕЧАНИЕ: y=0.25 для первого канала (стерео текстура 256x2, центр первой строки — 0.25)
float bass = (texture(sTD2DInputs[1], vec2(0.02, 0.25)).r +
texture(sTD2DInputs[1], vec2(0.05, 0.25)).r) / 2.0;
float mid = (texture(sTD2DInputs[1], vec2(0.2, 0.25)).r +
texture(sTD2DInputs[1], vec2(0.35, 0.25)).r) / 2.0;
float hi = (texture(sTD2DInputs[1], vec2(0.6, 0.25)).r +
texture(sTD2DInputs[1], vec2(0.8, 0.25)).r) / 2.0;
Полные скрипты сборки и код шейдера см. в references/network-patterns.md.
Краткий справочник операторов
| Семейство | Цвет | Класс Python / тип MCP | Суффикс |
|---|---|---|---|
| TOP | Фиолетовый | noiseTOP, glslTOP, compositeTOP, levelTop, blurTOP, textTOP, nullTOP | TOP |
| CHOP | Зелёный | audiofileinCHOP, audiospectrumCHOP, mathCHOP, lfoCHOP, constantCHOP | CHOP |
| SOP | Синий | gridSOP, sphereSOP, transformSOP, noiseSOP | SOP |
| DAT | Белый | textDAT, tableDAT, scriptDAT, webserverDAT | DAT |
| MAT | Жёлтый | phongMAT, pbrMAT, glslMAT, constMAT | MAT |
| COMP | Серый | geometryCOMP, containerCOMP, cameraCOMP, lightCOMP, windowCOMP | COMP |
Замечания по безопасности
- MCP работает только на localhost (порт 40404). Без аутентификации — любой локальный процесс может отправлять команды.
td_execute_pythonимеет неограниченный доступ к среде Python TD и файловой системе от имени пользователя процесса TD.setup.shзагружает twozero.tox с официального URL 404zero.com. При необходимости проверьте загрузку.- Навык никогда не отправляет данные за пределы localhost. Вся связь MCP — локальная.
Справочные материалы
| Файл | Описание |
|---|---|
references/pitfalls.md | Трудные уроки из реальных сессий |
references/operators.md | Все семейства операторов с параметрами и примерами использования |
references/network-patterns.md | Рецепты: аудио-реактивные, генеративные, GLSL, инстансинг |
references/mcp-tools.md | Полные схемы параметров инструментов twozero MCP |
references/python-api.md | TD Python: op(), скриптинг, расширения |
references/troubleshooting.md | Диагностика соединения, отладка |
references/glsl.md | Uniforms GLSL, встроенные функции, шаблоны шейдеров |
references/postfx.md | Пост-эффекты: bloom, CRT, хроматическая аберрация, свечение обратной связи |
references/layout-compositor.md | Шаблоны компоновки HUD, сетки панелей, BSP-подобные макеты |
references/operator-tips.md | Рендеринг каркаса, настройка Feedback TOP |
references/geometry-comp.md | Geometry COMP: инстансинг, POP vs SOP, морфинг |
references/audio-reactive.md | Извлечение аудио-полос, обнаружение бита, огибающая |
references/animation.md | LFO, таймеры, ключевые кадры, easing, анимация через выражения |
references/midi-osc.md | MIDI/OSC контроллеры, TouchOSC, синхронизация нескольких машин |
references/particles.md | POP и устаревший particleSOP — эмиссия, силы, коллизии |
references/projection-mapping.md | Многооконный вывод, corner pin, mesh warp, смешивание краёв |
references/external-data.md | HTTP, WebSocket, MQTT, Serial, TCP, webserverDAT |
references/panel-ui.md | Пользовательские параметры, panel COMP, кнопка/слайдер/поле, panelExecuteDAT |
references/replicator.md | replicatorCOMP — клонирование на основе данных, макеты, колбэки |
references/dat-scripting.md | Семейство Execute DAT — chop/dat/parameter/panel/op/executeDAT |
references/3d-scene.md | Системы освещения, тени, IBL/cubemaps, несколько камер, PBR |
scripts/setup.sh | Автоматизированный скрипт настройки |
Вы не пишете код. Вы управляете светом.