Skip to main content
Glama

Create New Quiz

create_new_quiz
Destructive

Creates a New Quiz in a Canvas course and returns its quiz ID, assignment ID, and current field values so you can add questions or update settings afterward.

Instructions

Create a New Quiz (LTI) in a Canvas course. Returns the created quiz with its id, assignment_id, and current field values. New Quizzes is Canvas's current quiz engine; there is no tool here to create a Classic quiz — list_quizzes, get_quiz, and delete_quiz only read and delete that older type. After creating, add questions with create_new_quiz_item, change title, dates, or points with update_new_quiz, and remove the quiz with delete_new_quiz. Each call creates another quiz (not idempotent), so check list_quizzes before retrying. quiz_settings covers session behavior (calculator, shuffle, time limit, access code, one-at-a-time, and multiple_attempts); its multiple_attempts sub-object is replaced as a whole by Canvas, so a later update_new_quiz call must repeat every multiple_attempts sub-field you want to keep. IP-address access filtering and result_view_settings are not supported by this tool. Requires permission to manage quizzes in the course.

Input Schema

NameRequiredDescriptionDefault
titleYesTitle of the quiz
due_atNoISO-8601 due date
lock_atNoISO-8601 lock time
course_idYesThe Canvas course ID
publishedNoWhether the quiz is visible to students
unlock_atNoISO-8601 unlock time
instructionsNoHTML instructions shown before the quiz starts
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; defaults to sum of item 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. Changed2 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 / 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. Changed2 schema fields changedv1.18.8
    • removedInput schema / properties / instructions / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / instructions / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  5. First observedv1.18.0

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and openWorldHint=true; the description goes well beyond them by warning that repeated calls create duplicate quizzes, that Canvas replaces the multiple_attempts sub-object wholesale (omitted sub-fields are cleared), and that IP filtering and result_view_settings are unsupported. Those are exactly the failure modes an agent needs to know for a write tool.

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?

Purpose and return value are front-loaded, then workflow, then caveats — a sensible ordering with no filler. It is somewhat long and restates the multiple_attempts whole-object replacement that the schema already spells out, so one sentence is redundant.

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 9-parameter mutation tool with nested objects and no output schema, the description covers what is created, what is returned, what happens on retry, which follow-up tools exist, permission requirements, and unsupported settings. Nothing needed to call 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 two things the schema cannot: the summary of what quiz_settings covers (calculator, shuffle, time limit, access code, one-at-a-time, attempts) and the explicit statement that IP-address filtering and result_view_settings are not settable. The multiple_attempts replacement note duplicates the schema's own text, which caps it below 5.

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 ('Create a New Quiz (LTI) in a Canvas course') and immediately distinguishes it from the Classic-quiz siblings: list_quizzes, get_quiz, and delete_quiz only read and delete that older type. It also names the returned identifiers (id, assignment_id), so an agent knows exactly what it gets back.

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?

Gives an explicit lifecycle: create here, then create_new_quiz_item for questions, update_new_quiz for title/dates/points, delete_new_quiz to remove. It also names the when-not path ('not idempotent, so check list_quizzes before retrying') and states the permission prerequisite.

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