Страница Cascade MCP описывает знакомую механику: файл mcp_config.json, marketplace для установки серверов, deeplink в один клик. Всё это выглядит как общая настройка инструментов Devin Desktop - и здесь легко ошибиться. Документация прямо помечает: это конфигурация legacy-агента Cascade, а не Devin Local.
Наивный ход - найти нужный сервер по имени функции и скопировать его конфиг из Cascade в новую работу, ожидая, что инструмент "просто появится" у текущего агента. Раз MCP один и тот же протокол, кажется, что и настройка общая: подключил один раз - работает везде.
Ломается это на том, что MCP как протокол общий, а конфигурация и политика доверия - нет. Cascade хранит серверы в своём ~/.codeium/windsurf/mcp_config.json; Devin Local - агент по умолчанию для новых вкладок - настраивает MCP в конфиге Devin CLI, отдельно. Скопированный по имени сервер в лучшем случае не виден новому агенту, в худшем - тащит за собой секреты и права из чужой среды.
Отсюда порядок переноса: не по имени функции, а через настройки конкретного агента. Сначала откройте Customizations того агента, которому нужен инструмент. Перенесите сервер в его собственный, отдельный конфиг - для Devin Local это конфиг Devin CLI, а не mcp_config.json Cascade. Уберите секреты из файла и заново задайте tool-level grants: какие именно инструменты сервера разрешены. Слово "пересборка" здесь буквально: grants задают заново, глядя на то, что серверу действительно нужно в этой задаче, а не переносят прежний широкий доступ по инерции. Минимальный набор разрешённых инструментов - не перестраховка, а способ ограничить, что внешний код сможет сделать от вашего имени. Перенос - это пересборка доступа, а не копирование строки.
У самого Cascade MCP есть документированные рамки, о которых стоит помнить при разборе старого конфига. Он поддерживает транспорты stdio, Streamable HTTP и SSE, а также OAuth для каждого из них. И у него есть потолок: до 100 суммарно включённых инструментов одновременно. Этот лимит объясняет, почему часть серверов приходится держать выключенными, и почему при переносе разумно взять не всё, а только то, что действительно используется. Лимит в 100 инструментов - это не только про Cascade: он напоминает, что каждый подключённый сервер добавляет функции в общий бюджет внимания агента, и десяток полузабытых серверов способен вытеснить те, что действительно нужны сегодня.
Web search в Cascade - тоже его собственная механика, а не общая. Упоминания @web и @docs и вставленный в prompt URL относятся к Cascade web/docs search: @web форсирует поиск, @docs обращается к документации, вставленный адрес читается напрямую. Чтение страниц при этом выполняется локально, на вашей машине. У Devin Local свои инструменты web и fetch, и подчиняются они его собственной tool- и permission-модели, а не настройкам Cascade.
Почему это разведено, а не сведено к одной настройке. Cascade и Devin Local - разные агенты с разными границами доверия, и общий конфиг означал бы общую политику там, где её быть не должно. Инструмент, разрешённый одному агенту, не обязан быть разрешён другому; секрет, доступный legacy-среде, не должен автоматически перетекать в новую. Раздельная конфигурация - это не неудобство, а граница безопасности между двумя исполнителями.
Цена копирования по имени конкретна. В лучшем случае вы отлаживаете сервер, которого текущий агент вообще не видит, потому что смотрели не в тот конфиг. В худшем - переносите секрет в чужой файл или выдаёте tool-level grants шире, чем нужно, и расширяете поверхность атаки. Ошибка тем опаснее, что MCP-сервер - это внешний код с доступом к вашим данным, а не просто строка настроек.
Проверять перенос стоит со стороны нужного агента, а не старого файла. Виден ли сервер именно у того агента, которому он нужен, в его Customizations. Не осталось ли секрета в конфиге - его ищут тем же способом, что и любой секрет перед коммитом. Заданы ли grants поимённо, а не "всё разрешено". Укладываетесь ли вы в лимит включённых инструментов, не держа лишние ради галочки. Для web - работает ли fetch под permission-моделью нужного агента, а не по памяти о Cascade.
Типичный провал - настроить не тот слой. "Сервер не подключился" - потому что конфиг правили у Cascade, а работает Devin Local. "Инструмент не виден" - потому что уперлись в лимит 100 или сервер выключен. "Секрет утёк" - потому что конфиг скопировали дословно. "Web не ищет" - потому что @web относится к Cascade, а текущий агент использует свою модель. Признак один: настройку переносят по имени функции, не назвав агента и его конфиг. Назовите агента и откройте его Customizations первым - чаще всего проблема именно там.