Управление DADA Cloud из AI-агента (MCP)

Зачем это нужно

Управлять платформой словами. В DADA Cloud есть сервер Model Context Protocol (MCP), поэтому ассистент вроде Claude умеет создавать проекты, деплоить приложения, задавать переменные окружения, поднимать песочницы, заводить базы и домены и читать ваши логи — от вашего имени и под вашим логином. Вы просите обычным текстом («выкати этот образ и дай ему Postgres»), агент вызывает нужные инструменты платформы и отчитывается.

Сервер отдаёт 61 отобранный инструмент, взятый из того же API, которым пользуется веб-консоль. Это не весь API: список инструментов — allowlist, собранный так, чтобы агент нёс поверхность, о которой он реально способен рассуждать. Агент видит только те проекты, где у вашей учётки есть роль, и каждое действие авторизуется ровно так, как если бы вы нажали кнопку сами.

Адрес и вход

MCP-эндпоинтhttps://console.dada-tuda.ru/mcp
ТранспортStreamable HTTP
АутентификацияOAuth 2.0 (вход в браузере через DADA ID) или bearer-токен
OAuth client iddada-mcp — публичный, без client secret, callback только на localhost/127.0.0.1
Сервер авторизацииОпределяется автоматически (метаданные RFC 9728)

Запрос без токена возвращает 401 и заголовок WWW-Authenticate со ссылкой на документ метаданных. Это работающее рукопожатие, а не авария: клиент, соблюдающий спецификацию, прочитает его и сам откроет вход в браузере.

Подключение из Claude Code

Самый быстрый путь: ничего не вставлять, никаких ключей.

  1. Добавьте маркетплейс: `` /plugin marketplace add DadaDevelopment/dada-cloud-console ``
  2. Поставьте плагин: `` /plugin install dada-cloud@dada-cloud ``
  3. При первом использовании откроется браузер со входом в аккаунт DADA ID. Подтвердите — и инструменты готовы.

Плагин поднимает маленький локальный мост, который сам проходит обычный вход через браузер, так что вам не приходится держать в руках ни URL, ни client id, ни токен.

Подключение из Claude Desktop

  1. Settings → Connectors → Add custom connector.
  2. URL: https://console.dada-tuda.ru/mcp
  3. Откройте Advanced settings и укажите OAuth Client ID = dada-mcp. Поле Client Secret оставьте пустым.
  4. Сохраните. При первом использовании откроется браузер со входом через 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-appproject, name, image, portПодтверждает проект, создаёт приложение, задаёт переменные и опрашивает статус, пока приложение действительно не станет Healthy.
configure-envproject, app, varsСмотрит существующие ключи, применяет изменения по одному ключу, подтверждает раскат.
diagnose-appproject, 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 передан slugprojectId и 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; выпуск нового не отзывает старый.

Куда дальше