← В пространство

My HOLST · API и MCP

Создайте ключ в «Инструменты для ИИ». Все запросы требуют Authorization: Bearer KEY. Ключ имеет права создавшего его преподавателя. Ключ можно отозвать в интерфейсе.

MCP Streamable HTTP

URL: https://my-holst.slk-soft.ru/mcp
Authorization: Bearer KEY
Transport: HTTP (JSON responses)
Tools: list_boards, create_board, get_board, upsert_objects,
get_board_history, undo_board_change, redo_board_change,
list_library_objects, get_library_object, save_library_object, insert_library_object, arrange_board_objects

REST API

Метод Адрес Назначение
GET /api/boards Доступные доски
POST /api/boards {"title":"Урок 1"}
GET /api/boards/:id Объекты и метаданные
POST /api/boards/:id/objects Добавить/изменить объекты
DELETE /api/boards/:id/objects/:object Удалить объект
POST /api/boards/:id/assets multipart/form-data, поле file, до 200 МБ
POST /api/boards/:id/invites {"role":"student"} → ссылка на 7 дней
GET /api/boards/:id/export?format=zip Полная доска с материалами
POST /api/import multipart file: JSON или ZIP

Пример добавления материала

{
  "objects": [{
    "id": "question-1", "type": "textbox",
    "left": 150, "top": 100, "width": 500,
    "text": "Почему небо голубое?",
    "fontSize": 32, "fill": "#49376b", "fontFamily": "Arial"
  }, {
    "id": "quiz-1", "type": "rect",
    "left": 150, "top": 250, "width": 300, "height": 160,
    "fill": "#e0ebdf",
    "quiz": {
      "question": "Сколько будет 2 + 2?",
      "answers": ["3", "4", "5"], "correct": 1
    }
  }]
}

Формат объектов — Fabric.js 7. Уникальный id обязателен. Разрешены text, i-text, textbox, rect, circle, ellipse, triangle, line, path, polygon, polyline, image, group. Изображения должны ссылаться на материалы этой доски через /api/assets/:id. Изменения API сразу передаются участникам по WebSocket.

Отмена и повтор

GET /api/boards/:id/history возвращает canUndo, canRedo, undoBlocked, redoBlocked. POST /api/boards/:id/undo и POST /api/boards/:id/redo с пустым JSON отменяют/повторяют действие текущего аккаунта. При конфликте с более поздней чужой правкой — HTTP 409, без изменения доски. Последние 200 действий на доске сохраняются на сервере. Новая правка сбрасывает собственный redo.

POST /api/boards/:id/changes принимает {"objects": [...], "ids": ["удаляемый-id"]}. Добавления/изменения и удаления выполняются одной транзакцией и одним шагом истории. Один id нельзя одновременно изменять и удалять. Опциональный groupKey объединяет последовательные изменения тех же объектов в пределах 1,5 секунды (для набора текста и ползунков). REST и MCP используют общую историю аккаунта.

Оформление и библиотека

Прямоугольники используют rx/ry (радиус по осям, неотрицательные числа). Любой объект/группа может иметь shadow: {"color":"rgba(30,20,50,0.25)","blur":16,"offsetX":6,"offsetY":8}. Размытие 0–300, смещения от −10000 до 10000. Параметры входят в историю и экспорт.

GET /api/library?q=название&offset=0 — личные объекты, до 40 за страницу; ответ {items,total}. GET /api/library?trash=1 — корзина. POST /api/library с {boardId,name,object,preview?} сохраняет объект/группу и независимые копии материалов исходной доски. preview — опциональная строка data:image/png;base64,… до 200000 символов.

GET /api/library/:id — полный объект. PATCH /api/library/:id с {name} — переименовать. DELETE /api/library/:id — в корзину, POST /api/library/:id/restore — восстановить. POST /api/library/:id/insert с {boardId,left?,top?} — добавить новую независимую копию на доску с новыми id. Эта операция поддерживает undo/redo и немедленно видна участникам. Сохранение и изменение библиотеки доступны только её владельцу. Библиотечные материалы нельзя напрямую вставить в JSON доски: используйте insert.

Настройки совместной работы

GET /api/preferences — настройки текущего аккаунта: hideCursor (false), shareDragging (true), showDragging (true), revision. PATCH /api/preferences принимает частичный объект с этими тремя логическими параметрами (без revision). Настройки не меняют содержимое досок и синхронизируются с подключёнными сессиями аккаунта.

WebSocket /ws?board=:id принимает временные пакеты {"type":"transform","objects":[{"id":"object-id","matrix":[1,0,0,1,250,300]}]}: матрица Fabric.js задаёт мировую трансформацию объекта, включая центр. Рекомендуется не более 20 кадров/с. Для удержания неподвижного объекта во время жеста — повтор последнего кадра раз в секунду. {"type":"transform-end"} завершает превью без сохранения; итог нужно сохранить обычным upsert/change. Превью не входит в историю, GET/экспорт доски возвращают сохранённые объекты. Сервер завершает оставленные превью после 4 секунд без обновлений и при отключении участника.

Порядок слоёв и выравнивание

POST /api/boards/:id/arrange принимает {"ids":["a","b"],"action":"front"}. Действия: front — на передний план, back — на задний, forward — на один слой выше, backward — на один ниже. Сервер сохраняет относительный порядок выделенных объектов и меняет z по актуальной доске. Ответ {ok,changed,history}; операция без изменения не создаёт шаг истории. Опциональный requestId (до 100 символов) возвращается в событии upsert для синхронизации интерфейса. MCP: arrange_board_objects с boardId, ids, action.

Выравнивание в интерфейсе использует геометрические границы объектов после поворота и масштаба: left, centerX, right, top, centerY, bottom. Границы выделения — ориентир по умолчанию; можно выбрать видимую область холста. Распределение по X/Y уравнивает промежутки с учётом размеров объектов, сохраняя внешние границы набора. Для агентов геометрия доступна в /layout.js; итоговые координаты можно отправлять одним upsert_objects.

Расширения

Объекты могут хранить метаданные quiz и media. Для новых игр добавляйте типизированные метаданные, обработчик в клиенте и серверную проверку. Пользовательский HTML и JavaScript не исполняются. Текущая модель совместной работы — атомарное обновление объекта, при одновременной правке одного объекта сохраняется последнее принятое изменение.