This skill enables read-only access to Canvas LMS for student workflows.
Invoke this skill when the user asks anything related to their Canvas courses, such as:
Key indicators: Canvas, course, assignment, homework, deadline, grade, syllabus, lecture notes, materials.
Configuration (in order of precedence):
CANVAS_BASE_URL - Institution Canvas URL (e.g., https://canvas.university.edu)CANVAS_API_TOKEN - Personal API token from Canvas Settings~/.config/canvas-lms/config.json{"base_url": "...", "api_token": "..."}canvas-lms config)Setup Guide (if not configured):
Environment variables: bash
export CANVAS_BASE_URL="https://your-school.instructure.com"
export CANVAS_API_TOKEN="copied-token"
CLI tool (easier for humans): bash
pip install canvas-lms-cli
canvas-lms config # Interactive setup
python scripts/canvas_client.py --testScript: python scripts/list_courses.py
Purpose: Get course IDs and basic information for other operations.
Key Options:
--active-only - Show only current enrollments--with-grades - Include current scores--json - Output structured JSON (recommended for AI parsing)--resolve "Course Name" - Find course by name instead of IDOutput: Course ID, name, code, grade (optional)
When to Use:
--resolve to find course ID from name (e.g., --resolve "CS101")AI Tip: Use --json for reliable parsing, or --resolve to convert course names to IDs automatically.
Script: python scripts/get_assignments.py --course <ID>
Purpose: List assignments with deadlines and submission status.
Key Options:
--course 12345 or --course "CS101" --resolve-name - Course ID or name--upcoming - Only future assignments--overdue - Only overdue assignments--unsubmitted - Only pending work--with-description - Include full descriptions--json - Output structured JSON--assignment-name "Project" - Find specific assignment by nameWhen to Use: Checking workload, finding deadlines, or getting assignment overview.
AI Tip: Use --resolve-name to avoid manual ID lookup, or --assignment-name to find specific assignments by name.
Script: python scripts/get_assignment_detail.py --course <ID> --assignment <ID>
Purpose: Retrieve complete assignment requirements for AI-assisted writing.
Returns:
When to Use: Before AI-assisted essay/assignment writing to get full context and requirements.
Script: python scripts/download_files.py --course <ID> --output <DIR>
Purpose: Download all course materials to local directory.
Key Options:
--folder "Folder Name" - Download specific folder only--type pdf - Filter by file extension--dry-run - Preview without downloading--flat - Flat structure (don't preserve Canvas folders)--json - Output file list as JSON--no-id-prefix - Don't add ID prefix to duplicate filenamesWhen to Use: Gathering reading materials, saving lecture notes, or collecting reference documents.
File Organization:
By default, preserves Canvas folder structure. Files with duplicate names get ID prefix (e.g., 12345_lecture.pdf). Use --flat for flat structure.
Script: python scripts/export_calendar.py --course <IDs> --output <FILE>
Purpose: Export assignment deadlines to iCalendar (.ics) format.
Key Options:
--courses 123,456,789 - Multiple courses (comma-separated)--unsubmitted-only - Only pending assignmentsWhen to Use: Creating calendar reminders, syncing with Google/Apple Calendar.
Script: python scripts/search_canvas.py --query "<search>"
Purpose: Find files, assignments, or announcements across courses.
Key Options:
--course <ID> - Search specific course only--type assignment|file|announcement - Limit search type--full-content - Show content previewsWhen to Use: Finding specific resources, locating assignment requirements, checking announcements.
text
1. List courses → get course ID
2. Get assignments → find target assignment ID
3. Get assignment detail → retrieve full requirements and rubric
4. (Optional) Search for related materials
5. (Optional) Download reference files
6. AI generates essay based on gathered context
text
1. List courses → get all course IDs
2. Export calendar → generate .ics with all deadlines
3. Import to calendar app for reminders
text
1. List courses → get course ID
2. Download files → get all course materials
3. Search for specific topics if needed
Read-Only: This skill only reads data. It cannot:
Rate Limits: Canvas API has rate limiting. For bulk operations:
Data Privacy:
Common errors and solutions:
ErrorCauseSolution401 UnauthorizedInvalid/expired tokenGuide user to regenerate token403 ForbiddenInsufficient permissionsCheck enrollment status404 Not FoundWrong course/assignment IDVerify IDs from list commands429 Rate LimitedToo many requestsAdd delay and retry
This repository can be installed from ClawHub/OpenClaw as a skill bundle.
OpenClaw discovers the skill from SKILL.md. The added manifest.json and
wrapper.py are supplemental helper files for wrapper-based environments; they
do not auto-register seven native OpenClaw tools by themselves. If you want
native tool exposure inside OpenClaw, package the wrapper as a plugin or MCP
server separately.
bash
# Preferred: install from ClawHub/OpenClaw
openclaw skills install canvas-lms-student
# Or install with clawhub
clawhub install canvas-lms-student
# Or clone the repository directly
git clone https://github.com/Efan404/canvas-lms-student-skill.git
# Run setup to install dependencies
cd canvas-lms-student-skill
./setup.sh
# Or manually install dependencies
pip3 install canvasapi requests
Set up Canvas API access:
bash
# Method 1: Environment variables
export CANVAS_BASE_URL="https://your-school.instructure.com"
export CANVAS_API_TOKEN="your-api-token"
# Method 2: Config file
mkdir -p ~/.config/canvas-lms
echo '{"base_url": "https://...", "api_token": "..."}' > ~/.config/canvas-lms/config.json
Get API token: Canvas → Account → Settings → Approved Integrations → + New Access Token
When used through the local wrapper, these commands are available:
ToolDescriptionExamplelist_coursesList all courseslist_courses()``resolve_courseFind course by nameresolve_course(name="CS5293")``get_assignmentsGet course assignmentsget_assignments(course="CS5293")``get_assignment_detailGet assignment infoget_assignment_detail(course=67488, assignment=319756)``search_canvasSearch contentsearch_canvas(query="project", type="assignment")``download_filesDownload course filesdownload_files(course=67488, type="pdf")``export_calendarExport deadlinesexport_calendar(courses="67488,67524")
For programmatic access, use the wrapper:
bash
python3 wrapper.py list_courses '{"active_only": true}'
python3 wrapper.py get_assignments '{"course": "CS5293", "upcoming": true}'
python3 wrapper.py search_canvas '{"query": "deadline", "type": "announcement"}'
See manifest.json for complete tool definitions and parameter schemas.