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, например:
claude mcp add signallab -- "C:\Program Files\Signal Lab\signallab.exe" mcpClaude Desktop и Cursor
Добавьте запись в конфигурацию клиента — для Claude Desktop это claude_desktop_config.json, для Cursor — mcp.json — и перезапустите клиент:
{
"mcpServers": {
"signallab": {
"command": "C:\\Program Files\\Signal Lab\\signallab.exe",
"args": ["mcp"],
"env": {}
}
}
}VS Code
{
"servers": {
"signallab": {
"type": "stdio",
"command": "/usr/bin/signallab",
"args": ["mcp"],
"env": {}
}
}
}Другие клиенты
Любой клиент, который запускает stdio-сервер, работает так же: команда — signallab (или его полный путь), аргументы — mcp и любые из параметров. В Linux в качестве команды может служить и образ сервера:
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 | Выполнить с этим профилем документа; "" — со значениями по умолчанию. |
seed | run_experiment: seed случайных значений. |
timeout | run_experiment: сколько секунд может длиться запуск, от 1 до 300 (по умолчанию 300). |
run_experiment отвечает, когда запуск закончился: прошёл, не прошёл или остановлен, с его длительностью и seed, каждым шагом и тем, что он сделал или почему не прошёл, тем, что спрашивали у каждого эмулятора, тем, что сделало каждое реле помех, и путём к отчёту. Запуск, который не прошёл, — это обычный ответ (шаги объясняют причину), а не неудавшийся вызов.
Одиночные сообщения
| Инструмент | Аргументы |
|---|---|
send_osc | target (host:port), address, args: числа (целые → int32 или int64, если не помещаются; иначе float32), строки, булевы значения, null или {"type": "int"|"float"|"str"|"long"|"double"|"bool"|"blob"|"nil", "value": …}. |
send_udp | target, а также text или hex ("de ad be ef"). |
send_http | method, url, headers ({"Name": "value"}), body, timeout_ms (по умолчанию 10000), auth: {"scheme": "basic"|"digest", "username", "password"} или {"scheme": "bearer", "token"}. Возвращает статус, время, заголовки и тело — его первые 16 КиБ. |
send_mqtt | broker (host:port, порт 1883, если не указан), topic, payload, qos (0, 1 или 2), retain. Пустое содержимое с retain стирает retained-значение. |
send_ws | url (ws:// или wss://), text или hex, headers, protocols, а чтобы дождаться ответа — expect (содержит), expect_regex или wait (любое сообщение); timeout_ms от 1 до 120000 (по умолчанию 2000). Возвращает рукопожатие, отправленное и ответ, а если ответ — JSON, то уже разобранный. |
Это те же команды, которыми пользуются экраны приложения; см. signallab send.
Прослушивание
listen на некоторое время открывает UDP-порт на машине, где работает signallab mcp, и возвращает то, что пришло: OSC-сообщения декодированными, остальные датаграммы — как текст и hex.
| Аргумент | Что это | По умолчанию |
|---|---|---|
bind | IP:port, например 0.0.0.0:9000. | обязателен |
protocol | osc или 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 — с его сетью, его секретами и его папкой данных, — так что ассистент достаёт до оборудования, до которого дотягивается только лаборатория. Передайте токен через окружение клиента:
{
"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 сервера объясняет модели, как инструменты сочетаются друг с другом.