Skip to main content
Glama

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
NameRequiredDescriptionDefault
daysNo

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)
  • 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)
  • 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)
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vishalsachdev/canvas-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server