返回市场
画布-mcp

画布-mcp

作者:r-huijts11 星标更新:2025-09-24

项目介绍

Canvas MCP Server

一个模型上下文协议(MCP)服务器,使像Claude这样的AI助手能够与Canvas LMS进行交互。该服务器提供了通过Canvas API管理课程、公告、评分标准、作业、模块、页面和学生数据的工具。

🚀 现已作为Claude桌面扩展程序提供一键安装!

功能

  • 列出活跃课程及其详细信息
  • 向课程发布公告
  • 查看课程评分标准
  • 获取学生注册信息
  • 访问作业详情和提交内容
  • 查看学生提交历史和评论
  • 分析评分标准统计
  • 管理课程模块及模块项目
  • 管理课程页面,包括内容、修订和回滚
  • 管理测验,包括问题和问题组

桌面扩展优势 🎯

Canvas MCP服务器现在作为Claude桌面扩展程序提供,以实现终极用户体验:

  • 🎯 一键安装:无需终端命令,无需手动配置
  • 🔒 安全配置:API令牌安全存储在您的操作系统密钥链中
  • 🔄 自动更新:自动获取新功能和修复
  • 📦 零依赖:所有内容均已捆绑,无需安装Node.js
  • 🌍 跨平台:在macOS和Windows上无缝运行
  • 🎨 原生界面:通过Claude桌面的漂亮界面配置设置

非常适合希望获得强大Canvas集成而无需处理技术复杂性的教育工作者!

学生数据隐私及匿名化 🔒

此Canvas MCP服务器包含以隐私为中心的匿名化功能,用于学生数据。默认情况下,所有学生姓名和电子邮件地址都会被匿名化以保护隐私,但您可以通过自然语言请求实际数据。

工作原理

默认行为(匿名):

  • 学生姓名变为:学生1学生2等。
  • 学生电子邮件变为:student1@example.comstudent2@example.com
  • 同一学生在所有API调用中始终使用相同的假名
  • 教师/管理员姓名永远不会被匿名化(保留于评论中)

自然语言控制: 您可以轻松地通过自然语言切换到实际数据:

❌ 匿名(默认):
"列出课程123中的所有学生"
→ 返回:学生1,学生2,student1@example.com

✅ 非匿名:
"列出课程123中的所有学生,并显示他们的实际姓名和电子邮件"
"获取带有真实学生姓名的作业提交"
"显示具有实际身份的学生数据"
→ 返回:John Smith,Jane Doe,john.smith@university.edu

受影响的工具

以下工具支持匿名化控制:

  • list-students - 学生注册数据
  • list-assignments - 当包含学生提交数据时
  • list-assignment-submissions - 所有提交数据
  • list-section-submissions - 按部分筛选的提交
  • list-rubric-assessments - 评分标准评估数据

隐私功能

🔒 默认隐私:除非明确要求,否则所有学生数据都是匿名化的
🗣️ 自然语言:需要时只需询问“实际姓名”
👨‍🏫 教师保护:教师/管理员姓名永远不会被匿名化
🔄 一致映射:同一学生在所有调用中都使用相同的假名
🎯 选择性:仅匿名化学生数据,保留所有其他信息

为什么教师/管理员不会被匿名化

匿名化系统特别针对学生隐私,同时保留教育背景:

🎓 教育理由:

  • 学生是受保护的人群 - 他们是需要保护隐私的脆弱一方
  • 教师反馈背景很重要 - 知道哪位讲师提供了反馈具有教育价值
  • 员工问责制 - 教师和管理员是专业员工,不需要隐私保护

📝 实例:

作业评论(启用匿名化):
✅ "对数据分析趋势的出色分析! - Johnson教授"
❌ "我发现这一节很困惑 - 学生1" 
❌ "感谢您的反馈! - 学生2"

🔍 技术实现:

  • 评论包含一个author.role字段('student''teacher''admin''ta'
  • 只有role === 'student'的作者会被匿名化
  • 员工角色保留真实姓名以保持教育背景

这种设计确保了学生的隐私,同时保持了知道哪位讲师提供了特定反馈的教育价值。如果您需要完全匿名化包括员工,请修改匿名器逻辑或请求此功能增强。

技术实现

每个处理学生数据的工具都包含一个anonymous参数:

  • 默认anonymous: true(优先考虑隐私)
  • 覆盖:当您请求真实姓名时,Claude会自动设置anonymous: false
  • 保留:所有功能性ID和非个人数据保持不变

示例说明Claude如何解释您的请求:

  • "使用他们的实际姓名" → anonymous: false
  • "显示真实电子邮件" → anonymous: false
  • "匿名化" → anonymous: true(默认)
  • "隐藏学生身份" → anonymous: true

先决条件

安装

方案1:桌面扩展(最简单) 🚀

全新! 使用Claude桌面扩展程序的一键安装:

  1. 下载最新扩展程序:canvas-mcp-1.0.8.mcpb
  2. 双击.mcpb文件以使用Claude桌面打开
  3. 点击“安装” - 就这样!
  4. 通过Claude桌面UI配置您的Canvas API令牌和基础URL

优点:

  • 一键安装 - 不需要终端
  • 自动更新 - 当有新版本可用时
  • 安全配置 - API令牌存储在操作系统密钥链中
  • 零依赖 - 扩展程序中包含所有内容
  • 跨平台 - 在macOS和Windows上运行

方案2:NPM包(推荐)

使用此MCP服务器最简单的方法是通过npm:

npm install -g @r-huijts/canvas-mcp

或者直接使用npx(无需安装):

npx @r-huijts/canvas-mcp

方案3:从源代码

  1. 克隆此仓库并安装依赖项:

    git clone <repository-url>
    cd canvas-mcp
    npm install
    
  2. 在项目根目录创建一个.env文件:

    CANVAS_API_TOKEN=your_canvas_api_token_here
    CANVAS_BASE_URL=https://your-canvas-instance.instructure.com
    
  3. 构建TypeScript项目:

    npm run build
    
  4. 启动服务器:

    npm start
    

Claude桌面集成

  1. 打开Claude桌面的配置文件:

    MacOS

    code ~/Library/Application\ Support/Claude/claude_desktop_config.json
    

    Windows

    code %AppData%\Claude\claude_desktop_config.json
    
  2. 添加Canvas MCP服务器配置:

    对于NPM包安装(推荐):

    {
      "mcpServers": {
        "canvas": {
          "command": "npx",
          "args": [
            "-y",
            "@r-huijts/canvas-mcp"
          ],
          "env": {
            "CANVAS_API_TOKEN": "your_token_here",
            "CANVAS_BASE_URL": "https://your-canvas-instance.com"
          }
        }
      }
    }
    

    对于源代码安装:

    {
      "mcpServers": {
        "canvas": {
          "command": "node",
          "args": [
            "/path/to/canvas-mcp/build/index.js"
          ],
          "env": {
            "CANVAS_API_TOKEN": "your_token_here",
            "CANVAS_BASE_URL": "https://your-canvas-instance.com"
          }
        }
      }
    }
    
  3. 重启Claude桌面以应用更改

安装注意事项

NPM包安装的好处:

  • ✅ 无需克隆/构建源代码
  • ✅ 通过npm自动更新可用
  • ✅ 更简单的配置
  • ✅ 在不同操作系统上运行
  • -y标志自动接受包安装提示

解决NPX问题:

  • 如果遇到权限问题,请尝试以管理员身份运行Claude桌面(Windows)或使用sudo(macOS)
  • 在Windows上,确保您的PATH包含npm/npx可执行文件
  • 对于企业网络,您可能需要配置npm代理设置

可用工具

list-courses

列出认证用户的所有活跃课程

  • 无必需参数
  • 返回课程名称、ID和学期信息

post-announcement

向特定课程发布公告

  • 必需参数:
    • courseId: 字符串
    • title: 字符串
    • message: 字符串

list-rubrics

列出特定课程的所有评分标准

  • 必需参数:
    • courseId: 字符串
  • 返回评分标准标题、ID和描述

list-students

获取课程中所有注册学生的完整列表

  • 必需参数:
    • courseId: 字符串
  • 可选参数:
    • includeEmail: 布尔值(默认:false)
    • anonymous: 布尔值(默认:true) - 是否匿名化学生姓名/电子邮件
  • 返回学生姓名、ID和可选电子邮件地址
  • 隐私:学生数据默认匿名化(使用“实际姓名”来覆盖)

list-assignments

获取课程中所有作业及其提交状态

  • 必需参数:
    • courseId: 字符串
  • 可选参数:
    • studentId: 字符串
    • includeSubmissionHistory: 布尔值(默认:false)
    • anonymous: 布尔值(默认:true) - 是否在提交中匿名化学生数据
  • 返回作业详情和提交状态
  • 隐私:学生提交数据默认匿名化

list-assignment-submissions

获取特定作业的所有学生提交

  • 必需参数:
    • courseId: 字符串
    • assignmentId: 字符串
  • 可选参数:
    • anonymous: 布尔值(默认:true) - 是否匿名化学生姓名/电子邮件
  • 返回提交详情、分数和评论
  • 隐私:学生数据默认匿名化

list-section-submissions

获取特定作业按部分筛选的所有学生提交

  • 必需参数:
    • courseId: 字符串
    • assignmentId: 字符串
    • sectionId: 字符串
  • 可选参数:
    • includeComments: 布尔值(默认:true)
    • anonymous: 布尔值(默认:true) - 是否匿名化学生姓名/电子邮件
  • 返回按指定部分筛选的提交详情
  • 隐私:学生数据默认匿名化

list-sections

获取课程中所有部分的列表

  • 必需参数:
    • courseId: 字符串
  • 可选参数:
    • includeStudentCount: 布尔值(默认:false)
  • 返回部分详情,可选学生数量

post-submission-comment

在学生的作业提交上发表评论

  • 必需参数:
    • courseId: 字符串
    • assignmentId: 字符串
    • studentId: 字符串
    • comment: 字符串
  • 返回已发布的评论确认

get-rubric-statistics

获取作业评分标准的统计数据

  • 必需参数:
    • courseId: 字符串
    • assignmentId: 字符串
  • 可选参数:
    • includePointDistribution: 布尔值(默认:true)
  • 返回关于评分标准评估标准的详细统计数据

list-modules

列出课程中的所有模块,可选包括内联项目

  • 必需参数:
    • courseId: 字符串
  • 可选参数:
    • includeItems: 布尔值(默认:false)
  • 返回模块名称、ID、位置、发布状态,以及可选项目摘要

list-module-items

列出特定模块中的所有项目

  • 必需参数:
    • courseId: 字符串
    • moduleId: 字符串
  • 返回项目类型、标题、ID、位置和发布状态

toggle-module-publish

切换模块的发布/未发布状态

  • 必需参数:
    • courseId: 字符串
    • moduleId: 字符串
  • 返回新的发布状态确认

list-pages

按URL别名列出课程中的所有页面

  • 必需参数:
    • courseId: 字符串
  • 返回页面标题、URL别名、ID和发布状态

get-page-content

通过URL别名获取特定页面的内容(HTML/正文)

  • 必需参数:
    • courseId: 字符串
    • pageUrl: 字符串(页面的URL别名,例如'syllabus')
  • 返回页面标题、别名、ID、发布状态、更新日期和HTML正文

update-page-content

通过URL别名更新(或创建)页面

  • 必需参数:
    • courseId: 字符串
    • pageUrl: 字符串
  • 可选参数:
    • title: 字符串
    • body: 字符串(HTML)
    • editingRoles: 字符串(逗号分隔的角色)
  • 返回确认和更新后的页面信息

list-page-revisions

列出页面的所有修订

  • 必需参数:
    • courseId: 字符串
    • pageUrl: 字符串
  • 返回修订ID、时间戳和编辑者信息

revert-page-revision

将页面恢复到之前的修订

  • 必需参数:
    • courseId: 字符串
    • pageUrl: 字符串
    • revisionId: 字符串
  • 返回确认和新的页面状态

测验

list-quizzes

列出课程中的所有测验

  • 必需参数:
    • courseId: 字符串
  • 返回测验及其详细信息的列表

get-quiz

获取单个测验的元数据

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
  • 返回完整的测验对象

create-quiz

在课程中创建新的测验

  • 必需参数:
    • courseId: 字符串
    • title: 字符串
  • 可选参数:
    • description: 字符串
    • quiz_type: "practice_quiz" | "assignment" | "graded_survey" | "survey"
    • due_at: 字符串(ISO 8601格式)
    • points_possible: 数字
    • published: 布尔值
  • 返回新创建的测验对象

update-quiz

更新现有测验

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
  • 可选参数:同create-quiz
  • 返回更新后的测验对象

delete-quiz

删除测验

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
  • 返回删除确认

list-quiz-questions

列出测验中的所有问题

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
  • 返回问题对象的列表

get-quiz-question

获取单个测验问题

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • questionId: 字符串
  • 返回完整的测验问题对象

create-quiz-question

为测验创建新的问题

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • question: 对象(包含question_text、question_type、points_possible等)
  • 返回新创建的问题对象

update-quiz-question

更新测验问题

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • questionId: 字符串
  • 可选参数:
    • question: 对象(要更新的字段)
  • 返回更新的问题对象

delete-quiz-question

删除测验问题

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • questionId: 字符串
  • 返回删除确认

list-quiz-question-groups

列出测验中的所有问题组

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
  • 返回问题组对象的列表

get-quiz-question-group

获取单个测验问题组

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • groupId: 字符串
  • 返回完整的测验问题组对象

create-quiz-question-group

为测验创建新的问题组

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • quizGroup: 对象(包含name、pick_count、question_points)
  • 返回新创建的问题组对象

update-quiz-question-group

更新测验问题组

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • groupId: 字符串
  • 可选参数:
    • quizGroup: 对象(要更新的字段)
  • 返回更新的问题组对象

delete-quiz-question-group

删除测验问题组

  • 必需参数:
    • courseId: 字符串
    • quizId: 字符串
    • groupId: 字符串
  • 返回删除确认

可用提示

analyze-rubric-statistics

分析课程中形成性作业的评分标准统计数据,并创建可视化图表

  • 必需参数:
    • courseName: 字符串(要分析的课程名称)
  • 创建两个全面的可视化