@mtgibbs/canvas-lms-mcp 0.2.16 → 0.2.18

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.
Files changed (62) hide show
  1. package/README.md +32 -2
  2. package/esm/src/api/calendar.d.ts +16 -0
  3. package/esm/src/api/calendar.d.ts.map +1 -0
  4. package/esm/src/api/calendar.js +25 -0
  5. package/esm/src/api/courses.d.ts.map +1 -1
  6. package/esm/src/api/discussions.d.ts +15 -0
  7. package/esm/src/api/discussions.d.ts.map +1 -0
  8. package/esm/src/api/discussions.js +19 -0
  9. package/esm/src/api/observees.d.ts +13 -0
  10. package/esm/src/api/observees.d.ts.map +1 -0
  11. package/esm/src/api/observees.js +15 -0
  12. package/esm/src/api/people.d.ts +13 -0
  13. package/esm/src/api/people.d.ts.map +1 -0
  14. package/esm/src/api/people.js +19 -0
  15. package/esm/src/mcp/tools/get-all-students-status.d.ts +17 -0
  16. package/esm/src/mcp/tools/get-all-students-status.d.ts.map +1 -0
  17. package/esm/src/mcp/tools/get-all-students-status.js +30 -0
  18. package/esm/src/mcp/tools/get-calendar-events.d.ts +13 -0
  19. package/esm/src/mcp/tools/get-calendar-events.d.ts.map +1 -0
  20. package/esm/src/mcp/tools/get-calendar-events.js +38 -0
  21. package/esm/src/mcp/tools/get-discussions.d.ts +13 -0
  22. package/esm/src/mcp/tools/get-discussions.d.ts.map +1 -0
  23. package/esm/src/mcp/tools/get-discussions.js +38 -0
  24. package/esm/src/mcp/tools/get-feedback.d.ts +17 -0
  25. package/esm/src/mcp/tools/get-feedback.d.ts.map +1 -0
  26. package/esm/src/mcp/tools/get-feedback.js +30 -0
  27. package/esm/src/mcp/tools/get-people.d.ts +16 -0
  28. package/esm/src/mcp/tools/get-people.d.ts.map +1 -0
  29. package/esm/src/mcp/tools/get-people.js +28 -0
  30. package/esm/src/mcp/tools/get-students.d.ts +8 -0
  31. package/esm/src/mcp/tools/get-students.d.ts.map +1 -0
  32. package/esm/src/mcp/tools/get-students.js +17 -0
  33. package/esm/src/mcp/tools/index.d.ts +7 -1
  34. package/esm/src/mcp/tools/index.d.ts.map +1 -1
  35. package/esm/src/mcp/tools/index.js +13 -1
  36. package/esm/src/services/calendar.d.ts +16 -0
  37. package/esm/src/services/calendar.d.ts.map +1 -0
  38. package/esm/src/services/calendar.js +60 -0
  39. package/esm/src/services/discussions.d.ts +16 -0
  40. package/esm/src/services/discussions.d.ts.map +1 -0
  41. package/esm/src/services/discussions.js +75 -0
  42. package/esm/src/services/feedback.d.ts +22 -0
  43. package/esm/src/services/feedback.d.ts.map +1 -0
  44. package/esm/src/services/feedback.js +88 -0
  45. package/esm/src/services/index.d.ts +6 -0
  46. package/esm/src/services/index.d.ts.map +1 -1
  47. package/esm/src/services/index.js +6 -0
  48. package/esm/src/services/multi-student-status.d.ts +23 -0
  49. package/esm/src/services/multi-student-status.d.ts.map +1 -0
  50. package/esm/src/services/multi-student-status.js +38 -0
  51. package/esm/src/services/people.d.ts +22 -0
  52. package/esm/src/services/people.d.ts.map +1 -0
  53. package/esm/src/services/people.js +89 -0
  54. package/esm/src/services/students.d.ts +12 -0
  55. package/esm/src/services/students.d.ts.map +1 -0
  56. package/esm/src/services/students.js +19 -0
  57. package/esm/src/services/types.d.ts +59 -0
  58. package/esm/src/services/types.d.ts.map +1 -1
  59. package/esm/src/types/canvas.d.ts +31 -0
  60. package/esm/src/types/canvas.d.ts.map +1 -1
  61. package/manifest.json +1 -1
  62. package/package.json +1 -1
package/README.md CHANGED
@@ -297,6 +297,34 @@ Once connected, Claude has access to these capabilities:
297
297
  | `get_stats` | Late/missing statistics by course |
298
298
  | `get_todo` | Planner items and to-do list |
299
299
 
300
+ ### Grading Period Filtering
301
+
302
+ By default, all tools return data for the **current grading period only** (e.g., Semester 2). This
303
+ matches what parents see in the Canvas portal and prevents showing old assignments from previous
304
+ semesters.
305
+
306
+ **Affected tools:**
307
+
308
+ - `get_courses` - Grades are for the current grading period
309
+ - `get_missing_assignments` - Only shows missing work from the current period
310
+ - `get_unsubmitted_past_due` - Only shows unsubmitted work from the current period
311
+ - `get_comprehensive_status` - All data filtered to the current period
312
+
313
+ **To include all grading periods** (e.g., for a full-year view), use the `all_grading_periods`
314
+ parameter:
315
+
316
+ ```
317
+ "Show me all missing assignments including previous semesters"
318
+ → Claude will call get_missing_assignments with all_grading_periods: true
319
+ ```
320
+
321
+ For the CLI, use the `--all-grading-periods` flag:
322
+
323
+ ```bash
324
+ canvas missing --all-grading-periods
325
+ canvas unsubmitted --all-grading-periods
326
+ ```
327
+
300
328
  ---
301
329
 
302
330
  ## Standalone CLI
@@ -335,18 +363,20 @@ canvas courses --format table
335
363
  canvas status
336
364
  canvas status --format table
337
365
 
338
- # List missing assignments
366
+ # List missing assignments (current grading period by default)
339
367
  canvas missing
340
368
  canvas missing --summary # Counts by course
341
369
  canvas missing --include-unsubmitted # Include past-due not yet flagged
370
+ canvas missing --all-grading-periods # Include previous semesters
342
371
 
343
372
  # List assignments due soon
344
373
  canvas due --days 7
345
374
  canvas due --show-graded # Include already-graded items
346
375
 
347
- # List unsubmitted past-due assignments
376
+ # List unsubmitted past-due assignments (current grading period by default)
348
377
  canvas unsubmitted
349
378
  canvas unsubmitted --course-id 12345
379
+ canvas unsubmitted --all-grading-periods # Include previous semesters
350
380
 
351
381
  # List assignments with filters
352
382
  canvas assignments --all-courses --due-this-week
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Canvas Calendar Events API
3
+ */
4
+ import type { CalendarEvent } from "../types/canvas.js";
5
+ export interface ListCalendarEventsOptions {
6
+ type?: "event" | "assignment";
7
+ context_codes?: string[];
8
+ start_date?: string;
9
+ end_date?: string;
10
+ }
11
+ /**
12
+ * List calendar events
13
+ * Uses GET /api/v1/calendar_events
14
+ */
15
+ export declare function listCalendarEvents(options?: ListCalendarEventsOptions): Promise<CalendarEvent[]>;
16
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/src/api/calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB1B"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Canvas Calendar Events API
3
+ */
4
+ import { getClient } from "./client.js";
5
+ /**
6
+ * List calendar events
7
+ * Uses GET /api/v1/calendar_events
8
+ */
9
+ export function listCalendarEvents(options = {}) {
10
+ const client = getClient();
11
+ const params = {};
12
+ if (options.type) {
13
+ params.type = options.type;
14
+ }
15
+ if (options.context_codes) {
16
+ params.context_codes = options.context_codes;
17
+ }
18
+ if (options.start_date) {
19
+ params.start_date = options.start_date;
20
+ }
21
+ if (options.end_date) {
22
+ params.end_date = options.end_date;
23
+ }
24
+ return client.getAll("/calendar_events", params);
25
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"courses.d.ts","sourceRoot":"","sources":["../../../src/src/api/courses.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EAEb,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAWnF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA2B/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,GAAE,MAAM,GAAG,MAAe,GAC/B,OAAO,CAAC,CAAC,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAAC,CAgG7E"}
1
+ {"version":3,"file":"courses.d.ts","sourceRoot":"","sources":["../../../src/src/api/courses.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,aAAa,EAEb,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB3E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAWnF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA2B/B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,GACtB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAO5B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,GAAE,MAAM,GAAG,MAAe,GAC/B,OAAO,CAAC,CAAC,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAAC,CAkG7E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Canvas Discussion Topics API
3
+ */
4
+ import type { DiscussionTopic } from "../types/canvas.js";
5
+ export interface ListDiscussionTopicsOptions {
6
+ course_id: number;
7
+ order_by?: "position" | "recent_activity" | "title";
8
+ per_page?: number;
9
+ }
10
+ /**
11
+ * List discussion topics for a course
12
+ * Uses GET /api/v1/courses/:course_id/discussion_topics
13
+ */
14
+ export declare function listDiscussionTopics(options: ListDiscussionTopicsOptions): Promise<DiscussionTopic[]>;
15
+ //# sourceMappingURL=discussions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discussions.d.ts","sourceRoot":"","sources":["../../../src/src/api/discussions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,GAAG,iBAAiB,GAAG,OAAO,CAAC;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,eAAe,EAAE,CAAC,CAgB5B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Canvas Discussion Topics API
3
+ */
4
+ import { getClient } from "./client.js";
5
+ /**
6
+ * List discussion topics for a course
7
+ * Uses GET /api/v1/courses/:course_id/discussion_topics
8
+ */
9
+ export function listDiscussionTopics(options) {
10
+ const client = getClient();
11
+ const params = {};
12
+ if (options.order_by) {
13
+ params.order_by = options.order_by;
14
+ }
15
+ if (options.per_page) {
16
+ params.per_page = options.per_page;
17
+ }
18
+ return client.getAll(`/courses/${options.course_id}/discussion_topics`, params);
19
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Canvas Observees API
3
+ * For observer/parent accounts to list students they're observing
4
+ */
5
+ import type { User } from "../types/canvas.js";
6
+ /**
7
+ * List students being observed by the current user (parent/observer account)
8
+ * Uses GET /api/v1/users/self/observees
9
+ *
10
+ * @returns Array of User objects for each observed student
11
+ */
12
+ export declare function listObservees(): Promise<User[]>;
13
+ //# sourceMappingURL=observees.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observees.d.ts","sourceRoot":"","sources":["../../../src/src/api/observees.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAG/C"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Canvas Observees API
3
+ * For observer/parent accounts to list students they're observing
4
+ */
5
+ import { getClient } from "./client.js";
6
+ /**
7
+ * List students being observed by the current user (parent/observer account)
8
+ * Uses GET /api/v1/users/self/observees
9
+ *
10
+ * @returns Array of User objects for each observed student
11
+ */
12
+ export function listObservees() {
13
+ const client = getClient();
14
+ return client.getAll("/users/self/observees");
15
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Canvas People API
3
+ * Get teachers and TAs for courses
4
+ */
5
+ import type { User } from "../types/canvas.js";
6
+ /**
7
+ * List users (teachers/TAs) in a course
8
+ * @param courseId - The course ID
9
+ * @param enrollmentTypes - Array of enrollment types to filter (e.g., ["teacher", "ta"])
10
+ * @returns Array of users with their enrollment information
11
+ */
12
+ export declare function listCourseUsers(courseId: number, enrollmentTypes?: string[]): Promise<User[]>;
13
+ //# sourceMappingURL=people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"people.d.ts","sourceRoot":"","sources":["../../../src/src/api/people.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,eAAe,GAAE,MAAM,EAAsB,GAC5C,OAAO,CAAC,IAAI,EAAE,CAAC,CASjB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Canvas People API
3
+ * Get teachers and TAs for courses
4
+ */
5
+ import { getClient } from "./client.js";
6
+ /**
7
+ * List users (teachers/TAs) in a course
8
+ * @param courseId - The course ID
9
+ * @param enrollmentTypes - Array of enrollment types to filter (e.g., ["teacher", "ta"])
10
+ * @returns Array of users with their enrollment information
11
+ */
12
+ export function listCourseUsers(courseId, enrollmentTypes = ["teacher", "ta"]) {
13
+ const client = getClient();
14
+ const params = {
15
+ enrollment_type: enrollmentTypes,
16
+ include: ["email", "enrollments"],
17
+ };
18
+ return client.getAll(`/courses/${courseId}/users`, params);
19
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Tool: get_all_students_status
3
+ *
4
+ * Returns comprehensive status for ALL observed students in a single call.
5
+ * Each student's data is clearly labeled to prevent mix-ups.
6
+ *
7
+ * CLI equivalent: `canvas status --all-students`
8
+ */
9
+ import { z } from "zod";
10
+ import { type ToolDefinition } from "../types.js";
11
+ export declare const schema: {
12
+ days_upcoming: z.ZodOptional<z.ZodNumber>;
13
+ days_grades: z.ZodOptional<z.ZodNumber>;
14
+ low_grade_threshold: z.ZodOptional<z.ZodNumber>;
15
+ };
16
+ export declare const getAllStudentsStatusTool: ToolDefinition<typeof schema>;
17
+ //# sourceMappingURL=get-all-students-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-all-students-status.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-all-students-status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM;;;;CAUlB,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,OAAO,MAAM,CAelE,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * MCP Tool: get_all_students_status
3
+ *
4
+ * Returns comprehensive status for ALL observed students in a single call.
5
+ * Each student's data is clearly labeled to prevent mix-ups.
6
+ *
7
+ * CLI equivalent: `canvas status --all-students`
8
+ */
9
+ import { z } from "zod";
10
+ import { getAllStudentsStatus } from "../../services/index.js";
11
+ import { jsonResponse } from "../types.js";
12
+ export const schema = {
13
+ days_upcoming: z.number().optional().describe("Days to look ahead for upcoming assignments (default: 7)"),
14
+ days_grades: z.number().optional().describe("Days to look back for recent grades (default: 7)"),
15
+ low_grade_threshold: z.number().optional().describe("Percentage threshold for flagging low grades (default: 70)"),
16
+ };
17
+ export const getAllStudentsStatusTool = {
18
+ name: "get_all_students_status",
19
+ description: "Get comprehensive academic status for ALL observed students in a single call. Use this tool when the user asks about ALL their students or wants a combined overview. Each student's data is clearly separated and labeled (student_name, student_id, status). NEVER mix data between students when presenting results. Returns an array of objects, each containing: student_name (string), student_id (number), and status (ComprehensiveStatus with courses, grades, missing work, upcoming assignments, recent low grades, and recent announcements).",
20
+ schema,
21
+ annotations: { readOnlyHint: true, openWorldHint: true },
22
+ handler: async ({ days_upcoming, days_grades, low_grade_threshold }) => {
23
+ const result = await getAllStudentsStatus({
24
+ daysUpcoming: days_upcoming,
25
+ daysGrades: days_grades,
26
+ lowGradeThreshold: low_grade_threshold,
27
+ });
28
+ return jsonResponse(result);
29
+ },
30
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tool: get_calendar_events
3
+ * Get non-assignment calendar events (office hours, review sessions, school events, field trips)
4
+ */
5
+ import { z } from "zod";
6
+ import { type ToolDefinition } from "../types.js";
7
+ export declare const schema: {
8
+ student_id: z.ZodOptional<z.ZodString>;
9
+ days: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ course_id: z.ZodOptional<z.ZodNumber>;
11
+ };
12
+ export declare const getCalendarEventsTool: ToolDefinition<typeof schema>;
13
+ //# sourceMappingURL=get-calendar-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-calendar-events.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-calendar-events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM;;;;CAgBlB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,OAAO,MAAM,CAiB/D,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Tool: get_calendar_events
3
+ * Get non-assignment calendar events (office hours, review sessions, school events, field trips)
4
+ */
5
+ import { z } from "zod";
6
+ import { getCalendarEvents } from "../../services/index.js";
7
+ import { getEffectiveStudentId } from "../../api/users.js";
8
+ import { jsonResponse } from "../types.js";
9
+ export const schema = {
10
+ student_id: z
11
+ .string()
12
+ .optional()
13
+ .describe("Student ID (uses configured CANVAS_STUDENT_ID if not provided)"),
14
+ days: z
15
+ .number()
16
+ .optional()
17
+ .default(14)
18
+ .describe("Number of days to look ahead for calendar events (default: 14)"),
19
+ course_id: z
20
+ .number()
21
+ .optional()
22
+ .describe("Filter to a specific course ID. Use 'get_courses' to find this ID from a course name."),
23
+ };
24
+ export const getCalendarEventsTool = {
25
+ name: "get_calendar_events",
26
+ description: "Get upcoming non-assignment calendar events like office hours, review sessions, school events, field trips, assemblies, and other scheduled events. This returns only calendar events, NOT assignment due dates (use get_due_this_week or get_upcoming_assignments for assignments). Events include titles, descriptions, start/end times, and location information. Useful for seeing what's happening on campus beyond coursework deadlines.",
27
+ schema,
28
+ annotations: { readOnlyHint: true, openWorldHint: true },
29
+ handler: async ({ student_id, days, course_id }) => {
30
+ const effectiveStudentId = await getEffectiveStudentId(student_id);
31
+ const items = await getCalendarEvents({
32
+ studentId: String(effectiveStudentId),
33
+ days,
34
+ courseId: course_id,
35
+ });
36
+ return jsonResponse(items);
37
+ },
38
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tool: get_discussions
3
+ * Get discussion topics across courses with participation status
4
+ */
5
+ import { z } from "zod";
6
+ import { type ToolDefinition } from "../types.js";
7
+ export declare const schema: {
8
+ student_id: z.ZodOptional<z.ZodString>;
9
+ days: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ course_id: z.ZodOptional<z.ZodNumber>;
11
+ };
12
+ export declare const getDiscussionsTool: ToolDefinition<typeof schema>;
13
+ //# sourceMappingURL=get-discussions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-discussions.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-discussions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM;;;;CAkBlB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAAc,CAAC,OAAO,MAAM,CAiB5D,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Tool: get_discussions
3
+ * Get discussion topics across courses with participation status
4
+ */
5
+ import { z } from "zod";
6
+ import { getDiscussions } from "../../services/index.js";
7
+ import { getEffectiveStudentId } from "../../api/users.js";
8
+ import { jsonResponse } from "../types.js";
9
+ export const schema = {
10
+ student_id: z
11
+ .string()
12
+ .optional()
13
+ .describe("Student ID (uses configured CANVAS_STUDENT_ID if not provided)"),
14
+ days: z
15
+ .number()
16
+ .optional()
17
+ .default(30)
18
+ .describe("Number of days to look back for discussion topics (default: 30). Filters by posted_at or last_reply_at."),
19
+ course_id: z
20
+ .number()
21
+ .optional()
22
+ .describe("Filter to a specific course ID. Use 'get_courses' to find this ID from a course name."),
23
+ };
24
+ export const getDiscussionsTool = {
25
+ name: "get_discussions",
26
+ description: "Get discussion topics across courses with participation information. Shows discussion title, course, type (threaded or side_comment), number of replies, unread count, whether the discussion is graded (associated with an assignment), whether it requires an initial post, and the posted date. Useful for understanding class discussion activity, identifying unanswered discussions, and tracking participation requirements. Ordered by most recent activity (last reply or post date).",
27
+ schema,
28
+ annotations: { readOnlyHint: true, openWorldHint: true },
29
+ handler: async ({ student_id, days, course_id }) => {
30
+ const effectiveStudentId = await getEffectiveStudentId(student_id);
31
+ const items = await getDiscussions({
32
+ studentId: String(effectiveStudentId),
33
+ days,
34
+ courseId: course_id,
35
+ });
36
+ return jsonResponse(items);
37
+ },
38
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Tool: get_feedback
3
+ *
4
+ * Shows teacher comments and feedback on student submissions.
5
+ * Critical for parents who want to see what teachers are saying about their child's work.
6
+ *
7
+ * CLI equivalent: `canvas feedback`
8
+ */
9
+ import { z } from "zod";
10
+ import { type ToolDefinition } from "../types.js";
11
+ export declare const schema: {
12
+ student_id: z.ZodString;
13
+ course_id: z.ZodOptional<z.ZodNumber>;
14
+ days: z.ZodOptional<z.ZodNumber>;
15
+ };
16
+ export declare const getFeedbackTool: ToolDefinition<typeof schema>;
17
+ //# sourceMappingURL=get-feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feedback.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-feedback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM;;;;CAUlB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,MAAM,CAezD,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * MCP Tool: get_feedback
3
+ *
4
+ * Shows teacher comments and feedback on student submissions.
5
+ * Critical for parents who want to see what teachers are saying about their child's work.
6
+ *
7
+ * CLI equivalent: `canvas feedback`
8
+ */
9
+ import { z } from "zod";
10
+ import { getFeedback } from "../../services/index.js";
11
+ import { jsonResponse } from "../types.js";
12
+ export const schema = {
13
+ student_id: z.string().describe("Student ID (use 'self' for current user, or numeric ID from get_students tool)"),
14
+ course_id: z.number().optional().describe("Filter to specific course (omit to fetch from all active courses)"),
15
+ days: z.number().optional().describe("Look back N days for comments (default: 14)"),
16
+ };
17
+ export const getFeedbackTool = {
18
+ name: "get_feedback",
19
+ description: "Get teacher comments and feedback on student submissions. Shows what teachers and TAs are saying about the student's work. Returns a list of feedback items sorted by most recent comment first, each with: assignment_name, course_name, comment_text (the teacher's comment), author_name (who commented), comment_date, student_score, points_possible, grade, and assignment URL. Use this to see detailed feedback on assignments, especially when parents want to understand teacher comments or concerns about specific work.",
20
+ schema,
21
+ annotations: { readOnlyHint: true, openWorldHint: true },
22
+ handler: async ({ student_id, course_id, days }) => {
23
+ const result = await getFeedback({
24
+ studentId: student_id,
25
+ courseId: course_id,
26
+ days: days,
27
+ });
28
+ return jsonResponse(result);
29
+ },
30
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Tool: get_people
3
+ *
4
+ * Shows teachers and teaching assistants for courses.
5
+ * Helps parents know who teaches each course and how to contact them.
6
+ *
7
+ * CLI equivalent: `canvas people`
8
+ */
9
+ import { z } from "zod";
10
+ import { type ToolDefinition } from "../types.js";
11
+ export declare const schema: {
12
+ student_id: z.ZodOptional<z.ZodString>;
13
+ course_id: z.ZodOptional<z.ZodNumber>;
14
+ };
15
+ export declare const getPeopleTool: ToolDefinition<typeof schema>;
16
+ //# sourceMappingURL=get-people.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-people.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-people.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM;;;CAOlB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,cAAc,CAAC,OAAO,MAAM,CAcvD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * MCP Tool: get_people
3
+ *
4
+ * Shows teachers and teaching assistants for courses.
5
+ * Helps parents know who teaches each course and how to contact them.
6
+ *
7
+ * CLI equivalent: `canvas people`
8
+ */
9
+ import { z } from "zod";
10
+ import { getPeople } from "../../services/index.js";
11
+ import { jsonResponse } from "../types.js";
12
+ export const schema = {
13
+ student_id: z.string().optional().describe("Student ID (use 'self' for current user, or numeric ID from get_students tool). For observer accounts to get courses."),
14
+ course_id: z.number().optional().describe("Filter to specific course (omit to fetch from all active courses)"),
15
+ };
16
+ export const getPeopleTool = {
17
+ name: "get_people",
18
+ description: "Get teachers and teaching assistants for courses. Returns a list of people with: name, role (Teacher or TA), email (if available), and an array of courses they teach. When fetching across all courses, people who teach multiple courses are deduplicated and listed once with all their courses. Use this to help parents know who teaches each course and how to contact them. Sorted alphabetically by name.",
19
+ schema,
20
+ annotations: { readOnlyHint: true, openWorldHint: true },
21
+ handler: async ({ student_id, course_id }) => {
22
+ const result = await getPeople({
23
+ studentId: student_id,
24
+ courseId: course_id,
25
+ });
26
+ return jsonResponse(result);
27
+ },
28
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tool: get_students
3
+ * List students being observed by the current user (parent/observer account)
4
+ */
5
+ import { type ToolDefinition } from "../types.js";
6
+ export declare const schema: {};
7
+ export declare const getStudentsTool: ToolDefinition<typeof schema>;
8
+ //# sourceMappingURL=get-students.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-students.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/get-students.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,eAAO,MAAM,MAAM,IAAK,CAAC;AAEzB,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,MAAM,CAUzD,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tool: get_students
3
+ * List students being observed by the current user (parent/observer account)
4
+ */
5
+ import { getObservedStudents } from "../../services/index.js";
6
+ import { jsonResponse } from "../types.js";
7
+ export const schema = {};
8
+ export const getStudentsTool = {
9
+ name: "get_students",
10
+ description: "List all students being observed by the current user (for parent/observer accounts). Returns the student's ID, name, short_name, and sortable_name for each observed student. CRITICAL: Call this tool FIRST when the user mentions a student by name (e.g., 'Ronin', 'Rory'). Use the returned student_id in subsequent tool calls (get_courses, get_missing_assignments, etc.). NEVER guess a student_id - always call this tool to map student names to Canvas student IDs.",
11
+ schema,
12
+ annotations: { readOnlyHint: true, openWorldHint: true },
13
+ handler: async () => {
14
+ const students = await getObservedStudents();
15
+ return jsonResponse(students);
16
+ },
17
+ };
@@ -14,10 +14,16 @@ import { getComprehensiveStatusTool } from "./get-comprehensive-status.js";
14
14
  import { getAnnouncementsTool } from "./get-announcements.js";
15
15
  import { getInboxTool } from "./get-inbox.js";
16
16
  import { getTeacherCommunicationsTool } from "./get-teacher-communications.js";
17
+ import { getStudentsTool } from "./get-students.js";
18
+ import { getCalendarEventsTool } from "./get-calendar-events.js";
19
+ import { getAllStudentsStatusTool } from "./get-all-students-status.js";
20
+ import { getFeedbackTool } from "./get-feedback.js";
21
+ import { getPeopleTool } from "./get-people.js";
22
+ import { getDiscussionsTool } from "./get-discussions.js";
17
23
  import type { AnyToolDefinition } from "../types.js";
18
24
  /**
19
25
  * All available MCP tools
20
26
  */
21
27
  export declare const tools: AnyToolDefinition[];
22
- export { getAnnouncementsTool, getComprehensiveStatusTool, getCoursesTool, getDueThisWeekTool, getInboxTool, getMissingAssignmentsTool, getRecentGradesTool, getStatsTool, getTeacherCommunicationsTool, getTodoTool, getUnsubmittedPastDueTool, getUpcomingAssignmentsTool, listAssignmentsTool, };
28
+ export { getAllStudentsStatusTool, getAnnouncementsTool, getCalendarEventsTool, getComprehensiveStatusTool, getCoursesTool, getDiscussionsTool, getDueThisWeekTool, getFeedbackTool, getInboxTool, getMissingAssignmentsTool, getPeopleTool, getRecentGradesTool, getStatsTool, getStudentsTool, getTeacherCommunicationsTool, getTodoTool, getUnsubmittedPastDueTool, getUpcomingAssignmentsTool, listAssignmentsTool, };
23
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,iBAAiB,EAcpC,CAAC;AAGF,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,mBAAmB,EACnB,YAAY,EACZ,4BAA4B,EAC5B,WAAW,EACX,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,GACpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/mcp/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,iBAAiB,EAoBpC,CAAC;AAGF,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,yBAAyB,EACzB,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,4BAA4B,EAC5B,WAAW,EACX,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,GACpB,CAAC"}
@@ -14,6 +14,12 @@ import { getComprehensiveStatusTool } from "./get-comprehensive-status.js";
14
14
  import { getAnnouncementsTool } from "./get-announcements.js";
15
15
  import { getInboxTool } from "./get-inbox.js";
16
16
  import { getTeacherCommunicationsTool } from "./get-teacher-communications.js";
17
+ import { getStudentsTool } from "./get-students.js";
18
+ import { getCalendarEventsTool } from "./get-calendar-events.js";
19
+ import { getAllStudentsStatusTool } from "./get-all-students-status.js";
20
+ import { getFeedbackTool } from "./get-feedback.js";
21
+ import { getPeopleTool } from "./get-people.js";
22
+ import { getDiscussionsTool } from "./get-discussions.js";
17
23
  /**
18
24
  * All available MCP tools
19
25
  */
@@ -31,6 +37,12 @@ export const tools = [
31
37
  getAnnouncementsTool,
32
38
  getInboxTool,
33
39
  getTeacherCommunicationsTool,
40
+ getStudentsTool,
41
+ getCalendarEventsTool,
42
+ getAllStudentsStatusTool,
43
+ getFeedbackTool,
44
+ getPeopleTool,
45
+ getDiscussionsTool,
34
46
  ];
35
47
  // Re-export individual tools for direct access if needed
36
- export { getAnnouncementsTool, getComprehensiveStatusTool, getCoursesTool, getDueThisWeekTool, getInboxTool, getMissingAssignmentsTool, getRecentGradesTool, getStatsTool, getTeacherCommunicationsTool, getTodoTool, getUnsubmittedPastDueTool, getUpcomingAssignmentsTool, listAssignmentsTool, };
48
+ export { getAllStudentsStatusTool, getAnnouncementsTool, getCalendarEventsTool, getComprehensiveStatusTool, getCoursesTool, getDiscussionsTool, getDueThisWeekTool, getFeedbackTool, getInboxTool, getMissingAssignmentsTool, getPeopleTool, getRecentGradesTool, getStatsTool, getStudentsTool, getTeacherCommunicationsTool, getTodoTool, getUnsubmittedPastDueTool, getUpcomingAssignmentsTool, listAssignmentsTool, };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Calendar Events Service
3
+ * Get non-assignment calendar events (office hours, review sessions, school events, field trips)
4
+ *
5
+ * Used by:
6
+ * - CLI: `canvas calendar`
7
+ * - MCP: `get_calendar_events`
8
+ */
9
+ import type { CalendarEventItem } from "./types.js";
10
+ export interface GetCalendarEventsOptions {
11
+ studentId?: string;
12
+ courseId?: number;
13
+ days?: number;
14
+ }
15
+ export declare function getCalendarEvents(options?: GetCalendarEventsOptions): Promise<CalendarEventItem[]>;
16
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../../src/src/services/calendar.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0D9B"}