MCP — генерация видео для AI-агентов

Remote-HTTP MCP-сервер: AI-агент сам собирает слайды, запускает рендер и получает готовый MP4. Тот же контракт слайдов, что и у REST API.

Доступ

MCP доступен на тарифах Pro и Plus. Пользователям на тарифе Base ключи не выдаются. До 100 слайдов и 10 000 символов на слайд.

  • Endpoint: https://reeltype.ru/mcp/video — Streamable HTTP, только POST.
  • Протокол: 2025-11-25. Отдельный initialize не нужен — один tools/call уже валиден.
  • Сервер не хранит сессии: каждый вызов читает состояние из базы.

Аутентификация

  1. Откройте Профиль → Интеграции.
  2. Нажмите Создать MCP-ключ и скопируйте токен — он показывается один раз.
  3. Передавайте токен в заголовке каждого запроса.
Authorization: Bearer <MCP-токен>

MCP-ключ один на пользователя, не привязан к домену и работает только с MCP. REST-ключи для MCP не подходят (и наоборот).

Подключение клиента

Клиенты с поддержкой remote-HTTP подключаются по URL и заголовку:

{
  "mcpServers": {
    "video": {
      "type": "http",
      "url": "https://reeltype.ru/mcp/video",
      "headers": { "Authorization": "Bearer <MCP-токен>" }
    }
  }
}

Проверка через инспектор из репозитория:

php artisan mcp:inspector mcp/video \
  --header="Authorization: Bearer <MCP-токен>"

Инструменты

  • generate_video — создать видео из спецификации слайдов или пересобрать существующий проект. Возвращается сразу со статусом pending.
  • get_render_status — статус, прогресс, ссылка на видео и подсказка опроса retry_after_seconds.
  • list_projects / get_project — проекты и их сохранённая спецификация.
  • list_videos / get_video — готовые версии видео и срок их хранения.
  • upload_image — принять картинку по https-URL или base64 и вернуть непрозрачную ссылку для поля слайда.
  • upload_music — принять фоновую музыку по https-URL или base64 и вернуть ссылку для defaults.default_music_track.
  • upload_audio — принять озвучку слайда по https-URL или base64 и вернуть ссылку для slides[].slide_audio; нужен consent: true.

Рабочий процесс

  1. Агент собирает слайды и вызывает generate_video — ответ приходит сразу, рендер идёт в фоне.
  2. Агент опрашивает get_render_status каждые retry_after_seconds секунд (10, пока рендер активен).
  3. Когда retry_after_seconds стал 0 — рендер завершён: при успехе отдайте пользователю video_url, при сбое — error.

Рендер завершается независимо от опроса. Результат всегда доступен через get_project и list_videos — опрос сокращает задержку, а не гарантирует результат.

Картинки для слайдов

Фото-слайд — это слайд с картинкой (slide_background_image) и необязательным текстом. Загрузка отдельным инструментом:

{ "name": "upload_image", "arguments": { "url": "https://example.com/photo.jpg" } }

Ответ: { "reference": "..." }. Передайте значение reference в поле slides[].slide_background_image при вызове generate_video.

  • По url — только https; приватные, петлевые и служебные адреса отклоняются.
  • По base64 — байты файла, допускается префикс data:.
  • Форматы: jpeg, png, gif, webp; до 10 МБ.

Озвучка слайдов

Запись голоса загружается отдельным инструментом и привязывается к слайду полем slides[].slide_audio:

{ "name": "upload_audio", "arguments": { "url": "https://example.com/voice.mp3", "consent": true } }

Ответ: { "reference": "...", "duration_seconds": 12.34 }. Передайте значение reference в поле slides[].slide_audio при вызове generate_video; сырые пути хранилища не принимаются.

  • По url — только https; приватные, петлевые и служебные адреса отклоняются.
  • По base64 — байты файла, допускается префикс data:.
  • Форматы: mp3, m4a, aac, ogg, webm, wav; до 20 МБ и 5 минут. Сервер нормализует запись в MP3.
  • consent: true обязателен: это ваш голос или у вас есть согласие человека, чей голос записан. Без него — consent_required.
  • На слайде с записью TTS не используется; длительность ролика подстраивается под озвучку.

Ошибки

Ошибка инструмента приходит с HTTP 200 и флагом isError: true:

{ "code": "validation_failed", "message": "Unknown field \"slides[0].duration\".", "field": "slides[0].duration" }
  • validation_failed — невалидная спецификация, лишнее поле, неподходящая картинка или аудио.
  • not_found — проект/видео не найдены или принадлежат другому пользователю.
  • render_rejected — рендер этого проекта уже выполняется.
  • fetch_failed — картинку или аудио не удалось получить по URL.
  • consent_required — для озвучки не передан consent: true.
  • rate_limited — слишком много одновременных обработок аудио; повторите через retry_after секунд.
  • internal_error — внутренний сбой.
  • 401 — нет/неверный ключ или тариф ниже Pro. 429 — превышен лимит запросов.

Лимиты

60 запросов в минуту на пользователя. При превышении — 429.