Skip to main content
Glama

Cubite LMS: Learning Management System

Update course

course_update
Destructive

Update a course's settings, from catalog text, slug, price, dates and visibility to tags, instructors, prerequisites, the application form and certificateConfig (completion and certificate rules), and return the updated course object (same shape as course_get). Scalar fields patch: only those you send change, and null clears a nullable one. Lists are replaced whole (subjects, topics, instructors, prerequisites, applicationFields): send the complete list; course_get with includeConfig:true returns the current ones. An invalid value rejects the call and leaves the course unchanged. Saves are recorded in the course's change log; they email no one and fire no webhook. Lessons are not settings: replace them with course_content_set. accessDurationDays applies only to new enrollments; change existing learners' expiry with enrollment_update.

Input Schema

NameRequiredDescriptionDefault
idYesCourse id (required).
xpNoGamification points awarded (integer).
nameNoCourse title shown in the catalog (max 191 chars); cannot be empty.
slugNoURL slug used in /course/<slug>/..., lowercased with other characters turned into hyphens. Must be unique across all Cubite sites (a taken slug is a 409 error). null clears it, which drops the course from the catalog and search.
levelNoDifficulty label shown in the catalog, e.g. "Beginner". null clears.
priceNoList price in US dollars. null or 0 = free.
bannerNoWide banner image for the course about page.
topicsNoTopic tag names; created if new. REPLACES the full set (send the complete list, [] clears).
creditsNoCredits/CEUs awarded on completion; feeds transcripts and the credits report.
endDateNoCourse end, ISO 8601. null clears.
discountNoSale price that REPLACES `price` when set (US dollars, NOT a percentage and NOT an amount off). Learners are charged `discount` if present, otherwise `price`. null clears the sale.
durationNoInformational content length in HOURS (integer). Not an access limit.
featuredNoHighlight the course in featured catalog slots.
subjectsNoSubject tag names; created if new. REPLACES the full set (send the complete list, [] clears).
metaTitleNoSEO meta title (<=60 chars recommended).
startDateNoCourse start, ISO 8601 (e.g. "2026-09-01" or "2026-09-01T09:00:00Z"). null clears.
coverImageNoCatalog/card image: absolute URL or Cloudinary public id.
introVideoNoIntro video: a YouTube or Loom URL, or a direct video file URL.
descriptionNoCatalog description of the course. This is the summary, NOT the lesson content (use course_content_set for that).
instructorsNoInstructor user ids, REPLACING the full set ([] removes all). Each must already be on this site (a site role or site admin), or the call fails.
prerequisitesNoPrerequisite courses whose thresholds a learner must meet before enrolling, REPLACING the full set ([] removes all). Each: {id, minProgressPct?, minAvgGradePct?}.
metaDescriptionNoSEO meta description (<=155 chars recommended).
applicationFieldsNoApplication form questions, REPLACING the whole list: [{text, type, options?, required?}], where text is the question shown, type is "text" (default), "textarea" or "dropdown" (with options [{value, label}]), and required is a boolean. null clears it, leaving a single free-text message box.
certificateConfigNoCompletion and certificate settings as ONE object that REPLACES the stored one: keys you leave out are deleted, and null clears it (no certificate, reading gate off). course_get and course_list do not return it, so send it only when you know every key to keep, as on a course you just created, which holds exactly {readingGate: {enabled: true}}. Keys include readingGate {enabled, wordsPerMinute (default 200), minSeconds (20), maxSeconds (600)}, the minimum reading time before a text unit counts as complete; completionRule {type: "all_content" (default), "quiz_passed" or "progress_pct" with minProgressPct (default 80)}, what completes the course; and the certificate, issued on completion only when statementPrefix is set (codes count up from nextSeq; templateKind "builtin" by default, or "pdf" with templateUrl; validityMonths; ceus).
discussionEnabledNoEnable the per-course discussion forum.
enrollmentEndDateNoEnrollment closes, ISO 8601. null clears.
isSyllabusVisibleNoShow the syllabus/outline to visitors who are not enrolled.
accessDurationDaysNoDays of access from enrollment (integer): each NEW enrollment gets expiresAt = enrolledAt + N days, while existing enrollments keep their current expiry. null = unlimited. Distinct from `duration`.
isVisibleInCatalogNoShow the course in the public catalog (it is listed only if it also has a slug).
enrollmentStartDateNoEnrollment opens, ISO 8601. null clears.
requiresApplicationNoRequire learners to apply and be approved instead of enrolling instantly.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint=true annotation: it states scalar fields patch while null clears nullable ones, lists are replaced whole, an invalid value rejects the call and leaves the course unchanged (atomicity), saves land in the change log, and no emails or webhooks fire. It also warns that certificateConfig replaces the stored object so omitted keys are deleted, which is exactly the kind of destructive nuance an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then semantics, then constraints, with zero filler sentences; each clause carries distinct information. It is a single dense run-on paragraph, though, which makes the individual rules harder to scan than a short bulleted structure would.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 31-parameter, deeply nested mutation tool this covers the essentials: patch semantics, replacement semantics, atomic failure behavior, side effects, change-log behavior, and the return shape ('same shape as course_get'). With no output schema, it still tells the agent what comes back and what the shared mutable prerequisites are.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 31 parameters are already documented and this is the baseline-3 case. The description restates the patch-vs-replace rule and the accessDurationDays-to-new-enrollments caveat, but those points are also present in the schema, so it adds little parameter meaning beyond the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource (update a course's settings) and enumerates the field families covered, from catalog text and pricing to instructors, prerequisites, application form and certificateConfig. It also carves out what this tool is NOT (lessons belong to course_content_set), so an agent can separate it from siblings like course_content_set and enrollment_update.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes two adjacent tasks to the correct siblings ('replace them with course_content_set', 'change existing learners' expiry with enrollment_update') and points to course_get with includeConfig:true as the way to read current list values before replacing them. There is no explicit statement of when this tool should be chosen over course_create, but the update/create distinction is self-evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources