Underlayer

Erstellen, veröffentlichen und verfolgen Sie In-Product-Trainingskurse über Ihren KI-Assistenten: Kurse, Lernende, Abschlüsse und SCORM.

Gehosteter MCP-Server

npx add-mcp 'https://underlayerhq.com/api/mcp'

Installiert in Claude Code, Codex, Cursor und mehr

Dokumentation

MCP

A remote MCP server so Claude, Cursor, and other MCP clients can create and manage courses as tools — the same operations as the REST API, callable from a conversation.

Connect

Point any MCP client that speaks Streamable HTTP at this URL, with your API key as a Bearer token — the same key from your workspace's API Keys page. Every tool call is scoped to that key's workspace, exactly like the REST API.

Claude Desktop / Cursor mcpServers configjson

{
  "underlayer": {
    "url": "https://underlayerhq.com/api/mcp",
    "headers": {
      "Authorization": "Bearer sk_live_..."
    }
  }
}

For stdio-only clients that can't reach a remote URL directly, bridge it with mcp-remote:

{
  "underlayer": {
    "command": "npx",
    "args": ["-y", "mcp-remote", "https://underlayerhq.com/api/mcp",
      "--header", "Authorization:Bearer sk_live_..."]
  }
}

OAuth, for Claude.ai and other web clients

Claude.ai's browser-based “Add custom connector” flow can't paste in a Bearer header — it authenticates with OAuth instead. Underlayer is its own authorization server for this: add https://underlayerhq.com/api/mcp as a custom connector and Claude discovers everything else automatically (RFC 9728 protected-resource metadata → RFC 8414 authorization-server metadata → an authorization-code + PKCE flow, using CIMD to identify itself — no manual client registration on your end).

You'll land on a sign-in screen (if you're not already signed in) and then a consent screen naming the connecting app and your workspace. Approving it grants the same access a write-scoped API key would — create, read, update and delete on everything below, within your plan's limits. Revoke it anytime from Connected Apps in your dashboard; access stops immediately.

One thing that access does not include: minting API keys. A key is a separate credential rather than a view onto this connection, so one created through a connector would keep working after you revoked the connector — access outliving its own revocation. Keys are issued only from the API Keys page, where a person is looking at the screen. Listing and revoking are available as tools, since neither creates access.

Tools

Every REST resource except media uploads and CSV import is exposed as a matching set of tools, with the same plan gates and ownership checks. A read-only key can call only the get_, list_ and search_ tools and export_scorm. Results come back as JSON.

Authoring tools write; the progress tools only read. That asymmetry is deliberate: a completion is a record of something a real person did, and a tool that could edit one would be a tool that could award a pass.

Courses

list_courses get_course create_course update_course delete_course

Screens & blocks

list_block_types list_screen_templates add_screen update_screen add_block duplicate_screen delete_screen reorder_screens

AI generationMONTHLY ALLOWANCE

generate_course get_generation

SCORMBUILD PLAN

export_scorm import_scorm

ThemesBUILD PLAN

list_themes get_theme create_theme update_theme delete_theme

Collections

list_collections get_collection create_collection update_collection delete_collection add_course_to_collection move_course_in_collection remove_course_from_collection

TranslationsBUILD PLAN

list_translations get_translation create_translation update_translation delete_translation

Webhooks

list_webhooks get_webhook create_webhook update_webhook delete_webhook

Certificate templatesBUILD PLAN

list_certificates get_certificate create_certificate update_certificate delete_certificate

Identities

list_identities get_identity upsert_identity bulk_upsert_identities delete_identity bulk_delete_identities

Learner progressREAD-ONLY

list_completions get_completion list_issued_certificates get_issued_certificate

ReportingREAD-ONLY

get_overview search_content get_usage list_audit_events

Team & credentials

list_members invite_member cancel_invite update_member_role remove_member list_api_keys revoke_api_key

Workspace

get_workspace_info update_workspace_settings

list_completions takes identityExternalId, so you can ask about a learner by your own id for them without looking ours up first, and get_issued_certificate accepts a serial however it was typed — case and dashes are normalised, because the serial usually arrives read off a piece of paper.

Prefer the screen tools over update_course for editing content. update_course can only write the whole screens array, so changing one screen of thirty means reading them all back and rewriting the lot — and two edits in flight lose one of them. update_screen does the read-modify-write server-side, on one screen. Start from list_block_types: a block with the wrong field names saves cleanly and then renders empty.

Auth and errors

Every request re-authenticates with the same Bearer key as the REST API — a missing or revoked key fails the connection outright. A tool-level problem (not found, invalid input, plan required) comes back as a normal tool result with isError: true and a human-readable message, not a broken connection. The exception is the workspace itself being stopped: a Sandbox past its monthly allowance, or any workspace unpaid past its grace period, gets an HTTP 402 on the connection until the month turns over, it upgrades, or the invoice is paid.

Actions that change who can get in — inviting, removing, changing a role, revoking a key, renaming the workspace — are written to the audit log naming the key that made them, so an automated change is as traceable as a human one. Read it back with list_audit_events or from Settings in the dashboard.