mcpField
C
canvas-bulk-grading

canvas-bulk-grading

github.com/vishalsachdev其他308214 次安装1 天前更新
代码仓库

关于 canvas-bulk-grading

Canvas Bulk Grading 是面向教师和助教的技能,用评分标准为 Canvas 作业评分。它根据待评分数量选择单份、批量或 TypeScript 工作流,并为批量操作提供试运行和确认保护。

主要功能

  1. 01获取作业和评分标准详情
  2. 02按提交数量选择评分流程
  3. 03使用评分标准逐份评分
  4. 04通过试运行预览批量评分
  5. 05用 TypeScript 执行自定义评分逻辑
  6. 06评分前要求教师确认

适用场景

  1. 01按评分标准评阅少量提交
  2. 02预览并提交一批学生成绩
  3. 03对大量提交应用自定义逻辑
  4. 04查看尚未评分的提交数量

MCP 相关

需要使用已通过教师或助教令牌认证的 Canvas MCP 服务。技能调用 Canvas 工具获取作业、评分标准和提交数据,并提交成绩。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vishalsachdev/canvas-mcp --skill canvas-bulk-grading

安装后在 Claude Code 中输入/canvas-bulk-grading确认已加载。

详细介绍

Canvas 批量评分

使用基于评分标准的工作流,高效批改 Canvas LMS 作业。此技能要求 Canvas MCP 服务正在运行,并已使用教师或助教令牌完成身份验证。

前提条件

  • Canvas MCP 服务正在运行并已连接
  • 已使用 教育工作者(教师/助教)Canvas API 令牌完成身份验证
  • 作业必须已创建,并且有待批改的提交
  • 必须已创建评分标准,并将其与作业关联,且设置 use_for_grading=true。创建时使用 create_rubric,关联现有评分标准时使用 associate_rubric;修改文本或分值时使用 update_rubric(先预览,再使用令牌进行第二次调用);添加或移除评分标准项请在 Canvas 界面中操作。

工作流

步骤 1:收集作业和评分标准信息

评分前,获取作业详情及其评分标准项。

get_assignment_details(course_identifier, assignment_id)

接着获取评分标准。如果评分标准已关联到作业,请使用 get_rubric;如果要浏览课程中的所有评分标准,请使用 list_rubrics:

get_rubric(course_identifier, assignment_id=assignment_id)
list_rubrics(course_identifier)
get_rubric(course_identifier, rubric_id=rubric_id)

记录评分标准响应中的评分标准项 ID(通常以下划线为前缀,例如 _8027)和评级 ID。这些信息是基于评分标准评分所必需的。

步骤 2:列出提交

获取所有学生的提交,以确定需要批改的数量:

list_submissions(course_identifier, assignment_id)

记录每份提交的 user_id 和 workflow_state(submitted、graded、pending_review)。统计需要批改的提交数量,以确定使用哪种策略。

步骤 3:选择评分策略

根据需要批改的提交数量,使用以下决策树:

How many submissions need grading?
|
+-- 1-9 submissions
|   Use grade_with_rubric (one call per submission)
|
+-- 10-29 submissions
|   Use bulk_grade_submissions (concurrent batch processing)
|   Set max_concurrent: 5, rate_limit_delay: 1.0
|   Run with dry_run: true first (Safety Rule 1)
|
+-- 30+ submissions OR custom grading logic needed
    Use execute_typescript with bulkGrade function
    Grading logic runs locally; only selected output returns to the model
    Pass dryRun: true on the first run
策略 A:单份评分(1-9 份提交)

为每位学生调用一次 grade_with_rubric:

grade_with_rubric(
  course_identifier,
  assignment_id,
  user_id,
  rubric_assessment: {
    "criterion_id": {
      "points": <number>,
      "rating_id": "<string>",    // optional
      "comments": "<string>"      // optional per-criterion feedback
    }
  },
  comment: "Overall feedback"     // optional
)
策略 B:批量评分(10-29 份提交)

务必先进行试运行。 构建将每个用户 ID 映射到其评分数据的字典,然后在提交前进行验证:

bulk_grade_submissions(
  course_identifier,
  assignment_id,
  grades: {
    "user_id_1": {
      "rubric_assessment": {
        "criterion_id": {"points": 85, "comments": "Good analysis"}
      },
      "comment": "Overall feedback"
    },
    "user_id_2": {
      "grade": 92,
      "comment": "Excellent work"
    }
  },
  dry_run: true,          // VALIDATE FIRST
  max_concurrent: 5,
  rate_limit_delay: 1.0
)

检查试运行输出。如果结果看起来正确,请将 dry_run: false 后重新运行。

策略 C:执行代码(30 份及以上提交)

对于大型班级或自定义评分逻辑,请使用 execute_typescript 在本地运行评分。这可以避免将所有提交数据加载到对话上下文中。

execute_typescript(code: `
  import { bulkGrade } from './canvas/grading/bulkGrade.js';

  await bulkGrade({
    courseIdentifier: "COURSE_ID",
    assignmentId: "ASSIGNMENT_ID",
    dryRun: true,  // preview first; re-run with false after review
    gradingFunction: (submission) => {
      // Custom grading logic runs locally -- no token cost
      const notebook = submission.attachments?.find(
        f => f.filename.endsWith('.ipynb')
      );

      if (!notebook) return null; // skip ungraded

      return {
        points: 100,
        rubricAssessment: { "_8027": { points: 100 } }
        // No `comment` here on purpose -- see Safety Rule 6. Add one only when
        // the instructor asked for written feedback, and make it feedback.
      };
    }
  });
`)

编写代码前,使用 search_canvas_tools("grading", "signatures") 查找可用的 TypeScript 模块及其函数签名。

令牌效率

三种策略的令牌成本差异很大:

策略适用情况令牌成本原因
grade_with_rubric1-9 份提交低往返调用少,载荷较小
bulk_grade_submissions10-29 份提交中一次调用即可发送批量数据
execute_typescript30 份及以上提交取决于工作量评分逻辑在本地运行;只有代码和选定的输出需要进入模型上下文

关键在于:随着提交数量增加,将评分逻辑发送到服务端,比将所有提交数据载入对话更节省模型上下文。

安全规则

  1. 始终先进行试运行。 对于 bulk_grade_submissions,实际运行前先设置 dry_run: true。检查输出是否正确。
  2. 评分前核实评分标准。 确认标准 ID、分值范围和评级 ID 与作业评分标准一致。ID 不匹配会导致无提示的失败或错误评分。
  3. 批量评分前抽查。 对于策略 B 和 C,先用 grade_with_rubric 手动评阅 1-2 份提交。确认评分和评分标准反馈在 Canvas 中正确显示。
  4. 遵守速率限制。 使用 max_concurrent: 5 和 rate_limit_delay: 1.0(批次之间间隔 1 秒)。Canvas 的速率限制约为每 10 分钟 700 个请求。
  5. 未经教师明确确认,不得评分。 始终先提供评分计划(评分标准映射、分值、受影响的学生人数),并等待批准后再提交评分。
  6. 绝不要附上教师未要求的评论。 提交评论会在 SpeedGrader 中对学生可见;每次调用都会追加评论,而不是替换评论,并且无法撤回。“将分数设为 8”仅表示评分。绝不要生成复述分数或说明已进行评分的评论(例如“已通过自动审核评分”)——学生会把这类评论看作机器人对其作业的标记,而且没有任何反馈。只有教师要求书面反馈时才添加评论,并且评论内容应针对作业提供反馈。

示例提示词

  • “使用评分标准为作业 5 评分”
  • “向我展示期中项目的评分标准,并为所有提交评分”
  • “为作业 3 的所有未评分提交批量评分——标准 1 给满分,标准 2 给 80% 分”
  • “期末论文还有多少份提交需要评分?”
  • “对作业 7 进行批量评分试运行,让我在提交前检查”
  • “使用代码执行,通过自定义逻辑为全部 150 份家庭作业评分”

错误恢复

错误原因操作
401 Unauthorized令牌已过期或无效重新生成 Canvas API 令牌
403 Forbidden不是此课程的教师或助教核实 Canvas 角色
404 Not Found课程、作业或评分标准 ID 错误使用 list_assignments 或 list_rubrics 重新核对 ID
422 Unprocessable评分标准评估格式无效核实标准 ID 和分值范围是否与评分标准一致
批量操作部分失败部分评分已提交,其他失败检查每项状态。未经确认的评估可能已经保存:重试前先检查 Canvas,以免重复添加评论。仅重试已确认尚未保存的失败项

评论

支持 Markdown