Canvas LMS MCP服务器

一个为Canvas学习管理系统提供完整学生、教师和账户管理功能的MCP服务器。

  • by DMontgomery40
  • JavaScript
  • 本地部署
  • 104 星标
  • 更新于
在 GitHub 查看 DMontgomery40/mcp-canvas-lms

使用说明

Canvas MCP服务器v2.3.0

安全和披露历史

该项目是一个用于Canvas LMS API的独立MCP服务器。它不隶属于Instructure或Canvas,也不由其背书或维护。

2025年6月,在开发此MCP的过程中,我在bootcampspot.instructure.com的Canvas环境中发现了一个访问控制中断问题。该问题暴露了我课程中其他学生的个人身份信息。

我于2025年6月5日通过Bugcrowd报告了这个问题,并直接联系了Instructure/Canvas安全渠道。Bugcrowd报告后来被关闭为“不适用”。在随后的通信中,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
  • 后续指导/训练现场通信:https://imgur.com/a/BnhgXme

此存储库不会发布漏洞利用步骤、已公开的受影响租户详细信息、实时URL、包含学生数据的屏幕截图或概念验证滥用流。

另外,Instructure于2026年5月公开披露了Canvas安全事件,公开报道将该事件与ShinyHunters的说法联系起来。该存储库没有声称2025年6月的报告导致、启用、预测或在技术上与2026年5月的事件有关。

本披露仅用于项目历史和透明度。

这是什么

用于Canvas LMS的全面模型上下文协议(MCP)服务器,具有完整的学生、讲师和帐户管理功能

🚀 v2.3.0的新增功能

  • 🌐 新:流式HTTP传输支持(MCP_TRANSPORT=streamable-http)
  • 🖥️ 保存的:本地MCP客户端的一流stdio传输
  • 🧪 添加:生命周期、传输和结构化故障路径错误的行为测试
  • 🧱 改进:更严格的工具模式和面向代码模式的工具描述
  • 🔧 固定的:课程创建“找不到页面”错误(缺失 account_id 参数)
  • 👨‍💼 账户管理:完整的帐户级管理工具
  • 📊 报告和分析:生成和访问Canvas帐户报告
  • 👥 用户管理:在帐户级别创建和管理用户
  • 🏢 多账户支持:处理帐户层次结构和子帐户
  • ✅ API合规性:所有端点现在都遵循正确的Canvas API模式

🎯 主要特点

🎓 对于学生

  • 课程管理:访问所有课程、教学大纲和课程材料
  • 分配工作流程:查看、提交(文本/URL/文件)和跟踪作业
  • 沟通:参与讨论、阅读公告、发送消息
  • 进度跟踪:监控成绩、模块完成情况和日历事件
  • 测验:参加测验,查看结果和反馈
  • 文件访问:浏览和下载课程文件和资源

👨‍🏫 对于讲师

  • 课程创建:创建和管理课程结构 (现在有适当的帐户支持)
  • 评分:评分提交、提供反馈、管理评分标准
  • 用户管理:注册学生,管理权限
  • 内容管理:创建作业、测验、讨论

👨‍💼 帐户管理员(新增!)

  • 账户管理:管理机构Canvas账户
  • 用户管理:跨帐户创建和管理用户
  • 课程监督:列出并管理账户中的所有课程
  • 报告:生成注册、成绩和活动报告
  • 子账户管理:处理帐户层次结构和结构

🛠️ 技术卓越

  • 强劲的API:自动重试、分页、全面的错误处理
  • 云就绪:Docker容器、Kubernetes清单、健康检查
  • 测试良好:单元测试、集成测试、模拟、覆盖率报告
  • 类型安全:具有严格类型的完整TypeScript实现
  • 50+工具:全面覆盖Canvas LMS功能

快速开始

选项1:Claude桌面集成(推荐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 john.doe@school.edu 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令牌

  1. 登录Canvas → 账户→ 设置
  2. 滚动到“已批准的集成”
  3. 点击“+新访问令牌”
  4. 输入描述:“克劳德MCP集成”
  5. 复制生成的令牌 安全保存!

⚠️ 帐户管理员备注:对于帐户级操作,请确保您的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+工具)

🎓 Core Student Tools (Click to expand)
  • 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 -更新个人资料
👨‍🏫 Instructor Tools (Click to expand)
  • 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 -获取量规详细信息
👨‍💼 Account Management Tools (NEW!)
  • 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"
  }
}

🌟 克劳德对话示例

学生: “我需要检查我即将到来的作业并提交我的英语论文”

克劳德: 我会帮你检查你即将完成的作业,然后协助你提交英语论文。让我从你即将到来的任务开始。..

[克劳德使用 canvas_get_upcoming_assignments 然后帮助 canvas_submit_assignment]


导师: “在科学系开设一门新的高级物理课程,并招收我的助教”

克劳德: 我将帮助您在科学系帐户中创建高级物理课程,然后注册助教。..

[克劳德使用 canvas_create_course 使用正确的account_id,然后 canvas_enroll_user]


管理员: “生成本学期所有计算机科学课程的报名报告”

克劳德: 我将为您的计算机科学课程生成一份全面的注册报告。..

[克劳德使用 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

🤝 贡献

我们欢迎捐款!看 贡献.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驱动的见解

🙋 支持与社区

附录:MCP实践(代码执行、工具规模和安全)

最后更新时间:2026-03-23

为何存在此附录

MCP仍然是代理工具中最有用的互操作层之一。权衡的是,大型MCP服务器可能会暴露数十个工具,而简单的工具调用可能会用工具模式、调用跟踪和低信号聊天淹没上下文窗口。

在实践中,只有当编排保持令牌效率并且执行行为受到限制时,更大的工具界面才会有所帮助。

转换到代码执行/代码模式

最近的生产工作流程将编排从对话转向可执行循环。这可以降低上下文开销,提高确定性,并使运行可审计。

核心阅读:

高级用户的推荐设置

为了实现低噪声、可重复的MCP使用,请从面向代码模式的路由开始:

即使有强大的设置,模型行为也可能在提供者和版本之间受到影响。保持重试和确定性回退。

Peter Steinberger工作流模式

一种高杠杆模式是将广泛的MCP工具表面变成更窄的CLI/任务界面:

什么最适合哪些MCP客户端

  • 克劳德代码/代码/光标代理工作流:通常适用于直接MCP+代码执行循环。
  • 瘦托管聊天客户端:使用打包的CLI/网关通常比完全暴露原始工具更安全。
  • 高工具数量的服务器:当拆分为狭窄的任务网关时,通常会更好。

这个生态系统变化很快。如果你现在正在阅读这篇文章,那么本节的部分内容可能已经过时了。

快速注射:风险、后果和缓解措施

对于使用工具的试剂来说,及时注射仍然是一个悬而未决的问题。这是可以管理的,但还没有解决。

主要风险:

  • 检索到的内容或工具输出中的隐藏指令。
  • 通过意外呼叫泄露秘密/令牌。
  • 系统或数据中未经授权的状态更改。

缓解基线:

  • 最小权限凭据和作用域令牌。
  • 目的地/动作匹配和严格的模式验证。
  • 人为确认破坏性操作。
  • 沙盒执行和资源限制。
  • 结构化日志记录和可回放的执行跟踪。

除非明确验证,否则将每个工具输出视为不受信任的输入。

📄 许可证

MIT许可证-请参阅 许可证 文件以获取详细信息。


Canvas MCP Server v2.2.0
Empowering students, educators, and administrators with seamless Canvas integration

⭐ 如果对你有帮助,请在这个仓库上签名! ⭐