underlayer
Build and ship in-product training from your AI assistant.
Что умеет
- List Courses: Lists every course in the workspace, newest first.
- Get Course: Fetches one course by id.
- Create Course: Creates a draft course. Screens follow the builder's shape — each has an id, title, and an array of blocks.
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
Build and ship in-product training from your AI assistant. Underlayer is training you embed in your own product: an API, one iframe, and a player that looks like part of your app.
With this server, Claude, Cursor and other MCP clients can create and edit courses screen by screen, generate them from a prompt or document, translate them, publish them, and read back who completed them and how they scored. Also covers learners, certificates, collections, themes, webhooks and SCORM export.
Sign in with OAuth, no key to paste. Free sandbox with 500 course views a month.
Как подключить
Как подключить underlayer к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://underlayer--underlayerhq.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить underlayer к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://underlayer--underlayerhq.run.tools
- Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
- Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
- Откройте Настройки → Коннекторы и нажмите Создать (Create).
- Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
- В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
- В новом чате откройте + → Приложения/Коннекторы и включите коннектор.
Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.
Авторизация
При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить underlayer к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://underlayer--underlayerhq.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (60)
Технические названия из tools/list. Нужны только разработчикам.
| list_courses | Lists every course in the workspace, newest first. |
| get_course | Fetches one course by id. |
| create_course | Creates a draft course. Screens follow the builder's shape — each has an id, title, and an array of blocks. |
| update_course | Partially updates a course by id. Every field besides id is optional — send only what changes. |
| delete_course | Deletes a course by id. |
| list_themes | Lists every theme in the workspace. Requires the Scale plan or higher. |
| get_theme | Fetches one theme by id. Requires the Scale plan or higher. |
| create_theme | Creates a theme — the look every course assigned to it inherits, live. tokens.concept picks the design (stage, editorial, console, bright, calm, workbench, conversation), which carries the palette, the type pairing, the shapes and the chrome; every other token overrides part of it and anything omitted stays the concept's own. tokens.mode is light, dark or auto (follow the learner), with palette and darkPalette holding the overrides for each. Requires the Scale plan or higher. |
| update_theme | Partially updates a theme by id. Requires the Scale plan or higher. |
| delete_theme | Deletes a theme by id. Courses assigned to it fall back to no theme. Requires the Scale plan or higher. |
| list_collections | Lists every collection in the workspace. |
| get_collection | Fetches one collection, including its courses in display order. |
| create_collection | Creates a collection. |
| update_collection | Renames or updates a collection's description. |
| delete_collection | Deletes a collection. |
| add_course_to_collection | Adds a course to the end of a collection. |
| move_course_in_collection | Moves a course one position earlier (-1) or later (1) in a collection. |
| remove_course_from_collection | Removes a course from a collection (the course itself isn't deleted). |
| list_translations | Lists every locale translated for a course. Requires the Scale plan or higher. |
| get_translation | Fetches one locale's translated fields. Requires the Scale plan or higher. |
| create_translation | Starts a new (initially empty) locale for a course. Requires the Scale plan or higher. |
| update_translation | Merges the given path/value pairs into a locale's content — an empty string value clears that path back to the source-language fallback. Requires the Scale plan or higher. |
| delete_translation | Deletes a locale entirely. Requires the Scale plan or higher. |
| list_webhooks | Lists every webhook endpoint in the workspace. |
| get_webhook | Fetches one webhook endpoint by id (no secret included). |
| create_webhook | Registers a webhook endpoint. The response's signingSecret is shown once — store it immediately, it can't be retrieved again. |
| update_webhook | Updates a webhook's URL, subscribed events, or active state. Every field besides id is optional. |
| delete_webhook | Deletes a webhook endpoint. |
| list_identities | Lists learners, newest first. Takes limit (default 50, no maximum), offset, and search — which matches name, email or external id. |
| get_identity | Fetches one identity by id. |
| upsert_identity | Upserts a learner by externalId — call this every time you know who the learner is, as often as you like. |
| bulk_upsert_identities | Creates or updates up to 500 learners in one call. Upsert by externalId, so re-sending a list that is mostly already here adds only what is new. Returns how many were created versus updated. |
| bulk_delete_identities | Deletes up to 500 learners in one call, by our ids or by your own externalIds. Reports what was actually removed, which can be fewer than asked for if some were already gone. |
| delete_identity | Deletes a learner identity. |
| list_block_types | Every block type a screen can contain, with the fields each one reads. Call this before writing screens rather than guessing field names — a block with the wrong keys saves cleanly and then renders empty. |
| list_screen_templates | Ready-made screen layouts, by family: present, interact, assess. Pass a key to add_screen to start from one. Templates carry structure, not copy — every block arrives empty. |
| add_screen | Appends a screen to a course, optionally seeded from a template (see list_screen_templates). Returns the created screen, including the ids you'll need to fill its blocks in with update_screen. |
| update_screen | Replaces one screen's title and/or blocks, leaving every other screen untouched. Prefer this over update_course for editing content — it reads and writes a single screen rather than the whole array, so a concurrent edit elsewhere in the course isn't overwritten. |
| add_block | Appends one block at its defaults to a screen, with a fresh id — the quick path when you only want to add something rather than restate the whole screen. Fill it in afterwards with update_screen. |
| duplicate_screen | Copies a screen in directly after the original. Every block gets a new id, so the copy is independent of the original in the player. |
| delete_screen | Removes a screen from a course. The learner answers already recorded against it are not deleted. |
| reorder_screens | Sets the screen order for a course. Send every screen id exactly once — a partial list is rejected rather than applied, since silently dropping the screens you left out is the one outcome nobody wants. |
| generate_course | Starts writing a draft course from a prompt, optionally grounded in a URL. Returns a job id immediately — writing takes tens of seconds — then poll get_generation until status is completed or failed. Requires the Build plan or higher. |
| get_generation | Fetches a generation job. Poll until status is `completed` (with a courseId) or `failed` (with an error). Requires the Build plan or higher. |
| export_scorm | Builds a SCORM package for a course and returns the .zip base64-encoded. For bulk migration prefer GET /api/v1/courses/:id/scorm, which streams the zip instead. Requires the Scale plan or higher. |
| import_scorm | Creates a draft course from a base64-encoded SCORM .zip. A package Underlayer exported is restored exactly; one from another tool arrives salvaged — outline, readable text, and any quiz data that could be read — with warnings saying what didn't come across. For bulk migration prefer POST /api/v1/courses/import/scorm. Requires the Scale plan or higher. |
| list_certificates | Lists certificate templates — the design of the PDF a learner gets on passing: issuer, logo, wording, colors, border and orientation. Not the certificates issued to learners; those are list_issued_certificates. Requires the Scale plan or higher. |
| get_certificate | Fetches one certificate template by id. Requires the Scale plan or higher. |
| create_certificate | Creates a certificate template. Every tokens field is optional and falls back to the default design; an empty issuerName uses the workspace name. logoUrl must be a PNG or JPEG — a PDF cannot embed SVG or WebP. Composition: layout picks one of centred/left/minimal/sealed, order rearranges the centre stack, and freeform:true places every element from positions instead — fractions of the page inside its margin, x being the element's centre, y its top, w its width. Requires the Scale plan or higher. |
| update_certificate | Updates a certificate template. Sending tokens replaces the design wholesale — send the full object, not just changed keys. Requires the Scale plan or higher. |
| delete_certificate | Deletes a certificate template. Courses using it fall back to the built-in default design and keep issuing certificates. Requires the Scale plan or higher. |
| list_completions | Lists learner runs — one per learner per course, in progress or completed, with score, pass/fail and how far through they are. Filter by course, learner or status. |
| get_completion | Fetches one learner run by id, including the answers they gave, keyed by block id. |
| list_issued_certificates | Lists certificates this workspace has actually issued, with the public serial printed on each one. Distinct from list_certificates, which lists certificate designs. |
| get_issued_certificate | Looks up one issued certificate by the serial printed on it. Case and dashes don't matter. Scoped to this workspace — it answers whether you issued this, not whether it is real in general. |
| get_overview | Counts across the workspace: courses by status, learners, runs in progress and completed, and certificates issued. The numbers behind the dashboard's overview page. |
| search_content | Full-text search across course titles and the text inside their screens — the way to find which course says something when you don't know which one it is. |
| get_usage | This calendar month's course views against the plan's allowance, plus what any excess costs at the published rate. Null limit means the plan is uncapped. |
| list_audit_events | The workspace's security and compliance trail, newest first — who did what and when. Deliberately narrow: routine reversible actions (editing block text, reordering a collection) aren't logged, so this stays a trail rather than an activity feed. |
| list_members | Everyone in the workspace with their role, plus any invites still pending. |