Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Fetch Canvas LMS courses and assignments via API token.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | -43% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -48% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 73% | 0% |
Read-only access to Canvas LMS for listing courses and assignments.
scripts/canvas_api.py — Python CLI for Canvas API calls${HERMES_HOME:-~/.hermes}/.env:CANVAS_API_TOKEN=your_token_here
CANVAS_BASE_URL=https://yourschool.instructure.comThe base URL is whatever appears in your browser when you're logged into Canvas (no trailing slash).
bashCANVAS="python $HERMES_HOME/skills/productivity/canvas/scripts/canvas_api.py" # List all active courses $CANVAS list_courses --enrollment-state active # List all courses (any state) $CANVAS list_courses # List assignments for a specific course $CANVAS list_assignments 12345 # List assignments ordered by due date $CANVAS list_assignments 12345 --order-by due_at
list_courses returns:
json[{"id": 12345, "name": "Intro to CS", "course_code": "CS101", "workflow_state": "available", "start_at": "...", "end_at": "..."}]
list_assignments returns:
json[{"id": 67890, "name": "Homework 1", "due_at": "2025-02-15T23:59:00Z", "points_possible": 100, "submission_types": ["online_upload"], "html_url": "...", "description": "...", "course_id": 12345}]
Note: Assignment descriptions are truncated to 500 characters. The html_url field links to the full assignment page in Canvas.
bash# List courses curl -s -H "Authorization: Bearer $CANVAS_API_TOKEN" \ "$CANVAS_BASE_URL/api/v1/courses?enrollment_state=active&per_page=10" # List assignments for a course curl -s -H "Authorization: Bearer $CANVAS_API_TOKEN" \ "$CANVAS_BASE_URL/api/v1/courses/COURSE_ID/assignments?per_page=10&order_by=due_at"
Canvas uses Link headers for pagination. The Python script handles pagination automatically.
$CANVAS list_courses — if it fails with 401, guide the user through setupX-Rate-Limit-Remaining header if hitting limits| Problem | Fix | |---------|-----| | 401 Unauthorized | Token invalid or expired — regenerate in Canvas Settings | | 403 Forbidden | Token lacks permission for this course | | Empty course list | Try --enrollment-state active or omit the flag to see all states | | Wrong institution | Verify CANVAS_BASE_URL matches the URL in your browser | | Timeout errors | Check network connectivity to your Canvas instance |
Other measured skills in the registry, with their headline benchmark lift.