Skip to content

Releases: awesome-town/canvas-mcp-node

v0.3.17 — Franklin-defaulted install screen

Choose a tag to compare

@jaymesdec jaymesdec released this 09 Jun 13:11

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.json continues 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_CONFIG environment variable on the server side; the install-screen picker is what's gone, not the underlying loader.

v0.3.14 — Franklin default page template

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 20:16

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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 20:04

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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 18:35

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 list
  • prerequisite_module_ids — modules that must complete first
  • require_sequential_progress — students complete items in order
  • unlock_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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 17:57

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 to create_page → creates a duplicate with -2 slug
Claude has to copy the new HTML onto the original page via edit_page_content
Original works, but a stray -2 lingers 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_roles are passed, behaves exactly as before (simple field update).
  • If any of template/slots/include_sections/omit_sections is 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 title is 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 pass title to 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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 17:42

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-3 from course 914.

It should call the new delete_page tool and remove it.

v0.3.9 — Franklin assessment template

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 17:16

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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 17:08

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:

  1. The path in the SCHOOL_CONFIG env var, if it points at a readable file.
  2. The bundled configs/franklin.json shipped inside the .mcpb.
  3. 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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 16:54

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.json which 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:

  1. Install the .mcpb (the Franklin preset will pre-fill).
  2. On the install dialog, replace the path with your own (file picker or paste).
  3. 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

Choose a tag to compare

@jaymesdec jaymesdec released this 23 May 16:48

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 section
  • omit_sections: ["assessment"] — turn off a default-include section

For the Franklin lesson template:

  • discussion is default-omit (not commonly used). The skill turns it on when the teacher mentions a discussion or debate.
  • assessment is 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_page is backward-compatible: passing just body (no slots) still works.

Upgrade

Download canvas-mcp-0.3.6.mcpb and double-click. Existing install dialog answers carry over.