Перейти к содержанию

ADR 0043: Паритет восстановления MCP-транспорта (человек ↔ агент) и границы хоста

Статус: Proposed
Дата: 2026-04-13

Связанные ADR

ADR Роль
0008 контракты MCP
0016 ACP ортогонально MCP
0002 Единый слой состояния отладки для человека и агента

Вне ADR

Документ Роль
north-star-cursor-mcp-cascade-workbench-v1.md Cursor + MCP + Cascade
MCP-PROTOCOL.md транспорт stdio, видимость MCP

Контекст

Северная звезда продукта предполагает рабочий контур Cursor (или аналог) + MCP + CascadeIDE: агент вызывает инструменты IDE и видит согласованное состояние с человеком (north-star § критерии).

Продуктовая логика: MCP как «способ быть в мире»

Для агента MCP — не фоновая деталь, а интерфейс к действию: без живого канала к тулам он не «просто без удобства», а ограничен в том же роде, что человек без руки — только у человека обычно есть обходы: другой инструмент, перезапуск, настройки, «протез» (замена пути к цели). В экосистеме хоста часть серверов может быть встроенной, большинство — внешние процессы; человек-оператор при сбое может починить любое упавшее звено в своей цепочке.

Агент в типичном чате не выбирает хост и не может перезапустить себе инструмент: он шлёт вызовы в тот же транспорт. Если MCP мёртв или завис, агент не имеет того класса самопомощи, который у человека считается нормой. Это не педантичная жалоба на UX — структурная асимметрия операторности: человек может восстановить или обойти цепочку, агент — часто нет, хотя от него ждут того же рода результатов. Такая ситуация противоречит интуиции паритета «мы в одной работе» и заслуживает явного признания в дизайне продукта и хоста, а не сведения к «ну перезапусти MCP руками».

Технически: где проходит граница

MCP-серверы у хоста — это процессы: обмен по stdio с дочерним процессом CascadeIDE с --mcp-stdio, плюс другие настроенные у хоста MCP-процессы (например отдельный сервер с тулами Roslyn для C#, сервер отладки .NET). Это не встроенный Roslyn/DAP внутри окна CascadeIDE — у каждого такого процесса свой транспорт и жизненный цикл, которым управляет хост, а не IDE. Ограничение агента следует из роли ProcessHost, не из «не захотели сделать» в одном репозитории.

Связь с 0002: там — паритет состояния отладки в IDE; здесь — другая ось: доступность канала MCP и восстановление после сбоя.

Решение (направление, без обязательства сроков)

  1. Явно разделить уровни:
  2. Уровень A — хост (Cursor и аналоги): запуск, остановка, перезапуск любого MCP-сервера, который хост держит в своей конфигурации. CascadeIDE не подменяет хост и не обещает произвольный рестарт соседних серверов из процесса IDE.
  3. Уровень B — процесс CascadeIDE: в перспективе — контролируемое восстановление собственной роли MCP-сервера (например повторная инициализация stdio-сессии внутри поддерживаемой модели), только если это безопасно для UI и не ломает контракт 0008. Отдельные итерации дизайна и реализации.
  4. Уровень C — наблюдаемость: расширять диагностику «транспорт жив / команда не дошла / IDE не в режиме MCP» так, чтобы агент и человек опирались на одни и те же сигналы (снимок состояния, явные ошибки в ответах тулами), в духе уже описанного в MCP-PROTOCOL.md § «Видимость MCP».

  1. Зафиксировать цель паритета: где технически возможно, восстановление или явная деградация канала должно быть доступно и через действия человека в хосте, и через поддерживаемый контракт (тулы IDE, команды хоста, или документированный сценарий), а не только «напиши пользователю перезапусти MCP».

  1. ACP: внешний агент по 0016 остаётся ортогонален этому ADR; восстановление MCP-транспорта к IDE не смешивается с транспортом ACP, кроме общего требования ясных ошибок и наблюдаемости.

Последствия

  • Появление осмысленных задач в бэклоге: health MCP в снимках IDE, при необходимости узкие команды «переподнять свой серверный режим», согласование с хостом — отдельно.
  • Зависимость от roadmap Cursor (или другого клиента) для полного паритета «агент перезапускает любой MCP» — честно отражать в документации и north-star, без обещания «всё в одном репо IDE».

Отклонённые альтернативы

  • Произвольный рестарт чужих MCP-процессов из CascadeIDE без участия хоста — отклонено: нарушает границу ProcessHost, небезопасно и непереносимо.
  • Молчать о разрыве и считать это только проблемой пользователя — отклонено как противоречащее north-star про «снять трение» перехода из Cursor.