Коротко
- MCP Apps — это мост для отображения HTML-вью от MCP-сервера в песочнице. Без явного opt-in они не запустятся.
- Команда
openclaw config set mcp.apps.enabled true --strict-jsonплюс перезапуск Gateway включают Apps. - Совместимое приложение умеет прикреплять выбранное к следующему сообщению ассистента, показывать формы и открывать файлы воркспейса в просмотрщике или редакторе.
- Под капотом отдельный origin на порту 18790, двойной iframe-прокси и CSP. Обычные правила разрешений продолжают работать.
Сверено с документацией OpenClaw 2026.10.1, 11 октября 2026.
MCP-сервер отдаёт инструменты и ресурсы, это знакомо. Совместимое MCP-приложение идёт дальше. Оно показывает рядом с чатом HTML-вью, поддерживает формы, открывает поддержанные файлы воркспейса в просмотрщике или редакторе. Главное отличие: выбранное содержимое прикрепляется к следующему сообщению агенту. Работает это только при явном opt-in, ведь HTML приходит от MCP-сервера. Apps по умолчанию выключены. Ниже рецепт включения.
Как устроен мост Apps
- OpenClaw стартует отдельный HTTP(S)-слушатель только для песочницы на порту Gateway плюс один (для стандартного Gateway — 18790).
- Control UI грузит Apps с этого отдельного origin. Сам Control UI и авторизованные маршруты Gateway оттуда не отдаются.
- OpenClaw рекламирует расширение
io.modelcontextprotocol/uiтолько когда Apps включены. - Рендерятся только ресурсы
ui://с точным MIMEtext/html;profile=mcp-app. Лимит 2 MiB, двойной iframe-прокси, CSP из метаданных ресурса. - Каждое представление App живёт в ограниченной десятиминутной аренде состояния в памяти (in-memory view lease). HTML, аргументы и сырые ответы инструментов на диск не пишутся. В превью транскрипта попадает только ограниченный дескриптор server/tool/resource, привязанный к исходному ID вызова инструмента.
Как включить и подключить приложение
openclaw config set mcp.apps.enabled true --strict-json
- Включите хост-мост командой выше и перезапустите Gateway.
- Если перед Control UI стоит обратный прокси или терминатор TLS, выделите Apps отдельный публичный origin и пробросьте его на слушатель песочницы 18790:
{
mcp: {
apps: {
enabled: true,
sandboxOrigin: "https://mcp-apps.example.com",
sandboxPort: 18790,
},
},
}
Origin Apps должен отличаться от origin Control UI. На нём нельзя держать другой авторизованный или чувствительный контент.
Добавьте сервер с поддержкой MCP Apps. Официальное базовое React-демо:
{
mcp: {
apps: { enabled: true },
servers: {
"basic-react": {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-basic-react", "--stdio"],
},
},
},
}
Как выбранное попадает в сообщение агенту
- Прикрепите содержимое из приложения: текст, изображения и ресурсы из текущего выбора.
- Следующий ход ассистента использует эти вложения и очищает чипы композера. Удаление позиции обновляет и само приложение.
- Метаданные презентации в модель не идут. Контент от приложения остаётся данными беседы, а не системной инструкцией.
- Перед отправкой App показывает превью. В строке подтверждения в панели App вы нажимаете «Отправить» или «Отмена».
- В каналах успешное App-представление добавляет к финальному ответу ассистента одно действие «Открыть приложение». Telegram DM показывает нативную Mini App-кнопку. Slack и Discord показывают ту же переносимую ссылку. Остальные каналы добавляют понятную HTTPS-ссылку к тексту ответа.
Формы и работа с файлами воркспейса
- Поддержанные приложения показывают формы рядом с чатом. Если App работает через нативный Codex, интерактивным формам нужен режим с подтверждениями (Guarded или Workspace).
- За один сервер и одну беседу активен ровно один нативный вызов App-инструмента. Дождитесь завершения, прежде чем запускать следующий.
- Лимиты на каждое представление: 4 одновременных запроса, 120 запросов в минуту, 30 вызовов инструментов в минуту. На это же тратятся фоновые превью.
- App может запросить объявленный просмотрщик для поддержанного файла и получает непрозрачный URI ресурса, а не полный доступ к диску. Чтение, подписки и сохранение проверяют текущую сессию и запрашивающую сторону.
- Сохранение может нести ETag в
ifMatch. Тогда сервер сообщит о конфликте, если версия устарела. БезifMatchсохранение выполняется безусловно, то есть побеждает последний писатель.
Как проверить, что заработало
- Перезапустите Gateway после
openclaw config set mcp.apps.enabled true --strict-json. - Откройте
/settings/mcpв Control UI и убедитесь, что сервер виден в списке. Сводные карточки показывают общее число серверов, число включённых, OAuth и фильтрованных. - Вызовите точку входа приложения (глобальную или для треда) и дождитесь, пока приложение отрисуется в панели.
- Выберите что-то в приложении: выбор появится чипами в композере. Отправьте обычное сообщение — ответ ассистента должен учесть вложение, а чипы исчезнут. Если приложение само предлагает отправить сообщение, проверьте превью и нажмите Send в полосе подтверждения.
- Откройте поддерживаемый файл воркспейса через просмотрщик приложения, отредактируйте и сохраните. По документации App должен слать ETag из последнего чтения, чтобы защититься от устаревшего сохранения.
Где ломается и когда не применять
- Сервер не помечен как совместимый с MCP Apps. Без точного MIME
text/html;profile=mcp-appресурс не отрендерится. - Origin Apps совпадает с Control UI или на нём лежит авторизованный или чувствительный контент. Нарушено требование изоляции.
- Reverse proxy пробрасывает Apps на тот же публичный origin, что и Control UI, или шлёт их на основной порт Gateway вместо 18790.
- App пытается вызвать инструмент до того, как представление открыто. Для таких вызовов работают только «Разрешить один раз» (Allow once) и «Отклонить» (Deny). Режим «Разрешить, пока открыто это представление» (
Allow while this App is open) недоступен. - Сессия Codex в режиме Full access: он соответствует нативной политике
never, и Codex отклоняет формы ещё до OpenClaw. Для интерактивных форм выберите Guarded или Workspace. - App запрашивает геолокацию, камеру или микрофон. Разрешения для документов на непрозрачном origin (opaque-origin) не выдаются. Успешное MCP-соединение таких прав не даёт.
- Ссылка запуска в канале нужна, но Gateway не опубликован через Tailscale. В режиме
gateway.tailscale.mode: "serve"ссылка откроется только внутри tailnet; для доступа из интернета нужен управляемый режим"funnel"с паролем. - После перезапуска Gateway Control UI не сможет сразу вызывать инструменты из пересобранного превью. Нужно отправить новое сообщение для восстановления полномочий.