MCP Documentation
Canvas LMS

Tools

Reference for the 17 tools exposed by the Canvas LMS MCP server.

15 curated tools plus a 2-tool gateway, grouped the way the server registers them: Orientation, Student, Content, Discussions, Gateway. Endpoint mappings are verified against the catalog extracted from canvas.nus.edu.sg.

Three tools write to Canvas

submit_assignment, post_discussion_reply, and canvas_request (when called with a method other than GET) change real data the moment they're called — recorded against a deadline, posted publicly under your name, or whatever the endpoint does. None of them can be undone from here. Each is marked below with the same warning where it appears.

Every write tool carries readOnlyHint=false, destructiveHint=true, idempotentHint=false in its MCP tool annotations, and states its concrete effect in the first sentence of its description — the client's own per-tool approval prompt is the only checkpoint before a write happens, so that prompt has to be readable on its own.

Orientation

Two tools for finding out who the token belongs to and what it can see.

whoami

Identifies the Canvas account this server is authenticated as, including the user's name and their role in each course (student, ta, teacher, designer, observer). Call this first when you need to know what the user can access. The result is cached for the process lifetime.

No parameters.

Endpoints: GET /v1/users/{id} (id=self), GET /v1/users/{user_id}/enrollments (user_id=self)

my_courses

Lists the user's Canvas courses with course code, term, and their role in each. Use this to resolve a course name or code to the course_id that other tools require.

ParameterTypeDefaultDescription
statestring"active"Enrollment state: active, completed, or invited

Endpoint: GET /v1/courses

Student

The daily driver — deadlines, grades, assignments, and submissions.

whats_due

Lists what's due for the user across all courses — assignments, quizzes, and scheduled events — sorted soonest first. This is the primary tool for "what's due this week", "what do I have coming up", and deadline planning. It merges multiple sources and de-duplicates, because that's what the question means.

ParameterTypeDefaultDescription
daysinteger14Horizon in days to describe in the result

Endpoints: GET /v1/users/self/todo, GET /v1/users/self/upcoming_events, GET /v1/planner/items

my_grades

Reports the user's current grade and score in each course, or in one course if course_id is given. Use this for "how am I doing" and standing questions.

ParameterTypeDefaultDescription
course_idinteger, optionalnoneLimit to one course; omit for all

Endpoint: GET /v1/courses/{course_id}/enrollments

list_assignments

Lists a course's assignments with due dates, points, and whether the user has submitted each one. Use bucket to filter to upcoming, overdue, unsubmitted, or past work.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id, from my_courses
bucketstring, optionalnoneOne of: past, overdue, undated, ungraded, unsubmitted, upcoming, future

Endpoint: GET /v1/courses/{course_id}/assignments

get_assignment

Gets one assignment in full: instructions, due and lock dates, points, accepted submission types, rubric, and the user's current submission state.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
assignment_idintegerrequiredAssignment id

Endpoint: GET /v1/courses/{course_id}/assignments/{id}

my_submission

Gets the user's own submission for an assignment: state, score, grade, lateness, instructor comments, and rubric assessment.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
assignment_idintegerrequiredAssignment id

Endpoint: GET /v1/courses/{course_id}/assignments/{assignment_id}/submissions/{user_id} (user_id=self)

submit_assignment ✏️

Writes to Canvas

Submits work to Canvas for an assignment. This is recorded against the deadline immediately, is visible to the instructor, and cannot be undone from here. Confirm the assignment and content with the user before calling. submission_type must be one the assignment allows — check accepted formats with get_assignment first.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
assignment_idintegerrequiredAssignment id
submission_typestringrequiredOne of: online_text_entry, online_url, online_upload
bodystring, optionalnoneText content — required for online_text_entry
urlstring, optionalnoneURL — required for online_url
file_idslist of integers, optionalnoneCanvas file ids, already uploaded — required for online_upload

A mismatch between submission_type and the field it requires is rejected before anything is sent, and an unrecognised submission_type is rejected the same way.

Endpoint: POST /v1/courses/{course_id}/assignments/{assignment_id}/submissions

course_announcements

Lists recent course announcements across all active courses, or one course if course_id is given.

ParameterTypeDefaultDescription
course_idinteger, optionalnoneLimit to one course; omit for all
daysinteger14How many days back to look

Endpoint: GET /v1/announcements

Content

Course structure, files, and pages.

course_content

Maps a course's structure: its modules in order, and the items inside each (files, pages, assignments, quizzes, links). Use this to find what material exists before fetching any of it.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id, from my_courses

Endpoint: GET /v1/courses/{course_id}/modules (with module items included)

list_files

Lists files in a course — lecture slides, notes, readings — with name, type, and size. Pass search to filter by filename. Use read_file to get the text of one.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
searchstring, optionalnoneFilter by filename fragment

Endpoint: GET /v1/courses/{course_id}/files

read_file

Downloads a Canvas file and returns its text. Supports PDF, DOCX, PPTX, and plain text. Get file ids from list_files or course_content. Long files are truncated to max_chars, with the truncation reported explicitly rather than silently returning partial text.

ParameterTypeDefaultDescription
file_idintegerrequiredCanvas file id, from list_files
max_charsinteger50000Truncate extracted text to this length

Endpoint: GET /v1/files/{id}, followed by a download of the file content and text extraction. A file type with no extractor (e.g. an image) is reported as a structured error rather than returned as unusable bytes.

get_page

Gets the content of a Canvas page in a course, such as a syllabus or a weekly overview. page_url is the page's slug, available from course_content.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
page_urlstringrequiredPage slug, e.g. syllabus or week-1-overview

Endpoint: GET /v1/courses/{course_id}/pages/{url_or_id}

Discussions

read_discussion

Reads course discussions. With only course_id, lists the discussion topics. With topic_id, returns that topic and all its replies flattened in order, with a depth field showing nesting.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
topic_idinteger, optionalnoneTopic id; omit to list topics

Endpoints: GET /v1/courses/{course_id}/discussion_topics, GET /v1/courses/{course_id}/discussion_topics/{topic_id}/view

post_discussion_reply ✏️

Writes to Canvas

Posts a public reply to a course discussion. The post appears immediately under the user's name and is visible to the whole class and the instructor. It cannot be deleted from here. Show the user the exact text and get their confirmation before calling.

ParameterTypeDefaultDescription
course_idintegerrequiredCourse id
topic_idintegerrequiredDiscussion topic id
messagestringrequiredThe reply text; HTML is allowed
parent_entry_idinteger, optionalnoneReply to this entry instead of the topic

An empty or whitespace-only message is rejected before anything is sent.

Endpoint: POST /v1/courses/{course_id}/discussion_topics/{topic_id}/entries

Gateway

The two tools that make the other 1,099 endpoints reachable without a dedicated tool for each one. Together they give the server complete API reach at 17 tool schemas.

search_canvas_api

Searches all Canvas API endpoints by keyword, ranked over an embedded catalog of every operation the target Canvas instance exposes (method, path, nickname, summary, parameters). Use this to find the right endpoint for anything the curated tools don't cover, then execute it with canvas_request.

ParameterTypeDefaultDescription
querystringrequiredKeywords, e.g. "group membership" or "quiz submission"
methodstring, optionalnoneOptional filter: GET, POST, PUT, PATCH, DELETE
limitinteger10Maximum results to return

Behaviour: ranked endpoint search over the catalog, weighting nickname matches highest, then summary, then path — no network call to Canvas.

canvas_request ✏️ (for non-GET methods)

Writes to Canvas when method is not GET

Executes any Canvas API endpoint directly. Non-GET methods create, modify, or delete real data in Canvas immediately and cannot be undone from here. Find endpoints with search_canvas_api first. What this is permitted to do is decided by Canvas, based on the token's role — not by this server.

ParameterTypeDefaultDescription
methodstringrequiredGET, POST, PUT, PATCH, or DELETE
pathstringrequiredEndpoint path, e.g. /v1/users/self/groups or courses/123/assignments
paramsobject, optionalnoneQuery string parameters
bodyobject, optionalnoneJSON request body for write methods
dry_runbooleanfalseReturn the prepared request without sending it

Set dry_run=true to preview the method, resolved URL, params, and body before anything reaches Canvas — this is how the write path gets verified in testing without ever submitting real data.

Behaviour: executes any endpoint the search surfaces, subject to whatever the caller's token permits. destructiveHint is set whenever method != "GET".

Prompts

Reusable multi-step workflows layered on top of the tools above — the natural seed for Agent Skills later.

PromptArgumentsPurpose
week_aheaddays (default 7)Merge deadlines with submission state, rank by urgency and weight — walks the agent through whats_due, my_courses, and my_submission in sequence.
study_packcourse, topicGather modules, pages, and files for a topic into a study set — walks through my_courses, course_content, list_files, and read_file, grounding the summary only in what was found.
grade_checkcourseCompute standing in a course and what remaining work is worth — walks through my_courses, my_grades, and list_assignments.

Each prompt tells the model explicitly not to guess: dates, grading weights, and material coverage must come from tool results, not invention.

Resources

Read-only context the model can pull without a tool call.

URIContents
canvas://meIdentity and per-course roles
canvas://coursesActive courses with term and role
canvas://api/catalogFull endpoint catalog — every operation this Canvas instance exposes, with method, path, summary, and parameter names

On this page