Перейти к содержимому

Артефакты

Артефакты обеспечивают хостинг статического HTML для результатов workflow. Загружайте HTML-контент (отчёты, дашборды, визуализации) и получайте публичные URL для распространения. Артефакты могут содержать JavaScript: каждый артефакт работает на собственном изолированном origin внутри песочницы (sandbox) без доступа к сети и обслуживается с панелью брендинга Moira.

  • Отчёты: Генерация аналитических отчётов с доступом по URL
  • Дашборды: Создание интерактивных HTML-дашбордов (JavaScript работает в странице)
  • Визуализации: Хостинг графиков и визуализаций данных со встроенными в HTML данными (без доступа к сети в рантайме)
  • Документация: Публикация сгенерированной документации
  • Превью: Демонстрация промежуточных результатов

MCP tool artifacts предоставляет 6 действий:

artifacts({ action: "upload", name: "report.html", content: "<html>...</html>" })
artifacts({ action: "update", uuid: "abc-123", content: "<html>...</html>" })
artifacts({ action: "delete", uuid: "abc-123" })
artifacts({ action: "list", limit: 10 })
artifacts({ action: "stats" })
artifacts({ action: "token", ttlMinutes: 60 })
ДействиеНазначение
uploadСоздать артефакт, получить URL
updateОбновить содержимое артефакта
deleteУдалить артефакт
listСписок артефактов с пагинацией
statsСтатистика использования квоты
tokenСгенерировать одноразовый токен

Создание нового HTML-артефакта. Артефакты доступны по адресу https://static.moira-mcp.com.

artifacts({
action: "upload",
name: "analysis-report.html",
content: "<html><body><h1>Отчёт</h1></body></html>"
})
→ {
uuid: "d0a925d6-7dd8-49ba-b90c-d03b43062d20",
url: "https://d0a925d6-7dd8-49ba-b90c-d03b43062d20.static.moira-mcp.com/",
name: "analysis-report.html",
size: 52,
expiresAt: "2024-03-01T10:00:00Z"
}

Опциональный executionId связывает артефакт с выполнением workflow.

Замена содержимого существующего артефакта:

artifacts({
action: "update",
uuid: "d0a925d6-7dd8-49ba-b90c-d03b43062d20",
content: "<html><body><h1>Обновлённый отчёт</h1></body></html>"
})

Получение списка артефактов с пагинацией:

artifacts({ action: "list", limit: 10, offset: 0 })
→ {
artifacts: [{
uuid: "d0a925d6-...",
url: "https://d0a925d6-....static.moira-mcp.com/",
name: "report.html",
size: 1024,
createdAt: "2024-01-15T10:00:00Z"
}],
total: 5
}
ЛимитЗначение
Макс. размер файла5 МБ
Всего хранилища100 МБ на юзера
Макс. артефактов50 на юзера
TTL по умолчанию30 дней

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

artifacts({ action: "stats" })
→ {
totalArtifacts: 5,
totalSize: 51200,
storageLimit: 104857600,
countLimit: 50,
storageUsedPercent: 0.05,
countUsedPercent: 10
}

Генерация одноразовых токенов для HTTP API загрузки. Полезно для CI/CD пайплайнов или внешних инструментов, которые не могут использовать MCP напрямую.

artifacts({ action: "token", ttlMinutes: 30 })
→ {
token: "xyz-789",
expiresAt: "2024-01-15T10:30:00Z",
uploadUrl: "https://{MOIRA_HOST}/api/public/artifacts/upload/xyz-789"
}

Загрузка через HTTP:

Окно терминала
curl -X POST "https://{MOIRA_HOST}/api/public/artifacts/upload/xyz-789" \
-H "Content-Type: application/json" \
-d '{"name": "report.html", "content": "<html>...</html>"}'

Токены одноразовые и истекают после указанного TTL.

Артефакты могут содержать JavaScript, поэтому каждый изолируется на нескольких уровнях:

  • Отдельный origin — каждый артефакт обслуживается на собственном поддомене ({uuid}.{STATIC_DOMAIN}), поэтому браузер изолирует storage, cookies и Service Workers между артефактами. Это единственный способ отдачи контента — доступа по пути нет; запрос без поддомена артефакта не отдаёт контент. (В локальной разработке это работает по HTTP через *.localhost, который браузеры резолвят в loopback без сертификата.)
  • Песочница (sandbox) — контент артефакта работает внутри <iframe sandbox="allow-scripts"> (без allow-same-origin, без форм, без навигации верхнего уровня, без popup) на странице-обёртке под контролем Moira. Скрипты выполняются, но не могут добраться до обёртки.
  • Нет доступа к сети — фрейм артефакта обслуживается с connect-src 'none', поэтому JavaScript не может выполнять fetch/XHR/WebSocket. Данные нельзя никуда отправить; визуализации должны встраивать данные прямо в HTML.
  • Предупреждение при первом визите — зрители видят промежуточный экран о том, что контент создан пользователем и не одобрен Moira, перед показом артефакта.
ЗащитаЗначение
CSP фреймаскрипты разрешены; connect-src 'none', form-action 'none', base-uri 'none'
Sandbox фрейматолько allow-scripts
X-Content-Type-Optionsnosniff
Изоляция originотдельный поддомен на артефакт

Каждый артефакт показывается на странице-обёртке с фиксированной нижней панелью:

  • Атрибуция — ссылка «Created with Moira». Поскольку футер находится в обёртке (отдельный документ от артефакта), контент артефакта не может его перекрыть или удалить.
  • Жалоба — ссылка «Report» позволяет зрителям пожаловаться на вредоносный контент для проверки. Уведомление получают администраторы (у кого настроен Telegram в настройках).

Обёртка (предупреждение при первом открытии и футер) отображается на английском или русском языке в зависимости от языка браузера зрителя, с переключателем EN/RU в правом нижнем углу. Это касается только обёртки Moira, но не самого контента артефакта.

Вредоносные артефакты могут быть заблокированы администраторами, после чего они немедленно перестают обслуживаться.

Используйте артефакты с паттерном workspace для организации результатов workflow:

./project-analysis/
├── step-1/
│ └── data-collection.md
├── step-2/
│ └── analysis.md
└── artifacts/
├── dashboard.html # → загрузить как артефакт
└── summary-report.html # → загрузить как артефакт

Передайте executionId при загрузке для связи артефактов с выполнением workflow:

artifacts({
action: "upload",
name: "execution-report.html",
content: "...",
executionId: "exec-abc-123"
})

Связанные артефакты отображаются в UI инспектора выполнений.

Артефакты управляются через веб-интерфейс на странице /app/artifacts:

  • Просмотр всех артефактов с именем, размером, URL и датой истечения
  • Загрузка новых артефактов с HTML-редактором
  • Редактирование содержимого существующих артефактов
  • Копирование публичного URL в буфер обмена
  • Открытие артефактов в новой вкладке
  • Удаление артефактов
  • Мониторинг использования квоты с визуальным индикатором