Skip to main content
Glama

Update Assignment

update_assignment
DestructiveIdempotent

Modify an existing Canvas assignment's name, due dates, points, or HTML description, with optional edit guards that prevent overwriting changes. Use it to safely update one assignment field or fragment.

Instructions

Update an existing assignment in a course.

description replaces the whole HTML description. To change one fragment, pass find and replace instead. Optional guards (any of them makes the tool fetch the assignment first, refuse rather than write on a failed check, and read it back after): expect_updated_at refuses if the assignment changed since you read it; find/replace edits one fragment of the current description; require lists strings that must already be present in it.

Input Schema

NameRequiredDescriptionDefault
findNoExact HTML fragment that must occur exactly once in the current description
nameNoNew assignment name/title
due_atNoNew due date in ISO 8601 format
lock_atNoNew lock date in ISO 8601 format
replaceNoText that replaces find (may be empty to delete it)
requireNoStrings that must already be present in the current description
publishedNoWhether to publish the assignment
unlock_atNoNew available date in ISO 8601 format
descriptionNoNew HTML description
grading_typeNoOne of: points, letter_grade, pass_fail, percent, not_graded
peer_reviewsNoEnable peer reviews
assignment_idYesAssignment ID to update
points_possibleNoNew maximum points
submission_typesNoComma-separated types (online_text_entry, online_url, online_upload, discussion_topic, none, on_paper, external_tool)
course_identifierYesCourse code or Canvas ID
expect_updated_atNoThe assignment's updated_at when you read it; refuse if it has changed
allowed_extensionsNoComma-separated file extensions (e.g., "pdf,docx,txt")
assignment_group_idNoAssignment group ID to move to
automatic_peer_reviewsNoAuto-assign peer reviews

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv1.15.0
    • addedInput schema / properties / expect_updated_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The assignment's updated_at when you read it; refuse if it has changed"
      +}
    • addedInput schema / properties / find
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Exact HTML fragment that must occur exactly once in the current description"
      +}
    • addedInput schema / properties / replace
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Text that replaces find (may be empty to delete it)"
      +}
    • addedInput schema / properties / require
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Strings that must already be present in the current description"
      +}
  2. Changed1 schema field changedv1.10.0
    • changedOutput schema / (root)
      Previous value: -{
      -  "properties": {
      -    "result": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "type": "object",
      -  "x-fastmcp-wrap-result": true
      -}New value: +null
  3. Changed35 schema fields changedv1.8.0
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / allowed_extensions / description
      Added value: +"Comma-separated file extensions (e.g., \"pdf,docx,txt\")"
    • removedInput schema / properties / allowed_extensions / title
      Removed value: -"Allowed Extensions"
    • addedInput schema / properties / assignment_group_id / description
      Added value: +"Assignment group ID to move to"
    • removedInput schema / properties / assignment_group_id / title
      Removed value: -"Assignment Group Id"
    • addedInput schema / properties / assignment_id / description
      Added value: +"Assignment ID to update"
    • removedInput schema / properties / assignment_id / title
      Removed value: -"Assignment Id"
    • addedInput schema / properties / automatic_peer_reviews / description
      Added value: +"Auto-assign peer reviews"
    • removedInput schema / properties / automatic_peer_reviews / title
      Removed value: -"Automatic Peer Reviews"
    • addedInput schema / properties / course_identifier / description
      Added value: +"Course code or Canvas ID"
    • removedInput schema / properties / course_identifier / title
      Removed value: -"Course Identifier"
    • addedInput schema / properties / description / description
      Added value: +"New HTML description"
    • removedInput schema / properties / description / title
      Removed value: -"Description"
    • addedInput schema / properties / due_at / description
      Added value: +"New due date in ISO 8601 format"
    • removedInput schema / properties / due_at / title
      Removed value: -"Due At"
    • addedInput schema / properties / grading_type / description
      Added value: +"One of: points, letter_grade, pass_fail, percent, not_graded"
    • removedInput schema / properties / grading_type / title
      Removed value: -"Grading Type"
    • addedInput schema / properties / lock_at / description
      Added value: +"New lock date in ISO 8601 format"
    • removedInput schema / properties / lock_at / title
      Removed value: -"Lock At"
    • addedInput schema / properties / name / description
      Added value: +"New assignment name/title"
    • removedInput schema / properties / name / title
      Removed value: -"Name"
    • addedInput schema / properties / peer_reviews / description
      Added value: +"Enable peer reviews"
    • removedInput schema / properties / peer_reviews / title
      Removed value: -"Peer Reviews"
    • addedInput schema / properties / points_possible / description
      Added value: +"New maximum points"
    • removedInput schema / properties / points_possible / title
      Removed value: -"Points Possible"
    • addedInput schema / properties / published / description
      Added value: +"Whether to publish the assignment"
    • removedInput schema / properties / published / title
      Removed value: -"Published"
    • addedInput schema / properties / submission_types / description
      Added value: +"Comma-separated types (online_text_entry, online_url, online_upload, discussion_topic, none, on_paper, external_tool)"
    • removedInput schema / properties / submission_types / title
      Removed value: -"Submission Types"
    • addedInput schema / properties / unlock_at / description
      Added value: +"New available date in ISO 8601 format"
    • removedInput schema / properties / unlock_at / title
      Removed value: -"Unlock At"
    • removedInput schema / title
      Removed value: -"update_assignmentArguments"
    • removedOutput schema / properties / result / title
      Removed value: -"Result"
    • removedOutput schema / title
      Removed value: -"update_assignmentOutput"
    • addedOutput schema / x-fastmcp-wrap-result
      Added value: +true
  4. Addedv1.3.0

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=true, and the description meaningfully adds to that: it discloses that guards trigger a fetch-first / refuse-on-failed-check / read-back cycle, and that 'description' overwrites the entire HTML body (matching the destructive hint). It does not describe the read-back's shape or failure messaging, so not a 5.

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 the core action, then a compact paragraph grouping the guard semantics. Some phrasing ('any of them makes the tool fetch the assignment first, refuse rather than write on a failed check, and read it back after') is dense but earns its place; no filler.

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

Completeness4/5

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

For a 19-parameter mutation with no output schema, the description covers the non-obvious behaviors (whole-body replacement, guard semantics, read-back) while leaving straightforward fields like dates and grading_type to the schema. It is close to complete, though it says nothing about what a refused write returns or whether partial-field semantics apply.

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 genuinely adds cross-parameter semantics the schema cannot: the framing of find/replace/require/expect_updated_at as 'optional guards' with shared fetch-refuse-readback behavior, plus the find-must-occur-exactly-once constraint it restates as a fragment-edit alternative.

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

Purpose4/5

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

The description opens with a specific verb and resource ('Update an existing assignment in a course') and then narrows into the description-editing semantics. Sibling tools like create_assignment and delete_assignment make the CRUD boundary implicit, but the description never states the distinction explicitly, which keeps it from a 5.

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?

It gives clear conditional guidance: use 'description' to replace the whole HTML body versus 'find'+'replace' to edit a single fragment, and it explains when the guard parameters (expect_updated_at, require) apply. It does not address broader when-to-use-this-tool-vs-alternatives context, so it stops short of a 5.

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