Skip to main content

canvaslms: A CLI to Canvas LMS.

This program provides a command-line interface for Canvas. The command is canvaslms and it has several subcommands in the same style as Git. canvaslms provides output in a format useful for POSIX tools, this makes automating tasks much easier.

Getting started

Start by login to your Canvas server

pipx install canvaslms
canvaslms login

Then let the built-in tutorials walk you through the commands against your own courses. Each step opens a shell, tells you what to type, and checks what you did; progress is saved between runs.

canvaslms tutorial list
canvaslms tutorial run getting-started

The first tutorial covers logging in and listing courses and users. Later ones cover assignments and grading, course content, and letting a coding agent such as Claude Code run canvaslms for you through the skills in dbosk/claude-skills.

You can also use the package directly from Python. This lets scripts and other CLI tools import canvaslms and reuse the same authentication, configuration, and encrypted cache as the canvaslms command-line tool. The top-level canvaslms.canvas object is lazy-loaded, restored from the same encrypted cache as the CLI, and saved automatically at process exit.

import canvaslms

for course in canvaslms.canvas.get_courses():
    print(course.name)

Let's consider how to grade students logging into the student-shell SSH server. We store the list of students' Canvas and KTH IDs in a file.

canvaslms users -sc DD1301 | cut -f 1,2 > students.csv

Then we check who has logged into student-shell.

ssh student-shell.sys.kth.se last | cut -f 1 -d " " | sort | uniq \
  > logged-in.csv

Finally, we check who of our students logged in. We can set their grade to P and add the comment "Well done!" in Canvas. We set the grades for the two assignments whose titles match the regular expression (Preparing the terminal|The terminal).

for s in $(cut -f 2 students.csv); do
  grep $s logged-in.csv && \
    canvaslms grade -c DD1301 -a "(Preparing the terminal|The terminal)" \
      -u $(grep $s students.csv | cut -f 1) \
      -g P -m "Well done!"
done

Analyzing Quiz/Survey Results

The quizzes analyse command helps you analyze Canvas quiz or survey evaluation data. Download the Student Analysis Report CSV from Canvas and run:

# Markdown output (default, rendered with rich)
canvaslms quizzes analyse --csv survey_results.csv

# LaTeX output (for PDF compilation)
canvaslms quizzes analyse --csv survey_results.csv --format latex > report.tex

This will provide:

  • Statistical summaries for quantitative questions (ratings, multiple choice)
  • Proper handling of multi-select questions (comma-separated options)
  • All individual responses for qualitative questions (free text)
  • AI-generated summaries of qualitative responses (requires llm, install with canvaslms[llm])

If you installed with the [llm] extra, configure your API keys:

llm keys set openai  # or another provider

Managing Quiz Content

Quizzes written elsewhere, for example with text2qti, can be imported as QTI 1.2 packages. First list your courses and their IDs, then replace 12345 below with your course ID to upload a generated Classic quiz. Run the last command after regenerating the ZIP to replace its questions. Replacing keeps the quiz's ID and settings, requires an unpublished quiz without student attempts, and writes a backup that quizzes edit -f can restore.

canvaslms courses --all --id
quiz_id=$(canvaslms quizzes import -c '^12345$' -f quiz.qti.zip --id-only)
canvaslms quizzes import -c '^12345$' -f quiz.qti.zip -a "^$quiz_id$" --replace-items

Add --type new to import as a New Quiz instead (fresh imports only), and canvaslms quizzes list -c '^12345$' -i to list quizzes with their IDs.

View and edit quiz content directly from the command line:

# View quiz questions rendered as markdown
canvaslms quizzes view -c "Course" -a "Quiz Name"

# Edit quiz content interactively
canvaslms quizzes edit -c "Course" -a "Quiz Name"

# Export quiz items for backup or migration
canvaslms quizzes items export -c "Course" -a "Quiz Name" --importable

# Add questions to a quiz bank (use --example to see question formats)
canvaslms quizzes items add -c "Course" -a "Quiz Name" --example

Editing Announcements and Discussions

Edit existing announcements using the same workflow as pages:

# Edit interactively (opens in editor)
canvaslms discussions edit -c "Course" -t "Announcement Title"

# Edit from a markdown file with YAML front matter
canvaslms discussions edit -c "Course" -t "Announcement Title" -f announcement.md

Installation

Install the PyPI package using pip or pipx:

# Basic installation (Python 3.10+)
python3 -m pip install canvaslms
# or
pipx install canvaslms # recommended

# With optional LLM support for AI summaries (Python 3.10+)
python3 -m pip install canvaslms[llm]
# or
pipx install canvaslms[llm] # recommended

The [llm] extra includes the llm package and various LLM provider plugins (OpenAI, Anthropic, Gemini, Azure) for AI-powered features like quiz analysis summaries.

The Python API uses the same credential sources as the command-line tool: system keyring, CANVAS_SERVER/CANVAS_TOKEN, or the config file.

Some subcommands use pandoc, so you will likely have to install pandoc on your system manually.

Development

This project uses literate programming with noweb. The source code is written in .nw files which combine documentation and code.

GitHub Copilot Setup

This repository includes GitHub Copilot configuration files:

  • .github/copilot-instructions.md: Project context and coding guidelines
  • .copilotignore: Files to exclude from Copilot context

The configuration helps Copilot understand the literate programming approach, Canvas LMS domain, and project-specific patterns.

Metadata

Release files for canvaslms 6.22

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for canvaslms 6.22
File Size Uploaded
canvaslms-6.22.tar.gz 692.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for canvaslms 6.22
File Interpreter ABI Platform
canvaslms-6.22-py3-none-any.whl Python 3 none any Details

Total release size: 882.9 kB

Release files / canvaslms-6.22.tar.gz

Download URL canvaslms-6.22.tar.gz
Size 692.1 kB
Tags Source
SHA-256 checksum
How to use checksums
be63a86a285ebe925c8b5582a5f6ef9006cb366a783e66a6a4aeabaedef2113d
BLAKE2b-256 checksum
How to use checksums
846545573bb588e0519ba9de991f1ba67927dc1f196796e1220ede2961b9a317
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.3 CPython/3.14.4 Linux/7.0.0-31-generic

Release files / canvaslms-6.22-py3-none-any.whl

Download URL canvaslms-6.22-py3-none-any.whl
Size 190.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
23c80b4b77a2d1793c9c6f0588094750fa0028727f0fc29a1e76a8719329c862
BLAKE2b-256 checksum
How to use checksums
97c698c11485178e87092d7d0dc1a699464eb0d714e94c323b641cb21ac69505
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.3 CPython/3.14.4 Linux/7.0.0-31-generic

Release history Release notifications | RSS feed

This release

6.22 This release

2 release files

6.21

2 release files

6.20

2 release files

6.19

1 release file

6.18

2 release files

6.17

2 release files

6.16

2 release files

6.15

2 release files

6.14

2 release files

6.13

2 release files

6.12

2 release files

6.11

2 release files

6.10

2 release files

6.9

2 release files

6.8

2 release files

6.7

2 release files

6.6

2 release files

6.5

2 release files

6.4

2 release files

6.3

2 release files

6.2

2 release files

6.1

2 release files

6.0

2 release files

5.10

2 release files

5.9

2 release files

5.8

2 release files

5.7

2 release files

5.6

2 release files

5.5

2 release files

5.4

2 release files

5.3

2 release files

5.2

2 release files

5.1

2 release files

5.0

2 release files

4.15

2 release files

4.14

2 release files

4.13

2 release files

4.12

2 release files

4.11

2 release files

4.10

2 release files

4.2

2 release files

4.1

2 release files

4.0

2 release files

3.9

2 release files

3.8

2 release files

3.7

2 release files

3.6

2 release files

3.5

2 release files

3.4

2 release files

3.3

2 release files

3.0

2 release files

2.23

2 release files

2.22

2 release files

2.21

2 release files

2.20

2 release files

2.19

2 release files

2.18

2 release files

2.17

2 release files

2.16

2 release files

2.15

2 release files

2.14

2 release files

2.13

2 release files

2.12

2 release files

2.11

2 release files

2.10

2 release files

2.9

2 release files

2.8

2 release files

2.7

2 release files

2.6

2 release files

2.5

2 release files

2.4

2 release files

2.3

2 release files

2.2

2 release files

2.1

2 release files

2.0

2 release files

1.20

2 release files

1.19

2 release files

1.18

2 release files

1.17

2 release files

1.16

2 release files

1.15

2 release files

1.14

2 release files

1.13

2 release files

1.12

2 release files

1.11

2 release files

1.10

2 release files

1.9

2 release files

1.8

2 release files

1.7

2 release files

1.6

2 release files

1.5

2 release files

1.4

2 release files

1.3

2 release files

1.2

2 release files

1.1

2 release files

1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page