canvas-teacher-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CANVAS_LMS_ROOT | No | The root directory for the Canvas LMS working tree. If not set, the setup tool will ask. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_docA | Read a workflow document, e.g.
|
| setupA | Set this install up, one step per call. Relay the answer to the instructor. Call with no arguments to see where things stand. Pass |
| list_coursesB | Every course slug registered in the course root. |
| get_courseB | A course's coordinates: Canvas id, base url, school, GitHub org, output paths. Never returns a secret — |
| list_studentsC | Active students: id, name, email. |
| extract_linksC | Every link in a block of Canvas HTML, classified by kind. |
| list_pagesA | Every page in the course: title, url slug, published state. |
| get_pageC | One page, body included. |
| create_pageC | Create a page, unpublished. |
| update_pageA | Update a page's title and/or body. Publish state is left alone. |
| list_modulesC | Every module: id, name, position, published state. |
| get_moduleD | One module. |
| create_moduleC | Create a module, unpublished. |
| list_module_itemsC | What is inside a module, in order. |
| add_module_itemB | Add an item to a module, unpublished.
|
| list_assignmentsB | Every assignment: id, name, points, due date, published state. |
| get_assignmentC | One assignment, description included. |
| create_assignmentB | Create an assignment, unpublished. |
| update_assignmentC | Update an assignment. Publish state is left alone. |
| set_due_datesC | Set one due date on several assignments. |
| needs_gradingC | Assignments with submissions waiting to be graded. |
| list_assignment_groupsD | Assignment groups and their weights. |
| get_quizD | One quiz: title, description, question count, points. |
| list_quiz_questionsB | Every question on a quiz: id, name, type, points. |
| create_quizA | Create an empty quiz, unpublished. |
| add_quiz_questionsA | Add or update questions. A question already carrying the same Each question is |
| finalize_quizA | Rewrite the description summary and refresh the quiz's stale counts. Canvas leaves |
| preview_announcementA | Render what would be sent, and say how to send it. Sends nothing. |
| send_announcementB | Post an announcement. Requires |
| list_submissionsC | Who submitted what: user id, submitted_at, current score, attempt count. |
| get_submissionA | One submission in full, body and attachments included. |
| classify_submissionsB | Split the submissions into graded / resubmitted / new / not submitted. |
| get_rubricB | The assignment's Canvas rubric object, when it has one. The rubric a student was shown outranks this — an assignment page carries its own table. |
| build_coding_assignment_pageA | Build the Canvas page for a programming assignment whose starter repo is on GitHub.
Returns the rendered HTML; with |
| build_notebook_assignment_pageA | Build the Canvas page for a Colab/Jupyter notebook assignment.
|
| build_rich_docA | Build a formatted Google Doc — banners, section boxes, callouts, coloured code blocks.
Needs the |
| read_assignment_instructionsA | The assignment as the STUDENT saw it — description, rubric, due date, attachments. Grading is against what the student read, so this comes before any scoring. |
| propose_rubricC | The rubric the engine reads for this assignment, for the instructor to approve. Priority is the instruction sheet first, then the Canvas rubric object, then the default — a proposal, never an applied decision. |
| run_stage_aA | Run Stage A: collect every submission, score what a machine can, and save the artifacts. Returns the engine's result — per-student scores and the evidence it surfaced. It posts nothing and it writes no comment; the wording is Stage B's, done in conversation, and the post is a separate authorised step. |
| post_gradesA | Write the rendered grades and comments to Canvas. Its own step, asked for on its own.
A post aborts when any evidence the engine surfaced was never read. |
| agenda-wrapupA | GLOBAL — generate the weekly Agenda (week start) and Wrap-up (week end) Canvas pages for a module, from the same module data. Config-driven per course (course_slug -> course_config). Triggers: 'week N agenda', 'wrap-up for week N', 'update the agenda', 'make the week 3 agenda/wrapup'. |
| assignment-page-builderA | GLOBAL methodology for building a Canvas ASSIGNMENT/LAB page from the universal skeleton |
| create-announcementA | GLOBAL, config-driven — generate a weekly Canvas announcement from a module's contents for ANY course. Use when the user says make/write the weekly announcement, week N announcement, or announce this week. Reads the module, summarizes what to read/watch/do/submit, lists graded items with due dates, and closes warmly. Course coordinates come from course_config.load() (course_id, school, token) — nothing hardcoded. PREVIEW-first; sends emails only on the instructor's explicit go. Invoke with the course_slug + week or module id. |
| git-asmtA | GLOBAL L1 ENTRY POINT (dispatcher) for creating a GitHub coding assignment end-to-end. Routes to two children: git-asmt-repo (build the solution/tests + prove 100/100 + ship the Starter + register in the org-hub) and git-asmt-page (build the Canvas assignment page via git_page). Language-agnostic; the language mechanics are L2 (git-asmt-repo/languages/*) and the course coordinates are the L3 course wrapper (config). Use when the user says 'make/build/create assignment ' — this decides repo-first then page. |
| git-asmt-pageA | GLOBAL L1 child of git-asmt — build the Canvas ASSIGNMENT PAGE for a git coding assignment via the global git_page (assignment-page-builder). Your job = fill the asmt dict well (gist, spec, I/O = function contract, examples call→output, restrictions, elaboration, test-items table, per-item points/rubric, per-item guide, function prototype+params) → git_page(course_slug, asmt). Language-agnostic; which fields to use (stdin-program vs function) comes from the L3 course wrapper's curriculum. Use to make/renew any git-assignment Canvas page. Canvas side ONLY — the repo is git-asmt-repo. |
| git-asmt-repoA | GLOBAL, language-agnostic L1 abstract for building + testing a GitHub coding-assignment repo through the org-hub autograder. Owns the WHAT (audit → instruction-fidelity harness → prove 100/100 → ship the Starter → gates) with NO language mechanics. The HOW-to-compile/run/assert is delegated to an L2 language skill (git-asmt-repo/languages/*), and the course coordinates come from an L3 course wrapper (config). Use as the shared core every course's git build/test wrapper points to. NEVER re-implement this per course. |
| gradeA | GLOBAL step-by-step grading skill. The ONE ordered procedure for grading ANY course's Canvas assignment OR quiz/exam through the shared grade engine — Stage A (engine, no post) → Stage B (AI review in chat) → report → pre-post self-challenge → POST (instructor go + post-gate). Bundles the canonical policy (GRADING.md — Part D is the quiz/exam half), the flow (skills/grade/SKILL.md), the layer map (CourseGlobalWorkflow/README.md), and the engine contracts (GradingEngine/*) into one sequential runbook, and ships the runnable Stage-A driver |
| grade-git-programA | Grading SUB-SKILL for git-program assignments AND git-program quiz questions (the M-series coding items) — the type-specific plug-in of the global |
| grade-nbA | NB (Colab / Jupyter notebook) grading SUB-SKILL — the type-specific plug-in for the global |
| gslides-formatD | The gslides-format skill document. |
| gws-docA | Read and format Google Docs using gws CLI. Use when reading a Google Doc's content, or creating/reformatting a Google Doc with proper heading styles, bold text, or structured content. |
| gws-richdocA | Create a rich-format Google Doc (banner, color section boxes, navy step badges, tip/info/warning callouts, dark syntax-colored code blocks, bullets) DETERMINISTICALLY via the fixed generator build.py. Use when the user asks for a "gws-richdoc / rich-gdoc" doc or a polished, visually-structured Google Doc. ALWAYS run build.py — never hand-author the HTML (that is what made every session look different). |
| module-overview-pageA | GLOBAL, config-driven — build a module OVERVIEW page (the representative page at the top of a Canvas module): 📌 Overview (the plan) + an optional slide embed + FLEXIBLE SECTION BLOCKS grouping that module's items (readings/videos/quizzes/assignments) as a roadmap. Categories are DATA — add/remove freely per course, no fixed columns, no wrappers needed. Renderer = module_overview.py (coords from course_config.load()). For per-slide breakdowns it uses the slide-plan skill. Triggers: 'module overview page', 'make the overview/representative page for module N', '대표 페이지'. |
| nb-homework-createA | Create/prepare an NB (Colab / Jupyter) homework TEMPLATE so it can be graded cleanly by the |
| publisher-bank-quizA | GLOBAL — turn a publisher's plain-text question bank (Liang/Pearson test bank, one chapter per file) into a Canvas CLASSIC quiz. Parses the bank into quiz_builder's question JSON, renders a preview HTML for review, then delegates the Canvas write to quiz-builder. Multiple-choice and multiple-answer items; per-question points are an input. Use when the user has a chapter test-bank .txt (or .docx text) and wants it as a Canvas quiz. Triggers: 'publisher bank', 'test bank', 'chapter N quiz from the bank', '뱅크로 퀴즈'. |
| quiz-builderA | GLOBAL methodology for building/updating a Canvas CLASSIC quiz — its question items + the description summary. Create a quiz from nothing OR modify an existing one. Dispatches question items by type (native MCQ/T-F/essay/fill-in via the Quizzes API; a git-program question defers to the course-local git-homework). All Canvas quiz API calls go through the co-located quiz_builder.py — never hand-rolled. Use when making/updating any Canvas quiz's questions or details. |
| readytogoA | Generic session orientation. Loads account + course global rules and detects the active course from the current working directory. For project-specific orientation, run from inside a project dir — the per-course readytogo.md takes precedence over this one. |
| slide-planA | GLOBAL sub-skill of module-overview-page — turn a multi-slide module into one SECTION per slide: 'this slide covers X → do these assignments/labs based on it', with the slide deck embedded in that section. Returns section tuples that module-overview-page's make_page consumes. Use when a module has SEVERAL slide decks and you want each slide's content summarized next to the tasks derived from it. Triggers: 'slide plan', 'per-slide breakdown', 'slide N covers … do …'. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Canvas-LMS-MCP/canvas-teacher-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server