Canvas peer review tracker
Skill bruchris/canvas-lms-mcp/skills/canvas-peer-review-tracker
Educator skill for tracking peer-review assignments in Canvas. Lists who has been asked to review whom, who has submitted versus who is still pending, and lets you assign new reviewers or send reminder messages — one student at a time. Trigger phrases include "peer reviews", "who hasn't done their peer review", "peer review status", "assign a peer reviewer", "remind students about peer reviews", or "peer review tracker".From its SKILL.md
npx -y skills add bruchris/canvas-lms-mcp --skill canvas-peer-review-trackerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
10.1 KB, as published. Nobody here has run it
Canvas Peer Review Tracker
Educator workflow for the peer-review surface canvas-lms-mcp actually exposes: list assignments, see who is pending, optionally create new peer-review assignments, and optionally send a reminder via Canvas Conversations. One student at a time, with confirmation before every write.
What this skill does NOT do
canvas-lms-mcp ships 4 peer-review tools today (list_peer_reviews, get_submission_peer_reviews, create_peer_review, delete_peer_review). It does not yet expose any of the analytics, reminder-campaign, or quality-scoring endpoints competing servers ship. This skill stays inside the surface we have. Do not fabricate calls to:
- Completion-rate analytics — there is no
get_peer_review_completion_analytics. Completion percentages must be computed locally from thelist_peer_reviewsresults, not retrieved as a server-side metric. - Comment-quality scoring — there is no
analyze_peer_review_qualityand no way to read the comments students wrote on peer reviews. Do not attempt to "rate" peer review feedback. - Problematic-review detection — there is no
identify_problematic_peer_reviews. The skill cannot flag low-effort reviews automatically; it can only show which reviews are still incomplete. - Peer review comments — there is no
get_peer_review_comments. The skill can show that a review isassignedorcompleted(theworkflow_statefromlist_peer_reviews), not the comment body. - Follow-up lists / dataset export — there is no
get_peer_review_followup_listand noextract_peer_review_dataset. The "who needs reminding" list is built locally fromworkflow_state=assigned. - Bulk reminder campaigns — there is no
send_peer_review_remindersorsend_peer_review_followup_campaign. Reminders go throughsend_conversationone recipient at a time, with the same per-student confirmation pattern ascanvas-at-risk-students. - Auto-generated reports — there is no
generate_peer_review_reportorgenerate_peer_review_feedback_report. Any summary is built by this skill at presentation time; it is not a Canvas artefact.
If a user asks for any of those, name the gap explicitly and stop. Do not invent tool calls.
Prerequisites
- Canvas MCP server must be running and connected.
- You must have instructor or TA role in the target course.
- The assignment must have peer review enabled (
peer_reviews: trueon the assignment). - Student names appear in output — only run this in a private or educator-only session.
- Reminder messages (Step 5) require Canvas Conversations to be enabled for the course.
Steps
1. Identify the Target Course and Assignment
Ask the educator which course and which peer-reviewed assignment to look at.
If unclear, call list_assignments for the course and surface assignments with peer review enabled. Confirm the choice before continuing — peer-review status data is per assignment, so picking the wrong one wastes the rest of the walk.
2. Pull the Peer Review Roster
Call list_peer_reviews with the course ID and assignment ID. The response is one row per assignment of (reviewer, submission-being-reviewed) with a workflow_state of assigned or completed and the user_id of the reviewer.
Compute locally:
| Bucket | Meaning |
|---|---|
| Completed | workflow_state == completed |
| Pending | workflow_state == assigned |
| Total assignments | Sum of completed + pending |
| Completion rate | completed / total (computed here, not fetched) |
Note: this list is keyed by reviewer-and-submission. A single student can appear multiple times if they were assigned more than one peer to review.
3. Resolve Names
list_peer_reviews returns user IDs only. Call list_course_enrollments with type=['StudentEnrollment'] and state=['active'] once and build a user_id → name map for the rest of the session. Do not re-query enrollments for every reviewer — one call up front, lookup locally afterwards.
4. Present the Tracker
Peer Review Tracker — [Course] › [Assignment]
Total assignments: 60 Completed: 41 (68%) Pending: 19
PENDING REVIEWS (19)
• Alex Doe (id: 12345) — review of submission 8821 (assigned 4 days ago)
• Jordan Park (id: 12346) — review of submission 8822 (assigned 4 days ago)
• Sam Lee (id: 12347) — review of submissions 8823 and 8825
COMPLETED (41)
• [Summary list — collapse by default unless asked]
Group the pending list by reviewer so the educator sees "who has 2+ outstanding reviews" at a glance. Do not display anything that would require fetching review comments — those are not available through this tool surface.
5. Send a Reminder (Optional, One Recipient at a Time)
If the educator wants to remind pending reviewers, repeat 5a–5c once per reviewer. Do not batch.
5a. Draft the Message
Show the educator a default subject line and body, e.g.:
Subject: Reminder — peer review for [Assignment] is still pending Body: Hi [Name], this is a reminder that your peer review for [Assignment] in [Course] hasn't been submitted yet. The review window is still open — let me know if you're running into any issues. Thanks!
Let the educator edit before each send.
5b. Confirm Per Reviewer
Ask, exactly once per reviewer:
"Send this reminder to [Name] (user id [n])? (yes / edit / skip)"
Do not proceed until the educator confirms. Never confirm once and then send to multiple students.
5c. Send
After confirmation, call send_conversation with:
recipients: array containing the single reviewer's user ID as a string (the tool requiresstring[], not numbers)subject: the confirmed subjectbody: the confirmed body
Report ✓ Sent to [Name] and move to the next reviewer.
6. Assign a New Peer Reviewer (Optional)
If the educator wants to add a missing peer-review assignment (e.g., a student joined late and was not auto-assigned a partner):
- Call
list_submissionsfor the assignment so the educator can pick the submission to be reviewed. - Identify the student you want to assign as the reviewer (by name, then look up the user ID from the enrollment map built in Step 3).
- Show the educator: "Assign [Reviewer Name] to peer-review submission [n] (by [Author Name])? (yes/no)"
- Only after confirmation: call
create_peer_reviewwithcourse_id,assignment_id,submission_id, anduser_id(the reviewer). - Report the new peer-review row. Re-run Step 2 if the educator wants the updated tracker.
7. Inspect a Single Submission's Peer Reviews (Optional)
If the educator wants to see every peer review tied to one specific submission (e.g., "what reviews were assigned for Jane Smith's paper?"):
- Call
list_submissionsand find the submission ID for Jane Smith. - Call
get_submissionif the educator wants context about the submission itself. - Call
get_submission_peer_reviewswithcourse_id,assignment_id,submission_id. This returns every reviewer assigned to that single submission with their workflow state.
This is useful when triaging "did this student's paper get reviewed by anyone?" — it is the inverse view of Step 2 (which is reviewer-centric).
Output Format
Peer Review Tracker — [Course Name] › [Assignment Name]
OVERVIEW
Total assignments: 60
Completed: 41 (68%)
Pending: 19
PENDING (grouped by reviewer)
• Alex Doe — 1 pending (submission 8821)
• Jordan Park — 1 pending (submission 8822)
• Sam Lee — 2 pending (submissions 8823, 8825)
REMINDERS THIS SESSION
• Alex Doe → message sent ✓
• Jordan Park → educator chose to skip
• Sam Lee → message sent ✓
NEW ASSIGNMENTS THIS SESSION
• Casey Chen → reviewing submission 8830 (Pat Kim) ✓ created
Notes
- Read-only by default. Steps 1–4 do not modify any Canvas data. Write paths (
create_peer_review,send_conversation) live in Steps 5 and 6 only, each gated by per-student confirmation. - One reviewer at a time for reminders.
send_conversationaccepts an array of recipients but the skill deliberately sends one recipient per call so the educator can audit and skip individuals. Do not collapse multiple reviewers into a single bulk send. send_conversationrecipients are strings, not numbers. The tool'srecipientsparameter isstring[]. Convert user IDs withString(id)before sending.- Completion percentage is computed locally. Canvas does not return a server-side completion metric through this tool surface. The
(completed / total)value comes from counting thelist_peer_reviewsrows yourself — do not invent another source. - Workflow states are limited to
assignedandcompleted. There is noin_progressorlatestate surfaced throughlist_peer_reviews. "Late" is a local interpretation ofassignedpast the assignment'speer_reviews_due_atdate, if set. - Reviewer self-references. Canvas occasionally returns peer-review rows where the reviewer ID equals the submission author's user ID (a misconfigured assignment). Surface these to the educator as "self-review — verify configuration" rather than counting them in the completion stats.
- No comment access. This skill cannot show what a reviewer wrote. It can only confirm that a review is marked
completed. If the educator needs to read peer-review comments, point them at the Canvas web UI. - Reminder cadence. Canvas does not deduplicate Conversation messages. Sending two reminders in quick succession will deliver two messages — track which reviewers were already pinged this session and warn the educator before re-sending.