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.
| Parameter | Type | Default | Description |
|---|---|---|---|
state | string | "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.
| Parameter | Type | Default | Description |
|---|---|---|---|
days | integer | 14 | Horizon 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer, optional | none | Limit 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id, from my_courses |
bucket | string, optional | none | One 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
assignment_id | integer | required | Assignment 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
assignment_id | integer | required | Assignment 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
assignment_id | integer | required | Assignment id |
submission_type | string | required | One of: online_text_entry, online_url, online_upload |
body | string, optional | none | Text content — required for online_text_entry |
url | string, optional | none | URL — required for online_url |
file_ids | list of integers, optional | none | Canvas 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer, optional | none | Limit to one course; omit for all |
days | integer | 14 | How 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
search | string, optional | none | Filter 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
file_id | integer | required | Canvas file id, from list_files |
max_chars | integer | 50000 | Truncate 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
page_url | string | required | Page 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
topic_id | integer, optional | none | Topic 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
course_id | integer | required | Course id |
topic_id | integer | required | Discussion topic id |
message | string | required | The reply text; HTML is allowed |
parent_entry_id | integer, optional | none | Reply 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
query | string | required | Keywords, e.g. "group membership" or "quiz submission" |
method | string, optional | none | Optional filter: GET, POST, PUT, PATCH, DELETE |
limit | integer | 10 | Maximum 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.
| Parameter | Type | Default | Description |
|---|---|---|---|
method | string | required | GET, POST, PUT, PATCH, or DELETE |
path | string | required | Endpoint path, e.g. /v1/users/self/groups or courses/123/assignments |
params | object, optional | none | Query string parameters |
body | object, optional | none | JSON request body for write methods |
dry_run | boolean | false | Return 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.
| Prompt | Arguments | Purpose |
|---|---|---|
week_ahead | days (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_pack | course, topic | Gather 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_check | course | Compute 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.
| URI | Contents |
|---|---|
canvas://me | Identity and per-course roles |
canvas://courses | Active courses with term and role |
canvas://api/catalog | Full endpoint catalog — every operation this Canvas instance exposes, with method, path, summary, and parameter names |