Skip to main content
Glama

Update New Quiz

update_new_quiz
DestructiveIdempotent

Update an existing New Quiz (LTI) in Canvas by assignment_id, changing only supplied fields; pass null to clear dates and keep omitted settings unchanged.

Instructions

Update an existing New Quiz (LTI) in a Canvas course, found by its assignment_id (from list_assignments or get_assignment, filtered on is_quiz_lti_assignment, or from create_new_quiz — not a Classic Quiz ID). Only the fields you pass change; omitted fields keep their current value, so a repeated call with the same payload leaves the quiz unchanged. Pass null for due_at, unlock_at, or lock_at to clear that date. Returns the updated quiz (id, title, points_possible, due_at, unlock_at, lock_at, published, assignment_id). Use update_new_quiz_item to change an individual question instead of the quiz shell, and delete_new_quiz to remove the whole quiz. quiz_settings's flat fields (calculator, shuffle, time limit, access code, one-at-a-time) each change independently, same as the rest of this call, but its multiple_attempts sub-object is replaced as a whole by Canvas: passing { multiple_attempts: { max_attempts: 3 } } clears every other multiple_attempts sub-field (which score to keep, the cooling period, …) instead of leaving them as they were, so repeat every sub-field you want kept. IP-address access filtering and result_view_settings are not supported by this tool. Requires permission to manage quizzes in the course.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "course_id": "<course_id>",
      "assignment_id": "<assignment_id>"
    },
    "name": "update_new_quiz"
  }
}

Input Schema

NameRequiredDescriptionDefault
titleNoTitle of the quiz
due_atNoISO-8601 due date (null to clear)
lock_atNoISO-8601 lock time (null to clear)
course_idYesThe Canvas course ID
publishedNoWhether the quiz is visible to students
unlock_atNoISO-8601 unlock time (null to clear)
instructionsNoHTML instructions shown before the quiz starts
assignment_idYesThe assignment ID of the New Quiz
quiz_settingsNoQuiz session settings. The flat fields above change independently of each other, but multiple_attempts is replaced as a whole nested object — see its field for what that means. IP-address access filtering and result_view_settings are not supported by this tool.
points_possibleNoTotal points

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.18.21
    • addedInput schema / properties / quiz_settings
      Added value: +{
      +  "description": "Quiz session settings. The flat fields above change independently of each other, but multiple_attempts is replaced as a whole nested object — see its field for what that means. IP-address access filtering and result_view_settings are not supported by this tool.",
      +  "properties": {
      +    "allow_backtracking": {
      +      "description": "Lets students revisit earlier items; only applies when one_at_a_time_type is question",
      +      "type": "boolean"
      +    },
      +    "calculator_type": {
      +      "description": "Calculator available during the quiz",
      +      "enum": [
      +        "none",
      +        "basic",
      +        "scientific"
      +      ],
      +      "type": "string"
      +    },
      +    "has_time_limit": {
      +      "type": "boolean"
      +    },
      +    "multiple_attempts": {
      +      "anyOf": [
      +        {
      +          "description": "Canvas replaces this whole object on update — any sub-field you omit is cleared, not left at its current value. Pass every sub-field you want to keep, not only the one you are changing.",
      +          "properties": {
      +            "attempt_limit": {
      +              "description": "Caps attempts at max_attempts; false allows unlimited attempts",
      +              "type": "boolean"
      +            },
      +            "cooling_period": {
      +              "description": "Require a wait between attempts",
      +              "type": "boolean"
      +            },
      +            "cooling_period_seconds": {
      +              "description": "Used only when cooling_period is true",
      +              "exclusiveMinimum": 0,
      +              "maximum": 9007199254740991,
      +              "type": "integer"
      +            },
      +            "max_attempts": {
      +              "description": "Used only when attempt_limit is true",
      +              "exclusiveMinimum": 0,
      +              "maximum": 9007199254740991,
      +              "type": "integer"
      +            },
      +            "multiple_attempts_enabled": {
      +              "type": "boolean"
      +            },
      +            "score_to_keep": {
      +              "description": "Which attempt score counts toward the grade",
      +              "enum": [
      +                "average",
      +                "first",
      +                "highest",
      +                "latest"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Replaced as a whole object by Canvas — see its own description. Pass null to clear it."
      +    },
      +    "one_at_a_time_type": {
      +      "description": "question shows one item per screen; none shows the whole quiz at once",
      +      "enum": [
      +        "none",
      +        "question"
      +      ],
      +      "type": "string"
      +    },
      +    "require_student_access_code": {
      +      "type": "boolean"
      +    },
      +    "session_time_limit_in_seconds": {
      +      "description": "Used only when has_time_limit is true",
      +      "exclusiveMinimum": 0,
      +      "maximum": 9007199254740991,
      +      "type": "integer"
      +    },
      +    "shuffle_answers": {
      +      "description": "Randomize answer order per student",
      +      "type": "boolean"
      +    },
      +    "shuffle_questions": {
      +      "description": "Randomize item order per student",
      +      "type": "boolean"
      +    },
      +    "student_access_code": {
      +      "description": "Code students must enter to start the quiz",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed4 schema fields changedv1.18.15
    • addedInput schema / properties / assignment_id / anyOf
      Added value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "pattern": "^[1-9][0-9]{0,18}$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / assignment_id / type
      Removed value: -"number"
    • 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 / type
      Removed value: -"number"
  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. Changed8 schema fields changedv1.18.8
    • removedInput schema / properties / due_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / due_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / instructions / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / instructions / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / lock_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / lock_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedInput schema / properties / unlock_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / unlock_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  5. First observedv1.18.0

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare idempotentHint=true and destructiveHint=true; the description adds crucial context: only passed fields change, repeated identical calls are no-ops, null clears dates, and multiple_attempts is replaced wholesale, clearing omitted sub-fields. It also notes unsupported settings and permission requirements, with no contradiction of annotations.

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?

Despite being long, it is front-loaded with the core purpose, then proceeds to update semantics, return values, alternatives, nested-object caveat, unsupported settings, and permissions. Every sentence carries operational value for a complex nested mutation.

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 destructive nested-object update with no output schema, the description supplies return-field expectations, update semantics, clearing behavior, nested replacement caveat, unsupported features, and authorization requirements. Nothing material is missing for correct invocation.

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

Parameters5/5

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

Schema coverage is already 100%, but the description adds essential meaning beyond it: assignment_id provenance and Classic Quiz exclusion, null semantics for clearing dates, field-level partial update behavior, and the special whole-object replacement rule for quiz_settings.multiple_attempts. These are the exact semantic traps an agent needs to avoid.

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 New Quiz LTI), identifies the lookup key assignment_id, and explicitly distinguishes it from a Classic Quiz ID and from related siblings. An agent can immediately tell what this tool mutates and how the target is identified.

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 question-level edits to update_new_quiz_item and deletion to delete_new_quiz, and explains where assignment_id comes from via list_assignments, get_assignment, or create_new_quiz. It also states the permission precondition, leaving little ambiguity about when and how to use it.

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