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
"""Peer review analytics MCP tools for Canvas API."""
import json
from mcp.server.fastmcp import FastMCP
from ..core.cache import get_course_id
from ..core.peer_reviews import PeerReviewAnalyzer
from ..core.validation import validate_params
def register_peer_review_tools(mcp: FastMCP):
"""Register all peer review analytics MCP tools."""
@mcp.tool()
@validate_params
async def get_peer_review_assignments(
course_identifier: str | int,
assignment_id: str | int,
include_names: bool = True,
include_submission_details: bool = False
) -> str:
"""Get comprehensive peer review assignment mapping showing who is assigned to review whom with accurate completion status.
Args:
course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID
assignment_id: Canvas assignment ID
include_names: Include student names (requires additional API call)
include_submission_details: Include submission metadata
"""
try:
course_id = await get_course_id(course_identifier)
analyzer = PeerReviewAnalyzer()
result = await analyzer.get_assignments(
course_id=course_id,
assignment_id=int(assignment_id),
include_names=include_names,
include_submission_details=include_submission_details
)
if "error" in result:
return f"Error getting peer review assignments: {result['error']}"
return json.dumps(result, indent=2)
except Exception as e:
return f"Error in get_peer_review_assignments: {str(e)}"
@mcp.tool()
@validate_params
async def get_peer_review_completion_analytics(
course_identifier: str | int,
assignment_id: str | int,
include_student_details: bool = True,
group_by_status: bool = True
) -> str:
"""Get detailed analytics on peer review completion rates with student-by-student breakdown and summary statistics.
Args:
course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID
assignment_id: Canvas assignment ID
include_student_details: Include per-student breakdown
group_by_status: Group students by completion status
"""
try:
course_id = await get_course_id(course_identifier)
analyzer = PeerReviewAnalyzer()
result = await analyzer.get_completion_analytics(
course_id=course_id,
assignment_id=int(assignment_id),
include_student_details=include_student_details,
group_by_status=group_by_status
)
if "error" in result:
return f"Error getting peer review completion analytics: {result['error']}"
return json.dumps(result, indent=2)
except Exception as e:
return f"Error in get_peer_review_completion_analytics: {str(e)}"
@mcp.tool()
@validate_params
async def generate_peer_review_report(
course_identifier: str | int,
assignment_id: str | int,
report_format: str = "markdown",
include_executive_summary: bool = True,
include_student_details: bool = True,
include_action_items: bool = True,
include_timeline_analysis: bool = True,
save_to_file: bool = False,
filename: str = None
) -> str:
"""Generate comprehensive peer review completion report with executive summary, detailed analytics, and actionable follow-up recommendations.
Args:
course_identifier: Canvas course code (e.g., badm_554_120251_246794) or ID
assignment_id: Canvas assignment ID
report_format: Report format (markdown, csv, json)
include_executive_summary: Include executive summary
include_student_details: Include student details
include_action_items: Include action items
include_timeline_analysis: Include timeline analysis
save_to_file: Save report to local file
filename: Custom filename for saved report
"""
try:
course_id = await get_course_id(course_identifier)
analyzer = PeerReviewAnalyzer()
result = await analyzer.generate_report(
course_id=course_id,
assignment_id=int(assignment_id),
report_format=report_format,
include_executive_summary=include_executive_summary,
include_student_details=include_student_details,
include_action_items=include_action_items,
include_timeline_analysis=include_timeline_analysis
)
if "error" in result:
return f"Error generating peer review report: {result['error']}"
# Handle file saving if requested
if save_to_file and "report" in result:
import os
from datetime import datetime
if not filename:
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"peer_review_report_{assignment_id}_{timestamp}.{report_format}"
try:
# Save to current working directory
with open(filename, 'w', encoding='utf-8') as f:
f.write(result["report"])
result["saved_to"] = os.path.abspath(filename)
except Exception as save_error:
result["save_error"] = f"Failed to save file: {str(save_error)}"
if report_format in ["csv", "markdown"]:
return result.get("report", json.dumps(result, indent=2))
else:
return json.dumps(result, indent=2)
except Exception as e:
return f"Error in generate_peer_review_report: {str(e)}"
@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)}"