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

Signal Lab для ассистента: signallab mcp ​

signallab mcp — сервер Model Context Protocol. Ассистент в Claude Code, Claude Desktop, Cursor, VS Code или любом другом клиенте MCP запускает его и после этого может:

  • узнать, из чего состоит эксперимент, написать его, проверить, запустить и по шагам прочитать, почему он не прошёл;
  • отправить одно OSC-сообщение, датаграмму, HTTP-запрос, сообщение WebSocket или публикацию MQTT и послушать порт, чтобы увидеть, что присылает устройство;
  • отправить сигнал из вашей библиотеки;
  • сыграть зависимость — HTTP API, OSC-, UDP- или TCP-устройство, MQTT-брокер — и прочитать, что отправила ей ваша система;
  • прочитать прежние запуски и сравнить два из них.

Каждое действие проходит через те же команды движка, что использует приложение, поэтому эксперимент, который запускает ассистент, — это тот самый запуск, который выполнило бы приложение, с тем же отчётом, а каждая ошибка сформулирована так, как её формулирует интерфейс.

WARNING

Отправка, запуски и эмуляторы выпускают настоящий трафик в сеть. Скажите ассистенту, с какими устройствами ему можно говорить; встроенные шаблоны указывают на loopback (127.0.0.1).

Настройка ​

signallab поставляется с настольным приложением и после его установки есть в вашем PATH (см. Установка). Клиент сам запускает signallab mcp и общается с ним через stdin и stdout; вручную запускать его не нужно.

--print-config печатает то, что нужно клиенту, с полным путём к этому signallab:

КомандаЧто печатает
signallab mcp --print-config claude-codeКомандную строку claude mcp add.
signallab mcp --print-config claude-desktopЗапись mcpServers для файла конфигурации Claude Desktop.
signallab mcp --print-config cursorТу же запись mcpServers, для mcp.json в Cursor.
signallab mcp --print-config vscodeЗапись servers для .vscode/mcp.json в VS Code.

Для ассистента, который работает с лабораторным сервером, добавьте --server URL: в напечатанной конфигурации он будет указан, а вместо токена — заглушка.

Claude Code ​

Выполните строку, которую печатает --print-config claude-code, например:

bash
claude mcp add signallab -- "C:\Program Files\Signal Lab\signallab.exe" mcp

Claude Desktop и Cursor ​

Добавьте запись в конфигурацию клиента — для Claude Desktop это claude_desktop_config.json, для Cursor — mcp.json — и перезапустите клиент:

json
{
  "mcpServers": {
    "signallab": {
      "command": "C:\\Program Files\\Signal Lab\\signallab.exe",
      "args": ["mcp"],
      "env": {}
    }
  }
}

VS Code ​

json
{
  "servers": {
    "signallab": {
      "type": "stdio",
      "command": "/usr/bin/signallab",
      "args": ["mcp"],
      "env": {}
    }
  }
}

Другие клиенты ​

Любой клиент, который запускает stdio-сервер, работает так же: команда — signallab (или его полный путь), аргументы — mcp и любые из параметров. В Linux в качестве команды может служить и образ сервера:

bash
docker run -i --rm --network host --entrypoint signallab ghcr.io/proanima/signallab:1.0.0 mcp

Параметры ​

ПараметрЧто делаетПо умолчанию
--server URLВыполнять эксперименты, отправку и эмуляторы на этом сервере Signal Lab (см. На лабораторном сервере).SIGNALLAB_SERVER
--token-file PATHФайл с токеном сервера.SIGNALLAB_TOKEN_FILE, иначе SIGNALLAB_TOKEN
--data-dir PATHГде хранить запуски и их отчёты. Нельзя вместе с --server.папка данных приложения (Documents/SignalLab)
--library PATHБиблиотека сигналов для list_signals и fire_signal.signals.json приложения
--emulators PATHБиблиотека эмуляторов для list_emulators и start_emulator.emulators.json приложения
--secrets files|systemОткуда берутся значения секретов для запусков на этой машине, как у run. Нельзя вместе с --server.files
--secrets-dir PATHПапка с файлами секретов, по одному на имя. Нельзя вместе с --server./run/secrets/signallab, если она есть
--lang <code>Язык результатов и сообщений об ошибках.SIGNALLAB_LANG, иначе локаль, иначе en
--print-config CLIENTНапечатать конфигурацию клиента и выйти: claude-code, claude-desktop, cursor или vscode.

Запуски хранят свои отчёты в папке данных приложения, где приложение держит и свои, так что после сеанса они остаются.

Инструменты ​

Инструменты, которые только читают, помечены как «только чтение», поэтому клиент может выполнять их, не спрашивая. Инструменты, которые выходят во внешний мир — отправляют, слушают или что-то запускают, — помечены соответствующим образом, и клиент может спрашивать вас перед каждым вызовом. Ни один не помечен как разрушающий.

ИнструментЧто делаетВыходит во внешний мир
describe_nodesДокумент эксперимента, каждый вид узла с его полями, выходами и примером, язык шаблонов {{template}}, профили нагрузки и документ эмулятора.нет
list_templatesВстроенные эксперименты с их параметрами.нет
get_templateОдин встроенный эксперимент как документ.нет
validate_experimentПроверяет эксперимент так же, как редактор перед запуском; ничего не отправляет.нет
run_experimentВыполняет эксперимент до конца и сообщает о каждом шаге.да
send_oscОдно OSC-сообщение.да
send_udpОдна UDP-датаграмма.да
send_httpОдин HTTP-запрос.да
send_mqttОдна публикация MQTT 3.1.1.да
send_wsОдин обмен по WebSocket.да
listenЧто в течение некоторого времени приходит на UDP-порт.да
list_signalsСигналы вашей библиотеки.нет
fire_signalОтправляет сигнал из библиотеки.да
list_emulatorsЭмуляторы вашей библиотеки.нет
start_emulatorЗапускает эмулятор.да
emulator_exchangesЧто запущенный эмулятор получил и чем ответил.нет
set_emulator_downОтключает запущенный эмулятор или возвращает его.да
list_runsОтчёты о прежних запусках.нет
compare_runsДва запуска рядом.нет
list_jobsЧто сейчас запущено.нет
stop_jobОстанавливает запущенную задачу.да

Эксперименты ​

describe_nodes — это то, что ассистент читает перед тем, как писать эксперимент; оно совпадает с signallab nodes. list_templates и get_template дают рабочие примеры, которые можно запустить или доработать.

validate_experiment и run_experiment принимают эксперимент одним из трёх способов — ровно одним из первых трёх аргументов, — а остальные настраивают запуск:

АргументЧто это
documentДокумент эксперимента в том виде, в каком его сохраняет приложение.
fileПуть к файлу эксперимента на машине, где работает signallab.
templateИмя встроенного шаблона.
paramsЗначения параметров для этого запуска: {"name": "value"}; числа и булевы значения принимаются как текст.
profileВыполнить с этим профилем документа; "" — со значениями по умолчанию.
seedrun_experiment: seed случайных значений.
timeoutrun_experiment: сколько секунд может длиться запуск, от 1 до 300 (по умолчанию 300).

run_experiment отвечает, когда запуск закончился: прошёл, не прошёл или остановлен, с его длительностью и seed, каждым шагом и тем, что он сделал или почему не прошёл, тем, что спрашивали у каждого эмулятора, тем, что сделало каждое реле помех, и путём к отчёту. Запуск, который не прошёл, — это обычный ответ (шаги объясняют причину), а не неудавшийся вызов.

Одиночные сообщения ​

ИнструментАргументы
send_osctarget (host:port), address, args: числа (целые → int32 или int64, если не помещаются; иначе float32), строки, булевы значения, null или {"type": "int"|"float"|"str"|"long"|"double"|"bool"|"blob"|"nil", "value": …}.
send_udptarget, а также text или hex ("de ad be ef").
send_httpmethod, url, headers ({"Name": "value"}), body, timeout_ms (по умолчанию 10000), auth: {"scheme": "basic"|"digest", "username", "password"} или {"scheme": "bearer", "token"}. Возвращает статус, время, заголовки и тело — его первые 16 КиБ.
send_mqttbroker (host:port, порт 1883, если не указан), topic, payload, qos (0, 1 или 2), retain. Пустое содержимое с retain стирает retained-значение.
send_wsurl (ws:// или wss://), text или hex, headers, protocols, а чтобы дождаться ответа — expect (содержит), expect_regex или wait (любое сообщение); timeout_ms от 1 до 120000 (по умолчанию 2000). Возвращает рукопожатие, отправленное и ответ, а если ответ — JSON, то уже разобранный.

Это те же команды, которыми пользуются экраны приложения; см. signallab send.

Прослушивание ​

listen на некоторое время открывает UDP-порт на машине, где работает signallab mcp, и возвращает то, что пришло: OSC-сообщения декодированными, остальные датаграммы — как текст и hex.

АргументЧто этоПо умолчанию
bindIP:port, например 0.0.0.0:9000.обязателен
protocolosc или udp.osc
secondsСколько слушать, от 0,1 до 60.5
maxОстановиться после стольких датаграмм, от 1 до 1000.100

Если на 0.0.0.0 ничего не пришло, в ответе ассистенту напоминают проверить брандмауэр (signallab doctor). С --server инструмент listen отклоняется: на сервере слушает эксперимент с узлом ожидания.

Сигналы и эмуляторы ​

list_signals и fire_signal используют вашу библиотеку сигналов — signals.json приложения, --library или путь library, переданный в вызове. Сигнал отправляется по своему id или имени точно так, как его отправляет приложение.

list_emulators называет эмуляторы вашей библиотеки. start_emulator запускает один из них — документ в emulator или id либо имя записи библиотеки в name — и возвращает id его задачи и адрес; он отвечает по своим правилам, пока не вызван stop_job. bind переносит его на другой IP:port, params задаёт значения, которые читают его шаблоны, seed фиксирует его случайный выбор. emulator_exchanges (job_id, а after — чтобы получить только более новые) перечисляет то, что пришло, и то, чем ответило каждое правило. set_emulator_down (job_id, down и fault: unavailable, reset или timeout) выдёргивает вилку запущенного эмулятора, пока его не включат снова: HTTP встречает сбой (unavailable отвечает 503), TCP-устройство и MQTT-брокер рвут соединения, OSC и UDP ничего не отвечают. См. Эмуляторы.

Запуски и задачи ​

list_runs читает отчёты о прежних запусках, новые сверху, — одного эксперимента, если он назван в experiment, не больше limit (от 1 до 500, по умолчанию 50) — с числами каждого шага с нагрузкой. compare_runs принимает имена двух из них, a (до) и b (после), и ставит рядом задержки каждого шага с нагрузкой, долю ошибок, достигнутый темп и пропущенные запросы, отмечая изменение на 5 % и больше в худшую сторону как регрессию. См. Запуски и отчёты.

list_jobs перечисляет то, что запущено — мониторы, генераторы, эмуляторы, запуски, — а stop_job останавливает одну задачу по её id.

Результаты и ошибки ​

Каждый ответ — это текст для модели и те же данные в структурированном виде. Ошибка помечена как ошибка и несёт ошибку движка — стабильный code, её значения, узел и поле, о которых речь, — сформулированную на языке, выбранном через --lang. Неверные аргументы, которые передал ассистент, возвращаются словами, по которым их можно исправить.

Ход выполнения и отмена ​

Если клиент запрашивает ход выполнения для run_experiment, о каждом шаге сообщается по мере его выполнения (узел и его состояние), так что ассистент — и вы — видят, как идёт запуск. Отмена вызова останавливает его; отмена run_experiment останавливает сам запуск, как кнопка Стоп в приложении.

Когда клиент закрывает соединение, вызовы, которые ещё выполняются, завершаются, а затем signallab mcp выходит.

На лабораторном сервере ​

При --server http://192.0.2.10:1430 эксперименты, отправка, сигналы и эмуляторы выполняются на этом сервере, через его API — с его сетью, его секретами и его папкой данных, — так что ассистент достаёт до оборудования, до которого дотягивается только лаборатория. Передайте токен через окружение клиента:

json
{
  "mcpServers": {
    "signallab": {
      "command": "signallab",
      "args": ["mcp", "--server", "http://192.0.2.10:1430"],
      "env": { "SIGNALLAB_TOKEN": "<the server's token>" }
    }
  }
}

На этой машине остаются: библиотеки сигналов и эмуляторов (приложения, --library и --emulators) и файлы, которые называет вызов (file, library), читаются здесь, а то, что в них, отправляется на сервер; listen отклоняется. См. Запуск Signal Lab как сервера.

Безопасность ​

  • Ассистент может делать только то, что делают инструменты, а каждый инструмент — это одна из команд самого приложения: он не может достать до того, до чего не достало бы приложение.
  • Инструменты, которые отправляют, слушают или что-то запускают, помечены как выходящие во внешний мир; клиент сам решает, спрашивать ли вас перед каждым вызовом.
  • Значения секретов до ассистента не доходят: эксперимент называет их как {{secret.NAME}}, а в каждом результате на их месте стоит ••••.
  • Эмулятор или слушатель открывает порт на той машине, где работает; list_jobs и stop_job показывают и завершают то, что ещё работает.

Протокол ​

Для авторов клиентов: JSON-RPC 2.0 через stdio, одно сообщение на строку; stdout несёт только сообщения протокола, а всё, что предназначено человеку, уходит в stderr. Версии протокола 2025-06-18, 2025-03-26 и 2024-11-05 (самая новая, если клиент просит другую), пакеты, ping, tools/list и tools/call; ход выполнения — как notifications/progress для вызова, приславшего progressToken, отмена — через notifications/cancelled. Поле instructions сервера объясняет модели, как инструменты сочетаются друг с другом.