whoami
Who Am I
Get your Canvas user ID, name and login. Read-only and very cheap. Use it to confirm the token works; use get_my_profile for bio and email, or test_connection for a full diagnostic.
Takes no parameters.

io.github.FireiscoolsoloPublished by GitHub account Fireiscoolsolov1.3.1Updated Nov 5, 2026
Self-hosted Canvas LMS for every device: 237 student tools over HTTP with OAuth and phone alerts.
Canvas LMS tools for students: browse courses, assignments, grades, deadlines, discussions and inbox, and plan study time from an AI assistant.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
[!TIP] Want it to run locally, on just your own computer? Go to the Local Edition → (website). It has the same 237 tools, with no tunnel, no password and a one-command setup.
Use Canvas from your AI assistant on any device: web, desktop and mobile. Always on, password-protected, with automatic failover across several computers.
237 tools · OAuth 2.1 · Status page · Phone alerts · ngrok or Cloudflare tunnel · Multi-computer failover
[npm] [npm downloads] [npm downloads per month] [Release downloads] [Tests] [Windows app] [Glama score] [GitHub stars] [Node.js] [MCP] [License: MIT] [Website] [PRs welcome]
Website · Quick start · Multi-device guide · Configuration · Tools · Phone alerts · Security · Changelog
[!TIP] On Windows? Skip the terminal. The free Canvas MCP Installer Assistant sets this up for Claude or the ChatGPT desktop app with pictures and a check after every step, or does every step for you. Download for Windows
[Example chat: asking what score is needed on the final and what's due this week (sample data)]
daily_briefing, get_week_ahead, semester_snapshot, planner notes, checking items off your To Do liststudy_plan spreads study time before each deadline; schedule_study_plan puts it on your Canvas calendarfinal_grade_scenarios, what_if_grade, grade_impact_ranking, calculate_gpa, full weighted breakdownsassignment_brief in one call; submit, post and message after a previewread_course_file; downloads come back as links your phone can open[!NOTE] Rather click than type? Download the Canvas MCP Installer Assistant for Windows. It walks you through these steps with pictures and checks each one as you go, for both the Remote and Local editions. See screenshots.
Windows may show "Windows protected your PC" because the app isn't code-signed yet. Click More info, then Run anyway.
You need: Node.js 18+ (22+ to read PDFs), a Canvas account and a free ngrok account (or a Cloudflare account with your own domain). Prefer containers? See Docker.
With npm (easiest):
That folder is your settings folder. It holds your .env, logins and logs, so run every later step from it.
Or from source: git clone https://github.com/Fireiscoolsolo/canvas-lms-mcp-server.git, then run npm install inside the folder. No git? Download the zip from the latest release instead. The repo folder is then your settings folder.
From source, use node cli.js <command> instead.
In Canvas, go to Account → Settings → Approved Integrations → + New Access Token. Canvas only shows the token once, so copy it right away.
ngrok (default):
Then claim your free static domain in the ngrok dashboard, e.g. your-name.ngrok-free.dev.
cloudflared (downloads; on Windows winget install --id Cloudflare.cloudflared).canvas.yourdomain.com, pointing at http://localhost:3939..env, set CANVAS_MCP_TUNNEL=cloudflared, CANVAS_MCP_CLOUDFLARED_TOKEN=<token> and CANVAS_MCP_PUBLIC_URL=https://canvas.yourdomain.com.Using your own reverse proxy or Tailscale Funnel instead? Set CANVAS_MCP_TUNNEL=none and point it at port 3939.
.envFill in the .env that init created. From source, copy .env.example to .env first. Generate the password and secret with:
doctor checks your settings, token and tunnel first. Then wait until you see active and serving at https://…, and press Ctrl+C.
On Windows this creates the CanvasSupervisor scheduled task, on Linux a systemd user service, and on macOS a launch agent. All of them restart it if it crashes and write supervisor.log in your settings folder, rotating it at 5 MB.
In PowerShell, from your settings folder (the repo folder, if you installed from source):
run-supervisor.cmd assumes Node is at C:\Program Files\nodejs\node.exe. If yours is somewhere else, edit that file.
In your AI app's settings, add a custom connector (also called a remote MCP server) with the URL https://<your-domain>/mcp, then log in with your password. Apps that sync connectors to your account will show it on your phone and desktop too. Command-line and editor clients can add it as an HTTP MCP server with the same URL.
Open Settings → Plugins, go to the MCPs tab, then click Add → Add MCP server.
Choose Streamable HTTP and fill in the form:
Click Save, then Authenticate and log in with your password. Start a new chat to use it.
The header skips the page ngrok's free plan shows before your server.
Then ask your assistant: "Run test_connection."
Open https://<your-domain>/status in any browser and enter your password. It shows whether the server is online and which computer is serving, your Canvas connection and when the token expires, the apps that are signed in (each with a Sign out button), recent sign-ins, the computers in your group, your phone-alert settings and recent problems. Nothing secret is ever shown, and the page locks itself after 12 hours.
From a terminal, canvas-lms-mcp-remote status and canvas-lms-mcp-remote sessions show the same things.
You can run the same server on two or more computers, for example a desktop and a laptop, so it stays online when one is off or asleep. One computer serves; the others wait in standby and take over automatically.
Follow the step-by-step Multi-Device Setup Guide. It covers copying settings safely, the shared tunnel, the startup service, checking it works, testing failover, updating code and changing secrets. canvas-lms-mcp-remote cluster lists the computers, and canvas-lms-mcp-remote takeover moves serving to the computer you're on.
For a home server or NAS: copy .env.example to .env, fill it in, add NGROK_AUTHTOKEN=<your ngrok authtoken>, then:
docker-compose.yml runs the server and an ngrok tunnel, keeping your logins in a Docker volume. It also has a commented-out Cloudflare Tunnel service to use instead. One container serves, so there's no failover between computers in this setup; Docker restarts it if it stops.
All settings are environment variables in .env. See .env.example.
Phone-alert settings are listed in Phone alerts.
The server also adds these to your AI app's menus. They don't count as tools.
Apps that support MCP prompts and resources, such as Claude Desktop, show them in the + menu.
Because the Remote Edition is always on, it can tell you when something happens. On by default once you set a channel:
Add any of these to CANVAS_ALERTS to turn them on too: assignments (new assignments, quizzes and discussions), comments (a teacher commented on your work), inbox (new messages), grade_drop (a course grade fell below CANVAS_ALERTS_GRADE_BELOW, default 70%) and security (sign-ins and lockouts on your server).
Where they go. Add any of these to .env, then restart the server:
When they come.
Then run canvas-lms-mcp-remote test-alert from your settings folder to check it works.
Only the computer that is serving sends alerts, and it remembers what it already sent in your Canvas account's own storage, so you don't get repeats when another computer takes over. Alert text passes through the service you pick, so keep the topic, channel or chat private.
confirm: true.<<<CANVAS_CONTENT>>> markers and labelled as untrusted.127.0.0.1. The only way in from outside is the tunnel.canvas-lms-mcp-remote totp-setup adds a code from your authenticator app to the login and status pages.rotate-password signs everyone out./healthz check says nothing about your account.Never commit
.env,oauth-store.json,login-history.jsonorsupervisor.log. They're already listed in.gitignore. See SECURITY.md.
This is a study and organization tool. It helps you see deadlines, understand your grades and plan your week. It never takes quizzes, and nothing is sent or submitted until you've seen a preview and confirmed it.
CANVAS_ALLOW_WRITES=false for read-only mode.Start with canvas-lms-mcp-remote doctor in your settings folder: it checks the settings, token, network, tunnel, server and startup service, and says how to fix what it finds.
More issues with several computers are covered in the Multi-Device guide.
Restart cleanly with canvas-lms-mcp-remote restart. Running an older version that doesn't know it? In PowerShell:
Known limits: a student token can't reach admin endpoints, gradebook history, course analytics or quiz statistics. smart_search is a Canvas beta feature and often returns 404. While the server is reached over the tunnel, apps get a preview before actions instead of a pop-up confirmation.
MIT. This project isn't affiliated with Instructure.
Source: README.md at commit 1753322
Who Am I
Get your Canvas user ID, name and login. Read-only and very cheap. Use it to confirm the token works; use get_my_profile for bio and email, or test_connection for a full diagnostic.
Takes no parameters.
Get My Profile
Get your full Canvas profile: name, bio, avatar, primary email and calendar feed URL. Read-only. For just your ID and name, whoami is cheaper.
Takes no parameters.
Get My Settings
Get your account-level Canvas preferences, such as dashboard view, activity stream visibility and comment notification settings. Read-only. For how often you are notified about each event, use get_notification_preferences.
Takes no parameters.
Check Token Expiry
Check when your Canvas access token expires and warn if it is close. Read-only. Canvas often forces student tokens to expire after 30–120 days without warning, so run this at the start of a term.
Takes no parameters.
Get Rate Limit Status
Report Canvas rate-limit state from the most recent API call: remaining quota, last request cost and requests this session. Read-only and makes no Canvas call itself. Canvas throttles by cumulative request cost, so check this before expensive tools like semester_snapshot.
Takes no parameters.
List My Enrollments
List your enrollments across all courses, with role (student, observer…), section and current grade summary. Read-only. Use list_courses for course details; use this when you need roles, sections or per-enrollment grades.
pagetypelimitstateGet Activity Stream
Get recent activity across all your courses: new announcements, discussion replies, graded submissions and messages, newest first. Read-only. Titles and messages are fenced as untrusted text. For counts only, use get_activity_stream_summary; for one course, use get_course_activity_stream.
pagelimitonly_active_coursesGet Activity Stream Summary
Get counts of unread activity by type (announcements, discussions, messages, submissions) across your courses. Read-only and very cheap. Call it before get_activity_stream to see whether the full stream is worth pulling.
Takes no parameters.
List Todo
List Canvas's own to-do items for you: assignments waiting for your submission, and items to grade if you are an instructor. Read-only. For a date-bounded view use list_upcoming_assignments; for one course use list_todo_for_course.
pagelimitGet Todo Count
Get the number of items on your Canvas to-do list without fetching them. Read-only and cheap. Use list_todo to see the items.
Takes no parameters.
List Upcoming Events
List your upcoming calendar events and assignment due dates, using Canvas's own default window. Read-only. For a specific date range, use list_calendar_events.
Takes no parameters.
Get Dashboard Cards
Get the course cards on your Canvas dashboard, in dashboard order, with names, colors and links. Read-only. Use list_courses for every enrollment, including ones not on the dashboard.
Takes no parameters.
List Favorite Courses
List the courses you have starred as favorites; these decide what appears on your dashboard. Read-only. Change them with add_favorite_course and remove_favorite_course.
pagelimitAdd Favorite Course
Star a course as a favorite so it shows on your Canvas dashboard. Only affects your own view. Reverse with remove_favorite_course.
course_idrequiredRemove Favorite Course
Unstar a favorite course so it no longer shows on your Canvas dashboard. Only affects your own view; your enrollment is unchanged. Reverse with add_favorite_course.
course_idrequiredGet Communication Channels
List the notification channels on your account (email addresses, SMS numbers, push) with their IDs and status. Read-only. Use a channel_id from here with get_notification_preferences.
pagelimitGet Notification Preferences
Get how often Canvas notifies you about each event type (due dates, grades, announcements…) on one channel: immediately, daily, weekly or never. Read-only. Get channel_id from get_communication_channels first.
channel_idrequiredGet My Page Views
List your own Canvas page views (URL, time and course) in a time range. Read-only. Useful for showing you opened material on a given date. How far back history goes depends on your school.
pagelimitend_timestart_timeList Content Shares
List course content (assignments, pages, quizzes) that other Canvas users shared directly with you, with sender and share date. Read-only. Returns an empty list if nothing was shared.
pagelimitGet Custom Data
Read key-value data you previously stored on your Canvas account with set_custom_data. Read-only. Returns an error if nothing is stored at that namespace and scope.
scopenamespaceSet Custom Data
Store your own key-value data on your Canvas account (a small private per-user store, invisible to others). Overwrites any existing value at the same namespace and scope. Read it back with get_custom_data.
datarequiredscopenamespaceList Bookmarks
List your saved Canvas bookmarks with their names, URLs and IDs. Read-only. Use the IDs with delete_bookmark.
pagelimitCreate Bookmark
Save a Canvas bookmark to a course page or any Canvas URL. Only you see it. Returns the new bookmark with its ID. Use list_bookmarks to see existing ones.
urlrequirednamerequiredpositionDelete Bookmark
Delete one of your saved Canvas bookmarks. Only affects you. Get bookmark_id from list_bookmarks.
bookmark_idrequiredList My Observees
List the students you are linked to as an observer, for parent or mentor accounts. Read-only. Returns an empty list for regular student accounts.
pagelimitList Notification Categories
The notification categories on one delivery channel (email, phone) and how often Canvas currently notifies you about each, e.g. due dates, grading, announcements. Use with update_notification_preference.
channel_idrequiredUpdate Notification Preference
Change how often Canvas emails or texts you about one kind of event, e.g. "grading" only weekly, or "announcement" immediately. Only affects your own notifications. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmcategoryrequiredfrequencyrequiredchannel_idrequiredList Courses
List the courses you are enrolled in with IDs, names, codes, term and your current grade. Read-only. Only active courses unless include_concluded is set. Start here to get course_id values for other tools.
pagelimitinclude_gradesinclude_concludedGet Course
Get full details for one course: name, code, term, start and end dates, syllabus and public description. Read-only. Use list_courses to find course IDs; use get_syllabus for the syllabus as plain text.
course_idrequiredGet Syllabus
Get a course syllabus as plain text, converted from Canvas HTML. Read-only. The text is fenced as untrusted. If the instructor uploaded the syllabus as a file instead, look in list_course_files; syllabus_digest pulls out dates and weights.
course_idrequiredGet Course Settings
Get course-level settings such as whether final grades are hidden, the late policy is shown, or a grading standard is used. Read-only. Some settings may be hidden from students, in which case Canvas returns an error.
course_idrequiredList Course Tabs
List the navigation tabs visible to you in a course (Home, Assignments, Files, Quizzes…). Read-only. Check this first to see whether a feature such as Files or Pages is enabled before calling its tools.
course_idrequiredGet Course Activity Stream
Get recent activity in one course: announcements, discussion replies, grade changes and messages. Read-only. Titles and messages are fenced as untrusted. For all courses at once, use get_activity_stream.
pagelimitcourse_idrequiredList Sections
List the sections in a course (e.g. lecture or lab sections), including the one you are enrolled in. Read-only. Useful for understanding section-specific due-date overrides.
pagelimitcourse_idrequiredList Course Users
List people in a course with names, roles and user IDs, optionally filtered by role or name. Read-only. Your school's privacy settings often limit or block this for students.
pagelimitcourse_idrequiredsearch_termenrollment_typeGet User In Course
Get one person's profile within a course: name, role, section and avatar. Read-only. Get user_id from list_course_users. Your institution's privacy settings may limit what is returned.
user_idcourse_idrequiredGet Course Permissions
Show what your token is allowed to do in a course, such as posting to discussions or sending messages. Read-only. Call it before a write tool to avoid an action failing halfway.
course_idrequiredList Course Nicknames
List the personal nicknames you have given courses. Read-only. Only you see nicknames. Change them with set_course_nickname or remove_course_nickname.
pagelimitSet Course Nickname
Give a course a personal nickname that replaces its name in your own Canvas view. Only you see it; the course is unchanged for everyone else. Undo with remove_course_nickname.
nicknamerequiredcourse_idrequiredRemove Course Nickname
Remove your personal nickname for a course so Canvas shows its official name again. Only affects your own view.
course_idrequiredGet Course Progress
Get your module completion progress in a course: requirements met, total requirements and next item. Read-only. Returns an error for courses without module completion requirements.
course_idrequiredList Todo For Course
List Canvas to-do items for a single course. Read-only. Use list_todo for all courses at once.
pagelimitcourse_idrequiredList Blackout Dates
List no-work days (blackout dates) in a course used by course pacing. Read-only. Returns an empty list when pacing is not used.
course_idrequiredCourse Contacts
Who to contact in a course and when: the teachers and TAs (with the user IDs send_message needs), office hours found in the syllabus, and office-hour or advising sign-up slots. Read-only.
course_idrequiredList Assignments
List assignments in a course with due dates, points and your submission status, optionally filtered by bucket (e.g. upcoming, overdue) or name. Read-only. Use get_assignment for one assignment's full instructions and rubric.
pagelimitbucketcourse_idrequiredsearch_termGet Assignment
Get full details for one assignment: instructions, due/lock dates, points, submission types and the rubric. Read-only. Prompt text written by the instructor is fenced as untrusted. Get assignment_id from list_assignments.
course_idrequiredassignment_idrequiredList Assignment Groups
List a course's assignment groups (e.g. Homework, Exams) with their grade weights and drop rules, optionally with each group's assignments. Read-only. Explains how your final grade is weighted; get_course_grade_breakdown does the math for you.
pagelimitcourse_idrequiredinclude_assignmentsGet Assignment Group
Get one assignment group (e.g. "Homework") with its weight, drop rules and assignments. Read-only. Use list_assignment_groups to see all groups and their IDs.
group_idrequiredcourse_idrequiredList Assignment Overrides
List due-date overrides on an assignment: different dates or extensions for sections, groups or individual students. Read-only. Use get_my_override for the dates that apply to you.
pagelimitcourse_idrequiredassignment_idrequiredGet My Override
Get the due, lock and unlock dates that actually apply to you for an assignment, after section or individual overrides. Read-only. Use this instead of the default dates when deadlines differ by section.
course_idrequiredassignment_idrequiredGet Assignment Dates
List due, lock and unlock dates for every assignment in a course, sorted by due date, in a compact form. Read-only. Use list_assignments when you also need submission status.
pagelimitcourse_idrequiredGet Score Statistics
Get class statistics for an assignment (mean, min, max, quartiles) next to your own score. Read-only. Canvas only shows these once enough students are graded and if the instructor allows it.
course_idrequiredassignment_idrequiredGet Late Policy
Get a course's late policy: the percentage deducted per late interval, the lowest score a late penalty can reach, and the grade given for missing work. Read-only. Returns an error if the course has no late policy.
course_idrequiredList Missing Submissions
List every assignment Canvas has flagged as missing across all your courses, with due date, points and how overdue it is. Read-only. One call instead of looping over courses. list_overdue_assignments checks submission status course by course instead.
limitList Upcoming Assignments
List assignments and other planner items due in the next N days (default 7) across all active courses, soonest first. Read-only. Uses the same Planner feed as the Canvas dashboard; set include_completed to also show items already done.
daysinclude_completedList Overdue Assignments
List assignments past their due date that you have not submitted, checking each active course. Read-only. Slower than list_missing_submissions, which relies on Canvas's own missing flag, but catches items without that flag.
limitAssignment Brief
Everything needed to start an assignment, in one call: the instructions as clean text, due and lock dates, how to submit, attempts, the rubric, the late policy, linked files, group and peer-review details, and your current status.
course_idrequiredassignment_idrequiredGet My Submission
Get your submission for one assignment: score, grade, submitted time, lateness and deductions, attachments and instructor comments. Read-only. Use get_submission_history for earlier attempts.
course_idrequiredassignment_idrequiredList My Submissions
List all of your submissions in a course with scores, grades and status. Read-only. Use get_my_submission for full detail on one.
pagelimitcourse_idrequiredGet Submission Summary
Get counts of graded, ungraded and not-submitted submissions for an assignment. Read-only. Often instructor-only, so students may get a permission error.
course_idrequiredassignment_idrequiredGet Submission History
Get every past attempt of your submission for one assignment, oldest to newest, with scores and timestamps. Read-only. Use get_my_submission for just the latest attempt.
course_idrequiredassignment_idrequiredList Submission Attachments
List files attached to your submission for one assignment, with names, sizes and download URLs. Read-only. Pass a URL from here to download_submission_attachment to save a file.
course_idrequiredassignment_idrequiredGet Originality Report
Get the plagiarism or originality score (e.g. Turnitin) for your submission and its attachments. Read-only. Returns no report if no originality tool is enabled on the assignment.
course_idrequiredassignment_idrequiredGet Rubric Assessment
Get the rubric scoring applied to your submission, criterion by criterion, with points and comments. Read-only. Use get_rubric to see the full rubric before you submit.
course_idrequiredassignment_idrequiredList Submission Comments
List comments on your submission from your instructor and others, with author and time. Read-only. Comment text is fenced as untrusted. Reply with post_submission_comment.
course_idrequiredassignment_idrequiredMark Submission Read
Mark your submission, including any new grade or comments, as read so the unread badge clears. Only affects you.
course_idrequiredassignment_idrequiredSubmit Assignment Text
Submit text for an online text-entry assignment, exactly as given; the tool never writes content for you. Your instructor sees it and it counts as a submission attempt. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
bodyrequiredcommentconfirmcourse_idrequiredassignment_idrequiredSubmit Assignment URL
Submit a website URL for an assignment that accepts URL submissions. Your instructor sees it and it counts as a submission attempt. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
urlrequiredcommentconfirmcourse_idrequiredassignment_idrequiredSubmit Assignment File
Upload a local file and submit it to an assignment in one step. Your instructor sees it and it counts as a submission attempt. To upload now and submit later, use upload_submission_file. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
commentconfirmcourse_idrequiredfile_pathrequiredassignment_idrequiredUpload Submission File
Upload a local file into an assignment's submission slot without submitting it. Nothing is submitted and your instructor sees nothing yet. Returns a file_id that can be submitted later through raw_canvas_request; submit_assignment_file uploads and submits in one step.
course_idrequiredfile_pathrequiredassignment_idrequiredPost Submission Comment
Post a comment on your own submission for an assignment, optionally with files attached. Your instructor sees it. To attach a file, upload it first with upload_comment_attachment. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
commentrequiredconfirmfile_idscourse_idrequiredassignment_idrequiredUpload Comment Attachment
Upload a local file so it can be attached to a comment on your submission. Returns a file ID; nothing is visible to anyone until you call post_submission_comment with that ID in file_ids.
course_idrequiredfile_pathrequiredassignment_idrequiredDownload Submission Attachment
Download one file attached to your submission and save it to local disk. Returns the saved path. Get the URL from list_submission_attachments.
urlrequiredfilenameSubmit Annotation Assignment
Hand in a student-annotation assignment (where you mark up a document inside Canvas). Do the annotating in Canvas first; this submits what is there. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
commentconfirmcourse_idrequiredassignment_idrequiredGet All Grades
Get your current and final grades for every active course in one call, including unposted grades where Canvas shows them. Read-only. Use get_course_grade_breakdown to see how one course's grade is calculated.
Takes no parameters.
Calculate Gpa
Calculate your GPA on a 4.0 scale from your current Canvas grades, weighted by credit hours. Read-only. Uses the letter grade Canvas shows, or converts the percent (93+ A, 90 A-, 87 B+ and so on). Supports what-if grades and extra points for honors or AP classes. Pass-fail courses are listed as excluded.
creditswhat_ifextra_pointsdefault_creditsuse_final_scoreGet Course Grade Breakdown
Break down your grade in one course: each assignment group's weight, your points earned vs possible, and its weighted contribution to the total. Read-only. Use compute_needed_score to plan toward a target grade.
course_idrequiredWhat If Grade
Enter a hypothetical score on one assignment and get your recalculated course grade, with Canvas applying group weights and drop rules. Writes a what-if score only you can see; it is not a real grade. Undo with reset_what_if_grades. Canvas treats this as expensive; for pure math with no writes, use compute_needed_score.
scorerequiredsubmission_idrequiredReset What If Grades
Clear every what-if score you entered in a course so Canvas shows your real grades again. Only affects your own view.
course_idrequiredGet Grading Standard
Get the letter-grade scale for a course, i.e. the percentage needed for each letter such as A- or B+. Read-only.
pagelimitcourse_idrequiredList Grading Periods
List a course's grading periods (e.g. quarters) with start, end and close dates. Read-only. Returns an empty list if the course does not use grading periods.
course_idrequiredGet My Assignment Analytics
Get your score on each assignment next to the class median, min and max, plus whether you submitted on time. Read-only. Returns an error if course analytics are disabled at your school.
course_idrequiredGet My Activity Analytics
Get your page views and participations in a course, counted per day. Read-only. Returns an error if course analytics are disabled at your school.
course_idrequiredGet My Communication Analytics
Get daily counts of messages between you and the instructor in a course. Read-only. Returns an error if course analytics are disabled at your school.
course_idrequiredGet Unposted Grades
Get scores your instructor entered but has not released yet, where your enrollment can see them. Read-only. Usually empty for students; use get_all_grades for released grades.
pagelimitcourse_idCompute Needed Score
Calculate the average you need on remaining ungraded work in a course to reach a target final percentage, accounting for group weights. Pure math with no writes. Use what_if_grade to test one specific score with Canvas itself.
course_idrequiredtarget_percentrequiredGrade Impact Ranking
Rank a course's ungraded and upcoming assignments by how much each point moves your final grade. Read-only. Shows where effort pays most; study_priority_ranking does this across all courses with urgency added.
course_idrequiredGet Grade Trend
List graded assignments in a course in date order with a running average, so you can see whether your grade is rising or falling. Read-only.
course_idrequiredFinal Grade Scenarios
What-if planning for a whole course: your projected final grade if you average 100, 90, 80, 70 or 60% on everything not graded yet, and the average you need on the rest for each letter grade. Uses the course's assignment-group weights and its own letter cutoffs when Canvas shares them. Read-only.
targetscourse_idrequiredList Quizzes
List Classic Quizzes in a course with due dates, time limits, allowed attempts and points. Read-only. For New Quizzes, use list_new_quizzes. This server never takes quizzes.
pagelimitcourse_idrequiredsearch_termGet Quiz
Get one Classic Quiz: instructions, time limit, allowed attempts, dates and when results are shown. Read-only. Instructions are fenced as untrusted. This server never takes quizzes.
quiz_idrequiredcourse_idrequiredGet My Quiz Submission
Get your latest submission for a quiz: score, attempt number, state and timing. Read-only. Use list_my_quiz_submissions for every attempt.
quiz_idrequiredcourse_idrequiredList My Quiz Submissions
List all your attempts on a quiz with the score for each. Read-only. Use get_my_quiz_submission for just the latest.
quiz_idrequiredcourse_idrequiredGet Quiz Submission Time
Get the time remaining and end time for an in-progress timed quiz attempt. Read-only. Needs the submission ID from get_my_quiz_submission.
quiz_idrequiredcourse_idrequiredsubmission_idrequiredList Quiz Questions
List a quiz's questions so you can review a completed, graded attempt. Read-only and never used to take a quiz. Canvas hides questions unless the instructor allows review, so this often returns a permission error or nothing.
pagelimitquiz_idrequiredcourse_idrequiredquiz_submission_idGet Quiz Extensions
Get extra time or extra attempts granted to you on a quiz (accommodations). Read-only. Returns an empty list if none were granted.
quiz_idrequiredcourse_idrequiredGet Quiz IP Filters
Get IP address restrictions on a quiz (used for lab-only or proctored exams), so you know where you can take it. Read-only.
quiz_idrequiredcourse_idrequiredGet Quiz Assignment Overrides
Get section- or student-specific due dates for quizzes in a course. Read-only. Use get_my_override for the dates that apply to you on one assignment.
course_idrequiredquiz_assignment_overridesList New Quizzes
List New Quizzes assessments in a course with due dates, points and question counts. Read-only. New Quizzes is a separate service from Classic Quizzes (list_quizzes) and may not be enabled at your school.
pagelimitcourse_idrequiredGet New Quiz
Get details for one New Quizzes assessment: title, instructions, points and timing. Read-only. Uses the Quiz LTI API, which some schools do not expose to students. For Classic Quizzes use get_quiz.
quiz_idrequiredcourse_idrequiredGet New Quiz Items
List the questions in a New Quizzes assessment. Read-only. Most schools only allow this for instructors, so students usually get a permission error.
pagelimitquiz_idrequiredcourse_idrequiredList Topics
List discussion topics in a course with unread counts and whether you must post before seeing replies. Read-only. Set only_announcements for announcements; read a thread with get_full_topic_view.
pagelimitcourse_idrequiredsearch_termonly_announcementsGet Topic
Get one discussion topic: its prompt, author, posting rules and unread count, without the replies. Read-only. The prompt is fenced as untrusted text. Use get_full_topic_view to read the whole thread, or list_topics to find topic IDs.
topic_idrequiredcourse_idrequiredGet Full Topic View
Get an entire discussion thread, all entries and nested replies, in one request. Read-only. Much lighter on rate limits than paging through list_entries. All participant text is fenced as untrusted.
topic_idrequiredcourse_idrequiredmax_entriesList Entries
List top-level entries in a discussion topic, page by page. Read-only. Entry text is fenced as untrusted. Prefer get_full_topic_view to read a whole thread at once.
pagelimittopic_idrequiredcourse_idrequiredList Entry Replies
List the replies under one discussion entry, oldest first. Read-only. Bodies are fenced as untrusted text. To read a whole thread at once, use get_full_topic_view instead.
pagelimitentry_idrequiredtopic_idrequiredcourse_idrequiredPost Entry
Post a new top-level entry to a course discussion. Visible to the whole class. Use reply_to_entry to answer someone's entry. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmmessagerequiredtopic_idrequiredcourse_idrequiredReply To Entry
Reply to one discussion entry. Visible to the whole class. Use post_entry for a new top-level post. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmmessagerequiredentry_idrequiredtopic_idrequiredcourse_idrequiredEdit My Entry
Replace the text of one of your own discussion entries, if the course allows editing. The new text is visible to the whole class. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmmessagerequiredentry_idrequiredtopic_idrequiredcourse_idrequiredDelete My Entry
Delete one of your own discussion entries, if the course allows it. Classmates see that an entry was removed. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmentry_idrequiredtopic_idrequiredcourse_idrequiredRate Entry
Like (rating 1) or remove your like (rating 0) on a discussion entry, where the instructor enabled ratings. Others see the like count.
ratingrequiredentry_idrequiredtopic_idrequiredcourse_idrequiredMark Topic Read
Mark a discussion topic as read for you. Only affects your unread counts. Use mark_all_entries_read to also clear every reply.
topic_idrequiredcourse_idrequiredMark All Entries Read
Mark every entry in a discussion topic as read for you. Only affects your unread counts.
topic_idrequiredcourse_idrequiredMark Entry Read
Mark one discussion entry as read for you. Only affects your unread counts.
entry_idrequiredtopic_idrequiredcourse_idrequiredSubscribe Topic
Subscribe to a discussion topic so you are notified about new replies. Only affects you. Reverse with unsubscribe_topic.
topic_idrequiredcourse_idrequiredUnsubscribe Topic
Stop getting notifications for new replies in a discussion topic. Only affects you; the topic and your posts are unchanged. Reverse with subscribe_topic.
topic_idrequiredcourse_idrequiredList Announcements
List announcements from one or more courses in a date range, newest first, with title, author and body. Read-only. Bodies are fenced as untrusted text. Without dates it covers the last 30 days; without course_ids it covers all active courses.
limitend_datecourse_idsstart_dateunread_onlyGet Unread Discussion Count
Get the unread entry count for each discussion topic in a course. Read-only and cheap. Use get_full_topic_view to read a topic.
pagelimitcourse_idrequiredList Global Announcements
School-wide announcements: the banners your school shows everyone on the Canvas dashboard (closures, outages, deadlines). Read-only. Messages are provenance-fenced.
Takes no parameters.
Dismiss Global Announcement
Close a school-wide announcement so it stops showing on your Canvas dashboard. Only affects you.
account_idnotification_idrequiredMark Announcement Read
Mark one course announcement as read, clearing its unread badge.
course_idrequiredannouncement_idrequiredMark All Announcements Read
Mark every unread announcement in the last N days as read, across all your courses or the ones you pick. Clears the unread badges in Canvas.
dayscourse_idsList Conversations
List your Canvas Inbox conversations, newest first, with subject, participants, last message preview and unread state. Read-only. Use get_conversation for the full thread.
pagelimitscopefilterGet Conversation
Get the full message thread for one Inbox conversation, with authors and times. Read-only unless mark_as_read is true. Message bodies are fenced as untrusted.
mark_as_readconversation_idrequiredSend Message
Send a new Canvas Inbox message, e.g. to a professor or classmate. Recipients get it immediately. Get recipient IDs from find_recipients; to answer an existing thread, use reply_to_conversation. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
bodyrequiredconfirmsubjectrequiredcourse_idrecipientsrequiredseparate_threadsReply To Conversation
Reply within an existing Canvas Inbox conversation. Every participant receives it. Use send_message to start a new thread. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
bodyrequiredconfirmconversation_idrequiredincluded_message_idsFind Recipients
Search by name for people you are allowed to message, optionally within one course. Read-only. Returns the user IDs that send_message and add_recipients need.
limitsearchrequiredcourse_idAdd Recipients
Add more people to an existing Inbox conversation so they receive its messages. Get user IDs from find_recipients. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmrecipientsrequiredconversation_idrequiredMark Conversation Read
Mark one Inbox conversation as read. Only affects you; the sender is not notified. Reverse with mark_conversation_unread.
conversation_idrequiredMark Conversation Unread
Mark one Inbox conversation as unread so it shows up again. Only affects you. Reverse with mark_conversation_read.
conversation_idrequiredStar Conversation
Star an Inbox conversation so it appears under the "starred" scope. Only affects you. Reverse with unstar_conversation.
conversation_idrequiredUnstar Conversation
Remove the star from an Inbox conversation. Only affects you; the conversation itself is unchanged. Reverse with star_conversation.
conversation_idrequiredArchive Conversation
Archive an Inbox conversation so it leaves your inbox view; it stays under the archived scope. Only affects you.
conversation_idrequiredDelete Conversation
Delete an Inbox conversation from your own inbox. Other participants keep their copy. Cannot be undone. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmconversation_idrequiredGet Unread Conversation Count
Get the number of unread Canvas Inbox conversations. Read-only and very cheap. Use list_conversations with scope unread to see them.
Takes no parameters.
Batch Update Conversations
Apply one action (mark read or unread, star, unstar, archive or delete) to many Inbox conversations at once. Only affects your own inbox. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
eventrequiredconfirmconversation_idsrequiredList Calendar Events
List calendar events, or assignment due dates with type=assignment, in a date range (default: the next 14 days). Read-only. Filter to specific courses with course_ids.
pagetypelimitend_datecourse_idsstart_dateGet Calendar Event
Get one calendar event: title, start and end time, location, description and the course it belongs to. Read-only. Get event_id from list_calendar_events.
event_idrequiredCreate Personal Event
Create an event on your own Canvas calendar (only you see it). Returns the new event with its ID. Use update_calendar_event to change it later.
titlerequiredend_atstart_atrequireddescriptionlocation_nameUpdate Calendar Event
Change the title, times or description of a calendar event you created. Only events you own can be changed; course events return a permission error. Fields you omit stay the same.
titleend_atevent_idrequiredstart_atdescriptionDelete Calendar Event
Delete a calendar event you own, such as a personal event. Cannot be undone. Course events return a permission error. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmevent_idrequiredList Appointment Groups
List appointment groups you can sign up for, such as office hours or advising slots, with open time slots. Read-only. Book a slot with reserve_appointment_slot.
pagelimitscopeinclude_pastGet Appointment Group
Get one appointment group (office hours or advising) with its time slots and remaining capacity. Read-only. Book a slot with reserve_appointment_slot using a slot ID from here.
group_idrequiredReserve Appointment Slot
Book an office hours or advising time slot. The instructor sees the booking. Get slot IDs from get_appointment_group; cancel with cancel_reservation. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmcommentsappointment_idrequiredCancel Reservation
Cancel an appointment slot you booked. The instructor can see the cancellation. Get event_id from list_my_reservations. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmevent_idrequiredcancel_reasonList My Reservations
List the appointment slots you have booked, from the past week through the next 60 days. Read-only. Cancel one with cancel_reservation.
pagelimitGet Course Pace
Get the pacing plan for a self-paced course: suggested days for each module and the resulting dates. Read-only. Returns an error if course pacing is not used.
course_idrequiredList Course Files
List files in a course (slides, readings, handouts) with names, sizes, types and IDs, optionally filtered by name or type. Read-only. Save one with download_file, or all with download_all_course_files.
pagelimitcourse_idrequiredsearch_termcontent_typesList Folders
List every folder in a course's Files area with its path, file count and ID. Read-only. Use get_folder_tree for a readable outline of folders and files together.
pagelimitcourse_idrequiredGet Folder
Get one folder's details: full path, parent folder, and how many files and subfolders it holds. Read-only. Get folder_id from list_folders.
folder_idrequiredGet Folder Tree
Show a course's folders and files as an indented outline. Read-only. A good first look at what material exists; use list_course_files for IDs and details.
course_idrequiredmax_depthGet File Metadata
Get details for one file: name, size, content type, created and updated dates, and download URL. Read-only. Use download_file to save it locally.
file_idrequiredGet File Public URL
Get a temporary public download link for a file that works without logging in. Read-only, but anyone with the link can download the file until it expires.
file_idrequiredDownload File
Download one Canvas file and save it to local disk. Returns the saved path and size. Get file_id from list_course_files or list_my_files.
file_idrequireddest_dirRead Course File
Read the text of a Canvas file so you can summarize it, quiz from it or answer questions about it. Read-only. Works with PDF, Word (.docx), PowerPoint (.pptx, including speaker notes), web pages and plain-text files up to 25 MB. Long files come back in parts: call again with next_offset. Scanned PDFs have no text. Get file_id from list_course_files or list_module_items.
offsetfile_idrequiredmax_charsList My Files
List files in your personal Canvas storage (not course files), with names, sizes and IDs. Read-only. For course files use list_course_files.
pagelimitsearch_termUpload To My Files
Upload a local file into your personal Canvas storage. Only you can see it until you share or submit it. Returns the new file's ID.
file_pathrequiredparent_folder_pathGet Storage Quota
Get your personal Canvas storage quota and how much of it is used. Read-only.
Takes no parameters.
Delete My File
Delete a file from your personal Canvas storage. Cannot be undone. Get file_id from list_my_files. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmfile_idrequiredCreate Folder
Create a folder in your personal Canvas storage (not in a course). Only you can see it. Returns the new folder with its ID. Upload into it with upload_to_my_files.
namerequiredparent_folder_idList Pages
List the wiki pages in a course with titles, URL slugs and last-updated dates. Read-only. Read one page with get_page_content using its url slug.
pagelimitcourse_idrequiredsearch_termGet Page Content
Read a course page as plain text (converted from HTML), with its title and last-updated time. Read-only. The body is fenced as untrusted. Find page slugs with list_pages.
page_urlrequiredcourse_idrequiredList Page Revisions
List the edit history of one course page: revision numbers, editors and dates. Read-only. Students often cannot see page history, in which case Canvas returns a permission error. Read a revision with get_page_revision.
pagelimitpage_urlrequiredcourse_idrequiredGet Page Revision
Get the content of a course page as it was at one past revision, with the editor and date. Read-only. The body is fenced as untrusted text. Use list_page_revisions to find revision numbers, and get_page_content for the current version. Canvas returns a permission error if page history is hidden from students.
page_urlrequiredcourse_idrequiredrevision_idrequiredList Modules
List the modules in a course in order, with your completion state, prerequisites and unlock dates. Read-only. Use list_module_items to see what is inside a module.
pagelimitcourse_idrequiredGet Module
Get one module: name, position, unlock date, prerequisites, your completion state and its items. Read-only. Get module_id from list_modules.
course_idrequiredmodule_idrequiredList Module Items
List the items in a module (assignments, pages, files, quizzes, links) with each one's completion requirement and whether you met it. Read-only. Use list_modules to find module IDs.
pagelimitcourse_idrequiredmodule_idrequiredGet Module Item
Get one item inside a module (assignment, page, file, quiz, link…) with its completion requirement and whether you met it. Read-only. Get item_id from list_module_items.
item_idrequiredcourse_idrequiredmodule_idrequiredMark Module Item Done
Mark a module item as done to satisfy a 'mark as done' completion requirement. Shows in your instructor's progress view.
item_idrequiredcourse_idrequiredmodule_idrequiredMark Module Item Read
Mark a module item as viewed to satisfy a 'must view' requirement, without opening it. Shows in your instructor's progress view.
item_idrequiredcourse_idrequiredmodule_idrequiredSelect Mastery Path
Choose which branch to follow at a mastery path (conditional release) point in a module. Unlocks that branch's assignments and may not be reversible. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmitem_idrequiredcourse_idrequiredmodule_idrequiredassignment_set_idrequiredGet Module Item Sequence
Show where a piece of content sits in its module: the previous and next items, so you can work through a module in order. Read-only.
asset_idrequiredcourse_idrequiredasset_typerequiredList Media Objects
List recorded lectures and other video or audio in a course with titles and media IDs. Read-only. Get captions with get_media_captions or download_media_captions.
pagelimitcourse_idrequiredGet Media Captions
List the caption (subtitle) tracks on a recorded lecture with their languages and IDs. Read-only. Captions are the closest thing to a transcript; save one with download_media_captions.
media_idrequiredDownload Media Captions
Download a lecture's caption track and save it as a text transcript on local disk. Returns the saved path. Get media_id from list_media_objects and track_id from get_media_captions.
dest_dirmedia_idrequiredtrack_idCreate Content Export
Start a course export as a .imscc Common Cartridge or a zip of files. Canvas packages it in the background; poll get_content_export with the returned ID. export_course_archive does export and download in one step.
course_idrequiredexport_typeGet Content Export
Check a course export's status and get its download URL once Canvas has finished. Read-only. Start an export with create_content_export.
course_idrequiredexport_idrequiredList External Tools
List external (LTI) tools enabled in a course, such as publisher platforms or proctoring apps, with their IDs. Read-only. Open one with get_tool_launch_url.
pagelimitcourse_idrequiredGet Tool Launch URL
Get a one-time launch URL for an external (LTI) tool in a course, so you can open it directly in a browser. Read-only. Get tool_id from list_external_tools. The URL expires quickly.
urltool_idcourse_idrequiredList Conferences
List web conferences in a course (BigBlueButton or similar) with titles, status and join links. Read-only. Returns an empty list if conferences are not enabled.
pagelimitcourse_idrequiredList Collaborations
List collaborative documents in a course (Google Docs or Microsoft 365 integrations) with titles and links. Read-only.
pagelimitcourse_idrequiredList Eportfolios
Your Canvas ePortfolios (showcase sites of your work). Read-only; Canvas does not let other apps add entries, so edit them in Canvas itself.
pagelimitinclude_deletedGet Eportfolio Pages
The pages of one of your ePortfolios, with their text. Read-only.
limiteportfolio_idrequiredList My Groups
List the student groups you belong to across all courses, with group IDs and course. Read-only. Use the IDs with the other group tools.
pagelimitGet Group
Get one student group: name, description, member count and the course it belongs to. Read-only. Get group_id from list_my_groups.
group_idrequiredList Group Members
List the members of a student group with names and user IDs. Read-only. Get group_id from list_my_groups.
pagelimitgroup_idrequiredList Group Discussions
List discussion topics inside a group workspace with titles and unread counts. Read-only. Post to one with post_group_discussion.
pagelimitgroup_idrequiredList Group Files
List files shared in a group workspace with names, sizes and IDs. Read-only. Save one with download_file.
pagelimitgroup_idrequiredList Group Pages
List wiki pages in a group workspace with titles and URL slugs. Read-only.
pagelimitgroup_idrequiredPost Group Discussion
Post to a discussion inside a group workspace. Visible to your groupmates and instructors. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmmessagerequiredgroup_idrequiredtopic_idrequiredList Group Categories
List the group sets in a course (e.g. "Project teams") and whether you can sign up yourself. Read-only. Join an open group with join_group.
pagelimitcourse_idrequiredJoin Group
Join a self-signup student group. Groupmates and instructors see that you joined. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmgroup_idrequiredLeave Group
Leave a student group you belong to. You lose access to its workspace. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
confirmgroup_idrequiredGet Group Activity Stream
Get recent activity in a group workspace: new discussion posts, files and announcements, newest first. Read-only. Text written by others is fenced as untrusted.
pagelimitgroup_idrequiredList Rubrics
List the rubrics in a course with titles, point totals and IDs. Read-only. Read one in full with get_rubric.
pagelimitcourse_idrequiredGet Rubric
Get a full rubric: every criterion, rating level and point value. Read-only. Read it before starting work to know how it will be scored; get_rubric_assessment shows how your submission was scored.
course_idrequiredrubric_idrequiredGet My Rubric Assessment
Get how the rubric was applied to your submission: points and comment for each criterion, plus your score. Read-only. Returns no assessment if the instructor did not grade with a rubric. get_rubric_assessment returns the same data plus the compact rubric_assessment form.
course_idrequiredassignment_idrequiredList My Peer Reviews
List peer reviews assigned to you that you still need to complete, in one course or all active courses. Read-only. Checks both the assignment endpoint and the Planner feed, since either alone can miss items. Submit with submit_peer_review.
course_idGet Peer Review Assignment
Get the peer reviews set up on one assignment: who reviews whom and whether each is complete. Read-only. Use list_my_peer_reviews for just the reviews you still owe.
course_idrequiredassignment_idrequiredSubmit Peer Review
Submit your peer review of a classmate's work: a comment and, optionally, rubric scores. The classmate and instructor can see it. Get student_id from list_my_peer_reviews. [IRREVERSIBLE: call without confirm=true first to preview, then re-call with confirm=true. Apps that can ask the user directly will show a confirmation instead.]
commentrequiredconfirmcourse_idrequiredstudent_idrequiredassignment_idrequiredrubric_assessment90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
Your AI app (web / desktop / mobile / CLI) │ HTTPS + OAuth ▼ your-domain.ngrok-free.dev ──► supervisor.js ──► index.js (127.0.0.1:3939/mcp) ──► Canvas API (or a Cloudflare hostname) (keeps it alive, (237 tools, OAuth, status page, failover) phone alerts)npm install -g canvas-lms-mcp-remotemkdir canvas-mcpcd canvas-mcpcanvas-lms-mcp-remote initwinget install --id Ngrok.Ngrok -engrok update # the winget version is often too old (ERR_NGROK_121)ngrok config add-authtoken <your-ngrok-authtoken>node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"canvas-lms-mcp-remote doctorcanvas-lms-mcp-remotecanvas-lms-mcp-remote install-service$dir = (Get-Location).Path$action = New-ScheduledTaskAction -Execute "$dir\run-supervisor.cmd" -WorkingDirectory $dir$trigger = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"$settings = New-ScheduledTaskSettingsSet -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit ([TimeSpan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNewRegister-ScheduledTask -TaskName CanvasSupervisor -Action $action -Trigger $trigger -Settings $settings -ForceStart-ScheduledTask -TaskName CanvasSupervisordocker compose up -dStop-ScheduledTask -TaskName CanvasSupervisor -ErrorAction SilentlyContinueGet-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -match 'supervisor\.js|index\.js' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }Get-Process ngrok -ErrorAction SilentlyContinue | Stop-Process -ForceStart-ScheduledTask -TaskName CanvasSupervisor