Canvas LMS MCP Server
Canvas LMS MCP Server
一个 Model Context Protocol 服务器,为 MCP 客户端(Claude Desktop、Claude Code 或任何支持 MCP 的客户端)提供对您的 Canvas LMS 账户的只读访问。
它回答两个问题:
"我在修什么课,成绩如何?" — 活跃课程及当前成绩。
"我还有哪些作业没交,什么时候截止?" — 未完成作业及截止日期。
通信使用标准的 stdio 传输方式,因此客户端将服务器作为子进程启动。除了 MCP 流量外,不会向 stdout 写入任何内容。
要求
Node.js 18.17 或更高版本(服务器使用内置的
fetch)一个 Canvas 个人访问令牌
Related MCP server: Canvas MCP Server
安装
cd canvas-mcp-server
npm install配置
两个变量都是必需的;如果缺少任何一个,服务器会退出并显示明确的提示信息。
变量 | 描述 | 示例 |
| 您的 Canvas 实例根地址。末尾的 |
|
| 一个 Canvas 个人访问令牌。 |
|
获取 Canvas 访问令牌
登录 Canvas。
转到账户 → 设置。
在已批准的集成下,点击**+ 新建访问令牌**。
为其指定用途和(可选)到期日期,然后点击生成令牌。
立即复制令牌——Canvas 只显示一次。
令牌携带您的完整 Canvas 权限。请勿将其纳入版本控制,如果泄露,请从同一设置页面撤销它。
连接客户端
将服务器添加到您的 MCP 客户端配置中,指向 src/index.js 的绝对路径:
{
"mcpServers": {
"canvas": {
"command": "node",
"args": ["/absolute/path/to/canvas-mcp-server/src/index.js"],
"env": {
"CANVAS_API_URL": "https://asu.instructure.com",
"CANVAS_ACCESS_TOKEN": "your-token-here"
}
}
}
}Claude Desktop —
claude_desktop_config.json(macOS:~/Library/Application Support/Claude/,Windows:%APPDATA%\Claude\)。Claude Code —
claude mcp add canvas --env CANVAS_API_URL=... --env CANVAS_ACCESS_TOKEN=... -- node /absolute/path/to/canvas-mcp-server/src/index.js
编辑配置后重启客户端。
工具
list_courses_and_grades
您以学生身份活跃注册的每门课程,以及其当前成绩。
参数 | 类型 | 默认值 | 描述 |
| boolean |
| 同时包含已结束学期中的活跃注册。 |
当您的机构使用评分周期时,Canvas 会报告两次成绩:一次针对进行中的周期,一次针对整个课程。grades.scope 字段说明您正在查看的是哪一个:
current_grading_period— 分数涵盖进行中的评分周期,course_total_score/course_total_grade携带整个课程的数字。course_total— 机构不使用评分周期,因此分数就是课程总分。unavailable— Canvas 未返回带有成绩数据的注册信息。
在任一范围内,current_* 忽略尚未评分的作业,而 final_* 将未评分的作业计为零分。
{
"courses": [
{
"id": "101",
"name": "Full Stack Web Development",
"course_code": "GIT-411",
"term": "Fall 2026",
"term_start": "2026-08-20T00:00:00Z",
"term_end": "2026-12-18T00:00:00Z",
"enrollment_state": "active",
"grades": {
"current_score": 88.0,
"current_grade": "B+",
"final_score": 80.5,
"final_grade": "B-",
"scope": "current_grading_period",
"grading_period_title": "Fall Term",
"course_total_score": 91.4,
"course_total_grade": "A-"
},
"html_url": "https://asu.instructure.com/courses/101"
}
],
"course_count": 1,
"retrieved_at": "2026-09-01T12:00:00.000Z"
}list_upcoming_assignments
您活跃课程中仍未完成的作业,按截止日期排序,最近的在前。
参数 | 类型 | 默认值 | 描述 |
| integer 1–365, or |
| 向前查看多远。 |
| boolean |
| 包含从未提交的逾期作业。 |
| boolean |
| 包含没有截止日期的未完成作业。 |
| string[] | 所有活跃课程 | 限制为特定的 Canvas 课程 ID。 |
当作业已发布、可评分且未提交、未评分或未豁免时,该作业被视为未完成。具体来说,以下情况会被过滤掉:
任何带有提交时间戳的内容
处于
submitted、pending_review或graded状态的提交已豁免的作业
已有分数或成绩的作业(手动或纸质录入)
not_graded作业(考勤占位符等)未发布的作业
{
"assignments": [
{
"id": "9004",
"name": "Missed lab writeup",
"course_id": "101",
"course_name": "Full Stack Web Development",
"due_at": "2026-08-28T06:59:00.000Z",
"days_until_due": -4.2,
"overdue": true,
"points_possible": 25,
"submission_types": ["online_upload"],
"submission_state": "unsubmitted",
"missing": true,
"locked": false,
"unlock_at": null,
"lock_at": null,
"html_url": "https://asu.instructure.com/courses/101/assignments/9004"
}
],
"assignment_count": 1,
"courses_checked": 2,
"window": {
"from": "2026-09-01T12:00:00.000Z",
"to": "2026-09-15T12:00:00.000Z",
"include_overdue": true,
"include_undated": false
},
"errors": [],
"retrieved_at": "2026-09-01T12:00:00.000Z"
}如果某门课程无法读取——已结束、受限或其他错误——它会被列在 errors 中,其余课程仍会返回结果。
行为说明
分页。 Canvas 通过
Link标头对每个集合进行分页。客户端以每页 100 条记录跟随rel="next",每个端点最多 20 页,这样错误的响应就不会无限循环。并发。 每次最多从 5 门课程获取作业,以避免触及 Canvas 的速率限制。
当前学期。 默认只返回学期尚未结束的课程。Canvas 的默认学期没有结束日期,因此始终包含在内。
错误。 Canvas 的失败会以 MCP 工具错误的形式返回,携带状态码和 Canvas 自身的消息,并针对常见情况给出提示(401 → 令牌错误,404 → URL 错误)。
只读。 两个工具都标注了
readOnlyHint。服务器只发出GET请求,绝不会修改您的 Canvas 数据。
开发
npm test # 36 tests: API client, grade logic, filtering, and an end-to-end MCP round trip测试套件使用带有录制 Canvas 负载的 fetch 替身,因此无需网络或真实令牌。所有测试数据的日期都相对于测试运行的时刻。
src/
index.js MCP server: tool definitions, schemas, stdio wiring
canvas.js Canvas REST client: auth, pagination, error mapping
courses.js Active-course and grade normalization
assignments.js Outstanding-assignment filtering and due-date windows许可证
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceEnables interaction with Canvas LMS courses and assignments directly from your LLM, allowing you to retrieve, search, and summarize course information, check due dates, and access assignment details without leaving your AI assistant.4330
- FlicenseBqualityNot gradedmaintenanceProvides read-only access to Canvas LMS for students to retrieve courses, assignments, grades, files, discussions, and planner items. Includes optional NotebookLM integration for uploading course content to AI-powered study notebooks.45330
- AlicenseAqualityCmaintenanceEnables AI systems to interact with Canvas Learning Management System data, allowing users to access courses, assignments, quizzes, planner items, files, and syllabi through natural language queries.227MIT
- FlicenseBqualityDmaintenanceEnables interaction with Canvas LMS to access courses, modules, files, pages, assignments, submissions, announcements, upcoming deadlines, and syllabus.15
Related MCP Connectors
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
Voice-led, FSRS-scheduled flashcards from YouTube, PDFs, web, or text. Auto-graded quizzes.
Read-only access to your VortexIQ store data: audits, KPIs, alerts, Brand DNA, reports, Ask VIQ.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zwanner/canvas-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server