此仓库包含一个用于与 Canvas 学习管理系统 API 交互的 Model Context Protocol (MCP) 服务器实现。该服务器设计用于与 Claude Desktop 和其他 MCP 兼容客户端配合使用。
注意:最近重构为模块化架构以提高可维护性。旧的单体实现已归档。
Canvas MCP 服务器在 Claude Desktop 和 Canvas 学习管理系统之间架起了一座桥梁,为学生和教师提供了一个智能界面,以便与他们的 Canvas 环境进行交互。基于 Model Context Protocol (MCP),它实现了与 Canvas 数据的自然语言交互。
发布日期:2025年11月10日 | 查看完整发行说明
bulk_grade_submissions - 带有可选评分标准评估的高效批量评分bulk_grade_discussions - 节省令牌的讨论评分 APIsearch_canvas_tools - 动态发现可用的 MCP 工具get_assignment_details 工具中的描述截断问题(现在返回完整的 HTML 描述)获取 AI 助手的帮助:
通过以下方式提升教学效果:
通过系统性的数据匿名化实现完全的 FERPA 合规:
ENABLE_DATA_ANONYMIZATION=true)所有学生数据在到达 AI 系统之前都会被匿名化。有关配置详情,请参阅 教师指南。
Canvas MCP 可与任何支持 Model Context Protocol 的应用程序配合使用。流行的选项包括:
推荐:
AI 编码助手:
开发平台:
企业:
更多选项请参阅 官方 MCP 客户端列表。
注意:虽然 Canvas MCP 设计为与任何 MCP 客户端兼容,但本指南中的设置说明主要针对 Claude Desktop。其他客户端的配置可能有所不同。
# 安装 uv 包管理器(比 pip 更快)
pip install uv
# 安装包
uv pip install -e .
# 复制环境模板
cp env.template .env
# 编辑您的 Canvas 凭证
# 必需:CANVAS_API_TOKEN, CANVAS_API_URL
从 Canvas → 账户 → 设置 → 新建访问令牌 获取您的 Canvas API 令牌
学生注意事项:某些教育机构限制学生创建 API 令牌。如果您看到类似“您创建的访问令牌数量有限”或找不到创建令牌的选项,请联系您的机构 Canvas 管理员或 IT 支持部门请求 API 访问权限或帮助创建令牌。
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"canvas-api": {
"command": "canvas-mcp-server"
}
}
}
测试您的设置:
# 测试 Canvas API 连接
canvas-mcp-server --test
# 查看配置
canvas-mcp-server --config
# 启动服务器(手动测试用)
canvas-mcp-server
Canvas MCP 服务器提供了一整套与 Canvas LMS API 交互的工具。这些工具按逻辑分类,以便更好地发现和维护。
学生工具(新!)
共享工具(学生和教师)
教师工具
4. 作业工具 - 处理作业、提交和同伴评审,带有分析
5. 评分标准工具 - 评分标准的完整 CRUD 操作,包括验证、关联管理和评分(包括 bulk_grade_submissions 用于高效的批量评分)
6. 用户和注册工具 - 管理注册、用户和组
7. 分析工具 - 查看学生分析、作业统计和进度跟踪
8. 消息工具 - 发送消息和公告给学生
开发者工具
9. 发现工具 - 搜索和探索可用的代码执行 API 操作,使用 search_canvas_tools 和 list_code_api_modules
10. 代码执行工具 - 执行 TypeScript 代码,使用 execute_typescript 进行高效的批量操作(节省 99.7% 的令牌!)
Canvas MCP 现在支持 代码执行模式,以在执行批量操作时实现最大的令牌效率。
传统工具调用(适用于简单查询):
询问 Claude: “显示我的课程”
询问 Claude: “获取作业 123 的详细信息”
✅ 适用于:单个查询、小数据集、快速查找
批量评分工具(适用于带有预定义评分的批量评分):
询问 Claude: “根据特定的评分标准为这 10 名学生评分”
✅ 适用于:当您已经拥有评分/分数时的批量评分,同时进行并发处理
代码执行(适用于带有自定义逻辑的批量操作):
询问 Claude: “通过分析每个笔记本对所有 90 个 Jupyter 笔记本提交进行评分”
询问 Claude: “向尚未提交的学生发送提醒”
✅ 适用于:带有自定义分析逻辑的批量处理,大数据集,复杂条件
场景:对 90 个 Jupyter 笔记本提交进行评分
| 方法 | 令牌使用 | 效率 |
|---|---|---|
| 传统 | 1.35M 令牌 | 加载所有提交到上下文 |
| 代码执行 | 3.5K 令牌 | 99.7% 减少! 🎉 |
import { bulkGrade } from './canvas/grading/bulkGrade';
await bulkGrade({
courseIdentifier: "60366",
assignmentId: "123",
gradingFunction: (submission) => {
// 分析在本地进行,不在 Claude 的上下文中!
const notebook = submission.attachments?.find(f =>
f.filename.endsWith('.ipynb')
);
if (!notebook) return null; // 跳过
const hasErrors = analyzeNotebook(notebook.url);
return hasErrors ? null : {
points: 100,
rubricAssessment: { "_8027": { points: 100 } },
comment: "做得很好!没有错误。"
};
}
});
对带有初始帖子和同伴评审要求的讨论帖子进行评分:
import { bulkGradeDiscussion } from './canvas/discussions/bulkGradeDiscussion';
// 首先预览评分(干运行)
await bulkGradeDiscussion({
courseIdentifier: "60365",
topicId: "990001",
criteria: {
initialPostPoints: 10, // 初始帖子的分数
peerReviewPointsEach: 5, // 每次同伴评审的分数
requiredPeerReviews: 2, // 必须评审 2 位同伴
maxPeerReviewPoints: 10 // 评审分数上限 10 分
},
dryRun: true // 首先预览
});
// 然后应用评分
await bulkGradeDiscussion({
courseIdentifier: "60365",
topicId: "990001",
assignmentId: "1234567", // 应用评分所需
criteria: {
initialPostPoints: 10,
peerReviewPointsEach: 5,
requiredPeerReviews: 2,
maxPeerReviewPoints: 10
},
dryRun: false
});
特性:
Canvas MCP 服务器包含一个 search_canvas_tools MCP 工具,帮助您发现和探索可用的代码执行 API 操作。此工具搜索 TypeScript 代码 API 文件并返回有关可用 Canvas 操作的信息。
工具参数:
query(字符串,可选):用于过滤工具的关键字搜索词(例如,“评分”,“作业”,“讨论”)。空字符串返回所有可用工具。detail_level(字符串,可选):控制返回多少信息。选项:
"names":仅文件路径(最适用于快速查找)"signatures":文件路径 + 函数签名 + 描述(推荐,默认)"full":完整文件内容(谨慎使用,适用于详细检查)示例用法:
用自然语言询问 Claude:
或直接通过 MCP 使用:
// 搜索与评分相关的工具及其签名
search_canvas_tools("评分", "signatures")
// 列出所有可用工具(仅名称)
search_canvas_tools("", "names")
// 获取批量操作的完整实现细节
search_canvas_tools("批量", "full")
// 查找与讨论相关的操作
search_canvas_tools("讨论", "signatures")
返回: JSON 响应,包含:
query:使用的搜索词detail_level:请求的详细级别count:找到的匹配工具数量tools:包含请求详细级别的匹配工具数组src/canvas_mcp/code_api/
├── client.ts # 基础 MCP 客户端桥接
├── index.ts # 主入口点
└── canvas/
├── assignments/ # 作业操作
│ └── listSubmissions.ts
├── grading/ # 评分操作
│ ├── gradeWithRubric.ts
│ └── bulkGrade.ts # ⭐ 批量评分(节省 99.7% 的令牌!)
├── discussions/ # 讨论操作
│ ├── listDiscussions.ts
│ ├── postEntry.ts
│ └── bulkGradeDiscussion.ts # ⭐ 批量讨论评分
├── courses/ # 课程操作
└── communications/ # 消息操作
search_canvas_tools 查找可用操作📖 查看批量评分示例 以获得详细的逐步指导。
此 MCP 服务器可以无缝与任何 MCP 兼容客户端配合使用:
学生:
教师:
初次使用 Canvas MCP?请查看这些实用指南:
遵循 2025 年最佳实践的现代 Python 包结构:
canvas-mcp/
├── pyproject.toml # 现代 Python 项目配置
├── env.template # 环境配置模板
├── src/
│ └── canvas_mcp/ # 主包
│ ├── __init__.py # 包初始化
│ ├── server.py # 主服务器入口点
│ ├── core/ # 核心工具
│ │ ├── config.py # 配置管理
│ │ ├── client.py # HTTP 客户端
│ │ ├── cache.py # 缓存系统
│ │ └── validation.py # 输入验证
│ ├── tools/ # MCP 工具实现
│ │ ├── courses.py # 课程管理
│ │ ├── assignments.py # 作业工具
│ │ ├── discussions.py # 讨论工具
│ │