跳到正文

boyuchengz

canvas-mcp

Read-only MCP server that connects Claude, ChatGPT and other AI assistants to Canvas LMS.

README 已保存到本站,可直接阅读

Documentation snapshot

README 快照

这篇是英文原文

下面正文是项目自己的英文 README。想读全文就用浏览器自带的整页翻译: Chrome / Edge 点地址栏右侧的翻译图标,或用右键菜单里的「翻译成中文」; 手机浏览器一般在菜单里。

本页保存的是公开项目资料快照,阅读过程不需要连接 GitHub。

canvas-mcp

图片:CI 图片:License: MIT 图片:Node.js 图片:MCP

English | 简体中文

A read-only Model Context Protocol server for Canvas LMS. Deploy it once, add it as a custom connector in Claude or ChatGPT, and ask questions about your courses in plain language:

What’s due this week, and which of it have I already submitted? What do I need on the final to keep an A in CS 225? Summarize the announcements from the last two weeks. Did the TA leave any comments on my last lab?

Every one of the 26 tools issues GET requests only. The server cannot submit, post, delete or mark anything as read, so even a leaked connector URL only exposes what you could already see.

Contents

  • Features
  • Tools
  • How it works
  • Quick start
  • Connecting a client
  • Configuration
  • Security
  • Limitations
  • Development
  • Contributing
  • License

Features

  • Every tool is read-only. No write endpoints are wrapped, and inbox threads and discussions are fetched without marking them as read.
  • The tools are built around the questions students actually ask: deadlines across all courses, missing work, grade weights, feedback and syllabus policies.
  • Output is compact. Canvas HTML becomes plain text, and responses keep only the fields a model needs.
  • It runs remotely over Streamable HTTP, so it works in web and mobile clients, not only desktop apps.
  • It’s stateless. Each request gets a fresh server instance, and nothing is cached or stored.
  • Three runtime dependencies, no build step, no database.

Tools

AreaToolWhat it returns
Courseslist_coursesActive courses with IDs, codes and terms
get_syllabusSyllabus text
get_front_pageCourse home page text
list_modulesModules and the items inside each
list_pages / get_pageWiki pages and their contents
list_course_staffInstructors and TAs, with email when visible
list_groupsYour project / lab groups
Courseworkget_upcomingEverything due in the next N days, with submission status
get_todoCanvas To Do list
get_missingPast-due work you haven’t submitted
list_assignments / get_assignmentAssignments, instructions, rubric, your score and feedback
list_quizzes / get_quizClassic Quizzes, settings and your attempts
get_calendar_eventsLectures, exams and office hours from the calendar
Gradesget_gradesCurrent and final score in every course
get_grade_breakdownAssignment groups, weights, drop rules and every score
Fileslist_files / get_fileCourse files; text-based files are returned inline
Communicationget_announcementsRecent announcements across courses
list_discussions / get_discussionDiscussion topics and full reply threads
list_inbox / get_inbox_messageInbox conversations and messages
get_recent_activityActivity stream: new grades, comments, replies

Parameters and output fields for each tool are documented in docs/tools.md.

How it works

flowchart LR
    A[Claude / ChatGPT] -- "MCP over HTTPS/<MCP_SECRET>/mcp" --> B[canvas-mcp]
    B -- "GET /api/v1/...Bearer CANVAS_API_TOKEN" --> C[Canvas LMS]

The AI client calls the server at a URL that contains a long random secret. The server checks the secret in constant time, translates the tool call into one or more Canvas REST API GET requests using your personal access token, follows pagination, and returns a trimmed JSON result. The Canvas token never leaves the server.

Quick start

1. Create a Canvas access token

In Canvas, open Account → Settings, scroll to Approved Integrations, and click + New Access Token. Give it a purpose (e.g. “canvas-mcp”) and an expiry date, then copy the token. Canvas only shows it once.

Some institutions restrict personal access tokens. Check your school’s acceptable-use policy before deploying.

2. Generate a connector secret

node -e "console.log(require('crypto').randomBytes(24).toString('hex'))"

3. Deploy

The server runs anywhere Node.js 20+ can accept HTTPS traffic. Railway is the quickest option:

npm i -g @railway/cli
railway login
railway init
railway up

Then, in the Railway dashboard:

  1. Variables: add CANVAS_BASE_URL, CANVAS_API_TOKEN and MCP_SECRET.
  2. Settings → Networking: click Generate Domain.

Your connector URL is:

https:////mcp

Render, Fly.io, a VPS and local setups are covered in docs/deployment.md.

Connecting a client

Claude (claude.ai, desktop and mobile): open Settings → Connectors, choose Add custom connector, and paste the connector URL. Leave the OAuth fields empty.

ChatGPT: enable developer mode for connectors, create a new connector, paste the connector URL and choose No authentication.

Claude Code:

claude mcp add --transport http canvas https:////mcp

Any other MCP client that supports the Streamable HTTP transport can use the same URL.

Start a conversation with something like “List my Canvas courses” to confirm it works.

Configuration

VariableRequiredDescription
CANVAS_BASE_URLyesYour Canvas instance, e.g. https://canvas.instructure.com or https://canvas..edu
CANVAS_API_TOKENyesPersonal access token from Canvas
MCP_SECRETyesRandom string of at least 24 URL-safe characters (A–Z a–z 0–9 - _); becomes part of the connector URL
PORTnoPort to listen on. Defaults to 8080; most platforms set it for you

The server validates all variables at startup and exits with a clear message if anything is missing.

Security

  • The Canvas client only exposes GET helpers, so there is no code path that writes to Canvas.
  • Requests without the correct secret get the same 404 as any unknown URL, and the secret is compared in constant time.
  • The Canvas token is only sent to CANVAS_BASE_URL. Pagination links to any other host are ignored, and file downloads use Canvas’s pre-signed URLs without the token.
  • Nothing is cached or stored, and only errors are logged.

Treat the connector URL like a password: anyone who has it can read your Canvas data. If it leaks, change MCP_SECRET and redeploy. If your Canvas token leaks, delete it under Approved Integrations.

See SECURITY.md for how to report a vulnerability.

Limitations

  • Each deployment serves one user, since the server acts as whoever owns the token. Run a separate instance for each person.
  • PDFs, slides and Office files aren’t parsed. get_file returns a temporary download link for them instead.
  • New Quizzes appear in list_assignments, not list_quizzes, and the Canvas API never exposes quiz questions to students.
  • Lists are capped at 500 items (5 pages of 100) per call, and long text at 20,000 characters.
  • get_calendar_events without a course_id covers at most 10 courses, which is a Canvas API limit.

Development

git clone https://github.com/boyuchengz/canvas-mcp.git
cd canvas-mcp
npm install
cp .env.example .env   # fill in your values
npm run dev            # restarts on file changes
npm test

Inspect the running server interactively with the MCP Inspector:

npx @modelcontextprotocol/inspector
# Transport: Streamable HTTP, URL: http://localhost:8080//mcp

Project structure

src/
├── server.js            Entry point: config, HTTP listener, graceful shutdown
├── app.js               Express app, secret check, MCP transport
├── config.js            Environment validation
├── canvas.js            Read-only Canvas REST client with pagination
├── text.js              HTML → plain text
└── tools/
    ├── courses.js       Courses, syllabus, modules, pages, staff, groups
    ├── coursework.js    Planner, to-do, assignments, quizzes, calendar
    ├── grades.js        Course totals and grade breakdown
    ├── files.js         File listing and content
    └── communication.js Announcements, discussions, inbox, activity
test/                    node:test suites (no network access needed)

Contributing

Bug reports, feature ideas and pull requests are welcome. Please read CONTRIBUTING.md first. New tools must stay read-only.

License

MIT © Boyucheng Zhang

This project is not affiliated with or endorsed by Instructure, Inc. Canvas is a trademark of Instructure, Inc.

Official distribution

获取与安装

暂未发现可确认的官方软件包地址

当前 README 快照没有出现 npm、PyPI、Crates.io、pub.dev 等官方包页链接。本站不会根据仓库名称猜测下载地址。

本站不托管项目文件;需要安装时,请以项目维护者发布的官方文档为准。

使用前核验

本站保存公开资料用于阅读,不代表安全审计或功能背书。安装前请核对许可证、依赖来源和发布签名,不要直接运行来源不明的二进制文件或高权限脚本。