Skip to main content
Glama

canvas-mcp

Run your Canvas course from an AI assistant.

canvas-mcp is an MCP server that gives Claude, Cursor, VS Code, or any other MCP-capable assistant 47 tools for Canvas LMS — reading your roster, drafting assignments, building modules, grading submissions, posting announcements, and pulling the whole gradebook into one table.

It is written for instructors, not Canvas administrators. Everything it does, it does as you, with your token, inside the courses you already teach.

You:  "Which students haven't submitted Essay 2 yet, and when is it due?"
      "Draft a Week 9 module on Bonhoeffer with a reading page and a discussion,
       but leave it unpublished so I can look first."
      "Give everyone who submitted Lab 3 full marks with the comment 'Nice work'."

Table of contents


Related MCP server: Canvas LMS MCP Server

What you get

47 tools

across diagnostics, courses, people, assignments, grading, content, and communication

Three safety tiers

read-only always on; writes on by default; deletes off by default

Tools you disable are never published

a withheld tool isn't in the model's tool list at all — it can't be called and it costs no context

Bounded output

big payloads are slimmed to the fields that matter and truncated with an explicit notice, so one list_submissions doesn't eat your context window

Readable text, not raw HTML

syllabi, pages, and discussion threads come back as plain text with paragraph breaks intact

Optional PII redaction

CANVAS_REDACT_PII=1 replaces emails and SIS ids with stable anon-… hashes

Retries that understand Canvas

Canvas signals rate limiting with a 403, not a 429; this server tells the two apart and only retries the right one

A doctor command

tells you exactly which of base-url / token / permissions / course-id is wrong, instead of a generic 401

No vendor lock-in

pure requests against the public Canvas REST API; no Canvas app registration, no OAuth dance, no admin approval


Quick start (5 minutes)

1. Install

Pick whichever matches how you already run Python.

With uv (recommended — no virtualenv to manage):

uvx --from git+https://github.com/zhenghh04/canvas-mcp canvas-mcp doctor

With pip:

pip install git+https://github.com/zhenghh04/canvas-mcp

From a clone (if you want to modify it):

git clone https://github.com/zhenghh04/canvas-mcp
cd canvas-mcp
pip install -e ".[dev]"
pytest          # 163 tests, all offline — none of them touch a real course

Requires Python 3.10 or newer.

2. Get a Canvas API token

You do not need an administrator, and you do not need to register an app.

  1. Log in to Canvas in a browser.

  2. Click Account (left sidebar) → Settings.

  3. Scroll to Approved Integrations.

  4. Click + New Access Token.

  5. Purpose: canvas-mcp. Expiry: leave blank for no expiry, or set a date — if you set one, note it, because an expired token looks exactly like a wrong token.

  6. Click Generate Token.

  7. Copy the token now. Canvas shows it exactly once. If you lose it, delete the entry and make a new one.

The token carries all your Canvas permissions — in every course you teach, and every course you take. Treat it like your password. See Student privacy and FERPA.

Locked down? Some institutions disable self-service tokens. If you don't see + New Access Token, ask your Canvas admin for a token or for the setting to be enabled for faculty.

3. Find your course id

Open the course in Canvas and look at the URL:

https://yourschool.instructure.com/courses/12345
                                           ^^^^^
                                           this is the course id

Setting a default course id is optional but makes every conversation shorter — you can say "the roster" instead of "the roster for course 12345". You can always override it per call, and canvas_list_courses will show you all of them.

4. Tell the server about them

Two settings are required: where your Canvas lives and your token.

You can supply them three ways. Later entries do not override earlier ones — an already-set environment variable always wins, so your MCP client's env block beats any .env file.

Priority

Source

1

Real environment variables (including your MCP client's env block)

2

$CANVAS_MCP_ENV_FILE — point this at any file you like

3

./.env in the current directory

4

~/.config/canvas-mcp/.env

The last one is usually what you want, because it works no matter which directory your assistant starts in:

mkdir -p ~/.config/canvas-mcp
cat > ~/.config/canvas-mcp/.env <<'EOF'
CANVAS_BASE_URL=https://yourschool.instructure.com
CANVAS_API_TOKEN=paste-your-token-here
CANVAS_DEFAULT_COURSE_ID=12345
EOF
chmod 600 ~/.config/canvas-mcp/.env

That chmod matters — the file now contains a credential.

See env.example for every available setting, annotated.

5. Check it works

canvas-mcp doctor

A healthy run looks like:

canvas-mcp 0.2.0

[OK  ] CANVAS_BASE_URL set — https://yourschool.instructure.com
[OK  ] CANVAS_API_TOKEN set
[OK  ] Token authenticates — Ada Lovelace (id 10665)
[OK  ] Teacher enrollments visible — 1 active course(s)
          12345  Introduction to Analytical Engines (CS-101)
[OK  ] CANVAS_DEFAULT_COURSE_ID resolves — Introduction to Analytical Engines (CS-101)

42 tools would be published (writes=on, destructive=off). Run `canvas-mcp tools` for the list.

If any line is wrong, doctor says what to fix. See Troubleshooting.

6. Connect your AI assistant

One command:

claude mcp add canvas -- canvas-mcp serve

Or add to .mcp.json in your project (or ~/.claude.json for every project):

{
  "mcpServers": {
    "canvas": {
      "command": "canvas-mcp",
      "args": ["serve"],
      "env": {
        "CANVAS_BASE_URL": "https://yourschool.instructure.com",
        "CANVAS_DEFAULT_COURSE_ID": "12345"
      }
    }
  }
}

Note that the token is deliberately not in this file — .mcp.json is the kind of file that gets committed to git by accident. Leave CANVAS_API_TOKEN in ~/.config/canvas-mcp/.env.

Edit claude_desktop_config.json:

  • macOS — ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows — %APPDATA%\Claude\claude_desktop_config.json

  • Linux — ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "canvas": {
      "command": "canvas-mcp",
      "args": ["serve"],
      "env": {
        "CANVAS_BASE_URL": "https://yourschool.instructure.com",
        "CANVAS_DEFAULT_COURSE_ID": "12345"
      }
    }
  }
}

Then fully quit and reopen Claude Desktop — reloading the window is not enough.

If canvas-mcp isn't found, Claude Desktop doesn't inherit your shell PATH. Use an absolute path (which canvas-mcp will tell you), or use uvx:

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

Settings → MCP → Add new MCP server, or edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "canvas": {
      "command": "canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://yourschool.instructure.com" }
    }
  }
}

Create .vscode/mcp.json:

{
  "servers": {
    "canvas": {
      "type": "stdio",
      "command": "canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://yourschool.instructure.com" }
    }
  }
}

Standard stdio MCP server:

canvas-mcp serve                      # stdio, the default

Or serve over HTTP for a remote or multi-client setup:

canvas-mcp serve --transport http --host 127.0.0.1 --port 8900

Bind to 127.0.0.1 unless you have put real authentication in front of it. This server has no auth of its own: anyone who can reach the port is acting as you, in your courses, with your token.

Ready-made config snippets live in examples/.


Safety model

Three tiers. A tool you don't enable is never registered — the model cannot see it, cannot call it, and it costs nothing in context.

Tier

Default

Controlled by

What's in it

read

always on

—

24 tools. Rosters, assignments, submissions, pages, the gradebook. Never changes anything.

write

on

CANVAS_ENABLE_WRITES=0 to disable

18 tools. Create and edit assignments, pages, modules; post grades; send announcements and messages.

destructive

off

CANVAS_ALLOW_DESTRUCTIVE=1 to enable

5 tools. Delete assignments, pages, modules; remove enrollments; arbitrary POST/PUT/DELETE.

The destructive flag cannot bypass the write gate: with CANVAS_ENABLE_WRITES=0, setting CANVAS_ALLOW_DESTRUCTIVE=1 publishes nothing.

Three postures worth knowing:

# Read-only. Nothing can change. Good for a first week, or for a shared setup.
CANVAS_ENABLE_WRITES=0

# Default. Author and grade freely; nothing can be deleted.
# (this is what you get with no settings at all)

# Full. Only turn this on for a specific cleanup task, then turn it back off.
CANVAS_ALLOW_DESTRUCTIVE=1

Beyond the tiers, every mutating tool says so in its own description — MUTATES the course, MUTATES STUDENT RECORDS, NOTIFIES PEOPLE, IRREVERSIBLE — because that text is what the model actually reads when deciding whether to ask you first. The server's instructions tell the assistant to get explicit go-ahead before any of them.

Some further guarantees, each with a test behind it:

  • Authoring is unpublished by default. canvas_create_assignment, canvas_create_page, and canvas_create_module all create drafts. Students see nothing until you publish.

  • Your token never reaches the file-storage host. Canvas uploads go to an S3 / InstFS URL with its own pre-signed credentials; the bearer token is stripped.

  • Student filenames are sanitised. canvas_download_submissions writes attachments to disk, and ../../.ssh/authorized_keys is a perfectly legal Canvas filename.

  • Messages don't leak the recipient list. canvas_message_students sends individually by default, not as a group conversation.

  • Errors are errors. A bug in this server raises; only genuine Canvas failures are converted into a readable ERROR: … string for the model.


The 47 tools

Legend: (blank) read-only · ! write · !! destructive.

Run canvas-mcp tools to see exactly what your configuration publishes.

Diagnostics

Tool

What it does

canvas_auth_status

Check connectivity, identity, and which tiers are enabled. Call this first.

canvas_api_get

Escape hatch: GET any Canvas REST endpoint that has no dedicated tool.

!!

canvas_api_write

Escape hatch: POST/PUT/DELETE any endpoint. Unrestricted.

Courses

Tool

What it does

canvas_list_courses

List the courses you can see.

canvas_get_course

One course: teachers, student count, syllabus as plain text.

canvas_list_sections

Sections with enrollment counts.

!

canvas_update_course

Edit course settings (name, dates, publish state).

!

canvas_update_syllabus

Replace the syllabus body.

People

Tool

What it does

canvas_list_students

The roster.

canvas_list_enrollments

Enrollments including the enrollment_id you need to change one.

!

canvas_enroll_user

Add a user to the course.

!!

canvas_remove_enrollment

Remove someone from the course.

Assignments

Tool

What it does

canvas_list_assignments

Assignments with due dates and needs-grading counts.

canvas_get_assignment

One assignment, description rendered to plain text.

canvas_list_assignment_groups

Gradebook categories and their weights.

!

canvas_create_assignment_group

Create a gradebook category.

!

canvas_create_assignment

Create an assignment (unpublished by default).

!

canvas_update_assignment

Edit an existing assignment.

!!

canvas_delete_assignment

Delete an assignment.

Grading

Tool

What it does

canvas_list_submissions

Status, score, timestamps, lateness for an assignment.

canvas_get_submission

One student's submission: body text, attachments, comments.

canvas_get_gradebook

The whole gradebook as one student × assignment table.

canvas_download_submissions

Download every file attachment for an assignment.

!

canvas_grade_submission

Post a grade and/or a comment.

!

canvas_bulk_grade

Post many grades to one assignment at once.

Content

Tool

What it does

canvas_list_pages

Wiki page titles and url slugs.

canvas_get_page

One page's body as plain text.

canvas_list_modules

The course outline, optionally with items.

canvas_list_quizzes

Quizzes in a course.

canvas_list_files

Files uploaded to a course.

canvas_download_file

Download one course file.

!

canvas_create_page

Create a wiki page (unpublished by default).

!

canvas_update_page

Edit a wiki page.

!

canvas_create_module

Create a module (unpublished by default).

!

canvas_update_module

Edit or publish a module.

!

canvas_create_module_item

Add a page / assignment / quiz / link to a module.

!

canvas_upload_file

Upload a local file into Files.

!!

canvas_delete_page

Delete a wiki page.

!!

canvas_delete_module

Delete a module.

Communication

Tool

What it does

canvas_list_announcements

Announcements, newest first, with their text.

canvas_list_discussions

Discussion topics.

canvas_get_discussion

A topic with its full reply thread as plain text.

canvas_list_calendar_events

Calendar events, optionally with assignment due dates.

!

canvas_post_announcement

Post an announcement — students are notified.

!

canvas_create_discussion

Create a discussion topic.

!

canvas_create_calendar_event

Add an event to the course calendar.

!

canvas_message_students

Send a Canvas inbox message.

Full parameter-by-parameter reference: docs/TOOLS.md.


Configuration reference

Every setting is an environment variable. All are optional except the first two.

Required

Variable

Example

Notes

CANVAS_BASE_URL

https://yourschool.instructure.com

No trailing slash needed; one is stripped. Do not include /api/v1.

CANVAS_API_TOKEN

7~abc123…

From Account → Settings → New Access Token.

Convenience

Variable

Default

Notes

CANVAS_DEFAULT_COURSE_ID

—

Used whenever a tool's course_id is omitted.

CANVAS_MCP_ENV_FILE

—

Path to a .env file to load first.

CANVAS_DOWNLOAD_DIR

./canvas-downloads

Where downloaded files and submissions land.

Safety

Variable

Default

Notes

CANVAS_ENABLE_WRITES

1

0 for a strictly read-only server.

CANVAS_ALLOW_DESTRUCTIVE

0

1 publishes the five delete/raw-write tools.

CANVAS_REDACT_PII

0

1 pseudonymises emails, login ids, SIS ids.

Trimming the tool surface

Fewer tools means less context spent and fewer ways to go wrong.

Variable

Example

Notes

CANVAS_TOOL_GROUPS

courses,assignments,grading

Comma-separated. Groups: diagnostics, courses, people, assignments, grading, content, communication.

CANVAS_TOOLS

canvas_auth_status,canvas_get_gradebook

Strict allowlist. Only these, and only if their tier is enabled.

CANVAS_DISABLE_TOOLS

canvas_message_students

Denylist, applied after everything else.

An allowlist can never bypass a tier gate. Listing canvas_delete_page in CANVAS_TOOLS does nothing unless CANVAS_ALLOW_DESTRUCTIVE=1.

Limits and performance

Variable

Default

Notes

CANVAS_TIMEOUT

30

Seconds per API request.

CANVAS_UPLOAD_TIMEOUT

300

Seconds for file uploads.

CANVAS_MAX_UPLOAD_MB

100

Refuse larger local files.

CANVAS_PER_PAGE

100

Canvas page size.

CANVAS_MAX_PAGES

10

Pagination cap. Results past it are marked _truncated.

CANVAS_MAX_CHARS

20000

Response size cap, with an explicit truncation notice.

CANVAS_MAX_RETRIES

3

Attempts on rate limits and 5xx.


Command-line interface

canvas-mcp                  # same as `serve` — stdio MCP server
canvas-mcp serve            # stdio (what MCP clients launch)
canvas-mcp serve --transport http --host 127.0.0.1 --port 8900
canvas-mcp doctor           # diagnose configuration and permissions
canvas-mcp tools            # list what this configuration publishes, and what it withholds
canvas-mcp config           # show resolved settings (token redacted)

canvas-mcp config prints "api_token": "set (70 chars)" — never the token itself.

serve deliberately starts even when misconfigured, printing a warning to stderr. An MCP client that sees its server exit immediately reports only "broken pipe", which tells you nothing; a running server can answer canvas_auth_status with an actual explanation.


Recipes

Things that work well. More in docs/RECIPES.md.

Triage before office hours

"Who hasn't submitted Essay 2? For each, tell me whether they've submitted the previous two assignments."

Build a week

"Create an unpublished module called 'Week 9 — Bonhoeffer', add a page with the reading questions below, and a discussion topic due Friday 11:59pm. Don't publish anything."

Grade a batch

"List submissions for Lab 3. For everyone who submitted on time with a file attached, give 10/10 and the comment 'Received, nice work.' Show me the list before you post anything."

Catch grading drift

"Pull the gradebook. Which assignments still have ungraded submissions, and which students are more than one standard deviation below the mean overall?"

Sync a syllabus

"Here's my updated syllabus as markdown. Replace the Canvas syllabus with it, preserving the existing course-policies section at the bottom."

Read the room

"Summarise the Week 4 discussion thread. What are the three most common misunderstandings, and which students should I follow up with?"

A habit worth forming: ask for the plan before the action. "Show me what you'd post, then wait" costs one extra turn and catches the wrong-assignment-id mistake before it reaches 30 students.


Student privacy and FERPA

This server reads real student data. A few things are worth being deliberate about.

Your token is your whole Canvas account. Not just one course — every course you teach and every course you take. Keep it in a chmod 600 file, never in a git-tracked config, and revoke it from Account → Settings if it leaks.

Student data flows to your AI provider. When the assistant reads a roster or a submission, that text goes to whoever runs the model. Check whether your institution has a data-processing agreement covering that provider before putting student work through it. This is the single most important thing on this page.

CANVAS_REDACT_PII=1 helps, partially. It replaces emails, login ids, and SIS ids with stable anon-<hash> values — stable so the model can still correlate rows, non-reversible so the identifier itself doesn't travel. Names are deliberately not redacted, because an assistant that can't say "follow up with Dana" isn't much use. If names are the concern, redaction is not the answer — don't route the roster through a model at all.

Downloads land on your disk. canvas_download_submissions writes student work to CANVAS_DOWNLOAD_DIR. That's a FERPA-relevant directory; treat it like one, and clean it up.

Keep the destructive tier off. Grades and enrollments are student records. The default posture lets the assistant write grades (recoverable, visible in the gradebook history) but not remove enrollments (not recoverable in the same way).

More detail: docs/SAFETY.md.


Troubleshooting

Run canvas-mcp doctor first — most of these it will name directly.

The server couldn't find your token. Check, in order:

  1. canvas-mcp config — which env file did it load? If env file: (none), it found no file at any of the four locations.

  2. Your MCP client may start the server in a different working directory, so a ./.env won't be found. Use ~/.config/canvas-mcp/.env.

  3. Make sure the file has no quotes and no spaces around =: CANVAS_API_TOKEN=7~abc — not CANVAS_API_TOKEN = "7~abc".

The token is wrong, revoked, or expired. Canvas tokens can have an expiry date set at creation, and an expired token returns exactly the same 401 as a typo'd one.

Generate a fresh one at Account → Settings → + New Access Token.

Also confirm CANVAS_BASE_URL points at the tenant the token came from — a valid token for school-a.instructure.com is a 401 at school-b.instructure.com.

Two different things wear this status code in Canvas.

  • Rate limiting. The body says "Rate Limit Exceeded". The server detects this and retries with backoff; if you still see it, you're hammering the API — raise CANVAS_TIMEOUT and make fewer, larger requests.

  • Real permission denied. You're not a teacher in that course, or your role lacks the specific permission (some institutions restrict message_students or enrollment changes even for teachers). Nothing this server can do; ask your Canvas admin.

Usually a wrong id, but Canvas also returns 404 instead of 403 for things you're not allowed to see, which is a deliberate anti-enumeration measure. So: check the id is right and that you're enrolled in that course as a teacher.

Canvas rejected the content. Common causes: a due date outside the course term, a page title that collides with an existing one, points_possible on an assignment whose grading type doesn't take points. The error message passes Canvas's own explanation through.

  1. Restart the client fully (Claude Desktop needs a real quit, not a window reload).

  2. Run the exact command from your config by hand in a terminal. If canvas-mcp: command not found, your client doesn't share your shell PATH — use an absolute path from which canvas-mcp, or switch to the uvx form.

  3. Check the client's MCP logs. Claude Desktop: ~/Library/Logs/Claude/ on macOS.

Run canvas-mcp tools. The WITHHELD section at the bottom lists every suppressed tool and the exact reason — a tier gate, a group filter, an allowlist, or a denylist.

Two separate caps. _truncated in a list means pagination stopped at CANVAS_MAX_PAGES. A trailing truncation notice means the text hit CANVAS_MAX_CHARS. Raise whichever one you hit — but they exist to protect your context window, so prefer narrowing the request (one assignment, one section) over raising the cap.

Check the file is under CANVAS_MAX_UPLOAD_MB (default 100) and that CANVAS_UPLOAD_TIMEOUT is generous enough for your connection. Canvas uploads are a three-step handshake through a separate storage host; a timeout in the middle leaves nothing behind, so it's safe to retry.


FAQ

Do I need to be a Canvas administrator? No. A plain teacher account and a self-service access token. If your institution has disabled self-service tokens, you'll need an admin to issue one — that's the only admin involvement.

Will this work with my school's Canvas? If it's Canvas and you can reach it over HTTPS, yes. It uses only the public REST API v1. Self-hosted Canvas works too; just point CANVAS_BASE_URL at it.

Can it see other instructors' courses? Only what your own Canvas account can see. It has exactly your permissions — no more.

Can students use it? It'll run, but most tools need teacher permissions. It isn't designed for that.

Does it store anything? No database, no cache, no telemetry. The only things written to disk are files you explicitly download, into CANVAS_DOWNLOAD_DIR.

What if the AI grades something wrong? Canvas keeps grade history — you can see and revert every change in the gradebook's grade-change log. That's precisely why grading is in the write tier and not gated behind destructive: it's recoverable. Still: review before posting.

Can I use it with a local model (Ollama, LM Studio)? Yes, if your client speaks MCP. Note that the 47 tool descriptions are a meaningful chunk of context for a small model — use CANVAS_TOOL_GROUPS to publish only what you need.

Why doesn't it support Canvas's New Quizzes? New Quizzes lives behind a separate API with different auth. canvas_list_quizzes sees Classic Quizzes. PRs welcome.

Does it work with Canvas Free for Teachers? Yes — https://canvas.instructure.com as your base URL.


Contributing

Issues and PRs welcome, particularly from instructors who hit something this doesn't cover. See CONTRIBUTING.md.

git clone https://github.com/zhenghh04/canvas-mcp
cd canvas-mcp
pip install -e ".[dev]"
pytest        # 163 tests, fully offline
ruff check .

The test suite never contacts a real Canvas tenant — the fixture transport raises on any unexpected call, so a test that escapes fails loudly instead of mutating somebody's live course.


License

MIT. See LICENSE.

Not affiliated with or endorsed by Instructure. "Canvas" is their trademark.

Available Tools

42 tools
canvas_api_getA

Escape hatch: GET any Canvas REST endpoint without a dedicated tool.

Canvas publishes well over a thousand operations; the tools here cover the common teaching ones. Use this for the rest. Read-only by construction — it cannot issue a write even if asked to.

Args: path: path under /api/v1, e.g. "courses/12345/gradebook_history/days". A full URL is also accepted. params_json: optional JSON object of query parameters, e.g. '{"per_page": 20, "include[]": "submission"}'. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
max_charsNo
params_jsonNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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 well: it asserts 'read-only by construction — it cannot issue a write even if asked to' and explains that max_chars bounds the payload. It stops short of covering auth requirements, rate limits, or error/status behavior, so it isn't fully complete.

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

Conciseness4/5

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

Front-loaded with the key framing ('escape hatch') followed by clean per-argument docs. The rationale sentence about a thousand operations is slightly verbose but earns its place by justifying the tool's existence.

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 no explanation, and the description covers scope, safety, and all three parameters with examples. Only error handling and auth expectations are unaddressed, which is a minor gap for a generic GET passthrough.

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 0%, so the description must compensate and does: it explains the path format (under /api/v1, with a concrete example and full-URL fallback), params_json as a JSON object with a sample including per_page and include[] syntax, and max_chars with the 0=server-default convention.

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 ('GET any Canvas REST endpoint') and frames itself explicitly as an escape hatch for operations not covered by dedicated tools. An agent can immediately distinguish this from the many resource-specific siblings.

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 explicit when-to-use: the dedicated tools cover common teaching operations, 'use this for the rest.' The condition selecting this tool over its ~40 siblings is stated directly rather than left to inference.

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

canvas_auth_statusA

Check Canvas connectivity, identity, and which tool tiers are enabled.

Reveals no token material. Call this first whenever another Canvas tool fails, or when a tool you expected is missing — the tools section shows exactly what this server published and what a safety flag withheld.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/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 well: it discloses that no token material is revealed (a security/privacy guarantee an agent could not infer) and explains that the 'tools' section reports what the server published versus what a safety flag withheld. It stops short of stating auth requirements or error behavior, but the disclosure of non-sensitive output and the withheld-tools semantics is substantive.

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?

Three tight sentences with the core purpose front-loaded, followed by the safety guarantee, then the trigger conditions. No filler and nothing repeated from structured fields.

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?

An output schema exists, so return values need not be enumerated, yet the description still usefully characterises the 'tools' section of the response. For a zero-parameter, no-annotation diagnostic tool, this covers everything an agent needs to decide to call it and interpret the result.

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 is no parameter surface for the description to clarify. The description adds nothing about parameters because nothing exists to add.

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 (Check) and resource (Canvas connectivity, identity, enabled tool tiers), which no sibling tool covers — every sibling is a content operation. An agent can immediately tell this is the server's diagnostic/probe tool rather than a Canvas data operation.

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 two explicit, actionable triggers: 'Call this first whenever another Canvas tool fails' and 'when a tool you expected is missing.' These are unambiguous when-to-use conditions that no other tool's description would need to state.

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

canvas_bulk_gradeA

Post many grades to one assignment at once. MUTATES STUDENT RECORDS.

Canvas processes this asynchronously and returns a Progress object, so the grades appear a few seconds later. There is no partial-failure report — read back with canvas_list_submissions to confirm.

A bulk write is the highest-consequence call in this server. Show the instructor the complete table of student ids, grades, and comments and get an explicit go-ahead; never assemble one from inference.

Args: assignment_id: numeric assignment id. grades_json: JSON object keyed by user id, e.g. '{"101": {"grade": "18", "comment": "Clear thesis."}, "102": {"grade": "15"}}'. A bare string value is accepted as the grade: '{"101": "18"}'. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
grades_jsonYes
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/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 so well: it discloses the mutation ('MUTATES STUDENT RECORDS'), the asynchronous processing model, that it returns a Progress object with delayed visibility, and the absence of a partial-failure report. These are exactly the traits an agent cannot infer from the schema.

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

Conciseness4/5

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

Front-loaded with purpose, mutation warning, and async caveat before the args list. The consequence of the write is stated twice (the all-caps line and the 'highest-consequence call' paragraph), which is mild redundancy, but every section still carries information.

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?

Covers purpose, side effects, async timing, verification path, and all parameter formats for a 3-param bulk mutation. The output schema exists, and the description still usefully summarizes the Progress return, so nothing an agent needs is missing.

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 description coverage is 0%, so the description must compensate and it does: it documents all three parameters, gives concrete grades_json examples including both the object and bare-string shorthand forms, and states the course_id default behavior.

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 with an explicit scope qualifier ('Post many grades to one assignment at once'), which immediately separates it from the single-grade sibling canvas_grade_submission. An agent can identify the tool 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?

Gives a clear operational precondition ('show the instructor the complete table ... and get an explicit go-ahead; never assemble one from inference') and names the verification follow-up (canvas_list_submissions). It never states the when-NOT condition, e.g. that single grades should go through canvas_grade_submission, so it falls short of full alternative routing.

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

canvas_create_assignmentA

Create an assignment. MUTATES the course.

Defaults to UNPUBLISHED so students do not see it until you publish — pass published=True only when the instructor says it is ready.

Args: name: assignment title. description: body HTML shown to students. points_possible: max score; omit for an ungraded assignment. due_at: ISO 8601 UTC, e.g. 2026-09-10T04:59:59Z. Canvas stores UTC, so an 11:59pm local deadline is not 23:59Z — convert first. unlock_at: ISO 8601 UTC; students cannot see it before this. lock_at: ISO 8601 UTC; submissions close after this. submission_types: comma-separated, from online_text_entry, online_upload, online_url, online_quiz, discussion_topic, media_recording, student_annotation, on_paper, external_tool, none. grading_type: points (default), percent, letter_grade, gpa_scale, pass_fail, not_graded. published: visible to students immediately (default False). assignment_group_id: group to file it under; see canvas_list_assignment_groups. omit_from_final_grade: True to score it without affecting the total. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
due_atNo
lock_atNo
course_idNo
publishedNo
unlock_atNo
descriptionNo
grading_typeNo
points_possibleNo
submission_typesNoonline_text_entry
assignment_group_idNo
omit_from_final_gradeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/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: it declares the write/mutation, the default-unpublished visibility state, the UTC storage caveat that makes naive local deadlines wrong, and the default values for grading_type, submission_types and course_id. That is exactly the behavioral context an agent needs before calling.

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?

Front-loads purpose and the mutation/visibility warning before the Args block, then keeps one tight line per parameter. The timezone note is long but earns its place by preventing a concrete, common error.

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?

A 12-parameter mutation tool with an output schema present, so return values need not be explained. Everything else an agent needs — mutation semantics, visibility default, date format, enum values, course scoping — is covered.

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 description coverage is 0%, so the description must compensate and it does, documenting all 12 parameters including the enumerated values for submission_types and grading_type, the ISO 8601 UTC format with a worked example, and the semantics of omit_from_final_grade and points_possible (omit for ungraded).

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?

Opens with a specific verb+resource ("Create an assignment") and immediately flags the mutation ("MUTATES the course"), which cleanly separates it from canvas_update_assignment and the read-only siblings. An agent can pick this tool 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?

Gives a clear conditional rule for the risky flag: default unpublished, pass published=True only when the instructor confirms readiness. It also routes the agent to canvas_list_assignment_groups for the group id. It stops short of naming when to prefer canvas_update_assignment or listing prerequisites, so it is strong but not exhaustive.

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

canvas_create_assignment_groupA

Create an assignment group (a gradebook category). MUTATES the course.

Args: name: group name, e.g. "Response Papers". group_weight: percentage of the final grade, if the course uses weighted groups. Omit for unweighted. position: 1-based slot in the group list; omit to append. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
positionNo
course_idNo
group_weightNo

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 correctly and prominently flags 'MUTATES the course', which is valuable, but does not disclose required permissions, whether duplicate groups are allowed, error behavior, or side effects beyond creation. The mutation flag is useful but incomplete.

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 purpose is front-loaded in the first sentence and the mutation warning is immediate. The Args block is structured and necessary given the schema's lack of descriptions, though slightly list-like rather than fully integrated. No sentences are 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?

For a 4-parameter mutation tool with no annotations and an output schema, the description covers parameter semantics and mutation status well, and the output schema handles return values. However, it omits usage context relative to siblings and behavioral details like permissions, leaving some gaps.

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 description coverage is 0%, so the description must compensate. It explains all four parameters: name with an example, group_weight as a percentage for weighted courses, position as a 1-based slot, and course_id as a numeric ID defaulting to CANVAS_DEFAULT_COURSE_ID. This fully covers the semantic gap 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 ('Create an assignment group') and clarifies the domain with '(a gradebook category)'. This is clear and distinct from sibling tools like canvas_create_assignment, though it does not explicitly name or differentiate itself from those alternatives.

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 gives parameter-level usage ('Omit for unweighted', 'omit to append') but provides no guidance on when to choose this tool over alternatives such as canvas_list_assignment_groups or canvas_create_assignment. No prerequisites or exclusions are mentioned.

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

canvas_create_calendar_eventA

Create a calendar event on the course calendar. MUTATES the course.

Appears on every enrolled student's calendar. Good for class meetings, office hours, and guest lectures — not for assignment due dates, which belong on the assignment itself so the gradebook knows about them.

Args: title: event title. start_at: ISO 8601 UTC start, e.g. 2026-09-10T18:00:00Z. end_at: ISO 8601 UTC end; omit for a point-in-time event. description: event body (HTML allowed). location_name: room or place. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
end_atNo
start_atYes
course_idNo
descriptionNo
location_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/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 well: it flags 'MUTATES the course' and discloses the important side effect that the event appears on every enrolled student's calendar. It does not cover permission/auth requirements or what happens if a course_id is invalid, so it is strong but not exhaustive.

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?

Front-loads the action and the mutation warning, then usage guidance, then a compact Args block. Every sentence earns its place, and the arg annotations are necessary given 0% schema coverage rather than 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?

An output schema exists so return values need not be explained, and the description still covers the mutation side effect, student-wide visibility, usage boundaries, and all parameter semantics. For a 6-param mutation tool with no annotations, nothing essential is missing.

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 description coverage is 0%, so the description must compensate, and it documents all six parameters: ISO 8601 UTC format with a concrete example for start_at, omitting end_at for a point-in-time event, HTML allowed in description, location meaning, and the CANVAS_DEFAULT_COURSE_ID default for course_id. This adds substantial meaning beyond the bare schema titles.

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 calendar event on the course calendar') and immediately scopes it ('MUTATES the course'). It also carves out a boundary against a sibling concept by ruling out assignment due dates, letting an agent distinguish this from canvas_create_assignment without opening either schema.

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 explicit when-to-use examples (class meetings, office hours, guest lectures) and an explicit when-not-to-use case pointing to the right alternative (assignment due dates belong on the assignment so the gradebook sees them). Both the positive and negative routing conditions are stated.

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

canvas_create_discussionA

Create a discussion topic. MUTATES the course.

Defaults to UNPUBLISHED so you can review it before students see it. Publishing a discussion notifies students who have announcements and discussions turned on.

Args: title: topic title. message: prompt body (HTML allowed). published: visible to students immediately (default False). require_initial_post: students must post before seeing replies. threaded: allow nested replies (default True). pinned: pin to the top of the discussions list. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
pinnedNo
messageYes
threadedNo
course_idNo
publishedNo
require_initial_postNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 behavioral burden and does well: it declares the write/mutation nature, the unpublished default, the notification side effect of publishing, and defaults for threaded/pinned. It omits permission requirements and whether an existing topic can be overwritten, so it is strong but not exhaustive.

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 purpose and the mutation warning are front-loaded in the first two lines, and the args list is compact with no filler sentences. The bulleted arg block is a little listy, but every entry adds meaning rather than repeating the schema titles.

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

Completeness4/5

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

For a 7-parameter mutating tool with an output schema already covering returns, the description supplies the missing pieces an agent needs: default publish state, notification side effect, and per-parameter semantics. Only auth/permission expectations and failure behavior are absent, which is a minor gap given the output schema exists.

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 description coverage is 0%, so the description must compensate, and it does: all seven parameters are explained with semantics beyond the schema, including 'message: prompt body (HTML allowed)', the default-off published flag, and 'course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID'. Defaults and behavioral effects of each toggle (require_initial_post, threaded, pinned) are clarified.

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 ('Create a discussion topic') and immediately flags the mutation with 'MUTATES the course', which is more than a restatement of the name. It does not explicitly contrast itself with neighbors like canvas_create_page or canvas_post_announcement, so sibling differentiation is only implied by the resource noun.

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?

The description explains the intended workflow context clearly: 'Defaults to UNPUBLISHED so you can review it before students see it' tells the agent this is the draft-then-publish path, and it warns that publishing notifies students. It gives no explicit when-not or named alternative tool, so it lands at clear-context without exclusions.

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

canvas_create_moduleA

Create a course module. MUTATES the course.

A module is an empty container until you add items with canvas_create_module_item. Defaults to UNPUBLISHED.

Args: name: module title, e.g. "Week 3 — Coding agents". position: 1-based slot in the module list; omit to append at the end. published: visible to students immediately (default False). course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
positionNo
course_idNo
publishedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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 well: it flags that the call MUTATES the course and discloses the important default that the module is UNPUBLISHED (invisible to students). It omits permission/auth requirements and idempotency, keeping it below a 5.

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

Conciseness5/5

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

Front-loaded with the action and the MUTATES warning, followed by a container-vs-items clarification, then a compact per-argument list. Every line adds information with no filler.

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?

An output schema exists, so return values need no explanation, and the description covers the mutation semantics and the non-obvious unpublished default that annotations (absent) would otherwise have to carry. Nothing essential to a correct invocation is missing.

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 description coverage is 0%, yet the description documents all four parameters with meaning beyond the schema: position is a 1-based slot with omit-to-append semantics, published controls immediate student visibility, and course_id falls back to CANVAS_DEFAULT_COURSE_ID. This fully compensates for the empty schema descriptions.

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 (Create) and resource (course module), and explicitly distinguishes the module container from its contents by naming canvas_create_module_item. An agent can separate this from canvas_update_module and canvas_create_module_item without opening any 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?

Clearly implies the workflow context by stating a module is an empty container until items are added via canvas_create_module_item, which routes the agent to the follow-up tool. It stops short of explicit when-not guidance or naming canvas_update_module as the alternative for existing modules.

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

canvas_create_module_itemA

Add an item to a module. MUTATES the course.

Which id field you need depends on item_type: Assignment / Quiz / Discussion / File -> content_id (the object's id) Page -> page_url (the slug) ExternalUrl / ExternalTool -> external_url SubHeader -> neither; title is the item

Args: module_id: numeric module id. title: item label shown in the module list. item_type: one of Assignment, Quiz, File, Page, Discussion, SubHeader, ExternalUrl, ExternalTool. content_id: id of the linked object, for the types that need one. page_url: page slug, for item_type=Page. external_url: target, for item_type=ExternalUrl or ExternalTool. position: 1-based slot within the module; omit to append. indent: nesting level, 0 for top level. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
indentNo
page_urlNo
positionNo
course_idNo
item_typeYes
module_idYes
content_idNo
external_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses the critical trait that this MUTATES the course, which is genuinely useful, but says nothing about required permissions/role, reversibility, or whether duplicate items are allowed. Adequate but with clear gaps for a write operation.

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

Conciseness4/5

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

Front-loaded with the action and the mutation warning, then organized into a conditional table plus a clean Args block. The Args section is verbose, but it is not redundant with the schema (0% coverage), so it earns its space; only the repetition of "for item_type=X" phrasing is mildly wasteful.

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. For a 9-param mutation tool with no annotations, the description covers the params and the mutation risk well; the remaining gap is the absence of permission/auth prerequisites that an agent would want before attempting the write.

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 0%, so the description must compensate entirely, and it does: every one of the 9 params is explained, including defaults (course_id, position append behavior, indent top level) and the conditional dependency between item_type and which id field to supply. This is meaning that exists nowhere else in the structured data.

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 ("Add an item to a module") and immediately flags the mutation, which is exactly what an agent needs to distinguish this from canvas_create_module or canvas_update_module. The one-line summary is unambiguous about scope.

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?

Provides the strongest form of conditional guidance: a lookup table mapping each item_type to the id field it requires (content_id, page_url, external_url, or neither). It does not, however, say when to prefer this tool over creating the underlying object first (e.g. canvas_create_assignment), so it clears the bar for context without covering exclusions.

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

canvas_create_pageA

Create a wiki page. MUTATES the course.

Defaults to UNPUBLISHED. Canvas derives the page's url slug from the title; the returned url is what canvas_get_page and canvas_update_page expect, not the numeric page_id.

Args: title: page title. body: page HTML. published: visible to students immediately (default False). front_page: make this the course home page. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
titleYes
course_idNo
publishedNo
front_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 well: it discloses the mutation, the UNPUBLISHED default, and the non-obvious slug/url behavior (returned url vs numeric page_id). It omits permission/auth requirements and any duplicate-title or error behavior, keeping it short of a 5.

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

Conciseness4/5

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

Front-loaded with purpose and the critical mutation/default caveats before the Args block, and the url-slug note is placed where it matters. Slightly verbose but every line carries information.

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

Completeness4/5

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

For a 5-param mutation tool with no annotations and an output schema present, the description covers the essentials: what it mutates, default state, and the meaning of the returned url (which the output schema alone would not convey). Missing only permission/precondition details.

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 0%, so the description must compensate, and it documents all five params: body as HTML, published as student visibility with default False, front_page as the home-page toggle, and course_id's CANVAS_DEFAULT_COURSE_ID fallback. title/body definitions are thin ('page title', 'page HTML'), but the rest adds real meaning beyond the bare schema.

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+resource ('Create a wiki page') and immediately flags 'MUTATES the course', which cleanly separates it from the read-oriented siblings canvas_get_page and canvas_list_pages. An agent can identify it 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 Guidelines3/5

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

Usage is implied by the verb and the mutation warning, and it references canvas_get_page/canvas_update_page as downstream consumers of the returned url, but it never states when to choose this over alternatives or any exclusions/preconditions. Adequate but no explicit routing.

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

canvas_download_fileA

Download one course file to local disk.

Writes to the machine running this server, not the user's laptop, if those differ.

Args: file_id: numeric file id (from canvas_list_files). dest_dir: destination folder; defaults to CANVAS_DOWNLOAD_DIR, or ./canvas-downloads. name: filename to save as; defaults to the Canvas display name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
file_idYes
dest_dirNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/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 usefully discloses that writes go to the server machine rather than the user's laptop, and it documents defaults for dest_dir and name. However, it omits overwrite behavior, directory-creation semantics, permission requirements, and error handling, leaving meaningful gaps for a file-writing operation.

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?

The description is front-loaded with purpose, immediately follows with a critical caveat about write location, and then presents an Args section. Every sentence earns its place, with no redundancy or filler.

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

Completeness4/5

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

An output schema exists, so return values need not be explained. The description covers purpose, the key server-side write caveat, and all parameters. It misses minor operational details like overwrite behavior and error handling, but is largely complete for a download tool.

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 description coverage is 0%, so the description must compensate entirely. It documents all three parameters with clear meaning: file_id as a numeric id sourced from canvas_list_files, dest_dir with its default resolution chain (CANVAS_DOWNLOAD_DIR or ./canvas-downloads), and name with its default (Canvas display name). This fully covers 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?

States a specific verb and resource: 'Download one course file to local disk.' The scope 'one course file' implicitly distinguishes it from bulk-download siblings like canvas_download_submissions, and it references canvas_list_files as the source for file_id. However, it does not explicitly name an alternative or sibling to route to, so it falls short of a 5.

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

Usage Guidelines3/5

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

The description implies usage by noting file_id comes 'from canvas_list_files,' which is a useful prerequisite. But it offers no explicit when-to-use guidance versus alternatives like canvas_download_submissions or canvas_upload_file, and no when-not conditions.

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

canvas_download_submissionsA

Download every file attachment for an assignment to a local folder.

Writes files to disk on the machine running this server. Each lands as <dest_dir>/<assignment_id>/<user_id>__<filename> so the owner stays attached to the file without putting a student name in a path.

FERPA: this copies student work out of Canvas onto local storage. Make sure the instructor knows where it is going and cleans it up afterwards.

Args: assignment_id: numeric assignment id. dest_dir: destination folder; defaults to CANVAS_DOWNLOAD_DIR, or ./canvas-downloads. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_files: safety cap on how many files to pull (default 100).

ParametersJSON Schema
NameRequiredDescriptionDefault
dest_dirNo
course_idNo
max_filesNo
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 substantial work: it discloses that files are written to disk on the server, gives the exact path template, flags a FERPA data-egress concern, and advises cleanup. Missing permissions/auth requirements and failure behavior, which keeps it from a 5.

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

Conciseness4/5

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

Front-loads the core action, then layers path format and the FERPA warning; every sentence contributes. The args block is standard and readable. Slightly long but no filler.

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

Completeness4/5

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

Given a filesystem-writing tool with four parameters, no annotations, and an output schema (so return values needn't be described), the description covers destination behavior, defaults, cap, and data-handling risk. Only auth/permission expectations are absent.

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 0%, so the description must compensate and largely does: it documents assignment_id, dest_dir (with defaults CANVAS_DOWNLOAD_DIR / ./canvas-downloads), course_id (default CANVAS_DEFAULT_COURSE_ID), and max_files (safety cap, default 100). Minor mismatch in that it calls assignment_id numeric while the schema types it as string, and it doesn't explain the env-var resolution order fully.

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 with explicit scope: downloads EVERY file attachment for an assignment into a local folder. This is immediately distinguishable from canvas_download_file (single file) and canvas_list_submissions (enumeration only) without opening any schema.

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 scope wording ('every file attachment for an assignment') implies the bulk-download use case and the FERPA note sets operational context, but the description never names alternatives or states when NOT to use it (e.g., use canvas_download_file for a single file, canvas_list_submissions to preview). Usage is inferable rather than explicit.

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

canvas_enroll_userA

Enrol a user in the course. MUTATES the roster.

Defaults to state=invited and notify=False: the person gets an invitation they must accept, and no email goes out until you ask for one. Pass enrollment_state="active" to place them straight onto the roster.

Args: user_id: numeric Canvas user id. "sis_user_id:ABC123" enrols by SIS id instead, which is usually what a registrar export gives you. enrollment_type: StudentEnrollment, TeacherEnrollment, TaEnrollment, ObserverEnrollment, or DesignerEnrollment. enrollment_state: invited (default) or active. notify: send Canvas's notification email (default False). section_id: enrol into a specific section instead of the default one. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
notifyNo
user_idYes
course_idNo
section_idNo
enrollment_typeNoStudentEnrollment
enrollment_stateNoinvited

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/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 behavioral burden and does well: it warns the roster is mutated, clarifies the default invite-and-accept flow versus direct activation, and explains that no email is sent unless notify is requested. It stops short of stating auth/permission requirements or idempotency/reversibility of enrollment.

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 purpose and mutation warning are front-loaded, then defaults, then per-argument detail. It is somewhat long, but each sentence adds usable information and there is no filler.

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 mutation tool with no annotations and an output schema already present, the description supplies the missing safety/behavior context and full parameter semantics. An agent has everything needed to invoke it correctly.

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 description coverage is 0%, so the description must compensate and it does: every one of the six parameters is documented with meaning, including the 'sis_user_id:ABC123' alternate format, the allowed enrollment_type values, the invited/active distinction, and the env-var default for course_id.

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 ('Enrol a user in the course') and immediately flags the side-effect profile ('MUTATES the roster'), which cleanly separates it from the read-only siblings like canvas_list_enrollments and canvas_list_students.

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?

Explains the default behavior (state=invited, notify=False) and tells the agent when to deviate ('Pass enrollment_state="active" to place them straight onto the roster'). It also gives real-world context for SIS ids, but never explicitly names an alternative tool or states when NOT to use it.

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

canvas_get_assignmentA

Get one assignment, with its description rendered to plain text.

Args: assignment_id: numeric assignment id. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
max_charsNo
assignment_idYes

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 disclosure burden. It usefully notes the plain-text rendering and the max_chars payload bound, and 'Get' implies a read operation, but it omits auth/permission requirements and error behavior (e.g., missing assignment or unauthorized course).

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

Conciseness4/5

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

Front-loads the core purpose in the first sentence, then lists parameters compactly in an Args block. No filler; every line supports invocation.

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-value detail is not needed, and the max_chars bound is covered. However, for a no-annotation tool the description should also address read-only nature and failure modes, which it does not.

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 description coverage is 0%, so the description must compensate and largely does: it documents all three params, clarifies course_id falls back to CANVAS_DEFAULT_COURSE_ID, and explains max_chars=0 means the server default — semantics not present in the raw 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+resource ('Get one assignment') and adds a distinct behavioral note that the description is rendered to plain text. The singular 'one' implicitly differentiates it from canvas_list_assignments, though no sibling is named explicitly.

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: the required assignment_id signals it is for fetching a single known assignment. There is no explicit when-to-use vs when-not guidance, no mention of alternatives like canvas_list_assignments, and no prerequisites called out.

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

canvas_get_courseA

Get one course: teachers, student count, and the syllabus as plain text.

Args: course_id: numeric id from the course URL; falls back to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/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 discloses the returned fields and that max_chars bounds the payload, which is helpful, but it omits auth/permission requirements and whether the call is strictly read-only (only implied by 'Get'). Adequate but incomplete for a zero-annotation 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?

One summary sentence plus a compact args block; the purpose is front-loaded and each line earns its place. Minor redundancy in restating the two parameters already in the schema, but no filler.

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

Completeness4/5

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

An output schema exists so return values needn't be detailed, yet the description still names the key contents. Both parameters are covered and the default-course fallback is called out; the only real gap is the lack of any permission/authentication note for a tool with no annotations.

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 0%, so the description must compensate, and it does: course_id is explained as a numeric id from the course URL with a documented fallback to CANVAS_DEFAULT_COURSE_ID, and max_chars is described as a payload bound where 0 means the server default. That resolves both parameters, though it doesn't reconcile the string type in the schema with the 'numeric id' wording.

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 ('Get one course') and enumerates the returned payload (teachers, student count, syllabus as plain text), which separates it cleanly from canvas_list_courses and canvas_get_gradebook. An agent can identify the tool 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 Guidelines3/5

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

The singular 'one course' plus the required course_id implies the use case (fetch a single course by id), and the fallback to CANVAS_DEFAULT_COURSE_ID is useful context. However, there is no explicit when-to-use vs. when-not guidance and no named alternative such as canvas_list_courses for multi-course retrieval.

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

canvas_get_discussionA

Get a discussion topic with its full reply thread as plain text.

FERPA: student posts are student work, attributed by name. Use this to summarise a week's discussion, not to bulk-export it.

Args: topic_id: numeric discussion topic id. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
topic_idYes
course_idNo
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/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 meaningful work: it discloses the return shape (full reply thread, plain text), a FERPA/attribution constraint, and payload bounding via max_chars. It omits auth/permission requirements and failure modes, which keeps it short of a 5.

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

Conciseness5/5

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

Purpose is front-loaded in the first sentence, followed by a compact compliance/usage note and a tight Args block. Every line adds information (format, constraint, defaults) with no filler.

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?

An output schema exists, so return values need not be re-explained; instead the description covers the format, privacy handling, default resolution, and payload bounding. For a 3-param read tool with no annotations, nothing essential is missing.

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 description coverage is 0%, so the description must compensate and does: topic_id is the numeric discussion topic id, course_id defaults to CANVAS_DEFAULT_COURSE_ID, and max_chars bounds the payload with 0 meaning the server default. All three parameters gain semantics beyond their bare types.

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 ('Get a discussion topic with its full reply thread as plain text'), clearly distinguishing it from sibling listers like canvas_list_discussions and bulk exporters like canvas_download_submissions. An agent can tell what it fetches and in what shape 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 scopes usage ('summarise a week's discussion, not to bulk-export it'), giving both a use case and an exclusion. It does not name the specific alternative tool (e.g. canvas_list_discussions or a bulk export path), so routing is implied rather than explicit.

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

canvas_get_gradebookA

Get the whole gradebook as one student-by-assignment table.

One call instead of N calls to canvas_list_submissions. Use it to find missing work, spot an assignment nobody passed, or summarise standing before office hours. FERPA: this is the full class record.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. assignment_ids: comma-separated ids to restrict to; empty for all. include_names: label rows with student names as well as ids. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
max_charsNo
include_namesNo
assignment_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/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 the full burden and does reasonably well: it flags the FERPA sensitivity of returning a full class record, discloses that max_chars bounds the payload, and explains the single-call performance trade-off. It does not explicitly state the operation is read-only or note any auth/permission prerequisites.

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?

Front-loads the core purpose in one sentence, follows with usage triggers and the FERPA warning, then an Args block. Every sentence adds information and nothing is padded.

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 description covers usage, parameters, and sensitivity. The remaining gap is the lack of any explicit read-only/permission statement for a tool that returns an entire class record.

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 description coverage is 0%, yet the Args block documents all four parameters with real semantics: course_id is numeric and falls back to CANVAS_DEFAULT_COURSE_ID, assignment_ids is comma-separated with empty meaning all, include_names controls row labels, and max_chars is a payload bound where 0 means the server default.

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 ('Get the whole gradebook') and defines the return shape as a student-by-assignment table. It explicitly distinguishes itself from canvas_list_submissions by framing itself as one call instead of N, so an agent can route without opening either 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?

Gives concrete when-to-use triggers (find missing work, spot an assignment nobody passed, summarise standing before office hours) and names the alternative (canvas_list_submissions) it replaces. It stops short of stating when the per-submission tool is still preferable, e.g. for a single assignment.

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

canvas_get_pageA

Get one wiki page's body as plain text.

Args: page_url: the page's url slug (from canvas_list_pages). course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
page_urlYes
course_idNo
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 does disclose two useful traits: the body is returned as plain text (not HTML) and max_chars bounds the payload with 0 meaning the server default. However, it says nothing about auth requirements, whether missing pages error or return empty, or whether the content is truncated silently.

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?

One sentence of purpose followed by a tight per-argument list. No filler, and the essential return-format fact is front-loaded.

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?

With an output schema present, return values need limited explanation, and the three parameters are all documented. The remaining gap is behavioral rather than structural: truncation semantics for max_chars and failure behavior for an invalid slug are unstated on a tool 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.

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: page_url is defined as a url slug plus its source tool, course_id is a numeric id with its default env var named, and max_chars is defined as a payload bound where 0 selects the server default. All three parameters gain meaning beyond the bare schema.

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 ('Get one wiki page's body') and specifies the return format ('as plain text'), which immediately distinguishes it from canvas_list_pages, canvas_create_page, and canvas_update_page. An agent can identify the operation 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?

The parenthetical '(from canvas_list_pages)' establishes an explicit upstream workflow for obtaining the page_url, which is real routing guidance. It gives no exclusions or when-not conditions, but the context for correct use is clear enough.

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

canvas_get_submissionA

Get one student's submission: body text, attachments, and comments.

FERPA: this returns a named student's submitted work. Treat accordingly — and note that attachment contents are not inlined, only listed; use canvas_download_submissions to fetch the files themselves.

Args: assignment_id: numeric assignment id. user_id: numeric Canvas user id, or "self". course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes
course_idNo
max_charsNo
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/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 well: it flags FERPA/privacy sensitivity for a named student's work, discloses that attachments are listed but not inlined, and explains the max_chars payload bound. Read-only nature is implied by 'Get' but not explicitly stated.

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 FERPA caveat are front-loaded, and the Args block is scannable. Every line contributes, though the prose plus arg list is slightly longer than strictly necessary for a four-parameter read tool.

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?

Output schema exists so return values needn't be explained; the description covers purpose, privacy constraints, attachment behavior, the sibling alternative, and all parameters. An agent has everything needed to call it correctly.

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 description coverage is 0%, so the description must compensate, and it does: all four params are documented with types and meaning (numeric ids, user_id accepting 'self', course_id defaulting to CANVAS_DEFAULT_COURSE_ID, max_chars with 0 = server default). This meaning is entirely absent from the schema.

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 ('Get one student's submission') and enumerates exactly what is returned (body text, attachments, comments). It is clearly distinguishable from canvas_list_submissions (plural, list-level) and canvas_download_submissions (which it explicitly routes file fetching to).

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 names the alternative tool for a key case: 'attachment contents are not inlined, only listed; use canvas_download_submissions to fetch the files themselves.' This is clear routing guidance, though it doesn't contrast against canvas_list_submissions for the broader-list use case.

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

canvas_grade_submissionA

Post a grade and/or a comment to a submission. MUTATES STUDENT RECORDS.

Writes to the live gradebook immediately and cannot be undone from here. ALWAYS show the instructor the exact student, assignment, grade, and comment text and get an explicit go-ahead before calling. Never call this to "try" something or as part of exploratory reasoning.

Args: assignment_id: numeric assignment id. user_id: numeric Canvas user id of the student. grade: points ("18"), percentage ("88%"), or a letter grade. Omit to post a comment only. comment: comment posted alongside the grade; the student sees it. excused: True to excuse the student from the assignment entirely. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
gradeNo
commentNo
excusedNo
user_idYes
course_idNo
assignment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations present, the description carries the full behavioral burden and does so well: 'MUTATES STUDENT RECORDS', writes to the live gradebook immediately, and cannot be undone from here. It also discloses that the comment is visible to the student and that course_id defaults to CANVAS_DEFAULT_COURSE_ID.

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?

Front-loads the destructive warning before the mechanics, then organizes parameters in a clean Args block. Given 0% schema coverage, every line of the parameter documentation 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?

An output schema exists, so return values need not be explained. For a six-parameter mutation tool with no annotations, the description covers safety, side effects, defaults, and every argument's semantics — nothing an agent needs to call it correctly is missing.

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 description coverage is 0%, so the description must compensate, and it does: all six parameters are documented, including grade formats ('18', '88%', letter), the omit-to-comment-only behavior, excused semantics, and the course_id default. This adds substantial meaning beyond the bare schema titles.

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 ('Post a grade and/or a comment to a submission') that an agent can act on immediately. It does not, however, differentiate itself from the sibling canvas_bulk_grade, which an agent must disambiguate against.

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?

Gives clear operating conditions: always show the instructor the exact student/assignment/grade/comment and get an explicit go-ahead, and never call it to 'try' something. Strong guidance, but it covers confirmation workflow rather than when to choose this tool over canvas_bulk_grade.

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

canvas_list_announcementsB

List a course's announcements, most recent first, with their text.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/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, but it does disclose two useful traits: results are ordered most-recent-first and max_chars bounds the returned payload. It says nothing about pagination, permissions/authentication, or scope beyond the course, so coverage 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?

The purpose sentence is front-loaded and tight, and the Args block documents each parameter compactly. No filler sentences.

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 structure need not be re-explained, and both parameters plus their defaults are covered. For a simple two-parameter listing tool this is nearly sufficient, lacking only failure/auth context.

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 description coverage is 0%, so the description must compensate and largely does: course_id is described as numeric and defaulting to CANVAS_DEFAULT_COURSE_ID, and max_chars as a payload bound where 0 means the server default. Only the exact units/behavior of max_chars truncation remain unspecified.

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 and resource ('List a course's announcements'), plus ordering ('most recent first') and payload contents ('with their text'). It is clearly distinguishable from the write-side sibling canvas_post_announcement, though it does not call that sibling out by name.

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 when-to-use or when-not-to-use guidance, and no alternative tool is named. Usage is only implied by the verb 'List' versus the create/post siblings in the toolset.

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

canvas_list_assignment_groupsA

List assignment groups and their gradebook weights.

A course that grades by weighted categories ("Participation 20%, Papers 50%...") carries those weights here, not on the assignments. Read this before reasoning about what a score is worth.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.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 burden. It discloses a valuable behavioral fact (weights are attached to groups, not assignments), which is real added context. However it says nothing about permissions, pagination, or the read-only nature beyond the implicit 'List', leaving gaps for a no-annotation 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?

Front-loaded with the core purpose, then rationale, then args. The Args block is slightly redundant with the schema but earns its place given 0% schema coverage. No wasted sentences.

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 needn't be explained, and the lone parameter is covered. For a simple read tool this is nearly complete; only minor behavioral detail (auth/permissions) is absent.

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 description coverage is 0% and the single parameter has no schema-level documentation. The description compensates by describing course_id as a 'numeric course id' and documenting the default-to-CANVAS_DEFAULT_COURSE_ID behavior, which the schema does not convey.

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 ('List assignment groups') plus the salient attribute it returns ('their gradebook weights'). The second sentence clarifies the domain distinction from sibling tools like canvas_get_gradebook and canvas_list_assignments by explaining where weights actually live.

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?

Gives a clear directive: 'Read this before reasoning about what a score is worth.' That establishes the context in which the tool is needed. It does not name explicit alternatives (e.g. canvas_get_gradebook) or exclusions, so it falls short of a 5.

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

canvas_list_assignmentsA

List assignments in a course, with due dates and needs-grading counts.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. bucket: optional filter — past, overdue, undated, ungraded, unsubmitted, upcoming, future. search_term: optional title substring filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNo
course_idNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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. 'List' plus the enumerated read-only filters make the read-only nature clear and the default course fallback is disclosed, but there is no mention of permissions, pagination, or result limits for what may be a large collection.

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 summary sentence is front-loaded and each argument line earns its place given the empty schema. The multi-line bucket enumeration is slightly bulky but justified because those values exist nowhere else.

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

Completeness4/5

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

For a read-only, zero-required-parameter tool with an output schema already describing return values, the description covers the essentials: scope, defaults, and filter semantics. Only the absence of pagination/volume expectations keeps it from being fully complete.

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 description coverage is 0% and the schema gives bucket as an untyped string with no enum, so the description does all the work: it names the default for course_id, enumerates all seven legal bucket values, and defines search_term as a title substring filter. This fully compensates 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 opens with a specific verb+resource ('List assignments in a course') and adds the salient payload ('due dates and needs-grading counts'), so the agent knows exactly what comes back. It does not explicitly contrast itself with siblings like canvas_get_assignment (singular fetch) or canvas_list_submissions, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the agent can infer this is the collection-level lister and that course_id falls back to CANVAS_DEFAULT_COURSE_ID. No explicit when-to-use/when-not guidance or named alternative is given, so it stays at the minimum-viable level.

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

canvas_list_calendar_eventsA

List calendar events (and optionally assignment due dates) for a course.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. start_date: YYYY-MM-DD lower bound; empty for Canvas's default window. end_date: YYYY-MM-DD upper bound. include_assignments: also return assignment due dates as events.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNo
course_idNo
start_dateNo
include_assignmentsNo

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?

No annotations are provided, so the description carries the burden; 'List' implies a read-only operation but this is never stated. It does add genuinely useful behavioral detail — that an empty start_date falls back to Canvas's default window — but omits pagination, rate limits, and 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.

Conciseness4/5

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

The one-line purpose is front-loaded before the Args block, and each parameter line adds distinct information without redundancy. The formatting is terse and scannable.

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. Combined with full parameter documentation and the default-window note, the description gives an agent enough to call the tool correctly; only pagination/return-volume expectations are unaddressed.

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 description coverage is 0%, yet the description documents all four parameters: course_id defaults to CANVAS_DEFAULT_COURSE_ID, start_date/end_date use YYYY-MM-DD format, and include_assignments pulls in due dates. This compensates well for the empty schema descriptions, though it could clarify the default date window size.

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 ('List calendar events') and scopes it to a course, with an optional expansion ('and optionally assignment due dates'). It is clearly distinguishable from canvas_create_calendar_event and canvas_list_assignments by implication, though it never names a sibling explicitly.

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 the scope ('for a course') and the include_assignments flag suggests the assignment-due-date alternative, but there is no explicit when-to-use guidance or statement of when to prefer canvas_list_assignments or canvas_get_assignment instead.

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

canvas_list_coursesA

List the courses the authenticated user can see.

Start here when you do not know the course id. The id in the output is what every other tool's course_id parameter wants.

Args: enrollment_state: active (default), completed, or invited_or_pending. enrollment_type: filter by your role — teacher, ta, student, observer, designer. Empty for all roles.

ParametersJSON Schema
NameRequiredDescriptionDefault
enrollment_typeNo
enrollment_stateNoactive

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/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 discloses that results are auth-scoped to the caller's visibility and that output ids are the universal course identifier, which is useful context. However, it says nothing about pagination, result volume, read-only safety, or what happens with an invalid enrollment_state value.

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

Conciseness4/5

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

Front-loads purpose, then the 'start here' guidance, then the args — a sensible ordering with no filler sentences. The multiline Args block is slightly loose but every line carries required information.

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

Completeness4/5

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

For a two-parameter, zero-required list tool with an output schema, the description supplies what the structured fields lack: allowed values for both filters and the downstream significance of the returned id. Return shape is correctly left to the output schema, so nothing essential 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 description coverage is 0%, so the description must do all the work, and it does: it enumerates enrollment_state values with the default (active, completed, invited_or_pending) and enrollment_type values by role (teacher, ta, student, observer, designer) plus the empty-for-all semantics. Case/syntax and combined-filter behavior are still unspecified, keeping it out of the top band.

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 ('List the courses') and immediately qualifies scope ('the authenticated user can see'). It further orients the agent relative to siblings by declaring itself the entry point when the course id is unknown, so it is distinguishable from canvas_get_course and the many course_id-consuming tools.

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 says 'Start here when you do not know the course id' and explains that the returned id feeds every other tool's course_id parameter, which is genuine routing guidance. It stops short of naming a specific alternative tool or stating when not to use it (e.g. if the id is already known, use canvas_get_course).

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

canvas_list_discussionsB

List discussion topics in a course.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden but only states the scope. It says nothing about pagination, result limits, ordering, or required permissions — notable gaps for a list operation. It does disclose the CANVAS_DEFAULT_COURSE_ID fallback, which is the one piece of added behavioral context.

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?

Very short and front-loaded, with the core purpose in the first sentence. The 'Args:' block is somewhat redundant with the schema but not wasteful.

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 needn't be explained, and the single parameter is covered. But as a list tool with no annotations, it omits pagination and result-set behavior, leaving meaningful gaps for correct invocation.

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 0% and the schema default is an empty string, so the description adds real value by explaining that course_id is numeric and falls back to CANVAS_DEFAULT_COURSE_ID. With a single parameter, this adequately compensates 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?

States a specific verb and resource ('List discussion topics in a course'), which naturally distinguishes it from canvas_get_discussion and canvas_create_discussion. However, it does not explicitly name those siblings or clarify the boundary (e.g. list all vs. fetch one).

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?

No when-to-use guidance, prerequisites, or alternatives are given. The agent must infer that this is the bulk-retrieval counterpart to canvas_get_discussion from the verb alone.

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

canvas_list_enrollmentsA

List enrollments, including the enrollment_id needed to change one.

canvas_list_students returns users; removing or modifying somebody needs the enrollment id, which is a different number. Fetch it here first — passing a user id to canvas_remove_enrollment silently targets the wrong record or 404s.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. role: StudentEnrollment, TeacherEnrollment, TaEnrollment, ObserverEnrollment, DesignerEnrollment. Empty for all. state: active, invited, concluded, completed, inactive. Empty for all.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNo
stateNoactive
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/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 the full behavioral burden. It discloses a critical downstream dependency (enrollment_id is required to modify enrollments) and a dangerous silent-failure mode, which is high-value context beyond the schema. It does not cover pagination, return shape, or auth, but the failure-mode warning is the most important behavioral trait here.

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?

Three short paragraphs: purpose and key distinction first, the failure-mode warning second, then a clean Args block. Every sentence earns its place and the most decision-relevant information is front-loaded.

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 3-param, 0%-documented-schema tool with no annotations, the description supplies the role/state enumerations, the default resolution behavior, the sibling distinction, and the downstream dependency. An output schema exists, so return values need not be explained. Nothing an agent needs to call this correctly is missing.

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 0%, so the description must compensate, and it does: course_id is documented as numeric with a default fallback to CANVAS_DEFAULT_COURSE_ID, role enumerates the exact accepted values, and state enumerates its values with the empty-string semantics for 'all'. Without this, the schema fields are opaque strings.

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 ('List enrollments') and immediately clarifies the critical distinction from its sibling canvas_list_students: enrollments are not users, and the enrollment_id is a different number from the user id. This is exactly the kind of disambiguation that helps an agent select the right tool.

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 gives explicit when-to-use guidance ('Fetch it here first') and a concrete when-not-to / failure mode ('passing a user id to canvas_remove_enrollment silently targets the wrong record or 404s'). It names the alternative tool (canvas_list_students) and explains why the agent should prefer this one for the mutation workflow.

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

canvas_list_filesB

List files uploaded to a course.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. search_term: optional filename substring filter (3+ characters).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
search_termNo

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?

With no annotations, the description carries the full burden, and it does disclose two useful behaviors: course_id defaults to CANVAS_DEFAULT_COURSE_ID and search_term requires 3+ characters. However, it omits permission requirements, pagination/result-limit behavior, and any explicit read-only confirmation beyond the verb 'List'.

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 purpose is front-loaded in the first sentence and the argument notes follow compactly with no wasted prose. The 'Args:' formatting is slightly mechanical but not verbose.

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 both parameters are covered. Still, for a list tool with no annotations it leaves unresolved how many results return, whether pagination applies, and what permissions are needed, leaving a moderate gap.

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 description coverage is 0%, so the description must compensate, and it does: it documents both parameters, notes course_id is numeric and defaultable, and characterizes search_term as an optional filename substring filter with a 3+ character constraint. This adds real meaning beyond the bare schema types, though it could specify filter behavior more precisely.

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 states a specific verb and resource ('List files uploaded to a course'), which is clearly distinct from write-oriented siblings like canvas_upload_file or canvas_download_file. It does not explicitly name or differentiate against those siblings, but the core purpose 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 guidance on when to use this versus alternatives such as canvas_download_file (retrieve one file) or canvas_upload_file. Usage must be inferred entirely from the tool name, with no prerequisites or exclusions stated.

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

canvas_list_modulesA

List course modules, optionally with their items — the course outline.

This is the fastest way to see how a course is actually structured week by week.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. with_items: inline each module's items (default True). max_chars: bound on the returned payload (0 = the server default).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
max_charsNo
with_itemsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 does disclose the with_items inlining behavior and that max_chars bounds the returned payload (0 = server default), which is real behavioral context beyond the schema. However, it says nothing about permissions, pagination limits, or error conditions for an otherwise straightforward read 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?

Front-loaded with the core purpose in the first line, followed by a single value-adding sentence and a compact Args block. No wasted prose; slightly more could have been trimmed but the structure is clean.

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-format explanation is unnecessary, and all parameters are documented. The remaining gap is usage routing against siblings and any permission context, minor for a read-only listing tool.

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 description coverage is 0%, so the Args block does all the work — and it succeeds: course_id is explained as numeric with a CANVAS_DEFAULT_COURSE_ID fallback, with_items as inlining items with a default, and max_chars as a payload bound with 0 meaning the server default. All three parameters are semantically documented.

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 ('List course modules') and frames the result as 'the course outline,' which distinguishes it from the many other list_* siblings targeting assignments, pages, quizzes, etc. It stops short of explicitly naming which sibling to prefer, so not a full 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 phrase 'the fastest way to see how a course is actually structured week by week' implies when this tool is useful, but there is no explicit when-to-use/when-not guidance or named alternative (e.g., versus canvas_list_assignments or canvas_get_course). 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.

canvas_list_pagesA

List wiki pages in a course (titles and url slugs, not bodies).

The url field is the slug every other page tool wants — not the numeric page_id, and not the full browser URL.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. search_term: optional title substring filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
search_termNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/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 the burden. It discloses a real behavioral trait beyond the schema: that the returned `url` is the slug the other page tools consume, not page_id or a full URL. It still doesn't state pagination behavior or permissions, but output schema exists to cover returns.

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 tight lead sentence that front-loads purpose and payload scope, followed by the single most important caveat (the url vs page_id trap). Every sentence earns its place.

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

Completeness4/5

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

For a two-param read tool with an output schema, the description covers purpose, both parameters, and the critical returned-field gotcha. Only explicit sibling routing and pagination semantics are absent.

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 description coverage is 0%, so the description must compensate, and it does: course_id is a numeric id defaulting to CANVAS_DEFAULT_COURSE_ID, and search_term is a title substring filter. This exceeds what the bare schema provides.

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+resource ('List wiki pages in a course') and immediately scopes the payload ('titles and url slugs, not bodies'). This distinguishes it from canvas_get_page, which fetches a body.

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?

Clear context (course-scoped wiki page listing) with the 'not bodies' exclusion implying the agent should use get_page for content. It does not explicitly name canvas_get_page as the alternative, so it falls short of a full 5.

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

canvas_list_quizzesA

List quizzes in a course.

Note: this covers Classic Quizzes. Institutions on New Quizzes see them as assignments with submission_type=external_tool instead — check canvas_list_assignments if a quiz you expect is missing here.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are present, so the description carries the full burden; it discloses an important domain quirk (New Quizzes surface as assignments with submission_type=external_tool), which is genuine behavioral context. It stops short of covering read-only nature, pagination, or result limits, so it is strong but not complete for an unannotated 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?

The purpose is front-loaded in one line, the routing caveat follows immediately, and the Args block is terse. Every sentence carries information an agent needs; there is no filler.

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?

An output schema exists, so return values need not be described, and the one parameter is covered. The remaining risk for this tool is the Classic-vs-New-Quizzes confusion, which the description addresses head-on.

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 description coverage is 0%, so the description must compensate, and it does: it specifies the parameter is numeric and that it defaults to CANVAS_DEFAULT_COURSE_ID when omitted, matching the empty-string default in the schema. This fully documents the single parameter, though it adds no format/validation detail beyond that.

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+resource ('List quizzes in a course') and goes further to scope which quiz system it covers (Classic Quizzes) and what it excludes. An agent can distinguish it from canvas_list_assignments and canvas_list_discussions without opening any schema.

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 states when to use this tool and what to do when it returns nothing ('check canvas_list_assignments if a quiz you expect is missing'), naming the concrete alternative. This is a real when/when-not/alternative rule, not implied guidance.

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

canvas_list_sectionsA

List a course's sections with their enrollment counts.

Sections matter for anything scoped to part of a roster — section-level due dates, a lab subsection, or enrolling someone into one specific section rather than the course default.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 discloses that enrollment counts accompany each section and that the call is a listing operation, but says nothing about permission requirements (e.g., teacher/admin vs student visibility) or pagination, which matters for a roster-scoped read.

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

Conciseness4/5

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

Front-loads the purpose in one sentence, then a short scoping paragraph, then an Args block. Every element earns its place, though the middle paragraph is slightly verbose for a simple list tool.

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 single parameter plus its default environment fallback is documented. For a one-param read-only tool this is nearly complete; only permission/visibility expectations are unstated.

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 0%, so the description must compensate, and it does: it explains that course_id is a numeric course id and, critically, that it defaults to CANVAS_DEFAULT_COURSE_ID — a behavior invisible in the schema's empty default string. It doesn't clarify format beyond 'numeric' (e.g., leading zeros, course vs section ids).

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 — 'List a course's sections' — and adds that enrollment counts are returned, which is concrete. It clearly reads as distinct from course-level tools like canvas_get_course or canvas_list_enrollments, though it never names a sibling to route against.

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?

The middle paragraph gives real context for when sections matter: section-level due dates, lab subsections, and enrolling into a specific section 'rather than the course default.' That is genuine when-to-use guidance, though it offers no explicit exclusions or named alternative tools.

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

canvas_list_studentsA

List the students enrolled in a course.

FERPA: returns student names, and email addresses when include_email=True. With CANVAS_REDACT_PII=1 identifiers come back as stable hashes instead.

Args: course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. include_email: also request email addresses (default False). search_term: optional name/login substring filter (3+ characters).

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
search_termNo
include_emailNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/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 the full burden and does so well: it discloses FERPA-relevant output (names, conditional emails) and the CANVAS_REDACT_PII=1 hashing behavior, which an agent cannot derive from the schema. It omits pagination behavior and permission requirements, keeping it short of a 5.

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

Conciseness4/5

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

Front-loaded with the purpose, then a compact FERPA note, then an Args block that maps one line per parameter. No filler sentences; the formatting is slightly rough but efficient.

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 description covers the non-obvious behavior (PII redaction, defaults, filter constraints). Missing pagination and result-limit context is the only real gap.

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 description coverage is 0%, so the description must compensate, and it does: it documents all three parameters, including the CANVAS_DEFAULT_COURSE_ID fallback and the 3-character minimum on search_term. It stops short of clarifying that course_id is a string field.

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+resource: 'List the students enrolled in a course.' An agent immediately knows the operation and scope. However, it does not distinguish itself from the nearby sibling canvas_list_enrollments, which plausibly overlaps in purpose.

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 says nothing about when to use this tool versus alternatives such as canvas_list_enrollments or canvas_get_gradebook, nor any prerequisites beyond the default course id. Usage must be inferred from the name alone.

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

canvas_list_submissionsA

List submissions for an assignment: status, score, timestamps, lateness.

Metadata only — call canvas_get_submission for a student's actual work.

Args: assignment_id: numeric assignment id. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID. include_ungraded: keep submissions with no score yet (default True). only_submitted: drop students who have not turned anything in.

ParametersJSON Schema
NameRequiredDescriptionDefault
course_idNo
assignment_idYes
only_submittedNo
include_ungradedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/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 usefully discloses the metadata-only scope and the semantics of the filter flags, but says nothing about permissions, pagination, or rate limits. Output schema presumably covers the return shape, which keeps this at an adequate rather than weak level.

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

Conciseness4/5

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

Front-loaded purpose sentence, one routing sentence, then a compact Args block; every line earns its place given 0% schema coverage. Minor redundancy exists only because the Args block repeats parameter names already in the schema, which is justified here.

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 metadata-only framing plus full parameter semantics make the definition callable as written. Missing pagination and permission behavior keep it from being fully complete for a list endpoint.

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 0%, so the description must compensate, and it does: all four parameters are explained in the Args block, including the fallback to CANVAS_DEFAULT_COURSE_ID and the meaning of include_ungraded. It omits stating only_submitted's default, which the schema sets to false, leaving a small gap.

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 ('List') and resource ('submissions for an assignment') and enumerates the returned fields (status, score, timestamps, lateness). It explicitly distinguishes itself from the sibling canvas_get_submission by declaring it is metadata only, so an agent can route correctly without opening any 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?

Gives a clear when-not: use canvas_get_submission for a student's actual work, implying this tool is for roster-level status views. It does not address other plausible siblings (canvas_download_submissions, canvas_get_gradebook), so it stops short of full alternative routing.

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

canvas_message_studentsA

Send a Canvas inbox message to one or more students. NOTIFIES PEOPLE.

This reaches students directly and cannot be recalled. Show the instructor the recipient list and the exact text, and get explicit approval, every time.

Defaults to individual conversations: each recipient gets their own thread and cannot see who else was written to. Only pass group_conversation=True when the students are meant to see each other — a group project thread, say — because otherwise it discloses the recipient list to everyone on it.

Args: recipient_ids: comma-separated Canvas user ids, or a JSON array. subject: message subject. body: message text. group_conversation: put all recipients in one shared thread. course_id: numeric course id; scopes the message to the course so students can reply. Defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
subjectYes
course_idNo
recipient_idsYes
group_conversationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden and does so well: it discloses irreversibility ('cannot be recalled'), that it actively notifies recipients, the privacy implication of the default per-recipient threading, and the disclosure risk of group threads. These are exactly the behavioral traits an agent needs before mutating state.

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?

Front-loaded with the action and the highest-stakes warning ('NOTIFIES PEOPLE'), followed by usage rules and then parameter notes. Every sentence adds information the schema does not already carry; nothing is padding.

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?

An output schema exists, so return values need no explanation here. Combined with the parameter notes and the approval/privacy guidance, an agent has everything required to invoke this correctly and safely.

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 0%, yet every parameter is explained: recipient_ids accepts a comma-separated list or JSON array, group_conversation controls thread sharing with a stated default, and course_id's scoping effect and fallback to CANVAS_DEFAULT_COURSE_ID are spelled out. This fully compensates for the absent schema descriptions.

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 ('Send a Canvas inbox message to one or more students'), cleanly distinguishing it from sibling announcement and discussion tools. An agent can tell immediately this is direct messaging, not a public post.

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?

Gives explicit when/when-not guidance for group_conversation ('only pass group_conversation=True when students are meant to see each other') and a required approval workflow before every send. It stops short of naming a sibling alternative (e.g. post_announcement) for the broadcast case, but the operating conditions are clear.

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

canvas_post_announcementA

Post an announcement. MUTATES the course — students are notified.

Show the instructor the exact title and body and get explicit approval before calling. Canvas emails the whole roster on post, so deleting the announcement afterwards does not unsend it.

Pass delayed_post_at to schedule instead: the announcement is created but stays unpublished until that moment, which leaves a window to review or cancel it.

Args: title: announcement subject line. message: body (HTML allowed). delayed_post_at: ISO 8601 UTC; publish then instead of immediately. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
messageYes
course_idNo
delayed_post_atNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations exist, so the description carries the full behavioral burden and does so well: it discloses the mutation, that students are notified, that Canvas emails the whole roster, and the irreversible consequence ('deleting the announcement afterwards does not unsend it'). This is exactly the destructive/irreversible context an agent needs before calling.

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?

Front-loads the mutation warning in bold, then the approval requirement, then the scheduling alternative, then parameter notes. Every sentence adds decision-relevant information with no filler.

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?

Covers the safety-critical behavior, the approval workflow, the scheduling option, and all four parameters. An output schema exists, so return values need not be described, leaving nothing an agent needs missing.

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 description coverage is 0%, yet the description documents every parameter: title as subject line, message as body with HTML allowed, delayed_post_at as ISO 8601 UTC publish time, course_id as numeric id defaulting to CANVAS_DEFAULT_COURSE_ID. It fully compensates for the schema gap.

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+resource (post an announcement) and immediately characterizes what it does to the system: 'MUTATES the course — students are notified.' An agent can distinguish this from the sibling read tool canvas_list_announcements 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?

Gives explicit pre-call workflow ('Show the instructor the exact title and body and get explicit approval') and an alternative mode (pass delayed_post_at to schedule instead of posting immediately). It stops short of routing the agent between this and other notifying siblings like canvas_message_students, so it is clear context rather than full when/when-not/alternatives guidance.

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

canvas_update_assignmentA

Edit an existing assignment. MUTATES the course.

Only the fields you pass are changed; omitted ones are left alone. Two edits have downstream gradebook effects worth flagging to the instructor: publishing an assignment students have not seen, and changing points_possible on one that is already graded (every existing score is silently re-scaled in the totals).

Args: assignment_id: numeric assignment id. name: new title, or empty to leave unchanged. description: new body HTML, or empty to leave unchanged. points_possible: new max score, or omit to leave unchanged. due_at: new ISO 8601 UTC due date, or empty to leave unchanged. unlock_at: new ISO 8601 UTC availability date. lock_at: new ISO 8601 UTC close date. published: True/False to change visibility, or omit to leave alone. assignment_group_id: move it to another gradebook category. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
due_atNo
lock_atNo
course_idNo
publishedNo
unlock_atNo
descriptionNo
assignment_idYes
points_possibleNo
assignment_group_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations supplied, the description carries the full burden and does well: it declares the mutation, the leave-alone semantics for omitted fields, and two non-obvious side effects (publishing unseen assignments, silently re-scaling graded scores when points_possible changes). It does not cover auth requirements or whether edits are reversible.

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

Conciseness4/5

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

Front-loads the mutation and the downstream-effect warnings before the args list, and every line of the args block earns its place. The repeated 'or empty to leave unchanged' phrasing is slightly redundant but does encode per-field semantics rather than filler.

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

Completeness4/5

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

For a 10-parameter mutation tool with no annotations, an output schema (so returns need no explanation) and full parameter documentation, this is nearly complete — side effects, defaults, and formats are all covered. Only authorization/error behavior is absent.

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 description coverage is 0% across 10 parameters, so the description must compensate fully — and it does. Each parameter is described with meaning beyond its type, including the crucial distinction between empty-string (leave unchanged) for name/description/due_at versus omit for points_possible/published, ISO 8601 UTC date formats, and the CANVAS_DEFAULT_COURSE_ID fallback.

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+resource ('Edit an existing assignment') and immediately flags the mutation, which cleanly separates it from canvas_get_assignment and canvas_create_assignment in the sibling list. An agent can select it without further inference.

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?

The description explains the partial-update contract ('only the fields you pass are changed; omitted ones are left alone') and calls out two edits with downstream gradebook consequences worth warning an instructor about. It stops short of naming alternatives or stating explicit preconditions such as required permissions.

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

canvas_update_courseA

Edit course settings. MUTATES the live course.

Only the fields you pass change. Publishing a course makes it visible to every enrolled student immediately, and Canvas will not let you unpublish once a student has submitted work — confirm before setting published=True.

Args: name: new course name, or empty to leave unchanged. course_code: new short code, or empty to leave unchanged. start_at: ISO 8601 UTC start, e.g. 2026-08-26T05:00:00Z. end_at: ISO 8601 UTC end. published: True to publish, False to unpublish, omit to leave alone. default_view: landing page — feed, wiki, modules, syllabus, assignments. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
end_atNo
start_atNo
course_idNo
publishedNo
course_codeNo
default_viewNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/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 so well: it flags MUTATES, partial-update semantics, the immediate student visibility of publishing, and the Canvas restriction that a course cannot be unpublished after a student submits work. These are exactly the side effects an agent must know before calling.

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 critical warnings are front-loaded in the first sentence, and the Args block earns its place because the schema has no property descriptions. It is slightly list-like and repeats property names, but there is little wasted text.

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 7-param mutation tool, it covers behavior, side effects, field semantics, and per-parameter formats; an output schema exists, so return values need not be explained. Nothing essential for correct invocation is missing.

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 description coverage is 0%, and the description compensates by documenting all seven parameters: empty-string means leave unchanged, start_at/end_at are ISO 8601 UTC with an example, published accepts True/False/omit, default_view lists the allowed landing pages, and course_id notes its default. This is meaningful added semantics beyond the bare schema.

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+resource ("Edit course settings") and immediately scopes it as a live mutation, which cleanly separates it from read siblings like canvas_get_course and canvas_list_courses. An agent can tell what this does 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?

Gives clear operational context — only passed fields change, and it advises confirming before setting published=True because publishing is immediately visible and hard to reverse. It never names an alternative tool (e.g., canvas_update_syllabus) or an explicit when-not-to-use, so it falls short of the top band.

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

canvas_update_moduleA

Edit or publish a module. MUTATES the course.

Publishing a module publishes its items too, which is the usual way a week's content goes live for students. Only the fields you pass change.

Args: module_id: numeric module id. name: new title, or empty to leave unchanged. position: new 1-based slot, or omit to leave unchanged. published: True/False to change visibility, or omit to leave alone. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
positionNo
course_idNo
module_idYes
publishedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 well: it warns of mutation, discloses the cascading side effect on module items, and states that omitted fields are left unchanged. It omits permission/auth requirements and rate-limit behavior, which keeps it from a 5.

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

Conciseness4/5

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

Front-loads the mutation warning and cascade behavior before the Args block, which is exactly what an agent needs first. The Args list is slightly verbose but every line adds information about defaults and no-op semantics.

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 no explanation. The description covers mutation, cascade, partial-update semantics, and all parameters. The only material gap for a mutating tool with no annotations is permission/auth context.

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 description coverage is 0%, so the description must compensate, and it documents all five parameters: module_id, name (empty = unchanged), position (omit = unchanged, 1-based), published (omit = unchanged), and course_id (defaults to CANVAS_DEFAULT_COURSE_ID). Each parameter gains meaning not present in the bare 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 ('Edit or publish a module') and immediately flags that it mutates the course. An agent can distinguish it from create_module and list_modules by the verb. It stops short of naming a sibling, but 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 Guidelines4/5

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

Explains the key usage context: publishing a module also publishes its items, which is how a week's content goes live. It also clarifies partial-update semantics ('Only the fields you pass change'). No explicit when-not or alternative tool is named, so it falls short of a 5.

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

canvas_update_pageA

Edit a wiki page. MUTATES the course.

Only the fields you pass change. Passing body REPLACES the whole page — read canvas_get_page first if you mean to append. Note that canvas_get_page returns plain text, so round-tripping it through this tool will flatten the page's existing HTML formatting.

Args: page_url: the page's url slug (from canvas_list_pages), not its id. title: new title, or empty to leave unchanged. Renaming does NOT change the url slug, so existing links keep working. body: new page HTML, or empty to leave unchanged. published: True/False to change visibility, or omit to leave alone. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
titleNo
page_urlYes
course_idNo
publishedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/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 mostly meets it: it discloses that only passed fields change, that body REPLACES the whole page, that HTML formatting is flattened on round-trip through canvas_get_page, and that renaming preserves the url slug. It stops short of stating permission requirements, failure modes, or whether edits are reversible, which keeps it from a 5.

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

Conciseness5/5

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

Front-loads the verb, resource, and mutation warning, then organizes per-parameter detail under an Args block. Each sentence carries actionable information with no filler.

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

Completeness4/5

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

An output schema exists so return values need not be described, and the mutation/HTML-flattening caveats cover the riskiest behavior. Minor gaps remain around required permissions and error conditions for a write tool with zero annotation coverage, but nothing essential for a correct call is missing.

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 description coverage is 0%, so the description must compensate, and it does: page_url is a slug not an id, title/body empty means unchanged, published omitted means leave alone, and course_id defaults to CANVAS_DEFAULT_COURSE_ID. Every parameter's sentinel/empty semantics are explained beyond the bare types in the schema.

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 ('Edit a wiki page') and immediately flags the mutation ('MUTATES the course'). An agent can distinguish it from canvas_get_page, canvas_create_page, and canvas_list_pages without opening any schema.

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?

Names concrete alternatives with selecting conditions: 'read canvas_get_page first if you mean to append' and points to canvas_list_pages as the source of the required page_url slug. This is explicit when-to-use and when-to-use-something-else guidance rather than implied.

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

canvas_update_syllabusA

Replace the course syllabus body. MUTATES the live course page.

This OVERWRITES the existing syllabus wholesale — Canvas keeps no version history for it, so read canvas_get_course first if the current text matters, and show the instructor what is being replaced.

Args: body: the new syllabus HTML. Plain text works, but newlines are not converted to , so pass HTML if you want formatting. course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
course_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/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 so well: it discloses wholesale overwrite, absence of version history, the recommended read-before-write workflow, and the non-obvious newline-to-<br> formatting behavior.

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 destructive warning is front-loaded ahead of the argument docs, and every sentence adds information. The 'Args:' block is slightly verbose but still earns its place given zero schema coverage.

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; the description covers the destructive semantics, prerequisites, and both parameters. The main remaining gap is the auth/permission requirement for writing to a live course page.

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 description coverage is 0%, so the description must compensate, and it does: 'body' is explained as HTML with a caveat that plain newlines are not converted, and 'course_id' is documented as defaulting to CANVAS_DEFAULT_COURSE_ID. Only the accepted format/validation of course_id is left implicit.

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+resource ('Replace the course syllabus body') and immediately flags the mutation ('MUTATES the live course page'), which distinguishes it from read siblings like canvas_get_course and from the broader canvas_update_course.

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 tells the agent to read canvas_get_course first when current text matters and to show the instructor what is being replaced. Strong precondition guidance, though it doesn't contrast against any near-alternative (there is no sibling that also edits the syllabus).

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

canvas_upload_fileA

Upload a local file into the course's Files area. MUTATES the course.

Three-step Canvas dance, handled here: register the upload, POST the bytes to the storage host, then confirm. The Canvas token is never sent to the storage host.

Args: local_path: absolute path to the file on the machine running this server. parent_folder_path: Canvas folder, e.g. "course files/week03". Created if it does not exist. name: name to store it under; defaults to the local filename. on_duplicate: "rename" (default, keeps both) or "overwrite". course_id: numeric course id; defaults to CANVAS_DEFAULT_COURSE_ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
course_idNo
local_pathYes
on_duplicateNorename
parent_folder_pathNocourse files

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 well: it declares the mutation, discloses the three-step upload flow (register, POST bytes, confirm), and adds a real security detail that the Canvas token is never sent to the storage host. It stops short of stating auth requirements, reversibility of overwrite, or error/rate-limit behavior, so it is strong but not exhaustive.

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

Conciseness4/5

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

Front-loads purpose and the mutation warning before the process note and Args list. The 'Three-step Canvas dance' phrasing is slightly informal but informative, and the Args block earns its space given the 0% schema coverage.

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. The description covers mutation semantics, the internal upload flow, security, and all parameters; only auth prerequisites and overwrite consequences are left implicit, which is a minor gap.

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 0%, so the description must compensate and it does — every parameter is documented with meaning beyond the bare schema: local_path is server-side absolute, parent_folder_path is a Canvas path auto-created if absent, name defaults to the local filename, on_duplicate distinguishes rename vs overwrite, and course_id falls back to CANVAS_DEFAULT_COURSE_ID.

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 ('Upload a local file into the course's Files area') and flags the operation type with 'MUTATES the course.' This clearly separates it from read-only siblings like canvas_list_files and canvas_download_file.

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 description implies the usage context (pushing a local file into course Files) but never states when to choose this over alternatives such as canvas_download_file, nor any prerequisites or exclusions. Usage is inferable from purpose but not explicitly guided.

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. 42 tool updatesv0.1.0
    • First observedcanvas_api_get
    • First observedcanvas_auth_status
    • First observedcanvas_bulk_grade
    • First observedcanvas_create_assignment
    • First observedcanvas_create_assignment_group
    • First observedcanvas_create_calendar_event
    • First observedcanvas_create_discussion
    • First observedcanvas_create_module
    • First observedcanvas_create_module_item
    • First observedcanvas_create_page
    • First observedcanvas_download_file
    • First observedcanvas_download_submissions
    • First observedcanvas_enroll_user
    • First observedcanvas_get_assignment
    • First observedcanvas_get_course
    • First observedcanvas_get_discussion
    • First observedcanvas_get_gradebook
    • First observedcanvas_get_page
    • First observedcanvas_get_submission
    • First observedcanvas_grade_submission
    • First observedcanvas_list_announcements
    • First observedcanvas_list_assignment_groups
    • First observedcanvas_list_assignments
    • First observedcanvas_list_calendar_events
    • First observedcanvas_list_courses
    • First observedcanvas_list_discussions
    • First observedcanvas_list_enrollments
    • First observedcanvas_list_files
    • First observedcanvas_list_modules
    • First observedcanvas_list_pages
    • First observedcanvas_list_quizzes
    • First observedcanvas_list_sections
    • First observedcanvas_list_students
    • First observedcanvas_list_submissions
    • First observedcanvas_message_students
    • First observedcanvas_post_announcement
    • First observedcanvas_update_assignment
    • First observedcanvas_update_course
    • First observedcanvas_update_module
    • First observedcanvas_update_page
    • First observedcanvas_update_syllabus
    • First observedcanvas_upload_file

TDQS

A3.7/5.0

Scored across 42 tools

Disambiguation4/5

Each tool targets a distinct resource and action, and descriptions actively head off confusion (e.g. canvas_list_students returns users while canvas_list_enrollments returns enrollment ids; canvas_list_submissions is metadata-only while canvas_get_submission returns the work). A few pairs sit close together (download_submissions vs download_file, get_gradebook vs list_submissions, api_get as a catch-all), but none is genuinely ambiguous.

Naming Consistency4/5

Nearly all tools follow a canvas_<verb>_<noun> pattern (get_assignment, list_courses, create_page, update_module, download_file, grade_submission). Minor deviations exist — canvas_auth_status is noun-noun and canvas_api_get inverts the pattern — but the convention is largely predictable.

Tool Count3/5

42 tools is heavy and pushes past the comfortable range, but the Canvas teaching domain is genuinely broad (gradebook, submissions, pages, modules, files, discussions, calendar, messaging). Each tool maps to a distinct operation and an api_get escape hatch absorbs the long tail, so the count is defensible though on the borderline of unwieldy.

Completeness3/5

Create/read/update coverage is strong across assignments, pages, modules, discussions, and grading, but deletions are almost entirely absent (no delete page/module/assignment/file/discussion). Notably, canvas_list_enrollments references a canvas_remove_enrollment tool that is not published, leaving a dangling handle that would trap an agent trying to drop a student.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers