canvas-lms-mcp 2.4.2 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/index.cjs +3 -3
- package/dist/canvas/index.js +2 -2
- package/dist/canvas/types.d.ts +4 -0
- package/dist/canvas/types.d.ts.map +1 -1
- package/dist/{chunk-TRY2MYPG.cjs → chunk-57FVMCK2.cjs} +350 -336
- package/dist/chunk-57FVMCK2.cjs.map +1 -0
- package/dist/{chunk-3TED6SUG.js → chunk-EYLQ2ORN.js} +18 -4
- package/dist/chunk-EYLQ2ORN.js.map +1 -0
- package/dist/{chunk-BCKOQCPP.cjs → chunk-LGKRFDO5.cjs} +5 -5
- package/dist/{chunk-BCKOQCPP.cjs.map → chunk-LGKRFDO5.cjs.map} +1 -1
- package/dist/{chunk-KP5VF6M5.js → chunk-SBND74S5.js} +2 -2
- package/dist/{chunk-KP5VF6M5.js.map → chunk-SBND74S5.js.map} +1 -1
- package/dist/{chunk-YFRSDHBN.js → chunk-SIEP7DD3.js} +2 -2
- package/dist/{chunk-WKYLHAWE.cjs → chunk-ZKG3VDNN.cjs} +2 -2
- package/dist/{chunk-WKYLHAWE.cjs.map → chunk-ZKG3VDNN.cjs.map} +1 -1
- package/dist/http.cjs +6 -6
- package/dist/http.js +3 -3
- package/dist/init.cjs +3 -3
- package/dist/init.js +1 -1
- package/dist/server.cjs +4 -4
- package/dist/server.js +3 -3
- package/dist/stdio.cjs +4 -4
- package/dist/stdio.js +3 -3
- package/dist/tools/assignments.d.ts.map +1 -1
- package/dist/tools/courses.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-3TED6SUG.js.map +0 -1
- package/dist/chunk-TRY2MYPG.cjs.map +0 -1
- /package/dist/{chunk-YFRSDHBN.js.map → chunk-SIEP7DD3.js.map} +0 -0
|
@@ -25,11 +25,11 @@ var _chunkQCEGMTXWcjs = require('./chunk-QCEGMTXW.cjs');
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
var
|
|
28
|
+
var _chunkLGKRFDO5cjs = require('./chunk-LGKRFDO5.cjs');
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
var
|
|
32
|
+
var _chunkZKG3VDNNcjs = require('./chunk-ZKG3VDNN.cjs');
|
|
33
33
|
|
|
34
34
|
// src/server.ts
|
|
35
35
|
var _mcpjs = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
@@ -1003,7 +1003,7 @@ function accountTools(canvas, pseudonymizer) {
|
|
|
1003
1003
|
title: "Get Account",
|
|
1004
1004
|
description: "Get details for a Canvas account by ID.",
|
|
1005
1005
|
inputSchema: {
|
|
1006
|
-
account_id:
|
|
1006
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID")
|
|
1007
1007
|
},
|
|
1008
1008
|
annotations: {
|
|
1009
1009
|
readOnlyHint: true,
|
|
@@ -1031,7 +1031,7 @@ function accountTools(canvas, pseudonymizer) {
|
|
|
1031
1031
|
title: "List Sub-Accounts",
|
|
1032
1032
|
description: "List sub-accounts under a given Canvas account.",
|
|
1033
1033
|
inputSchema: {
|
|
1034
|
-
account_id:
|
|
1034
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The parent Canvas account ID")
|
|
1035
1035
|
},
|
|
1036
1036
|
annotations: {
|
|
1037
1037
|
readOnlyHint: true,
|
|
@@ -1046,7 +1046,7 @@ function accountTools(canvas, pseudonymizer) {
|
|
|
1046
1046
|
title: "List Account Courses",
|
|
1047
1047
|
description: "List courses under a given Canvas account.",
|
|
1048
1048
|
inputSchema: {
|
|
1049
|
-
account_id:
|
|
1049
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
|
|
1050
1050
|
search_term: _zod.z.string().optional().describe("Search courses by name or course code")
|
|
1051
1051
|
},
|
|
1052
1052
|
annotations: {
|
|
@@ -1064,7 +1064,7 @@ function accountTools(canvas, pseudonymizer) {
|
|
|
1064
1064
|
title: "List Account Users",
|
|
1065
1065
|
description: "List users in a Canvas account.",
|
|
1066
1066
|
inputSchema: {
|
|
1067
|
-
account_id:
|
|
1067
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
|
|
1068
1068
|
search_term: _zod.z.string().optional().describe("Search users by name, email, or login")
|
|
1069
1069
|
},
|
|
1070
1070
|
annotations: {
|
|
@@ -1085,7 +1085,7 @@ function accountTools(canvas, pseudonymizer) {
|
|
|
1085
1085
|
title: "Get Account Reports",
|
|
1086
1086
|
description: "List available report types for a Canvas account.",
|
|
1087
1087
|
inputSchema: {
|
|
1088
|
-
account_id:
|
|
1088
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID")
|
|
1089
1089
|
},
|
|
1090
1090
|
annotations: {
|
|
1091
1091
|
readOnlyHint: true,
|
|
@@ -1149,8 +1149,8 @@ function assignmentSubmissionTools(canvas) {
|
|
|
1149
1149
|
name: "upload_submission_file",
|
|
1150
1150
|
description: "Upload a file to the authenticated student's own submission area for one assignment, as step 1 of an online_upload submission (step 2: pass the returned file id to submit_assignment). Opt-in tool: only available when the server was started with CANVAS_ENABLE_ASSIGNMENT_SUBMISSION. Content must be base64-encoded. This uploads only \u2014 nothing is submitted until submit_assignment is called.",
|
|
1151
1151
|
inputSchema: {
|
|
1152
|
-
course_id:
|
|
1153
|
-
assignment_id:
|
|
1152
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1153
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
1154
1154
|
name: _zod.z.string().describe("The filename, including extension"),
|
|
1155
1155
|
content_base64: _zod.z.string().describe("The file content, base64-encoded"),
|
|
1156
1156
|
content_type: _zod.z.string().describe("The MIME type, e.g. application/pdf")
|
|
@@ -1170,12 +1170,12 @@ function assignmentSubmissionTools(canvas) {
|
|
|
1170
1170
|
name: "submit_assignment",
|
|
1171
1171
|
description: "Submit the authenticated student's own work to an assignment. Opt-in tool: only available when the server was started with CANVAS_ENABLE_ASSIGNMENT_SUBMISSION. IMPORTANT: before calling, show the user exactly what will be submitted (assignment name, submission type, and full content/URL/file list) and get their explicit confirmation \u2014 submissions cannot be retracted and may consume a limited attempt. Submits as the token holder only; submitting on behalf of another user is not supported. For online_upload, first upload each file with upload_submission_file and pass the returned file ids.",
|
|
1172
1172
|
inputSchema: {
|
|
1173
|
-
course_id:
|
|
1174
|
-
assignment_id:
|
|
1173
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1174
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
1175
1175
|
submission_type: _zod.z.enum(["online_text_entry", "online_url", "online_upload"]).describe("Must be one of the assignment's allowed submission_types"),
|
|
1176
1176
|
body: _zod.z.string().optional().describe("The submission text/HTML. Required iff submission_type is online_text_entry"),
|
|
1177
1177
|
url: _zod.z.string().optional().describe("The submission URL (http/https). Required iff submission_type is online_url"),
|
|
1178
|
-
file_ids: _zod.z.array(
|
|
1178
|
+
file_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
1179
1179
|
"File IDs from prior upload_submission_file calls. Required (non-empty) iff submission_type is online_upload"
|
|
1180
1180
|
),
|
|
1181
1181
|
comment: _zod.z.string().optional().describe("Optional text comment to attach alongside the submission")
|
|
@@ -1255,7 +1255,7 @@ function assignmentSubmissionTools(canvas) {
|
|
|
1255
1255
|
|
|
1256
1256
|
// src/tools/errors.ts
|
|
1257
1257
|
function formatError(error) {
|
|
1258
|
-
if (error instanceof
|
|
1258
|
+
if (error instanceof _chunkZKG3VDNNcjs.CanvasApiError) {
|
|
1259
1259
|
const status = error.status;
|
|
1260
1260
|
const message = error.message;
|
|
1261
1261
|
const ltiMarkers = ["Tool not configured", "tool is not configured"];
|
|
@@ -1307,9 +1307,9 @@ function analyticsTools(canvas) {
|
|
|
1307
1307
|
audience: "shared",
|
|
1308
1308
|
description: "Search for content within a course. Searches pages, assignments, discussions, and announcements by keyword.",
|
|
1309
1309
|
inputSchema: {
|
|
1310
|
-
course_id:
|
|
1310
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1311
1311
|
search_term: _zod.z.string().describe("The keyword or phrase to search for"),
|
|
1312
|
-
content_types: _zod.z.array(_zod.z.enum(
|
|
1312
|
+
content_types: _zod.z.array(_zod.z.enum(_chunkLGKRFDO5cjs.SEARCH_CONTENT_TYPES)).optional().describe(
|
|
1313
1313
|
"Content types to search. Defaults to all types: pages, discussions, assignments, announcements."
|
|
1314
1314
|
)
|
|
1315
1315
|
},
|
|
@@ -1321,7 +1321,7 @@ function analyticsTools(canvas) {
|
|
|
1321
1321
|
const courseId = params.course_id;
|
|
1322
1322
|
const searchTerm = params.search_term;
|
|
1323
1323
|
const types = _nullishCoalesce(params.content_types, () => ( [
|
|
1324
|
-
...
|
|
1324
|
+
..._chunkLGKRFDO5cjs.SEARCH_CONTENT_TYPES
|
|
1325
1325
|
]));
|
|
1326
1326
|
if (types.length === 0) return { results: [] };
|
|
1327
1327
|
const settled = await Promise.allSettled(
|
|
@@ -1349,7 +1349,7 @@ ${allErrors.join("\n")}`);
|
|
|
1349
1349
|
title: "Get Course Analytics",
|
|
1350
1350
|
description: "Get course-level activity analytics. Returns daily page view and participation counts.",
|
|
1351
1351
|
inputSchema: {
|
|
1352
|
-
course_id:
|
|
1352
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
1353
1353
|
},
|
|
1354
1354
|
annotations: {
|
|
1355
1355
|
readOnlyHint: true,
|
|
@@ -1365,8 +1365,8 @@ ${allErrors.join("\n")}`);
|
|
|
1365
1365
|
title: "Get Student Analytics",
|
|
1366
1366
|
description: "Get per-student activity analytics for a course. Returns page views, participations, and submission timeline for a specific student.",
|
|
1367
1367
|
inputSchema: {
|
|
1368
|
-
course_id:
|
|
1369
|
-
student_id:
|
|
1368
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1369
|
+
student_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the student")
|
|
1370
1370
|
},
|
|
1371
1371
|
annotations: {
|
|
1372
1372
|
readOnlyHint: true,
|
|
@@ -1384,7 +1384,7 @@ ${allErrors.join("\n")}`);
|
|
|
1384
1384
|
audience: "shared",
|
|
1385
1385
|
description: "Get a summary of recent activity in a course. Returns counts of recent events grouped by type (submissions, discussions, announcements, etc.).",
|
|
1386
1386
|
inputSchema: {
|
|
1387
|
-
course_id:
|
|
1387
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
1388
1388
|
},
|
|
1389
1389
|
annotations: {
|
|
1390
1390
|
readOnlyHint: true,
|
|
@@ -1401,8 +1401,8 @@ ${allErrors.join("\n")}`);
|
|
|
1401
1401
|
audience: "shared",
|
|
1402
1402
|
description: "Get score distribution analytics for assignments in a course. Returns statistical summary (min, max, median, first/third quartile), submission count, and tardiness breakdown (on_time, late, missing) for each assignment. Provide assignment_id to scope to one assignment; omit to return analytics for all assignments in the course.",
|
|
1403
1403
|
inputSchema: {
|
|
1404
|
-
course_id:
|
|
1405
|
-
assignment_id:
|
|
1404
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1405
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
1406
1406
|
"Scope the result to a single assignment ID. Omit to return analytics for all assignments."
|
|
1407
1407
|
)
|
|
1408
1408
|
},
|
|
@@ -1463,8 +1463,8 @@ function attentionTools(canvas, pseudonymizer) {
|
|
|
1463
1463
|
title: "List Submission Comments Needing Attention",
|
|
1464
1464
|
description: "List submissions where the most recent comment is from the student and has not been addressed by grading or a reply \u2014 i.e. comments the instructor has likely not seen. Returns a triage list, oldest-unaddressed first. Requires instructor/TA permissions in the course.",
|
|
1465
1465
|
inputSchema: {
|
|
1466
|
-
course_id:
|
|
1467
|
-
assignment_ids: _zod.z.array(
|
|
1466
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1467
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
1468
1468
|
"Scope the scan to specific assignment IDs (fetches all assignments when omitted)"
|
|
1469
1469
|
),
|
|
1470
1470
|
unread_only: _zod.z.boolean().optional().describe(
|
|
@@ -1536,7 +1536,7 @@ function attentionTools(canvas, pseudonymizer) {
|
|
|
1536
1536
|
title: "List Students Needing Attention",
|
|
1537
1537
|
description: "Report students who may need instructor attention based on inactivity, missing or late submissions, and low current score. Each finding lists the exact signals that fired and the thresholds used \u2014 this is a factual report, not a prediction. Requires instructor/TA permissions in the course.",
|
|
1538
1538
|
inputSchema: {
|
|
1539
|
-
course_id:
|
|
1539
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1540
1540
|
inactive_days: _zod.z.number().optional().describe("Flag students with no activity in the last N days (default 7)"),
|
|
1541
1541
|
min_missing: _zod.z.number().optional().describe("Flag students with at least N missing submissions (default 1)"),
|
|
1542
1542
|
min_late: _zod.z.number().optional().describe("Flag students with at least N late submissions (default 3)"),
|
|
@@ -1574,7 +1574,7 @@ function attentionTools(canvas, pseudonymizer) {
|
|
|
1574
1574
|
summaryMap.set(s.id, s);
|
|
1575
1575
|
}
|
|
1576
1576
|
} catch (err) {
|
|
1577
|
-
if (err instanceof
|
|
1577
|
+
if (err instanceof _chunkZKG3VDNNcjs.CanvasApiError && err.status === 404) {
|
|
1578
1578
|
analyticsAvailable = false;
|
|
1579
1579
|
} else {
|
|
1580
1580
|
throw err;
|
|
@@ -1713,7 +1713,7 @@ function assignmentTools(canvas) {
|
|
|
1713
1713
|
audience: "shared",
|
|
1714
1714
|
description: 'List all assignments in a course. Use fields="slim" when enumerating assignments for selection; switch to "full" once you\'ve identified the target. slim returns id, name, due_at, points_possible, published, and course_id only. "full" (default) includes all Canvas fields plus `include` extras (submission, all_dates, overrides, score_statistics, etc.). Use `bucket` to filter by past/upcoming/overdue/etc. Other filters: `search_term`, `assignment_ids`, `order_by`.',
|
|
1715
1715
|
inputSchema: {
|
|
1716
|
-
course_id:
|
|
1716
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1717
1717
|
fields: _zod.z.enum(["slim", "full"]).optional().describe(
|
|
1718
1718
|
'Projection mode: "slim" returns id/name/due_at/points_possible/published/course_id only; "full" (default) returns all fields'
|
|
1719
1719
|
),
|
|
@@ -1722,7 +1722,7 @@ function assignmentTools(canvas) {
|
|
|
1722
1722
|
),
|
|
1723
1723
|
search_term: _zod.z.string().optional().describe("Partial name substring to filter assignments by"),
|
|
1724
1724
|
bucket: _zod.z.enum(ASSIGNMENT_BUCKET).optional().describe("Only include assignments in the given bucket"),
|
|
1725
|
-
assignment_ids: _zod.z.array(
|
|
1725
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to the given list of assignment IDs"),
|
|
1726
1726
|
order_by: _zod.z.enum(ASSIGNMENT_ORDER_BY).optional().describe("Field to sort the result by"),
|
|
1727
1727
|
override_assignment_dates: _zod.z.boolean().optional().describe(
|
|
1728
1728
|
"Apply assignment overrides to due/unlock/lock dates (default Canvas behavior: true)"
|
|
@@ -1767,8 +1767,8 @@ function assignmentTools(canvas) {
|
|
|
1767
1767
|
audience: "shared",
|
|
1768
1768
|
description: "Get details for a single assignment by ID. Use `include` to request submission, overrides, all_dates, score_statistics, and other optional fields.",
|
|
1769
1769
|
inputSchema: {
|
|
1770
|
-
course_id:
|
|
1771
|
-
assignment_id:
|
|
1770
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1771
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
1772
1772
|
include: _zod.z.array(_zod.z.enum(ASSIGNMENT_GET_INCLUDE)).optional().describe("Extra fields to include on the assignment (Canvas include[] param)"),
|
|
1773
1773
|
override_assignment_dates: _zod.z.boolean().optional().describe("Apply assignment overrides to due/unlock/lock dates"),
|
|
1774
1774
|
needs_grading_count_by_section: _zod.z.boolean().optional().describe("Break needs_grading_count down by section"),
|
|
@@ -1800,14 +1800,14 @@ function assignmentTools(canvas) {
|
|
|
1800
1800
|
audience: "shared",
|
|
1801
1801
|
description: "List assignment groups (categories like Homework, Exams) in a course. Use `include=assignments` to nest assignments under each group; other includes add submission, overrides, score_statistics, etc.",
|
|
1802
1802
|
inputSchema: {
|
|
1803
|
-
course_id:
|
|
1803
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1804
1804
|
include: _zod.z.array(_zod.z.enum(ASSIGNMENT_GROUP_INCLUDE)).optional().describe("Extra fields to include (Canvas include[] param)"),
|
|
1805
|
-
assignment_ids: _zod.z.array(
|
|
1805
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
1806
1806
|
"When combined with include=assignments, restrict nested assignments to these IDs"
|
|
1807
1807
|
),
|
|
1808
1808
|
exclude_assignment_submission_types: _zod.z.array(_zod.z.string()).optional().describe("Exclude assignments whose submission_types match any of these values"),
|
|
1809
1809
|
override_assignment_dates: _zod.z.boolean().optional().describe("Apply assignment overrides to due/unlock/lock dates"),
|
|
1810
|
-
grading_period_id:
|
|
1810
|
+
grading_period_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Scope to a specific grading period"),
|
|
1811
1811
|
scope_assignments_to_student: _zod.z.boolean().optional().describe("Limit assignments to what the current student can see")
|
|
1812
1812
|
},
|
|
1813
1813
|
annotations: {
|
|
@@ -1836,15 +1836,21 @@ function assignmentTools(canvas) {
|
|
|
1836
1836
|
title: "Create Assignment",
|
|
1837
1837
|
description: "Create a new assignment in a course.",
|
|
1838
1838
|
inputSchema: {
|
|
1839
|
-
course_id:
|
|
1839
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1840
1840
|
name: _zod.z.string().describe("Assignment name"),
|
|
1841
1841
|
description: _zod.z.string().optional().describe("Assignment description (HTML supported)"),
|
|
1842
1842
|
points_possible: _zod.z.number().optional().describe("Maximum points for this assignment"),
|
|
1843
1843
|
due_at: _zod.z.string().optional().describe("Due date in ISO 8601 format (e.g. 2026-05-01T23:59:00Z)"),
|
|
1844
|
+
lock_at: _zod.z.string().optional().describe(
|
|
1845
|
+
"The date after which the assignment locks and stops accepting submissions, in ISO 8601 format. Must be after due_at when there is one"
|
|
1846
|
+
),
|
|
1847
|
+
unlock_at: _zod.z.string().optional().describe(
|
|
1848
|
+
"The date the assignment becomes available to students, in ISO 8601 format. Must be before due_at when there is one"
|
|
1849
|
+
),
|
|
1844
1850
|
submission_types: _zod.z.array(_zod.z.string()).optional().describe(
|
|
1845
1851
|
'Allowed submission types (e.g. ["online_upload", "online_text_entry", "none"])'
|
|
1846
1852
|
),
|
|
1847
|
-
assignment_group_id:
|
|
1853
|
+
assignment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("ID of the assignment group to place this assignment in"),
|
|
1848
1854
|
published: _zod.z.boolean().optional().describe("Whether the assignment is published and visible to students"),
|
|
1849
1855
|
omit_from_final_grade: _zod.z.boolean().optional().describe("Whether to leave this assignment out of the final grade calculation"),
|
|
1850
1856
|
grade_group_students_individually: _zod.z.boolean().optional().describe(
|
|
@@ -1865,14 +1871,20 @@ function assignmentTools(canvas) {
|
|
|
1865
1871
|
title: "Update Assignment",
|
|
1866
1872
|
description: "Update an existing assignment in a course.",
|
|
1867
1873
|
inputSchema: {
|
|
1868
|
-
course_id:
|
|
1869
|
-
assignment_id:
|
|
1874
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1875
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
1870
1876
|
name: _zod.z.string().optional().describe("New assignment name"),
|
|
1871
1877
|
description: _zod.z.string().optional().describe("New assignment description (HTML supported)"),
|
|
1872
1878
|
points_possible: _zod.z.number().optional().describe("New maximum points"),
|
|
1873
1879
|
due_at: _zod.z.string().optional().describe("New due date in ISO 8601 format (e.g. 2026-05-01T23:59:00Z)"),
|
|
1880
|
+
lock_at: _zod.z.string().optional().describe(
|
|
1881
|
+
"New date after which the assignment locks and stops accepting submissions, in ISO 8601 format. Must be after due_at when there is one"
|
|
1882
|
+
),
|
|
1883
|
+
unlock_at: _zod.z.string().optional().describe(
|
|
1884
|
+
"New date the assignment becomes available to students, in ISO 8601 format. Must be before due_at when there is one"
|
|
1885
|
+
),
|
|
1874
1886
|
submission_types: _zod.z.array(_zod.z.string()).optional().describe("New allowed submission types"),
|
|
1875
|
-
assignment_group_id:
|
|
1887
|
+
assignment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("New assignment group ID"),
|
|
1876
1888
|
published: _zod.z.boolean().optional().describe("Whether the assignment is published and visible to students"),
|
|
1877
1889
|
omit_from_final_grade: _zod.z.boolean().optional().describe("Whether to leave this assignment out of the final grade calculation"),
|
|
1878
1890
|
grade_group_students_individually: _zod.z.boolean().optional().describe(
|
|
@@ -1894,8 +1906,8 @@ function assignmentTools(canvas) {
|
|
|
1894
1906
|
title: "Delete Assignment",
|
|
1895
1907
|
description: "Delete an assignment from a course. This action is permanent.",
|
|
1896
1908
|
inputSchema: {
|
|
1897
|
-
course_id:
|
|
1898
|
-
assignment_id:
|
|
1909
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
1910
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to delete")
|
|
1899
1911
|
},
|
|
1900
1912
|
annotations: {
|
|
1901
1913
|
destructiveHint: true,
|
|
@@ -1928,7 +1940,7 @@ async function fanOut(config) {
|
|
|
1928
1940
|
skipped.push(outcome.result);
|
|
1929
1941
|
}
|
|
1930
1942
|
} catch (err) {
|
|
1931
|
-
if (!(err instanceof
|
|
1943
|
+
if (!(err instanceof _chunkZKG3VDNNcjs.CanvasApiError)) {
|
|
1932
1944
|
console.error(`Unexpected error ${config.errorContext(item)}:`, err);
|
|
1933
1945
|
}
|
|
1934
1946
|
const message = err instanceof Error ? err.message : "Unknown error";
|
|
@@ -1961,8 +1973,8 @@ function assignmentOverrideTools(canvas) {
|
|
|
1961
1973
|
title: "List Assignment Overrides",
|
|
1962
1974
|
description: "List all due-date / availability overrides for a specific assignment in a course. Returns overrides targeting individual students, sections, or groups. Useful for auditing before creating a new override \u2014 Canvas returns a 422 if a student-set override already exists for the same students on the same assignment.",
|
|
1963
1975
|
inputSchema: {
|
|
1964
|
-
course_id:
|
|
1965
|
-
assignment_id:
|
|
1976
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
1977
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID")
|
|
1966
1978
|
},
|
|
1967
1979
|
annotations: {
|
|
1968
1980
|
readOnlyHint: true,
|
|
@@ -1979,15 +1991,15 @@ function assignmentOverrideTools(canvas) {
|
|
|
1979
1991
|
title: "Create Assignment Override",
|
|
1980
1992
|
description: 'Create a due-date / availability override for a specific assignment, targeting a set of students, a course section, or a group. Exactly one of student_ids, course_section_id, or group_id must be provided. At least one date field (due_at, unlock_at, lock_at) should be provided; omit a date field to leave the corresponding date unchanged for the override target. Dates must be ISO 8601 strings (e.g. "2026-09-15T23:59:00Z"). Canvas returns a 422 if a student-set override already exists for the same students on this assignment \u2014 use list_assignment_overrides to audit first. Provide student_ids as real Canvas user IDs. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to resolve pseudonyms to real user IDs.',
|
|
1981
1993
|
inputSchema: {
|
|
1982
|
-
course_id:
|
|
1983
|
-
assignment_id:
|
|
1984
|
-
student_ids: _zod.z.array(
|
|
1994
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
1995
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID"),
|
|
1996
|
+
student_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
|
|
1985
1997
|
"Real Canvas user IDs to grant the override to. Mutually exclusive with course_section_id and group_id."
|
|
1986
1998
|
),
|
|
1987
|
-
course_section_id:
|
|
1999
|
+
course_section_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
1988
2000
|
"ID of the course section to override. Mutually exclusive with student_ids and group_id."
|
|
1989
2001
|
),
|
|
1990
|
-
group_id:
|
|
2002
|
+
group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
1991
2003
|
"ID of the group to override. Mutually exclusive with student_ids and course_section_id."
|
|
1992
2004
|
),
|
|
1993
2005
|
title: _zod.z.string().optional().describe(
|
|
@@ -2035,9 +2047,9 @@ function assignmentOverrideTools(canvas) {
|
|
|
2035
2047
|
title: "Set Student Assignment Dates",
|
|
2036
2048
|
description: "Fan a due-date / availability override for a specific student across all (or a filtered subset of) assignments in a course. Creates one student-set override per assignment via the Canvas assignment overrides API. Partial failures are tolerated \u2014 a failure on one assignment does not abort the rest. Note: for courses with many assignments this makes one Canvas API call per assignment. V1 is create-only: if an override for this student already exists on an assignment, Canvas returns a 422 and that assignment appears in the failed[] list. Use list_assignment_overrides to audit first. Dates must be ISO 8601 strings. To shift dates by a relative amount, first call list_assignments with include=overrides to retrieve current dates, compute absolute timestamps, then call this tool. Returns the standard fan-out envelope: separated applied[], skipped[] (unused in this create-only version, always empty), and failed[] (each with an error) arrays, a not_found list, and a summary of counts. Any assignment_ids that do not exist in the course are reported in not_found (they are neither applied nor failed). Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym.",
|
|
2037
2049
|
inputSchema: {
|
|
2038
|
-
course_id:
|
|
2039
|
-
user_id:
|
|
2040
|
-
assignment_ids: _zod.z.array(
|
|
2050
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
2051
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
|
|
2052
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
|
|
2041
2053
|
"Limit the fan-out to these specific assignment IDs (provide at least one). Omit entirely to target all assignments in the course. IDs not present in the course are returned in not_found, not applied/failed."
|
|
2042
2054
|
),
|
|
2043
2055
|
title: _zod.z.string().optional().describe(
|
|
@@ -2118,7 +2130,7 @@ function calendarTools(canvas) {
|
|
|
2118
2130
|
title: "List Calendar Events",
|
|
2119
2131
|
description: 'List calendar events for a course, unbounded by the ~1-week/20-item caps that `get_upcoming_events` and `get_my_upcoming_assignments` are stuck with. By default Canvas only returns `type="event"` items for today alone (end_date defaults to start_date) \u2014 pass both start_date and end_date to cover a range, and type="assignment" to list assignment due dates instead of plain events.',
|
|
2120
2132
|
inputSchema: {
|
|
2121
|
-
course_id:
|
|
2133
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2122
2134
|
type: _zod.z.enum(["event", "assignment", "sub_assignment"]).optional().describe('Kind of calendar item to return. Defaults to "event" if omitted.'),
|
|
2123
2135
|
start_date: _zod.z.string().optional().describe(
|
|
2124
2136
|
"Inclusive range start (YYYY-MM-DD or ISO 8601 datetime). Defaults to today if omitted."
|
|
@@ -2172,7 +2184,7 @@ function calendarTools(canvas) {
|
|
|
2172
2184
|
title: "Update Calendar Event",
|
|
2173
2185
|
description: "Update an existing calendar event. Only provided fields are changed.",
|
|
2174
2186
|
inputSchema: {
|
|
2175
|
-
event_id:
|
|
2187
|
+
event_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas calendar event ID"),
|
|
2176
2188
|
title: _zod.z.string().optional().describe("New event title"),
|
|
2177
2189
|
start_at: _zod.z.string().optional().describe("New start time in ISO 8601 format"),
|
|
2178
2190
|
end_at: _zod.z.string().optional().describe("New end time in ISO 8601 format"),
|
|
@@ -2206,7 +2218,7 @@ function contentExportsTools(canvas) {
|
|
|
2206
2218
|
title: "Create Content Export",
|
|
2207
2219
|
description: 'Start a Canvas course content export (Common Cartridge / QTI / zip). Exports are asynchronous \u2014 this tool returns immediately with an export ID and initial workflow_state ("created"). Call get_content_export to poll progress and retrieve the time-limited download link when the export finishes.',
|
|
2208
2220
|
inputSchema: {
|
|
2209
|
-
course_id:
|
|
2221
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2210
2222
|
export_type: _zod.z.enum(["common_cartridge", "qti", "zip"]).describe(
|
|
2211
2223
|
"Export format: common_cartridge (IMS CC, widely portable for migration/backup), qti (assessments only), zip (Canvas-native files archive)"
|
|
2212
2224
|
)
|
|
@@ -2222,8 +2234,8 @@ function contentExportsTools(canvas) {
|
|
|
2222
2234
|
title: "Get Content Export",
|
|
2223
2235
|
description: 'Get the status of a content export. When workflow_state is "exported", attachment.url contains a time-limited download link \u2014 download it promptly, as the URL expires (re-fetch to get a fresh one). Returns attachment: null while still "created"/"exporting" or on "failed".',
|
|
2224
2236
|
inputSchema: {
|
|
2225
|
-
course_id:
|
|
2226
|
-
export_id:
|
|
2237
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2238
|
+
export_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The export ID returned by create_content_export")
|
|
2227
2239
|
},
|
|
2228
2240
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2229
2241
|
handler: async (params) => canvas.contentExports.get(params.course_id, params.export_id)
|
|
@@ -2233,7 +2245,7 @@ function contentExportsTools(canvas) {
|
|
|
2233
2245
|
title: "List Content Exports",
|
|
2234
2246
|
description: "List all content exports for a course (most recent first).",
|
|
2235
2247
|
inputSchema: {
|
|
2236
|
-
course_id:
|
|
2248
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2237
2249
|
},
|
|
2238
2250
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2239
2251
|
handler: async (params) => canvas.contentExports.list(params.course_id)
|
|
@@ -2250,7 +2262,7 @@ function contentMigrationsTools(canvas) {
|
|
|
2250
2262
|
title: "List Content Migrations",
|
|
2251
2263
|
description: "List all content migrations for a course (most recent first).",
|
|
2252
2264
|
inputSchema: {
|
|
2253
|
-
course_id:
|
|
2265
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2254
2266
|
},
|
|
2255
2267
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2256
2268
|
handler: async (params) => canvas.contentMigrations.list(params.course_id)
|
|
@@ -2260,8 +2272,8 @@ function contentMigrationsTools(canvas) {
|
|
|
2260
2272
|
title: "Get Content Migration",
|
|
2261
2273
|
description: 'Get the status of a single content migration. When workflow_state is "running", poll progress_url for live updates. When "completed", the migration is done.',
|
|
2262
2274
|
inputSchema: {
|
|
2263
|
-
course_id:
|
|
2264
|
-
migration_id:
|
|
2275
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2276
|
+
migration_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
|
|
2265
2277
|
},
|
|
2266
2278
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2267
2279
|
handler: async (params) => canvas.contentMigrations.get(params.course_id, params.migration_id)
|
|
@@ -2271,7 +2283,7 @@ function contentMigrationsTools(canvas) {
|
|
|
2271
2283
|
title: "List Content Migration Types",
|
|
2272
2284
|
description: "List available migration types (migrators) for a course. Returns migrator type keys such as course_copy_importer, common_cartridge_importer, zip_file_importer, qti_converter, moodle_converter.",
|
|
2273
2285
|
inputSchema: {
|
|
2274
|
-
course_id:
|
|
2286
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2275
2287
|
},
|
|
2276
2288
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2277
2289
|
handler: async (params) => canvas.contentMigrations.listMigrators(params.course_id)
|
|
@@ -2281,8 +2293,8 @@ function contentMigrationsTools(canvas) {
|
|
|
2281
2293
|
title: "Get Migration Selective Data",
|
|
2282
2294
|
description: 'Get the selective import tree for a migration \u2014 the list of content items available to selectively import. Only meaningful for migrations in the "waiting_for_select" state.',
|
|
2283
2295
|
inputSchema: {
|
|
2284
|
-
course_id:
|
|
2285
|
-
migration_id:
|
|
2296
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2297
|
+
migration_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The content migration ID"),
|
|
2286
2298
|
type: _zod.z.string().optional().describe(
|
|
2287
2299
|
'Filter to a specific content type (e.g. "course_settings", "syllabus_body", "context_modules", "assignments")'
|
|
2288
2300
|
)
|
|
@@ -2299,8 +2311,8 @@ function contentMigrationsTools(canvas) {
|
|
|
2299
2311
|
title: "Get Migration Asset ID Mapping",
|
|
2300
2312
|
description: "Get the old-to-new asset ID mapping for a completed migration. Useful for resolving references to content that existed in the source course.",
|
|
2301
2313
|
inputSchema: {
|
|
2302
|
-
course_id:
|
|
2303
|
-
migration_id:
|
|
2314
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2315
|
+
migration_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
|
|
2304
2316
|
},
|
|
2305
2317
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2306
2318
|
handler: async (params) => canvas.contentMigrations.getAssetIdMapping(
|
|
@@ -2313,8 +2325,8 @@ function contentMigrationsTools(canvas) {
|
|
|
2313
2325
|
title: "List Migration Issues",
|
|
2314
2326
|
description: "List issues encountered during a content migration. Each issue has a type (todo, warning, or error) and a description.",
|
|
2315
2327
|
inputSchema: {
|
|
2316
|
-
course_id:
|
|
2317
|
-
migration_id:
|
|
2328
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2329
|
+
migration_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
|
|
2318
2330
|
},
|
|
2319
2331
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
2320
2332
|
handler: async (params) => canvas.contentMigrations.listMigrationIssues(
|
|
@@ -2327,7 +2339,7 @@ function contentMigrationsTools(canvas) {
|
|
|
2327
2339
|
title: "Create Content Migration",
|
|
2328
2340
|
description: "Start a content migration (course copy, Common Cartridge import, zip import, QTI conversion, or Moodle conversion). Migrations are asynchronous \u2014 this tool returns immediately with a migration ID and progress_url. Poll get_content_migration or progress_url to track completion.",
|
|
2329
2341
|
inputSchema: {
|
|
2330
|
-
course_id:
|
|
2342
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The destination Canvas course ID"),
|
|
2331
2343
|
migration_type: _zod.z.enum([
|
|
2332
2344
|
"course_copy_importer",
|
|
2333
2345
|
"common_cartridge_importer",
|
|
@@ -2380,7 +2392,7 @@ function conversationTools(canvas, pseudonymizer) {
|
|
|
2380
2392
|
title: "Get Conversation",
|
|
2381
2393
|
description: "Get a single conversation with its full message thread.",
|
|
2382
2394
|
inputSchema: {
|
|
2383
|
-
conversation_id:
|
|
2395
|
+
conversation_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The conversation ID")
|
|
2384
2396
|
},
|
|
2385
2397
|
annotations: {
|
|
2386
2398
|
readOnlyHint: true,
|
|
@@ -2485,7 +2497,7 @@ function courseSetupTools(canvas) {
|
|
|
2485
2497
|
title: "Check Course Setup",
|
|
2486
2498
|
description: "Run a factual course-readiness report that surfaces common configuration problems \u2014 assignments missing due dates, unpublished items students will not see, gradebook weighting gaps, graded assignments with no points, and published assignments still accepting submissions after their due date. Returns findings grouped by check with a plain-language detail per item. This is a config-health report only; it does not inspect student submissions or performance (see list_students_needing_attention / get_missing_submissions for those). Requires instructor permissions in the course.",
|
|
2487
2499
|
inputSchema: {
|
|
2488
|
-
course_id:
|
|
2500
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
2489
2501
|
checks: _zod.z.array(
|
|
2490
2502
|
_zod.z.enum([
|
|
2491
2503
|
"missing_due_dates",
|
|
@@ -2709,7 +2721,7 @@ function courseTools(canvas) {
|
|
|
2709
2721
|
title: "Get Course",
|
|
2710
2722
|
description: "Get details for a single course. Defaults to requesting `term` and `total_students`. Pass `include` to replace the default set with custom Canvas include[] fields (teachers, permissions, syllabus_body, sections, etc.).",
|
|
2711
2723
|
inputSchema: {
|
|
2712
|
-
course_id:
|
|
2724
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2713
2725
|
include: _zod.z.array(_zod.z.enum(COURSE_GET_INCLUDE)).optional().describe("Extra fields to include on the course (Canvas include[] param)"),
|
|
2714
2726
|
teacher_limit: _zod.z.number().int().optional().describe("Limit on the number of teachers returned when include=teachers")
|
|
2715
2727
|
},
|
|
@@ -2730,7 +2742,7 @@ function courseTools(canvas) {
|
|
|
2730
2742
|
title: "Get Syllabus",
|
|
2731
2743
|
description: "Get the syllabus HTML body for a course.",
|
|
2732
2744
|
inputSchema: {
|
|
2733
|
-
course_id:
|
|
2745
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2734
2746
|
},
|
|
2735
2747
|
annotations: {
|
|
2736
2748
|
readOnlyHint: true,
|
|
@@ -2748,7 +2760,7 @@ function courseTools(canvas) {
|
|
|
2748
2760
|
audience: "admin",
|
|
2749
2761
|
description: "Create a new course in a Canvas account. Returns the created course object.",
|
|
2750
2762
|
inputSchema: {
|
|
2751
|
-
account_id:
|
|
2763
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID to create the course in"),
|
|
2752
2764
|
name: _zod.z.string().describe("The name of the course"),
|
|
2753
2765
|
course_code: _zod.z.string().optional().describe("The course code (e.g. CS101)"),
|
|
2754
2766
|
start_at: _zod.z.string().datetime().optional().describe("Course start date in ISO 8601 format (e.g. 2026-01-15T00:00:00Z)"),
|
|
@@ -2769,13 +2781,15 @@ function courseTools(canvas) {
|
|
|
2769
2781
|
audience: "educator",
|
|
2770
2782
|
description: "Update an existing course. Only provided fields are changed; omitted fields are left as-is.",
|
|
2771
2783
|
inputSchema: {
|
|
2772
|
-
course_id:
|
|
2784
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
|
|
2773
2785
|
name: _zod.z.string().optional().describe("New course name"),
|
|
2774
2786
|
course_code: _zod.z.string().optional().describe("New course code"),
|
|
2775
2787
|
start_at: _zod.z.string().datetime().optional().describe("New start date in ISO 8601 format (e.g. 2026-01-15T00:00:00Z)"),
|
|
2776
2788
|
end_at: _zod.z.string().datetime().optional().describe("New end date in ISO 8601 format (e.g. 2026-05-15T00:00:00Z)"),
|
|
2777
2789
|
default_view: _zod.z.enum(["feed", "wiki", "modules", "assignments", "syllabus"]).optional().describe("Default course home page view"),
|
|
2778
|
-
syllabus_body: _zod.z.string().optional().describe("HTML body for the course syllabus")
|
|
2790
|
+
syllabus_body: _zod.z.string().optional().describe("HTML body for the course syllabus"),
|
|
2791
|
+
apply_assignment_group_weights: _zod.z.boolean().optional().describe("Whether the final grade is weighted by assignment group percentages"),
|
|
2792
|
+
hide_final_grades: _zod.z.boolean().optional().describe("Whether to hide the totals in the student grades summary")
|
|
2779
2793
|
},
|
|
2780
2794
|
annotations: {
|
|
2781
2795
|
destructiveHint: true,
|
|
@@ -2901,7 +2915,7 @@ function discussionTools(canvas) {
|
|
|
2901
2915
|
title: "List Discussions",
|
|
2902
2916
|
description: "List all discussion topics in a course.",
|
|
2903
2917
|
inputSchema: {
|
|
2904
|
-
course_id:
|
|
2918
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2905
2919
|
},
|
|
2906
2920
|
annotations: {
|
|
2907
2921
|
readOnlyHint: true,
|
|
@@ -2920,8 +2934,8 @@ function discussionTools(canvas) {
|
|
|
2920
2934
|
// edit also requires `pnpm generate:manifests`.
|
|
2921
2935
|
description: "Get details for a single discussion topic by ID.",
|
|
2922
2936
|
inputSchema: {
|
|
2923
|
-
course_id:
|
|
2924
|
-
topic_id:
|
|
2937
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
2938
|
+
topic_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
|
|
2925
2939
|
},
|
|
2926
2940
|
annotations: {
|
|
2927
2941
|
readOnlyHint: true,
|
|
@@ -2933,7 +2947,7 @@ function discussionTools(canvas) {
|
|
|
2933
2947
|
try {
|
|
2934
2948
|
return await canvas.discussions.get(course_id, topic_id);
|
|
2935
2949
|
} catch (error) {
|
|
2936
|
-
if (!(error instanceof
|
|
2950
|
+
if (!(error instanceof _chunkZKG3VDNNcjs.CanvasApiError) || error.status !== 404) throw error;
|
|
2937
2951
|
const description = await describeAnonymityFromList(canvas, course_id, topic_id);
|
|
2938
2952
|
if (description === void 0) throw error;
|
|
2939
2953
|
throw new Error(anonymousTopicMessage(course_id, topic_id, description), {
|
|
@@ -2947,7 +2961,7 @@ function discussionTools(canvas) {
|
|
|
2947
2961
|
title: "List Group Discussions",
|
|
2948
2962
|
description: "List all discussion topics in a group.",
|
|
2949
2963
|
inputSchema: {
|
|
2950
|
-
group_id:
|
|
2964
|
+
group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
|
|
2951
2965
|
},
|
|
2952
2966
|
annotations: {
|
|
2953
2967
|
readOnlyHint: true,
|
|
@@ -2966,8 +2980,8 @@ function discussionTools(canvas) {
|
|
|
2966
2980
|
// embeds this string, so any edit also requires `pnpm generate:manifests`.
|
|
2967
2981
|
description: "Get details for a single discussion topic in a group by ID.",
|
|
2968
2982
|
inputSchema: {
|
|
2969
|
-
group_id:
|
|
2970
|
-
topic_id:
|
|
2983
|
+
group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID"),
|
|
2984
|
+
topic_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
|
|
2971
2985
|
},
|
|
2972
2986
|
annotations: {
|
|
2973
2987
|
readOnlyHint: true,
|
|
@@ -2979,7 +2993,7 @@ function discussionTools(canvas) {
|
|
|
2979
2993
|
try {
|
|
2980
2994
|
return await canvas.discussions.getForGroup(group_id, topic_id);
|
|
2981
2995
|
} catch (error) {
|
|
2982
|
-
if (!(error instanceof
|
|
2996
|
+
if (!(error instanceof _chunkZKG3VDNNcjs.CanvasApiError) || error.status !== 404) throw error;
|
|
2983
2997
|
const description = await describeGroupAnonymityFromList(canvas, group_id, topic_id);
|
|
2984
2998
|
if (description === void 0) throw error;
|
|
2985
2999
|
throw new Error(anonymousGroupTopicMessage(group_id, topic_id, description), {
|
|
@@ -2993,7 +3007,7 @@ function discussionTools(canvas) {
|
|
|
2993
3007
|
title: "List Announcements",
|
|
2994
3008
|
description: "List all announcements in a course.",
|
|
2995
3009
|
inputSchema: {
|
|
2996
|
-
course_id:
|
|
3010
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
2997
3011
|
},
|
|
2998
3012
|
annotations: {
|
|
2999
3013
|
readOnlyHint: true,
|
|
@@ -3009,8 +3023,8 @@ function discussionTools(canvas) {
|
|
|
3009
3023
|
title: "Post Discussion Entry",
|
|
3010
3024
|
description: "Post a new entry (reply) to a discussion topic.",
|
|
3011
3025
|
inputSchema: {
|
|
3012
|
-
course_id:
|
|
3013
|
-
topic_id:
|
|
3026
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3027
|
+
topic_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
|
|
3014
3028
|
message: _zod.z.string().describe("The message body (supports HTML)")
|
|
3015
3029
|
},
|
|
3016
3030
|
annotations: {
|
|
@@ -3030,7 +3044,7 @@ function discussionTools(canvas) {
|
|
|
3030
3044
|
audience: "educator",
|
|
3031
3045
|
description: "Create a new discussion topic in a course.",
|
|
3032
3046
|
inputSchema: {
|
|
3033
|
-
course_id:
|
|
3047
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3034
3048
|
title: _zod.z.string().min(1).describe("Title of the discussion topic"),
|
|
3035
3049
|
message: _zod.z.string().optional().describe("Body text of the discussion (supports HTML)"),
|
|
3036
3050
|
discussion_type: _zod.z.enum(["side_comment", "threaded"]).optional().describe("Discussion type: side_comment (flat) or threaded"),
|
|
@@ -3067,8 +3081,8 @@ function discussionTools(canvas) {
|
|
|
3067
3081
|
audience: "educator",
|
|
3068
3082
|
description: "Update an existing discussion topic.",
|
|
3069
3083
|
inputSchema: {
|
|
3070
|
-
course_id:
|
|
3071
|
-
topic_id:
|
|
3084
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3085
|
+
topic_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
|
|
3072
3086
|
title: _zod.z.string().optional().describe("New title for the discussion topic"),
|
|
3073
3087
|
message: _zod.z.string().optional().describe("New body text (supports HTML)"),
|
|
3074
3088
|
published: _zod.z.boolean().optional().describe("Publish or unpublish the topic"),
|
|
@@ -3108,8 +3122,8 @@ function discussionTools(canvas) {
|
|
|
3108
3122
|
audience: "educator",
|
|
3109
3123
|
description: "Delete a discussion topic from a course. This action is permanent.",
|
|
3110
3124
|
inputSchema: {
|
|
3111
|
-
course_id:
|
|
3112
|
-
topic_id:
|
|
3125
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3126
|
+
topic_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID to delete")
|
|
3113
3127
|
},
|
|
3114
3128
|
annotations: {
|
|
3115
3129
|
destructiveHint: true,
|
|
@@ -3167,8 +3181,8 @@ function enrollmentTools(canvas, pseudonymizer) {
|
|
|
3167
3181
|
state: _zod.z.array(_zod.z.enum(ENROLLMENT_STATE)).optional().describe("Filter by one or more enrollment states"),
|
|
3168
3182
|
role: _zod.z.array(_zod.z.string()).optional().describe("Filter by enrollment role names (as defined in the Canvas account)"),
|
|
3169
3183
|
include: _zod.z.array(_zod.z.enum(ENROLLMENT_INCLUDE)).optional().describe("Extra fields to include on each enrollment (Canvas include[] param)"),
|
|
3170
|
-
grading_period_id:
|
|
3171
|
-
enrollment_term_id:
|
|
3184
|
+
grading_period_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Return enrollments scoped to this grading period"),
|
|
3185
|
+
enrollment_term_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
|
|
3172
3186
|
},
|
|
3173
3187
|
annotations: {
|
|
3174
3188
|
readOnlyHint: true,
|
|
@@ -3198,14 +3212,14 @@ function enrollmentTools(canvas, pseudonymizer) {
|
|
|
3198
3212
|
audience: "educator",
|
|
3199
3213
|
description: "List enrollments within a specific course with Canvas filters. Use `include=grades` / `include=current_points` for richer grade data, `type[]` to limit to a role, and `user_id` to focus on a single user.",
|
|
3200
3214
|
inputSchema: {
|
|
3201
|
-
course_id:
|
|
3215
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3202
3216
|
type: _zod.z.array(_zod.z.enum(ENROLLMENT_TYPE)).optional().describe("Filter by one or more enrollment types"),
|
|
3203
3217
|
state: _zod.z.array(_zod.z.enum(ENROLLMENT_STATE)).optional().describe("Filter by enrollment states"),
|
|
3204
3218
|
role: _zod.z.array(_zod.z.string()).optional().describe("Filter by custom role names"),
|
|
3205
3219
|
include: _zod.z.array(_zod.z.enum(ENROLLMENT_INCLUDE)).optional().describe("Extra fields to include (Canvas include[] param)"),
|
|
3206
|
-
user_id:
|
|
3207
|
-
grading_period_id:
|
|
3208
|
-
enrollment_term_id:
|
|
3220
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, { sentinels: ["self"] }).optional().describe('Filter to a specific user. Canvas ID (pass large IDs as a string) or "self".'),
|
|
3221
|
+
grading_period_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Scope grade-related includes to this grading period"),
|
|
3222
|
+
enrollment_term_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
|
|
3209
3223
|
},
|
|
3210
3224
|
annotations: {
|
|
3211
3225
|
readOnlyHint: true,
|
|
@@ -3234,8 +3248,8 @@ function enrollmentTools(canvas, pseudonymizer) {
|
|
|
3234
3248
|
title: "Enroll User",
|
|
3235
3249
|
description: "Enroll a user in a course with a specified role.",
|
|
3236
3250
|
inputSchema: {
|
|
3237
|
-
course_id:
|
|
3238
|
-
user_id:
|
|
3251
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3252
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID to enroll"),
|
|
3239
3253
|
type: _zod.z.enum([
|
|
3240
3254
|
"StudentEnrollment",
|
|
3241
3255
|
"TeacherEnrollment",
|
|
@@ -3263,8 +3277,8 @@ function enrollmentTools(canvas, pseudonymizer) {
|
|
|
3263
3277
|
title: "Remove Enrollment",
|
|
3264
3278
|
description: "Remove or conclude an enrollment from a course. The 'delete' task is permanent; 'conclude' and 'deactivate' are reversible.",
|
|
3265
3279
|
inputSchema: {
|
|
3266
|
-
course_id:
|
|
3267
|
-
enrollment_id:
|
|
3280
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3281
|
+
enrollment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The enrollment ID to remove"),
|
|
3268
3282
|
task: _zod.z.enum(["conclude", "delete", "deactivate"]).describe("The action to perform on the enrollment")
|
|
3269
3283
|
},
|
|
3270
3284
|
annotations: {
|
|
@@ -3342,7 +3356,7 @@ function fileTools(canvas) {
|
|
|
3342
3356
|
title: "List Files",
|
|
3343
3357
|
description: "List all files in a course.",
|
|
3344
3358
|
inputSchema: {
|
|
3345
|
-
course_id:
|
|
3359
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
3346
3360
|
},
|
|
3347
3361
|
annotations: {
|
|
3348
3362
|
readOnlyHint: true,
|
|
@@ -3358,7 +3372,7 @@ function fileTools(canvas) {
|
|
|
3358
3372
|
title: "List Folders",
|
|
3359
3373
|
description: "List all folders in a course.",
|
|
3360
3374
|
inputSchema: {
|
|
3361
|
-
course_id:
|
|
3375
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
3362
3376
|
},
|
|
3363
3377
|
annotations: {
|
|
3364
3378
|
readOnlyHint: true,
|
|
@@ -3374,8 +3388,8 @@ function fileTools(canvas) {
|
|
|
3374
3388
|
title: "Get File",
|
|
3375
3389
|
description: "Get metadata for a single file by ID, including download URL.",
|
|
3376
3390
|
inputSchema: {
|
|
3377
|
-
course_id:
|
|
3378
|
-
file_id:
|
|
3391
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3392
|
+
file_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
|
|
3379
3393
|
},
|
|
3380
3394
|
annotations: {
|
|
3381
3395
|
readOnlyHint: true,
|
|
@@ -3393,7 +3407,7 @@ function fileTools(canvas) {
|
|
|
3393
3407
|
audience: "educator",
|
|
3394
3408
|
description: "Upload a file to a course. Content must be base64-encoded. Canvas performs a multi-step upload internally.",
|
|
3395
3409
|
inputSchema: {
|
|
3396
|
-
course_id:
|
|
3410
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3397
3411
|
name: _zod.z.string().describe("File name including extension"),
|
|
3398
3412
|
content: _zod.z.string().describe("Base64-encoded file content"),
|
|
3399
3413
|
content_type: _zod.z.string().describe('MIME type, e.g. "application/pdf" or "image/png"'),
|
|
@@ -3418,7 +3432,7 @@ function fileTools(canvas) {
|
|
|
3418
3432
|
audience: "educator",
|
|
3419
3433
|
description: "Delete a file by ID. This action is permanent.",
|
|
3420
3434
|
inputSchema: {
|
|
3421
|
-
file_id:
|
|
3435
|
+
file_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
|
|
3422
3436
|
},
|
|
3423
3437
|
annotations: {
|
|
3424
3438
|
destructiveHint: true,
|
|
@@ -3434,8 +3448,8 @@ function fileTools(canvas) {
|
|
|
3434
3448
|
title: "Download File",
|
|
3435
3449
|
description: "Download the content of a Canvas file by ID. Text files (plain text, HTML, JSON, XML, JavaScript) are returned as readable text. Binary files (images, PDFs, etc.) are returned as base64-encoded data. Files larger than 10 MB are refused.",
|
|
3436
3450
|
inputSchema: {
|
|
3437
|
-
file_id:
|
|
3438
|
-
course_id:
|
|
3451
|
+
file_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID"),
|
|
3452
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas course ID to scope the file lookup")
|
|
3439
3453
|
},
|
|
3440
3454
|
annotations: {
|
|
3441
3455
|
readOnlyHint: true,
|
|
@@ -3452,8 +3466,8 @@ function fileTools(canvas) {
|
|
|
3452
3466
|
title: "Find Duplicate Files",
|
|
3453
3467
|
description: "Find duplicate files in a course's Files area \u2014 copies with the same name and size, typically left behind by repeated course copies. Each duplicate gets flagged separately by accessibility checkers, so this surfaces them for cleanup with the existing delete_file tool. Groups by display name + size (Canvas file listings carry no content hash), so same-name files of different sizes are not considered duplicates.",
|
|
3454
3468
|
inputSchema: {
|
|
3455
|
-
course_id:
|
|
3456
|
-
folder_id:
|
|
3469
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3470
|
+
folder_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
3457
3471
|
"Optional Canvas folder ID to scope the search to that folder and its subfolders"
|
|
3458
3472
|
)
|
|
3459
3473
|
},
|
|
@@ -3494,7 +3508,7 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
|
|
|
3494
3508
|
title: "List Gradebook History Days",
|
|
3495
3509
|
description: "List the dates in a course gradebook history that contain grading activity, grouped by grader and assignment.",
|
|
3496
3510
|
inputSchema: {
|
|
3497
|
-
course_id:
|
|
3511
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
3498
3512
|
},
|
|
3499
3513
|
annotations: {
|
|
3500
3514
|
readOnlyHint: true,
|
|
@@ -3510,7 +3524,7 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
|
|
|
3510
3524
|
title: "Get Gradebook History Day",
|
|
3511
3525
|
description: "Get the graders and assignment IDs that had gradebook activity on a specific course date.",
|
|
3512
3526
|
inputSchema: {
|
|
3513
|
-
course_id:
|
|
3527
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3514
3528
|
date: _zod.z.string().describe("The gradebook history date to inspect, in YYYY-MM-DD format")
|
|
3515
3529
|
},
|
|
3516
3530
|
annotations: {
|
|
@@ -3528,10 +3542,10 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
|
|
|
3528
3542
|
title: "List Gradebook History Submissions",
|
|
3529
3543
|
description: "List versioned submission history for one grader and assignment on a specific gradebook history date.",
|
|
3530
3544
|
inputSchema: {
|
|
3531
|
-
course_id:
|
|
3545
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3532
3546
|
date: _zod.z.string().describe("The gradebook history date to inspect, in YYYY-MM-DD format"),
|
|
3533
|
-
grader_id:
|
|
3534
|
-
assignment_id:
|
|
3547
|
+
grader_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the grader"),
|
|
3548
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
|
|
3535
3549
|
},
|
|
3536
3550
|
annotations: {
|
|
3537
3551
|
readOnlyHint: true,
|
|
@@ -3564,9 +3578,9 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
|
|
|
3564
3578
|
title: "Get Gradebook History Feed",
|
|
3565
3579
|
description: "Get the paginated gradebook history feed for a course, optionally filtered by assignment or user and optionally sorted oldest-first.",
|
|
3566
3580
|
inputSchema: {
|
|
3567
|
-
course_id:
|
|
3568
|
-
assignment_id:
|
|
3569
|
-
user_id:
|
|
3581
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
3582
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter the feed"),
|
|
3583
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID to filter the feed"),
|
|
3570
3584
|
ascending: _zod.z.boolean().optional().describe("Set true to return the oldest gradebook history entries first")
|
|
3571
3585
|
},
|
|
3572
3586
|
annotations: {
|
|
@@ -3841,11 +3855,11 @@ function gradeExplanationTools(canvas, pseudonymizer) {
|
|
|
3841
3855
|
title: "Explain Grade",
|
|
3842
3856
|
description: "Recomputes and explains the weighted course grade for a student, including assignment-group weights, drop_lowest / drop_highest / never_drop rules, per-group breakdowns (earned points, dropped assignments, weighted contributions), the mapped letter grade (via the course grading standard when present), and a reconciliation check against Canvas's posted current_score / final_score.\n\nUse this when you need to verify that Canvas's displayed grade matches the rules, or to explain to a student or instructor how their grade was calculated.\n\nLimitations:\n- V1 computes one student per call. Omit student_id to compute for the authenticated user.\n- Instructor-applied curves and fudge points are not exposed via the Canvas REST API and cannot be reflected in the computation; a caveat is added when the discrepancy exceeds 0.5 pp.\n- When the course uses grading periods, reconciliation is against the overall (cross-period) grade.\n- When CANVAS_PSEUDONYMIZE_STUDENTS is enabled and you are passing a student_id, first call resolve_pseudonym to obtain the real Canvas user_id.",
|
|
3843
3857
|
inputSchema: {
|
|
3844
|
-
course_id:
|
|
3845
|
-
student_id:
|
|
3858
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to compute the grade for."),
|
|
3859
|
+
student_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
3846
3860
|
"Canvas user_id of the student to compute the grade for. Omit to compute for the currently authenticated user. Instructors may pass any enrolled student's user_id. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, pass the numeric Canvas user_id after resolving the pseudonym via resolve_pseudonym."
|
|
3847
3861
|
),
|
|
3848
|
-
assignment_group_id:
|
|
3862
|
+
assignment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
3849
3863
|
"Narrow the output to a single assignment group. When omitted all groups are included and the overall course grade is computed."
|
|
3850
3864
|
)
|
|
3851
3865
|
},
|
|
@@ -4081,7 +4095,7 @@ Limitations:
|
|
|
4081
4095
|
- Late-submission penalties are not factored in.
|
|
4082
4096
|
- V1 computes one student per call. Omit student_id to compute for the authenticated user. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, resolve the pseudonym first via resolve_pseudonym.`,
|
|
4083
4097
|
inputSchema: {
|
|
4084
|
-
course_id:
|
|
4098
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe(
|
|
4085
4099
|
"Canvas course ID to compute the grade projection for."
|
|
4086
4100
|
),
|
|
4087
4101
|
target_percentage: _zod.z.number().min(0).max(100).optional().describe(
|
|
@@ -4090,7 +4104,7 @@ Limitations:
|
|
|
4090
4104
|
target_letter: _zod.z.string().optional().describe(
|
|
4091
4105
|
'Target course grade as a letter (e.g. "A", "B+"). Requires the course to have a grading standard configured. Exactly one of target_percentage or target_letter must be provided. Case-insensitive.'
|
|
4092
4106
|
),
|
|
4093
|
-
student_id:
|
|
4107
|
+
student_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
4094
4108
|
"Canvas user_id of the student to compute for. Omit to compute for the authenticated user. Instructors may pass any enrolled student's user_id. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, pass the numeric Canvas user_id after resolving the pseudonym via resolve_pseudonym."
|
|
4095
4109
|
)
|
|
4096
4110
|
},
|
|
@@ -4294,7 +4308,7 @@ function gradingPolicyTools(canvas) {
|
|
|
4294
4308
|
title: "Explain Grading Policy",
|
|
4295
4309
|
description: "Explains the grading automation rules configured for a Canvas course:\n- Missing-submission policy: whether blank/unsubmitted work is automatically scored 0 (or another deduction), or left unpenalised.\n- Late-submission policy: whether Canvas applies a per-day or per-hour percentage deduction to late submissions, and whether there is a floor below which the grade cannot fall.\n- Assignment-group weighting: whether the course uses weighted groups, and the weight of each group.\n- Grading scheme: whether a letter-grade scheme (A/B/C/F mapping) is applied to the final score.\n\nAlso returns a plain-language summary paragraph you can share with students or instructors.\n\nNote: the late/missing policy section requires instructor or admin permissions. Students receive the group-weighting and grading-scheme sections only, with a caveat noting what is unavailable. Use explain_grade to compute the actual weighted grade for a specific student.",
|
|
4296
4310
|
inputSchema: {
|
|
4297
|
-
course_id:
|
|
4311
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to explain the grading policy for.")
|
|
4298
4312
|
},
|
|
4299
4313
|
annotations: {
|
|
4300
4314
|
readOnlyHint: true,
|
|
@@ -4321,9 +4335,9 @@ function gradingPolicyTools(canvas) {
|
|
|
4321
4335
|
latePolicySource = "api";
|
|
4322
4336
|
} else {
|
|
4323
4337
|
const err = latePolicyResult.reason;
|
|
4324
|
-
if (err instanceof
|
|
4338
|
+
if (err instanceof _chunkZKG3VDNNcjs.CanvasApiError && err.status === 403) {
|
|
4325
4339
|
policyUnavailable = true;
|
|
4326
|
-
} else if (err instanceof
|
|
4340
|
+
} else if (err instanceof _chunkZKG3VDNNcjs.CanvasApiError && err.status === 404) {
|
|
4327
4341
|
latePolicySource = "default";
|
|
4328
4342
|
} else {
|
|
4329
4343
|
throw err;
|
|
@@ -4353,7 +4367,7 @@ function gradingPolicyTools(canvas) {
|
|
|
4353
4367
|
}
|
|
4354
4368
|
}
|
|
4355
4369
|
} catch (err) {
|
|
4356
|
-
if (!(err instanceof
|
|
4370
|
+
if (!(err instanceof _chunkZKG3VDNNcjs.CanvasApiError)) throw err;
|
|
4357
4371
|
if (err.status !== 403 && err.status !== 404) throw err;
|
|
4358
4372
|
}
|
|
4359
4373
|
if (standardTitle === null) {
|
|
@@ -4424,8 +4438,8 @@ function gradingStandardsTools(canvas) {
|
|
|
4424
4438
|
title: "List Grading Standards",
|
|
4425
4439
|
description: "List grading standards available in a course or account context. Provide either course_id (to see standards scoped to a course) or account_id (to see account-level standards, requires admin access). Returns an array of grading standard objects, each with an id, title, context, and grading_scheme array of { name, value } entries.",
|
|
4426
4440
|
inputSchema: {
|
|
4427
|
-
course_id:
|
|
4428
|
-
account_id:
|
|
4441
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to list standards for (mutually exclusive with account_id)"),
|
|
4442
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
4429
4443
|
"Account ID to list standards for (mutually exclusive with course_id; requires admin)"
|
|
4430
4444
|
)
|
|
4431
4445
|
},
|
|
@@ -4453,8 +4467,8 @@ function gradingStandardsTools(canvas) {
|
|
|
4453
4467
|
title: "Create Grading Standard",
|
|
4454
4468
|
description: 'Create a new grading standard (letter-to-percentage scheme) in a course or account context. Provide either course_id or account_id (account requires admin). scheme_entries is an array of { name, value } objects where value is the lower-bound percentage as a fraction 0\u20131 (e.g. { name: "A", value: 0.94 } means A \u2265 94%). Entries will be sorted descending by value before sending to Canvas. Canvas POST body key is grading_scheme_entry (singular); the returned object uses grading_scheme (plural). Returns the created grading standard object including its id \u2014 use that id with apply_grading_standard_to_course to activate it on a course.',
|
|
4455
4469
|
inputSchema: {
|
|
4456
|
-
course_id:
|
|
4457
|
-
account_id:
|
|
4470
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to create the standard in (mutually exclusive with account_id)"),
|
|
4471
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
4458
4472
|
"Account ID to create the standard in (requires admin; mutually exclusive with course_id)"
|
|
4459
4473
|
),
|
|
4460
4474
|
title: _zod.z.string().min(1).describe('Display name for this grading standard (e.g. "GPA 4.0 Scale")'),
|
|
@@ -4483,7 +4497,7 @@ function gradingStandardsTools(canvas) {
|
|
|
4483
4497
|
}
|
|
4484
4498
|
throw new Error("Provide either course_id or account_id.");
|
|
4485
4499
|
} catch (error) {
|
|
4486
|
-
if (error instanceof
|
|
4500
|
+
if (error instanceof _chunkZKG3VDNNcjs.CanvasApiError && error.status === 403 && courseId === void 0 && accountId !== void 0 && !error.message.toLowerCase().includes("rate limit exceeded")) {
|
|
4487
4501
|
throw new Error(
|
|
4488
4502
|
"Creating grading standards at the account level requires Canvas admin permissions. Try creating the standard in a course context instead (use course_id).",
|
|
4489
4503
|
{ cause: error }
|
|
@@ -4498,8 +4512,8 @@ function gradingStandardsTools(canvas) {
|
|
|
4498
4512
|
title: "Apply Grading Standard to Course",
|
|
4499
4513
|
description: "Apply an existing grading standard to a course so the gradebook uses it. Pass the grading_standard_id returned by create_grading_standard or list_grading_standards. Pass null for grading_standard_id to remove the current grading standard from the course. Returns the updated course object.",
|
|
4500
4514
|
inputSchema: {
|
|
4501
|
-
course_id:
|
|
4502
|
-
grading_standard_id:
|
|
4515
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
|
|
4516
|
+
grading_standard_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).nullable().describe("The grading standard ID to apply, or null to remove the current standard")
|
|
4503
4517
|
},
|
|
4504
4518
|
annotations: {
|
|
4505
4519
|
destructiveHint: true,
|
|
@@ -4522,7 +4536,7 @@ function groupTools(canvas, pseudonymizer) {
|
|
|
4522
4536
|
title: "List Groups",
|
|
4523
4537
|
description: "List all groups in a course.",
|
|
4524
4538
|
inputSchema: {
|
|
4525
|
-
course_id:
|
|
4539
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
4526
4540
|
},
|
|
4527
4541
|
annotations: {
|
|
4528
4542
|
readOnlyHint: true,
|
|
@@ -4538,7 +4552,7 @@ function groupTools(canvas, pseudonymizer) {
|
|
|
4538
4552
|
title: "List Group Members",
|
|
4539
4553
|
description: "List all members of a group.",
|
|
4540
4554
|
inputSchema: {
|
|
4541
|
-
group_id:
|
|
4555
|
+
group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
|
|
4542
4556
|
},
|
|
4543
4557
|
annotations: {
|
|
4544
4558
|
readOnlyHint: true,
|
|
@@ -4584,7 +4598,7 @@ function moduleTools(canvas) {
|
|
|
4584
4598
|
audience: "shared",
|
|
4585
4599
|
description: "List all modules in a course.",
|
|
4586
4600
|
inputSchema: {
|
|
4587
|
-
course_id:
|
|
4601
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
4588
4602
|
},
|
|
4589
4603
|
annotations: {
|
|
4590
4604
|
readOnlyHint: true,
|
|
@@ -4601,8 +4615,8 @@ function moduleTools(canvas) {
|
|
|
4601
4615
|
audience: "shared",
|
|
4602
4616
|
description: "Get details for a single module by ID.",
|
|
4603
4617
|
inputSchema: {
|
|
4604
|
-
course_id:
|
|
4605
|
-
module_id:
|
|
4618
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4619
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
|
|
4606
4620
|
},
|
|
4607
4621
|
annotations: {
|
|
4608
4622
|
readOnlyHint: true,
|
|
@@ -4620,8 +4634,8 @@ function moduleTools(canvas) {
|
|
|
4620
4634
|
audience: "shared",
|
|
4621
4635
|
description: "List all items within a module.",
|
|
4622
4636
|
inputSchema: {
|
|
4623
|
-
course_id:
|
|
4624
|
-
module_id:
|
|
4637
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4638
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
|
|
4625
4639
|
},
|
|
4626
4640
|
annotations: {
|
|
4627
4641
|
readOnlyHint: true,
|
|
@@ -4639,7 +4653,7 @@ function moduleTools(canvas) {
|
|
|
4639
4653
|
audience: "shared",
|
|
4640
4654
|
description: "Return the full module \u2192 items tree for a course in a single call, with summary stats. Avoids N+1 round-trips when an agent needs to reason over the whole course shape.",
|
|
4641
4655
|
inputSchema: {
|
|
4642
|
-
course_id:
|
|
4656
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4643
4657
|
include_published_only: _zod.z.boolean().optional().describe("When true, exclude unpublished items from each module (default: false)"),
|
|
4644
4658
|
include_content_details: _zod.z.boolean().optional().describe(
|
|
4645
4659
|
"When true, fetch content_details for each item (adds extra Canvas API data; default: false)"
|
|
@@ -4667,7 +4681,7 @@ function moduleTools(canvas) {
|
|
|
4667
4681
|
audience: "shared",
|
|
4668
4682
|
description: "Interactive tree view of a course's modules and items. Returns the same payload as `get_course_structure` and additionally links to an MCP Apps UI resource that renders an explorable tree with type filters and search. Hosts that do not support MCP Apps fall back to the JSON payload (same as `get_course_structure`).",
|
|
4669
4683
|
inputSchema: {
|
|
4670
|
-
course_id:
|
|
4684
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4671
4685
|
include_published_only: _zod.z.boolean().optional().describe("When true, exclude unpublished items (default: false)"),
|
|
4672
4686
|
include_content_details: _zod.z.boolean().optional().describe("When true, fetch content_details for each item (default: false)")
|
|
4673
4687
|
},
|
|
@@ -4696,11 +4710,11 @@ function moduleTools(canvas) {
|
|
|
4696
4710
|
title: "Create Module",
|
|
4697
4711
|
description: "Create a new module in a course.",
|
|
4698
4712
|
inputSchema: {
|
|
4699
|
-
course_id:
|
|
4713
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4700
4714
|
name: _zod.z.string().describe("Name of the module"),
|
|
4701
4715
|
position: _zod.z.number().optional().describe("Position of the module in the list"),
|
|
4702
4716
|
unlock_at: _zod.z.string().optional().describe("Date/time the module unlocks (ISO 8601)"),
|
|
4703
|
-
prerequisite_module_ids: _zod.z.array(
|
|
4717
|
+
prerequisite_module_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("IDs of modules that must be completed before this one")
|
|
4704
4718
|
},
|
|
4705
4719
|
annotations: {
|
|
4706
4720
|
destructiveHint: true,
|
|
@@ -4721,8 +4735,8 @@ function moduleTools(canvas) {
|
|
|
4721
4735
|
title: "Update Module",
|
|
4722
4736
|
description: "Update an existing module (rename, reposition, publish/unpublish).",
|
|
4723
4737
|
inputSchema: {
|
|
4724
|
-
course_id:
|
|
4725
|
-
module_id:
|
|
4738
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4739
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
|
|
4726
4740
|
name: _zod.z.string().optional().describe("New name for the module"),
|
|
4727
4741
|
position: _zod.z.number().optional().describe("New position in the module list"),
|
|
4728
4742
|
published: _zod.z.boolean().optional().describe("Whether the module is published")
|
|
@@ -4746,8 +4760,8 @@ function moduleTools(canvas) {
|
|
|
4746
4760
|
title: "Create Module Item",
|
|
4747
4761
|
description: "Add an item (Assignment, Page, Quiz, File, Discussion, ExternalUrl, ExternalTool, SubHeader) to a module.",
|
|
4748
4762
|
inputSchema: {
|
|
4749
|
-
course_id:
|
|
4750
|
-
module_id:
|
|
4763
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4764
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
|
|
4751
4765
|
title: _zod.z.string().describe("Title of the module item"),
|
|
4752
4766
|
type: _zod.z.enum([
|
|
4753
4767
|
"File",
|
|
@@ -4759,7 +4773,7 @@ function moduleTools(canvas) {
|
|
|
4759
4773
|
"ExternalTool",
|
|
4760
4774
|
"SubHeader"
|
|
4761
4775
|
]).describe("Type of content to add"),
|
|
4762
|
-
content_id:
|
|
4776
|
+
content_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Canvas ID of the content (required for File, Discussion, Assignment, Quiz)"),
|
|
4763
4777
|
page_url: _zod.z.string().optional().describe("Page URL slug (required for Page items, which are addressed by slug, not ID)"),
|
|
4764
4778
|
external_url: _zod.z.string().optional().describe("URL for ExternalUrl or ExternalTool items"),
|
|
4765
4779
|
position: _zod.z.number().optional().describe("Position within the module")
|
|
@@ -4786,16 +4800,16 @@ function moduleTools(canvas) {
|
|
|
4786
4800
|
title: "Update Module Item",
|
|
4787
4801
|
description: "Edit an existing module item in place: rename it, repoint an ExternalUrl/ExternalTool item, reposition or re-indent it, publish/unpublish it, or move it to another module. ExternalUrl items exist only as module items, so a stale link carried in by a course copy can only be fixed here.",
|
|
4788
4802
|
inputSchema: {
|
|
4789
|
-
course_id:
|
|
4790
|
-
module_id:
|
|
4791
|
-
item_id:
|
|
4803
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4804
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID the item currently belongs to"),
|
|
4805
|
+
item_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID"),
|
|
4792
4806
|
title: _zod.z.string().optional().describe("New title for the module item"),
|
|
4793
4807
|
external_url: _zod.z.string().optional().describe("New URL for an ExternalUrl or ExternalTool item"),
|
|
4794
4808
|
position: _zod.z.number().optional().describe("New 1-based position within the module"),
|
|
4795
4809
|
indent: _zod.z.number().optional().describe("New indent level (0 = flush left)"),
|
|
4796
4810
|
new_tab: _zod.z.boolean().optional().describe("Whether an external item opens in a new tab"),
|
|
4797
4811
|
published: _zod.z.boolean().optional().describe("Whether the item is published"),
|
|
4798
|
-
target_module_id:
|
|
4812
|
+
target_module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Move the item to this module ID (omit to leave it where it is)")
|
|
4799
4813
|
},
|
|
4800
4814
|
annotations: {
|
|
4801
4815
|
destructiveHint: true,
|
|
@@ -4814,9 +4828,9 @@ function moduleTools(canvas) {
|
|
|
4814
4828
|
title: "Delete Module Item",
|
|
4815
4829
|
description: "Remove an item from a module. For ExternalUrl, ExternalTool and SubHeader items the item is the content, so this deletes it outright; for Assignment, Page, Quiz, File and Discussion items it only unlinks the item and the underlying content survives. Re-add with create_module_item.",
|
|
4816
4830
|
inputSchema: {
|
|
4817
|
-
course_id:
|
|
4818
|
-
module_id:
|
|
4819
|
-
item_id:
|
|
4831
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
4832
|
+
module_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
|
|
4833
|
+
item_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID to remove")
|
|
4820
4834
|
},
|
|
4821
4835
|
annotations: {
|
|
4822
4836
|
destructiveHint: true,
|
|
@@ -4842,8 +4856,8 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4842
4856
|
title: "Get Root Outcome Group",
|
|
4843
4857
|
description: "Get the root outcome group for an account or course context.",
|
|
4844
4858
|
inputSchema: {
|
|
4845
|
-
context_type: _zod.z.enum(
|
|
4846
|
-
context_id:
|
|
4859
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcomes from an account or course context."),
|
|
4860
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
|
|
4847
4861
|
},
|
|
4848
4862
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4849
4863
|
handler: async (params) => canvas.outcomes.getRootOutcomeGroup(
|
|
@@ -4856,8 +4870,8 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4856
4870
|
title: "List Outcome Groups",
|
|
4857
4871
|
description: "List all outcome groups for an account or course context.",
|
|
4858
4872
|
inputSchema: {
|
|
4859
|
-
context_type: _zod.z.enum(
|
|
4860
|
-
context_id:
|
|
4873
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome groups from an account or course context."),
|
|
4874
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
|
|
4861
4875
|
},
|
|
4862
4876
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4863
4877
|
handler: async (params) => canvas.outcomes.listOutcomeGroups(
|
|
@@ -4870,10 +4884,10 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4870
4884
|
title: "List Outcome Group Links",
|
|
4871
4885
|
description: "List all outcome links in an account or course context.",
|
|
4872
4886
|
inputSchema: {
|
|
4873
|
-
context_type: _zod.z.enum(
|
|
4874
|
-
context_id:
|
|
4875
|
-
outcome_style: _zod.z.enum(
|
|
4876
|
-
outcome_group_style: _zod.z.enum(
|
|
4887
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome links from an account or course context."),
|
|
4888
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
|
|
4889
|
+
outcome_style: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.'),
|
|
4890
|
+
outcome_group_style: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_DETAIL_LEVELS).optional().describe(
|
|
4877
4891
|
'Outcome group detail level. Use "full" to include expanded outcome group fields.'
|
|
4878
4892
|
)
|
|
4879
4893
|
},
|
|
@@ -4892,9 +4906,9 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4892
4906
|
title: "Get Outcome Group",
|
|
4893
4907
|
description: "Get details for a specific outcome group in an account or course context.",
|
|
4894
4908
|
inputSchema: {
|
|
4895
|
-
context_type: _zod.z.enum(
|
|
4896
|
-
context_id:
|
|
4897
|
-
outcome_group_id:
|
|
4909
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
|
|
4910
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
|
|
4911
|
+
outcome_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
|
|
4898
4912
|
},
|
|
4899
4913
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4900
4914
|
handler: async (params) => canvas.outcomes.getOutcomeGroup(
|
|
@@ -4908,10 +4922,10 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4908
4922
|
title: "List Outcome Group Outcomes",
|
|
4909
4923
|
description: "List the linked outcomes directly under a specific outcome group.",
|
|
4910
4924
|
inputSchema: {
|
|
4911
|
-
context_type: _zod.z.enum(
|
|
4912
|
-
context_id:
|
|
4913
|
-
outcome_group_id:
|
|
4914
|
-
outcome_style: _zod.z.enum(
|
|
4925
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
|
|
4926
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
|
|
4927
|
+
outcome_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID."),
|
|
4928
|
+
outcome_style: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.')
|
|
4915
4929
|
},
|
|
4916
4930
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4917
4931
|
handler: async (params) => canvas.outcomes.listGroupOutcomes(
|
|
@@ -4928,9 +4942,9 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4928
4942
|
title: "List Outcome Group Subgroups",
|
|
4929
4943
|
description: "List the immediate child outcome groups under a specific outcome group.",
|
|
4930
4944
|
inputSchema: {
|
|
4931
|
-
context_type: _zod.z.enum(
|
|
4932
|
-
context_id:
|
|
4933
|
-
outcome_group_id:
|
|
4945
|
+
context_type: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
|
|
4946
|
+
context_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
|
|
4947
|
+
outcome_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
|
|
4934
4948
|
},
|
|
4935
4949
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4936
4950
|
handler: async (params) => canvas.outcomes.listGroupSubgroups(
|
|
@@ -4944,7 +4958,7 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4944
4958
|
title: "Get Outcome",
|
|
4945
4959
|
description: "Get the full details for a specific learning outcome by ID.",
|
|
4946
4960
|
inputSchema: {
|
|
4947
|
-
outcome_id:
|
|
4961
|
+
outcome_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
|
|
4948
4962
|
add_defaults: _zod.z.boolean().optional().describe("Include default mastery colors and levels when Canvas supports it.")
|
|
4949
4963
|
},
|
|
4950
4964
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
@@ -4957,9 +4971,9 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4957
4971
|
title: "Get Outcome Alignments",
|
|
4958
4972
|
description: "Get outcome alignments for a course, optionally filtered to a specific student or assignment.",
|
|
4959
4973
|
inputSchema: {
|
|
4960
|
-
course_id:
|
|
4961
|
-
student_id:
|
|
4962
|
-
assignment_id:
|
|
4974
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
|
|
4975
|
+
student_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID of the student to filter alignments by."),
|
|
4976
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter alignments by.")
|
|
4963
4977
|
},
|
|
4964
4978
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
4965
4979
|
handler: async (params) => canvas.outcomes.getOutcomeAlignments(params.course_id, {
|
|
@@ -4972,11 +4986,11 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4972
4986
|
title: "Get Outcome Results",
|
|
4973
4987
|
description: "Get per-student outcome results for a course, with optional outcome, student, and alignment filters.",
|
|
4974
4988
|
inputSchema: {
|
|
4975
|
-
course_id:
|
|
4976
|
-
user_ids:
|
|
4989
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
|
|
4990
|
+
user_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
|
|
4977
4991
|
'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
|
|
4978
4992
|
),
|
|
4979
|
-
outcome_ids: _zod.z.array(
|
|
4993
|
+
outcome_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the results."),
|
|
4980
4994
|
include_alignments: _zod.z.boolean().optional().describe("Include linked alignment details in the response."),
|
|
4981
4995
|
include_hidden: _zod.z.boolean().optional().describe("Include hidden outcomes when Canvas supports it.")
|
|
4982
4996
|
},
|
|
@@ -4998,18 +5012,18 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
4998
5012
|
title: "Get Outcome Rollups",
|
|
4999
5013
|
description: "Get outcome rollups for a course, optionally aggregated or filtered by students, outcomes, and sort options.",
|
|
5000
5014
|
inputSchema: {
|
|
5001
|
-
course_id:
|
|
5015
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
|
|
5002
5016
|
aggregate: _zod.z.enum(["course"]).optional().describe("Aggregate all student rollups into a single course-level rollup."),
|
|
5003
|
-
aggregate_stat: _zod.z.enum(
|
|
5004
|
-
user_ids:
|
|
5017
|
+
aggregate_stat: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_ROLLUP_AGGREGATE_STATS).optional().describe('Statistic to use when aggregate="course".'),
|
|
5018
|
+
user_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
|
|
5005
5019
|
'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
|
|
5006
5020
|
),
|
|
5007
|
-
outcome_ids: _zod.z.array(
|
|
5021
|
+
outcome_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the rollups."),
|
|
5008
5022
|
include_courses: _zod.z.boolean().optional().describe("Include linked course details in the response payload."),
|
|
5009
|
-
exclude: _zod.z.array(_zod.z.enum(
|
|
5010
|
-
sort_by: _zod.z.enum(
|
|
5011
|
-
sort_outcome_id:
|
|
5012
|
-
sort_order: _zod.z.enum(
|
|
5023
|
+
exclude: _zod.z.array(_zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional rollup exclusions for missing users or missing outcome results."),
|
|
5024
|
+
sort_by: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_ROLLUP_SORT_BY).optional().describe("Sort rollups by student name or by a specific outcome score."),
|
|
5025
|
+
sort_outcome_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe('Outcome ID to sort by when sort_by="outcome".'),
|
|
5026
|
+
sort_order: _zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_SORT_ORDER).optional().describe("Sort order to apply when sorting rollups."),
|
|
5013
5027
|
add_defaults: _zod.z.boolean().optional().describe("Include default mastery colors and levels when Canvas supports it.")
|
|
5014
5028
|
},
|
|
5015
5029
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
@@ -5036,9 +5050,9 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
5036
5050
|
title: "Get Outcome Contributing Scores",
|
|
5037
5051
|
description: "Get assignment or quiz scores that contributed to a specific outcome for one or more students in a course.",
|
|
5038
5052
|
inputSchema: {
|
|
5039
|
-
course_id:
|
|
5040
|
-
outcome_id:
|
|
5041
|
-
user_ids:
|
|
5053
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
|
|
5054
|
+
outcome_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
|
|
5055
|
+
user_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
|
|
5042
5056
|
'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
|
|
5043
5057
|
),
|
|
5044
5058
|
only_assignment_alignments: _zod.z.boolean().optional().describe("Limit results to assignment alignments only."),
|
|
@@ -5060,10 +5074,10 @@ function outcomeTools(canvas, pseudonymizer) {
|
|
|
5060
5074
|
title: "Get Outcome Mastery Distribution",
|
|
5061
5075
|
description: "Get mastery distribution analytics for outcomes in a course, optionally filtered by students or outcomes.",
|
|
5062
5076
|
inputSchema: {
|
|
5063
|
-
course_id:
|
|
5064
|
-
exclude: _zod.z.array(_zod.z.enum(
|
|
5065
|
-
outcome_ids: _zod.z.array(
|
|
5066
|
-
student_ids:
|
|
5077
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
|
|
5078
|
+
exclude: _zod.z.array(_zod.z.enum(_chunkLGKRFDO5cjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional exclusions for missing users or missing outcome results."),
|
|
5079
|
+
outcome_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the distribution results."),
|
|
5080
|
+
student_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
|
|
5067
5081
|
'Optional Canvas student IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
|
|
5068
5082
|
),
|
|
5069
5083
|
include_alignment_distributions: _zod.z.boolean().optional().describe("Include contributing score distributions for alignments."),
|
|
@@ -5157,7 +5171,7 @@ function pageTools(canvas) {
|
|
|
5157
5171
|
audience: "shared",
|
|
5158
5172
|
description: "List all wiki pages in a course.",
|
|
5159
5173
|
inputSchema: {
|
|
5160
|
-
course_id:
|
|
5174
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
5161
5175
|
},
|
|
5162
5176
|
output: listOutput("pages", canvasPageSchema),
|
|
5163
5177
|
annotations: {
|
|
@@ -5175,7 +5189,7 @@ function pageTools(canvas) {
|
|
|
5175
5189
|
audience: "shared",
|
|
5176
5190
|
description: "Get a single wiki page by its URL slug.",
|
|
5177
5191
|
inputSchema: {
|
|
5178
|
-
course_id:
|
|
5192
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5179
5193
|
page_url: _zod.z.string().describe('The page URL slug (e.g. "welcome-page")')
|
|
5180
5194
|
},
|
|
5181
5195
|
output: objectOutput(canvasPageSchema),
|
|
@@ -5194,7 +5208,7 @@ function pageTools(canvas) {
|
|
|
5194
5208
|
title: "Create Page",
|
|
5195
5209
|
description: "Create a new wiki page in a course.",
|
|
5196
5210
|
inputSchema: {
|
|
5197
|
-
course_id:
|
|
5211
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5198
5212
|
title: _zod.z.string().describe("Title of the page"),
|
|
5199
5213
|
body: _zod.z.string().optional().describe("HTML body content of the page"),
|
|
5200
5214
|
published: _zod.z.boolean().optional().describe("Whether the page is published"),
|
|
@@ -5220,7 +5234,7 @@ function pageTools(canvas) {
|
|
|
5220
5234
|
title: "Update Page",
|
|
5221
5235
|
description: "Update an existing wiki page.",
|
|
5222
5236
|
inputSchema: {
|
|
5223
|
-
course_id:
|
|
5237
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5224
5238
|
page_url: _zod.z.string().describe("The page URL slug"),
|
|
5225
5239
|
title: _zod.z.string().optional().describe("New title for the page"),
|
|
5226
5240
|
body: _zod.z.string().optional().describe("New HTML body content"),
|
|
@@ -5248,7 +5262,7 @@ function pageTools(canvas) {
|
|
|
5248
5262
|
title: "Delete Page",
|
|
5249
5263
|
description: "Delete a wiki page from a course. This action is permanent.",
|
|
5250
5264
|
inputSchema: {
|
|
5251
|
-
course_id:
|
|
5265
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5252
5266
|
page_url: _zod.z.string().describe("The page URL slug to delete")
|
|
5253
5267
|
},
|
|
5254
5268
|
output: objectOutput(pageDeletionSchema),
|
|
@@ -5274,8 +5288,8 @@ function peerReviewTools(canvas) {
|
|
|
5274
5288
|
title: "List Peer Reviews",
|
|
5275
5289
|
description: "List all peer reviews for an assignment in a course.",
|
|
5276
5290
|
inputSchema: {
|
|
5277
|
-
course_id:
|
|
5278
|
-
assignment_id:
|
|
5291
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5292
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
|
|
5279
5293
|
},
|
|
5280
5294
|
annotations: {
|
|
5281
5295
|
readOnlyHint: true,
|
|
@@ -5292,9 +5306,9 @@ function peerReviewTools(canvas) {
|
|
|
5292
5306
|
title: "Get Submission Peer Reviews",
|
|
5293
5307
|
description: "List peer reviews assigned to a specific submission.",
|
|
5294
5308
|
inputSchema: {
|
|
5295
|
-
course_id:
|
|
5296
|
-
assignment_id:
|
|
5297
|
-
submission_id:
|
|
5309
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5310
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
5311
|
+
submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID")
|
|
5298
5312
|
},
|
|
5299
5313
|
annotations: {
|
|
5300
5314
|
readOnlyHint: true,
|
|
@@ -5313,10 +5327,10 @@ function peerReviewTools(canvas) {
|
|
|
5313
5327
|
audience: "educator",
|
|
5314
5328
|
description: "Assign a user to peer-review a submission.",
|
|
5315
5329
|
inputSchema: {
|
|
5316
|
-
course_id:
|
|
5317
|
-
assignment_id:
|
|
5318
|
-
submission_id:
|
|
5319
|
-
user_id:
|
|
5330
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5331
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
5332
|
+
submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
|
|
5333
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to assign")
|
|
5320
5334
|
},
|
|
5321
5335
|
annotations: {
|
|
5322
5336
|
destructiveHint: true,
|
|
@@ -5336,10 +5350,10 @@ function peerReviewTools(canvas) {
|
|
|
5336
5350
|
audience: "educator",
|
|
5337
5351
|
description: "Remove a peer review assignment from a submission. This action is permanent.",
|
|
5338
5352
|
inputSchema: {
|
|
5339
|
-
course_id:
|
|
5340
|
-
assignment_id:
|
|
5341
|
-
submission_id:
|
|
5342
|
-
user_id:
|
|
5353
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5354
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
5355
|
+
submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
|
|
5356
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to remove")
|
|
5343
5357
|
},
|
|
5344
5358
|
annotations: {
|
|
5345
5359
|
destructiveHint: true,
|
|
@@ -5366,7 +5380,7 @@ function quizTools(canvas) {
|
|
|
5366
5380
|
audience: "shared",
|
|
5367
5381
|
description: "List all quizzes in a course.",
|
|
5368
5382
|
inputSchema: {
|
|
5369
|
-
course_id:
|
|
5383
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
5370
5384
|
},
|
|
5371
5385
|
annotations: {
|
|
5372
5386
|
readOnlyHint: true,
|
|
@@ -5383,8 +5397,8 @@ function quizTools(canvas) {
|
|
|
5383
5397
|
audience: "shared",
|
|
5384
5398
|
description: "Get details for a single quiz by ID.",
|
|
5385
5399
|
inputSchema: {
|
|
5386
|
-
course_id:
|
|
5387
|
-
quiz_id:
|
|
5400
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5401
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
|
|
5388
5402
|
},
|
|
5389
5403
|
annotations: {
|
|
5390
5404
|
readOnlyHint: true,
|
|
@@ -5401,8 +5415,8 @@ function quizTools(canvas) {
|
|
|
5401
5415
|
title: "List Quiz Submissions",
|
|
5402
5416
|
description: "List all submissions for a quiz.",
|
|
5403
5417
|
inputSchema: {
|
|
5404
|
-
course_id:
|
|
5405
|
-
quiz_id:
|
|
5418
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5419
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
|
|
5406
5420
|
},
|
|
5407
5421
|
annotations: {
|
|
5408
5422
|
readOnlyHint: true,
|
|
@@ -5419,8 +5433,8 @@ function quizTools(canvas) {
|
|
|
5419
5433
|
title: "List Quiz Questions",
|
|
5420
5434
|
description: "List all questions in a quiz.",
|
|
5421
5435
|
inputSchema: {
|
|
5422
|
-
course_id:
|
|
5423
|
-
quiz_id:
|
|
5436
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5437
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
|
|
5424
5438
|
},
|
|
5425
5439
|
annotations: {
|
|
5426
5440
|
readOnlyHint: true,
|
|
@@ -5437,7 +5451,7 @@ function quizTools(canvas) {
|
|
|
5437
5451
|
title: "Get Quiz Submission Answers",
|
|
5438
5452
|
description: "Get a student's answers for a quiz submission.",
|
|
5439
5453
|
inputSchema: {
|
|
5440
|
-
quiz_submission_id:
|
|
5454
|
+
quiz_submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID")
|
|
5441
5455
|
},
|
|
5442
5456
|
annotations: {
|
|
5443
5457
|
readOnlyHint: true,
|
|
@@ -5453,10 +5467,10 @@ function quizTools(canvas) {
|
|
|
5453
5467
|
title: "Score Quiz Question",
|
|
5454
5468
|
description: "Score a specific question in a quiz submission. Specify attempt to score a particular attempt (omit for latest). Requires grading permissions.",
|
|
5455
5469
|
inputSchema: {
|
|
5456
|
-
course_id:
|
|
5457
|
-
quiz_id:
|
|
5458
|
-
submission_id:
|
|
5459
|
-
question_id:
|
|
5470
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5471
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID"),
|
|
5472
|
+
submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID"),
|
|
5473
|
+
question_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID"),
|
|
5460
5474
|
score: _zod.z.number().describe("The score to assign"),
|
|
5461
5475
|
comment: _zod.z.string().optional().describe("Optional feedback comment"),
|
|
5462
5476
|
attempt: _zod.z.number().optional().describe("Quiz attempt number to score (omit for latest)")
|
|
@@ -5496,9 +5510,9 @@ function quizTools(canvas) {
|
|
|
5496
5510
|
audience: "shared",
|
|
5497
5511
|
description: `Get the event log for a Classic Quiz submission in chronological order. Events include session_started, question_answered, question_flagged, page_blurred, and page_focused. Use this to understand the timeline of a student's attempt. Classic Quizzes only \u2014 New Quizzes does not expose event logs via the Canvas REST API. Events are scoped to a single submission; Canvas enforces access permissions (instructors and the submitting student only). Do not use event logs as the sole basis for academic-integrity conclusions; present them with context.`,
|
|
5498
5512
|
inputSchema: {
|
|
5499
|
-
course_id:
|
|
5500
|
-
quiz_id:
|
|
5501
|
-
submission_id:
|
|
5513
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5514
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
|
|
5515
|
+
submission_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The quiz submission ID"),
|
|
5502
5516
|
attempt: _zod.z.number().int().positive().optional().describe("Attempt number (1-based). Omit for the most recent attempt.")
|
|
5503
5517
|
},
|
|
5504
5518
|
annotations: {
|
|
@@ -5518,8 +5532,8 @@ function quizTools(canvas) {
|
|
|
5518
5532
|
title: "Delete Quiz",
|
|
5519
5533
|
description: "Permanently delete a Classic quiz from a course, including its questions and every student submission. Classic Quizzes only; use delete_new_quiz for a New Quiz (LTI).",
|
|
5520
5534
|
inputSchema: {
|
|
5521
|
-
course_id:
|
|
5522
|
-
quiz_id:
|
|
5535
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5536
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID to delete (Classic Quizzes only)")
|
|
5523
5537
|
},
|
|
5524
5538
|
annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
5525
5539
|
handler: async (params) => {
|
|
@@ -5533,9 +5547,9 @@ function quizTools(canvas) {
|
|
|
5533
5547
|
title: "Delete Quiz Question",
|
|
5534
5548
|
description: "Permanently delete a single question from a Classic quiz. Classic Quizzes only; use delete_new_quiz_item for a New Quiz item.",
|
|
5535
5549
|
inputSchema: {
|
|
5536
|
-
course_id:
|
|
5537
|
-
quiz_id:
|
|
5538
|
-
question_id:
|
|
5550
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5551
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
|
|
5552
|
+
question_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID to delete")
|
|
5539
5553
|
},
|
|
5540
5554
|
annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
5541
5555
|
handler: async (params) => {
|
|
@@ -5612,9 +5626,9 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
|
|
|
5612
5626
|
title: "Get Quiz Question Responses",
|
|
5613
5627
|
description: "Review every student's answer to one or all questions in a Classic Quiz, pivoted by question instead of by student \u2014 for grading essay/short-answer/file-upload questions consistently across a class instead of paging through SpeedGrader one student at a time. Classic Quizzes only (quiz_type: assignment, practice_quiz, graded_survey, survey) \u2014 New Quizzes exposes responses through a different API. Omit question_id to get every question; provide it to scope to one. Each question reports needs_manual_grading (true for essay and file-upload questions) and points_possible. Questions drawn from a question bank are included: Canvas stores each draw as a generated question that the quiz's question list omits, so they are resolved from the students' own attempts, listed after the quiz's fixed questions, and report position: null. Scans one Canvas API call per completed or pending-review submission, plus one per attempt needed to resolve such questions. A failed per-submission fetch is recorded in submissions_failed, and a response whose question cannot be resolved is counted in unmatched_response_count and unmatched_question_ids, rather than aborting the whole call. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, student names are replaced with stable pseudonyms.",
|
|
5614
5628
|
inputSchema: {
|
|
5615
|
-
course_id:
|
|
5616
|
-
quiz_id:
|
|
5617
|
-
question_id:
|
|
5629
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
5630
|
+
quiz_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
|
|
5631
|
+
question_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe(
|
|
5618
5632
|
"Scope the result to a single question ID (from list_quiz_questions, or a bank-drawn question_id returned by this tool). Omit to return every question with every student's response."
|
|
5619
5633
|
)
|
|
5620
5634
|
},
|
|
@@ -5682,7 +5696,7 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
|
|
|
5682
5696
|
answersBySubmission,
|
|
5683
5697
|
missing
|
|
5684
5698
|
);
|
|
5685
|
-
for (const question of resolved.sort((a, b) =>
|
|
5699
|
+
for (const question of resolved.sort((a, b) => _chunkLGKRFDO5cjs.compareCanvasIds.call(void 0, a.id, b.id))) {
|
|
5686
5700
|
groups.set(question.id, toGroup(question, null));
|
|
5687
5701
|
}
|
|
5688
5702
|
}
|
|
@@ -5725,7 +5739,7 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
|
|
|
5725
5739
|
unmatched_response_count: unmatchedResponseCount,
|
|
5726
5740
|
// `a - b` would round both operands above 2**53 and can report two
|
|
5727
5741
|
// distinct ids as equal (BRU-2730 §4.4).
|
|
5728
|
-
unmatched_question_ids: [...unmatchedQuestionIds].sort(
|
|
5742
|
+
unmatched_question_ids: [...unmatchedQuestionIds].sort(_chunkLGKRFDO5cjs.compareCanvasIds)
|
|
5729
5743
|
};
|
|
5730
5744
|
}
|
|
5731
5745
|
}
|
|
@@ -5742,8 +5756,8 @@ function quizAccommodationTools(canvas) {
|
|
|
5742
5756
|
title: "Set Student Quiz Accommodation",
|
|
5743
5757
|
description: "Apply extra time and/or extra attempts to a specific student across all Classic Quizzes in a course (or a specified subset). Fans out to the Canvas quiz extensions API for each quiz. New Quizzes (quiz_type quizzes.next) are skipped \u2014 use set_student_new_quiz_accommodation instead. Only applies to quizzes that exist at call time; re-run after creating new quizzes. Assignment due-date overrides are not handled here (separate fast-follow feature). Note: for courses with many quizzes this makes one Canvas API call per quiz. Partial failures are tolerated \u2014 a failure on one quiz does not abort the rest. Returns the standard fan-out envelope: separated applied[], skipped[] (each with a skip_reason), and failed[] (each with an error) arrays, a not_found list of any requested quiz_ids absent from the course, and a summary of counts. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym.",
|
|
5744
5758
|
inputSchema: {
|
|
5745
|
-
course_id:
|
|
5746
|
-
user_id:
|
|
5759
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
5760
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
|
|
5747
5761
|
extra_time_minutes: _zod.z.number().int().positive().optional().describe(
|
|
5748
5762
|
"Absolute extra time in minutes to add to each quiz. Mutually exclusive with time_multiplier."
|
|
5749
5763
|
),
|
|
@@ -5751,7 +5765,7 @@ function quizAccommodationTools(canvas) {
|
|
|
5751
5765
|
"Relative time multiplier (e.g. 1.5 for 1.5\xD7 time). extra_minutes = round(quiz.time_limit * (multiplier - 1)), minimum 1 minute. Quizzes with no time limit are skipped for extra_time (extra_attempts is still applied if provided). Mutually exclusive with extra_time_minutes."
|
|
5752
5766
|
),
|
|
5753
5767
|
extra_attempts: _zod.z.number().int().min(1).optional().describe("Additional attempts to grant beyond the quiz default."),
|
|
5754
|
-
quiz_ids: _zod.z.array(
|
|
5768
|
+
quiz_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
5755
5769
|
"Limit accommodation to these specific quiz IDs. Omit to target all Classic Quizzes in the course."
|
|
5756
5770
|
)
|
|
5757
5771
|
},
|
|
@@ -5847,8 +5861,8 @@ function quizAccommodationTools(canvas) {
|
|
|
5847
5861
|
title: "List Student Quiz Accommodations",
|
|
5848
5862
|
description: "List the current quiz accommodation (extra time and/or extra attempts) for a specific student across all Classic Quizzes in a course. Useful for auditing before or after calling set_student_quiz_accommodation. New Quizzes (quiz_type quizzes.next) are excluded. Reads extra_time / extra_attempts from each quiz's submission records (Canvas exposes no read endpoint for quiz extensions directly) \u2014 one Canvas API call per Classic Quiz, so it may be slow for courses with many quizzes. Errors from any quiz's read propagate immediately (no per-quiz error catching). Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first.",
|
|
5849
5863
|
inputSchema: {
|
|
5850
|
-
course_id:
|
|
5851
|
-
user_id:
|
|
5864
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
5865
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
|
|
5852
5866
|
},
|
|
5853
5867
|
annotations: {
|
|
5854
5868
|
readOnlyHint: true,
|
|
@@ -5898,13 +5912,13 @@ function newQuizAccommodationTools(canvas) {
|
|
|
5898
5912
|
title: "Set Student New Quiz Accommodation",
|
|
5899
5913
|
description: 'Apply a time and/or attempts accommodation for a student across all New Quizzes in a course (course-level, single Canvas API call when no assignment_ids are given) or for a specified subset of New Quizzes (per-quiz fan-out when assignment_ids are given). New Quizzes use a time_multiplier (ratio, e.g. 1.5 for 1.5\xD7 time), not absolute minutes. For Classic Quizzes (quiz_type: assignment / practice_quiz / etc.) use set_student_quiz_accommodation instead. Partial per-quiz failures are tolerated \u2014 a failure on one quiz does not abort the rest. In per-quiz mode, fan-out is sequential (one Canvas API call per assignment ID, awaited in series). Canvas errors on the course-level path (no assignment_ids) propagate as a top-level error (no envelope). Returns a uniform envelope: scope ("course" or "per_quiz"), applied[], failed[], and summary. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym.',
|
|
5900
5914
|
inputSchema: {
|
|
5901
|
-
course_id:
|
|
5902
|
-
user_id:
|
|
5915
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
5916
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
|
|
5903
5917
|
time_multiplier: _zod.z.number().min(1.01).optional().describe(
|
|
5904
5918
|
"Time multiplier for New Quizzes (e.g. 1.5 for 1.5\xD7 time, 2.0 for double time). This is the native New Quizzes field; Canvas applies it to each quiz's time limit. Must be > 1.0. Mutually exclusive with nothing \u2014 can be combined with extra_attempts."
|
|
5905
5919
|
),
|
|
5906
5920
|
extra_attempts: _zod.z.number().int().min(1).optional().describe("Additional attempts to grant beyond each quiz's default attempt limit."),
|
|
5907
|
-
assignment_ids: _zod.z.array(
|
|
5921
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
5908
5922
|
"Limit accommodation to these specific New Quiz assignment IDs. Omit to apply a course-level accommodation (covers all New Quizzes in the course with a single Canvas API call). When provided, fans out one call per assignment ID."
|
|
5909
5923
|
)
|
|
5910
5924
|
},
|
|
@@ -5957,7 +5971,7 @@ function newQuizAccommodationTools(canvas) {
|
|
|
5957
5971
|
extra_attempts: record.extra_attempts
|
|
5958
5972
|
});
|
|
5959
5973
|
} catch (err) {
|
|
5960
|
-
const message = err instanceof
|
|
5974
|
+
const message = err instanceof _chunkZKG3VDNNcjs.CanvasApiError ? err.message : "Unknown error";
|
|
5961
5975
|
failed.push({
|
|
5962
5976
|
assignment_id: assignmentId,
|
|
5963
5977
|
time_multiplier: null,
|
|
@@ -5979,8 +5993,8 @@ function newQuizAccommodationTools(canvas) {
|
|
|
5979
5993
|
title: "List Student New Quiz Accommodations",
|
|
5980
5994
|
description: 'Read the current course-level New Quizzes accommodation (time multiplier and/or extra attempts) for a specific student in a course. Useful for auditing before or after calling set_student_new_quiz_accommodation. Returns has_accommodation: false when no accommodation is set (Canvas 404 is treated as "no record", not an error). New Quizzes store a single course-level accommodation record per student; this is not per-quiz. For Classic Quizzes, use list_student_quiz_accommodations instead. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first.',
|
|
5981
5995
|
inputSchema: {
|
|
5982
|
-
course_id:
|
|
5983
|
-
user_id:
|
|
5996
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
5997
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
|
|
5984
5998
|
},
|
|
5985
5999
|
annotations: {
|
|
5986
6000
|
readOnlyHint: true,
|
|
@@ -6073,7 +6087,7 @@ function newQuizTools(canvas) {
|
|
|
6073
6087
|
title: "Create New Quiz",
|
|
6074
6088
|
description: "Create a New Quiz (LTI) in a Canvas course. New Quizzes is the modern quiz engine; for Classic quizzes use create_quiz.",
|
|
6075
6089
|
inputSchema: {
|
|
6076
|
-
course_id:
|
|
6090
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6077
6091
|
title: _zod.z.string().describe("Title of the quiz"),
|
|
6078
6092
|
instructions: _zod.z.string().nullable().optional().describe("HTML instructions shown before the quiz starts"),
|
|
6079
6093
|
points_possible: _zod.z.number().optional().describe("Total points; defaults to sum of item points"),
|
|
@@ -6101,8 +6115,8 @@ function newQuizTools(canvas) {
|
|
|
6101
6115
|
title: "Update New Quiz",
|
|
6102
6116
|
description: "Update an existing New Quiz (LTI) in a Canvas course.",
|
|
6103
6117
|
inputSchema: {
|
|
6104
|
-
course_id:
|
|
6105
|
-
assignment_id:
|
|
6118
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6119
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
|
|
6106
6120
|
title: _zod.z.string().optional().describe("Title of the quiz"),
|
|
6107
6121
|
instructions: _zod.z.string().nullable().optional().describe("HTML instructions shown before the quiz starts"),
|
|
6108
6122
|
points_possible: _zod.z.number().optional().describe("Total points"),
|
|
@@ -6131,8 +6145,8 @@ function newQuizTools(canvas) {
|
|
|
6131
6145
|
title: "Delete New Quiz",
|
|
6132
6146
|
description: "Delete a New Quiz (LTI) from a Canvas course. This action is permanent. Use assignment_id (not quiz_id).",
|
|
6133
6147
|
inputSchema: {
|
|
6134
|
-
course_id:
|
|
6135
|
-
assignment_id:
|
|
6148
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6149
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
|
|
6136
6150
|
},
|
|
6137
6151
|
annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
6138
6152
|
handler: async (params) => {
|
|
@@ -6147,8 +6161,8 @@ function newQuizTools(canvas) {
|
|
|
6147
6161
|
title: "List New Quiz Items",
|
|
6148
6162
|
description: "List all items (questions) in a New Quiz (LTI).",
|
|
6149
6163
|
inputSchema: {
|
|
6150
|
-
course_id:
|
|
6151
|
-
assignment_id:
|
|
6164
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6165
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
|
|
6152
6166
|
},
|
|
6153
6167
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
6154
6168
|
handler: async (params) => {
|
|
@@ -6162,8 +6176,8 @@ function newQuizTools(canvas) {
|
|
|
6162
6176
|
title: "Get New Quiz Item",
|
|
6163
6177
|
description: "Get a single item (question) from a New Quiz (LTI) by item ID.",
|
|
6164
6178
|
inputSchema: {
|
|
6165
|
-
course_id:
|
|
6166
|
-
assignment_id:
|
|
6179
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6180
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
|
|
6167
6181
|
item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)")
|
|
6168
6182
|
},
|
|
6169
6183
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
@@ -6179,8 +6193,8 @@ function newQuizTools(canvas) {
|
|
|
6179
6193
|
title: "Create New Quiz Item",
|
|
6180
6194
|
description: "Create an item (question) in a New Quiz (LTI). Supports 5 types: choice (MCQ), true-false, essay, matching, numeric. Canvas may rate-limit rapid sequential creates. Call serially (not in parallel). For >50 items, chunk and pause between batches.",
|
|
6181
6195
|
inputSchema: {
|
|
6182
|
-
course_id:
|
|
6183
|
-
assignment_id:
|
|
6196
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6197
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
|
|
6184
6198
|
points_possible: _zod.z.number().describe("Points awarded for a fully correct answer"),
|
|
6185
6199
|
position: _zod.z.number().int().optional().describe("1-based position in the quiz; appended if omitted"),
|
|
6186
6200
|
item: itemDiscriminatedUnion
|
|
@@ -6201,8 +6215,8 @@ function newQuizTools(canvas) {
|
|
|
6201
6215
|
title: "Update New Quiz Item",
|
|
6202
6216
|
description: "Update an existing item (question) in a New Quiz (LTI). All fields are optional; supply only what changes. Canvas may rate-limit rapid sequential updates. Call serially (not in parallel). For >50 items, chunk and pause between batches.",
|
|
6203
6217
|
inputSchema: {
|
|
6204
|
-
course_id:
|
|
6205
|
-
assignment_id:
|
|
6218
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6219
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
|
|
6206
6220
|
item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)"),
|
|
6207
6221
|
points_possible: _zod.z.number().optional().describe("Updated point value"),
|
|
6208
6222
|
position: _zod.z.number().int().optional().describe("Updated 1-based position"),
|
|
@@ -6225,8 +6239,8 @@ function newQuizTools(canvas) {
|
|
|
6225
6239
|
title: "Delete New Quiz Item",
|
|
6226
6240
|
description: "Delete an item (question) from a New Quiz (LTI). This action is permanent.",
|
|
6227
6241
|
inputSchema: {
|
|
6228
|
-
course_id:
|
|
6229
|
-
assignment_id:
|
|
6242
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6243
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
|
|
6230
6244
|
item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)")
|
|
6231
6245
|
},
|
|
6232
6246
|
annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
|
|
@@ -6259,7 +6273,7 @@ function rubricTools(canvas) {
|
|
|
6259
6273
|
title: "List Rubrics",
|
|
6260
6274
|
description: "List all rubrics in a course.",
|
|
6261
6275
|
inputSchema: {
|
|
6262
|
-
course_id:
|
|
6276
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
6263
6277
|
},
|
|
6264
6278
|
annotations: {
|
|
6265
6279
|
readOnlyHint: true,
|
|
@@ -6275,8 +6289,8 @@ function rubricTools(canvas) {
|
|
|
6275
6289
|
title: "Get Rubric",
|
|
6276
6290
|
description: 'Get details for a single rubric by ID, including criteria. Use include=["assignment_associations"] to retrieve the rubric association IDs needed for rubric assessment writes.',
|
|
6277
6291
|
inputSchema: {
|
|
6278
|
-
course_id:
|
|
6279
|
-
rubric_id:
|
|
6292
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6293
|
+
rubric_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID"),
|
|
6280
6294
|
include: _zod.z.array(_zod.z.enum(RUBRIC_INCLUDE)).optional().describe(
|
|
6281
6295
|
"Related Canvas records to include. Use assignment_associations to retrieve association IDs for linked assignments. Canvas honours only one association scope per request; extra association values are ignored."
|
|
6282
6296
|
)
|
|
@@ -6299,9 +6313,9 @@ function rubricTools(canvas) {
|
|
|
6299
6313
|
title: "Get Rubric Assessment",
|
|
6300
6314
|
description: "Get the rubric assessment for a specific student submission on an assignment.",
|
|
6301
6315
|
inputSchema: {
|
|
6302
|
-
course_id:
|
|
6303
|
-
assignment_id:
|
|
6304
|
-
user_id:
|
|
6316
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6317
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
6318
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
|
|
6305
6319
|
},
|
|
6306
6320
|
annotations: {
|
|
6307
6321
|
readOnlyHint: true,
|
|
@@ -6319,8 +6333,8 @@ function rubricTools(canvas) {
|
|
|
6319
6333
|
title: "Submit Rubric Assessment",
|
|
6320
6334
|
description: "Submit a rubric assessment with scores and comments for each criterion.",
|
|
6321
6335
|
inputSchema: {
|
|
6322
|
-
course_id:
|
|
6323
|
-
association_id:
|
|
6336
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6337
|
+
association_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The rubric association ID"),
|
|
6324
6338
|
data: _zod.z.array(
|
|
6325
6339
|
_zod.z.object({
|
|
6326
6340
|
criterion_id: _zod.z.string().describe("The rubric criterion ID"),
|
|
@@ -6346,7 +6360,7 @@ function rubricTools(canvas) {
|
|
|
6346
6360
|
title: "Create Rubric",
|
|
6347
6361
|
description: "Create a new rubric in a course with criteria and rating levels. Optionally link it to an assignment immediately. Returns { rubric, rubric_association? }; when an assignment association was requested, rubric_association.id is the association_id that submit_rubric_assessment takes.",
|
|
6348
6362
|
inputSchema: {
|
|
6349
|
-
course_id:
|
|
6363
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6350
6364
|
title: _zod.z.string().describe("The rubric title"),
|
|
6351
6365
|
criteria: _zod.z.array(
|
|
6352
6366
|
_zod.z.object({
|
|
@@ -6361,7 +6375,7 @@ function rubricTools(canvas) {
|
|
|
6361
6375
|
})
|
|
6362
6376
|
).min(1, "At least one criterion is required").describe("Rubric criteria"),
|
|
6363
6377
|
association: _zod.z.object({
|
|
6364
|
-
assignment_id:
|
|
6378
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Assignment ID to link this rubric to"),
|
|
6365
6379
|
use_for_grading: _zod.z.boolean().optional().describe("Whether to use this rubric for grading"),
|
|
6366
6380
|
purpose: _zod.z.string().optional().describe('Purpose of the association (e.g., "grading")')
|
|
6367
6381
|
}).optional().describe("Optional assignment association")
|
|
@@ -6385,9 +6399,9 @@ function rubricTools(canvas) {
|
|
|
6385
6399
|
title: "Attach Rubric",
|
|
6386
6400
|
description: "Attach an existing course rubric to an assignment, so one rubric can be shared across many assignments instead of creating a duplicate per assignment with create_rubric. Returns the new rubric association.",
|
|
6387
6401
|
inputSchema: {
|
|
6388
|
-
course_id:
|
|
6389
|
-
rubric_id:
|
|
6390
|
-
assignment_id:
|
|
6402
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6403
|
+
rubric_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The ID of the existing rubric to attach"),
|
|
6404
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to attach the rubric to"),
|
|
6391
6405
|
use_for_grading: _zod.z.boolean().optional().describe("Whether the rubric drives the assignment grade"),
|
|
6392
6406
|
hide_score_total: _zod.z.boolean().optional().describe("Whether to hide the rubric score total from students"),
|
|
6393
6407
|
purpose: _zod.z.string().optional().describe('Association purpose, e.g. "grading" (the default) or "bookmark"')
|
|
@@ -6413,8 +6427,8 @@ function rubricTools(canvas) {
|
|
|
6413
6427
|
title: "Delete Rubric",
|
|
6414
6428
|
description: "Permanently delete a rubric from a course, removing it from every assignment it is attached to. Returns the deleted rubric.",
|
|
6415
6429
|
inputSchema: {
|
|
6416
|
-
course_id:
|
|
6417
|
-
rubric_id:
|
|
6430
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6431
|
+
rubric_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID to delete")
|
|
6418
6432
|
},
|
|
6419
6433
|
annotations: {
|
|
6420
6434
|
destructiveHint: true,
|
|
@@ -6484,7 +6498,7 @@ function studentTools(canvas, pseudonymizer) {
|
|
|
6484
6498
|
title: "Get My Grades",
|
|
6485
6499
|
description: "Get grade data for the authenticated student. If course_id is omitted, returns grades across all enrolled courses.",
|
|
6486
6500
|
inputSchema: {
|
|
6487
|
-
course_id:
|
|
6501
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID (omit for all courses)")
|
|
6488
6502
|
},
|
|
6489
6503
|
annotations: {
|
|
6490
6504
|
readOnlyHint: true,
|
|
@@ -6500,7 +6514,7 @@ function studentTools(canvas, pseudonymizer) {
|
|
|
6500
6514
|
title: "Get My Submissions",
|
|
6501
6515
|
description: "List all submissions for the authenticated student in a course.",
|
|
6502
6516
|
inputSchema: {
|
|
6503
|
-
course_id:
|
|
6517
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
6504
6518
|
},
|
|
6505
6519
|
annotations: {
|
|
6506
6520
|
readOnlyHint: true,
|
|
@@ -6529,7 +6543,7 @@ function studentTools(canvas, pseudonymizer) {
|
|
|
6529
6543
|
title: "Get My Submission Feedback",
|
|
6530
6544
|
description: "List the authenticated student's own submissions that carry feedback comments from an instructor or a peer reviewer \u2014 comments left by the student themselves do not count as feedback and submissions with no non-self comments are omitted. Omit `course_id` to scan every active course; a course that errors during a scan is skipped and reported in `courses_failed` rather than failing the whole call. Sorted most-recent-feedback-first. Comment author role is best-effort: 'teacher' is only identified when the author is the submission's recorded grader; other non-self authors are labeled 'peer', including any staff member who comments without being the recorded grader.",
|
|
6531
6545
|
inputSchema: {
|
|
6532
|
-
course_id:
|
|
6546
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID. Omit to scan all of the student's active courses."),
|
|
6533
6547
|
unread_only: _zod.z.boolean().optional().describe(
|
|
6534
6548
|
"Only include submissions the student hasn't opened yet (Canvas read_status). Defaults to false."
|
|
6535
6549
|
)
|
|
@@ -6570,8 +6584,8 @@ function studentTools(canvas, pseudonymizer) {
|
|
|
6570
6584
|
} else {
|
|
6571
6585
|
coursesFailed.push({
|
|
6572
6586
|
course_id: result.courseId,
|
|
6573
|
-
status: result.err instanceof
|
|
6574
|
-
message: result.err instanceof
|
|
6587
|
+
status: result.err instanceof _chunkZKG3VDNNcjs.CanvasApiError ? result.err.status : null,
|
|
6588
|
+
message: result.err instanceof _chunkZKG3VDNNcjs.CanvasApiError ? result.err.message : String(result.err)
|
|
6575
6589
|
});
|
|
6576
6590
|
}
|
|
6577
6591
|
}
|
|
@@ -6841,7 +6855,7 @@ function studentSearchTools(canvas, pseudonymizer) {
|
|
|
6841
6855
|
const coursesToScan = truncated ? sorted.slice(0, maxCourses) : sorted;
|
|
6842
6856
|
const coursesFailed = [];
|
|
6843
6857
|
const perCourseMatches = [];
|
|
6844
|
-
const scanResults = await
|
|
6858
|
+
const scanResults = await _chunkLGKRFDO5cjs.mapWithConcurrency.call(void 0,
|
|
6845
6859
|
coursesToScan,
|
|
6846
6860
|
CONCURRENT_COURSE_LIMIT,
|
|
6847
6861
|
async (course) => {
|
|
@@ -6864,8 +6878,8 @@ function studentSearchTools(canvas, pseudonymizer) {
|
|
|
6864
6878
|
} else {
|
|
6865
6879
|
coursesFailed.push({
|
|
6866
6880
|
course_id: r.course.id,
|
|
6867
|
-
status: r.err instanceof
|
|
6868
|
-
message: r.err instanceof
|
|
6881
|
+
status: r.err instanceof _chunkZKG3VDNNcjs.CanvasApiError ? r.err.status : null,
|
|
6882
|
+
message: r.err instanceof _chunkZKG3VDNNcjs.CanvasApiError ? r.err.message : String(r.err)
|
|
6869
6883
|
});
|
|
6870
6884
|
}
|
|
6871
6885
|
}
|
|
@@ -6943,18 +6957,18 @@ function submissionTools(canvas, pseudonymizer) {
|
|
|
6943
6957
|
title: "List Submissions",
|
|
6944
6958
|
description: "List all submissions for an assignment. Use `include` to attach user, assignment, rubric_assessment, submission_history, or visibility. Filter with `student_ids`, `workflow_state`, or `grading_period_id`. Defaults to including submission_comments.",
|
|
6945
6959
|
inputSchema: {
|
|
6946
|
-
course_id:
|
|
6947
|
-
assignment_id:
|
|
6960
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
6961
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
6948
6962
|
include: _zod.z.array(_zod.z.enum(SUBMISSION_LIST_INCLUDE)).optional().describe(
|
|
6949
6963
|
'Extra fields to include (Canvas include[] param). Defaults to ["submission_comments"] when omitted.'
|
|
6950
6964
|
),
|
|
6951
|
-
student_ids:
|
|
6965
|
+
student_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { sentinels: ["all", "self"] }).optional().describe(
|
|
6952
6966
|
'Restrict to submissions for these user IDs (pass large IDs as strings). Use "all" or "self" for shortcuts.'
|
|
6953
6967
|
),
|
|
6954
|
-
section_ids: _zod.z.array(
|
|
6968
|
+
section_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to submissions in these sections"),
|
|
6955
6969
|
grouped: _zod.z.boolean().optional().describe("Return one submission per group rather than per student"),
|
|
6956
6970
|
workflow_state: _zod.z.enum(SUBMISSION_WORKFLOW_STATE).optional().describe("Only include submissions in this workflow state"),
|
|
6957
|
-
grading_period_id:
|
|
6971
|
+
grading_period_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).optional().describe("Restrict to a grading period")
|
|
6958
6972
|
},
|
|
6959
6973
|
annotations: {
|
|
6960
6974
|
readOnlyHint: true,
|
|
@@ -6988,9 +7002,9 @@ function submissionTools(canvas, pseudonymizer) {
|
|
|
6988
7002
|
title: "Get Submission",
|
|
6989
7003
|
description: "Get a single submission for a specific user on an assignment. Defaults to including submission_comments. Pass `include` to add rubric_assessment, submission_history, visibility, course, user, or read_status.",
|
|
6990
7004
|
inputSchema: {
|
|
6991
|
-
course_id:
|
|
6992
|
-
assignment_id:
|
|
6993
|
-
user_id:
|
|
7005
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
7006
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
7007
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
|
|
6994
7008
|
include: _zod.z.array(_zod.z.enum(SUBMISSION_GET_INCLUDE)).optional().describe(
|
|
6995
7009
|
'Extra fields to include (Canvas include[] param). Defaults to ["submission_comments"] when omitted.'
|
|
6996
7010
|
)
|
|
@@ -7019,9 +7033,9 @@ function submissionTools(canvas, pseudonymizer) {
|
|
|
7019
7033
|
title: "Grade Submission",
|
|
7020
7034
|
description: "Post or update a grade for a submission. Requires grading permissions.",
|
|
7021
7035
|
inputSchema: {
|
|
7022
|
-
course_id:
|
|
7023
|
-
assignment_id:
|
|
7024
|
-
user_id:
|
|
7036
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
7037
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
7038
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
|
|
7025
7039
|
grade: _zod.z.string().describe('The grade to assign (e.g. "95", "A", "pass")')
|
|
7026
7040
|
},
|
|
7027
7041
|
annotations: {
|
|
@@ -7042,9 +7056,9 @@ function submissionTools(canvas, pseudonymizer) {
|
|
|
7042
7056
|
title: "Comment on Submission",
|
|
7043
7057
|
description: "Add a text comment to a submission.",
|
|
7044
7058
|
inputSchema: {
|
|
7045
|
-
course_id:
|
|
7046
|
-
assignment_id:
|
|
7047
|
-
user_id:
|
|
7059
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
7060
|
+
assignment_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
|
|
7061
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
|
|
7048
7062
|
comment: _zod.z.string().describe("The comment text to add")
|
|
7049
7063
|
},
|
|
7050
7064
|
annotations: {
|
|
@@ -7075,9 +7089,9 @@ function submissionFileTools(canvas, pseudonymizer) {
|
|
|
7075
7089
|
title: "List Course Submission Files",
|
|
7076
7090
|
description: 'List every file attachment submitted by students across all assignments in a course. Returns a manifest \u2014 one entry per file \u2014 including the original filename, a file_id for re-fetching via download_file, content type, and size. Useful for bulk-archiving student work before a course expires or a Free-For-Teacher account is concluded. Outputs are bounded by max_files (default 500); when the limit is hit, truncated is true and truncation_note explains how to retrieve the rest. Download URLs are time-limited (typically 1 hour) \u2014 use the returned file_id with download_file to get a fresh URL at download time. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, user_name is a stable per-course pseudonym (e.g. "Student 1"); user_id (the raw numeric Canvas ID) is always returned and works as a stable per-student folder key.',
|
|
7077
7091
|
inputSchema: {
|
|
7078
|
-
course_id:
|
|
7079
|
-
assignment_ids: _zod.z.array(
|
|
7080
|
-
student_ids: _zod.z.array(
|
|
7092
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID."),
|
|
7093
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to these assignment IDs. Omit to scan all assignments."),
|
|
7094
|
+
student_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
7081
7095
|
"Restrict to these student user IDs. Omit to include all students. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, pass the real Canvas user_id after resolving the pseudonym via resolve_pseudonym."
|
|
7082
7096
|
),
|
|
7083
7097
|
workflow_state: _zod.z.enum(WORKFLOW_STATE).optional().describe("Only include submissions in this workflow state. Omit to include all states."),
|
|
@@ -7178,10 +7192,10 @@ function submissionsAwaitingGradingTools(canvas, pseudonymizer) {
|
|
|
7178
7192
|
title: "List Submissions Awaiting Grading",
|
|
7179
7193
|
description: "Lists all submissions in a course that still need a human grade, sorted oldest-waiting first.\n\nSurfaces two categories:\n- workflow_state=submitted: assignments submitted by students but not yet graded at all.\n- workflow_state=pending_review: Classic Quiz submissions where Canvas auto-graded the objective questions but left essays or manually-scored questions for the instructor.\n\nReturns a triage list grouped by assignment or Classic Quiz, with per-submission details: student identity, workflow state, submitted_at, and whether the submission has pending manual-grading questions.\n\nParameters:\n- course_id (required): Canvas course ID to scan.\n- assignment_ids (optional): limit the scan to specific assignment IDs.\n- include_quizzes (default true): include Classic Quiz assignments in the scan.\n- include_assignments (default true): include non-quiz assignments.\n- only_pending_review (default false): when true, return only pending_review submissions (quiz essays awaiting manual scoring), omitting regular ungraded assignments.\n\nKnown limitations:\n- New Quizzes (Quizzes.Next) may not appear with 'pending_review' workflow state here; use SpeedGrader or the New Quizzes interface for their grading queue.\n- Fill-in-the-blank answers that Canvas auto-marked are not surfaced.\n- V1 returns submission-level state only; per-question detail is not included.\n- When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, student names are replaced with pseudonyms. Use resolve_pseudonym to look up the real identity.",
|
|
7180
7194
|
inputSchema: {
|
|
7181
|
-
course_id:
|
|
7195
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe(
|
|
7182
7196
|
"Canvas course ID to scan for submissions awaiting grading."
|
|
7183
7197
|
),
|
|
7184
|
-
assignment_ids: _zod.z.array(
|
|
7198
|
+
assignment_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe(
|
|
7185
7199
|
"Limit the scan to these specific assignment IDs (numeric Canvas IDs). When omitted, all assignments in the course are scanned."
|
|
7186
7200
|
),
|
|
7187
7201
|
include_quizzes: _zod.z.boolean().default(true).describe(
|
|
@@ -7335,7 +7349,7 @@ function userTools(canvas, pseudonymizer) {
|
|
|
7335
7349
|
title: "List Students",
|
|
7336
7350
|
description: "List all students enrolled in a course.",
|
|
7337
7351
|
inputSchema: {
|
|
7338
|
-
course_id:
|
|
7352
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
|
|
7339
7353
|
},
|
|
7340
7354
|
annotations: {
|
|
7341
7355
|
readOnlyHint: true,
|
|
@@ -7353,7 +7367,7 @@ function userTools(canvas, pseudonymizer) {
|
|
|
7353
7367
|
title: "Get User",
|
|
7354
7368
|
description: "Get details for a single user by ID.",
|
|
7355
7369
|
inputSchema: {
|
|
7356
|
-
user_id:
|
|
7370
|
+
user_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
|
|
7357
7371
|
},
|
|
7358
7372
|
annotations: {
|
|
7359
7373
|
readOnlyHint: true,
|
|
@@ -7384,7 +7398,7 @@ function userTools(canvas, pseudonymizer) {
|
|
|
7384
7398
|
title: "Search Users",
|
|
7385
7399
|
description: "Search for users in a Canvas account by name, login, or email. Use `include` to request email, last_login, avatar_url, time_zone, or uuid in the response.",
|
|
7386
7400
|
inputSchema: {
|
|
7387
|
-
account_id:
|
|
7401
|
+
account_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
|
|
7388
7402
|
search_term: _zod.z.string().describe("The search term (name, login, or email)"),
|
|
7389
7403
|
sort: _zod.z.enum(USER_SORT).optional().describe("Sort field"),
|
|
7390
7404
|
order: _zod.z.enum(["asc", "desc"]).optional().describe("Sort order"),
|
|
@@ -7411,7 +7425,7 @@ function userTools(canvas, pseudonymizer) {
|
|
|
7411
7425
|
title: "List Course Users",
|
|
7412
7426
|
description: "List users in a course with optional Canvas filters. Use `include` to request email, enrollments, avatar_url, bio, and other fields otherwise omitted from the default response. Use `enrollment_type` / `enrollment_state` to narrow by role or status, `search_term` to filter by name/login, `user_ids` to fetch a specific subset, and `sort`/`order` to control ordering.",
|
|
7413
7427
|
inputSchema: {
|
|
7414
|
-
course_id:
|
|
7428
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
|
|
7415
7429
|
enrollment_type: _zod.z.array(_zod.z.enum(COURSE_USER_ENROLLMENT_TYPE)).optional().describe("Filter by one or more enrollment types"),
|
|
7416
7430
|
enrollment_state: _zod.z.array(_zod.z.enum(COURSE_USER_ENROLLMENT_STATE)).optional().describe("Filter by enrollment state (e.g. active, invited)"),
|
|
7417
7431
|
include: _zod.z.array(_zod.z.enum(COURSE_USER_INCLUDE)).optional().describe("Extra fields to include on each user (Canvas include[] param)"),
|
|
@@ -7420,7 +7434,7 @@ function userTools(canvas, pseudonymizer) {
|
|
|
7420
7434
|
// forbids an ID field that accepts arbitrary strings, so this narrows to the
|
|
7421
7435
|
// canonical ID forms plus the one SIS prefix the rest of this repo documents
|
|
7422
7436
|
// (`sis_user_id:`, as in outcomes.ts). Called out in the PR as a narrowing.
|
|
7423
|
-
user_ids:
|
|
7437
|
+
user_ids: _chunkLGKRFDO5cjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
|
|
7424
7438
|
'Restrict the result to the given user IDs (pass large IDs as strings). SIS user IDs may be given as "sis_user_id:<sis id>".'
|
|
7425
7439
|
),
|
|
7426
7440
|
search_term: _zod.z.string().optional().describe("Partial name or full login/SIS ID to filter users by"),
|
|
@@ -7552,7 +7566,7 @@ async function scanQuizzes(canvas, courseId, warnings) {
|
|
|
7552
7566
|
canvas.assignments.list(courseId)
|
|
7553
7567
|
]);
|
|
7554
7568
|
const classicQuizzes = quizzes.filter((quiz) => CLASSIC_QUIZ_TYPES3.has(quiz.quiz_type));
|
|
7555
|
-
const classicFindings = await
|
|
7569
|
+
const classicFindings = await _chunkLGKRFDO5cjs.mapWithConcurrency.call(void 0,
|
|
7556
7570
|
classicQuizzes,
|
|
7557
7571
|
QUIZ_SCAN_CONCURRENCY_LIMIT,
|
|
7558
7572
|
async (quiz) => {
|
|
@@ -7578,7 +7592,7 @@ async function scanQuizzes(canvas, courseId, warnings) {
|
|
|
7578
7592
|
}
|
|
7579
7593
|
);
|
|
7580
7594
|
const newQuizAssignments = assignments.filter((a) => a.is_quiz_lti_assignment === true);
|
|
7581
|
-
const newQuizFindings = await
|
|
7595
|
+
const newQuizFindings = await _chunkLGKRFDO5cjs.mapWithConcurrency.call(void 0,
|
|
7582
7596
|
newQuizAssignments,
|
|
7583
7597
|
QUIZ_SCAN_CONCURRENCY_LIMIT,
|
|
7584
7598
|
async (assignment) => {
|
|
@@ -7603,7 +7617,7 @@ function linkAuditTools(canvas) {
|
|
|
7603
7617
|
title: "Audit Course Links",
|
|
7604
7618
|
description: 'Scan a course\'s content (pages, assignments, syllabus, announcements, and optionally quizzes) for broken or outdated links and images. Returns structured findings: cross-course references (links that still point at a previous copy of the course \u2014 the canonical stale-copy failure after a course import) and empty/malformed URLs. Pass "quizzes" in `include` to also scan Classic quiz descriptions/questions and New Quiz item stems \u2014 these break silently for students while still rendering in the instructor\u2019s own preview. `quizzes` is opt-in (off by default). Structural checks only \u2014 no outbound HTTP requests. Requires instructor permissions in the course.',
|
|
7605
7619
|
inputSchema: {
|
|
7606
|
-
course_id:
|
|
7620
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
7607
7621
|
include: _zod.z.array(_zod.z.enum(["pages", "assignments", "syllabus", "announcements", "quizzes"])).optional().describe(
|
|
7608
7622
|
"Content sources to scan. Omit to scan the default four: pages, assignments, syllabus, announcements. `quizzes` is opt-in \u2014 pass it explicitly to also scan Classic quiz descriptions/questions and New Quiz item stems; it issues one extra Canvas API call per quiz/New Quiz in the course."
|
|
7609
7623
|
)
|
|
@@ -7928,7 +7942,7 @@ async function scanQuizzesAccessibility(canvas, courseId, warnings) {
|
|
|
7928
7942
|
canvas.assignments.list(courseId)
|
|
7929
7943
|
]);
|
|
7930
7944
|
const classicQuizzes = quizzes.filter((quiz) => CLASSIC_QUIZ_TYPES4.has(quiz.quiz_type));
|
|
7931
|
-
const classicFindings = await
|
|
7945
|
+
const classicFindings = await _chunkLGKRFDO5cjs.mapWithConcurrency.call(void 0,
|
|
7932
7946
|
classicQuizzes,
|
|
7933
7947
|
QUIZ_SCAN_CONCURRENCY_LIMIT2,
|
|
7934
7948
|
async (quiz) => {
|
|
@@ -7953,7 +7967,7 @@ async function scanQuizzesAccessibility(canvas, courseId, warnings) {
|
|
|
7953
7967
|
}
|
|
7954
7968
|
);
|
|
7955
7969
|
const newQuizAssignments = assignments.filter((a) => a.is_quiz_lti_assignment === true);
|
|
7956
|
-
const newQuizFindings = await
|
|
7970
|
+
const newQuizFindings = await _chunkLGKRFDO5cjs.mapWithConcurrency.call(void 0,
|
|
7957
7971
|
newQuizAssignments,
|
|
7958
7972
|
QUIZ_SCAN_CONCURRENCY_LIMIT2,
|
|
7959
7973
|
async (assignment) => {
|
|
@@ -7982,7 +7996,7 @@ function accessibilityAuditTools(canvas) {
|
|
|
7982
7996
|
title: "Audit Course Accessibility",
|
|
7983
7997
|
description: 'Scan a course\'s content (pages, assignments, syllabus, announcements, and optionally quizzes) for structurally-detectable WCAG 2.1 accessibility problems: images missing alt text or with low-quality (filename/generic) alt text, non-descriptive link text ("click here"), adjacent duplicate links, skipped/empty/overlong headings, and tables missing headers, header scope, or captions. Each finding carries a WCAG success criterion and a severity (error = unambiguous failure, advisory = needs human review). Structural checks only \u2014 no color-contrast checking (requires rendered theme CSS this tool cannot see) and no list-misuse detection in this version. Pass "quizzes" in `include` to also scan Classic quiz descriptions/questions and New Quiz item stems (opt-in, off by default). Complements \u2014 does not replace \u2014 Canvas\'s own in-app Accessibility Checker (course navigation \u2192 Accessibility \u2192 Scan Course), which covers the same WCAG areas plus rendered color contrast and offers in-UI remediation. Requires instructor permissions in the course.',
|
|
7984
7998
|
inputSchema: {
|
|
7985
|
-
course_id:
|
|
7999
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
|
|
7986
8000
|
include: _zod.z.array(_zod.z.enum(["pages", "assignments", "syllabus", "announcements", "quizzes"])).optional().describe(
|
|
7987
8001
|
"Content sources to scan. Omit to scan the default four: pages, assignments, syllabus, announcements. `quizzes` is opt-in \u2014 pass it explicitly to also scan Classic quiz descriptions/questions and New Quiz item stems."
|
|
7988
8002
|
)
|
|
@@ -8101,7 +8115,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8101
8115
|
title: "Get Appointment Group",
|
|
8102
8116
|
description: "Get a single appointment group by ID, including its time slots and participant counts.",
|
|
8103
8117
|
inputSchema: {
|
|
8104
|
-
appointment_group_id:
|
|
8118
|
+
appointment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
|
|
8105
8119
|
include: includeSchema
|
|
8106
8120
|
},
|
|
8107
8121
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
@@ -8154,7 +8168,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8154
8168
|
title: "Update Appointment Group",
|
|
8155
8169
|
description: "Update an existing appointment group. Use publish=true to make a draft group visible to participants, or add new time slots via new_appointments.",
|
|
8156
8170
|
inputSchema: {
|
|
8157
|
-
appointment_group_id:
|
|
8171
|
+
appointment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
|
|
8158
8172
|
title: _zod.z.string().optional().describe("New title"),
|
|
8159
8173
|
description: _zod.z.string().optional().describe("New description"),
|
|
8160
8174
|
location_name: _zod.z.string().optional().describe("Location name"),
|
|
@@ -8179,7 +8193,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8179
8193
|
title: "Delete Appointment Group",
|
|
8180
8194
|
description: "Delete an appointment group and cancel any existing reservations. Provide cancel_reason to notify participants.",
|
|
8181
8195
|
inputSchema: {
|
|
8182
|
-
appointment_group_id:
|
|
8196
|
+
appointment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
|
|
8183
8197
|
cancel_reason: _zod.z.string().optional().describe("Message to include in cancellation notifications")
|
|
8184
8198
|
},
|
|
8185
8199
|
annotations: { destructiveHint: true, openWorldHint: true },
|
|
@@ -8193,7 +8207,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8193
8207
|
title: "List Appointment Group Users",
|
|
8194
8208
|
description: "List participants (users) who have reserved a slot in an appointment group.",
|
|
8195
8209
|
inputSchema: {
|
|
8196
|
-
appointment_group_id:
|
|
8210
|
+
appointment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
|
|
8197
8211
|
},
|
|
8198
8212
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
8199
8213
|
handler: async (params) => {
|
|
@@ -8212,7 +8226,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8212
8226
|
title: "List Appointment Group Groups",
|
|
8213
8227
|
description: "List student groups that have reserved a slot in an appointment group (when participant_type=Group).",
|
|
8214
8228
|
inputSchema: {
|
|
8215
|
-
appointment_group_id:
|
|
8229
|
+
appointment_group_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
|
|
8216
8230
|
},
|
|
8217
8231
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
8218
8232
|
handler: async (params) => canvas.appointmentGroups.listGroups(params.appointment_group_id)
|
|
@@ -8222,7 +8236,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
|
|
|
8222
8236
|
title: "Next Appointment",
|
|
8223
8237
|
description: "Get the current user's next upcoming appointment across all (or specified) appointment groups.",
|
|
8224
8238
|
inputSchema: {
|
|
8225
|
-
appointment_group_ids: _zod.z.array(
|
|
8239
|
+
appointment_group_ids: _zod.z.array(_chunkLGKRFDO5cjs.canvasIdInput.call(void 0, )).optional().describe("Limit to specific appointment group IDs")
|
|
8226
8240
|
},
|
|
8227
8241
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
8228
8242
|
audience: "shared",
|
|
@@ -8459,7 +8473,7 @@ function pseudonymTools(pseudonymizer) {
|
|
|
8459
8473
|
audience: "educator",
|
|
8460
8474
|
description: 'Resolve a stable pseudonym (e.g. "Student 7") back to a Canvas user_id within a course. Use only when a teacher has explicitly asked to identify a specific student in an artifact. Every call is audit-logged.',
|
|
8461
8475
|
inputSchema: {
|
|
8462
|
-
course_id:
|
|
8476
|
+
course_id: _chunkLGKRFDO5cjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID the pseudonym was assigned in"),
|
|
8463
8477
|
pseudonym: _zod.z.string().describe('The pseudonym to resolve, e.g. "Student 7"')
|
|
8464
8478
|
},
|
|
8465
8479
|
annotations: {
|
|
@@ -8566,7 +8580,7 @@ function buildHandler(tool, pseudonymizer) {
|
|
|
8566
8580
|
}
|
|
8567
8581
|
return response;
|
|
8568
8582
|
} catch (error) {
|
|
8569
|
-
if (!(error instanceof
|
|
8583
|
+
if (!(error instanceof _chunkZKG3VDNNcjs.CanvasApiError)) {
|
|
8570
8584
|
console.error(`Unexpected error in tool "${tool.name}":`, error);
|
|
8571
8585
|
}
|
|
8572
8586
|
return {
|
|
@@ -8629,7 +8643,7 @@ function registerSyllabusResource(server, canvas) {
|
|
|
8629
8643
|
const rawCourseId = String(variables.courseId);
|
|
8630
8644
|
let courseId;
|
|
8631
8645
|
try {
|
|
8632
|
-
courseId =
|
|
8646
|
+
courseId = _chunkLGKRFDO5cjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
|
|
8633
8647
|
} catch (e7) {
|
|
8634
8648
|
return {
|
|
8635
8649
|
contents: [
|
|
@@ -8657,7 +8671,7 @@ function registerSyllabusResource(server, canvas) {
|
|
|
8657
8671
|
]
|
|
8658
8672
|
};
|
|
8659
8673
|
} catch (error) {
|
|
8660
|
-
if (!(error instanceof
|
|
8674
|
+
if (!(error instanceof _chunkZKG3VDNNcjs.CanvasApiError)) {
|
|
8661
8675
|
console.error("Unexpected error in syllabus resource:", error);
|
|
8662
8676
|
}
|
|
8663
8677
|
return {
|
|
@@ -8696,8 +8710,8 @@ function registerAssignmentDescriptionResource(server, canvas) {
|
|
|
8696
8710
|
let courseId;
|
|
8697
8711
|
let assignmentId;
|
|
8698
8712
|
try {
|
|
8699
|
-
courseId =
|
|
8700
|
-
assignmentId =
|
|
8713
|
+
courseId = _chunkLGKRFDO5cjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
|
|
8714
|
+
assignmentId = _chunkLGKRFDO5cjs.normalizeCanvasIdInput.call(void 0, rawAssignmentId);
|
|
8701
8715
|
} catch (e8) {
|
|
8702
8716
|
return {
|
|
8703
8717
|
contents: [{ uri, mimeType: "text/plain", text: "Invalid course or assignment ID" }]
|
|
@@ -8716,7 +8730,7 @@ function registerAssignmentDescriptionResource(server, canvas) {
|
|
|
8716
8730
|
]
|
|
8717
8731
|
};
|
|
8718
8732
|
} catch (error) {
|
|
8719
|
-
if (!(error instanceof
|
|
8733
|
+
if (!(error instanceof _chunkZKG3VDNNcjs.CanvasApiError)) {
|
|
8720
8734
|
console.error("Unexpected error in assignment-description resource:", error);
|
|
8721
8735
|
}
|
|
8722
8736
|
return {
|
|
@@ -10116,14 +10130,14 @@ function resolvePseudonymizer(config) {
|
|
|
10116
10130
|
});
|
|
10117
10131
|
}
|
|
10118
10132
|
function createCanvasMCPServer(config) {
|
|
10119
|
-
const canvas = new (0,
|
|
10133
|
+
const canvas = new (0, _chunkLGKRFDO5cjs.CanvasClient)({
|
|
10120
10134
|
token: config.token,
|
|
10121
10135
|
baseUrl: config.baseUrl
|
|
10122
10136
|
});
|
|
10123
10137
|
const pseudonymizer = resolvePseudonymizer(config);
|
|
10124
10138
|
const server = new (0, _mcpjs.McpServer)({
|
|
10125
10139
|
name: "canvas-lms-mcp",
|
|
10126
|
-
version:
|
|
10140
|
+
version: _chunkZKG3VDNNcjs.version
|
|
10127
10141
|
});
|
|
10128
10142
|
const features = {
|
|
10129
10143
|
assignmentSubmission: config.enableAssignmentSubmission,
|
|
@@ -10144,4 +10158,4 @@ function createCanvasMCPServer(config) {
|
|
|
10144
10158
|
|
|
10145
10159
|
|
|
10146
10160
|
exports.Pseudonymizer = Pseudonymizer; exports.createSharedPseudonymizer = createSharedPseudonymizer; exports.createCanvasMCPServer = createCanvasMCPServer;
|
|
10147
|
-
//# sourceMappingURL=chunk-
|
|
10161
|
+
//# sourceMappingURL=chunk-57FVMCK2.cjs.map
|