Управление DADA Cloud из AI-агента (MCP)
Зачем это нужно
Управлять платформой словами. В DADA Cloud есть сервер Model Context Protocol (MCP), поэтому ассистент вроде Claude умеет создавать проекты, деплоить приложения, задавать переменные окружения, поднимать песочницы, заводить базы и домены и читать ваши логи — от вашего имени и под вашим логином. Вы просите обычным текстом («выкати этот образ и дай ему Postgres»), агент вызывает нужные инструменты платформы и отчитывается.
Сервер отдаёт 61 отобранный инструмент, взятый из того же API, которым пользуется веб-консоль. Это не весь API: список инструментов — allowlist, собранный так, чтобы агент нёс поверхность, о которой он реально способен рассуждать. Агент видит только те проекты, где у вашей учётки есть роль, и каждое действие авторизуется ровно так, как если бы вы нажали кнопку сами.
- Все инструменты и аргументы: справочник инструментов MCP
- Разобранные сценарии целиком: рецепты MCP
Адрес и вход
| MCP-эндпоинт | https://console.dada-tuda.ru/mcp |
| Транспорт | Streamable HTTP |
| Аутентификация | OAuth 2.0 (вход в браузере через DADA ID) или bearer-токен |
| OAuth client id | dada-mcp — публичный, без client secret, callback только на localhost/127.0.0.1 |
| Сервер авторизации | Определяется автоматически (метаданные RFC 9728) |
Запрос без токена возвращает 401 и заголовок WWW-Authenticate со ссылкой на документ метаданных. Это работающее рукопожатие, а не авария: клиент, соблюдающий спецификацию, прочитает его и сам откроет вход в браузере.
Подключение из Claude Code
Самый быстрый путь: ничего не вставлять, никаких ключей.
- Добавьте маркетплейс: ``
/plugin marketplace add DadaDevelopment/dada-cloud-console`` - Поставьте плагин: ``
/plugin install dada-cloud@dada-cloud`` - При первом использовании откроется браузер со входом в аккаунт DADA ID. Подтвердите — и инструменты готовы.
Плагин поднимает маленький локальный мост, который сам проходит обычный вход через браузер, так что вам не приходится держать в руках ни URL, ни client id, ни токен.
Подключение из Claude Desktop
- Settings → Connectors → Add custom connector.
- URL:
https://console.dada-tuda.ru/mcp - Откройте Advanced settings и укажите OAuth Client ID =
dada-mcp. Поле Client Secret оставьте пустым. - Сохраните. При первом использовании откроется браузер со входом через DADA ID.
Подключение из Cursor, Windsurf и любого другого MCP-клиента
Направьте клиент на https://console.dada-tuda.ru/mcp по Streamable HTTP.
Клиент, который работает на вашей машине и принимает OAuth-callback на http://localhost:<порт> или http://127.0.0.1:<порт>, может статически указать client id dada-mcp (публичный, без секрета). Такие loopback-callback разрешены на любом порту, поэтому пин работает с любого ноутбука и никому ничего регистрировать не нужно.
Не указывайте dada-mcp в агенте, который живёт на сервере. Хостируемый агент (self-hosted шлюз, удалённый harness — всё, у чего callback это https-адрес на вашем хосте) присылает redirect URI, которого нет в белом списке, и DADA ID отвергает вход с invalid_redirect_uri ещё до страницы логина. Dynamic Client Registration на DADA ID тоже закрыт, так что зарегистрировать свой callback клиент пока не может. До тех пор серверный агент аутентифицируется bearer-токеном:
Authorization: Bearer <your-token>
Тот же заголовок — ответ и для клиента, который вообще не умеет вход через браузер.
Чтобы убедиться, что сервер доступен, прежде чем винить клиент, запросите документ discovery. Он отдаётся без всяких учёток:
curl -sS https://console.dada-tuda.ru/.well-known/oauth-protected-resource
{"resource":"https://console.dada-tuda.ru/mcp",
"authorization_servers":["https://id.dada-tuda.ru/realms/master"],
"scopes_supported":["openid","profile","email","offline_access",
"read","builds:read","builds:write","deploy:write"],
"bearer_methods_supported":["header"]}
401 от самого эндпоинта с заголовком WWW-Authenticate: Bearer resource_metadata="…" — то же самое рукопожатие с другой стороны. И то и другое означает, что сервер жив.
Что агент получает кроме инструментов
Сервер отдаёт и две другие половины MCP, которые хорошие клиенты показывают в интерфейсе.
Prompts — сценарии-раннбуки с аргументами: они проводят агента по многошаговому потоку вместо того, чтобы он импровизировал.
| Prompt | Аргументы | Что делает |
|---|---|---|
deploy-app | project, name, image, port | Подтверждает проект, создаёт приложение, задаёт переменные и опрашивает статус, пока приложение действительно не станет Healthy. |
configure-env | project, app, vars | Смотрит существующие ключи, применяет изменения по одному ключу, подтверждает раскат. |
diagnose-app | project, app | Читает фазу, тянет логи, проверяет последнюю сборку и объясняет причину, ничего не меняя. |
Resources — справочный материал только на чтение, который агент подтягивает для опоры.
| Ресурс | Что это |
|---|---|
dada://guide/getting-started | Как платформа моделирует приложения, переменные, домены и асинхронные операции. |
dada://reference/tools | Живой индекс инструментов с однострочными описаниями. |
dada://reference/openapi.json | Полный документ OpenAPI, из которого сгенерированы инструменты. |
Права и безопасность
- Агент действует от вашего имени. Он трогает только проекты, где у вашей учётки есть роль, а на запись всё равно нужна подходящая роль — ровно как в консоли. Никакой сервисной личности и никакого повышения прав.
- Два инструмента помечены как разрушающие (
deleteBox,deleteEnvVar), ещё двадцать — как «только чтение». Клиенты, уважающие эти подсказки, спросят подтверждение перед разрушающим вызовом. - Удалить приложение, базу или проект с поверхности агента нельзя — намеренно.
- Секретные значения переменных не читаются обратно.
listEnvVarsих маскирует. - Агент не выполняет команды внутри вашей песочницы. Box отдаёт собственный локальный MCP-эндпоинт, который вы добавляете в клиент вторым сервером, поэтому ни ваш код, ни ваши модельные ключи не проходят через наш API.
- Раскрытие учётных данных пишется в аудит.
getDatabaseCredentialsтребует явногоreveal=trueи фиксирует каждый вызов.
Что делать, когда не работает
| Симптом | Причина | Как чинить |
|---|---|---|
401 от эндпоинта, окно входа не появляется | Клиент не делает OAuth discovery | Задайте OAuth client id dada-mcp руками или передайте bearer-токен |
invalid_redirect_uri ещё до страницы входа | Клиент указал dada-mcp, но его callback не loopback — обычно это агент на сервере | Для dada-mcp в белом списке только loopback-callback; из хостируемого агента ходите bearer-токеном |
invalid_scope ещё до страницы входа | Клиент запросил scope, которые публичный клиент выдать не может | Убедитесь, что клиент читает метаданные защищённого ресурса, а не полный список scope сервера авторизации |
| Инструменты видны, но каждый вызов даёт 404 | В projectId передан slug | projectId и envId — UUID: сперва listProjects, потом getProject |
missing required path parameter "envId" | Никто не подставил id окружения | getProject возвращает окружения проекта вместе с их id |
| Операция Committed, но ничего не запущено | Committed значит «записано», а не «поднялось» | Опрашивайте listApps на фазу приложения; если Healthy не наступает, зовите searchLogs |
getDatabaseCredentials отдаёт 404 | База ещё создаётся, секрета пока нет | Опрашивайте listDatabases, пока фаза не станет готовой, потом повторите |
| Сессия отваливается через некоторое время | Access-токены короткоживущие | Вход через браузер обновляет их сам; повторите вход, если клиент потерял refresh-токен |
| Нужного действия нет | Оно не в allowlist | Проверьте справочник инструментов — в REST API оно всё ещё есть |
Подводные камни
- Входите тем же аккаунтом DADA ID, которым пользуетесь в консоли на
console.dada-tuda.ru. - Деплои и прочие изменения асинхронны. Агент получает операцию для наблюдения и обязан убедиться, что приложение стало Healthy, прежде чем объявлять успех.
- Одноразовый сессионный токен
dadabox_, который отдаёт box, показывается ровно один раз и не извлекается обратно: хранится только его хеш. Потеряли — выпустите новый черезgetBoxConnection; выпуск нового не отзывает старый.
Куда дальше
- Рецепты MCP — готовые последовательности вызовов.
- Справочник инструментов MCP — все аргументы (на английском).