Repository navigation
Releases: awesome-town/canvas-mcp-node
Release list
v0.3.17 — Franklin-defaulted install screen
What changed
Install-screen tweaks aimed at Franklin colleagues:
- Canvas URL now pre-fills with
https://franklinjc.instructure.com. No more pasting the URL by hand. - School config (file picker) field has been removed entirely. The bundled
configs/franklin.jsoncontinues to load automatically at startup, so Franklin's competency framework and page templates Just Work with no setup.
Net result: the only field a teacher actually has to fill in is the Canvas access token.
Upgrade
Download canvas-mcp-0.3.17.mcpb below and double-click to install in Claude Desktop. Restart Claude Desktop after install.
If you previously had a custom school config file selected, that selection is gone — but the server falls back to the bundled Franklin preset, so for Franklin users this is what you wanted anyway.
Compatibility
- No tool signature changes.
- No schema changes.
- All 172 tests pass.
- Other schools deploying this build can still override the bundled Franklin preset by setting the
SCHOOL_CONFIGenvironment variable on the server side; the install-screen picker is what's gone, not the underlying loader.
v0.3.14 — Franklin default page template
What changed
The default page template in configs/franklin.json now wears the real Franklin chrome — same banner + school logo + course nav strip as the lesson, assessment, and module_outcomes templates — followed by a freeform body for whatever content you pass.
Used automatically when create_page is called without an explicit template argument. Good for:
- Exit ticket pages
- Short reflection or recap pages
- Announcement-style pages
- Ad-hoc resource pages that don't fit lesson/assessment/module_outcomes
Previously this template had a TODO(franklin) stub. Anyone using create_page on Franklin's bundled config will now get the real institutional layout by default.
Upgrade
Download canvas-mcp-0.3.14.mcpb below and double-click to install in Claude Desktop.
No config changes needed. Restart Claude Desktop after install.
Compatibility
- Other schools' configs are unaffected (no schema changes).
- No new tools.
- No tool signature changes.
- All 172 tests pass.
v0.3.13 — rubric create + association tools
Two new MCP tools to unblock the upcoming setup-rubric skill:
New tools
create_rubric(course_identifier, title, criteria, free_form_criterion_comments?, associate_with?)
Create a new Canvas rubric in a course. Criteria is a structured array — each criterion has a description + ratings (typically 4: Excellent/Proficient/Developing/Beginning). Optionally attaches the new rubric to an Assignment/Quiz/Discussion in the same API call via associate_with (saves a round-trip vs. creating then associating separately).
Bypasses the course-code cache (write path).
create_rubric_association(course_identifier, rubric_id, association_type, association_id, use_for_grading?, hide_score_total?)
Attach an existing rubric to a different Assignment/Quiz/Discussion. The primary use case: reusing a "Lab Report Rubric" across multiple lab assignments throughout the year. Returns the new association.
Bypasses the course-code cache (write path).
Why these matter
The MCP could read rubrics (list_all_rubrics, get_rubric_details) but couldn't create them or attach them — a real gap given how often rubrics get reused. The upcoming setup-rubric skill is reuse-first: it surfaces existing rubrics in a course and offers to attach one to the assessment, falling back to creating a new rubric when nothing fits. Both new tools support that workflow.
Compatibility
- 172 tests passing (5 new — covering nested form-encoded criteria/ratings serialization, both Assignment/Quiz/Discussion association types, and the create+associate-in-one-call path).
- No tool signatures changed for existing rubric tools.
Upgrade
Download canvas-mcp-0.3.13.mcpb and double-click. Existing install dialog answers carry over.
v0.3.12 — create_module + module_outcomes template
MCP support for the upcoming plan-module skill. Two additions:
New tool: create_module
create_module(course_identifier, name, position?, prerequisite_module_ids?, require_sequential_progress?, unlock_at?)
POST /api/v1/courses/:id/modules. Created in Canvas's default state: unpublished. The tool exposes NO publish-related parameter — teacher publishes the module manually after reviewing per the never-auto-publish policy.
Optional knobs match the Canvas API:
position— 1-based slot in the course's module listprerequisite_module_ids— modules that must complete firstrequire_sequential_progress— students complete items in orderunlock_at— ISO-8601 timestamp when the module unlocks for students
Bypasses the course-code cache (write path).
New template: module_outcomes
configs/franklin.json → pageTemplates.module_outcomes. Used by plan-module to draft the Module Outcomes page that opens each module.
- Banner with
{{course_name}}and{{title}} - Franklin school logo
- Standard course nav strip (Start Here / Syllabus / Modules / More Resources)
- One required slot:
outcomes— ordered-list<li>items, 4-8 typical, each starting with an action verb
Compatibility
- 167 tests passing (3 new).
- No breaking changes.
What's next
The plan-module skill in canvas-mcp-skills uses this release. Coming next once this lands.
Upgrade
Download canvas-mcp-0.3.12.mcpb and double-click. Existing install dialog answers carry over.
v0.3.11 — edit_page_content applies templates
edit_page_content now applies templates. Closes the workflow gap from v0.3.10 testing — Claude no longer has to choose between "use create_page (which makes a duplicate) or use edit_page_content (which doesn't know about templates)."
What's new
edit_page_content gains template machinery
The tool now has two modes:
Mode 1 — Simple field update (existing behavior):
edit_page_content(course_identifier, page_url, title?, body?, editing_roles?)
Pass any of title/body/editing_roles; only those fields are replaced.
Mode 2 — Re-apply template (new):
edit_page_content(
course_identifier, page_url,
template?, slots?, include_sections?, omit_sections?,
title?, editing_roles?
)
Same machinery as create_page: the body is rebuilt from the template with the provided slots and section overrides, then PUT to the same page. No duplicate created.
"Add the discussion accordion to that lesson" — finally works
Before this release, the workflow was painful:
Claude tries to use
edit_page_content→ no template support
Claude falls back tocreate_page→ creates a duplicate with-2slug
Claude has to copy the new HTML onto the original page viaedit_page_content
Original works, but a stray-2lingers in the pages list
Now:
edit_page_content(
course_identifier: "DSGN_9_120251",
page_url: "the-water-cycle",
template: "lesson",
include_sections: ["discussion"],
slots: { about: "...", to: "...", concepts: "...", ..., discussion: "<p>What's a watershed?</p>" }
)
One call. No duplicate. Page is updated in place.
Behavior details
- If only
title/body/editing_rolesare passed, behaves exactly as before (simple field update). - If any of
template/slots/include_sections/omit_sectionsis passed, template machinery engages. - Passing
template: "none"explicitly opts out of template mode even when slots are also passed. - When template mode is engaged and
titleis not provided, the MCP fetches the current page title to fill the{{title}}token — but does NOT overwrite the Canvas title field. The caller has to passtitleto actually change the page's title. - Caller must provide ALL slots they want in the result. The MCP does NOT preserve previous slot content from the on-Canvas HTML.
Tool description steers Claude toward the right choice
create_page description now leads with: "For changes to an existing page (adding a section, swapping content, etc.), use edit_page_content instead — create_page on an existing title creates a duplicate with a -2/-3 slug." Should help avoid the duplicate-page workflow we saw in v0.3.10 testing.
Compatibility
- 165 tests passing (4 new for edit_page_content template machinery).
- No breaking changes — old calls to edit_page_content with only title/body/editing_roles still work identically.
Upgrade
Download canvas-mcp-0.3.11.mcpb and double-click. Existing install dialog answers carry over.
v0.3.10 — add_module_item + execute_typescript fixes; delete_page
Three production bugs from real-world testing. Recommended upgrade — both bugs blocked legitimate workflows.
Bug fixes
add_module_item for Page items (BROKEN → fixed)
The tool was sending module_item[content_id] for every type, but Canvas requires module_item[page_url] for Page items and module_item[external_url] for ExternalUrl items. Pages couldn't be added to modules — Canvas returned 400 — missing page_url parameter every time.
The tool now routes content_id to the right Canvas field based on type:
- Page →
page_url(pass the slug, e.g.,"the-water-cycle-2") - ExternalUrl →
external_url(pass the full URL) - Assignment / Quiz / Discussion →
content_id(pass the numeric Canvas id) - SubHeader → no content reference
Also adds Discussion and ExternalUrl to the supported-types enum.
execute_typescript "Cannot find package 'tsx'" (BROKEN → fixed)
Claude Desktop launches the MCP with CWD=/. The worker thread's --import tsx/esm was resolving the package via Node's default lookup, which starts from CWD — so Node looked for node_modules/tsx under /, found nothing, and failed with Cannot find package 'tsx' imported from /.
The MCP now resolves tsx/esm to an absolute file URL at server startup (via createRequire(import.meta.url).resolve('tsx/esm')), which walks up from the MCP's own location and finds the bundled tsx reliably. The Worker receives that absolute URL via execArgv, completely sidestepping CWD-based package resolution.
Verified by JSON-RPC test from CWD=/: execute_typescript now returns ✅ Execution completed in 49ms.
New tool
delete_page(course_identifier, page_url)
Permanently delete a Canvas wiki page. Bypasses the course-code cache so a rename mid-session can't misroute the delete. Useful for cleaning up orphan/test/duplicate pages — e.g., if create_page produced a -2 / -3 collision and you want to clean up the stray.
Tests
- 161 tests passing (up from 157).
- New coverage: add_module_item routes for Page / Assignment / ExternalUrl; delete_page issues DELETE against the encoded slug; delete_page handles weird slug names.
- End-to-end smoke test: server launched from CWD=
/, ran execute_typescript over JSON-RPC, got correct response — proving the tsx fix works in the real Claude Desktop launch scenario.
Upgrade
Download canvas-mcp-0.3.10.mcpb and double-click. Existing install dialog answers carry over.
Cleanup the orphan from your last test
You mentioned the-water-cycle-3 was orphaned. After upgrading, ask Claude:
Delete the page
the-water-cycle-3from course 914.
It should call the new delete_page tool and remove it.
v0.3.9 — Franklin assessment template
The Franklin assessment page template is now in the bundle.
What's new
configs/franklin.json → pageTemplates.assessment ships with the real Franklin assessment template HTML. All 6 sections are required (no optional toggling):
| Slot | Section |
|---|---|
description |
Top "Assessment Description" — intro + steps |
pre_work |
"Pre-Work" — what students should have completed before the assessment |
structure_and_grading |
"Structure and Grading" — structure description + grade weighting + grade boundaries table |
submission |
"Submission" — how students submit |
time |
"Time" — standard + extended-time accommodations |
ai_use |
"Use of Artificial Intelligence" — acceptable + unacceptable lists |
Banner uses {{course_name}} + {{title}}. Nav strip uses {{course_url}}. Logo stays course-413 (your stable design-tools course).
Design choice: grade boundaries table
The 11-row letter-grade table (A+ through F) lives inside the structure_and_grading slot content, not the template HTML itself. The planning skill we'll build later generates the table with point ranges appropriate to each assessment's total points. This keeps the template flexible across different point totals; we can extract the table to a dedicated slot later if it turns out skills produce inconsistent tables in practice.
Testing
list_page_templates should now show both lesson and assessment with their slot lists. The end-to-end test in tests/tools/pages.test.ts validates that the real Franklin assessment template parses, applies, and renders all 6 sections + per-course tokens correctly.
157 tests passing (1 new).
Upgrade
Download canvas-mcp-0.3.9.mcpb and double-click. Existing install dialog answers carry over.
Still placeholder
configs/franklin.json → pageTemplates.default (the generic header-only template) is still placeholder HTML. Lower priority since most pages route through lesson or assessment; we'll get to it later.
v0.3.8 — fix: Franklin preset now loads automatically
Bugfix. v0.3.7 tried to default the school-config field to ${__dirname}/configs/franklin.json so Franklin teachers would get the preset automatically. Turns out Claude Desktop doesn't substitute ${__dirname} inside user_config defaults — the env var got the literal unsubstituted string, the path didn't resolve, and the MCP launched in generic mode (no competencies, no page templates).
Fix: the server now resolves the bundled configs/franklin.json itself, relative to its own install location. It always works regardless of what Claude Desktop does with the user_config field.
How it works now
The server tries these in order:
- The path in the
SCHOOL_CONFIGenv var, if it points at a readable file. - The bundled
configs/franklin.jsonshipped inside the .mcpb. - No config (generic mode).
For Franklin teachers: leave the school-config field blank. The server finds the bundled Franklin preset automatically.
For other schools: pick your own JSON file in the install dialog. If you ever delete or move that file, the server quietly falls back to the bundled preset.
The install dialog field has been updated to make this clear — title is now "School config (other schools only — leave blank for Franklin defaults)".
Verification
Smoke-tested the staged bundle:
- No env:
[canvas-mcp] loaded school config: Franklin School (Jersey City, NJ) - Broken env path:
SCHOOL_CONFIG="${__dirname}/configs/franklin.json" did not resolve to a readable file; falling back to the bundled Franklin preset.followed by the success line.
In Claude Desktop, you should be able to ask list_page_templates and see lesson (with its 7 slots and 2 sections) plus default and assessment. The water-cycle example from before should now actually wrap in the Franklin lesson template.
Compatibility
- 156 tests still passing.
- No tool signatures changed.
v0.3.7 — school_config pre-filled with Franklin preset
Install-dialog tweak. Recommended upgrade.
What changed
- School config field now defaults to the bundled Franklin preset. Franklin teachers just hit Next; the field is pre-filled with
${__dirname}/configs/franklin.jsonwhich resolves to the path inside the installed .mcpb. The Franklin TD Competencies AND the lesson page template both load automatically on install. - School config description updated to mention institutional page templates, not just the competency framework. The school config now drives both pieces of school-specific behavior; the prompt copy now reflects that.
- Field is no longer marked "(optional)" in the title — it's pre-filled with a working default, so leaving it as-is is the right move.
For other schools
The field still accepts any JSON path. To use your own school config:
- Install the .mcpb (the Franklin preset will pre-fill).
- On the install dialog, replace the path with your own (file picker or paste).
- To run with NO school config at all, clear the field.
Compatibility
- No tool signatures or behavior changed.
- 156 tests still passing.
v0.3.6 — Franklin lesson template + slots/sections mechanism
The Franklin lesson template is now built into the .mcpb, complete with multi-slot content holes and optional accordion sections. Plus a new include_sections / omit_sections mechanism for handling per-lesson variation (discussion forums, assessment links, etc.) without asking the teacher every time.
What's new
Multi-slot templates
Templates can now declare named content holes via {{slot:NAME}} tokens. The Franklin lesson template uses 7 slots: about, to, concepts, resources, tasks, discussion, assessment. Call create_page with slots: { about: "...", concepts: "...", ... } and the server merges them into the template's accordion structure.
Optional sections with sensible defaults
Wrap optional accordion blocks in <!-- SECTION:name -->...<!-- /SECTION:name --> markers. Each section gets a default: "include" or default: "omit" state in the school config. Per-call overrides:
include_sections: ["discussion"]— turn on a default-omit sectionomit_sections: ["assessment"]— turn off a default-include section
For the Franklin lesson template:
discussionis default-omit (not commonly used). The skill turns it on when the teacher mentions a discussion or debate.assessmentis default-include (most lessons link to a graded task). The skill turns it off for purely formative lessons.
Per-course tokens
Templates can reference {{course_name}}, {{course_id}}, {{course_url}} — the server fills these in per page creation. The Franklin lesson template's nav strip uses {{course_url}} so the same template works in every course without re-uploading.
Real Franklin lesson template baked in
configs/franklin.json → pageTemplates.lesson now contains the actual Franklin lesson template HTML (banner with course name + page title, school logo from course 413, nav strip, the two "students will learn about/to" blocks, and the 5 accordion panels). Replaces the placeholder TODO HTML from v0.3.5.
The default and assessment templates in franklin.json still ship with placeholder HTML — paste real templates next.
list_page_templates surfaces slot + section metadata
list_page_templates now returns each template's slot list (names + descriptions) and section list (names + descriptions + default include/omit). Lets skills know what to fill in and which sections might need toggling, all without seeing the full HTML.
Compatibility
- 31 tools unchanged.
- 156 tests passing (16 new).
create_pageis backward-compatible: passing justbody(noslots) still works.
Upgrade
Download canvas-mcp-0.3.6.mcpb and double-click. Existing install dialog answers carry over.