Forge
markdowndeeb25a2
1# ADR 0043: Паритет восстановления MCP-транспорта (человек ↔ агент) и границы хоста
2
3**Статус:** Proposed
4**Дата:** 2026-04-13
5## Связанные ADR
6
7| ADR | Роль |
8|-----|------|
9| [0008](0008-mcp-contracts-and-testable-infrastructure.md) | контракты MCP |
10| [0016](0016-agent-client-protocol-external-agent.md) | ACP ортогонально MCP |
11| [0002](0002-debug-human-agent-parity.md) | Единый слой состояния отладки для человека и агента |
12
13### Вне ADR
14
15| Документ | Роль |
16|----------|------|
17| [north-star-cursor-mcp-cascade-workbench-v1.md](../design/north-star-cursor-mcp-cascade-workbench-v1.md) | Cursor + MCP + Cascade |
18| [MCP-PROTOCOL.md](../MCP-PROTOCOL.md) | транспорт stdio, видимость MCP |
19
20---
21## Контекст
22
23Северная звезда продукта предполагает рабочий контур **Cursor (или аналог) + MCP + CascadeIDE**: агент вызывает инструменты IDE и видит согласованное состояние с человеком ([north-star § критерии](../design/north-star-cursor-mcp-cascade-workbench-v1.md#критерии-мы-в-зоне-цели-проверяемые)).
24
25<a id="adr0043-motivation"></a>
26
27### Продуктовая логика: MCP как «способ быть в мире»
28
29Для агента **MCP — не фоновая деталь, а интерфейс к действию**: без живого канала к тулам он не «просто без удобства», а **ограничен в том же роде, что человек без руки** — только у человека обычно есть **обходы**: другой инструмент, перезапуск, настройки, «протез» (замена пути к цели). В экосистеме хоста часть серверов может быть **встроенной**, большинство — **внешние процессы**; человек-оператор при сбое может **починить любое упавшее звено** в своей цепочке.
30
31**Агент в типичном чате не выбирает хост и не может перезапустить себе инструмент:** он шлёт вызовы в **тот же** транспорт. Если MCP мёртв или завис, агент **не имеет** того класса самопомощи, который у человека считается нормой. Это не педантичная жалоба на UX — **структурная асимметрия операторности**: человек может восстановить или обойти цепочку, агент — часто нет, хотя от него ждут того же рода результатов. Такая ситуация **противоречит интуиции паритета** «мы в одной работе» и заслуживает явного признания в дизайне продукта и хоста, а не сведения к «ну перезапусти MCP руками».
32
33### Технически: где проходит граница
34
35MCP-серверы у хоста — это **процессы**: обмен по stdio с дочерним процессом CascadeIDE с `--mcp-stdio`, плюс **другие настроенные у хоста MCP-процессы** (например отдельный сервер с тулами Roslyn для C#, сервер отладки .NET). Это **не** встроенный Roslyn/DAP внутри окна CascadeIDE — у каждого такого процесса свой транспорт и жизненный цикл, которым управляет **хост**, а не IDE. Ограничение агента следует из **роли ProcessHost**, не из «не захотели сделать» в одном репозитории.
36
37**Связь с [0002](0002-debug-human-agent-parity.md):** там — паритет **состояния отладки** в IDE; здесь — другая ось: **доступность канала MCP** и восстановление после сбоя.
38
39## Решение (направление, без обязательства сроков)
40
41<a id="adr0043-p1"></a>
42
431. **Явно разделить уровни:**
44 - **Уровень A — хост (Cursor и аналоги):** запуск, остановка, перезапуск **любого** MCP-сервера, который хост держит в своей конфигурации. CascadeIDE **не подменяет** хост и не обещает произвольный рестарт соседних серверов из процесса IDE.
45 - **Уровень B — процесс CascadeIDE:** в перспективе — **контролируемое** восстановление **собственной** роли MCP-сервера (например повторная инициализация stdio-сессии **внутри** поддерживаемой модели), только если это безопасно для UI и не ломает контракт [0008](0008-mcp-contracts-and-testable-infrastructure.md). Отдельные итерации дизайна и реализации.
46 - **Уровень C — наблюдаемость:** расширять диагностику «транспорт жив / команда не дошла / IDE не в режиме MCP» так, чтобы **агент и человек** опирались на **одни и те же** сигналы (снимок состояния, явные ошибки в ответах тулами), в духе уже описанного в [MCP-PROTOCOL.md § «Видимость MCP»](../MCP-PROTOCOL.md#видимость-mcp-для-агента-на-будущее-свои-mcp-в-ide).
47
48<a id="adr0043-p2"></a>
49
502. **Зафиксировать цель паритета:** где технически возможно, **восстановление или явная деградация** канала должно быть доступно **и** через действия человека в хосте, **и** через **поддерживаемый** контракт (тулы IDE, команды хоста, или документированный сценарий), а не только «напиши пользователю перезапусти MCP».
51
52<a id="adr0043-p3"></a>
53
543. **ACP:** внешний агент по [0016](0016-agent-client-protocol-external-agent.md) остаётся **ортогонален** этому ADR; восстановление MCP-транспорта к IDE не смешивается с транспортом ACP, кроме общего требования **ясных ошибок** и наблюдаемости.
55
56## Последствия
57
58- Появление **осмысленных** задач в бэклоге: health MCP в снимках IDE, при необходимости узкие команды «переподнять свой серверный режим», согласование с хостом — отдельно.
59- Зависимость от **roadmap Cursor** (или другого клиента) для полного паритета «агент перезапускает любой MCP» — честно отражать в документации и north-star, без обещания «всё в одном репо IDE».
60
61## Отклонённые альтернативы
62
63- **Произвольный рестарт чужих MCP-процессов из CascadeIDE** без участия хоста — отклонено: нарушает границу ProcessHost, небезопасно и непереносимо.
64- **Молчать о разрыве** и считать это только проблемой пользователя — отклонено как противоречащее north-star про «снять трение» перехода из Cursor.
65
View only · write via MCP/CIDE