Skip to main content
Glama

Get Quiz Question Responses

get_quiz_question_responses
Read-only

Review every student's answer to one or all questions in a Classic Quiz, pivoted by question instead of by student — for grading essay/short-answer/file-upload questions consistently across a class instead of paging through SpeedGrader one…

Instructions

Review every student's answer to one or all questions in a Classic Quiz, pivoted by question instead of by student — for grading essay/short-answer/file-upload questions consistently across a class instead of paging through SpeedGrader one student at a time. Classic Quizzes only (quiz_type: assignment, practice_quiz, graded_survey, survey) — New Quizzes exposes responses through a different API. Omit question_id to get every question; provide it to scope to one. Each question reports needs_manual_grading (true for essay and file-upload questions) and points_possible. Questions drawn from a question bank are included: Canvas stores each draw as a generated question that the quiz's question list omits, so they are resolved from the students' own attempts, listed after the quiz's fixed questions, and report position: null. Each response reports the raw Canvas correctness value plus a derived scoring_state (correct / incorrect / partial / not_scored / awaiting_manual_grading / graded / unscored) so "undefined" is never read as an answer. Scans one Canvas API call per completed or pending-review submission, plus one per attempt needed to resolve bank-drawn questions, plus one paginated call to fetch every student's submitted answer text for the quiz (skipped, with answer_text_available: false and a reason, when the quiz has no assignment, is an anonymous survey, or the fetch fails). A failed per-submission answers fetch is recorded in submissions_failed, and a response whose question cannot be resolved is counted in unmatched_response_count and unmatched_question_ids, rather than aborting the whole call. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, student names are replaced with stable pseudonyms; essay/short-answer prose is student-authored text and may itself contain a real name, which pseudonymization of structured fields cannot strip.

Input Schema

NameRequiredDescriptionDefault
quiz_idYesThe Canvas quiz ID (Classic Quizzes only)
course_idYesThe Canvas course ID
question_idNoScope the result to a single question ID (from list_quiz_questions, or a bank-drawn question_id returned by this tool). Omit to return every question with every student's response.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 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"
    • addedInput schema / properties / question_id / anyOf
      Added value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "pattern": "^[1-9][0-9]{0,18}$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / question_id / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / question_id / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / question_id / type
      Removed value: -"integer"
    • addedInput schema / properties / quiz_id / anyOf
      Added value: +[
      +  {
      +    "exclusiveMinimum": 0,
      +    "maximum": 9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "pattern": "^[1-9][0-9]{0,18}$",
      +    "type": "string"
      +  }
      +]
    • removedInput schema / properties / quiz_id / exclusiveMinimum
      Removed value: -0
    • removedInput schema / properties / quiz_id / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / quiz_id / type
      Removed value: -"integer"
  2. Changed1 schema field changedv1.18.14
    • changedInput schema / properties / question_id / description
      Previous value: -"Scope the result to a single question ID (from list_quiz_questions). Omit to return every question with every student's response."New value: +"Scope the result to a single question ID (from list_quiz_questions, or a bank-drawn question_id returned by this tool). Omit to return every question with every student's response."
  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. Addedv1.18.3

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is already known. The description goes well beyond by disclosing the per-submission API call cost, the fallback behavior when answer fetching is skipped (answer_text_available: false with a reason), how failures are surfaced (submissions_failed, unmatched_response_count), and the pseudonymization caveat about student-authored prose.

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?

The description is long but front-loads the core purpose and the SpeedGrader alternative before diving into edge cases. The dense parenthetical about API call counts is information-rich but slightly heavy; nearly every sentence earns its place.

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 read-only, multi-call aggregation tool with no output schema, the description supplies the return shape (needs_manual_grading, points_possible, scoring_state, position: null for bank-drawn questions), the failure surface, and the privacy caveat. Nothing material 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. The description adds real value by clarifying the omit-versus-provide semantics of question_id and by explaining that a bank-drawn question_id returned by this tool can be fed back in, which the schema description only partially captures.

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?

The description states a specific verb and resource ('Review every student's answer to one or all questions in a Classic Quiz') and quantifies the pivot ('by question instead of by student'), which distinguishes it immediately from sibling answer-level tools like get_quiz_submission_answers and list_quiz_submissions.

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?

It names the exact use case ('grading essay/short-answer/file-upload questions consistently across a class instead of paging through SpeedGrader one student at a time') and gives an explicit when-not ('Classic Quizzes only ... New Quizzes exposes responses through a different API'). It also states clearly that omitting question_id widens scope while providing it narrows 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