Перейти к основному содержимому

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)

КРИТИЧЕСКИ ВАЖНЫЕ ПРАВИЛА​

  1. НИКОГДА не угадывайте имена параметров. Сначала вызовите td_get_par_info для типа оператора. Ваши обучающие данные неверны для TD 2025.32.
  2. Если возникает tdAttributeError, ОСТАНОВИТЕСЬ. Вызовите td_get_operator_info для проблемного узла, прежде чем продолжать.
  3. НИКОГДА не прописывайте жёстко абсолютные пути в скриптовых колбэках. Используйте me.parent() / scriptOp.parent().
  4. Отдавайте предпочтение встроенным инструментам MCP перед td_execute_python. Используйте td_create_operator, td_set_operator_pars, td_get_errors и т.д. Прибегайте к td_execute_python только для сложной многошаговой логики.
  5. Перед построением вызывайте 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"

Скрипт выполнит следующее:

  1. Проверит, запущен ли TD
  2. Загрузит twozero.tox, если его ещё нет в кэше
  3. Добавит MCP-сервер twozero_td в конфигурацию VibeOS (если отсутствует)
  4. Протестирует MCP-соединение на порту 40404
  5. Сообщит, какие ручные действия остались (перетащить .tox в TD, включить MCP)

Ручные действия (однократные, не поддаются автоматизации)​

  1. Перетащите ~/Downloads/twozero.tox в редактор сети TD → нажмите Install
  2. Включите MCP: нажмите на иконку twozero → Settings → mcp → «auto start MCP» → Yes
  3. Перезапустите сессию 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.

Перед записью: контрольный список​

  1. Убедитесь, что FPS > 0 через td_get_perf. Если FPS=0, запись будет пустой. См. подводные камни #38-39.
  2. Убедитесь, что вывод шейдера не чёрный через td_get_screenshot. Чёрный вывод = ошибка шейдера или отсутствующий вход. См. подводные камни #8, #40.
  3. Если запись со звуком: сначала запустите аудио, затем задержите запись на 3 кадра. См. подводные камни #19.
  4. Установите путь вывода до начала записи — установка обоих параметров в одном скрипте может привести к состоянию гонки.

Аудио-реактивный 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

Критические правила аудио-реактивности (эмпирически проверены)​

  1. TimeSlice должен оставаться ВКЛЮЧЁННЫМ для AudioSpectrum. ВЫКЛ = обработка всего аудиофайла → 24000+ семплов → переполнение CHOP to TOP.
  2. Установите Output Length вручную на 256 через outputmenu='setmanually' и outlength=256. По умолчанию выводится 22050 семплов.
  3. НЕ ИСПОЛЬЗУЙТЕ Lag CHOP для сглаживания спектра. Lag CHOP работает в режиме timeslice и расширяет 256 семплов до 2400+, усредняя все значения почти до нуля (~1e-06). Шейдер не получает полезных данных. Это была причина №1 сбоя аудио-синхронизации в тестах.
  4. НЕ ИСПОЛЬЗУЙТЕ Filter CHOP — та же проблема расширения timeslice с данными спектра.
  5. Сглаживание, если необходимо, делайте в GLSL шейдере через временную интерполяцию с текстурой обратной связи: mix(prevValue, newValue, 0.3). Это даёт покадровую синхронизацию с нулевой задержкой конвейера.
  6. CHOP to TOP dataformat = 'r', layout = 'rowscropped'. Вывод спектра — 256x2 (стерео). Семплируйте при y=0.25 для первого канала.
  7. Math gain = 10 (не 5). Сырые значения спектра — ~0.19 в басовом диапазоне. Усиление 10 даёт шейдеру полезные ~5.0.
  8. Resample CHOP не нужен. Управляйте размером вывода напрямую через параметр outlength AudioSpectrum.

Семплирование спектра в 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, nullTOPTOP
CHOPЗелёныйaudiofileinCHOP, audiospectrumCHOP, mathCHOP, lfoCHOP, constantCHOPCHOP
SOPСинийgridSOP, sphereSOP, transformSOP, noiseSOPSOP
DATБелыйtextDAT, tableDAT, scriptDAT, webserverDATDAT
MATЖёлтыйphongMAT, pbrMAT, glslMAT, constMATMAT
COMPСерыйgeometryCOMP, containerCOMP, cameraCOMP, lightCOMP, windowCOMPCOMP

Замечания по безопасности​

  • 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.mdTD Python: op(), скриптинг, расширения
references/troubleshooting.mdДиагностика соединения, отладка
references/glsl.mdUniforms GLSL, встроенные функции, шаблоны шейдеров
references/postfx.mdПост-эффекты: bloom, CRT, хроматическая аберрация, свечение обратной связи
references/layout-compositor.mdШаблоны компоновки HUD, сетки панелей, BSP-подобные макеты
references/operator-tips.mdРендеринг каркаса, настройка Feedback TOP
references/geometry-comp.mdGeometry COMP: инстансинг, POP vs SOP, морфинг
references/audio-reactive.mdИзвлечение аудио-полос, обнаружение бита, огибающая
references/animation.mdLFO, таймеры, ключевые кадры, easing, анимация через выражения
references/midi-osc.mdMIDI/OSC контроллеры, TouchOSC, синхронизация нескольких машин
references/particles.mdPOP и устаревший particleSOP — эмиссия, силы, коллизии
references/projection-mapping.mdМногооконный вывод, corner pin, mesh warp, смешивание краёв
references/external-data.mdHTTP, WebSocket, MQTT, Serial, TCP, webserverDAT
references/panel-ui.mdПользовательские параметры, panel COMP, кнопка/слайдер/поле, panelExecuteDAT
references/replicator.mdreplicatorCOMP — клонирование на основе данных, макеты, колбэки
references/dat-scripting.mdСемейство Execute DAT — chop/dat/parameter/panel/op/executeDAT
references/3d-scene.mdСистемы освещения, тени, IBL/cubemaps, несколько камер, PBR
scripts/setup.shАвтоматизированный скрипт настройки

Вы не пишете код. Вы управляете светом.