get_peer_review_followup_list
Generate a prioritized list of students needing instructor follow-up for peer review assignments in Canvas, filtering by urgency level and including contact information.
Instructions
Get prioritized list of students requiring instructor follow-up based on peer review completion status.
Args:
course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID
assignment_id: Canvas assignment ID
priority_filter: Priority filter (urgent, medium, low, all)
include_contact_info: Include email addresses if available
days_threshold: Days since assignment for urgency calculation
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| assignment_id | Yes | ||
| course_identifier | Yes | ||
| days_threshold | No | ||
| include_contact_info | No | ||
| priority_filter | No | all |
Implementation Reference
- Primary MCP tool handler: validates parameters, resolves course ID, delegates to PeerReviewAnalyzer.get_followup_list, formats and returns JSON response.@mcp.tool() @validate_params async def get_peer_review_followup_list( course_identifier: str | int, assignment_id: str | int, priority_filter: str = "all", include_contact_info: bool = False, days_threshold: int = 3 ) -> str: """Get prioritized list of students requiring instructor follow-up based on peer review completion status. Args: course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID assignment_id: Canvas assignment ID priority_filter: Priority filter (urgent, medium, low, all) include_contact_info: Include email addresses if available days_threshold: Days since assignment for urgency calculation """ try: # Validate priority filter valid_priorities = ["urgent", "medium", "low", "all"] if priority_filter not in valid_priorities: return f"Error: priority_filter must be one of {valid_priorities}, got '{priority_filter}'" course_id = await get_course_id(course_identifier) analyzer = PeerReviewAnalyzer() result = await analyzer.get_followup_list( course_id=course_id, assignment_id=int(assignment_id), priority_filter=priority_filter, include_contact_info=include_contact_info, days_threshold=days_threshold ) if "error" in result: return f"Error getting peer review followup list: {result['error']}" return json.dumps(result, indent=2) except Exception as e: return f"Error in get_peer_review_followup_list: {str(e)}"
- src/canvas_mcp/server.py:52-52 (registration)Top-level registration call within register_all_tools that invokes the peer review tools registration function, including get_peer_review_followup_list.register_peer_review_tools(mcp)
- Core helper method in PeerReviewAnalyzer that implements the followup list logic: fetches analytics and assignments, categorizes by priority (urgent/medium/low), adds actions and student details.async def get_followup_list( self, course_id: int, assignment_id: int, priority_filter: str = "all", include_contact_info: bool = False, days_threshold: int = 3 ) -> dict[str, Any]: """Get prioritized list of students requiring instructor follow-up.""" try: # Get completion analytics analytics = await self.get_completion_analytics( course_id, assignment_id, include_student_details=True ) if "error" in analytics: return analytics # Get assignment info assignments_data = await self.get_assignments(course_id, assignment_id) if "error" in assignments_data: return assignments_data assignment_info = assignments_data["assignment_info"] completion_groups = analytics.get("completion_groups", {}) # Calculate days since assignment days_since_assigned = days_threshold # Default value # Process followup categories followup_categories = { "urgent": { "description": "Students with 0 peer reviews completed", "count": len(completion_groups.get("none_complete", [])), "students": [] }, "medium": { "description": "Students with partial completion", "count": len(completion_groups.get("partial_complete", [])), "students": [] }, "low": { "description": "Students with all reviews completed - no action needed", "count": len(completion_groups.get("all_complete", [])) } } # Add urgent students for student in completion_groups.get("none_complete", []): student_data = { "student_id": student["student_id"], "student_name": student["student_name"], "assigned_count": student["assigned_count"], "completed_count": student["completed_count"], "completion_rate": student["completion_rate"], "days_since_assigned": days_since_assigned, "pending_reviews": student.get("pending_reviews", []), "recommended_action": "Send urgent reminder email" } if include_contact_info: student_data["contact_email"] = "student@illinois.edu" # Placeholder followup_categories["urgent"]["students"].append(student_data) # Add medium priority students for student in completion_groups.get("partial_complete", []): student_data = { "student_id": student["student_id"], "student_name": student["student_name"], "assigned_count": student["assigned_count"], "completed_count": student["completed_count"], "completion_rate": student["completion_rate"], "pending_reviews": student.get("pending_reviews", []), "recommended_action": "Send gentle reminder" } if include_contact_info: student_data["contact_email"] = "student@illinois.edu" # Placeholder followup_categories["medium"]["students"].append(student_data) # Filter by priority if specified if priority_filter != "all": filtered_categories = {priority_filter: followup_categories.get(priority_filter, {})} followup_categories = filtered_categories # Generate recommended actions recommended_actions = { "immediate": [ f"Send urgent emails to {followup_categories.get('urgent', {}).get('count', 0)} students with zero completion" ], "this_week": [ f"Send automated reminder to {followup_categories.get('medium', {}).get('count', 0)} partial completion students", "Review peer review timing for future assignments" ], "next_assignment": [ "Implement 48-hour buffer between due date and peer review assignment", "Add peer review completion tracking to gradebook" ] } return { "generated_at": datetime.datetime.now().isoformat(), "assignment_info": { "id": assignment_info["id"], "name": assignment_info["name"], "days_since_assigned": days_since_assigned }, "followup_categories": followup_categories, "recommended_actions": recommended_actions } except Exception as e: return {"error": f"Exception in get_followup_list: {str(e)}"}
- Tool schema defined via function signature types and comprehensive docstring Args section, used by @validate_params decorator for input validation."""Get prioritized list of students requiring instructor follow-up based on peer review completion status. Args: course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID assignment_id: Canvas assignment ID priority_filter: Priority filter (urgent, medium, low, all) include_contact_info: Include email addresses if available days_threshold: Days since assignment for urgency calculation """