Install
openclaw skills install @chrischall/canvas-parent-mcpThis skill should be used when the user asks about Canvas LMS data — their own student account or any observed student. Triggers on phrases like "check Canvas", "what's my grade", "Canvas inbox", "what's due", "missing assignments", "Canvas LMS", "Instructure", "course announcements", "syllabus", or any request about courses, assignments, grades, conversations, announcements, planner items, or files in Canvas.
openclaw skills install @chrischall/canvas-parent-mcpMCP 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.
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.
git clone https://github.com/chrischall/canvas-parent-mcp
cd canvas-parent-mcp
npm install && npm run build
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).
CANVAS_TOKEN. Most institutions have disabled this for non-admins.CANVAS_CLIENT_ID, CANVAS_CLIENT_SECRET, CANVAS_REFRESH_TOKEN. Bootstrap via canvas-parent-mcp-qr-login.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.
canvas_)canvas_get_profile — your Canvas profilecanvas_list_observees — students linked to your observer accountcanvas_list_courses — your active courses with gradescanvas_get_course(courseId) — course detail with syllabus + teacherscanvas_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)canvas_list_enrollments — per-course gradescanvas_list_calendar_events — calendar events / assignmentscanvas_list_upcoming_events — server-curated next 7 dayscanvas_list_planner_items — unified to-do feedcanvas_list_announcements(contextCodes) — course announcementscanvas_list_conversations — inboxcanvas_get_conversation(id) — full conversation threadcanvas_list_discussion_topics(courseId) — course discussion topicscanvas_list_course_files(courseId) — file metadatacanvas_download_file(url, destinationPath) — download a file to diskCANVAS_NAME if you want a friendly label other than the host portion of the base URL.observeeId parameter (defaults to self) — useful when an observer is checking on a linked student.