Skip to main content
Glama

Cubite LMS: Learning Management System

Update course

course_update

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

TableJSON 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.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and openWorldHint=false, yet the description adds atomicity (an invalid value rejects the call and leaves the course unchanged), side-effect scope (recorded in the change log, emails no one, fires no webhook), and patch semantics (scalar fields patch, null clears, lists replace whole). This is far beyond what the annotations convey.

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?

Dense but front-loaded: purpose first, then patch semantics, then side effects, then sibling routing. Every clause carries information, though the long semicolon-chained sentence around certificateConfig is heavier than ideal for scanning.

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 mutation with nested objects and no output schema, the description covers return shape (same shape as course_get), mutation semantics, error behavior, and redirection to the correct siblings. Nothing an agent needs to invoke it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot: scalars patch while lists are replaced wholesale, and certificateConfig is a single object whose omitted keys are deleted. It also flags that accessDurationDays affects only new enrollments, which no per-field schema text frames.

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?

States a specific verb (update) and resource (course settings) and enumerates the field groups covered, from catalog text to certificateConfig. An agent can distinguish it from course_create, course_delete and course_content_set without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes to alternatives: lessons go to course_content_set, existing learners' expiry goes to enrollment_update, and current list values come from course_get with includeConfig:true. It states when the tool is the wrong choice, not just when it fits.

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