MCP server for Canvas LMS integration enabling AI assistants to query student grades, assignments, missing work, and academic data
This Canvas LMS MCP server has 19 tools with READ_ONLY risk profiles. Tool naming follows verb_noun conventions (get_*, list_) which is positive. However, critical gaps appear across parameter descriptions, output schema documentation, and error handling. Most tool descriptions are present but generic (10-50 chars), falling well below the 50-200 char baseline for LLM-optimized descriptions. Parameter schemas are visible in the source but lack depth, many parameters have minimal descriptions ('Student ID (optional)') that don't explain format, constraints, or dependencies. Output schemas are not documented anywhere in the provided code. Error handling and recovery guidance are absent. The server shows foundational structure but lacks production-grade polish required for reliable agent interaction.
Get academic status for all observed students
Get course announcements posted by teachers
Get calendar events and assignment due dates
Full academic overview in a single call
List all courses with current grades
Get course discussions
Get all assignments due across all courses
Output schemas not documented. No tool returns structured with documented field types, constraints, or chaining IDs (e.g., course_id returned by get_courses for use in downstream tools like list_assignments). LLMs cannot plan multi-step tool chains without knowing what fields are available.
Parameter descriptions are generic and lack actionable detail. E.g., 'Student ID (optional, defaults to "self")' does not explain format (email, numeric ID, username), when to use it vs 'self', or what 'self' resolves to.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get teacher feedback on submissions
Get inbox direct messages
Get assignments flagged as missing by Canvas
Get course roster and people information
Get recently graded submissions with scores
Get late/missing statistics by course
Get list of observed students (for parent/observer accounts)
Get messages from teachers
Get planner items and to-do list
Get past-due assignments not yet submitted
Get assignments due soon for a specific course
Search and filter assignments by status
Tool descriptions are too short and lack context for LLM selection. Avg length ~30-40 chars; rubric baseline is 194 chars (p10=34, p90=392). E.g., 'Get assignments flagged as missing by Canvas' does not explain when to call this vs get_unsubmitted_past_due or list_assignments with bucket=missing.
No error handling or recovery guidance. Source code shows no error messages guiding LLMs on what to do if a call fails (e.g., 'If student_id is invalid, call get_students() to find valid IDs'). Agents will not know whether to retry, ask the user, or abandon a workflow.
No pagination support visible. 19 tools that likely return collections (get_courses, get_announcements, get_inbox, get_people, get_discussions, etc.) show no limit, offset, or next_cursor parameters in schema.
Overlapping tool functionality without clear differentiation. get_missing_assignments, get_unsubmitted_past_due, list_assignments (with bucket=overdue), and get_due_this_week all appear to surface past-due/overdue work. LLMs will be confused about which to use. Missing tool composition guidance.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). While all 19 tools are marked READ_ONLY in the spec, the source shows no MCP tool annotations in the implementation. Per current spec (2026-07-28), tools should declare hints to help clients optimize behavior.
Parameter validation rules not documented. E.g., 'days' parameter appears in get_upcoming_assignments, get_due_this_week, get_recent_grades, etc., but no description specifies valid range (e.g., 1-365). Unbounded numbers let LLMs pass absurd values.'