get_my_upcoming_assignments
Retrieve upcoming assignments due within a specified timeframe from Canvas courses, sorted by due date with submission status.
Instructions
Get your upcoming assignments across all courses.
Args:
days: Number of days to look ahead (default: 7)
Returns upcoming assignments due within the specified timeframe,
sorted by due date, with submission status.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Implementation Reference
- The handler function for the 'get_my_upcoming_assignments' tool. It fetches upcoming events from the Canvas API (/users/self/upcoming_events), filters for assignments due within the specified number of days, sorts them by due date, retrieves course codes, checks submission status, and formats a readable list.@mcp.tool() async def get_my_upcoming_assignments(days: int = 7) -> str: """Get your upcoming assignments across all courses. Args: days: Number of days to look ahead (default: 7) Returns upcoming assignments due within the specified timeframe, sorted by due date, with submission status. """ # Calculate the date range end_date = datetime.now() + timedelta(days=days) end_date_str = end_date.strftime("%Y-%m-%d") # Get upcoming events for the current user events = await fetch_all_paginated_results( "/users/self/upcoming_events", params={"per_page": 100} ) if isinstance(events, dict) and "error" in events: return f"Error fetching upcoming assignments: {events['error']}" if not events: return f"No assignments due in the next {days} days." # Filter to assignments only (not calendar events) assignments = [] for event in events: if event.get("type") == "assignment" or event.get("assignment"): assignment_data = event.get("assignment", event) due_at = assignment_data.get("due_at") if due_at: # Check if within our date range due_date = parse_date(due_at) if due_date and due_date <= end_date: assignments.append(assignment_data) if not assignments: return f"No assignments due in the next {days} days." # Sort by due date assignments.sort(key=lambda x: parse_date(x.get("due_at", "")) or datetime.max) # Format output output_lines = [f"Upcoming Assignments (Next {days} Days):\n"] for assignment in assignments: name = assignment.get("name", "Unnamed Assignment") due_at = format_date(assignment.get("due_at")) course_id = assignment.get("course_id") # Get course name course_display = await get_course_code(course_id) if course_id else "Unknown Course" # Get submission status submission = assignment.get("submission") if submission: submitted = submission.get("submitted_at") is not None status = "✅ Submitted" if submitted else "❌ Not Submitted" else: status = "❌ Not Submitted" output_lines.append( f"• {name}\n" f" Course: {course_display}\n" f" Due: {due_at}\n" f" Status: {status}\n" ) return "\n".join(output_lines)
- src/canvas_mcp/server.py:55-55 (registration)The call to register_student_tools(mcp) in the register_all_tools function, which triggers the definition and registration of the get_my_upcoming_assignments tool via its @mcp.tool() decorator.register_student_tools(mcp)
- src/canvas_mcp/tools/student_tools.py:21-92 (registration)The @mcp.tool() decorator on the handler function serves as the direct registration mechanism for the tool within the register_student_tools function.@mcp.tool() async def get_my_upcoming_assignments(days: int = 7) -> str: """Get your upcoming assignments across all courses. Args: days: Number of days to look ahead (default: 7) Returns upcoming assignments due within the specified timeframe, sorted by due date, with submission status. """ # Calculate the date range end_date = datetime.now() + timedelta(days=days) end_date_str = end_date.strftime("%Y-%m-%d") # Get upcoming events for the current user events = await fetch_all_paginated_results( "/users/self/upcoming_events", params={"per_page": 100} ) if isinstance(events, dict) and "error" in events: return f"Error fetching upcoming assignments: {events['error']}" if not events: return f"No assignments due in the next {days} days." # Filter to assignments only (not calendar events) assignments = [] for event in events: if event.get("type") == "assignment" or event.get("assignment"): assignment_data = event.get("assignment", event) due_at = assignment_data.get("due_at") if due_at: # Check if within our date range due_date = parse_date(due_at) if due_date and due_date <= end_date: assignments.append(assignment_data) if not assignments: return f"No assignments due in the next {days} days." # Sort by due date assignments.sort(key=lambda x: parse_date(x.get("due_at", "")) or datetime.max) # Format output output_lines = [f"Upcoming Assignments (Next {days} Days):\n"] for assignment in assignments: name = assignment.get("name", "Unnamed Assignment") due_at = format_date(assignment.get("due_at")) course_id = assignment.get("course_id") # Get course name course_display = await get_course_code(course_id) if course_id else "Unknown Course" # Get submission status submission = assignment.get("submission") if submission: submitted = submission.get("submitted_at") is not None status = "✅ Submitted" if submitted else "❌ Not Submitted" else: status = "❌ Not Submitted" output_lines.append( f"• {name}\n" f" Course: {course_display}\n" f" Due: {due_at}\n" f" Status: {status}\n" ) return "\n".join(output_lines)