Canvas MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CANVAS_BASE_URL | No | Canvas instance URL (defaults to https://fhict.instructure.com) | https://fhict.instructure.com |
| CANVAS_API_TOKEN | Yes | Your Canvas API token |
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": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list-coursesA | List all active courses for the authenticated user. Returns course name, ID, course code, and term for each course. |
| post-announcementB | Post an announcement to a specific course |
| list-studentsB | Get a complete list of all students enrolled in a specific course |
| list-assignmentsA | Get a list of all assignments in a course with submission status for students |
| get-assignmentA | Fetch metadata for a single assignment (due date, points, rubric, submission types, etc). |
| create-assignmentB | Create a new assignment in a course. All fields are optional except courseId. |
| update-assignmentB | Update an assignment. All fields are optional except courseId and assignmentId. |
| delete-assignmentA | Delete (archive) an assignment from a course. |
| list-assignment-groupsA | List all assignment groups (buckets) in a course. |
| create-assignment-groupB | Create a new assignment group (bucket) in a course. All fields optional except courseId. |
| bulk-update-assignment-datesA | Bulk update due/unlock/lock dates for assignments in a course. |
| list-modulesA | Return all modules in a course (optionally inline items). |
| list-module-itemsA | Given a module ID, list its items (pages, quizzes, files, etc). |
| toggle-module-publishA | Publish/unpublish a module (toggles the current published state). |
| create-moduleA | Create a new module in a course. |
| update-moduleC | Update an existing module's name, position, prerequisites, sequential progress, or published state. |
| delete-moduleA | Delete a module from a course. This is permanent and removes all module items. |
| get-module-itemA | Get details for a single module item. |
| create-module-itemA | Add a new item to a module. Type must be one of: File, Page, Discussion, Assignment, Quiz, SubHeader, ExternalUrl, ExternalTool. |
| update-module-itemA | Update an existing module item's title, position, indent, external URL, published state, completion requirement, or move it to another module. |
| delete-module-itemA | Remove an item from a module. |
| generate-styleguideA | Generate and save a Canvas styleguide page for a course with design standards, accessibility guidelines, and Canvas-specific formatting best practices. Creates the page at the given URL slug (default: canvas-styleguide). |
| get-styleguideA | Fetch the Canvas styleguide page for a course. Returns the page title, last-updated timestamp, and full HTML body. |
| list-pagesA | List all pages in a course. Returns title, URL slug, page ID, and published status for each page. |
| get-page-contentA | Get the full content of a page by URL slug. Returns title, URL slug, page ID, published status, last-updated timestamp, and HTML body. |
| update-page-contentA | Update or create a page with new content, replacing the entire body. If no body/title/editingRoles is provided, nothing is written and guidance is returned (set showStyleguidePreview to also inline the styleguide). For targeted edits to existing content, use patch-page-content instead. |
| list-page-revisionsA | List all revisions for a page. |
| revert-page-revisionA | Revert a page to a previous revision. |
| patch-page-contentA | Fetch a page's current HTML body and return it alongside edit instructions for the model to apply. Does not write to Canvas — follow up with apply-page-changes to persist the result. Optionally includes the course styleguide for formatting reference. For full replacement, use update-page-content instead. |
| apply-page-changesA | Write revised HTML content to a Canvas page. Accepts the full new body as newContent and saves it. Intended as the second step after patch-page-content. |
| list-sectionsA | List all sections in a course. Returns section name, ID, SIS ID, and optional date ranges. Set includeStudentCount to include enrollment totals per section. |
| list-section-submissionsA | Get all student submissions for a specific assignment filtered by section |
| list-assignment-submissionsB | Fetch every student's submission status & comments for an assignment. |
| grade-submissionC | Write back a score, grade, rubric points, or comment for a student's submission. |
| post-submission-commentA | Attach targeted feedback as a comment on a student's submission. |
| get-submission-documentsA | Retrieve a student's submission with attachment metadata and optional file downloads. Returns submission details, file information, and optionally the actual file content. |
| get-submission-file-infoA | Get detailed information about a specific file attached to a submission, including download URLs and metadata. |
| download-submission-fileA | Download the actual content of a file attached to a submission. Returns file content as base64 for binary files or as text for text files. |
| list-rubricsA | List all rubrics in a course. Returns rubric title, ID, and description for each rubric. |
| get-rubric-statisticsA | Get statistics for rubric assessments on an assignment |
| list-rubric-assessmentsB | List all rubric assessments for an assignment. |
| attach-rubric-to-assignmentB | Attach a rubric to an assignment. |
| list-quizzesB | Get a list of all quizzes in a course |
| get-quizA | Fetch metadata for a single quiz |
| create-quizB | Create a new quiz in a course. |
| update-quizC | Update an existing quiz in a course. |
| delete-quizB | Delete a quiz from a course. |
| list-quiz-questionsA | Get a list of all questions in a quiz |
| get-quiz-questionB | Fetch a single question from a quiz |
| create-quiz-questionA | Create a new question in a quiz. |
| update-quiz-questionC | Update an existing question in a quiz. |
| delete-quiz-questionB | Delete a question from a quiz. |
| list-quiz-question-groupsA | Get a list of all question groups in a quiz |
| get-quiz-question-groupA | Fetch a single question group from a quiz |
| create-quiz-question-groupA | Create a new question group in a quiz. |
| update-quiz-question-groupA | Update an existing question group in a quiz. |
| delete-quiz-question-groupA | Delete a question group from a quiz. |
| list-eportfoliosA | List all ePortfolios belonging to a user. Returns id, name, public flag, workflow state, and timestamps. |
| get-eportfolioA | Get details for a single ePortfolio by ID. |
| get-eportfolio-pagesA | List all pages in an ePortfolio. Returns id, position, name, content, and timestamps for each page. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| analyze-rubric-statistics | Analyze rubric statistics for formative assignments in a course |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 60 tools
Most tools clearly target distinct resources and actions, but there is some potential overlap between patch-page-content and update-page-content (targeted vs full replacement) and among get-submission-documents, get-submission-file-info, and download-submission-file. Descriptions generally help distinguish them.
All tool names follow a consistent lowercase hyphenated verb-noun pattern (e.g., list-pages, create-module, delete-quiz). This consistency makes it easy to predict tool behavior from the name alone.
With 60 tools, this exceeds the 50+ threshold for extreme mismatch per the calibration guide. Even for a broad LMS like Canvas, the surface is overwhelming and could benefit from splitting into focused servers by domain (e.g., quizzes, assignments, pages).
Core teaching workflows are well covered: assignments, quizzes, pages, modules, submissions, and grading. However, there are notable gaps: announcements only support post (no list/delete), eportfolios lack create/update/delete, and there is no discussion management or course settings beyond basic listing.