5.0 KiB
5.0 KiB
WebSocket
1. Роль протокола в проекте
WebSocket поддерживается как полноценный upstream protocol для realtime, push-oriented и stateful integrations. Он не заменяет downstream MCP transport, а работает за Crank proxy.
Иными словами:
- downstream: MCP
Streamable HTTP; - upstream: WebSocket;
- Crank нормализует WebSocket lifecycle в bounded MCP tool semantics.
2. Что поддерживается в целевом продукте
- клиентское WebSocket подключение к внешнему upstream;
- custom headers и auth profiles;
- handshake config;
- optional subprotocol selection;
- subscription payload или start message;
- bounded
windowmode; sessionmode сstart/poll/stop;async_jobmode для control-plane и progress channels;- JSON message parsing;
- text-frame based event collection;
- mapping
MCP input -> subscribe payload; - mapping
WebSocket message -> normalized JSON; - heartbeat/keepalive config;
- reconnect policy для controlled session modes.
3. Что не входит в текущий продуктовый scope
- raw binary frame passthrough в LLM;
- arbitrary bidirectional conversation tunnel;
- full message bus semantics;
- generic browser-like socket inspector;
- guaranteed resumability across arbitrary upstream websocket providers.
4. Ключевое архитектурное ограничение
WebSocket не публикуется как "живой канал в чат". Он должен быть выражен в одной из execution models:
windowsessionasync_job
Недопустимо:
- бесконечно проксировать frames напрямую в MCP client;
- скрывать жизненный цикл сокета за одним неопределенным tool call;
- смешивать downstream SSE transport и upstream WebSocket semantics в одну абстракцию.
5. Типовые use cases
5.1. Monitoring and telemetry
- realtime метрики;
- device telemetry;
- market data;
- anomaly events.
5.2. Event subscriptions
- alert streams;
- queue events;
- workflow transitions;
- security events.
5.3. Stateful control channels
- rollout progress;
- remote task status;
- infrastructure control plane updates;
- long-running remote sessions.
6. Внутренняя модель WebSocket operation
WebSocket operation должна включать:
urlheaderssubprotocolssubscribe_message_templateunsubscribe_message_templateinput_mappingoutput_mappingexecution_configtool_description
Protocol-specific runtime tuning хранится отдельно в ProtocolOptions.websocket:
heartbeat_interval_msreconnect_max_attemptsreconnect_backoff_ms
7. Как оператор настраивает WebSocket operation
- Указывает URL WebSocket upstream.
- При необходимости выбирает auth profile и headers.
- Указывает subprotocol или оставляет пустым.
- Выбирает execution mode:
window,sessionилиasync_job. - Настраивает subscribe payload.
- Указывает правила извлечения items, status и cursor.
- Настраивает aggregation limits.
- Выполняет test run.
- Публикует operation как MCP tool или tool family.
8. Поведение runtime
При выполнении WebSocket operation runtime должен:
- Валидировать MCP input.
- Построить subscribe payload.
- Открыть WebSocket connection.
- Пройти handshake и auth.
- Отправить subscribe message.
- Собрать bounded window или session step.
- Нормализовать messages в JSON.
- Применить output mapping.
- Закрыть соединение или сохранить session state.
9. Критические нюансы
- upstream WebSocket может быть stateful и требовать explicit unsubscribe;
- heartbeat и reconnect должны быть управляемыми через config, а не захардкоженными;
- session state должен хранить cursor, last_event и subscription metadata;
- disconnect downstream MCP client не означает cancel upstream session;
- runtime обязан уметь cleanly завершать orphaned connections.
10. Почему WebSocket должен быть отдельным adapter
WebSocket нельзя свести к "почти SSE" или "почти HTTP", потому что:
- transport двунаправленный;
- lifecycle connection stateful;
- есть handshake, heartbeat и reconnect;
- подписка часто задается сообщением, а не URL;
- semantics событий и прогресса отличаются от request-response вызова.