OpenCode 2.2.6 научился делить MCP-серверы между проектами

В новой версии терминального агента MCP-подключения можно пулить, скриптовые прогоны запускать в отдельном git worktree и прятать из инбокса. Разбираем, что поменялось для CI и где подвох.
OpenCode 2.2.6 научился делить MCP-серверы между проектами

Открытый терминальный кодинг-агент OpenCode 7 ноября в 02:37 по Москве вышел в версии 2.2.6. Главное для тех, кто держит много проектов и MCP-серверов: один сервер теперь можно подключить один раз на все проекты с одинаковыми настройками вместо отдельного процесса и рукопожатия в каждой папке. Для скриптов и CI добавили запуск сессии в отдельном git worktree и флаг, который не пускает такие прогоны в инбокс.

Ещё одно изменение касается всех, кто вызывает opencode run из пайплайнов: команда теперь дожидается фоновых задач, которые запустил промпт, и не завершится, пока они работают. Если агент поднял dev-сервер или наблюдатель за файлами, прогон будет висеть до Ctrl+C или SIGTERM, поэтому таймаут на джобу становится обязательным.

  • pool: true у MCP-сервера: проекты с совпадающей конфигурацией делят одно подключение и один список инструментов. В замере автора 10 проектов подключились за 3,1 секунды вместо 15,4.
  • Делится только соединение по протоколу MCP 2026-07-28; со старыми серверами OpenCode молча возвращается к отдельному подключению на проект и пишет предупреждение в лог.
  • opencode run -w создаёт новый git worktree под сессию, --worktree=имя задаёт его название.
  • opencode run --archived сразу архивирует сессию, чтобы CI-прогоны не засоряли инбокс и список сессий.
  • opencode run ждёт фоновых задач без ограничения по времени, SIGTERM отменяет сессию и завершает процесс с кодом 143.

Зачем делить MCP-подключения

Один сервер OpenCode обслуживает много директорий, и до 2.2.6 каждая открывала своё подключение к каждому MCP-серверу. Автор изменения в PR #61185 приводит пример: при 10 открытых проектах MCP-сервер Cloudflare получает 10 подключений и 10 копий списка из 3765 инструментов, а локальный cua-driver запускается 10 раз и занимает 189 МБ.

Теперь у сервера в конфиге можно включить пул. Без флага или с false всё работает как раньше. Пример из PR:

        "mcp": {
  "cloudflare": { "type": "remote", "url": "https://mcp.cloudflare.com/mcp", "pool": true },
  "cua-driver": { "type": "local", "command": ["cua-driver", "mcp"], "cwd": "~", "pool": true }
}
    

Проекты получают общее подключение, только если у них совпадает ключ пула. Для удалённого сервера в него входят URL, заголовки, настройки OAuth, протокол, таймауты и идентификатор выбранной учётной записи; для локального — команда, рабочая директория, переменные окружения, протокол и таймауты. Заголовки, переменные окружения и секрет клиента OAuth в ключе хранятся только в виде хэша. Отсюда практическое следствие: локальному серверу нужен фиксированный cwd, например "~", иначе каждый проект запускает свою копию в своей папке, а OpenCode один раз пишет в лог «mcp pool ignored: local server has no fixed cwd».

Подключение 10 проектов к одним и тем же MCP-серверам без пула и с pool: true, медианы. Источник данных: замер автора PR #61185 в репозитории OpenCode; график Proglib
Подключение 10 проектов к одним и тем же MCP-серверам без пула и с pool: true, медианы. Источник данных: замер автора PR #61185 в репозитории OpenCode; график Proglib

В том же замере память сервера вместе с дочерними процессами в установившемся режиме снизилась примерно с 770 до 540 МБ. Автор честно оговаривает два момента. Сразу после одновременного старта всех проектов процесс занимает примерно на 60 МБ больше, чем без пула, потому что каждый проект в этот момент заново собирает общий список инструментов; через 60 секунд потребление опускается ниже, чем без пула. А часть ускорения подключения дало само рукопожатие по новому протоколу, а не только общее соединение.

Где общее подключение ведёт себя иначе

Пул работает только с серверами, которые говорят по протоколу MCP 2026-07-28. Если сервер старше или отказался от общего рукопожатия, директория подключается отдельно, как раньше, а в лог один раз пишется предупреждение. Такой вердикт действует до перезапуска. У общего подключения есть и другие отличия от приватного:

  • общее подключение не объявляет серверу roots, то есть корневую директорию проекта, — если ваш MCP-сервер на неё опирается, пул ему не подходит;
  • запрос сервера к пользователю (elicitation) уходит в ту директорию, чей вызов его вызвал, а запрос без вызывающего — во все, и первая ответившая побеждает;
  • если общий сервер падает, ошибку видят все проекты, которые его держат; подключение закрывается сразу, как только его отпустила последняя директория.

Скриптовые прогоны: worktree, архив и ожидание фоновых задач

Флаг -w у opencode run создаёт под сессию новый git worktree, так что агент правит код не в вашей рабочей копии. Имя задаётся только через знак равенства: --worktree=имя. Без него -w "fix it" воспринимается как флаг без значения плюс сообщение, так что текст задачи не потеряется. С --continue и --session флаг не сочетается.

Флаг --archived создаёт сессию сразу в архиве: она не появляется в инбоксе, на главной и в списках сессий приложения, скрыта в TUI и пропускается командой --continue. Найти её можно через opencode session list, который показывает и архивные сессии, и открыть по ID. Вместе это выглядит так:

        # прогон в отдельном worktree, без мусора в инбоксе и с таймаутом
timeout 30m opencode run -w --archived "обнови зависимости и прогони тесты"
    

Таймаут здесь не для красоты. По релиз-нотам, opencode run теперь ждёт фоновые shell-команды, субагентов и генерацию картинок, запущенные промптом, и даёт модели ответить на их результаты. Пока ждёт, печатает «waiting for N background job(s)», а с --format json — событие background_wait. Ограничения по времени нет, поэтому разработчики прямо советуют ставить таймаут на CI-джобы. SIGTERM отменяет сессию вместе с фоновыми задачами, код выхода 143.

Что ещё в 2.2.6

  • Безопасность сервера: чтение файлов и медиа через API отдаётся как изолированная загрузка, а межсайтовые переходы и запросы к /api/* с недопустимых источников отклоняются — файл из проекта больше не может выполнить скрипт на домене сервера.
  • Webfetch и fetch в Code Mode отклоняют URL с логином и паролем, игнорируют #fragment при сверке с правилами доступа, а fetch проверяет по правилам каждый редирект.
  • Перед вызовом модели OpenCode до 2 секунд ждёт MCP-серверы, которые ещё подключаются, чтобы их инструменты попали в первый промпт.
  • Экспериментальная байт-кодовая виртуальная машина для Code Mode, по умолчанию выключена: experimental.codemode_vm: true или OPENCODE_FLAGS=codemode_vm.
  • Политика websearch.use для управляемых установок и прогрев сессий под TTL кэша провайдера (interval: "auto").
  • GUI-плагины могут добавлять темы и действия для блоков кода, на телефонах и планшетах кнопки композера переехали в док над клавиатурой.

Как OpenCode дошёл до этого релиза

2.2.6 вышла через неделю после трёх релизов подряд: все они вышли 30 октября по UTC, последний — в ночь на 31 октября по Москве, и Tproger разбирал их в сводке про кодинг-агентов. Коротко:

Версия Главное
2.2.3 Встроенный провайдер Claude Agent: OpenCode работает через логин и модели Claude Code. Ломающие изменения: TUI-плагинам нужен OpenTUI 0.8, политика integration.use больше не покрывает MCP, скиллы и плагины — для них появились mcp.use, skill.use, plugin.use
2.2.4 Терминалы в десктопе живут в сессии и переживают перезапуск сервера; экспериментальные артефакты (HTML и статика, которые агент публикует и обновляет); расписания работают под opencode serve
2.2.5 Горячие клавиши выбора worktree и базовой ветки; буфер компакции в процентах окна контекста ("compaction": { "buffer": "20%" }); MCP-серверы со stdio-сообщениями больше 10 МиБ больше не отключаются

Линия последовательная: 2.2.5 сделала worktree удобными в интерфейсе, 2.2.6 перенесла их в скриптовый запуск, а исправления MCP из 2.2.5 продолжились пулом подключений.

Как обновиться и кому это нужно

Версия 2.2.6 опубликована в npm как @opencode/cli; README проекта предлагает также установочный скрипт и Homebrew. Старый пакет opencode-ai в npm остался на ветке 1.x, ставить нужно новый:

        npm i -g @opencode/cli@latest
# или
curl -fsSL https://opencode.ai/v2/install | bash
# или (macOS и Linux)
brew install anomalyco/tap/opencode-v2
    

Пул заметно поможет, если вы держите открытыми несколько проектов с одинаковыми MCP-серверами, особенно тяжёлыми локальными. С одним проектом или со старыми серверами экономии на числе подключений не будет, а общее подключение всё равно ведёт себя иначе, например не объявляет серверу roots. Для CI полезнее всего связка -w --archived и обязательный таймаут. Похожие задачи с фоновыми субагентами решают и в Claude Code — например, недавно Anthropic перевела статусы субагентов на Haiku 5.5. Пулинг серверов на старых протоколах и кэш списка инструментов на диске остались за рамками этого изменения.

Источники

Комментарии

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ