Skip to content
Scalekit Docs

Mini Course Generator MCP

Vendor MCP44 toolsOAuth 2.1/DCRMarketing

Mini Course Generator is a platform for creating and publishing short, focused online mini-courses. It enables creators to build bite-sized educational...

Mini Course Generator MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. quickstart.ts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENV_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'minicoursegeneratormcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Mini Course Generator MCP:', link)
    process.stdout.write('Press Enter after authorizing...')
    await new Promise(r => process.stdin.once('data', r))
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'minicoursegeneratormcp_course_list',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Replace scorm — Correct or update an already-hosted SCORM activity in place, keeping the same packageId
  • Delete scorm, section, module — Delete a hosted SCORM package
  • Unpublish module, lesson — Move a Module back to draft
  • Theme module — Set how the learner sees a Module: page layout, typography and colours
  • Publish module, lesson — Publish a Module: it and every Lesson in it become visible to learners, and its previewUrl starts working
  • Move module, lesson — Reorder a Module within its Course by setting its zero-based position (lower comes first)

Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.

minicoursegeneratormcp_audio_upload#Host an audio file on MCG for a lesson `audio` block (narration, a podcast clip, a pronunciation sample). Stage the file with `media_upload_url` (get an upload URL, PUT the file to it), then call this with the returned **`downloadUrl`** as `url`. Returns { documentId, url } — put the **`url`** in the `audio` block. Do NOT put a `media_upload_url` downloadUrl in a lesson: it expires in ~2h, this one is durable. mp3/wav/ogg/flac/aac/m4a/wma.3 params

Host an audio file on MCG for a lesson `audio` block (narration, a podcast clip, a pronunciation sample). Stage the file with `media_upload_url` (get an upload URL, PUT the file to it), then call this with the returned **`downloadUrl`** as `url`. Returns { documentId, url } — put the **`url`** in the `audio` block. Do NOT put a `media_upload_url` downloadUrl in a lesson: it expires in ~2h, this one is durable. mp3/wav/ogg/flac/aac/m4a/wma.

NameTypeRequiredDescription
urlstringrequiredPublicly-reachable URL of the audio file — use the `downloadUrl` from media_upload_url.
fileNamestringoptionalFile name (its extension picks the MIME type; defaults to the URL's base name).
replaceIdstringoptionalOptional documentId to replace, keeping the same hosted url.
minicoursegeneratormcp_course_add_certificate#Add a completion certificate to a Course — learners who finish the whole Course earn it. Creates the default certificate (its copy and pass threshold can be tuned later in the MCG admin UI). Certificates live at the Course level, not per Module.1 param

Add a completion certificate to a Course — learners who finish the whole Course earn it. Creates the default certificate (its copy and pass threshold can be tuned later in the MCG admin UI). Certificates live at the Course level, not per Module.

NameTypeRequiredDescription
courseIdstringrequiredThe id of the course to add a certificate to. Retrieve it from course_list or course_create.
minicoursegeneratormcp_course_analytics#Aggregate learner analytics for a Course: how many are assigned, how many engaged, how many completed it, certificates and badges issued, and the mean quiz score. No personal data — counts only. Pass moduleId to narrow the same report to one Module. Start here before reaching for the per-learner lists — and for a public Course this is the ONLY reach figure, because a public Course enrols nobody and so has no learner list at all.2 params

Aggregate learner analytics for a Course: how many are assigned, how many engaged, how many completed it, certificates and badges issued, and the mean quiz score. No personal data — counts only. Pass moduleId to narrow the same report to one Module. Start here before reaching for the per-learner lists — and for a public Course this is the ONLY reach figure, because a public Course enrols nobody and so has no learner list at all.

NameTypeRequiredDescription
courseIdstringrequiredCourse id from course_list.
moduleIdintegeroptionalOptional: narrow the report to this Module.
minicoursegeneratormcp_course_create#Create a Course — the top-level program. A Course holds several Modules (add them with module_push, one per topic); use module_push directly only for a single standalone topic. Pass `landingPage` (marketing copy) to create the course's landing page with it. See get_content_format.3 params

Create a Course — the top-level program. A Course holds several Modules (add them with module_push, one per topic); use module_push directly only for a single standalone topic. Pass `landingPage` (marketing copy) to create the course's landing page with it. See get_content_format.

NameTypeRequiredDescription
namestringrequiredCourse name.
descriptionstringoptionalOptional course description.
landingPagestringoptionalLanding-page marketing copy as YAML (introduction/audience/learning_outcomes/program_details/keywords).
minicoursegeneratormcp_course_finishers#The learners who completed a whole Course, with their mean score, when they finished, and their certificate URL where one was issued. Use `from` to ask only about recent completions. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.4 params

The learners who completed a whole Course, with their mean score, when they finished, and their certificate URL where one was issued. Use `from` to ask only about recent completions. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
courseIdstringrequiredCourse id from course_list.
fromstringoptionalOnly learners who finished on or after this ISO 8601 date.
pageintegeroptionalZero-based page. Default 0.
pageSizeintegeroptionalRows per page. Default 20, max 100.
minicoursegeneratormcp_course_learner_add#Give someone access to a Course, creating their learner account if this account has never seen them. Pass `email` (and optionally `name`); `username` defaults to the email. Adding someone who is already on the Course is a no-op and comes back with alreadyMember: true. Check `errors` on the result — a non-empty list means they were NOT added. This does not email them; send the course link yourself.4 params

Give someone access to a Course, creating their learner account if this account has never seen them. Pass `email` (and optionally `name`); `username` defaults to the email. Adding someone who is already on the Course is a no-op and comes back with alreadyMember: true. Check `errors` on the result — a non-empty list means they were NOT added. This does not email them; send the course link yourself.

NameTypeRequiredDescription
courseIdstringrequiredCourse id from course_list.
emailstringoptionalThe learner's email address.
namestringoptionalThe learner's display name — what a certificate is made out to.
usernamestringoptionalOptional username. Defaults to the email.
minicoursegeneratormcp_course_learner_remove#Take someone off a Course. This revokes access only — their account, their progress and any certificate they earned are kept, so adding them back restores where they were. Removing someone who is not on the Course is a no-op and comes back with removed: false.2 params

Take someone off a Course. This revokes access only — their account, their progress and any certificate they earned are kept, so adding them back restores where they were. Removing someone who is not on the Course is a no-op and comes back with removed: false.

NameTypeRequiredDescription
courseIdstringrequiredCourse id from course_list.
learnerstringrequiredThe learner's email address or username.
minicoursegeneratormcp_course_learners#The learners on a Course — one row each with name and email, how far they got, their score, whether they earned the certificate and when they were last active. Paginated (20 per page, max 100). A public Course enrols nobody, so this returns no rows and a `note` saying so — report that note, not "no learners", and use course_analytics for its reach. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.3 params

The learners on a Course — one row each with name and email, how far they got, their score, whether they earned the certificate and when they were last active. Paginated (20 per page, max 100). A public Course enrols nobody, so this returns no rows and a `note` saying so — report that note, not "no learners", and use course_analytics for its reach. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
courseIdstringrequiredCourse id from course_list.
pageintegeroptionalZero-based page. Default 0.
pageSizeintegeroptionalRows per page. Default 20, max 100.
minicoursegeneratormcp_course_list#List the courses in the connected account (a Course is the top-level program). Paginated — 20 per page by default, 100 max. An account can hold far more courses than one page, so check `hasNextPage` and keep paging before you conclude anything about the whole account; `totalCount` tells you how many there are in total.2 params

List the courses in the connected account (a Course is the top-level program). Paginated — 20 per page by default, 100 max. An account can hold far more courses than one page, so check `hasNextPage` and keep paging before you conclude anything about the whole account; `totalCount` tells you how many there are in total.

NameTypeRequiredDescription
pageintegeroptionalZero-based page. Default 0.
pageSizeintegeroptionalCourses per page. Default 20, max 100.
minicoursegeneratormcp_course_update#Rename a Course or change its description. courseId is the id from course_list / course_create. Only the fields you pass change.3 params

Rename a Course or change its description. courseId is the id from course_list / course_create. Only the fields you pass change.

NameTypeRequiredDescription
courseIdstringrequiredThe id of the course to update. Retrieve it from course_list or course_create.
descriptionstringoptionalNew course description.
namestringoptionalNew course name.
minicoursegeneratormcp_get_content_format#The MCG Course Authoring Guide — how to plan, structure, and write a course, the lesson content format, and landing-page copy. Read it before creating anything.0 params

The MCG Course Authoring Guide — how to plan, structure, and write a course, the lesson content format, and landing-page copy. Read it before creating anything.

minicoursegeneratormcp_learner_get#One learner's full record: every Course they can reach, how far they got in each, their score, when they finished, and whether a certificate was issued — plus per-module detail inside each course. This answers "which courses has this person completed" in one call. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.2 params

One learner's full record: every Course they can reach, how far they got in each, their score, when they finished, and whether a certificate was issued — plus per-module detail inside each course. This answers "which courses has this person completed" in one call. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
learnerstringrequiredThe learner's email, username, or the session id from learner_list.
startedOnlybooleanoptionalSkip Courses they were given but never opened. Default false.
minicoursegeneratormcp_learner_list#The account's learners across EVERY Course, one row each with how many courses they were given, started and completed. Use this — not a course_learners call per course — to answer questions about people rather than about one course ("who has finished anything", "which of our learners are stalled", "find this person"). `search` matches name, email or username. Paginated (20 per page, max 100). Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.5 params

The account's learners across EVERY Course, one row each with how many courses they were given, started and completed. Use this — not a course_learners call per course — to answer questions about people rather than about one course ("who has finished anything", "which of our learners are stalled", "find this person"). `search` matches name, email or username. Paginated (20 per page, max 100). Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
completedOnlybooleanoptionalOnly learners who completed at least one Course. Default false.
pageintegeroptionalZero-based page. Default 0.
pageSizeintegeroptionalRows per page. Default 20, max 100.
registeredOnlybooleanoptionalSkip anonymous public-link learners, who have no name or email to report. Default false.
searchstringoptionalMatch on name, email or username. Omit for everyone.
minicoursegeneratormcp_lesson_create#Add a Lesson to an existing Section. For a content lesson, pass `content` in the MCG content-authoring format (a `content:` document) — call get_content_format first. The CLI compiles it to HTML.5 params

Add a Lesson to an existing Section. For a content lesson, pass `content` in the MCG content-authoring format (a `content:` document) — call get_content_format first. The CLI compiles it to HTML.

NameTypeRequiredDescription
moduleIdintegerrequiredThe integer ID of the module that owns this section.
sectionIdstringrequiredThe unique identifier of the section to add the lesson to.
titlestringrequiredThe title of the new lesson.
contentstringoptionalFor an info lesson: the body as a content-authoring `content:` YAML document. For a quiz lesson: a YAML with `question:` and `choices:`.
typestringoptionalLesson type — `info` for a content lesson or `quiz` for an interactive quiz lesson.
minicoursegeneratormcp_lesson_delete#Delete a Lesson. This is destructive.1 param

Delete a Lesson. This is destructive.

NameTypeRequiredDescription
lessonIdintegerrequiredThe integer ID of the lesson to permanently delete.
minicoursegeneratormcp_lesson_discard_changes#Throw away a Lesson's unpublished edits and restore the content learners currently see. Irreversible — the working copy is gone, not archived. Only affects a lesson whose status is published_with_changes.1 param

Throw away a Lesson's unpublished edits and restore the content learners currently see. Irreversible — the working copy is gone, not archived. Only affects a lesson whose status is published_with_changes.

NameTypeRequiredDescription
lessonIdintegerrequiredLesson id
minicoursegeneratormcp_lesson_get#Get a Lesson (title, type, and the rendered HTML body).1 param

Get a Lesson (title, type, and the rendered HTML body).

NameTypeRequiredDescription
lessonIdintegerrequiredThe integer ID of the lesson to retrieve.
minicoursegeneratormcp_lesson_move#Reorder a Lesson within its Module by setting its order (lower comes first). Optionally move it into another Section of the same module by passing sectionId. moduleId is the lesson's module.4 params

Reorder a Lesson within its Module by setting its order (lower comes first). Optionally move it into another Section of the same module by passing sectionId. moduleId is the lesson's module.

NameTypeRequiredDescription
lessonIdintegerrequiredThe integer ID of the lesson to reorder or move.
moduleIdintegerrequiredThe integer ID of the module that owns this lesson.
orderintegerrequiredThe new 1-based position of the lesson within its section. Lower numbers appear first.
sectionIdstringoptionalThe section to move the lesson into. Must be a section within the same module. Omit to keep the lesson in its current section.
minicoursegeneratormcp_lesson_publish#Publish one Lesson — a draft lesson goes live, or the pending edits on a live lesson replace what learners are reading. Use this to ship part of a module while leaving unfinished lessons as drafts. Only meaningful inside a published module: publishing a lesson in a draft module shows it to nobody, because the module itself is not on the air (use module_publish first).1 param

Publish one Lesson — a draft lesson goes live, or the pending edits on a live lesson replace what learners are reading. Use this to ship part of a module while leaving unfinished lessons as drafts. Only meaningful inside a published module: publishing a lesson in a draft module shows it to nobody, because the module itself is not on the air (use module_publish first).

NameTypeRequiredDescription
lessonIdintegerrequiredLesson id
minicoursegeneratormcp_lesson_selections#Get a quiz/survey Lesson's selections — the authored options (id, text, and whether each is flagged correct). No learner/response data.1 param

Get a quiz/survey Lesson's selections — the authored options (id, text, and whether each is flagged correct). No learner/response data.

NameTypeRequiredDescription
lessonIdintegerrequiredThe integer ID of the quiz or survey lesson whose answer options to retrieve.
minicoursegeneratormcp_lesson_unpublish#Pull one Lesson out of the live module, back to draft. It keeps its content and its id, so learner progress and analytics still line up, but learners no longer see it.1 param

Pull one Lesson out of the live module, back to draft. It keeps its content and its id, so learner progress and analytics still line up, but learners no longer see it.

NameTypeRequiredDescription
lessonIdintegerrequiredLesson id
minicoursegeneratormcp_lesson_update#Edit a Lesson. Pass `title` to rename, and/or `content` (the MCG content-authoring format) to replace the body — the CLI recompiles it to HTML and replaces the whole body. Authoring is always in content-format, never raw HTML; call get_content_format for the spec.3 params

Edit a Lesson. Pass `title` to rename, and/or `content` (the MCG content-authoring format) to replace the body — the CLI recompiles it to HTML and replaces the whole body. Authoring is always in content-format, never raw HTML; call get_content_format for the spec.

NameTypeRequiredDescription
lessonIdintegerrequiredThe integer ID of the lesson to edit.
contentstringoptionalReplacement body in the MCG content-authoring format. The CLI compiles it to HTML and replaces the entire existing body. Call get_content_format for the authoring spec. Omit to leave the body unchanged.
titlestringoptionalNew title for the lesson. Omit to leave the title unchanged.
minicoursegeneratormcp_media_upload_url#Stage a media file (a video, a SCORM zip) for upload. Returns a temporary **`uploadUrl`** (presigned PUT) and **`downloadUrl`** (presigned GET, ~2h). Flow: (1) call this with the `fileName` (and `contentType`); (2) **PUT the file's bytes to `uploadUrl`** from your shell — e.g. `curl -T <file> -H "Content-Type: <contentType>" "<uploadUrl>"` — so the bytes go straight to storage and never pass through this conversation; (3) pass `downloadUrl` as the `url` to `video_upload` / `scorm_upload`. Use this for video and SCORM (don't base64 big files).2 params

Stage a media file (a video, a SCORM zip) for upload. Returns a temporary **`uploadUrl`** (presigned PUT) and **`downloadUrl`** (presigned GET, ~2h). Flow: (1) call this with the `fileName` (and `contentType`); (2) **PUT the file's bytes to `uploadUrl`** from your shell — e.g. `curl -T <file> -H "Content-Type: <contentType>" "<uploadUrl>"` — so the bytes go straight to storage and never pass through this conversation; (3) pass `downloadUrl` as the `url` to `video_upload` / `scorm_upload`. Use this for video and SCORM (don't base64 big files).

NameTypeRequiredDescription
fileNamestringrequiredFile name to stage, e.g. "welcome.mp4" or "quiz.zip".
contentTypestringoptionalMIME type to sign the PUT with, e.g. "video/mp4" or "application/zip" (default application/octet-stream).
minicoursegeneratormcp_module_analytics#Aggregate learner analytics for one Module: assigned, engaged, completed, badges earned and the mean quiz score. No personal data — counts only.1 param

Aggregate learner analytics for one Module: assigned, engaged, completed, badges earned and the mean quiz score. No personal data — counts only.

NameTypeRequiredDescription
moduleIdintegerrequiredModule id from module_list.
minicoursegeneratormcp_module_answers#One learner's answer to every question in a Module: the question, the options they picked (or the text they typed), which options were correct, and whether they got it right. This is the only tool that returns per-question answers — the analytics and finisher tools carry scores only. Covers BOTH quiz Lessons and the questions inside activity blocks (crossword, wordle, word search, riddle, jumble, pixel quest, SCORM). Each row says which in `source`, and activity rows carry `blockType`. So this is the whole picture for a module — there is no second tool to call for games. Two shapes not to misread: `isCorrect: null` means the question is ungraded OR they never reached it — NOT that they got it wrong; and a SCORM row has an `answer` but no question text (it comes back empty), because a SCORM package reports its outcome without telling us what was asked. That is a real answer, not missing data. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.2 params

One learner's answer to every question in a Module: the question, the options they picked (or the text they typed), which options were correct, and whether they got it right. This is the only tool that returns per-question answers — the analytics and finisher tools carry scores only. Covers BOTH quiz Lessons and the questions inside activity blocks (crossword, wordle, word search, riddle, jumble, pixel quest, SCORM). Each row says which in `source`, and activity rows carry `blockType`. So this is the whole picture for a module — there is no second tool to call for games. Two shapes not to misread: `isCorrect: null` means the question is ungraded OR they never reached it — NOT that they got it wrong; and a SCORM row has an `answer` but no question text (it comes back empty), because a SCORM package reports its outcome without telling us what was asked. That is a real answer, not missing data. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
learnerstringrequiredThe learner's email, username, or — for someone who took a public course by link — the session id from learner_list.
moduleIdintegerrequiredModule id from module_list.
minicoursegeneratormcp_module_create#Create an empty Module inside a Course. A Module groups Sections; Sections hold Lessons. courseId is the id from course_list / course_create. Pass a short `description` — modules should always have one. To create a module WITH content in one step, prefer module_push. The module is created as a DRAFT: nobody can reach it until module_publish runs.4 params

Create an empty Module inside a Course. A Module groups Sections; Sections hold Lessons. courseId is the id from course_list / course_create. Pass a short `description` — modules should always have one. To create a module WITH content in one step, prefer module_push. The module is created as a DRAFT: nobody can reach it until module_publish runs.

NameTypeRequiredDescription
courseIdstringrequiredThe id of the course to add this module to.
namestringrequiredModule name.
descriptionstringoptionalShort module description (1-2 sentences). Always set one.
languagestringoptionalISO language code for the learner interface (default en).
minicoursegeneratormcp_module_delete#Delete a Module and all its Sections and Lessons. This is destructive.1 param

Delete a Module and all its Sections and Lessons. This is destructive.

NameTypeRequiredDescription
moduleIdintegerrequiredThe numeric id of the module to delete.
minicoursegeneratormcp_module_finishers#The learners who completed one Module, with completion percentage, quiz score, and start/finish times. Use this to see where a specific module is landing. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.4 params

The learners who completed one Module, with completion percentage, quiz score, and start/finish times. Use this to see where a specific module is landing. Rows carry the learner's real name and email — the connected shop's own learners. Treat them as personal data: use them to answer what was asked, and do not republish a roster elsewhere.

NameTypeRequiredDescription
moduleIdintegerrequiredModule id from module_list.
fromstringoptionalOnly learners who finished on or after this ISO 8601 date.
pageintegeroptionalZero-based page. Default 0.
pageSizeintegeroptionalRows per page. Default 20, max 100.
minicoursegeneratormcp_module_get#Get a Module with its Sections and Lessons (and their ids — needed to edit them). Also reports publish state: the module's `status` (draft | published | published_with_changes), `pendingLessonCount`, and a `status` per lesson. Check this before telling someone a module is live.1 param

Get a Module with its Sections and Lessons (and their ids — needed to edit them). Also reports publish state: the module's `status` (draft | published | published_with_changes), `pendingLessonCount`, and a `status` per lesson. Check this before telling someone a module is live.

NameTypeRequiredDescription
moduleIdintegerrequiredThe numeric id of the module to retrieve. Retrieve it from module_list.
minicoursegeneratormcp_module_list#List the Modules inside a Course (each with id, name, and section/lesson counts). courseId is the Course (collection) id from course_list / course_create.1 param

List the Modules inside a Course (each with id, name, and section/lesson counts). courseId is the Course (collection) id from course_list / course_create.

NameTypeRequiredDescription
courseIdstringrequiredThe id of the course whose modules to list.
minicoursegeneratormcp_module_move#Reorder a Module within its Course by setting its zero-based position (lower comes first). The other modules keep their relative order and shift around it, so to place one module you only pass that module — not the whole ordering. Use module_list to see the current order.3 params

Reorder a Module within its Course by setting its zero-based position (lower comes first). The other modules keep their relative order and shift around it, so to place one module you only pass that module — not the whole ordering. Use module_list to see the current order.

NameTypeRequiredDescription
courseIdstringrequiredCourse (collection) id the module belongs to
moduleIdintegerrequiredModule id to move
orderintegerrequiredNew zero-based position within the course (lower comes first)
minicoursegeneratormcp_module_publish#Publish a Module: it and every Lesson in it become visible to learners, and its previewUrl starts working. Modules are created as DRAFTS, so a module you just created or pushed is not reachable by anyone until this runs — if you hand someone the link first, it will not work. Publishing is public: only call it when the person has said they want the module live.1 param

Publish a Module: it and every Lesson in it become visible to learners, and its previewUrl starts working. Modules are created as DRAFTS, so a module you just created or pushed is not reachable by anyone until this runs — if you hand someone the link first, it will not work. Publishing is public: only call it when the person has said they want the module live.

NameTypeRequiredDescription
moduleIdintegerrequiredModule id
minicoursegeneratormcp_module_push#Create one complete Module (sections + lessons) from a `kind: Module` YAML spec — a Module is one focused unit; a full course is several Modules in a Course (see course_create). Include a top-level `landingPage` in the spec. Follow get_content_format for the content format; use dryRun:true to validate. Pass a short `description` — the spec has no description field, so this is how a created module gets one (every module should have a description). The module is created as a DRAFT — the previewUrl it returns will not work for anyone else until module_publish runs. Say so rather than handing over a link that looks broken, and publish only once the person has said they want it live.4 params

Create one complete Module (sections + lessons) from a `kind: Module` YAML spec — a Module is one focused unit; a full course is several Modules in a Course (see course_create). Include a top-level `landingPage` in the spec. Follow get_content_format for the content format; use dryRun:true to validate. Pass a short `description` — the spec has no description field, so this is how a created module gets one (every module should have a description). The module is created as a DRAFT — the previewUrl it returns will not work for anyone else until module_publish runs. Say so rather than handing over a link that looks broken, and publish only once the person has said they want it live.

NameTypeRequiredDescription
specstringrequiredA `kind: Module` YAML spec defining sections and lessons. See get_content_format for the required structure.
courseIdstringoptionalThe id of the parent course. Retrieve it from course_list or course_create.
descriptionstringoptionalShort module description (1-2 sentences).
dryRunbooleanoptionalIf true, validate the spec without creating anything.
minicoursegeneratormcp_module_theme#Set how the learner sees a Module: page layout, typography and colours. Use it to match an author's brand — they often supply a palette or a style sheet. A merge patch: only the fields you pass change. Colours are CSS hex. Note this themes the whole module; to tint one box inside a lesson use the `background`/`text_color` box fields instead (see get_content_format).11 params

Set how the learner sees a Module: page layout, typography and colours. Use it to match an author's brand — they often supply a palette or a style sheet. A merge patch: only the fields you pass change. Colours are CSS hex. Note this themes the whole module; to tint one box inside a lesson use the `background`/`text_color` box fields instead (see get_content_format).

NameTypeRequiredDescription
moduleIdintegerrequiredModule id
backgroundColorstringoptionalPage background colour as CSS hex
bodyBackgroundImagestringoptionalPage background image url
buttonColorstringoptionalButton colour as CSS hex
cardAlignmentstringoptionaltop, center or bottom
cardBackgroundColorstringoptionalCard background colour as CSS hex
fontstringoptionalFont family, e.g. "Open Sans"
fontColorstringoptionalText colour as CSS hex, e.g. "#1e293b"
fontSizestringoptionalS, M or L
layoutintegeroptional0 default, 1 left/right, 2 native, 3 bottom
lineHeightstringoptionalS, M or L
minicoursegeneratormcp_module_unpublish#Move a Module back to draft. Learners lose access immediately and the previewUrl stops working. Content and learner progress are kept, so it can be published again.1 param

Move a Module back to draft. Learners lose access immediately and the previewUrl stops working. Content and learner progress are kept, so it can be published again.

NameTypeRequiredDescription
moduleIdintegerrequiredModule id
minicoursegeneratormcp_module_update#Rename a Module, change its description, or change its learner-interface language. Only the fields you pass change. `language` switches the interface chrome (buttons/labels) the learner sees to that language's defaults — it does NOT translate the authored lesson content.4 params

Rename a Module, change its description, or change its learner-interface language. Only the fields you pass change. `language` switches the interface chrome (buttons/labels) the learner sees to that language's defaults — it does NOT translate the authored lesson content.

NameTypeRequiredDescription
moduleIdintegerrequiredThe numeric id of the module to update.
descriptionstringoptionalNew module description.
languagestringoptionalISO language code for the learner interface.
namestringoptionalNew module name.
minicoursegeneratormcp_scorm_delete#Delete a hosted SCORM package. This is destructive: any lesson `scorm` block still referencing this packageId will break, so remove or repoint those lessons first. To swap in a corrected activity, prefer `scorm_replace` — it keeps the packageId and the lessons intact.1 param

Delete a hosted SCORM package. This is destructive: any lesson `scorm` block still referencing this packageId will break, so remove or repoint those lessons first. To swap in a corrected activity, prefer `scorm_replace` — it keeps the packageId and the lessons intact.

NameTypeRequiredDescription
packageIdstringrequiredSCORM packageId to delete (GUID).
minicoursegeneratormcp_scorm_replace#Correct or update an already-hosted SCORM activity **in place**, keeping the same `packageId`. Every lesson whose `scorm` block references that packageId picks up the new activity with no content edit — so use this instead of deleting and re-adding. Generate the corrected SCORM 1.2 zip, stage it with `media_upload_url`, then call this with the returned `downloadUrl` as `url` and the existing `packageId`.3 params

Correct or update an already-hosted SCORM activity **in place**, keeping the same `packageId`. Every lesson whose `scorm` block references that packageId picks up the new activity with no content edit — so use this instead of deleting and re-adding. Generate the corrected SCORM 1.2 zip, stage it with `media_upload_url`, then call this with the returned `downloadUrl` as `url` and the existing `packageId`.

NameTypeRequiredDescription
packageIdstringrequiredThe existing SCORM packageId to replace (GUID).
urlstringrequiredPublicly-reachable URL of the new SCORM .zip — use the `downloadUrl` from media_upload_url.
fileNamestringoptionalOptional file name to record (defaults to the URL's base name).
minicoursegeneratormcp_scorm_upload#Host an interactive SCORM package (an AI-authored, self-contained scored activity) on MCG for a lesson `scorm` block. You generate a SCORM 1.2 zip yourself (a self-contained HTML interactive that reports cmi.core.score/lesson_status via the SCORM API, plus a minimal imsmanifest.xml — read get_content_format's SCORM reporting rules first: report each interaction and commit as it happens, not once at the end, or partial attempts record nothing). Stage the zip with `media_upload_url` (get an upload URL, PUT the file to it), then call this with the returned **`downloadUrl`** as `url`. Returns { packageId, entryPointUrl, title, version, fileName } — put the **`packageId`** (and the returned entryPointUrl/title/version/fileName) in the `scorm` block.2 params

Host an interactive SCORM package (an AI-authored, self-contained scored activity) on MCG for a lesson `scorm` block. You generate a SCORM 1.2 zip yourself (a self-contained HTML interactive that reports cmi.core.score/lesson_status via the SCORM API, plus a minimal imsmanifest.xml — read get_content_format's SCORM reporting rules first: report each interaction and commit as it happens, not once at the end, or partial attempts record nothing). Stage the zip with `media_upload_url` (get an upload URL, PUT the file to it), then call this with the returned **`downloadUrl`** as `url`. Returns { packageId, entryPointUrl, title, version, fileName } — put the **`packageId`** (and the returned entryPointUrl/title/version/fileName) in the `scorm` block.

NameTypeRequiredDescription
urlstringrequiredPublicly-reachable URL of the SCORM .zip — use the `downloadUrl` from media_upload_url.
fileNamestringoptionalOptional display name for the SCORM package.
minicoursegeneratormcp_section_create#Add a Section to an existing Module.2 params

Add a Section to an existing Module.

NameTypeRequiredDescription
moduleIdintegerrequiredThe numeric id of the module to add the section to.
titlestringrequiredSection title.
minicoursegeneratormcp_section_delete#Delete a Section and its Lessons. This is destructive.1 param

Delete a Section and its Lessons. This is destructive.

NameTypeRequiredDescription
sectionIdstringrequiredThe unique identifier of the section to delete. All lessons inside it will also be permanently deleted.
minicoursegeneratormcp_section_update#Rename a Section.2 params

Rename a Section.

NameTypeRequiredDescription
sectionIdstringrequiredThe unique identifier of the section to rename.
titlestringrequiredThe new title for the section.
minicoursegeneratormcp_video_upload#Host a video on Vimeo through MCG (server-side — no third-party account needed) for a lesson `video` block. **Any MP4 works** — pass any publicly-reachable video `url` directly, or stage a local file with `media_upload_url` (get an upload URL, PUT the file to it) and pass the returned **`downloadUrl`** as `url`. Returns { shopClipId, clipId, playerUrl } — put the **`shopClipId`** in the `video` block's `shopClipId`. MCG renders its own native player and bakes the playback URL in server-side once Vimeo finishes transcoding.2 params

Host a video on Vimeo through MCG (server-side — no third-party account needed) for a lesson `video` block. **Any MP4 works** — pass any publicly-reachable video `url` directly, or stage a local file with `media_upload_url` (get an upload URL, PUT the file to it) and pass the returned **`downloadUrl`** as `url`. Returns { shopClipId, clipId, playerUrl } — put the **`shopClipId`** in the `video` block's `shopClipId`. MCG renders its own native player and bakes the playback URL in server-side once Vimeo finishes transcoding.

NameTypeRequiredDescription
urlstringrequiredPublicly-reachable URL of the video file — any hosted MP4, or the `downloadUrl` from media_upload_url.
fileNamestringoptionalOptional display name for the video on Vimeo.
minicoursegeneratormcp_whoami#Returns the MCG account this connection is authenticated as (user id, email, shop id). Use it to confirm you connected the correct account.0 params

Returns the MCG account this connection is authenticated as (user id, email, shop id). Use it to confirm you connected the correct account.