canvas-lms-mcp 2.4.0 → 2.4.2

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.
@@ -25,11 +25,11 @@ var _chunkQCEGMTXWcjs = require('./chunk-QCEGMTXW.cjs');
25
25
 
26
26
 
27
27
 
28
- var _chunkD2L5S2CLcjs = require('./chunk-D2L5S2CL.cjs');
28
+ var _chunkBCKOQCPPcjs = require('./chunk-BCKOQCPP.cjs');
29
29
 
30
30
 
31
31
 
32
- var _chunkW7OMWOZHcjs = require('./chunk-W7OMWOZH.cjs');
32
+ var _chunkWKYLHAWEcjs = require('./chunk-WKYLHAWE.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID")
1006
+ account_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The parent Canvas account ID")
1034
+ account_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
1049
+ account_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
1067
+ account_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID")
1088
+ account_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1153
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
1152
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1153
+ assignment_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1174
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
1173
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1174
+ assignment_id: _chunkBCKOQCPPcjs.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(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
1178
+ file_ids: _zod.z.array(_chunkBCKOQCPPcjs.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 _chunkW7OMWOZHcjs.CanvasApiError) {
1258
+ if (error instanceof _chunkWKYLHAWEcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1310
+ course_id: _chunkBCKOQCPPcjs.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(_chunkD2L5S2CLcjs.SEARCH_CONTENT_TYPES)).optional().describe(
1312
+ content_types: _zod.z.array(_zod.z.enum(_chunkBCKOQCPPcjs.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
- ..._chunkD2L5S2CLcjs.SEARCH_CONTENT_TYPES
1324
+ ..._chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
1352
+ course_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1369
- student_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the student")
1368
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1369
+ student_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
1387
+ course_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1405
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
1404
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1405
+ assignment_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1467
- assignment_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
1466
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1467
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1539
+ course_id: _chunkBCKOQCPPcjs.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 _chunkW7OMWOZHcjs.CanvasApiError && err.status === 404) {
1577
+ if (err instanceof _chunkWKYLHAWEcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1716
+ course_id: _chunkBCKOQCPPcjs.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(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to the given list of assignment IDs"),
1725
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1771
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
1770
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1771
+ assignment_id: _chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1803
+ course_id: _chunkBCKOQCPPcjs.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(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
1805
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Scope to a specific grading period"),
1810
+ grading_period_id: _chunkBCKOQCPPcjs.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,7 +1836,7 @@ function assignmentTools(canvas) {
1836
1836
  title: "Create Assignment",
1837
1837
  description: "Create a new assignment in a course.",
1838
1838
  inputSchema: {
1839
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1839
+ course_id: _chunkBCKOQCPPcjs.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"),
@@ -1844,7 +1844,7 @@ function assignmentTools(canvas) {
1844
1844
  submission_types: _zod.z.array(_zod.z.string()).optional().describe(
1845
1845
  'Allowed submission types (e.g. ["online_upload", "online_text_entry", "none"])'
1846
1846
  ),
1847
- assignment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("ID of the assignment group to place this assignment in"),
1847
+ assignment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("ID of the assignment group to place this assignment in"),
1848
1848
  published: _zod.z.boolean().optional().describe("Whether the assignment is published and visible to students"),
1849
1849
  omit_from_final_grade: _zod.z.boolean().optional().describe("Whether to leave this assignment out of the final grade calculation"),
1850
1850
  grade_group_students_individually: _zod.z.boolean().optional().describe(
@@ -1865,14 +1865,14 @@ function assignmentTools(canvas) {
1865
1865
  title: "Update Assignment",
1866
1866
  description: "Update an existing assignment in a course.",
1867
1867
  inputSchema: {
1868
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1869
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
1868
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1869
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
1870
1870
  name: _zod.z.string().optional().describe("New assignment name"),
1871
1871
  description: _zod.z.string().optional().describe("New assignment description (HTML supported)"),
1872
1872
  points_possible: _zod.z.number().optional().describe("New maximum points"),
1873
1873
  due_at: _zod.z.string().optional().describe("New due date in ISO 8601 format (e.g. 2026-05-01T23:59:00Z)"),
1874
1874
  submission_types: _zod.z.array(_zod.z.string()).optional().describe("New allowed submission types"),
1875
- assignment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("New assignment group ID"),
1875
+ assignment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("New assignment group ID"),
1876
1876
  published: _zod.z.boolean().optional().describe("Whether the assignment is published and visible to students"),
1877
1877
  omit_from_final_grade: _zod.z.boolean().optional().describe("Whether to leave this assignment out of the final grade calculation"),
1878
1878
  grade_group_students_individually: _zod.z.boolean().optional().describe(
@@ -1894,8 +1894,8 @@ function assignmentTools(canvas) {
1894
1894
  title: "Delete Assignment",
1895
1895
  description: "Delete an assignment from a course. This action is permanent.",
1896
1896
  inputSchema: {
1897
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1898
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to delete")
1897
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
1898
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to delete")
1899
1899
  },
1900
1900
  annotations: {
1901
1901
  destructiveHint: true,
@@ -1928,7 +1928,7 @@ async function fanOut(config) {
1928
1928
  skipped.push(outcome.result);
1929
1929
  }
1930
1930
  } catch (err) {
1931
- if (!(err instanceof _chunkW7OMWOZHcjs.CanvasApiError)) {
1931
+ if (!(err instanceof _chunkWKYLHAWEcjs.CanvasApiError)) {
1932
1932
  console.error(`Unexpected error ${config.errorContext(item)}:`, err);
1933
1933
  }
1934
1934
  const message = err instanceof Error ? err.message : "Unknown error";
@@ -1961,8 +1961,8 @@ function assignmentOverrideTools(canvas) {
1961
1961
  title: "List Assignment Overrides",
1962
1962
  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
1963
  inputSchema: {
1964
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
1965
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID")
1964
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
1965
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID")
1966
1966
  },
1967
1967
  annotations: {
1968
1968
  readOnlyHint: true,
@@ -1979,15 +1979,15 @@ function assignmentOverrideTools(canvas) {
1979
1979
  title: "Create Assignment Override",
1980
1980
  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
1981
  inputSchema: {
1982
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
1983
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID"),
1984
- student_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
1982
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
1983
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas assignment ID"),
1984
+ student_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
1985
1985
  "Real Canvas user IDs to grant the override to. Mutually exclusive with course_section_id and group_id."
1986
1986
  ),
1987
- course_section_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
1987
+ course_section_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
1988
1988
  "ID of the course section to override. Mutually exclusive with student_ids and group_id."
1989
1989
  ),
1990
- group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
1990
+ group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
1991
1991
  "ID of the group to override. Mutually exclusive with student_ids and course_section_id."
1992
1992
  ),
1993
1993
  title: _zod.z.string().optional().describe(
@@ -2035,9 +2035,9 @@ function assignmentOverrideTools(canvas) {
2035
2035
  title: "Set Student Assignment Dates",
2036
2036
  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
2037
  inputSchema: {
2038
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
2039
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
2040
- assignment_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
2038
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
2039
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
2040
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).min(1).optional().describe(
2041
2041
  "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
2042
  ),
2043
2043
  title: _zod.z.string().optional().describe(
@@ -2118,7 +2118,7 @@ function calendarTools(canvas) {
2118
2118
  title: "List Calendar Events",
2119
2119
  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
2120
  inputSchema: {
2121
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2121
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2122
2122
  type: _zod.z.enum(["event", "assignment", "sub_assignment"]).optional().describe('Kind of calendar item to return. Defaults to "event" if omitted.'),
2123
2123
  start_date: _zod.z.string().optional().describe(
2124
2124
  "Inclusive range start (YYYY-MM-DD or ISO 8601 datetime). Defaults to today if omitted."
@@ -2172,7 +2172,7 @@ function calendarTools(canvas) {
2172
2172
  title: "Update Calendar Event",
2173
2173
  description: "Update an existing calendar event. Only provided fields are changed.",
2174
2174
  inputSchema: {
2175
- event_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas calendar event ID"),
2175
+ event_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas calendar event ID"),
2176
2176
  title: _zod.z.string().optional().describe("New event title"),
2177
2177
  start_at: _zod.z.string().optional().describe("New start time in ISO 8601 format"),
2178
2178
  end_at: _zod.z.string().optional().describe("New end time in ISO 8601 format"),
@@ -2206,7 +2206,7 @@ function contentExportsTools(canvas) {
2206
2206
  title: "Create Content Export",
2207
2207
  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
2208
  inputSchema: {
2209
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2209
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2210
2210
  export_type: _zod.z.enum(["common_cartridge", "qti", "zip"]).describe(
2211
2211
  "Export format: common_cartridge (IMS CC, widely portable for migration/backup), qti (assessments only), zip (Canvas-native files archive)"
2212
2212
  )
@@ -2222,8 +2222,8 @@ function contentExportsTools(canvas) {
2222
2222
  title: "Get Content Export",
2223
2223
  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
2224
  inputSchema: {
2225
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2226
- export_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The export ID returned by create_content_export")
2225
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2226
+ export_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The export ID returned by create_content_export")
2227
2227
  },
2228
2228
  annotations: { readOnlyHint: true, openWorldHint: true },
2229
2229
  handler: async (params) => canvas.contentExports.get(params.course_id, params.export_id)
@@ -2233,7 +2233,7 @@ function contentExportsTools(canvas) {
2233
2233
  title: "List Content Exports",
2234
2234
  description: "List all content exports for a course (most recent first).",
2235
2235
  inputSchema: {
2236
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2236
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2237
2237
  },
2238
2238
  annotations: { readOnlyHint: true, openWorldHint: true },
2239
2239
  handler: async (params) => canvas.contentExports.list(params.course_id)
@@ -2250,7 +2250,7 @@ function contentMigrationsTools(canvas) {
2250
2250
  title: "List Content Migrations",
2251
2251
  description: "List all content migrations for a course (most recent first).",
2252
2252
  inputSchema: {
2253
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2253
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2254
2254
  },
2255
2255
  annotations: { readOnlyHint: true, openWorldHint: true },
2256
2256
  handler: async (params) => canvas.contentMigrations.list(params.course_id)
@@ -2260,8 +2260,8 @@ function contentMigrationsTools(canvas) {
2260
2260
  title: "Get Content Migration",
2261
2261
  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
2262
  inputSchema: {
2263
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2264
- migration_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2263
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2264
+ migration_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2265
2265
  },
2266
2266
  annotations: { readOnlyHint: true, openWorldHint: true },
2267
2267
  handler: async (params) => canvas.contentMigrations.get(params.course_id, params.migration_id)
@@ -2271,7 +2271,7 @@ function contentMigrationsTools(canvas) {
2271
2271
  title: "List Content Migration Types",
2272
2272
  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
2273
  inputSchema: {
2274
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2274
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2275
2275
  },
2276
2276
  annotations: { readOnlyHint: true, openWorldHint: true },
2277
2277
  handler: async (params) => canvas.contentMigrations.listMigrators(params.course_id)
@@ -2281,8 +2281,8 @@ function contentMigrationsTools(canvas) {
2281
2281
  title: "Get Migration Selective Data",
2282
2282
  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
2283
  inputSchema: {
2284
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2285
- migration_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The content migration ID"),
2284
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2285
+ migration_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The content migration ID"),
2286
2286
  type: _zod.z.string().optional().describe(
2287
2287
  'Filter to a specific content type (e.g. "course_settings", "syllabus_body", "context_modules", "assignments")'
2288
2288
  )
@@ -2299,8 +2299,8 @@ function contentMigrationsTools(canvas) {
2299
2299
  title: "Get Migration Asset ID Mapping",
2300
2300
  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
2301
  inputSchema: {
2302
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2303
- migration_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2302
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2303
+ migration_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2304
2304
  },
2305
2305
  annotations: { readOnlyHint: true, openWorldHint: true },
2306
2306
  handler: async (params) => canvas.contentMigrations.getAssetIdMapping(
@@ -2313,8 +2313,8 @@ function contentMigrationsTools(canvas) {
2313
2313
  title: "List Migration Issues",
2314
2314
  description: "List issues encountered during a content migration. Each issue has a type (todo, warning, or error) and a description.",
2315
2315
  inputSchema: {
2316
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2317
- migration_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2316
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2317
+ migration_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The content migration ID")
2318
2318
  },
2319
2319
  annotations: { readOnlyHint: true, openWorldHint: true },
2320
2320
  handler: async (params) => canvas.contentMigrations.listMigrationIssues(
@@ -2327,7 +2327,7 @@ function contentMigrationsTools(canvas) {
2327
2327
  title: "Create Content Migration",
2328
2328
  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
2329
  inputSchema: {
2330
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The destination Canvas course ID"),
2330
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The destination Canvas course ID"),
2331
2331
  migration_type: _zod.z.enum([
2332
2332
  "course_copy_importer",
2333
2333
  "common_cartridge_importer",
@@ -2380,7 +2380,7 @@ function conversationTools(canvas, pseudonymizer) {
2380
2380
  title: "Get Conversation",
2381
2381
  description: "Get a single conversation with its full message thread.",
2382
2382
  inputSchema: {
2383
- conversation_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The conversation ID")
2383
+ conversation_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The conversation ID")
2384
2384
  },
2385
2385
  annotations: {
2386
2386
  readOnlyHint: true,
@@ -2485,7 +2485,7 @@ function courseSetupTools(canvas) {
2485
2485
  title: "Check Course Setup",
2486
2486
  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
2487
  inputSchema: {
2488
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
2488
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
2489
2489
  checks: _zod.z.array(
2490
2490
  _zod.z.enum([
2491
2491
  "missing_due_dates",
@@ -2709,7 +2709,7 @@ function courseTools(canvas) {
2709
2709
  title: "Get Course",
2710
2710
  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
2711
  inputSchema: {
2712
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2712
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2713
2713
  include: _zod.z.array(_zod.z.enum(COURSE_GET_INCLUDE)).optional().describe("Extra fields to include on the course (Canvas include[] param)"),
2714
2714
  teacher_limit: _zod.z.number().int().optional().describe("Limit on the number of teachers returned when include=teachers")
2715
2715
  },
@@ -2730,7 +2730,7 @@ function courseTools(canvas) {
2730
2730
  title: "Get Syllabus",
2731
2731
  description: "Get the syllabus HTML body for a course.",
2732
2732
  inputSchema: {
2733
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2733
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2734
2734
  },
2735
2735
  annotations: {
2736
2736
  readOnlyHint: true,
@@ -2748,7 +2748,7 @@ function courseTools(canvas) {
2748
2748
  audience: "admin",
2749
2749
  description: "Create a new course in a Canvas account. Returns the created course object.",
2750
2750
  inputSchema: {
2751
- account_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID to create the course in"),
2751
+ account_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID to create the course in"),
2752
2752
  name: _zod.z.string().describe("The name of the course"),
2753
2753
  course_code: _zod.z.string().optional().describe("The course code (e.g. CS101)"),
2754
2754
  start_at: _zod.z.string().datetime().optional().describe("Course start date in ISO 8601 format (e.g. 2026-01-15T00:00:00Z)"),
@@ -2769,7 +2769,7 @@ function courseTools(canvas) {
2769
2769
  audience: "educator",
2770
2770
  description: "Update an existing course. Only provided fields are changed; omitted fields are left as-is.",
2771
2771
  inputSchema: {
2772
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
2772
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
2773
2773
  name: _zod.z.string().optional().describe("New course name"),
2774
2774
  course_code: _zod.z.string().optional().describe("New course code"),
2775
2775
  start_at: _zod.z.string().datetime().optional().describe("New start date in ISO 8601 format (e.g. 2026-01-15T00:00:00Z)"),
@@ -2901,7 +2901,7 @@ function discussionTools(canvas) {
2901
2901
  title: "List Discussions",
2902
2902
  description: "List all discussion topics in a course.",
2903
2903
  inputSchema: {
2904
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2904
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2905
2905
  },
2906
2906
  annotations: {
2907
2907
  readOnlyHint: true,
@@ -2920,8 +2920,8 @@ function discussionTools(canvas) {
2920
2920
  // edit also requires `pnpm generate:manifests`.
2921
2921
  description: "Get details for a single discussion topic by ID.",
2922
2922
  inputSchema: {
2923
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2924
- topic_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
2923
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
2924
+ topic_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
2925
2925
  },
2926
2926
  annotations: {
2927
2927
  readOnlyHint: true,
@@ -2933,7 +2933,7 @@ function discussionTools(canvas) {
2933
2933
  try {
2934
2934
  return await canvas.discussions.get(course_id, topic_id);
2935
2935
  } catch (error) {
2936
- if (!(error instanceof _chunkW7OMWOZHcjs.CanvasApiError) || error.status !== 404) throw error;
2936
+ if (!(error instanceof _chunkWKYLHAWEcjs.CanvasApiError) || error.status !== 404) throw error;
2937
2937
  const description = await describeAnonymityFromList(canvas, course_id, topic_id);
2938
2938
  if (description === void 0) throw error;
2939
2939
  throw new Error(anonymousTopicMessage(course_id, topic_id, description), {
@@ -2947,7 +2947,7 @@ function discussionTools(canvas) {
2947
2947
  title: "List Group Discussions",
2948
2948
  description: "List all discussion topics in a group.",
2949
2949
  inputSchema: {
2950
- group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
2950
+ group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
2951
2951
  },
2952
2952
  annotations: {
2953
2953
  readOnlyHint: true,
@@ -2966,8 +2966,8 @@ function discussionTools(canvas) {
2966
2966
  // embeds this string, so any edit also requires `pnpm generate:manifests`.
2967
2967
  description: "Get details for a single discussion topic in a group by ID.",
2968
2968
  inputSchema: {
2969
- group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID"),
2970
- topic_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
2969
+ group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID"),
2970
+ topic_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID")
2971
2971
  },
2972
2972
  annotations: {
2973
2973
  readOnlyHint: true,
@@ -2979,7 +2979,7 @@ function discussionTools(canvas) {
2979
2979
  try {
2980
2980
  return await canvas.discussions.getForGroup(group_id, topic_id);
2981
2981
  } catch (error) {
2982
- if (!(error instanceof _chunkW7OMWOZHcjs.CanvasApiError) || error.status !== 404) throw error;
2982
+ if (!(error instanceof _chunkWKYLHAWEcjs.CanvasApiError) || error.status !== 404) throw error;
2983
2983
  const description = await describeGroupAnonymityFromList(canvas, group_id, topic_id);
2984
2984
  if (description === void 0) throw error;
2985
2985
  throw new Error(anonymousGroupTopicMessage(group_id, topic_id, description), {
@@ -2993,7 +2993,7 @@ function discussionTools(canvas) {
2993
2993
  title: "List Announcements",
2994
2994
  description: "List all announcements in a course.",
2995
2995
  inputSchema: {
2996
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2996
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
2997
2997
  },
2998
2998
  annotations: {
2999
2999
  readOnlyHint: true,
@@ -3009,8 +3009,8 @@ function discussionTools(canvas) {
3009
3009
  title: "Post Discussion Entry",
3010
3010
  description: "Post a new entry (reply) to a discussion topic.",
3011
3011
  inputSchema: {
3012
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3013
- topic_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
3012
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3013
+ topic_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
3014
3014
  message: _zod.z.string().describe("The message body (supports HTML)")
3015
3015
  },
3016
3016
  annotations: {
@@ -3030,7 +3030,7 @@ function discussionTools(canvas) {
3030
3030
  audience: "educator",
3031
3031
  description: "Create a new discussion topic in a course.",
3032
3032
  inputSchema: {
3033
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3033
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3034
3034
  title: _zod.z.string().min(1).describe("Title of the discussion topic"),
3035
3035
  message: _zod.z.string().optional().describe("Body text of the discussion (supports HTML)"),
3036
3036
  discussion_type: _zod.z.enum(["side_comment", "threaded"]).optional().describe("Discussion type: side_comment (flat) or threaded"),
@@ -3067,8 +3067,8 @@ function discussionTools(canvas) {
3067
3067
  audience: "educator",
3068
3068
  description: "Update an existing discussion topic.",
3069
3069
  inputSchema: {
3070
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3071
- topic_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
3070
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3071
+ topic_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID"),
3072
3072
  title: _zod.z.string().optional().describe("New title for the discussion topic"),
3073
3073
  message: _zod.z.string().optional().describe("New body text (supports HTML)"),
3074
3074
  published: _zod.z.boolean().optional().describe("Publish or unpublish the topic"),
@@ -3108,8 +3108,8 @@ function discussionTools(canvas) {
3108
3108
  audience: "educator",
3109
3109
  description: "Delete a discussion topic from a course. This action is permanent.",
3110
3110
  inputSchema: {
3111
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3112
- topic_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID to delete")
3111
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3112
+ topic_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas discussion topic ID to delete")
3113
3113
  },
3114
3114
  annotations: {
3115
3115
  destructiveHint: true,
@@ -3167,8 +3167,8 @@ function enrollmentTools(canvas, pseudonymizer) {
3167
3167
  state: _zod.z.array(_zod.z.enum(ENROLLMENT_STATE)).optional().describe("Filter by one or more enrollment states"),
3168
3168
  role: _zod.z.array(_zod.z.string()).optional().describe("Filter by enrollment role names (as defined in the Canvas account)"),
3169
3169
  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: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Return enrollments scoped to this grading period"),
3171
- enrollment_term_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
3170
+ grading_period_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Return enrollments scoped to this grading period"),
3171
+ enrollment_term_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
3172
3172
  },
3173
3173
  annotations: {
3174
3174
  readOnlyHint: true,
@@ -3198,14 +3198,14 @@ function enrollmentTools(canvas, pseudonymizer) {
3198
3198
  audience: "educator",
3199
3199
  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
3200
  inputSchema: {
3201
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3201
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3202
3202
  type: _zod.z.array(_zod.z.enum(ENROLLMENT_TYPE)).optional().describe("Filter by one or more enrollment types"),
3203
3203
  state: _zod.z.array(_zod.z.enum(ENROLLMENT_STATE)).optional().describe("Filter by enrollment states"),
3204
3204
  role: _zod.z.array(_zod.z.string()).optional().describe("Filter by custom role names"),
3205
3205
  include: _zod.z.array(_zod.z.enum(ENROLLMENT_INCLUDE)).optional().describe("Extra fields to include (Canvas include[] param)"),
3206
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, { sentinels: ["self"] }).optional().describe('Filter to a specific user. Canvas ID (pass large IDs as a string) or "self".'),
3207
- grading_period_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Scope grade-related includes to this grading period"),
3208
- enrollment_term_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
3206
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, { sentinels: ["self"] }).optional().describe('Filter to a specific user. Canvas ID (pass large IDs as a string) or "self".'),
3207
+ grading_period_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Scope grade-related includes to this grading period"),
3208
+ enrollment_term_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Limit to enrollments in the given term")
3209
3209
  },
3210
3210
  annotations: {
3211
3211
  readOnlyHint: true,
@@ -3234,8 +3234,8 @@ function enrollmentTools(canvas, pseudonymizer) {
3234
3234
  title: "Enroll User",
3235
3235
  description: "Enroll a user in a course with a specified role.",
3236
3236
  inputSchema: {
3237
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3238
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID to enroll"),
3237
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3238
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID to enroll"),
3239
3239
  type: _zod.z.enum([
3240
3240
  "StudentEnrollment",
3241
3241
  "TeacherEnrollment",
@@ -3263,8 +3263,8 @@ function enrollmentTools(canvas, pseudonymizer) {
3263
3263
  title: "Remove Enrollment",
3264
3264
  description: "Remove or conclude an enrollment from a course. The 'delete' task is permanent; 'conclude' and 'deactivate' are reversible.",
3265
3265
  inputSchema: {
3266
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3267
- enrollment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The enrollment ID to remove"),
3266
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3267
+ enrollment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The enrollment ID to remove"),
3268
3268
  task: _zod.z.enum(["conclude", "delete", "deactivate"]).describe("The action to perform on the enrollment")
3269
3269
  },
3270
3270
  annotations: {
@@ -3342,7 +3342,7 @@ function fileTools(canvas) {
3342
3342
  title: "List Files",
3343
3343
  description: "List all files in a course.",
3344
3344
  inputSchema: {
3345
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3345
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3346
3346
  },
3347
3347
  annotations: {
3348
3348
  readOnlyHint: true,
@@ -3358,7 +3358,7 @@ function fileTools(canvas) {
3358
3358
  title: "List Folders",
3359
3359
  description: "List all folders in a course.",
3360
3360
  inputSchema: {
3361
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3361
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3362
3362
  },
3363
3363
  annotations: {
3364
3364
  readOnlyHint: true,
@@ -3374,8 +3374,8 @@ function fileTools(canvas) {
3374
3374
  title: "Get File",
3375
3375
  description: "Get metadata for a single file by ID, including download URL.",
3376
3376
  inputSchema: {
3377
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3378
- file_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
3377
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3378
+ file_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
3379
3379
  },
3380
3380
  annotations: {
3381
3381
  readOnlyHint: true,
@@ -3393,7 +3393,7 @@ function fileTools(canvas) {
3393
3393
  audience: "educator",
3394
3394
  description: "Upload a file to a course. Content must be base64-encoded. Canvas performs a multi-step upload internally.",
3395
3395
  inputSchema: {
3396
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3396
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3397
3397
  name: _zod.z.string().describe("File name including extension"),
3398
3398
  content: _zod.z.string().describe("Base64-encoded file content"),
3399
3399
  content_type: _zod.z.string().describe('MIME type, e.g. "application/pdf" or "image/png"'),
@@ -3418,7 +3418,7 @@ function fileTools(canvas) {
3418
3418
  audience: "educator",
3419
3419
  description: "Delete a file by ID. This action is permanent.",
3420
3420
  inputSchema: {
3421
- file_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
3421
+ file_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID")
3422
3422
  },
3423
3423
  annotations: {
3424
3424
  destructiveHint: true,
@@ -3434,8 +3434,8 @@ function fileTools(canvas) {
3434
3434
  title: "Download File",
3435
3435
  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
3436
  inputSchema: {
3437
- file_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID"),
3438
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas course ID to scope the file lookup")
3437
+ file_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas file ID"),
3438
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas course ID to scope the file lookup")
3439
3439
  },
3440
3440
  annotations: {
3441
3441
  readOnlyHint: true,
@@ -3452,8 +3452,8 @@ function fileTools(canvas) {
3452
3452
  title: "Find Duplicate Files",
3453
3453
  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
3454
  inputSchema: {
3455
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3456
- folder_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
3455
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3456
+ folder_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
3457
3457
  "Optional Canvas folder ID to scope the search to that folder and its subfolders"
3458
3458
  )
3459
3459
  },
@@ -3494,7 +3494,7 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
3494
3494
  title: "List Gradebook History Days",
3495
3495
  description: "List the dates in a course gradebook history that contain grading activity, grouped by grader and assignment.",
3496
3496
  inputSchema: {
3497
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3497
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
3498
3498
  },
3499
3499
  annotations: {
3500
3500
  readOnlyHint: true,
@@ -3510,7 +3510,7 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
3510
3510
  title: "Get Gradebook History Day",
3511
3511
  description: "Get the graders and assignment IDs that had gradebook activity on a specific course date.",
3512
3512
  inputSchema: {
3513
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3513
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3514
3514
  date: _zod.z.string().describe("The gradebook history date to inspect, in YYYY-MM-DD format")
3515
3515
  },
3516
3516
  annotations: {
@@ -3528,10 +3528,10 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
3528
3528
  title: "List Gradebook History Submissions",
3529
3529
  description: "List versioned submission history for one grader and assignment on a specific gradebook history date.",
3530
3530
  inputSchema: {
3531
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3531
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3532
3532
  date: _zod.z.string().describe("The gradebook history date to inspect, in YYYY-MM-DD format"),
3533
- grader_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the grader"),
3534
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
3533
+ grader_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the grader"),
3534
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
3535
3535
  },
3536
3536
  annotations: {
3537
3537
  readOnlyHint: true,
@@ -3564,9 +3564,9 @@ function gradebookHistoryTools(canvas, pseudonymizer) {
3564
3564
  title: "Get Gradebook History Feed",
3565
3565
  description: "Get the paginated gradebook history feed for a course, optionally filtered by assignment or user and optionally sorted oldest-first.",
3566
3566
  inputSchema: {
3567
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3568
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter the feed"),
3569
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID to filter the feed"),
3567
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
3568
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter the feed"),
3569
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID to filter the feed"),
3570
3570
  ascending: _zod.z.boolean().optional().describe("Set true to return the oldest gradebook history entries first")
3571
3571
  },
3572
3572
  annotations: {
@@ -3841,11 +3841,11 @@ function gradeExplanationTools(canvas, pseudonymizer) {
3841
3841
  title: "Explain Grade",
3842
3842
  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
3843
  inputSchema: {
3844
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to compute the grade for."),
3845
- student_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
3844
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to compute the grade for."),
3845
+ student_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
3846
3846
  "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
3847
  ),
3848
- assignment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
3848
+ assignment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
3849
3849
  "Narrow the output to a single assignment group. When omitted all groups are included and the overall course grade is computed."
3850
3850
  )
3851
3851
  },
@@ -4081,7 +4081,7 @@ Limitations:
4081
4081
  - Late-submission penalties are not factored in.
4082
4082
  - 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
4083
  inputSchema: {
4084
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe(
4084
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe(
4085
4085
  "Canvas course ID to compute the grade projection for."
4086
4086
  ),
4087
4087
  target_percentage: _zod.z.number().min(0).max(100).optional().describe(
@@ -4090,7 +4090,7 @@ Limitations:
4090
4090
  target_letter: _zod.z.string().optional().describe(
4091
4091
  '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
4092
  ),
4093
- student_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
4093
+ student_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
4094
4094
  "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
4095
  )
4096
4096
  },
@@ -4294,7 +4294,7 @@ function gradingPolicyTools(canvas) {
4294
4294
  title: "Explain Grading Policy",
4295
4295
  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
4296
  inputSchema: {
4297
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to explain the grading policy for.")
4297
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID to explain the grading policy for.")
4298
4298
  },
4299
4299
  annotations: {
4300
4300
  readOnlyHint: true,
@@ -4321,9 +4321,9 @@ function gradingPolicyTools(canvas) {
4321
4321
  latePolicySource = "api";
4322
4322
  } else {
4323
4323
  const err = latePolicyResult.reason;
4324
- if (err instanceof _chunkW7OMWOZHcjs.CanvasApiError && err.status === 403) {
4324
+ if (err instanceof _chunkWKYLHAWEcjs.CanvasApiError && err.status === 403) {
4325
4325
  policyUnavailable = true;
4326
- } else if (err instanceof _chunkW7OMWOZHcjs.CanvasApiError && err.status === 404) {
4326
+ } else if (err instanceof _chunkWKYLHAWEcjs.CanvasApiError && err.status === 404) {
4327
4327
  latePolicySource = "default";
4328
4328
  } else {
4329
4329
  throw err;
@@ -4353,7 +4353,7 @@ function gradingPolicyTools(canvas) {
4353
4353
  }
4354
4354
  }
4355
4355
  } catch (err) {
4356
- if (!(err instanceof _chunkW7OMWOZHcjs.CanvasApiError)) throw err;
4356
+ if (!(err instanceof _chunkWKYLHAWEcjs.CanvasApiError)) throw err;
4357
4357
  if (err.status !== 403 && err.status !== 404) throw err;
4358
4358
  }
4359
4359
  if (standardTitle === null) {
@@ -4424,8 +4424,8 @@ function gradingStandardsTools(canvas) {
4424
4424
  title: "List Grading Standards",
4425
4425
  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
4426
  inputSchema: {
4427
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to list standards for (mutually exclusive with account_id)"),
4428
- account_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
4427
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to list standards for (mutually exclusive with account_id)"),
4428
+ account_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
4429
4429
  "Account ID to list standards for (mutually exclusive with course_id; requires admin)"
4430
4430
  )
4431
4431
  },
@@ -4453,8 +4453,8 @@ function gradingStandardsTools(canvas) {
4453
4453
  title: "Create Grading Standard",
4454
4454
  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
4455
  inputSchema: {
4456
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to create the standard in (mutually exclusive with account_id)"),
4457
- account_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
4456
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Course ID to create the standard in (mutually exclusive with account_id)"),
4457
+ account_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
4458
4458
  "Account ID to create the standard in (requires admin; mutually exclusive with course_id)"
4459
4459
  ),
4460
4460
  title: _zod.z.string().min(1).describe('Display name for this grading standard (e.g. "GPA 4.0 Scale")'),
@@ -4483,7 +4483,7 @@ function gradingStandardsTools(canvas) {
4483
4483
  }
4484
4484
  throw new Error("Provide either course_id or account_id.");
4485
4485
  } catch (error) {
4486
- if (error instanceof _chunkW7OMWOZHcjs.CanvasApiError && error.status === 403 && courseId === void 0 && accountId !== void 0 && !error.message.toLowerCase().includes("rate limit exceeded")) {
4486
+ if (error instanceof _chunkWKYLHAWEcjs.CanvasApiError && error.status === 403 && courseId === void 0 && accountId !== void 0 && !error.message.toLowerCase().includes("rate limit exceeded")) {
4487
4487
  throw new Error(
4488
4488
  "Creating grading standards at the account level requires Canvas admin permissions. Try creating the standard in a course context instead (use course_id).",
4489
4489
  { cause: error }
@@ -4498,8 +4498,8 @@ function gradingStandardsTools(canvas) {
4498
4498
  title: "Apply Grading Standard to Course",
4499
4499
  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
4500
  inputSchema: {
4501
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
4502
- grading_standard_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).nullable().describe("The grading standard ID to apply, or null to remove the current standard")
4501
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID to update"),
4502
+ grading_standard_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).nullable().describe("The grading standard ID to apply, or null to remove the current standard")
4503
4503
  },
4504
4504
  annotations: {
4505
4505
  destructiveHint: true,
@@ -4522,7 +4522,7 @@ function groupTools(canvas, pseudonymizer) {
4522
4522
  title: "List Groups",
4523
4523
  description: "List all groups in a course.",
4524
4524
  inputSchema: {
4525
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
4525
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
4526
4526
  },
4527
4527
  annotations: {
4528
4528
  readOnlyHint: true,
@@ -4538,7 +4538,7 @@ function groupTools(canvas, pseudonymizer) {
4538
4538
  title: "List Group Members",
4539
4539
  description: "List all members of a group.",
4540
4540
  inputSchema: {
4541
- group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
4541
+ group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas group ID")
4542
4542
  },
4543
4543
  annotations: {
4544
4544
  readOnlyHint: true,
@@ -4584,7 +4584,7 @@ function moduleTools(canvas) {
4584
4584
  audience: "shared",
4585
4585
  description: "List all modules in a course.",
4586
4586
  inputSchema: {
4587
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
4587
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
4588
4588
  },
4589
4589
  annotations: {
4590
4590
  readOnlyHint: true,
@@ -4601,8 +4601,8 @@ function moduleTools(canvas) {
4601
4601
  audience: "shared",
4602
4602
  description: "Get details for a single module by ID.",
4603
4603
  inputSchema: {
4604
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4605
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
4604
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4605
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
4606
4606
  },
4607
4607
  annotations: {
4608
4608
  readOnlyHint: true,
@@ -4620,8 +4620,8 @@ function moduleTools(canvas) {
4620
4620
  audience: "shared",
4621
4621
  description: "List all items within a module.",
4622
4622
  inputSchema: {
4623
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4624
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
4623
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4624
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID")
4625
4625
  },
4626
4626
  annotations: {
4627
4627
  readOnlyHint: true,
@@ -4639,7 +4639,7 @@ function moduleTools(canvas) {
4639
4639
  audience: "shared",
4640
4640
  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
4641
  inputSchema: {
4642
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4642
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4643
4643
  include_published_only: _zod.z.boolean().optional().describe("When true, exclude unpublished items from each module (default: false)"),
4644
4644
  include_content_details: _zod.z.boolean().optional().describe(
4645
4645
  "When true, fetch content_details for each item (adds extra Canvas API data; default: false)"
@@ -4667,7 +4667,7 @@ function moduleTools(canvas) {
4667
4667
  audience: "shared",
4668
4668
  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
4669
  inputSchema: {
4670
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4670
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4671
4671
  include_published_only: _zod.z.boolean().optional().describe("When true, exclude unpublished items (default: false)"),
4672
4672
  include_content_details: _zod.z.boolean().optional().describe("When true, fetch content_details for each item (default: false)")
4673
4673
  },
@@ -4696,11 +4696,11 @@ function moduleTools(canvas) {
4696
4696
  title: "Create Module",
4697
4697
  description: "Create a new module in a course.",
4698
4698
  inputSchema: {
4699
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4699
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4700
4700
  name: _zod.z.string().describe("Name of the module"),
4701
4701
  position: _zod.z.number().optional().describe("Position of the module in the list"),
4702
4702
  unlock_at: _zod.z.string().optional().describe("Date/time the module unlocks (ISO 8601)"),
4703
- prerequisite_module_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("IDs of modules that must be completed before this one")
4703
+ prerequisite_module_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("IDs of modules that must be completed before this one")
4704
4704
  },
4705
4705
  annotations: {
4706
4706
  destructiveHint: true,
@@ -4721,8 +4721,8 @@ function moduleTools(canvas) {
4721
4721
  title: "Update Module",
4722
4722
  description: "Update an existing module (rename, reposition, publish/unpublish).",
4723
4723
  inputSchema: {
4724
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4725
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4724
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4725
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4726
4726
  name: _zod.z.string().optional().describe("New name for the module"),
4727
4727
  position: _zod.z.number().optional().describe("New position in the module list"),
4728
4728
  published: _zod.z.boolean().optional().describe("Whether the module is published")
@@ -4746,8 +4746,8 @@ function moduleTools(canvas) {
4746
4746
  title: "Create Module Item",
4747
4747
  description: "Add an item (Assignment, Page, Quiz, File, Discussion, ExternalUrl, ExternalTool, SubHeader) to a module.",
4748
4748
  inputSchema: {
4749
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4750
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4749
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4750
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4751
4751
  title: _zod.z.string().describe("Title of the module item"),
4752
4752
  type: _zod.z.enum([
4753
4753
  "File",
@@ -4759,7 +4759,7 @@ function moduleTools(canvas) {
4759
4759
  "ExternalTool",
4760
4760
  "SubHeader"
4761
4761
  ]).describe("Type of content to add"),
4762
- content_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Canvas ID of the content (required for File, Discussion, Assignment, Quiz)"),
4762
+ content_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Canvas ID of the content (required for File, Discussion, Assignment, Quiz)"),
4763
4763
  page_url: _zod.z.string().optional().describe("Page URL slug (required for Page items, which are addressed by slug, not ID)"),
4764
4764
  external_url: _zod.z.string().optional().describe("URL for ExternalUrl or ExternalTool items"),
4765
4765
  position: _zod.z.number().optional().describe("Position within the module")
@@ -4786,16 +4786,16 @@ function moduleTools(canvas) {
4786
4786
  title: "Update Module Item",
4787
4787
  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
4788
  inputSchema: {
4789
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4790
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID the item currently belongs to"),
4791
- item_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID"),
4789
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4790
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID the item currently belongs to"),
4791
+ item_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID"),
4792
4792
  title: _zod.z.string().optional().describe("New title for the module item"),
4793
4793
  external_url: _zod.z.string().optional().describe("New URL for an ExternalUrl or ExternalTool item"),
4794
4794
  position: _zod.z.number().optional().describe("New 1-based position within the module"),
4795
4795
  indent: _zod.z.number().optional().describe("New indent level (0 = flush left)"),
4796
4796
  new_tab: _zod.z.boolean().optional().describe("Whether an external item opens in a new tab"),
4797
4797
  published: _zod.z.boolean().optional().describe("Whether the item is published"),
4798
- target_module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Move the item to this module ID (omit to leave it where it is)")
4798
+ target_module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Move the item to this module ID (omit to leave it where it is)")
4799
4799
  },
4800
4800
  annotations: {
4801
4801
  destructiveHint: true,
@@ -4814,9 +4814,9 @@ function moduleTools(canvas) {
4814
4814
  title: "Delete Module Item",
4815
4815
  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
4816
  inputSchema: {
4817
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4818
- module_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4819
- item_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID to remove")
4817
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
4818
+ module_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module ID"),
4819
+ item_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas module item ID to remove")
4820
4820
  },
4821
4821
  annotations: {
4822
4822
  destructiveHint: true,
@@ -4842,8 +4842,8 @@ function outcomeTools(canvas, pseudonymizer) {
4842
4842
  title: "Get Root Outcome Group",
4843
4843
  description: "Get the root outcome group for an account or course context.",
4844
4844
  inputSchema: {
4845
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcomes from an account or course context."),
4846
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
4845
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcomes from an account or course context."),
4846
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
4847
4847
  },
4848
4848
  annotations: { readOnlyHint: true, openWorldHint: true },
4849
4849
  handler: async (params) => canvas.outcomes.getRootOutcomeGroup(
@@ -4856,8 +4856,8 @@ function outcomeTools(canvas, pseudonymizer) {
4856
4856
  title: "List Outcome Groups",
4857
4857
  description: "List all outcome groups for an account or course context.",
4858
4858
  inputSchema: {
4859
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome groups from an account or course context."),
4860
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
4859
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome groups from an account or course context."),
4860
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context.")
4861
4861
  },
4862
4862
  annotations: { readOnlyHint: true, openWorldHint: true },
4863
4863
  handler: async (params) => canvas.outcomes.listOutcomeGroups(
@@ -4870,10 +4870,10 @@ function outcomeTools(canvas, pseudonymizer) {
4870
4870
  title: "List Outcome Group Links",
4871
4871
  description: "List all outcome links in an account or course context.",
4872
4872
  inputSchema: {
4873
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome links from an account or course context."),
4874
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4875
- outcome_style: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.'),
4876
- outcome_group_style: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_DETAIL_LEVELS).optional().describe(
4873
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("Whether to read outcome links from an account or course context."),
4874
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4875
+ outcome_style: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.'),
4876
+ outcome_group_style: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_DETAIL_LEVELS).optional().describe(
4877
4877
  'Outcome group detail level. Use "full" to include expanded outcome group fields.'
4878
4878
  )
4879
4879
  },
@@ -4892,9 +4892,9 @@ function outcomeTools(canvas, pseudonymizer) {
4892
4892
  title: "Get Outcome Group",
4893
4893
  description: "Get details for a specific outcome group in an account or course context.",
4894
4894
  inputSchema: {
4895
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4896
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4897
- outcome_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
4895
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4896
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4897
+ outcome_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
4898
4898
  },
4899
4899
  annotations: { readOnlyHint: true, openWorldHint: true },
4900
4900
  handler: async (params) => canvas.outcomes.getOutcomeGroup(
@@ -4908,10 +4908,10 @@ function outcomeTools(canvas, pseudonymizer) {
4908
4908
  title: "List Outcome Group Outcomes",
4909
4909
  description: "List the linked outcomes directly under a specific outcome group.",
4910
4910
  inputSchema: {
4911
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4912
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4913
- outcome_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID."),
4914
- outcome_style: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.')
4911
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4912
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4913
+ outcome_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID."),
4914
+ outcome_style: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_DETAIL_LEVELS).optional().describe('Outcome detail level. Use "full" to include expanded outcome fields.')
4915
4915
  },
4916
4916
  annotations: { readOnlyHint: true, openWorldHint: true },
4917
4917
  handler: async (params) => canvas.outcomes.listGroupOutcomes(
@@ -4928,9 +4928,9 @@ function outcomeTools(canvas, pseudonymizer) {
4928
4928
  title: "List Outcome Group Subgroups",
4929
4929
  description: "List the immediate child outcome groups under a specific outcome group.",
4930
4930
  inputSchema: {
4931
- context_type: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4932
- context_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4933
- outcome_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
4931
+ context_type: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_CONTEXT_TYPES).describe("The outcome group context type."),
4932
+ context_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID or course ID for the context."),
4933
+ outcome_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome group ID.")
4934
4934
  },
4935
4935
  annotations: { readOnlyHint: true, openWorldHint: true },
4936
4936
  handler: async (params) => canvas.outcomes.listGroupSubgroups(
@@ -4944,7 +4944,7 @@ function outcomeTools(canvas, pseudonymizer) {
4944
4944
  title: "Get Outcome",
4945
4945
  description: "Get the full details for a specific learning outcome by ID.",
4946
4946
  inputSchema: {
4947
- outcome_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
4947
+ outcome_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
4948
4948
  add_defaults: _zod.z.boolean().optional().describe("Include default mastery colors and levels when Canvas supports it.")
4949
4949
  },
4950
4950
  annotations: { readOnlyHint: true, openWorldHint: true },
@@ -4957,9 +4957,9 @@ function outcomeTools(canvas, pseudonymizer) {
4957
4957
  title: "Get Outcome Alignments",
4958
4958
  description: "Get outcome alignments for a course, optionally filtered to a specific student or assignment.",
4959
4959
  inputSchema: {
4960
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
4961
- student_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID of the student to filter alignments by."),
4962
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter alignments by.")
4960
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
4961
+ student_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas user ID of the student to filter alignments by."),
4962
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Optional Canvas assignment ID to filter alignments by.")
4963
4963
  },
4964
4964
  annotations: { readOnlyHint: true, openWorldHint: true },
4965
4965
  handler: async (params) => canvas.outcomes.getOutcomeAlignments(params.course_id, {
@@ -4972,11 +4972,11 @@ function outcomeTools(canvas, pseudonymizer) {
4972
4972
  title: "Get Outcome Results",
4973
4973
  description: "Get per-student outcome results for a course, with optional outcome, student, and alignment filters.",
4974
4974
  inputSchema: {
4975
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
4976
- user_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
4975
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
4976
+ user_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
4977
4977
  'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
4978
4978
  ),
4979
- outcome_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the results."),
4979
+ outcome_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the results."),
4980
4980
  include_alignments: _zod.z.boolean().optional().describe("Include linked alignment details in the response."),
4981
4981
  include_hidden: _zod.z.boolean().optional().describe("Include hidden outcomes when Canvas supports it.")
4982
4982
  },
@@ -4998,18 +4998,18 @@ function outcomeTools(canvas, pseudonymizer) {
4998
4998
  title: "Get Outcome Rollups",
4999
4999
  description: "Get outcome rollups for a course, optionally aggregated or filtered by students, outcomes, and sort options.",
5000
5000
  inputSchema: {
5001
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5001
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5002
5002
  aggregate: _zod.z.enum(["course"]).optional().describe("Aggregate all student rollups into a single course-level rollup."),
5003
- aggregate_stat: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_ROLLUP_AGGREGATE_STATS).optional().describe('Statistic to use when aggregate="course".'),
5004
- user_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5003
+ aggregate_stat: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_ROLLUP_AGGREGATE_STATS).optional().describe('Statistic to use when aggregate="course".'),
5004
+ user_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5005
5005
  'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
5006
5006
  ),
5007
- outcome_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the rollups."),
5007
+ outcome_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the rollups."),
5008
5008
  include_courses: _zod.z.boolean().optional().describe("Include linked course details in the response payload."),
5009
- exclude: _zod.z.array(_zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional rollup exclusions for missing users or missing outcome results."),
5010
- sort_by: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_ROLLUP_SORT_BY).optional().describe("Sort rollups by student name or by a specific outcome score."),
5011
- sort_outcome_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe('Outcome ID to sort by when sort_by="outcome".'),
5012
- sort_order: _zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_SORT_ORDER).optional().describe("Sort order to apply when sorting rollups."),
5009
+ exclude: _zod.z.array(_zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional rollup exclusions for missing users or missing outcome results."),
5010
+ sort_by: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_ROLLUP_SORT_BY).optional().describe("Sort rollups by student name or by a specific outcome score."),
5011
+ sort_outcome_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe('Outcome ID to sort by when sort_by="outcome".'),
5012
+ sort_order: _zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_SORT_ORDER).optional().describe("Sort order to apply when sorting rollups."),
5013
5013
  add_defaults: _zod.z.boolean().optional().describe("Include default mastery colors and levels when Canvas supports it.")
5014
5014
  },
5015
5015
  annotations: { readOnlyHint: true, openWorldHint: true },
@@ -5036,9 +5036,9 @@ function outcomeTools(canvas, pseudonymizer) {
5036
5036
  title: "Get Outcome Contributing Scores",
5037
5037
  description: "Get assignment or quiz scores that contributed to a specific outcome for one or more students in a course.",
5038
5038
  inputSchema: {
5039
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5040
- outcome_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
5041
- user_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5039
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5040
+ outcome_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas outcome ID."),
5041
+ user_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5042
5042
  'Optional Canvas user IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
5043
5043
  ),
5044
5044
  only_assignment_alignments: _zod.z.boolean().optional().describe("Limit results to assignment alignments only."),
@@ -5060,10 +5060,10 @@ function outcomeTools(canvas, pseudonymizer) {
5060
5060
  title: "Get Outcome Mastery Distribution",
5061
5061
  description: "Get mastery distribution analytics for outcomes in a course, optionally filtered by students or outcomes.",
5062
5062
  inputSchema: {
5063
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5064
- exclude: _zod.z.array(_zod.z.enum(_chunkD2L5S2CLcjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional exclusions for missing users or missing outcome results."),
5065
- outcome_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the distribution results."),
5066
- student_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5063
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID."),
5064
+ exclude: _zod.z.array(_zod.z.enum(_chunkBCKOQCPPcjs.OUTCOME_EXCLUDE_OPTIONS)).optional().describe("Optional exclusions for missing users or missing outcome results."),
5065
+ outcome_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Optional outcome IDs to restrict the distribution results."),
5066
+ student_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
5067
5067
  'Optional Canvas student IDs (pass large IDs as strings) or SIS user IDs prefixed with "sis_user_id:".'
5068
5068
  ),
5069
5069
  include_alignment_distributions: _zod.z.boolean().optional().describe("Include contributing score distributions for alignments."),
@@ -5157,7 +5157,7 @@ function pageTools(canvas) {
5157
5157
  audience: "shared",
5158
5158
  description: "List all wiki pages in a course.",
5159
5159
  inputSchema: {
5160
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
5160
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
5161
5161
  },
5162
5162
  output: listOutput("pages", canvasPageSchema),
5163
5163
  annotations: {
@@ -5175,7 +5175,7 @@ function pageTools(canvas) {
5175
5175
  audience: "shared",
5176
5176
  description: "Get a single wiki page by its URL slug.",
5177
5177
  inputSchema: {
5178
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5178
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5179
5179
  page_url: _zod.z.string().describe('The page URL slug (e.g. "welcome-page")')
5180
5180
  },
5181
5181
  output: objectOutput(canvasPageSchema),
@@ -5194,7 +5194,7 @@ function pageTools(canvas) {
5194
5194
  title: "Create Page",
5195
5195
  description: "Create a new wiki page in a course.",
5196
5196
  inputSchema: {
5197
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5197
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5198
5198
  title: _zod.z.string().describe("Title of the page"),
5199
5199
  body: _zod.z.string().optional().describe("HTML body content of the page"),
5200
5200
  published: _zod.z.boolean().optional().describe("Whether the page is published"),
@@ -5220,7 +5220,7 @@ function pageTools(canvas) {
5220
5220
  title: "Update Page",
5221
5221
  description: "Update an existing wiki page.",
5222
5222
  inputSchema: {
5223
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5223
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5224
5224
  page_url: _zod.z.string().describe("The page URL slug"),
5225
5225
  title: _zod.z.string().optional().describe("New title for the page"),
5226
5226
  body: _zod.z.string().optional().describe("New HTML body content"),
@@ -5248,7 +5248,7 @@ function pageTools(canvas) {
5248
5248
  title: "Delete Page",
5249
5249
  description: "Delete a wiki page from a course. This action is permanent.",
5250
5250
  inputSchema: {
5251
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5251
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5252
5252
  page_url: _zod.z.string().describe("The page URL slug to delete")
5253
5253
  },
5254
5254
  output: objectOutput(pageDeletionSchema),
@@ -5274,8 +5274,8 @@ function peerReviewTools(canvas) {
5274
5274
  title: "List Peer Reviews",
5275
5275
  description: "List all peer reviews for an assignment in a course.",
5276
5276
  inputSchema: {
5277
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5278
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
5277
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5278
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID")
5279
5279
  },
5280
5280
  annotations: {
5281
5281
  readOnlyHint: true,
@@ -5292,9 +5292,9 @@ function peerReviewTools(canvas) {
5292
5292
  title: "Get Submission Peer Reviews",
5293
5293
  description: "List peer reviews assigned to a specific submission.",
5294
5294
  inputSchema: {
5295
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5296
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5297
- submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID")
5295
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5296
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5297
+ submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID")
5298
5298
  },
5299
5299
  annotations: {
5300
5300
  readOnlyHint: true,
@@ -5313,10 +5313,10 @@ function peerReviewTools(canvas) {
5313
5313
  audience: "educator",
5314
5314
  description: "Assign a user to peer-review a submission.",
5315
5315
  inputSchema: {
5316
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5317
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5318
- submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
5319
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to assign")
5316
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5317
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5318
+ submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
5319
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to assign")
5320
5320
  },
5321
5321
  annotations: {
5322
5322
  destructiveHint: true,
@@ -5336,10 +5336,10 @@ function peerReviewTools(canvas) {
5336
5336
  audience: "educator",
5337
5337
  description: "Remove a peer review assignment from a submission. This action is permanent.",
5338
5338
  inputSchema: {
5339
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5340
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5341
- submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
5342
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to remove")
5339
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5340
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
5341
+ submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas submission ID"),
5342
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID of the reviewer to remove")
5343
5343
  },
5344
5344
  annotations: {
5345
5345
  destructiveHint: true,
@@ -5366,7 +5366,7 @@ function quizTools(canvas) {
5366
5366
  audience: "shared",
5367
5367
  description: "List all quizzes in a course.",
5368
5368
  inputSchema: {
5369
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
5369
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
5370
5370
  },
5371
5371
  annotations: {
5372
5372
  readOnlyHint: true,
@@ -5383,8 +5383,8 @@ function quizTools(canvas) {
5383
5383
  audience: "shared",
5384
5384
  description: "Get details for a single quiz by ID.",
5385
5385
  inputSchema: {
5386
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5387
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5386
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5387
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5388
5388
  },
5389
5389
  annotations: {
5390
5390
  readOnlyHint: true,
@@ -5401,8 +5401,8 @@ function quizTools(canvas) {
5401
5401
  title: "List Quiz Submissions",
5402
5402
  description: "List all submissions for a quiz.",
5403
5403
  inputSchema: {
5404
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5405
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5404
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5405
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5406
5406
  },
5407
5407
  annotations: {
5408
5408
  readOnlyHint: true,
@@ -5419,8 +5419,8 @@ function quizTools(canvas) {
5419
5419
  title: "List Quiz Questions",
5420
5420
  description: "List all questions in a quiz.",
5421
5421
  inputSchema: {
5422
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5423
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5422
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5423
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID")
5424
5424
  },
5425
5425
  annotations: {
5426
5426
  readOnlyHint: true,
@@ -5437,7 +5437,7 @@ function quizTools(canvas) {
5437
5437
  title: "Get Quiz Submission Answers",
5438
5438
  description: "Get a student's answers for a quiz submission.",
5439
5439
  inputSchema: {
5440
- quiz_submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID")
5440
+ quiz_submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID")
5441
5441
  },
5442
5442
  annotations: {
5443
5443
  readOnlyHint: true,
@@ -5453,10 +5453,10 @@ function quizTools(canvas) {
5453
5453
  title: "Score Quiz Question",
5454
5454
  description: "Score a specific question in a quiz submission. Specify attempt to score a particular attempt (omit for latest). Requires grading permissions.",
5455
5455
  inputSchema: {
5456
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5457
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID"),
5458
- submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID"),
5459
- question_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID"),
5456
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5457
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID"),
5458
+ submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz submission ID"),
5459
+ question_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID"),
5460
5460
  score: _zod.z.number().describe("The score to assign"),
5461
5461
  comment: _zod.z.string().optional().describe("Optional feedback comment"),
5462
5462
  attempt: _zod.z.number().optional().describe("Quiz attempt number to score (omit for latest)")
@@ -5496,9 +5496,9 @@ function quizTools(canvas) {
5496
5496
  audience: "shared",
5497
5497
  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
5498
  inputSchema: {
5499
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5500
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5501
- submission_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The quiz submission ID"),
5499
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5500
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5501
+ submission_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The quiz submission ID"),
5502
5502
  attempt: _zod.z.number().int().positive().optional().describe("Attempt number (1-based). Omit for the most recent attempt.")
5503
5503
  },
5504
5504
  annotations: {
@@ -5518,8 +5518,8 @@ function quizTools(canvas) {
5518
5518
  title: "Delete Quiz",
5519
5519
  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
5520
  inputSchema: {
5521
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5522
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID to delete (Classic Quizzes only)")
5521
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5522
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID to delete (Classic Quizzes only)")
5523
5523
  },
5524
5524
  annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
5525
5525
  handler: async (params) => {
@@ -5533,9 +5533,9 @@ function quizTools(canvas) {
5533
5533
  title: "Delete Quiz Question",
5534
5534
  description: "Permanently delete a single question from a Classic quiz. Classic Quizzes only; use delete_new_quiz_item for a New Quiz item.",
5535
5535
  inputSchema: {
5536
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5537
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5538
- question_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID to delete")
5536
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5537
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5538
+ question_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz question ID to delete")
5539
5539
  },
5540
5540
  annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
5541
5541
  handler: async (params) => {
@@ -5612,9 +5612,9 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
5612
5612
  title: "Get Quiz Question Responses",
5613
5613
  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
5614
  inputSchema: {
5615
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5616
- quiz_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5617
- question_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe(
5615
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
5616
+ quiz_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas quiz ID (Classic Quizzes only)"),
5617
+ question_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe(
5618
5618
  "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
5619
  )
5620
5620
  },
@@ -5682,7 +5682,7 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
5682
5682
  answersBySubmission,
5683
5683
  missing
5684
5684
  );
5685
- for (const question of resolved.sort((a, b) => _chunkD2L5S2CLcjs.compareCanvasIds.call(void 0, a.id, b.id))) {
5685
+ for (const question of resolved.sort((a, b) => _chunkBCKOQCPPcjs.compareCanvasIds.call(void 0, a.id, b.id))) {
5686
5686
  groups.set(question.id, toGroup(question, null));
5687
5687
  }
5688
5688
  }
@@ -5725,7 +5725,7 @@ function quizQuestionResponseTools(canvas, pseudonymizer) {
5725
5725
  unmatched_response_count: unmatchedResponseCount,
5726
5726
  // `a - b` would round both operands above 2**53 and can report two
5727
5727
  // distinct ids as equal (BRU-2730 §4.4).
5728
- unmatched_question_ids: [...unmatchedQuestionIds].sort(_chunkD2L5S2CLcjs.compareCanvasIds)
5728
+ unmatched_question_ids: [...unmatchedQuestionIds].sort(_chunkBCKOQCPPcjs.compareCanvasIds)
5729
5729
  };
5730
5730
  }
5731
5731
  }
@@ -5742,8 +5742,8 @@ function quizAccommodationTools(canvas) {
5742
5742
  title: "Set Student Quiz Accommodation",
5743
5743
  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
5744
  inputSchema: {
5745
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5746
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
5745
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5746
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
5747
5747
  extra_time_minutes: _zod.z.number().int().positive().optional().describe(
5748
5748
  "Absolute extra time in minutes to add to each quiz. Mutually exclusive with time_multiplier."
5749
5749
  ),
@@ -5751,7 +5751,7 @@ function quizAccommodationTools(canvas) {
5751
5751
  "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
5752
  ),
5753
5753
  extra_attempts: _zod.z.number().int().min(1).optional().describe("Additional attempts to grant beyond the quiz default."),
5754
- quiz_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
5754
+ quiz_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe(
5755
5755
  "Limit accommodation to these specific quiz IDs. Omit to target all Classic Quizzes in the course."
5756
5756
  )
5757
5757
  },
@@ -5847,8 +5847,8 @@ function quizAccommodationTools(canvas) {
5847
5847
  title: "List Student Quiz Accommodations",
5848
5848
  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
5849
  inputSchema: {
5850
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5851
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
5850
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5851
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
5852
5852
  },
5853
5853
  annotations: {
5854
5854
  readOnlyHint: true,
@@ -5898,13 +5898,13 @@ function newQuizAccommodationTools(canvas) {
5898
5898
  title: "Set Student New Quiz Accommodation",
5899
5899
  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
5900
  inputSchema: {
5901
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5902
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
5901
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5902
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student to accommodate"),
5903
5903
  time_multiplier: _zod.z.number().min(1.01).optional().describe(
5904
5904
  "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
5905
  ),
5906
5906
  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(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
5907
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe(
5908
5908
  "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
5909
  )
5910
5910
  },
@@ -5957,7 +5957,7 @@ function newQuizAccommodationTools(canvas) {
5957
5957
  extra_attempts: record.extra_attempts
5958
5958
  });
5959
5959
  } catch (err) {
5960
- const message = err instanceof _chunkW7OMWOZHcjs.CanvasApiError ? err.message : "Unknown error";
5960
+ const message = err instanceof _chunkWKYLHAWEcjs.CanvasApiError ? err.message : "Unknown error";
5961
5961
  failed.push({
5962
5962
  assignment_id: assignmentId,
5963
5963
  time_multiplier: null,
@@ -5979,8 +5979,8 @@ function newQuizAccommodationTools(canvas) {
5979
5979
  title: "List Student New Quiz Accommodations",
5980
5980
  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
5981
  inputSchema: {
5982
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5983
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
5982
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
5983
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Real Canvas user ID of the student")
5984
5984
  },
5985
5985
  annotations: {
5986
5986
  readOnlyHint: true,
@@ -6073,7 +6073,7 @@ function newQuizTools(canvas) {
6073
6073
  title: "Create New Quiz",
6074
6074
  description: "Create a New Quiz (LTI) in a Canvas course. New Quizzes is the modern quiz engine; for Classic quizzes use create_quiz.",
6075
6075
  inputSchema: {
6076
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6076
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6077
6077
  title: _zod.z.string().describe("Title of the quiz"),
6078
6078
  instructions: _zod.z.string().nullable().optional().describe("HTML instructions shown before the quiz starts"),
6079
6079
  points_possible: _zod.z.number().optional().describe("Total points; defaults to sum of item points"),
@@ -6101,8 +6101,8 @@ function newQuizTools(canvas) {
6101
6101
  title: "Update New Quiz",
6102
6102
  description: "Update an existing New Quiz (LTI) in a Canvas course.",
6103
6103
  inputSchema: {
6104
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6105
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6104
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6105
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6106
6106
  title: _zod.z.string().optional().describe("Title of the quiz"),
6107
6107
  instructions: _zod.z.string().nullable().optional().describe("HTML instructions shown before the quiz starts"),
6108
6108
  points_possible: _zod.z.number().optional().describe("Total points"),
@@ -6131,8 +6131,8 @@ function newQuizTools(canvas) {
6131
6131
  title: "Delete New Quiz",
6132
6132
  description: "Delete a New Quiz (LTI) from a Canvas course. This action is permanent. Use assignment_id (not quiz_id).",
6133
6133
  inputSchema: {
6134
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6135
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
6134
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6135
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
6136
6136
  },
6137
6137
  annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
6138
6138
  handler: async (params) => {
@@ -6147,8 +6147,8 @@ function newQuizTools(canvas) {
6147
6147
  title: "List New Quiz Items",
6148
6148
  description: "List all items (questions) in a New Quiz (LTI).",
6149
6149
  inputSchema: {
6150
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6151
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
6150
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6151
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz")
6152
6152
  },
6153
6153
  annotations: { readOnlyHint: true, openWorldHint: true },
6154
6154
  handler: async (params) => {
@@ -6162,8 +6162,8 @@ function newQuizTools(canvas) {
6162
6162
  title: "Get New Quiz Item",
6163
6163
  description: "Get a single item (question) from a New Quiz (LTI) by item ID.",
6164
6164
  inputSchema: {
6165
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6166
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6165
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6166
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6167
6167
  item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)")
6168
6168
  },
6169
6169
  annotations: { readOnlyHint: true, openWorldHint: true },
@@ -6179,8 +6179,8 @@ function newQuizTools(canvas) {
6179
6179
  title: "Create New Quiz Item",
6180
6180
  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
6181
  inputSchema: {
6182
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6183
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6182
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6183
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6184
6184
  points_possible: _zod.z.number().describe("Points awarded for a fully correct answer"),
6185
6185
  position: _zod.z.number().int().optional().describe("1-based position in the quiz; appended if omitted"),
6186
6186
  item: itemDiscriminatedUnion
@@ -6201,8 +6201,8 @@ function newQuizTools(canvas) {
6201
6201
  title: "Update New Quiz Item",
6202
6202
  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
6203
  inputSchema: {
6204
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6205
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6204
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6205
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6206
6206
  item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)"),
6207
6207
  points_possible: _zod.z.number().optional().describe("Updated point value"),
6208
6208
  position: _zod.z.number().int().optional().describe("Updated 1-based position"),
@@ -6225,8 +6225,8 @@ function newQuizTools(canvas) {
6225
6225
  title: "Delete New Quiz Item",
6226
6226
  description: "Delete an item (question) from a New Quiz (LTI). This action is permanent.",
6227
6227
  inputSchema: {
6228
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6229
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6228
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6229
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The assignment ID of the New Quiz"),
6230
6230
  item_id: _zod.z.string().describe("The New Quiz item ID (string, not numeric)")
6231
6231
  },
6232
6232
  annotations: { destructiveHint: true, idempotentHint: true, openWorldHint: true },
@@ -6259,7 +6259,7 @@ function rubricTools(canvas) {
6259
6259
  title: "List Rubrics",
6260
6260
  description: "List all rubrics in a course.",
6261
6261
  inputSchema: {
6262
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
6262
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
6263
6263
  },
6264
6264
  annotations: {
6265
6265
  readOnlyHint: true,
@@ -6275,8 +6275,8 @@ function rubricTools(canvas) {
6275
6275
  title: "Get Rubric",
6276
6276
  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
6277
  inputSchema: {
6278
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6279
- rubric_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID"),
6278
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6279
+ rubric_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID"),
6280
6280
  include: _zod.z.array(_zod.z.enum(RUBRIC_INCLUDE)).optional().describe(
6281
6281
  "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
6282
  )
@@ -6299,9 +6299,9 @@ function rubricTools(canvas) {
6299
6299
  title: "Get Rubric Assessment",
6300
6300
  description: "Get the rubric assessment for a specific student submission on an assignment.",
6301
6301
  inputSchema: {
6302
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6303
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6304
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
6302
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6303
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6304
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
6305
6305
  },
6306
6306
  annotations: {
6307
6307
  readOnlyHint: true,
@@ -6319,8 +6319,8 @@ function rubricTools(canvas) {
6319
6319
  title: "Submit Rubric Assessment",
6320
6320
  description: "Submit a rubric assessment with scores and comments for each criterion.",
6321
6321
  inputSchema: {
6322
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6323
- association_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The rubric association ID"),
6322
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6323
+ association_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The rubric association ID"),
6324
6324
  data: _zod.z.array(
6325
6325
  _zod.z.object({
6326
6326
  criterion_id: _zod.z.string().describe("The rubric criterion ID"),
@@ -6344,9 +6344,9 @@ function rubricTools(canvas) {
6344
6344
  {
6345
6345
  name: "create_rubric",
6346
6346
  title: "Create Rubric",
6347
- description: "Create a new rubric in a course with criteria and rating levels. Optionally link it to an assignment immediately.",
6347
+ 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
6348
  inputSchema: {
6349
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6349
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6350
6350
  title: _zod.z.string().describe("The rubric title"),
6351
6351
  criteria: _zod.z.array(
6352
6352
  _zod.z.object({
@@ -6361,7 +6361,7 @@ function rubricTools(canvas) {
6361
6361
  })
6362
6362
  ).min(1, "At least one criterion is required").describe("Rubric criteria"),
6363
6363
  association: _zod.z.object({
6364
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Assignment ID to link this rubric to"),
6364
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Assignment ID to link this rubric to"),
6365
6365
  use_for_grading: _zod.z.boolean().optional().describe("Whether to use this rubric for grading"),
6366
6366
  purpose: _zod.z.string().optional().describe('Purpose of the association (e.g., "grading")')
6367
6367
  }).optional().describe("Optional assignment association")
@@ -6385,9 +6385,9 @@ function rubricTools(canvas) {
6385
6385
  title: "Attach Rubric",
6386
6386
  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
6387
  inputSchema: {
6388
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6389
- rubric_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The ID of the existing rubric to attach"),
6390
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to attach the rubric to"),
6388
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6389
+ rubric_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The ID of the existing rubric to attach"),
6390
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID to attach the rubric to"),
6391
6391
  use_for_grading: _zod.z.boolean().optional().describe("Whether the rubric drives the assignment grade"),
6392
6392
  hide_score_total: _zod.z.boolean().optional().describe("Whether to hide the rubric score total from students"),
6393
6393
  purpose: _zod.z.string().optional().describe('Association purpose, e.g. "grading" (the default) or "bookmark"')
@@ -6413,8 +6413,8 @@ function rubricTools(canvas) {
6413
6413
  title: "Delete Rubric",
6414
6414
  description: "Permanently delete a rubric from a course, removing it from every assignment it is attached to. Returns the deleted rubric.",
6415
6415
  inputSchema: {
6416
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6417
- rubric_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID to delete")
6416
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6417
+ rubric_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas rubric ID to delete")
6418
6418
  },
6419
6419
  annotations: {
6420
6420
  destructiveHint: true,
@@ -6484,7 +6484,7 @@ function studentTools(canvas, pseudonymizer) {
6484
6484
  title: "Get My Grades",
6485
6485
  description: "Get grade data for the authenticated student. If course_id is omitted, returns grades across all enrolled courses.",
6486
6486
  inputSchema: {
6487
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID (omit for all courses)")
6487
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID (omit for all courses)")
6488
6488
  },
6489
6489
  annotations: {
6490
6490
  readOnlyHint: true,
@@ -6500,7 +6500,7 @@ function studentTools(canvas, pseudonymizer) {
6500
6500
  title: "Get My Submissions",
6501
6501
  description: "List all submissions for the authenticated student in a course.",
6502
6502
  inputSchema: {
6503
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
6503
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
6504
6504
  },
6505
6505
  annotations: {
6506
6506
  readOnlyHint: true,
@@ -6529,7 +6529,7 @@ function studentTools(canvas, pseudonymizer) {
6529
6529
  title: "Get My Submission Feedback",
6530
6530
  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
6531
  inputSchema: {
6532
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID. Omit to scan all of the student's active courses."),
6532
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("The Canvas course ID. Omit to scan all of the student's active courses."),
6533
6533
  unread_only: _zod.z.boolean().optional().describe(
6534
6534
  "Only include submissions the student hasn't opened yet (Canvas read_status). Defaults to false."
6535
6535
  )
@@ -6570,8 +6570,8 @@ function studentTools(canvas, pseudonymizer) {
6570
6570
  } else {
6571
6571
  coursesFailed.push({
6572
6572
  course_id: result.courseId,
6573
- status: result.err instanceof _chunkW7OMWOZHcjs.CanvasApiError ? result.err.status : null,
6574
- message: result.err instanceof _chunkW7OMWOZHcjs.CanvasApiError ? result.err.message : String(result.err)
6573
+ status: result.err instanceof _chunkWKYLHAWEcjs.CanvasApiError ? result.err.status : null,
6574
+ message: result.err instanceof _chunkWKYLHAWEcjs.CanvasApiError ? result.err.message : String(result.err)
6575
6575
  });
6576
6576
  }
6577
6577
  }
@@ -6841,7 +6841,7 @@ function studentSearchTools(canvas, pseudonymizer) {
6841
6841
  const coursesToScan = truncated ? sorted.slice(0, maxCourses) : sorted;
6842
6842
  const coursesFailed = [];
6843
6843
  const perCourseMatches = [];
6844
- const scanResults = await _chunkD2L5S2CLcjs.mapWithConcurrency.call(void 0,
6844
+ const scanResults = await _chunkBCKOQCPPcjs.mapWithConcurrency.call(void 0,
6845
6845
  coursesToScan,
6846
6846
  CONCURRENT_COURSE_LIMIT,
6847
6847
  async (course) => {
@@ -6864,8 +6864,8 @@ function studentSearchTools(canvas, pseudonymizer) {
6864
6864
  } else {
6865
6865
  coursesFailed.push({
6866
6866
  course_id: r.course.id,
6867
- status: r.err instanceof _chunkW7OMWOZHcjs.CanvasApiError ? r.err.status : null,
6868
- message: r.err instanceof _chunkW7OMWOZHcjs.CanvasApiError ? r.err.message : String(r.err)
6867
+ status: r.err instanceof _chunkWKYLHAWEcjs.CanvasApiError ? r.err.status : null,
6868
+ message: r.err instanceof _chunkWKYLHAWEcjs.CanvasApiError ? r.err.message : String(r.err)
6869
6869
  });
6870
6870
  }
6871
6871
  }
@@ -6943,18 +6943,18 @@ function submissionTools(canvas, pseudonymizer) {
6943
6943
  title: "List Submissions",
6944
6944
  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
6945
  inputSchema: {
6946
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6947
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6946
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6947
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6948
6948
  include: _zod.z.array(_zod.z.enum(SUBMISSION_LIST_INCLUDE)).optional().describe(
6949
6949
  'Extra fields to include (Canvas include[] param). Defaults to ["submission_comments"] when omitted.'
6950
6950
  ),
6951
- student_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { sentinels: ["all", "self"] }).optional().describe(
6951
+ student_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { sentinels: ["all", "self"] }).optional().describe(
6952
6952
  'Restrict to submissions for these user IDs (pass large IDs as strings). Use "all" or "self" for shortcuts.'
6953
6953
  ),
6954
- section_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to submissions in these sections"),
6954
+ section_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to submissions in these sections"),
6955
6955
  grouped: _zod.z.boolean().optional().describe("Return one submission per group rather than per student"),
6956
6956
  workflow_state: _zod.z.enum(SUBMISSION_WORKFLOW_STATE).optional().describe("Only include submissions in this workflow state"),
6957
- grading_period_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).optional().describe("Restrict to a grading period")
6957
+ grading_period_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).optional().describe("Restrict to a grading period")
6958
6958
  },
6959
6959
  annotations: {
6960
6960
  readOnlyHint: true,
@@ -6988,9 +6988,9 @@ function submissionTools(canvas, pseudonymizer) {
6988
6988
  title: "Get Submission",
6989
6989
  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
6990
  inputSchema: {
6991
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6992
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6993
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
6991
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
6992
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
6993
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
6994
6994
  include: _zod.z.array(_zod.z.enum(SUBMISSION_GET_INCLUDE)).optional().describe(
6995
6995
  'Extra fields to include (Canvas include[] param). Defaults to ["submission_comments"] when omitted.'
6996
6996
  )
@@ -7019,9 +7019,9 @@ function submissionTools(canvas, pseudonymizer) {
7019
7019
  title: "Grade Submission",
7020
7020
  description: "Post or update a grade for a submission. Requires grading permissions.",
7021
7021
  inputSchema: {
7022
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7023
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
7024
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
7022
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7023
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
7024
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
7025
7025
  grade: _zod.z.string().describe('The grade to assign (e.g. "95", "A", "pass")')
7026
7026
  },
7027
7027
  annotations: {
@@ -7042,9 +7042,9 @@ function submissionTools(canvas, pseudonymizer) {
7042
7042
  title: "Comment on Submission",
7043
7043
  description: "Add a text comment to a submission.",
7044
7044
  inputSchema: {
7045
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7046
- assignment_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
7047
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
7045
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7046
+ assignment_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas assignment ID"),
7047
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID"),
7048
7048
  comment: _zod.z.string().describe("The comment text to add")
7049
7049
  },
7050
7050
  annotations: {
@@ -7075,9 +7075,9 @@ function submissionFileTools(canvas, pseudonymizer) {
7075
7075
  title: "List Course Submission Files",
7076
7076
  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
7077
  inputSchema: {
7078
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID."),
7079
- assignment_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to these assignment IDs. Omit to scan all assignments."),
7080
- student_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
7078
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID."),
7079
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Restrict to these assignment IDs. Omit to scan all assignments."),
7080
+ student_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe(
7081
7081
  "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
7082
  ),
7083
7083
  workflow_state: _zod.z.enum(WORKFLOW_STATE).optional().describe("Only include submissions in this workflow state. Omit to include all states."),
@@ -7178,10 +7178,10 @@ function submissionsAwaitingGradingTools(canvas, pseudonymizer) {
7178
7178
  title: "List Submissions Awaiting Grading",
7179
7179
  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
7180
  inputSchema: {
7181
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe(
7181
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe(
7182
7182
  "Canvas course ID to scan for submissions awaiting grading."
7183
7183
  ),
7184
- assignment_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe(
7184
+ assignment_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe(
7185
7185
  "Limit the scan to these specific assignment IDs (numeric Canvas IDs). When omitted, all assignments in the course are scanned."
7186
7186
  ),
7187
7187
  include_quizzes: _zod.z.boolean().default(true).describe(
@@ -7335,7 +7335,7 @@ function userTools(canvas, pseudonymizer) {
7335
7335
  title: "List Students",
7336
7336
  description: "List all students enrolled in a course.",
7337
7337
  inputSchema: {
7338
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
7338
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID")
7339
7339
  },
7340
7340
  annotations: {
7341
7341
  readOnlyHint: true,
@@ -7353,7 +7353,7 @@ function userTools(canvas, pseudonymizer) {
7353
7353
  title: "Get User",
7354
7354
  description: "Get details for a single user by ID.",
7355
7355
  inputSchema: {
7356
- user_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
7356
+ user_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas user ID")
7357
7357
  },
7358
7358
  annotations: {
7359
7359
  readOnlyHint: true,
@@ -7384,7 +7384,7 @@ function userTools(canvas, pseudonymizer) {
7384
7384
  title: "Search Users",
7385
7385
  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
7386
  inputSchema: {
7387
- account_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
7387
+ account_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas account ID"),
7388
7388
  search_term: _zod.z.string().describe("The search term (name, login, or email)"),
7389
7389
  sort: _zod.z.enum(USER_SORT).optional().describe("Sort field"),
7390
7390
  order: _zod.z.enum(["asc", "desc"]).optional().describe("Sort order"),
@@ -7411,7 +7411,7 @@ function userTools(canvas, pseudonymizer) {
7411
7411
  title: "List Course Users",
7412
7412
  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
7413
  inputSchema: {
7414
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7414
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID"),
7415
7415
  enrollment_type: _zod.z.array(_zod.z.enum(COURSE_USER_ENROLLMENT_TYPE)).optional().describe("Filter by one or more enrollment types"),
7416
7416
  enrollment_state: _zod.z.array(_zod.z.enum(COURSE_USER_ENROLLMENT_STATE)).optional().describe("Filter by enrollment state (e.g. active, invited)"),
7417
7417
  include: _zod.z.array(_zod.z.enum(COURSE_USER_INCLUDE)).optional().describe("Extra fields to include on each user (Canvas include[] param)"),
@@ -7420,7 +7420,7 @@ function userTools(canvas, pseudonymizer) {
7420
7420
  // forbids an ID field that accepts arbitrary strings, so this narrows to the
7421
7421
  // canonical ID forms plus the one SIS prefix the rest of this repo documents
7422
7422
  // (`sis_user_id:`, as in outcomes.ts). Called out in the PR as a narrowing.
7423
- user_ids: _chunkD2L5S2CLcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
7423
+ user_ids: _chunkBCKOQCPPcjs.canvasIdList.call(void 0, { prefixes: ["sis_user_id"] }).optional().describe(
7424
7424
  '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
7425
  ),
7426
7426
  search_term: _zod.z.string().optional().describe("Partial name or full login/SIS ID to filter users by"),
@@ -7552,7 +7552,7 @@ async function scanQuizzes(canvas, courseId, warnings) {
7552
7552
  canvas.assignments.list(courseId)
7553
7553
  ]);
7554
7554
  const classicQuizzes = quizzes.filter((quiz) => CLASSIC_QUIZ_TYPES3.has(quiz.quiz_type));
7555
- const classicFindings = await _chunkD2L5S2CLcjs.mapWithConcurrency.call(void 0,
7555
+ const classicFindings = await _chunkBCKOQCPPcjs.mapWithConcurrency.call(void 0,
7556
7556
  classicQuizzes,
7557
7557
  QUIZ_SCAN_CONCURRENCY_LIMIT,
7558
7558
  async (quiz) => {
@@ -7578,7 +7578,7 @@ async function scanQuizzes(canvas, courseId, warnings) {
7578
7578
  }
7579
7579
  );
7580
7580
  const newQuizAssignments = assignments.filter((a) => a.is_quiz_lti_assignment === true);
7581
- const newQuizFindings = await _chunkD2L5S2CLcjs.mapWithConcurrency.call(void 0,
7581
+ const newQuizFindings = await _chunkBCKOQCPPcjs.mapWithConcurrency.call(void 0,
7582
7582
  newQuizAssignments,
7583
7583
  QUIZ_SCAN_CONCURRENCY_LIMIT,
7584
7584
  async (assignment) => {
@@ -7603,7 +7603,7 @@ function linkAuditTools(canvas) {
7603
7603
  title: "Audit Course Links",
7604
7604
  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
7605
  inputSchema: {
7606
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
7606
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
7607
7607
  include: _zod.z.array(_zod.z.enum(["pages", "assignments", "syllabus", "announcements", "quizzes"])).optional().describe(
7608
7608
  "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
7609
  )
@@ -7928,7 +7928,7 @@ async function scanQuizzesAccessibility(canvas, courseId, warnings) {
7928
7928
  canvas.assignments.list(courseId)
7929
7929
  ]);
7930
7930
  const classicQuizzes = quizzes.filter((quiz) => CLASSIC_QUIZ_TYPES4.has(quiz.quiz_type));
7931
- const classicFindings = await _chunkD2L5S2CLcjs.mapWithConcurrency.call(void 0,
7931
+ const classicFindings = await _chunkBCKOQCPPcjs.mapWithConcurrency.call(void 0,
7932
7932
  classicQuizzes,
7933
7933
  QUIZ_SCAN_CONCURRENCY_LIMIT2,
7934
7934
  async (quiz) => {
@@ -7953,7 +7953,7 @@ async function scanQuizzesAccessibility(canvas, courseId, warnings) {
7953
7953
  }
7954
7954
  );
7955
7955
  const newQuizAssignments = assignments.filter((a) => a.is_quiz_lti_assignment === true);
7956
- const newQuizFindings = await _chunkD2L5S2CLcjs.mapWithConcurrency.call(void 0,
7956
+ const newQuizFindings = await _chunkBCKOQCPPcjs.mapWithConcurrency.call(void 0,
7957
7957
  newQuizAssignments,
7958
7958
  QUIZ_SCAN_CONCURRENCY_LIMIT2,
7959
7959
  async (assignment) => {
@@ -7982,7 +7982,7 @@ function accessibilityAuditTools(canvas) {
7982
7982
  title: "Audit Course Accessibility",
7983
7983
  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
7984
  inputSchema: {
7985
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
7985
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("Canvas course ID"),
7986
7986
  include: _zod.z.array(_zod.z.enum(["pages", "assignments", "syllabus", "announcements", "quizzes"])).optional().describe(
7987
7987
  "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
7988
  )
@@ -8101,7 +8101,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8101
8101
  title: "Get Appointment Group",
8102
8102
  description: "Get a single appointment group by ID, including its time slots and participant counts.",
8103
8103
  inputSchema: {
8104
- appointment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8104
+ appointment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8105
8105
  include: includeSchema
8106
8106
  },
8107
8107
  annotations: { readOnlyHint: true, openWorldHint: true },
@@ -8154,7 +8154,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8154
8154
  title: "Update Appointment Group",
8155
8155
  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
8156
  inputSchema: {
8157
- appointment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8157
+ appointment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8158
8158
  title: _zod.z.string().optional().describe("New title"),
8159
8159
  description: _zod.z.string().optional().describe("New description"),
8160
8160
  location_name: _zod.z.string().optional().describe("Location name"),
@@ -8179,7 +8179,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8179
8179
  title: "Delete Appointment Group",
8180
8180
  description: "Delete an appointment group and cancel any existing reservations. Provide cancel_reason to notify participants.",
8181
8181
  inputSchema: {
8182
- appointment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8182
+ appointment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID"),
8183
8183
  cancel_reason: _zod.z.string().optional().describe("Message to include in cancellation notifications")
8184
8184
  },
8185
8185
  annotations: { destructiveHint: true, openWorldHint: true },
@@ -8193,7 +8193,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8193
8193
  title: "List Appointment Group Users",
8194
8194
  description: "List participants (users) who have reserved a slot in an appointment group.",
8195
8195
  inputSchema: {
8196
- appointment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
8196
+ appointment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
8197
8197
  },
8198
8198
  annotations: { readOnlyHint: true, openWorldHint: true },
8199
8199
  handler: async (params) => {
@@ -8212,7 +8212,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8212
8212
  title: "List Appointment Group Groups",
8213
8213
  description: "List student groups that have reserved a slot in an appointment group (when participant_type=Group).",
8214
8214
  inputSchema: {
8215
- appointment_group_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
8215
+ appointment_group_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The appointment group ID")
8216
8216
  },
8217
8217
  annotations: { readOnlyHint: true, openWorldHint: true },
8218
8218
  handler: async (params) => canvas.appointmentGroups.listGroups(params.appointment_group_id)
@@ -8222,7 +8222,7 @@ function appointmentGroupTools(canvas, pseudonymizer) {
8222
8222
  title: "Next Appointment",
8223
8223
  description: "Get the current user's next upcoming appointment across all (or specified) appointment groups.",
8224
8224
  inputSchema: {
8225
- appointment_group_ids: _zod.z.array(_chunkD2L5S2CLcjs.canvasIdInput.call(void 0, )).optional().describe("Limit to specific appointment group IDs")
8225
+ appointment_group_ids: _zod.z.array(_chunkBCKOQCPPcjs.canvasIdInput.call(void 0, )).optional().describe("Limit to specific appointment group IDs")
8226
8226
  },
8227
8227
  annotations: { readOnlyHint: true, openWorldHint: true },
8228
8228
  audience: "shared",
@@ -8459,7 +8459,7 @@ function pseudonymTools(pseudonymizer) {
8459
8459
  audience: "educator",
8460
8460
  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
8461
  inputSchema: {
8462
- course_id: _chunkD2L5S2CLcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID the pseudonym was assigned in"),
8462
+ course_id: _chunkBCKOQCPPcjs.canvasIdInput.call(void 0, ).describe("The Canvas course ID the pseudonym was assigned in"),
8463
8463
  pseudonym: _zod.z.string().describe('The pseudonym to resolve, e.g. "Student 7"')
8464
8464
  },
8465
8465
  annotations: {
@@ -8566,7 +8566,7 @@ function buildHandler(tool, pseudonymizer) {
8566
8566
  }
8567
8567
  return response;
8568
8568
  } catch (error) {
8569
- if (!(error instanceof _chunkW7OMWOZHcjs.CanvasApiError)) {
8569
+ if (!(error instanceof _chunkWKYLHAWEcjs.CanvasApiError)) {
8570
8570
  console.error(`Unexpected error in tool "${tool.name}":`, error);
8571
8571
  }
8572
8572
  return {
@@ -8629,7 +8629,7 @@ function registerSyllabusResource(server, canvas) {
8629
8629
  const rawCourseId = String(variables.courseId);
8630
8630
  let courseId;
8631
8631
  try {
8632
- courseId = _chunkD2L5S2CLcjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
8632
+ courseId = _chunkBCKOQCPPcjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
8633
8633
  } catch (e7) {
8634
8634
  return {
8635
8635
  contents: [
@@ -8657,7 +8657,7 @@ function registerSyllabusResource(server, canvas) {
8657
8657
  ]
8658
8658
  };
8659
8659
  } catch (error) {
8660
- if (!(error instanceof _chunkW7OMWOZHcjs.CanvasApiError)) {
8660
+ if (!(error instanceof _chunkWKYLHAWEcjs.CanvasApiError)) {
8661
8661
  console.error("Unexpected error in syllabus resource:", error);
8662
8662
  }
8663
8663
  return {
@@ -8696,8 +8696,8 @@ function registerAssignmentDescriptionResource(server, canvas) {
8696
8696
  let courseId;
8697
8697
  let assignmentId;
8698
8698
  try {
8699
- courseId = _chunkD2L5S2CLcjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
8700
- assignmentId = _chunkD2L5S2CLcjs.normalizeCanvasIdInput.call(void 0, rawAssignmentId);
8699
+ courseId = _chunkBCKOQCPPcjs.normalizeCanvasIdInput.call(void 0, rawCourseId);
8700
+ assignmentId = _chunkBCKOQCPPcjs.normalizeCanvasIdInput.call(void 0, rawAssignmentId);
8701
8701
  } catch (e8) {
8702
8702
  return {
8703
8703
  contents: [{ uri, mimeType: "text/plain", text: "Invalid course or assignment ID" }]
@@ -8716,7 +8716,7 @@ function registerAssignmentDescriptionResource(server, canvas) {
8716
8716
  ]
8717
8717
  };
8718
8718
  } catch (error) {
8719
- if (!(error instanceof _chunkW7OMWOZHcjs.CanvasApiError)) {
8719
+ if (!(error instanceof _chunkWKYLHAWEcjs.CanvasApiError)) {
8720
8720
  console.error("Unexpected error in assignment-description resource:", error);
8721
8721
  }
8722
8722
  return {
@@ -10116,14 +10116,14 @@ function resolvePseudonymizer(config) {
10116
10116
  });
10117
10117
  }
10118
10118
  function createCanvasMCPServer(config) {
10119
- const canvas = new (0, _chunkD2L5S2CLcjs.CanvasClient)({
10119
+ const canvas = new (0, _chunkBCKOQCPPcjs.CanvasClient)({
10120
10120
  token: config.token,
10121
10121
  baseUrl: config.baseUrl
10122
10122
  });
10123
10123
  const pseudonymizer = resolvePseudonymizer(config);
10124
10124
  const server = new (0, _mcpjs.McpServer)({
10125
10125
  name: "canvas-lms-mcp",
10126
- version: _chunkW7OMWOZHcjs.version
10126
+ version: _chunkWKYLHAWEcjs.version
10127
10127
  });
10128
10128
  const features = {
10129
10129
  assignmentSubmission: config.enableAssignmentSubmission,
@@ -10144,4 +10144,4 @@ function createCanvasMCPServer(config) {
10144
10144
 
10145
10145
 
10146
10146
  exports.Pseudonymizer = Pseudonymizer; exports.createSharedPseudonymizer = createSharedPseudonymizer; exports.createCanvasMCPServer = createCanvasMCPServer;
10147
- //# sourceMappingURL=chunk-ZL2O45GK.cjs.map
10147
+ //# sourceMappingURL=chunk-TRY2MYPG.cjs.map