Skip to main content
Glama

Update Course

update_course
DestructiveIdempotent

Updates only the fields you pass on an existing Canvas course, leaving omitted fields unchanged. Use it to change the name, code, dates, syllabus, home view, or grading settings.

Instructions

Update an existing course and return the updated Canvas course object. Only the fields you pass are changed; omitted fields are left as-is, and calling it again with the same values leaves the course in the same state (idempotent). Requires permission to update course details; a caller who has only that lesser permission (not full course update rights) can still change syllabus_body through this same call, but every other field they pass is silently dropped rather than erroring. Use create_course for a new course, or get_course to see the current values before changing them.

Input Schema

NameRequiredDescriptionDefault
nameNoNew course name
end_atNoNew end date in ISO 8601 format (e.g. 2026-05-15T00:00:00Z)
start_atNoNew start date in ISO 8601 format (e.g. 2026-01-15T00:00:00Z)
course_idYesThe Canvas course ID to update
course_codeNoNew course code
default_viewNoDefault course home page view
syllabus_bodyNoHTML body for the course syllabus
hide_final_gradesNoWhether to hide the totals in the student grades summary
apply_assignment_group_weightsNoWhether the final grade is weighted by assignment group percentages

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.18.16
    • addedInput schema / properties / apply_assignment_group_weights
      Added value: +{
      +  "description": "Whether the final grade is weighted by assignment group percentages",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / hide_final_grades
      Added value: +{
      +  "description": "Whether to hide the totals in the student grades summary",
      +  "type": "boolean"
      +}
  2. Changed4 schema fields changedv1.18.15
    • addedInput schema / properties / course_id / anyOf
      Added value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "pattern": "^[1-9][0-9]{0,18}$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / course_id / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / course_id / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / course_id / type
      Removed value: -"integer"
  3. Changed1 schema field changedv1.18.11
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  4. Changed2 schema fields changedv1.18.8
    • changedInput schema / properties / end_at / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • changedInput schema / properties / start_at / pattern
      Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
  5. First observedv1.18.0

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses permission requirements and the non-obvious failure mode where a lesser-permission caller can change syllabus_body but has every other field silently dropped rather than erroring. It also states partial-update semantics and that omitted fields are left as-is. The idempotency restatement duplicates idempotentHint=true, but the silent-drop disclosure is exactly the kind of hidden behavior that annotations cannot express.

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

Conciseness5/5

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

Three sentences, front-loaded with what the tool does, then the partial-update contract, then permissions and alternatives. Every sentence adds information; no filler.

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?

There is no output schema, and the description compensates by naming the return value. Permission requirements, mutation scope, idempotency, and sibling routing are all covered, so an agent has everything needed to call it correctly.

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 field-level meaning is already documented. The description adds genuinely new semantics beyond the schema — that unpassed fields are untouched, and that syllabus_body behaves differently under reduced permissions — but it does not clarify individual parameters such as date format or the default_view enum, which the schema handles.

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 and resource ('Update an existing course') plus the return value (updated Canvas course object). It also explicitly distinguishes itself from create_course and get_course, so an agent can route correctly without opening schemas.

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?

Names both alternatives and the condition that selects them: create_course for a new course, get_course to read current values before changing. The partial-update contract ('only the fields you pass are changed') tells the caller exactly what shape of call is appropriate.

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

Deploy Server

Other Tools