MCP server for Canvas Learning Management System integration, providing tools for course management, attendance tracking, grading, and content management with student privacy protection through PII blinding
The canvas-teacher-mcp server provides 15 tools with consistent naming patterns and reasonable descriptions. Most tools follow verb_noun conventions (get_*, set_*, list_) and accept optional course_id parameters for context switching. However, there are significant gaps: input schemas are declared but parameter descriptions are often minimal (10-30 chars), output schemas are not documented anywhere in the source, and error handling is not visible in the tool definitions. The server targets an educational domain (Canvas LMS) with clear use cases, but lacks production-grade schema documentation and recovery guidance that would earn a higher score.
Find students in a course by name
Get the currently active course
Get assignments for a course
Get discussions in a course
Get files in a course
Get grades for all students in a course or for a specific student
Get modules in a course
Get pages in a course
Output schemas are completely undocumented. Tool definitions show input schemas but provide zero documentation of what fields are returned, their types, or structure. This forces LLMs to guess what data structures to expect and makes chaining tools unreliable.
Parameter descriptions are too terse (many under 40 chars). Descriptions like 'Canvas course ID (optional, uses active course if not provided)' for course_id appear in 11+ tools, but lack context about when course_id is actually required vs when it truly defaults to active course. This ambiguity will cause LLMs to make wrong assumptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 40 | - | v1 |
Get quizzes in a course
Get submission status (missing or late submissions) for a course
Grade a student submission
List all courses the user has access to
Process Zoom attendance CSV and match to Canvas roster
Reset course configuration
Set the active course for subsequent tool calls
No error handling documentation. The source code shows tool definitions but provides no guidance on how tools fail, what errors mean, or what the LLM should do (retry, lookup something else, ask user). For example, 'find_students_by_name' with no matching name, does it return empty list, error, or suggest alternatives?
Tool 'reset_course' is marked DESTRUCTIVE but has no confirmation or dry-run capability. The description says 'Reset course configuration' but does not clarify what 'reset' means, does it delete all content? Wipe grades? Restore defaults? Without explicit warning and recovery guidance, an LLM may call this accidentally.
Pagination is not documented for list-returning tools. 'list_courses', 'get_grades', 'get_assignments', 'get_files', etc. will potentially return large result sets. No limit, offset, page_size, or cursor parameters are visible in the input schemas, yet Canvas APIs typically return paginated results. This risks returning thousands of items and exhausting context windows.
Tool 'process_attendance_csv' requires a 'csv_path' parameter. This signals the tool reads from the local filesystem, but there is no security note about path traversal protection or validation. Agents should be warned not to construct paths from untrusted input.
Parameter 'status_type' in 'get_submission_status' uses enum ['missing', 'late'] but the description does not explain what these mean in Canvas context. Are there other submission statuses agents should know about? Why only these two?
Tool 'set_active_course' modifies state (sets context for later calls) but the tool description does not explain idempotency. If an LLM retries after a transient failure, is the state set twice or once? This ambiguity can break tool chains.
Tool 'grade_submission' requires course_id, assignment_id, and student_id, yet the input schema shows no description of how to obtain these IDs. An LLM would need to call get_assignments, then infer student_id from get_grades output, but the output format of get_grades is not documented. This creates a brittle tool chain.