get_my_submission_status
Check assignment submission status across Canvas courses to identify missing submissions. Filter by specific course to focus on relevant assignments.
Instructions
Get your submission status for assignments.
Args:
course_identifier: Optional course code or ID to filter by specific course.
If not provided, shows all courses.
Returns your submission status across assignments, highlighting missing submissions.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| course_identifier | No |
Implementation Reference
- The handler function that implements the core logic of the 'get_my_submission_status' tool. It fetches assignments from Canvas API for specified or all courses, checks submission status, categorizes them into submitted, overdue, and not submitted, and formats a user-friendly report.@mcp.tool() @validate_params async def get_my_submission_status(course_identifier: str | int | None = None) -> str: """Get your submission status for assignments. Args: course_identifier: Optional course code or ID to filter by specific course. If not provided, shows all courses. Returns your submission status across assignments, highlighting missing submissions. """ if course_identifier: # Get submissions for specific course course_id = await get_course_id(course_identifier) assignments = await fetch_all_paginated_results( f"/courses/{course_id}/assignments", params={"include[]": ["submission"], "per_page": 100} ) if isinstance(assignments, dict) and "error" in assignments: return f"Error fetching assignments: {assignments['error']}" course_display = await get_course_code(course_id) or course_identifier output_lines = [f"Submission Status for {course_display}:\n"] else: # Get all courses and their assignments courses = await fetch_all_paginated_results( "/courses", params={"enrollment_state": "active", "per_page": 100} ) if isinstance(courses, dict) and "error" in courses: return f"Error fetching courses: {courses['error']}" output_lines = ["Submission Status (All Courses):\n"] all_assignments = [] for course in courses: course_id = course.get("id") course_name = course.get("course_code", course.get("name", "Unknown")) assignments = await fetch_all_paginated_results( f"/courses/{course_id}/assignments", params={"include[]": ["submission"], "per_page": 100} ) if not isinstance(assignments, dict) or "error" not in assignments: for assignment in assignments if isinstance(assignments, list) else []: assignment["_course_name"] = course_name all_assignments.append(assignment) assignments = all_assignments if not assignments: return "No assignments found." # Separate submitted and missing submitted = [] missing = [] for assignment in assignments: submission = assignment.get("submission") is_submitted = submission and submission.get("submitted_at") is not None if is_submitted: submitted.append(assignment) else: # Check if past due due_at = assignment.get("due_at") if due_at: due_date = parse_date(due_at) if due_date and due_date < datetime.now(): missing.append((assignment, "OVERDUE")) else: missing.append((assignment, "NOT SUBMITTED")) else: missing.append((assignment, "NOT SUBMITTED")) # Format output if missing: output_lines.append(f"⚠️ Missing Submissions ({len(missing)}):\n") for assignment, status in missing: name = assignment.get("name", "Unnamed") due_at = format_date(assignment.get("due_at")) if assignment.get("due_at") else "No due date" course_name = assignment.get("_course_name", "") output_lines.append( f"• {name}\n" f" {f'Course: {course_name}' if course_name else ''}\n" f" Due: {due_at}\n" f" Status: {status}\n" ) if submitted: output_lines.append(f"\n✅ Submitted ({len(submitted)}):\n") for assignment in submitted[:10]: # Show first 10 name = assignment.get("name", "Unnamed") submission = assignment.get("submission", {}) submitted_at = format_date(submission.get("submitted_at")) course_name = assignment.get("_course_name", "") output_lines.append( f"• {name}\n" f" {f'Course: {course_name}' if course_name else ''}\n" f" Submitted: {submitted_at}\n" ) return "\n".join(output_lines)
- src/canvas_mcp/server.py:55-55 (registration)The call to register_student_tools(mcp) within register_all_tools, which triggers the registration of the student tools including 'get_my_submission_status' via its @mcp.tool() decorator.register_student_tools(mcp)