Canvas MCP provides 23 tools with complete input schemas and descriptions, but quality is uneven. All tools follow verb_noun naming convention and every parameter has a type and description. However, descriptions are brief (averaging 40-80 chars) and lack LLM-optimized context like 'when to use this' and 'what it returns'. Output schemas are undocumented, the implementation returns dict[str, Any] with no specification of what fields agents should expect. Error handling is absent from the definitions; no guidance on retryability, user-fixable vs. fatal errors, or recovery paths. The tools cover legitimate read/write operations on Canvas LMS but lack the composition guidance needed for multi-step workflows. Tool grouping is reasonable (assignments, courses, discussions, submissions) but parameter relationships are not documented (e.g., preview_assignment_submission has 'now' and 'caffeinate' together, but the description says 'Illegal with --now', this constraint is buried in the parameter description rather than highlighted in a dependency section).
Output schemas undocumented. All tools return dict[str, Any] with no specification of fields, types, or structure. LLMs cannot plan downstream tool calls or extract required data.
No error handling guidance. Tools provide no categorization of errors as retryable, user-fixable, or fatal. No recovery hints (e.g., 'Call search_courses() to find valid course_id').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 52 | - | v1 |
Descriptions are too brief (40-80 chars average). Most lack context on WHEN to use the tool, WHAT it returns, and HOW to compose with other tools. The rubric baseline for A+ tools is 50-200 chars with LLM-optimized context.
Parameter constraints not formalized as enums. 'bucket' in list_course_assignments accepts free-form string (upcoming, overdue, past, etc.) but no enum constraint. LLMs will hallucinate invalid values. 'submission_type' in preview_assignment_submission mentions 'online_upload or online_text_entry' in description but has no enum in schema.
Pagination missing or incomplete. list_* tools accept 'limit' but do not document if they return a total count, next_cursor, or next_offset. LLMs cannot reliably paginate through large datasets.
Parameter relationships undocumented. preview_assignment_submission has conflicting options ('now' and 'caffeinate', description says 'Illegal with --now') but no explicit mutual-exclusivity constraint or clear guidance in a dependency section.
Tool names could be more consistent. 'canvas_get_page' uses a module prefix; others use verb_noun. 'install_assignment_submission_files' uses 'install' (unusual for file download) rather than 'download' or 'fetch'.
No dry-run or confirmation for destructive operations. confirm_assignment_submission and cancel_scheduled_submission are write operations but provide no preview or rollback guidance.