关于 Canvas MCP Server v2.0
这是一个用于 Canvas LMS 的 MCP 服务,提供课程、作业、选课和成绩管理的工具。它同时面向学生、教师和账户管理员,并支持 stdio 与 Streamable HTTP 两种传输方式。
主要功能
- 01课程、作业、模块与讨论等学生工具
- 02教师评分、测验与评价标准工具
- 03账户管理、用户创建与报表生成工具
- 04stdio 与 Streamable HTTP 传输
- 05Docker 与 Kubernetes 部署文件
适用场景
- 01在 Claude Desktop 中查询作业与成绩
- 02教师批量创建课程与作业
- 03管理员生成注册与成绩报表
MCP 相关
该项目是一个 MCP 服务,将 Canvas LMS API 暴露为 MCP 工具供客户端调用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Canvas MCP Server v2.3.0
安全与披露历史
本项目是一个独立的 Canvas LMS API MCP 服务。它与 Instructure 或 Canvas 无关联,也未获得其认可或维护。
2025 年 6 月,在开发此 MCP 时,我在 bootcampspot.instructure.com 的 Canvas 环境中发现了一个访问控制失效问题。该问题暴露了我所选课程中其他学生的个人身份信息。
我于 2025 年 6 月 5 日通过 Bugcrowd 报告了此问题,并直接联系了 Instructure / Canvas 的安全渠道。Bugcrowd 后来将该报告关闭,并标记为“Not Applicable”。在随后的通信中,Instructure 表示 bootcampspot.instructure.com 环境不在其控制范围内。
公开资料:
- 披露讨论帖:https://www.reddit.com/r/cybersecurity/comments/1t6wmkw/reported_a_broken_access_control_bug_to/
- Bugcrowd 活动时间线:https://imgur.com/gallery/canvas-vuln-declared-n-11-months-ago-zYfHnBs
- 后续与 Instructure / BootcampSpot 的通信:https://imgur.com/a/BnhgXme
本仓库不会发布漏洞利用步骤、除已公开信息之外的受影响租户详情、可访问的实时 URL、包含学生数据的截图或概念验证滥用流程。
此外,Instructure 于 2026 年 5 月公开披露了一起 Canvas 安全事件,公开报道将该事件与 ShinyHunters 的声明联系起来。本仓库不声称 2025 年 6 月的报告导致、促成或预测了 2026 年 5 月的事件,也不声称两者存在技术关联。
此处记录此披露仅用于项目历史记录和信息透明。
项目简介
一个全面的 Canvas LMS 模型上下文协议(MCP)服务,具备完整的学生、教师和账户管理功能
🚀 v2.3.0 新功能
- 🌐 新增:支持 Streamable HTTP 传输(
MCP_TRANSPORT=streamable-http) - 🖥️ 保留:为本地 MCP 客户端提供一流的 stdio 传输支持
- 🧪 新增:针对生命周期、传输方式和结构化故障错误的行为测试
- 🧱 改进:更严格的工具架构,以及面向 codemode 的工具描述
- 🔧 已修复:课程创建时出现“找不到页面”错误(缺少
account_id参数) - 👨💼 账户管理:完整的账户级管理工具
- 📊 报告与分析:生成并访问 Canvas 账户报告
- 👥 用户管理:在账户级别创建和管理用户
- 🏢 多账户支持:处理账户层级结构和子账户
- ✅ API 合规性:所有端点现在均遵循规范的 Canvas API 模式
🎯 主要功能
🎓 面向学生
- 课程管理:访问所有课程、大纲和课程资料
- 作业工作流:查看、提交(文本/URL/文件)并跟踪作业
- 沟通交流:参与讨论、阅读公告、发送消息
- 进度跟踪:查看成绩、模块完成情况和日历事件
- 测验:参加测验、查看结果和反馈
- 文件访问:浏览和下载课程文件与资源
👨🏫 面向教师
- 课程创建:创建和管理课程结构*(现已支持正确的账户关联)*
- 评分:评阅提交内容、提供反馈、管理评分标准
- 用户管理:注册学生、管理权限
- 内容管理:创建作业、测验和讨论
👨💼 面向账户管理员(新增!)
- 账户管理:管理机构的 Canvas 账户
- 用户管理:在多个账户中创建和管理用户
- 课程监管:列出并管理账户中的所有课程
- 报告:生成注册、成绩和活动报告
- 子账户管理:处理账户层级结构
🛠️ 技术卓越
- 健壮的 API:自动重试、分页、全面的错误处理
- 云就绪:Docker 容器、Kubernetes 清单、健康检查
- 经过充分测试:单元测试、集成测试、模拟、覆盖率报告
- 类型安全:完整的 TypeScript 实现,使用严格类型
- 50+ 个工具:全面覆盖 Canvas LMS 功能
快速开始
选项 1:Claude Desktop 集成(推荐的 MCP 配置)
添加到 claude_desktop_config.json:
{
"mcpServers": {
"canvas-mcp-server": {
"command": "npx",
"args": ["-y", "canvas-mcp-server"],
"env": {
"CANVAS_API_TOKEN": "your_token_here",
"CANVAS_DOMAIN": "your_school.instructure.com"
}
}
}
}
选项 2:NPM 包
# Install globally
npm install -g canvas-mcp-server
# Configure
export CANVAS_API_TOKEN="your_token_here"
export CANVAS_DOMAIN="your_school.instructure.com"
# Run
canvas-mcp-server
选项 3:Docker
docker run -d \
--name canvas-mcp \
-p 3000:3000 \
-e CANVAS_API_TOKEN="your_token" \
-e CANVAS_DOMAIN="school.instructure.com" \
-e MCP_TRANSPORT="streamable-http" \
-e MCP_HTTP_HOST="0.0.0.0" \
-e MCP_HTTP_PORT="3000" \
-e MCP_HTTP_PATH="/mcp" \
ghcr.io/dmontgomery40/mcp-canvas-lms:latest
传输模式
该服务支持两种明确的传输模式:
stdio(默认):适用于 Claude Desktop/Codex/Cursor 本地 MCP 接入。streamable-http:适用于本地 HTTP 集成和容器化工作流。
传输环境变量
# Required Canvas auth
CANVAS_API_TOKEN=your_token
CANVAS_DOMAIN=your_school.instructure.com
# Transport selection
MCP_TRANSPORT=stdio # or streamable-http
# Streamable HTTP settings
MCP_HTTP_HOST=127.0.0.1
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
MCP_HTTP_STATEFUL=true
MCP_HTTP_JSON_RESPONSE=true
MCP_HTTP_ALLOWED_ORIGINS=
💼 账户管理员工作流示例
创建新课程(已修复!)
"Create a new course called 'Advanced Biology' in account 123"
现在可以通过必需的 account_id 参数正确创建课程
管理用户
"Create a new student user John Doe with email [email protected] in our main account"
使用适当的化名和选课设置创建用户账户
生成报告
"Generate an enrollment report for account 456 for the current term"
为机构分析启动 Canvas 报告系统
列出账户课程
"Show me all published Computer Science courses in our Engineering account"
跨账户课程目录进行高级筛选和搜索
🎓 学生工作流示例
查看今天的作业
"What assignments do I have due this week?"
列出即将到期的作业,包含截止日期、分值和提交状态
提交作业
"Help me submit my essay for English 101 Assignment 3"
指导用户通过文本提交作业,并提供格式选项
查看成绩
"What's my current grade in Biology?"
显示当前分数、成绩和作业反馈
参与讨论
"Show me the latest discussion posts in my Philosophy class"
显示近期讨论主题,并支持发布回复
跟踪进度
"What modules do I need to complete in Math 200?"
显示模块完成状态和接下来需要完成的项目
获取 Canvas API 令牌
- 登录 Canvas → 账户 → 设置
- 滚动到“已批准的集成”
- 点击“+ 新建访问令牌”
- 输入描述:“Claude MCP Integration”
- 复制生成的令牌并安全保存!
⚠️ 账户管理员须知:对于账户级操作,请确保 API 令牌拥有管理员权限。
生产环境部署
Docker Compose
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
cp .env.example .env
# Edit .env with your Canvas credentials
docker-compose up -d
Kubernetes
kubectl create secret generic canvas-mcp-secrets \
--from-literal=CANVAS_API_TOKEN="your_token" \
--from-literal=CANVAS_DOMAIN="school.instructure.com"
kubectl apply -f k8s/
健康监控
# Check application health
curl http://localhost:3000/health
# Or use the built-in health check
npm run health-check
开发
# Setup development environment
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
npm install
# Start development with hot reload
npm run dev:watch
# Run tests
npm run test
npm run coverage
# Code quality
npm run lint
npm run type-check
📚 可用工具(50+ 个)
🎓 学生核心工具(点击展开)
canvas_health_check- 检查 API 连通性canvas_list_courses- 列出所有课程canvas_get_course- 获取课程详细信息canvas_list_assignments- 列出课程作业canvas_get_assignment- 获取作业详情canvas_submit_assignment- 提交作业canvas_get_submission- 检查提交状态canvas_list_modules- 列出课程模块canvas_get_module- 获取模块详情canvas_list_module_items- 列出模块中的项目canvas_mark_module_item_complete- 将项目标记为已完成canvas_list_discussion_topics- 列出讨论主题canvas_get_discussion_topic- 获取讨论详情canvas_post_to_discussion- 在讨论中发帖canvas_list_announcements- 列出课程公告canvas_get_user_grades- 获取你的成绩canvas_get_course_grades- 获取课程成绩canvas_get_dashboard- 获取仪表板信息canvas_get_dashboard_cards- 获取课程卡片canvas_get_upcoming_assignments- 获取截止日期canvas_list_calendar_events- 列出日历事件canvas_list_files- 列出课程文件canvas_get_file- 获取文件详情canvas_list_folders- 列出课程文件夹canvas_list_pages- 列出课程页面canvas_get_page- 获取页面内容canvas_list_conversations- 列出消息canvas_get_conversation- 获取对话详情canvas_create_conversation- 发送消息canvas_list_notifications- 列出通知canvas_get_syllabus- 获取课程大纲canvas_get_user_profile- 获取用户个人资料canvas_update_user_profile- 更新个人资料
👨🏫 教师工具(点击展开)
canvas_create_course- 创建新课程 (已修复:现在需要 account_id)canvas_update_course- 更新课程设置canvas_create_assignment- 创建作业canvas_update_assignment- 更新作业canvas_list_assignment_groups- 列出作业组canvas_submit_grade- 为提交评分canvas_enroll_user- 注册学生canvas_list_quizzes- 列出课程测验canvas_get_quiz- 获取测验详情canvas_create_quiz- 创建测验canvas_start_quiz_attempt- 开始测验尝试canvas_list_rubrics- 列出课程评分标准canvas_get_rubric- 获取评分标准详情
👨💼 账户管理工具(新增!)
canvas_get_account- 获取账户详情canvas_list_account_courses- 列出账户中的课程canvas_list_account_users- 列出账户中的用户canvas_create_user- 在账户中创建新用户canvas_list_sub_accounts- 列出子账户canvas_get_account_reports- 列出可用报告canvas_create_account_report- 生成账户报告
🔧 v2.2.0 中的破坏性变更
课程创建修复
之前(存在问题):
{
"tool": "canvas_create_course",
"arguments": {
"name": "My Course" // ❌ Missing account_id - caused "page not found"
}
}
之后(已修复):
{
"tool": "canvas_create_course",
"arguments": {
"account_id": 123, // ✅ Required account_id
"name": "My Course",
"course_code": "CS-101"
}
}
🌟 Claude 对话示例
学生:"我需要查看即将到期的作业,并提交我的英语作文。
Claude:我来帮你查看即将到期的作业,然后协助你提交英语作文。我先获取即将到期的作业……
[Claude 使用 canvas_get_upcoming_assignments,然后通过 canvas_submit_assignment 提供帮助]
教师:“在科学系创建一门新的高级物理课程,并为我招募一名助教。”
Claude:我来帮你在科学系账户中创建高级物理课程,然后为课程招募助教……
[Claude 使用 canvas_create_course 并提供正确的 account_id,然后使用 canvas_enroll_user]
管理员:“生成本学期所有计算机科学课程的选课报告。”
Claude:我来为你的计算机科学课程生成一份全面的选课报告……
[Claude 使用带筛选条件的 canvas_list_account_courses,然后使用 canvas_create_account_report]
🔍 故障排除
常见问题:
- ❌ 401 未授权:检查 API 令牌和权限
- ❌ 404 未找到:确认课程 / 作业 ID 和访问权限
- ❌ 创建课程时显示“找不到页面”:更新到 v2.2.0,以修复 account_id 问题
- ❌ 超时:增大
CANVAS_TIMEOUT的值或检查网络连接
调试模式:
export LOG_LEVEL=debug
npm start
健康检查:
npm run health-check
🤝 参与贡献
欢迎贡献!请参阅 CONTRIBUTING.md 了解指南。
快速配置贡献环境
git clone https://github.com/DMontgomery40/mcp-canvas-lms.git
cd mcp-canvas-lms
npm install
npm run dev:watch
# Make changes, add tests, submit PR
📈 路线图
- v2.3:增强报告功能、批量操作、高级搜索
- v2.4:支持移动设备、离线功能、分析仪表板
- v3.0:多租户、GraphQL API、AI 驱动的洞察
🙋 支持与社区
- 🐛 错误报告:GitHub Issues
- 💬 问题:GitHub Discussions
- 📖 文档:Wiki
附录:实践中的 MCP(代码执行、工具规模与安全)
最后更新:2026-03-23
编写本附录的原因
MCP 仍是 Agent 工具互操作最实用的层之一。需要权衡的是,大型 MCP 服务可能会暴露数十种工具,而朴素的工具调用可能会让工具架构、调用轨迹和低信号信息充斥上下文窗口。
在实践中,只有编排保持令牌高效,且执行行为受到约束,更大的工具集才能发挥作用。
转向代码执行 / 代码模式
近期的生产工作流将编排从对话轮次转移到可执行循环中。这能降低上下文开销、提高确定性,并使运行过程可审计。
核心阅读:
面向高级用户的推荐配置
若要以更低噪声、可重复的方式使用 MCP,请从面向代码模式的路由开始:
即使配置完善,不同提供商和版本下的模型行为也可能不稳定。请保留重试机制和确定性回退方案。
Peter Steinberger 工作流模式
一种高效模式是将范围广泛的 MCP 工具集转化为更精简的 CLI / 任务接口:
哪些 MCP 客户端适合搭配哪些场景
- Claude Code / Codex / Cursor Agent 工作流:通常适合直接使用 MCP 并搭配代码执行循环。
- 轻量托管聊天客户端:通常使用封装后的 CLI / 网关比直接暴露所有原始工具更安全。
- 工具数量较多的服务:通常拆分成面向特定任务的网关效果更好。
这个生态发展迅速。如果你现在阅读本文,本节的部分内容可能已经过时。
提示词注入:风险、后果与缓解措施
提示词注入仍是使用工具的 Agent 面临的一个未解决问题。它可以得到控制,但尚未解决。
主要风险:
- 检索内容或工具输出中包含隐藏指令。
- 通过意外调用窃取机密 / 令牌。
- 未经授权地更改系统或数据状态。
基本缓解措施:
- 使用遵循最小权限原则的凭据和受限令牌。
- 使用目标 / 操作允许列表,并严格验证架构。
- 执行破坏性操作前征得人工确认。
- 使用沙盒执行并限制资源。
- 采用结构化日志记录和可重放的执行轨迹。
除非经过明确验证,否则应将每项工具输出都视为不可信输入。
📄 许可证
MIT 许可证 - 详情请参阅 LICENSE 文件。
通过无缝集成 Canvas,为学生、教育工作者和管理员赋能
⭐ 如果这个仓库对你有帮助,请点亮星标! ⭐
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。