Working with the tools
All tools are annotated read-only. The request policy independently enforces which routes and parameters they can send. Tools return structured JSON and source provenance; errors have machine-readable codes rather than pretending to be empty collections.
| Tool | Use |
|---|---|
canvas_courses |
Discover course IDs visible to the account. |
canvas_assignments |
Read instructions, personalized dates and own submission metadata. |
canvas_submission |
Read your own feedback, rubric and submission history. |
canvas_outline |
List modules, then request a module's item list. |
canvas_agenda |
Read planner work and explicit course calendars, both events and assignment dates. |
canvas_file |
Read a bounded attachment by Canvas file ID. |
canvas_discover |
Search the reviewed operation catalog and parameter requirements. |
canvas_read |
Execute a catalog operation, preserving Canvas fields. |
Start with a question such as “What is due in ENV101 next week?” or “Read the feedback on my field report and link to the assignment.” Course content and attachments are untrusted source data, not instructions authorizing other tools.
Deeper reads
Call canvas_discover with search="page", then for example:
{
"operation": "pages",
"path": {"course_id": "101"},
"query": {"include[]": ["body"], "per_page": 5},
"max_pages": 1
}
Discover student_submissions, rubric, discussion_entries, quizzes,
my_enrollments, group_files and conversations for other available resources.
The catalog returns required path keys and allowed query keys. Numeric IDs and
self where documented are supported; SIS IDs and UUID identifiers are not.
Examples use synthetic IDs; replace them with IDs from your own permitted reads.
pages and group_pages can request bodies with include[]=["body"] where the
deployment supports it and the Pages tab is enabled. A 403/404 is a permission or
compatibility result, not permission to follow a Canvas UI link.
Array query values use bracketed keys, for example
{"include[]": ["submission_comments"]}. Unknown keys are rejected. No arbitrary
URL, HTTP method, header, proxy account or upload can be supplied.
One page is the default. max_pages can be 1–20. Follow the validated next_url
by extracting its allowed query fields into another call for the same operation;
there is deliberately no arbitrary-URL execution tool. Do not infer completeness
from list length. The server also clips large results to a bounded JSON tree and
sets content_truncated=true, complete=false; retry with smaller pages or use
supported collection filters. Errors and partial sources stay explicit.
Excluded reads
GET is necessary but insufficient for this boundary. The catalog excludes:
assignment: its detail GET can record module completion. Useassignmentswithassignment_ids[]to select an assignment.module_item: detail GET can record progress in Horizon courses. Usemodule_itemsand select the returned ID locally.quiz_submissionsandquiz_submission: reads can schedule grading or repair stored question/submission records. Quiz metadata remains available.page,front_page,group_pageandgroup_front_page: conservatively disabled after an unresolved live module-requirement comparison. That result does not establish that page reads caused a change. Usepages/group_pages, optionally includingbody; do not navigate UI URLs as a fallback.page_revisionandgroup_page_revision: individual revision reads can enter an upstream record-repair branch. Revision-list metadata remains available.
Both read_status and read_state submission includes are rejected, including
nested/comma-separated forms and pagination. Conversation detail always disables
automatic marking as read. Unknown routes and query keys fail closed.
Canvas can still record access logs and refresh derived progress caches on GET, including module-item lists. These controls do not prove an unchanged account. See validation and testing for evidence and limits.
Schedules
Pass explicit course IDs to canvas_agenda to include their calendars. The API
otherwise defaults to the personal calendar. The tool batches ten contexts and
reads both type=event and type=assignment. Planner and calendar can overlap;
deduplicate by resource type and ID. Preserve timezone offsets and all-day dates.
Use a range of at most 366 days. One agenda reuses its client across all sources
and has a 45-second total deadline; completed sources remain available if time
runs out. No tool promises external institutional schedules.
Attachments
canvas_file returns UTF-8 text or base64 binary content with MIME, size and SHA-256.
Its default byte limit is 200,000, maximum 500,000. An oversized file produces a
clear error; it is never silently cut into corrupt binary data. A capable host can
consume the base64 payload. No automatic PDF, Office, archive or executable
processing occurs.
For larger attachments, a person can explicitly export a local file:
folava-mcp file 601 --output field-guide.pdf
The CLI defaults to 5 MB and permits at most 20 MB via --max-bytes. Existing files
are never overwritten. Parent directories must already exist. Treat exports as
private coursework; do not execute unknown content.
The client reads file metadata, then the fixed /api/v1/files/{file_id}/public_url
API pointer. Content requests accept only audited AWS S3 REST destinations and
send no Canvas authorization or cookies. Every redirect must meet that same
policy. The client never follows metadata's Canvas download/preview URL; Canvas
file-host routes, InstFS, CDN, custom endpoints and local-storage fallbacks are
unsupported and refused. A permitted file's metadata does not guarantee its
storage backend is supported. No real attachment content was downloaded in the
recorded Canvas checks.
Signed URLs are not returned by the file tool. Raw API reads can contain upstream signed URLs—treat those responses as private capabilities and do not log or publish them.