canvas-parent-mcp
MCP server for Canvas LMS (Instructure) — read courses, grades, assignments, announcements, planner items, and conversations; download course files. Mirrors the parent/observer scope of the sibling infinitecampus-mcp.
Setup
Option A — npx (recommended)
Add to .mcp.json in your project or ~/.claude/mcp.json:
{
"mcpServers": {
"canvas": {
"command": "npx",
"args": ["-y", "canvas-parent-mcp"],
"env": {
"CANVAS_BASE_URL": "https://cms.instructure.com"
}
}
}
}
With the fetchproxy extension installed and a signed-in Canvas tab, that's enough — the MCP reads your session cookies at startup. Add CANVAS_TOKEN, CANVAS_CLIENT_*/CANVAS_REFRESH_TOKEN, or CANVAS_USERNAME/CANVAS_PASSWORD to the env block if you'd rather use one of those modes.
Option B — from source
git clone https://github.com/chrischall/canvas-parent-mcp
cd canvas-parent-mcp
npm install && npm run build
Authentication
fetchproxy fallback (recommended, zero-config). Set only CANVAS_BASE_URL. Install the fetchproxy browser extension, sign into your Canvas instance once. The MCP reads canvas_session + pseudonym_credentials cookies from your tab at startup; all API calls go directly from Node after that. Works with any auth flow (SSO/SAML/2FA included).
Alternatives (env-var)
- Personal access token — set
CANVAS_TOKEN. Most institutions have disabled this for non-admins. - OAuth — set
CANVAS_CLIENT_ID,CANVAS_CLIENT_SECRET,CANVAS_REFRESH_TOKEN. Bootstrap viacanvas-parent-mcp-qr-login. - Username/password (session-scrape) — set
CANVAS_USERNAME+CANVAS_PASSWORD. Direct Canvas accounts only (no SSO/2FA). Brittle.
Precedence when multiple are set: CANVAS_TOKEN > username/password > OAuth > fetchproxy. Set CANVAS_DISABLE_FETCHPROXY=1 to opt out of the fallback.
Tools (prefix canvas_)
Profile & observees
canvas_get_profile— your Canvas profilecanvas_list_observees— students linked to your observer account
Courses
canvas_list_courses— your active courses with gradescanvas_get_course(courseId)— course detail with syllabus + teachers
Assignments & submissions
canvas_list_assignments(courseId)— assignments in a coursecanvas_list_missing_submissions— past-due unsubmitted workcanvas_get_submission(courseId, assignmentId)— your submission with comments + rubriccanvas_list_recent_submissions(courseId)— recently graded submissions (default 14d)
Grades
canvas_list_enrollments— per-course grades
Calendar & planner
canvas_list_calendar_events— calendar events / assignmentscanvas_list_upcoming_events— server-curated next 7 dayscanvas_list_planner_items— unified to-do feed
Communication
canvas_list_announcements(contextCodes)— course announcementscanvas_list_conversations— inboxcanvas_get_conversation(id)— full conversation threadcanvas_list_discussion_topics(courseId)— course discussion topics
Files
canvas_list_course_files(courseId)— file metadatacanvas_download_file(url, destinationPath)— download a file to disk
Notes
- Set
CANVAS_NAMEif you want a friendly label other than the host portion of the base URL. - All read tools that target a user accept an optional
observeeIdparameter (defaults toself) — useful when an observer is checking on a linked student.
Scan to join WeChat group