Skip to main content
Glama

canvas-grader-mcp

An MCP server that helps teachers and TAs grade Canvas LMS submissions with an AI assistant (Claude Code, Claude Desktop, Cursor, VS Code, …).

It reads each assignment's description, rubric, due dates and late policy, pulls in every student's submitted work as text, and lets the assistant propose a grade and written feedback about what's missing. Proposed grades are staged on your computer first; nothing reaches Canvas until you review it and approve posting. Posted grades and comments appear in SpeedGrader like any other.

IMPORTANT

Read Privacy and responsible use before using this with real student work. The server runs locally, but the student work it reads is sent to whichever AI model your MCP client uses.

What it can do

  • Find your grading work: every course where you're a teacher/TA with grading permission, assignments with how many submissions need grading.

  • Understand the assignment: description (as clean text), points, grading type, rubric criteria and ratings, per-student due dates (overrides and extensions), the course's automatic late policy.

  • Read submissions: text entries, URLs, and uploaded files: PDF, Word (.docx), Jupyter notebooks, Scratch projects (.sb3), zip archives, source code and other text files; publicly shared Google Docs/Slides/Sheets the student linked instead of uploading; links hidden behind text in PDFs; and QR codes in screenshots. Screenshots and photos inside PDFs and Word files (and uploaded images) are passed to the AI as images, so program screenshots get graded too. Files are downloaded to a local cache only.

  • Account for due dates: how late each submission was. If the course has an automatic late policy, it shows the deduction Canvas will apply (so you enter the raw score); if not, it flags that any penalty from the syllabus must be applied by the grader.

  • Your grading rules, per course: save guidelines (how lenient to be, what earns extra credit, what counts as evidence) and a manual late-penalty scale for each course. They're stored only on your computer and shown to the assistant with every assignment in that course.

  • Score breakdowns: stage a grade as per-category scores plus late penalty and extra credit; the tool totals it and writes the breakdown into the student's comment.

  • Consistency checks: find students who submitted identical files, and read any earlier attempt when a student re-uploaded the wrong file.

  • Stage → review → post: grades, rubric scores and comments are staged locally, previewed, then posted only with explicit confirmation. Comments explain to the student what was missing.

  • SpeedGrader links for every submission, or open SpeedGrader directly in your browser.

Related MCP server: draft-mcp-server

Requirements

  • A Canvas account with teacher, TA, or another role with "Grade submissions" permission in the courses you want to grade.

  • uv (installs Python 3.10+ automatically). Works on Linux, macOS and Windows.

Setup

1. Create a Canvas access token

In Canvas: Account → Settings → Approved Integrations → + New Access Token. Give it a purpose (e.g. "grading assistant") and an expiry date. Copy the token.

Some schools disable personal access tokens. If you don't see the button, ask your Canvas administrator.

2. Save your credentials (stored only on your computer)

uvx --from git+https://github.com/kaushikgunasekaren/canvas-grader-mcp canvas-grader-mcp configure

This asks for your Canvas URL and token (or pass them as configure --url <url> --token <token> where you can't type at a prompt), checks that they work, and saves them to ~/.config/canvas-grader-mcp/config.json (readable only by you; %APPDATA%\canvas-grader-mcp on Windows). Alternatively set the CANVAS_BASE_URL and CANVAS_API_TOKEN environment variables in your MCP client config.

Check it can see your courses:

uvx --from git+https://github.com/kaushikgunasekaren/canvas-grader-mcp canvas-grader-mcp check

3. Add it to your MCP client

Claude Code

claude mcp add canvas-grader --scope user -- uvx --from git+https://github.com/kaushikgunasekaren/canvas-grader-mcp canvas-grader-mcp

Claude Desktop, Cursor and other JSON-configured clients

{
  "mcpServers": {
    "canvas-grader": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/kaushikgunasekaren/canvas-grader-mcp", "canvas-grader-mcp"]
    }
  }
}

VS Code (.vscode/mcp.json): the same, under "servers" instead of "mcpServers".

Using it

Example prompts:

  • "Which of my courses have assignments that need grading?"

  • "Grade the ungraded submissions for Lab 3 in CSE 110 using the rubric. Stage them, don't post yet."

  • "Show me what you staged for Lab 3, with your reasoning."

  • "Change Alice's score to 8 and soften the comment, then post all of them."

  • "Leave a comment on Bob's Lab 3 submission saying his tests are missing."

The intended workflow is:

  1. get_assignment: the assistant reads the description, rubric and late policy.

  2. get_submission per student: reads their work and lateness, plus get_submission_images for screenshots/photos.

  3. stage_grade: proposes a grade, rubric scores and a student-facing comment, plus a private rationale for you.

  4. list_staged / post_staged_grades (preview): you review.

  5. post_staged_grades with confirm=true: grades and comments go to Canvas.

Per-course grading guidelines

Every course is graded differently, so rules live with the course, not in the tool. Tell the assistant once, for example:

"For course 12345, save these grading guidelines: be lenient on short answers, give +1 for each optional challenge completed, and require a screenshot of working code. Late penalty: nothing under 1 day late, 5% under a week, 10% after that (at least 3 points)."

That calls set_grading_guidelines, which stores the rules in ~/.local/share/canvas-grader-mcp/guidelines.json (owner-only). From then on, get_assignment includes them, and every late submission gets a suggested_penalty from your tiers. Different courses can have completely different rules.

If the assignment posts grades automatically, students see them immediately once posted; the tool warns you. With a manual posting policy they stay hidden until you post them in the Gradebook or SpeedGrader.

Tools

Tool

Writes to Canvas?

What it does

whoami

no

Account and Canvas instance in use

list_grading_courses

no

Courses where you can grade

list_assignments

no

Assignments, due dates, needs-grading counts

get_assignment

no

Description, rubric, points, dates, late policy, posting policy

list_submissions

no

Students' submission status, lateness, scores (filter: needs_grading, late, missing, …)

get_submission

no

A student's work as text, lateness, previous comments

get_submission_images

no

Screenshots, photos and scanned pages from the submitted files, as images the AI can look at (detail="high" for small text)

find_shared_files

no

Groups of students who submitted byte-identical files

set_grading_guidelines / get_grading_guidelines

no (local)

Your per-course grading rules and late-penalty tiers

stage_grade

no

Save a proposed grade/rubric/comment locally, optionally from a per-category breakdown

list_staged / discard_staged

no

Review or drop staged grades

post_staged_grades

yes (with confirm=true)

Send staged grades and comments to Canvas

post_comment

yes (with confirm=true)

Comment on a submission without grading

open_in_speedgrader

no

Open SpeedGrader in your browser

clear_downloaded_files

no

Delete cached copies of student files

Privacy and responsible use

  • Where data goes. This server only talks to your Canvas instance. But everything a tool returns, including student names, submissions and feedback, is passed to the AI model behind your MCP client (e.g. Anthropic for Claude). Student work is an education record under FERPA (US) and similar laws elsewhere. Check your institution's policy on sharing student work with AI services, and use an account/plan your school has approved where required.

  • Local data. Downloaded files are cached in ~/.cache/canvas-grader-mcp and staged grades in ~/.local/share/canvas-grader-mcp/staged.json (owner-only permissions). Run clear_downloaded_files when done.

  • You are the grader. AI-suggested grades can be wrong, especially for scanned work, images, or anything that needs judgment the description doesn't spell out. Review every staged grade before posting. Consider telling students that AI assists your grading if your institution requires disclosure.

  • Token safety. Your token can do anything your Canvas account can. Give it an expiry date, never commit it, and revoke it in Canvas settings if it leaks. The server only sends it to your Canvas host.

Limitations

  • Anonymous and moderated assignments are read-only (grade them in SpeedGrader).

  • Classic quizzes, discussions, annotations, LTI tools, and audio/video submissions aren't converted to text; the tool points you to SpeedGrader.

  • Videos (and video links) can't be watched; the tool only shows that a link or file exists.

  • Account admins without a course enrollment aren't listed by list_grading_courses.

Development

git clone https://github.com/kaushikgunasekaren/canvas-grader-mcp.git
cd canvas-grader-mcp
uv sync
uv run pytest            # runs against a fake Canvas API, no account needed

License

MIT. Not affiliated with Instructure.

Available Tools

17 tools
clear_downloaded_filesA

Delete locally cached copies of student submission files.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does add valuable scope clarification that only *local cached* copies are deleted (implying server-side submissions survive), which is meaningful for a delete operation, but it omits reversibility, whether files re-download on demand, and any confirmation/permission requirements.

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?

A single, front-loaded sentence with no filler. Every word earns its place and the key scoping qualifier ('locally cached') appears before the object of deletion.

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?

An output schema exists, so return values need not be explained, and there are no parameters to document. The only real omission is the when-to-use context for a cache-clearing action; otherwise the definition is complete for a zero-arg tool.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. Schema coverage is 100% and the empty argument object matches the description's no-argument nature.

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?

States a specific verb ('Delete') and a precise resource ('locally cached copies of student submission files'), so the action and scope are unambiguous. It is inherently distinct from the grading-oriented siblings, though it doesn't explicitly contrast itself with any of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what the tool does but never says when an agent should invoke it (e.g., after grading to free disk space, or to force a fresh re-download). No alternatives or preconditions are mentioned.

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

discard_stagedA

Delete staged grades (all for the assignment, or only the given students). Does not touch Canvas.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idsNo
course_idYes
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does add one genuinely useful piece of context – 'Does not touch Canvas', i.e. the operation is local to staging and has no external side effect – but it omits reversibility, behavior when nothing is staged, and error conditions for a destructive tool.

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?

Two short sentences, zero waste, with the destructive scope front-loaded and the side-effect boundary stated immediately after. Nothing needs trimming or reordering.

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?

An output schema exists, so return values need not be described, and the tool is a simple scoped delete. The main remaining gap is the absence of any error/edge-case behavior for a destructive operation with no annotations to fall back on.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains user_ids semantics ('all for the assignment, or only the given students'), which is the one non-obvious parameter, but gives no format or validation detail for course_id/assignment_id.

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 gives a specific verb+resource ('Delete staged grades') and clarifies the two deletion scopes (whole assignment vs. only given students), which cleanly separates it from siblings like post_staged_grades and stage_grade. It doesn't explicitly name those siblings, so it falls short of the top tier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent infers you call this when you want to undo staging. No when-not guidance and no explicit pointer to the alternative (post_staged_grades for committing), so the agent must reason about intent from the sibling list.

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

find_shared_filesB

Groups of students who submitted byte-identical files (team or copied work), so identical work can be graded consistently.

Downloads every submission's non-video attachments to the local cache.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose a significant, non-obvious side effect: it downloads every submission's non-video attachments into the local cache. That is exactly the kind of operational cost an agent needs to know. It still omits whether the download is mandatory or skippable, whether server state changes, and the interaction with the clear_downloaded_files sibling.

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

Conciseness3/5

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

It is short and has no filler, but the structure is weak: it leads with a fragmentary noun phrase rather than the action, and the arguably more critical download behavior is buried in a second sentence without being framed as a caveat.

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

Completeness3/5

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

An output schema exists, so return values need not be described. But for a tool that performs bulk network/disk downloads with zero annotations and two undocumented required parameters, the definition leaves key operational details (download cost, relation to clear_downloaded_files, scope) unaddressed, so it is only minimally complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for parameter meaning, and it provides nothing. The scope is only indirectly implied by the assignment/grading framing; neither course_id nor assignment_id is explained, nor is the assignment-level scope of the grouping stated.

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 identifies a distinctive capability no sibling offers: grouping students who submitted byte-identical files for consistent grading. However, it opens with a noun phrase ('Groups of students...') rather than a clear verb+resource, so the action being performed (detect/identify shared submissions) must be inferred. It is still unambiguous enough to distinguish from list_submissions or get_submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'so identical work can be graded consistently' implies a plagiarism/team-work detection use case, but there is no explicit when-to-use versus when-not-to-use guidance and no named alternative among the many grading siblings. Usage must be inferred from context.

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

get_assignmentB

Everything needed to grade an assignment: description, rubric, points, due dates and late policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
assignment_idYes

TDQS

B3.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully lists the assignment data included, but does not disclose permissions, error behavior, or whether the lookup is read-only beyond the implicit 'get' semantics.

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?

A single front-loaded sentence that lists the included fields without filler. Every phrase contributes to understanding what the caller receives.

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

Completeness3/5

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

For a simple two-parameter getter with no output schema, the description adequately summarizes the returned content. However, it omits parameter guidance and any behavioral details needed when annotations and schema descriptions are absent.

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

Parameters2/5

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

The input schema has 0% description coverage, and the description does not mention course_id or assignment_id at all. The parameter names are fairly self-evident, but the description adds no semantic detail to compensate for the schema gap.

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 clearly identifies the resource and the useful content returned for grading: description, rubric, points, due dates, and late policy. It implies retrieving a single assignment, distinguishing it from list_assignments, but does not explicitly state the retrieval action or name the sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'needed to grade an assignment' hints at the context, but there is no explicit guidance on when to use this tool versus list_assignments, get_submission, or get_grading_guidelines. No prerequisites or exclusions are provided.

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

get_grading_guidelinesC

The saved grading guidelines and late-penalty tiers for a course.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It says the guidelines are 'saved', implying persistence, but does not state that this is a read-only operation, what happens if the course has no guidelines, or whether permissions are required.

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 a single, tight sentence with no wasted words and is front-loaded with the resource being returned. It is appropriately sized for a simple getter, though the missing verb slightly reduces clarity.

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

Completeness3/5

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

For a simple one-parameter getter with no annotations and no output schema, the description states the resource and its scope at a basic level. It does not mention read-only semantics or parameter sourcing, leaving some gaps that the bare schema cannot fill.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It implies that the resource is scoped 'for a course', which loosely maps to course_id, but it adds no detail about the expected ID format, where to obtain it, or validation behavior. One required parameter remains essentially undocumented.

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

Purpose3/5

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

The description names the resource (grading guidelines and late-penalty tiers for a course) but uses a noun phrase with no verb, so the retrieval action is only implied by the tool name. It is distinguishable from set_grading_guidelines by the get_ prefix, but the description itself does not state that distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool versus siblings such as list_grading_courses or set_grading_guidelines, and no prerequisites or context conditions are given. The agent must infer usage purely from the name.

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

get_submissionC

A student's submitted work as text (text entry, URL, PDF/DOCX/code/notebook/.sb3 files, linked Google Docs), QR-code links, lateness, previous comments and grade.

ParametersJSON Schema
NameRequiredDescriptionDefault
attemptNoRead an earlier attempt (default: latest). See 'attempts' in the result.
user_idYes
course_idYes
fetch_linksNoDownload publicly shared Google Docs/Slides/Sheets the student linked instead of uploading
assignment_idYes
download_filesNo

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses the return payload but omits the significant side effect that download_files defaults to true and that files are downloaded (implied by the sibling clear_downloaded_files), plus no note on auth or rate limits for external Google Docs fetches.

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?

One dense sentence with no filler; the content list is front-loaded. It is a sentence fragment rather than a full statement, but nothing in it is wasted.

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

Completeness3/5

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

With no output schema, the description usefully enumerates what comes back (text, files, QR links, lateness, comments, grade), which is real value. However, for a 6-parameter tool with no annotations and 33% schema coverage, the missing parameter semantics and file-download side effect leave it incomplete.

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

Parameters2/5

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

Schema description coverage is 33% (attempt and fetch_links documented, download_files not), so the description should compensate. The mention of 'linked Google Docs' loosely corresponds to fetch_links, but it says nothing about attempt selection or what download_files toggles, leaving half the parameters semantically opaque.

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

Purpose3/5

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

The description is a noun phrase enumerating return content rather than a verb+resource statement, but 'A student's submitted work' combined with the tool name makes the retrieval intent reasonably inferable. It does not distinguish itself from siblings like list_submissions or get_submission_images, so an agent cannot tell from the text alone when this single-submission fetch is the right pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives (list_submissions for bulk, get_submission_images for images only), and no prerequisites. The only hint at usage is the parenthetical listing of artifact types, which describes content rather than context of use.

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

get_submission_imagesB

Screenshots, photos and scanned pages from a student's submitted files, as images.

PDF pages that contain pictures are rendered whole (so screenshots keep their captions); images embedded in Word files and uploaded image files are returned directly. Duplicates are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNo'high' renders at twice the resolution, for small text or blurry photosnormal
attemptNo
user_idYes
course_idYes
max_imagesNo
assignment_idYes

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden, and it does disclose genuinely useful processing semantics: PDF pages containing pictures are rendered whole to preserve captions, embedded Word images and uploaded images pass through directly, and duplicates are skipped. However, it is silent on the behaviors an agent most needs — what happens when a submission has more images than max_images (truncation? ordering?), and whether this is a pure read with no side effects.

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?

Three short sentences, front-loaded with the core deliverable, followed by the rendering rules and the dedup note. Nearly every clause earns its place; the trailing 'as images' is mildly redundant with the leading noun list but costs little.

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

Completeness3/5

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

With no output schema and no annotations, the description does a decent job of explaining the shape of the return (rendered page images vs. direct file images), which is the highest-value gap. But for a six-parameter tool with 17% schema coverage and an unmentioned max_images cap, the definition leaves an agent guessing about identifiers, attempt selection, and truncation behavior.

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

Parameters2/5

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

Schema description coverage is only 17% — just the `detail` enum is documented in the schema — yet the description mentions no parameter at all. It never explains course_id/assignment_id/user_id, what `attempt` selects, or that max_images defaults to 12 and caps at 30, so the reader cannot tell whether max_images silently truncates the set. It only loosely implies the source identifiers via 'a student's submitted files', which is insufficient compensation for the coverage gap.

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 names a concrete resource — screenshots, photos and scanned pages extracted from a student's submitted files — and implicitly states the retrieval verb via the name. It is clearly distinguishable from siblings like get_submission or list_submissions, which return text/metadata rather than rendered images. It stops short of an explicit 'retrieves X for Y' framing, but the resource and scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to reach for this tool versus get_submission, list_submissions, or open_in_speedgrader, nor any prerequisite or permission context. The reader must infer from the name alone that this is the image-oriented path. The only quasi-guidance is the duplicate-skipping note, which is behavior rather than usage selection.

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

list_assignmentsC

Assignments in a course, with how many submissions still need grading.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
only_needing_gradingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It mentions an aggregated output detail (how many submissions still need grading) but omits whether the operation is read-only, permission needs, pagination, or any constraints; the output schema likely covers return values, so this addition is marginal.

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?

A single, front-loaded sentence fragment with no wasted words. It is appropriately sized for a simple list tool, though the fragment form is slightly less clear than a full verb phrase.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. The description states the resource and an output dimension, which is the minimum for a simple list tool, but it leaves parameter semantics and usage context uncovered.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for both parameters. It only implies course scoping via 'in a course' and never explains the only_needing_grading filter, adding little meaning beyond the self-descriptive parameter names.

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 identifies the resource (assignments in a course) and a distinguishing output detail (submission grading counts), clearly separating it from sibling tools like get_assignment and list_submissions. It lacks an explicit verb, but the name supplies 'list' and the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool returns but gives no explicit context for when to choose it over alternatives like get_assignment or list_submissions. Usage is only implied by the resource name, with no exclusions or prerequisites.

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

list_grading_coursesB

Courses where you are a teacher/TA (or similar) and have permission to grade.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_concludedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the key behavioral trait: results are permission-filtered to grading-eligible courses. It says nothing about pagination, ordering, or what include_concluded does, so the disclosure is partial.

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?

A single tight clause with no filler, and the most important qualifier (grading permission) is front-loaded. It is arguably too terse rather than too long.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and the tool is a simple read-only listing. The remaining gap is the undocumented include_concluded parameter and the absence of any workflow guidance, which leaves it only minimally complete.

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

Parameters2/5

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

Schema description coverage is 0% and the sole parameter include_concluded (default false) is never mentioned in the description. The agent gets no explanation of what a 'concluded' course is or why it would be included.

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 identifies the exact resource returned: courses where the caller is a teacher/TA with grading permission. That scope distinction is meaningful, though it is a noun phrase with no verb and does not contrast itself with siblings like list_assignments or whoami.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this tool versus alternatives, nor any prerequisite or workflow position (e.g., 'call this first to get course IDs for list_assignments'). Usage is only inferable from the name.

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

list_stagedB

Grades and comments staged locally but not yet posted to Canvas.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
assignment_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the key behavioral trait: the data is local/staged and unposted. However, it says nothing about read-only safety, whether the query filters by course or assignment, or what happens when nothing is staged.

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?

A single economical sentence with no filler, and the distinguishing condition ('not yet posted to Canvas') is front-loaded. It reads as a fragment without a leading verb, which slightly weakens the framing.

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

Completeness3/5

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

An output schema exists, so return format need not be described, but the optional filtering parameters and any usage context are left unexplained. Adequate for a simple read tool, but with clear gaps around filtering behavior.

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

Parameters2/5

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

Schema description coverage is 0% and both parameters (course_id, assignment_id) are entirely undocumented. The description does not mention that results can be scoped by course or assignment, so it fails to compensate for the coverage gap beyond the self-explanatory parameter names.

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 clearly identifies the resource: grades and comments that are staged locally and not yet posted to Canvas. It implicitly differentiates from siblings like post_staged_grades and discard_staged by emphasizing the 'not yet posted' state, though it never states the verb 'list' explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to call this versus post_staged_grades, discard_staged, or stage_grade. An agent can infer it previews pending items, but neither prerequisites nor exclusions are stated.

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

list_submissionsC

Students' submissions for an assignment with status, lateness and current score.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoneeds_grading
course_idYes
assignment_idYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full burden. It never states that this is a read-only operation, whether results are paginated or scoped by role, or that the default filter silently limits output to ungraded work — a meaningful behavioral gap for a grading workflow.

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?

A single front-loaded sentence with no filler or redundancy. It is appropriately short, though the brevity is partly under-specification rather than efficiency.

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

Completeness2/5

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

With no annotations, no output schema, 0% parameter coverage, and an enum of seven mutually exclusive filter values, the definition leaves critical call-time decisions unexplained. It should at minimum document the filter values and the default's effect.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the seven filter enum values, the needs_grading default, or the meaning of course_id/assignment_id beyond their names. It mentions 'status' and 'lateness' loosely, but this does not compensate for three undocumented parameters.

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 names the resource (submissions for an assignment) and what it returns (status, lateness, current score), which is enough to separate it from the singular get_submission sibling. It is a noun phrase rather than a verb statement, but the intent (listing) is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no indication of when to use this versus get_submission, list_staged, or list_assignments, and no mention of the default filter (needs_grading) that governs which submissions come back. The agent must infer all routing decisions.

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

open_in_speedgraderB

Open SpeedGrader in the user's browser (optionally on a specific student).

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNo
course_idYes
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It usefully discloses the side effect that this opens a browser UI rather than returning data, which is meaningful for an agent choosing a data-fetching sibling instead. However, it does not cover permissions, whether the action is read-only, failure modes, or what the caller gets back.

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?

A single sentence with zero filler, front-loading the action and resource before the optional scope. Nothing is wasted or reordered.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. Still, for a side-effecting UI-launch tool with no annotations and undocumented parameters, the description should note prerequisites (e.g. relevance of course/assignment context, or that it depends on a logged-in browser session).

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate. It only clarifies user_id (targeting a specific student); course_id and assignment_id are left entirely to their bare titles, and the fact that user_id is optional is already expressed by its null default and non-required status in the schema.

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?

States a specific verb and resource ("Open SpeedGrader") plus the destination ("in the user's browser") and an optional scope ("on a specific student"). An agent can tell this is distinct from the grading/post-staging siblings, though it never explicitly contrasts itself with any of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The "optionally on a specific student" clause hints at when to supply user_id, but there is no explicit when-to-use guidance, no prerequisites (e.g. browser session/login state), and no named alternative among the sibling tools.

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

post_commentC

Post a feedback comment on a student's submission without changing the grade.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
confirmNofalse = preview only; true only after the user approves the text
user_idYes
course_idYes
assignment_idYes
group_commentNo

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses one useful trait (grade is untouched) but omits the most consequential behavior: that confirm defaults to false and the call is preview-only until explicitly approved, as well as any statement about visibility, notification, or reversibility of a posted comment.

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?

A single tight sentence with the scope constraint front-loaded and no wasted words. It is efficient, though its brevity contributes to the coverage gaps elsewhere rather than earning credit for completeness.

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

Completeness2/5

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

For a 6-parameter tool with no annotations, no output schema, and 17% schema coverage, this one sentence is not enough. The preview/confirm safety flow and the meaning of group_comment are left for the agent to infer, which is risky for a tool that publishes user-visible content.

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

Parameters2/5

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

Schema description coverage is only 17% – just the confirm parameter. The description adds no meaning for course_id, assignment_id, user_id, text, or group_comment; notably group_comment is an undocumented boolean/null flag with no explanation anywhere. With such low coverage the description should compensate but does not.

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 gives a specific verb+resource ('Post a feedback comment on a student's submission') and adds a scoping clause ('without changing the grade') that distinguishes it from the grading siblings like stage_grade. It stops short of naming a sibling explicitly, so it does not reach 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'without changing the grade' clause implies this is the non-grading alternative to the stage_grade/post_staged_grades flow, but no sibling is named and no when-not condition is given. The critical two-step preview/confirm workflow is never mentioned, so usage is only implied.

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

post_staged_gradesA

Send staged grades/comments to Canvas (they appear in SpeedGrader). Without confirm=true, only previews.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNofalse = preview only. Set true only after the user has approved the staged grades.
user_idsNoOnly these students; default all staged for the assignment
course_idYes
assignment_idYes

TDQS

A3.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries full burden; it usefully discloses the critical preview-vs-post gate and that results appear in SpeedGrader. It stops short of stating irreversibility, required teacher permissions, or what happens on partial failure.

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?

Two tight sentences with the mutation and its safety gate front-loaded; no waste.

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

Completeness3/5

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

For a mutation tool with no annotations and no output schema, the definition covers the core post/preview behavior but omits workflow relationships to sibling staging tools and consequence details an agent needs to invoke it safely.

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

Parameters3/5

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

Schema coverage is only 50%, and the two undocumented parameters (course_id, assignment_id) are the required ones. The description restates confirm's preview behavior (already fully documented in the schema) and says nothing about user_ids, so it adds little beyond the schema.

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?

Clear specific verb+resource: it sends staged grades/comments to Canvas and notes they surface in SpeedGrader. An agent can tell this is the publish step for previously staged grades, but it never names sibling tools like stage_grade, list_staged, or discard_staged to differentiate the workflow position.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies a two-phase workflow by noting that without confirm=true the call only previews, which is genuine usage guidance. However it never states when to prefer this over siblings (stage_grade/discard_staged) or the precondition that grades must already be staged.

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

set_grading_guidelinesA

Save grading guidelines and a manual late-penalty scale for a course (stored only on this computer).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idYes
guidelinesNoHow this grader wants work graded (leniency, extra credit, what counts as evidence...). Shown with every assignment.
late_penalty_tiersNoManual late scale, e.g. [{under_days: 1, percent: 0}, {under_days: 7, percent: 5, min_points: 1}, {under_days: null, percent: 10, min_points: 3}]

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses that data is 'stored only on this computer' (local-only persistence), which is real behavioral context, but it omits whether saving replaces vs. merges existing guidelines, what happens to unfilled fields, and any auth requirements.

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?

A single front-loaded sentence with no filler; the storage caveat is parenthetically tucked in after the core action. Every clause earns its place.

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

Completeness3/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 no annotations, so the description should do more work. It covers purpose and storage locality but leaves key mutation semantics (overwrite behavior, partial-update behavior, failure modes) unaddressed despite being a save/create-style tool.

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

Parameters3/5

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

Schema coverage is 67%, and the schema itself richly documents guidelines and late_penalty_tiers (including the LateTier shape with an example-scale hint). The description adds only the framing 'manual late-penalty scale' and does not mention the required course_id, so it is roughly at baseline.

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?

States a specific verb ('Save') and resource ('grading guidelines and a manual late-penalty scale') scoped 'for a course', which clearly distinguishes it from the read-oriented sibling get_grading_guidelines. It does not name any sibling explicitly, but the write-vs-read split is inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'Save ... for a course', but there is no explicit when-to-use guidance, no mention of the get_grading_guidelines counterpart, and no stated preconditions or exclusions. The agent must infer the workflow context.

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

stage_gradeA

Save a proposed grade/comment locally (nothing is sent to Canvas). Review with list_staged, send with post_staged_grades.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoExtra line at the end of the student comment (with breakdown)
gradeNoRaw score/grade before any automatic late deduction, e.g. 8.5, '85%', 'A-', 'complete'
excuseNo
rubricNocriterion_id -> {points, comments?, rating_id?}
commentNoFeedback the student will see: what is missing/wrong and how to improve
user_idYes
breakdownNoOne entry per grading category; the grade is computed from it and the comment gets a score breakdown. 'comment' becomes the opening sentence.
course_idYes
rationaleYesPrivate note for the grader: why this grade (not shown to the student)
extra_creditNoExtra credit earned (with breakdown); omit when none
late_penaltyNoManual late penalty (with breakdown), e.g. {points: 5, reason: 'submitted 2 days late'}
assignment_idYes
group_commentNoGroup assignments: send the comment to every member (default yes)

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the most important trait: this is a local staging write with no Canvas side effect, requiring a separate post step. It does not address overwrite/re-stage behavior for the same user/assignment, permissions, or idempotency.

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?

Two short sentences, zero waste, with the surprising behavior (local only) front-loaded ahead of the workflow routing.

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

Completeness3/5

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

For a 13-parameter grading tool with no annotations and no output schema, the description is thin. It never explains what a staged entry contains, how breakdown/grade/extra_credit/late_penalty interact, or what list_staged will show, though the schema descriptions cover much of the field-level semantics.

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

Parameters3/5

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

Schema description coverage is 69% and the description adds no parameter-level detail beyond naming 'grade/comment' — precedence between 'grade' and 'breakdown', the auto late deduction vs. manual 'late_penalty', and the effect of 'group_comment' are left entirely to the schema. Baseline 3 is appropriate since the schema does most of the work.

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?

Specific verb (save/stage) plus resource (grade/comment) and a critical scope qualifier: 'nothing is sent to Canvas.' An agent can immediately tell this apart from post_staged_grades without opening the schema.

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?

Explicitly routes the agent through the workflow: review with list_staged, send with post_staged_grades. It names the follow-up alternative and its condition, but offers no when-not-to-use guidance (e.g. post_comment for standalone comments, or that staged grades can be discarded).

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

whoamiC

The Canvas account and instance this server is connected to.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses essentially nothing about side effects, permissions, or whether the call is safe/non-mutating. For a trivial zero-arg lookup this is a modest gap, but identity tools can leak auth/instance context that is worth calling out.

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

Conciseness3/5

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

It is a single short sentence with no padding, which is good, but it is under-specified rather than genuinely concise — the fragment lacks a subject/verb and spends its one clause on the return value instead of the action.

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

Completeness3/5

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

With no output schema and no annotations, the description does at least indicate what the call yields (account and instance), which is the essential payload. However it omits the return format and any indication of when the result matters, leaving it minimally adequate for a diagnostic tool.

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?

The tool takes zero parameters, so the baseline is 4. There are no arguments whose semantics the description could clarify or confuse.

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

Purpose3/5

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

The description names the resource it exposes (the Canvas account and instance) but is a noun-phrase fragment with no verb, so it reads as a label rather than a statement of what the tool does. An agent can infer it returns identity/connection info, but the purpose is only implied. It is distinguishable from all grading-related siblings, which helps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention that it takes no arguments, and no comparison to alternatives. The only guidance is implicit from the name 'whoami'. Nothing tells the agent whether this is a setup/verification step or a routine call.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 17 tool updatesv0.3.0
    • First observedclear_downloaded_files
    • First observeddiscard_staged
    • First observedfind_shared_files
    • First observedget_assignment
    • First observedget_grading_guidelines
    • First observedget_submission
    • First observedget_submission_images
    • First observedlist_assignments
    • First observedlist_grading_courses
    • First observedlist_staged
    • First observedlist_submissions
    • First observedopen_in_speedgrader
    • First observedpost_comment
    • First observedpost_staged_grades
    • First observedset_grading_guidelines
    • First observedstage_grade
    • First observedwhoami

TDQS

B3.2/5.0

Scored across 17 tools

Disambiguation4/5

Most tools have clearly distinct purposes (listing vs. getting vs. staging vs. posting), and the stage/post/discard lifecycle is well separated. Minor potential confusion exists between get_submission, get_submission_images, and list_submissions, and between the two guideline tools, but descriptions disambiguate them.

Naming Consistency4/5

Nearly all tools use a consistent snake_case verb_noun pattern (list_assignments, get_submission, stage_grade, post_staged_grades). The only real deviation is whoami, which breaks the verb_noun convention but is still readable and unambiguous.

Tool Count4/5

17 tools is slightly heavy but justified by a genuine multi-stage grading workflow (courses, assignments, submissions, media, caching, staging, posting). Each tool maps to a distinct step with little redundancy.

Completeness4/5

The surface covers the full grading lifecycle: discover courses/assignments, read submissions and images, manage guidelines, stage/discard/post grades, comment, and open SpeedGrader. Minor gaps like rubric-score retrieval or bulk filtering exist but core workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to perform code reviews by providing access to staged files, git diffs, and repository file content. It allows users to evaluate changes and context within any local git repository before committing or pushing.
    3
    1 npm
    ISC
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI coding agents to submit work for external review before declaring a task done, receiving evidence-backed fix lists and verdicts based on git-measured changes and calibrated quality scoring.
    3
    MIT