Canvas Ed MCP
Provides read-only access to Canvas, enabling listing of configured Canvas courses through MCP tools, with secure credential references, configurable HTTPS Canvas instances, and same-origin pagination guards.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Canvas Ed MCPWhat Canvas and Ed courses do I have configured?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CourseHarbor
CourseHarbor is a local desktop tool for students who use Canvas, Ed, or both. It downloads course material into folders you choose, creates weekly and semester due date reports, and provides read-only MCP access to configured courses.
0.2.0rc19 is the current GitHub prerelease. Download the reviewed artifacts from the
v0.2.0rc19 release.
The package is not published to PyPI. This release includes graphical token management,
the CourseHarbor App Shell, due-date views, sync-run reports, an audited Windows
portable bundle, and an audited arm64 macOS DMG. It also fixes a Windows UI Automation
cache defect that could freeze Courses when an older sync run was expanded. The DMG is
ad-hoc signed and not Apple-notarized.
What it does
The installed package provides:
a PySide6 first-run flow with masked Canvas/Ed token save-and-test, plus graphical course reconfiguration and native Windows, macOS, and Linux launchers;
incremental Canvas and Ed material sync with dry-run preview and no-clobber storage;
weekly TXT and semester Markdown due reports grouped in Sydney time;
separate profiles for different semesters, accounts, and output folders;
OS Keychain/Credential Manager references instead of tokens in configuration;
explicit Canvas↔Ed course mapping—matching names never select a course for you;
a read-only MCP server whose tools follow the providers enabled in the profile;
optional Gradescope due-date support, disabled until explicitly configured.
The portable sync orchestrator supports explicitly configured Canvas and Ed sources.
Interactive setup supports Canvas-only, Ed-only, and explicit Canvas+Ed mappings;
interactive reconfiguration retains existing sources by default and requires explicit
confirmation before detaching or adding a source. course-sync is a safe compatibility
command and does not download anything.
The historical write-capable server and personal scripts are not included in the
public source candidate, wheel, or sdist.
Related MCP server: canvas-mcp
1. Download and open the desktop app
Most users should download a desktop package from the v0.2.0rc19 release. No separate Python installation is required for these packages.
Windows 10/11 x86_64
Download
CourseHarbor-v0.2.0rc19-windows-x86_64-portable.zip.Extract the complete ZIP to a folder you intend to keep. Do not run the executable from inside the ZIP or move only one file out of the extracted folder.
Open
CourseHarbor.exe.
The Windows package is an unsigned portable app, not an installer. Windows may show an
unrecognized-app warning. Compare the download with SHA256SUMS before running it.
macOS on Apple silicon
Download
CourseHarbor-v0.2.0rc19-macos-arm64.dmg.Open the DMG and drag CourseHarbor into Applications.
Launch CourseHarbor from Applications.
Current limitation: before using this release, set macOS System Settings → Appearance to Light; Dark Mode is not yet supported.
This DMG supports Apple silicon (arm64) only. It is ad-hoc signed and not
Apple-notarized, so Gatekeeper acceptance is DEGRADED; verify SHA256SUMS before
opening it. Intel and universal builds remain NOT_RUN.
Python package installation, CLI/MCP use, and source builds are intentionally kept in the separate Python package and source-build section.
2. Configure Canvas and Ed API access
Get a Canvas API token
Sign in to your institution's Canvas website.
Open Account → Settings. The direct path is normally
https://<your-canvas-host>/profile/settings.Scroll to Approved Integrations and select New Access Token.
Enter a purpose such as
canvas-ed-mcp, choose the shortest practical expiry, and generate the token.Copy the value when Canvas displays it. Canvas does not show that value again.
For the University of Sydney, the API base URL requested by setup is
https://canvas.sydney.edu.au/api/v1. If New Access Token is unavailable, the
institution has disabled self-service tokens; contact its Canvas support team rather
than trying to bypass that policy. See Instructure's official
Canvas OAuth2: Manual Token Generation
guide.
Get an Ed API token
Sign in to the same Ed account that can open the courses you want to sync.
Open Settings → API Tokens in the region where that account is signed in.
Create a dedicated token for
canvas-ed-mcpand copy it once.
The Ed integration uses an unofficial, schema-sensitive API. Do not substitute a
browser cookie, SSO password, Canvas token, or copied browser request.
The Australian token page https://edstem.org/au/settings/api-tokens is the only
region-specific page verified for this project. Other Ed regions are NOT_RUN; use
the settings page reached from the signed-in account rather than guessing a hostname.
Save and verify tokens in the desktop setup
Open CourseHarbor. On first run, choose the providers you use, enter the Canvas API base URL when Canvas is enabled, and paste each token into its masked API token field. Choose Save and test. The app first checks that a secure native credential store is available, then performs one provider-isolated, read-only course-list request. Only a successful token is saved to the deterministic credential for that profile. The field is cleared when work starts; the token is never copied to the clipboard, config, state, command arguments, or UI status text.
Use Test existing after a restart or when diagnosing access. A blank replacement field keeps the existing credential. Replacing a value requires a confirmation naming the profile, provider, and local keyring target. A failed validation or cancellation before persistence leaves the old credential unchanged. If a later configuration save fails, the already verified keyring credential remains so setup can be retried.
env: credential references remain an advanced, externally managed and read-only
option for CLI/headless configuration. The application layer can test an existing
reference but cannot overwrite it; this first-run keyring UI does not create env:
references.
Terminal fallback for advanced users
Check the operating-system keyring before setup:
canvas-ed-mcp doctor --show-pathsThe following fallback remains available for headless or recovery workflows. Store only the providers you use; each command prompts for the value without placing it in command history or the configuration file:
python -m keyring set canvas-ed-mcp/default canvas
python -m keyring set canvas-ed-mcp/default edUse these references when the setup wizard asks for credentials:
keyring:canvas-ed-mcp/default/canvas
keyring:canvas-ed-mcp/default/edUse the same profile name in all three places. For example, profile semester-2
uses service canvas-ed-mcp/semester-2 and references
keyring:canvas-ed-mcp/semester-2/canvas and
keyring:canvas-ed-mcp/semester-2/ed. Never paste a token into TOML, a launcher, an
MCP host configuration, a screenshot, or a Git repository.
See Authentication for Canvas and Ed personal API tokens, revocation, OAuth boundaries, and headless environment references.
3. Finish first-run setup
After each enabled connection passes its read-only test, CourseHarbor discovers the
course catalogues and opens the reviewed setup flow. Canvas-only and Ed-only profiles
use Select → Folders → Review; Map appears only when both providers are enabled
and an explicit Canvas↔Ed relationship may be needed. Similar names never cause an
automatic pairing. Token fields are
masked and transient; configuration receives only deterministic references such as
keyring:canvas-ed-mcp/default/canvas. The final confirmation creates the new
configuration and any missing empty course folders—no course content, sync state,
credentials, or launchers. After that save
succeeds, the completion screen can explicitly install the daily-use shortcuts and
open either the daily dashboard or their folder. The first real sync remains a
separate confirmed action.
Library root selection is intentionally deferred to the Folders step. The root contains
course folders, Canvas Ed MCP Launchers, and due reports, so it is not only a launcher
directory. It must already exist before Review; setup does not silently create it. Each
new logical course can then use Browse… to select an existing direct
child. For example, choose Desktop as the Library root and select each existing Desktop
course folder independently. A selected folder is reused when it already exists; a
missing course folder is created when the reviewed configuration is saved. If a folder is outside the current root, change the root on
the same page and retry; no restart or repeated provider discovery is required. Existing
configured roots and course folders remain read-only because configuration never moves
files.
The setup table shows every discovered course and asks which ones to include. Choose
baseline_from_now to record the current state and download only later changes, or
import_all to download the selected existing material on the first real sync.
Review shows the exact local layout before Save configuration writes anything.
To add, remove, remap, or change course settings later, open Courses and choose the configuration action. The editor starts with the saved courses selected and shows the exact config diff before saving. Existing folder names are read-only in this release. A mapping can be changed only when that source has no sync history and its current course folder is absent or empty; otherwise the UI explains why it is locked. Saving never moves or deletes files and never starts a sync. Removing a source from configuration keeps its downloaded files and historical state.
4. Use the CourseHarbor App Shell
CourseHarbor opens First run when no profile exists, opens the only healthy profile directly, or shows Profile chooser when multiple profiles exist or one needs attention. Profile inspection is local-only and does not contact Canvas or Ed.
Library
Choose Preview course material to perform read-only discovery. Review the exact per-course and per-provider actions, expand any warning summary, then choose Apply reviewed changes. Preview never writes course content; Apply writes only the actions shown in that reviewed plan. The operation stays off the Qt event loop and exposes progress and cancellation.
Due dates
This week and Semester are independent views. Each has its own Load action, export folder, and explicit Export action, so loading a report does not write it and the two report types may use different destinations. Published reports are create-only: changed content receives a numbered revision rather than overwriting the previous file.
Courses
Expand a course to see retained sync runs, then expand a run to see every file added or updated and its exact local destination. This local report history contains no tokens or raw provider exception text. Course configuration is also opened from this area.
Connections
Use Test existing to diagnose the stored Canvas or Ed credential with a read-only,
provider-isolated request. To rotate a token, paste it into the masked Replacement
token field and choose Save and test. Leave the field blank to retain the current
credential. env: references are externally managed and cannot be replaced in the UI.
Health & About and local files
Health & About shows non-secret package, profile, path, and keyring readiness. Open local library opens the configured library root; each course folder already exists after setup. Closing the app during background work requests cooperative cancellation before provider sessions are released.
Use Switch profile to return to Profile chooser. Remove profile… archives only the selected profile config after targeted confirmation; it does not delete downloaded course files, native credentials, sync state, logs/cache, or revoke a remote token.
Optional daily-use shortcuts
Setup can create native shortcuts under <library root>/Canvas Ed MCP Launchers.
Existing user-edited shortcuts are never overwritten; a changed managed candidate is
written with a .new suffix for review.
Launcher | Result |
| Opens the CourseHarbor App Shell |
| Updates every configured course |
| Creates |
| Creates a teaching-week Markdown checklist |
| Opens graphical course reconfiguration |
| Shows package, profile, path, and keyring status |
| Opens the configured output folder |
Due reports are create-only: changed content receives a numbered revision instead of overwriting the previous report. Semester reports preserve checked boxes and notes attached to stable item markers.
5. Advanced CLI and MCP
The same functions are available as short CLI commands:
canvas-ed-mcp sync --profile default --dry-run
canvas-ed-mcp sync --profile default
canvas-ed-mcp setup --profile default --dry-run
canvas-ed-mcp due week --profile default
canvas-ed-mcp due semester --profile default
canvas-ed-mcp configure-gui --profile default
canvas-ed-mcp configure --profile default --dry-run
canvas-ed-mcp launchers install --profile default
canvas-ed-mcp open-course-folder --profile default
canvas-ed-app --profile defaultCanvas and Ed due dates work from the confirmed course mappings. Optional Gradescope and local Unit Outline inputs require exact mappings in schema-v2 configuration; the tool never guesses that similarly named courses or assessments are identical.
Launch the MCP server with:
canvas-ed-mcp serve --profile defaultUse the absolute installed executable in the MCP host with arguments
serve --profile default. Its tools are limited to the configured read-only surface:
server_statuscanvas_list_configured_courseswhen Canvas is enableded_list_configured_coursesanded_list_course_contentwhen Ed is enabledgradescope_list_coursesandgradescope_list_assignmentsonly after explicit Gradescope opt-in and optional dependency installation
Disabled providers resolve no credential and make no network request.
To preview one course instead of the whole profile:
canvas-ed-mcp sync --profile default --course LOGICAL_COURSE_KEY --dry-runRemoving --dry-run writes local state and course output. It never writes to Canvas
or Ed. course-sync is a compatibility placeholder; use canvas-ed-mcp sync.
6. Python package and source builds
This section is for developers, CLI/MCP users, and platforms without a frozen desktop package. It is not required for the Windows portable app or macOS DMG.
Install the reviewed wheel
Python 3.10–3.14 is supported. Download
canvas_ed_mcp-0.2.0rc19-py3-none-any.whl from the release, then create an isolated
environment and install the GUI extra:
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install .\canvas_ed_mcp-0.2.0rc19-py3-none-any.whl
.\.venv\Scripts\python.exe -m pip install "PySide6>=6.8,<7"
.\.venv\Scripts\courseharbor.exeOn macOS or Linux, use python3 -m venv .venv, then the equivalent
wheel and PySide6>=6.8,<7 install commands through ./.venv/bin/python.
The package is not published to PyPI.
Build and run from source
git clone https://github.com/LHYubiquitous/Canvas-Ed-CourseHarbor.git
cd Canvas-Ed-CourseHarbor
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[gui]"
.\.venv\Scripts\courseharbor.exeOn macOS or Linux, replace py with python3, then use ./.venv/bin/python and
./.venv/bin/courseharbor. For the locked contributor environment, install uv 0.11.28 and run:
uv sync --locked --all-extras --group dev
uv run --locked python -B ci/run_release_tests.py --root .The public release source is the audited clean-source archive, not the private development history. Packaging details and exact verification boundaries are in Testing and operations and Release/security audit.
Known limitations and privacy
Canvas course-wide Files access depends on instance permissions. Module-linked pages and files can still work when the broader Files endpoint returns
403.Ed integration uses an unofficial, schema-sensitive API and reports partial items when the response shape changes.
Gradescope due dates require the optional
gradescopeextra and explicit mapping.Native owner-device Linux keyring testing is still
NOT_RUN.Tokens belong in the OS keyring, not source control or MCP host configuration.
Course access does not grant redistribution rights for downloaded material.
Troubleshooting and updates
authentication_failedor HTTP401: replace the expired/revoked token in the keyring, then retry a dry run. Do not create a plaintext fallback.HTTP
403: the signed-in account or institution has denied that endpoint. A new token usually does not change the account's permissions.missing_keyringorunsafe_backend: runcanvas-ed-mcp doctor --show-pathsand fix the native keyring before making provider requests.A due report is not published when a required Canvas/Ed source has no complete snapshot. Restore provider access and run it again.
After upgrading the wheel, run
canvas-ed-mcp launchers install --profile defaultso generated launchers point to the reviewed environment.
Keep the previous wheel for rollback. Full install, update, rollback, headless Linux, and MCP host instructions are in Cross-platform installation.
Report software vulnerabilities through SECURITY.md.
Verification and release materials
The project runs synthetic tests across Windows, macOS, and Linux for Python 3.10–3.14. The release candidate also includes:
uv.lockand the standardpylock.tomldependency lock;sbom.cdx.json, a CycloneDX 1.5 software bill of materials;a fail-closed distribution and clean-source archive audit;
a local clean-install and installed MCP protocol smoke test.
Exact verification boundaries and remaining NOT_RUN device checks are documented in
Testing and operations and
Release/security audit.
Development
Read CONTRIBUTING.md before proposing changes. Tests use synthetic fixtures only:
python -B -m unittest discover -s tests -vDo not add live API calls to the default test suite.
Chinese documentation
完整中文安装、API token 获取、首次配置、日常使用、MCP 与故障排查说明见 简体中文 README。
Attribution and license
This fork is based on r1ckyIn/canvas-ed-mcp, originally created by Ricky. The project remains licensed under the MIT License; see LICENSE. That license applies to the software, not to course content or third-party platform data.
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP for Google Workspace, Atlassian and Notion: one OAuth, per-user accounts, write access.
One MCP endpoint for your company's tools, with per-person sign-in, policy and audit.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Read-only MCP for AI usage profiles, leaderboards, stats, and docs; no writes or private data.
Related MCP Servers
- AlicenseAqualityAmaintenanceRead-only MCP server for Canvas LMS that exposes tools to list courses, assignments, grades, submissions, syllabi, announcements, modules, pages, and files, without any write operations.1130 npm1MIT
- FlicenseAqualityCmaintenanceEnables MCP-compatible clients to read courses, assignments, announcements, files, and grades from a Canvas LMS instance.10-
- AlicenseNot gradedqualityBmaintenanceEnables read-only access to University of Waterloo Learn and Piazza, allowing users to view courses, assignments, grades, submissions, discussions, and more through an MCP server.MIT
- AlicenseAqualityCmaintenanceEnables MCP-compatible assistants to read Canvas course information—including courses, assignments, syllabi, modules, pages, and announcements—through a local read-only server.10MIT