@mtgibbs/canvas-lms-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +539 -0
  3. package/esm/_dnt.shims.d.ts +6 -0
  4. package/esm/_dnt.shims.d.ts.map +1 -0
  5. package/esm/_dnt.shims.js +61 -0
  6. package/esm/agent.d.ts +10 -0
  7. package/esm/agent.d.ts.map +1 -0
  8. package/esm/agent.js +17 -0
  9. package/esm/cli.js +6 -0
  10. package/esm/package.json +3 -0
  11. package/esm/src/api/assignments.d.ts +40 -0
  12. package/esm/src/api/assignments.d.ts.map +1 -0
  13. package/esm/src/api/assignments.js +133 -0
  14. package/esm/src/api/client.d.ts +61 -0
  15. package/esm/src/api/client.d.ts.map +1 -0
  16. package/esm/src/api/client.js +179 -0
  17. package/esm/src/api/courses.d.ts +32 -0
  18. package/esm/src/api/courses.d.ts.map +1 -0
  19. package/esm/src/api/courses.js +85 -0
  20. package/esm/src/api/stats.d.ts +15 -0
  21. package/esm/src/api/stats.d.ts.map +1 -0
  22. package/esm/src/api/stats.js +58 -0
  23. package/esm/src/api/submissions.d.ts +33 -0
  24. package/esm/src/api/submissions.d.ts.map +1 -0
  25. package/esm/src/api/submissions.js +103 -0
  26. package/esm/src/api/users.d.ts +87 -0
  27. package/esm/src/api/users.d.ts.map +1 -0
  28. package/esm/src/api/users.js +139 -0
  29. package/esm/src/mcp/prompts/course-analysis.d.ts +7 -0
  30. package/esm/src/mcp/prompts/course-analysis.d.ts.map +1 -0
  31. package/esm/src/mcp/prompts/course-analysis.js +36 -0
  32. package/esm/src/mcp/prompts/daily-checkin.d.ts +7 -0
  33. package/esm/src/mcp/prompts/daily-checkin.d.ts.map +1 -0
  34. package/esm/src/mcp/prompts/daily-checkin.js +31 -0
  35. package/esm/src/mcp/prompts/grade-recovery.d.ts +7 -0
  36. package/esm/src/mcp/prompts/grade-recovery.d.ts.map +1 -0
  37. package/esm/src/mcp/prompts/grade-recovery.js +35 -0
  38. package/esm/src/mcp/prompts/index.d.ts +15 -0
  39. package/esm/src/mcp/prompts/index.d.ts.map +1 -0
  40. package/esm/src/mcp/prompts/index.js +20 -0
  41. package/esm/src/mcp/prompts/missing-work-audit.d.ts +7 -0
  42. package/esm/src/mcp/prompts/missing-work-audit.d.ts.map +1 -0
  43. package/esm/src/mcp/prompts/missing-work-audit.js +36 -0
  44. package/esm/src/mcp/prompts/week-planning.d.ts +7 -0
  45. package/esm/src/mcp/prompts/week-planning.d.ts.map +1 -0
  46. package/esm/src/mcp/prompts/week-planning.js +34 -0
  47. package/esm/src/mcp/server.d.ts +15 -0
  48. package/esm/src/mcp/server.d.ts.map +1 -0
  49. package/esm/src/mcp/server.js +51 -0
  50. package/esm/src/mcp/tools/get-courses.d.ts +11 -0
  51. package/esm/src/mcp/tools/get-courses.d.ts.map +1 -0
  52. package/esm/src/mcp/tools/get-courses.js +29 -0
  53. package/esm/src/mcp/tools/get-due-this-week.d.ts +13 -0
  54. package/esm/src/mcp/tools/get-due-this-week.d.ts.map +1 -0
  55. package/esm/src/mcp/tools/get-due-this-week.js +75 -0
  56. package/esm/src/mcp/tools/get-missing-assignments.d.ts +12 -0
  57. package/esm/src/mcp/tools/get-missing-assignments.d.ts.map +1 -0
  58. package/esm/src/mcp/tools/get-missing-assignments.js +33 -0
  59. package/esm/src/mcp/tools/get-stats.d.ts +12 -0
  60. package/esm/src/mcp/tools/get-stats.d.ts.map +1 -0
  61. package/esm/src/mcp/tools/get-stats.js +28 -0
  62. package/esm/src/mcp/tools/get-todo.d.ts +13 -0
  63. package/esm/src/mcp/tools/get-todo.d.ts.map +1 -0
  64. package/esm/src/mcp/tools/get-todo.js +55 -0
  65. package/esm/src/mcp/tools/get-unsubmitted-past-due.d.ts +12 -0
  66. package/esm/src/mcp/tools/get-unsubmitted-past-due.d.ts.map +1 -0
  67. package/esm/src/mcp/tools/get-unsubmitted-past-due.js +64 -0
  68. package/esm/src/mcp/tools/get-upcoming-assignments.d.ts +12 -0
  69. package/esm/src/mcp/tools/get-upcoming-assignments.d.ts.map +1 -0
  70. package/esm/src/mcp/tools/get-upcoming-assignments.js +29 -0
  71. package/esm/src/mcp/tools/index.d.ts +18 -0
  72. package/esm/src/mcp/tools/index.d.ts.map +1 -0
  73. package/esm/src/mcp/tools/index.js +26 -0
  74. package/esm/src/mcp/tools/list-assignments.d.ts +13 -0
  75. package/esm/src/mcp/tools/list-assignments.d.ts.map +1 -0
  76. package/esm/src/mcp/tools/list-assignments.js +40 -0
  77. package/esm/src/mcp/types.d.ts +83 -0
  78. package/esm/src/mcp/types.d.ts.map +1 -0
  79. package/esm/src/mcp/types.js +20 -0
  80. package/esm/src/types/canvas.d.ts +288 -0
  81. package/esm/src/types/canvas.d.ts.map +1 -0
  82. package/esm/src/types/canvas.js +5 -0
  83. package/esm/src/utils/config.d.ts +19 -0
  84. package/esm/src/utils/config.d.ts.map +1 -0
  85. package/esm/src/utils/config.js +54 -0
  86. package/esm/src/utils/init.d.ts +9 -0
  87. package/esm/src/utils/init.d.ts.map +1 -0
  88. package/esm/src/utils/init.js +20 -0
  89. package/manifest.json +91 -0
  90. package/package.json +49 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Type definitions for MCP tools and prompts
3
+ */
4
+ import type { z } from "zod";
5
+ /**
6
+ * Tool annotations for MCP protocol
7
+ * These hints describe tool behavior for safety and UI purposes
8
+ */
9
+ export interface ToolAnnotations {
10
+ /** If true, the tool does not modify its environment (read-only operation) */
11
+ readOnlyHint?: boolean;
12
+ /** If true, the tool may perform destructive updates */
13
+ destructiveHint?: boolean;
14
+ /** If true, repeated calls with same args have no additional effect */
15
+ idempotentHint?: boolean;
16
+ /** If true, tool interacts with external entities */
17
+ openWorldHint?: boolean;
18
+ }
19
+ /**
20
+ * Tool definition that can be registered with the MCP server
21
+ *
22
+ * Use the generic version for type-safe tool definitions.
23
+ * The non-generic version is used for collections of tools with different schemas.
24
+ */
25
+ export interface ToolDefinition<T extends z.ZodRawShape = z.ZodRawShape> {
26
+ name: string;
27
+ description: string;
28
+ schema: T;
29
+ annotations?: ToolAnnotations;
30
+ handler: (args: z.infer<z.ZodObject<T>>) => Promise<ToolResponse>;
31
+ }
32
+ export type AnyToolDefinition = ToolDefinition<any>;
33
+ /**
34
+ * Standard tool response format
35
+ */
36
+ export interface ToolResponse {
37
+ content: Array<{
38
+ type: "text" | "image" | "resource";
39
+ text?: string;
40
+ data?: string;
41
+ mimeType?: string;
42
+ uri?: string;
43
+ }>;
44
+ isError?: boolean;
45
+ }
46
+ /**
47
+ * Prompt argument definition
48
+ */
49
+ export interface PromptArgument {
50
+ name: string;
51
+ description?: string;
52
+ required?: boolean;
53
+ }
54
+ /**
55
+ * Prompt definition that can be registered with the MCP server
56
+ */
57
+ export interface PromptDefinition {
58
+ name: string;
59
+ description: string;
60
+ arguments: PromptArgument[];
61
+ handler: (args: Record<string, string | undefined>) => PromptResponse;
62
+ }
63
+ /**
64
+ * Standard prompt response format
65
+ */
66
+ export interface PromptResponse {
67
+ messages: Array<{
68
+ role: "user" | "assistant";
69
+ content: {
70
+ type: "text";
71
+ text: string;
72
+ };
73
+ }>;
74
+ }
75
+ /**
76
+ * Helper to create a JSON text response (most common pattern)
77
+ */
78
+ export declare function jsonResponse(data: unknown): ToolResponse;
79
+ /**
80
+ * Helper to create an error response
81
+ */
82
+ export declare function errorResponse(message: string): ToolResponse;
83
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/mcp/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qDAAqD;IACrD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC;IACV,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CACnE;AAGD,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAAK,cAAc,CAAC;CACvE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAC3B,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAK3D"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Type definitions for MCP tools and prompts
3
+ */
4
+ /**
5
+ * Helper to create a JSON text response (most common pattern)
6
+ */
7
+ export function jsonResponse(data) {
8
+ return {
9
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
10
+ };
11
+ }
12
+ /**
13
+ * Helper to create an error response
14
+ */
15
+ export function errorResponse(message) {
16
+ return {
17
+ content: [{ type: "text", text: message }],
18
+ isError: true,
19
+ };
20
+ }
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Canvas LMS API Type Definitions
3
+ * Based on: https://canvas.instructure.com/doc/api/
4
+ */
5
+ /** Course object from Canvas API */
6
+ export interface Course {
7
+ id: number;
8
+ name: string;
9
+ course_code: string;
10
+ workflow_state: "unpublished" | "available" | "completed" | "deleted";
11
+ account_id: number;
12
+ start_at: string | null;
13
+ end_at: string | null;
14
+ enrollments?: Enrollment[];
15
+ total_students?: number;
16
+ term?: Term;
17
+ time_zone?: string;
18
+ }
19
+ /** Term/semester information */
20
+ export interface Term {
21
+ id: number;
22
+ name: string;
23
+ start_at: string | null;
24
+ end_at: string | null;
25
+ }
26
+ /** Enrollment object with grade information */
27
+ export interface Enrollment {
28
+ id: number;
29
+ course_id: number;
30
+ user_id: number;
31
+ type: EnrollmentType;
32
+ enrollment_state: "active" | "invited" | "inactive" | "completed" | "deleted";
33
+ role: string;
34
+ grades?: Grades;
35
+ user?: User;
36
+ observed_user?: User;
37
+ }
38
+ export type EnrollmentType = "StudentEnrollment" | "TeacherEnrollment" | "TaEnrollment" | "ObserverEnrollment" | "DesignerEnrollment";
39
+ /** Grade information within an enrollment */
40
+ export interface Grades {
41
+ html_url: string;
42
+ current_grade: string | null;
43
+ final_grade: string | null;
44
+ current_score: number | null;
45
+ final_score: number | null;
46
+ current_points?: number;
47
+ unposted_current_grade?: string | null;
48
+ unposted_final_grade?: string | null;
49
+ unposted_current_score?: number | null;
50
+ unposted_final_score?: number | null;
51
+ }
52
+ /** User object */
53
+ export interface User {
54
+ id: number;
55
+ name: string;
56
+ sortable_name: string;
57
+ short_name: string;
58
+ login_id?: string;
59
+ email?: string;
60
+ avatar_url?: string;
61
+ }
62
+ /** Assignment object */
63
+ export interface Assignment {
64
+ id: number;
65
+ name: string;
66
+ description: string | null;
67
+ due_at: string | null;
68
+ unlock_at: string | null;
69
+ lock_at: string | null;
70
+ points_possible: number | null;
71
+ course_id: number;
72
+ submission_types: SubmissionType[];
73
+ html_url: string;
74
+ has_submitted_submissions: boolean;
75
+ published: boolean;
76
+ workflow_state: "published" | "unpublished" | "deleted";
77
+ assignment_group_id: number;
78
+ position: number;
79
+ grading_type: GradingType;
80
+ submission?: Submission;
81
+ submissions_download_url?: string;
82
+ /** External tool URL if applicable */
83
+ external_tool_tag_attributes?: {
84
+ url: string;
85
+ new_tab: boolean;
86
+ resource_link_id: string;
87
+ };
88
+ /** Attached files/materials */
89
+ attachments?: Attachment[];
90
+ }
91
+ export type SubmissionType = "online_text_entry" | "online_url" | "online_upload" | "media_recording" | "student_annotation" | "external_tool" | "on_paper" | "none";
92
+ export type GradingType = "pass_fail" | "percent" | "letter_grade" | "gpa_scale" | "points" | "not_graded";
93
+ /** File attachment */
94
+ export interface Attachment {
95
+ id: number;
96
+ uuid: string;
97
+ filename: string;
98
+ display_name: string;
99
+ content_type: string;
100
+ url: string;
101
+ size: number;
102
+ created_at: string;
103
+ updated_at: string;
104
+ }
105
+ /** Submission object */
106
+ export interface Submission {
107
+ id: number;
108
+ assignment_id: number;
109
+ user_id: number;
110
+ submission_type: SubmissionType | null;
111
+ submitted_at: string | null;
112
+ grade: string | null;
113
+ score: number | null;
114
+ entered_grade: string | null;
115
+ entered_score: number | null;
116
+ late: boolean;
117
+ missing: boolean;
118
+ excused: boolean | null;
119
+ late_policy_status: "late" | "missing" | "extended" | "none" | null;
120
+ points_deducted: number | null;
121
+ grading_period_id: number | null;
122
+ workflow_state: "submitted" | "unsubmitted" | "graded" | "pending_review";
123
+ grade_matches_current_submission: boolean;
124
+ posted_at: string | null;
125
+ assignment?: Assignment;
126
+ user?: User;
127
+ course?: Course;
128
+ html_url?: string;
129
+ preview_url?: string;
130
+ attachments?: Attachment[];
131
+ submission_comments?: SubmissionComment[];
132
+ }
133
+ /** Comment on a submission */
134
+ export interface SubmissionComment {
135
+ id: number;
136
+ author_id: number;
137
+ author_name: string;
138
+ comment: string;
139
+ created_at: string;
140
+ author?: User;
141
+ }
142
+ /** Missing submission (from /users/:id/missing_submissions) */
143
+ export interface MissingSubmission {
144
+ id: number;
145
+ name: string;
146
+ description: string | null;
147
+ due_at: string | null;
148
+ unlock_at: string | null;
149
+ lock_at: string | null;
150
+ points_possible: number | null;
151
+ course_id: number;
152
+ html_url: string;
153
+ submission_types: SubmissionType[];
154
+ course?: Course;
155
+ planner_override?: PlannerOverride;
156
+ }
157
+ /** Planner override for managing todo items */
158
+ export interface PlannerOverride {
159
+ id: number;
160
+ plannable_type: string;
161
+ plannable_id: number;
162
+ user_id: number;
163
+ marked_complete: boolean;
164
+ dismissed: boolean;
165
+ }
166
+ /** Upcoming event (assignment or calendar event) */
167
+ export interface UpcomingEvent {
168
+ id: string;
169
+ title: string;
170
+ start_at: string;
171
+ end_at?: string;
172
+ type: "event" | "assignment";
173
+ context_code: string;
174
+ html_url: string;
175
+ assignment?: Assignment;
176
+ }
177
+ /** Planner item (from /api/v1/planner/items) */
178
+ export interface PlannerItem {
179
+ context_type: "Course" | "Group" | "User";
180
+ course_id?: number;
181
+ group_id?: number;
182
+ user_id?: number;
183
+ plannable_id: number;
184
+ plannable_type: "assignment" | "quiz" | "discussion_topic" | "wiki_page" | "planner_note" | "calendar_event" | "announcement";
185
+ planner_override: PlannerOverride | null;
186
+ new_activity: boolean;
187
+ submissions?: PlannerSubmissionStatus;
188
+ plannable_date: string;
189
+ plannable: {
190
+ id: number;
191
+ title: string;
192
+ created_at: string;
193
+ updated_at: string;
194
+ points_possible: number | null;
195
+ due_at: string | null;
196
+ };
197
+ html_url: string;
198
+ context_name: string;
199
+ context_image?: string | null;
200
+ }
201
+ /** Submission status in planner items */
202
+ export interface PlannerSubmissionStatus {
203
+ submitted: boolean;
204
+ excused: boolean;
205
+ graded: boolean;
206
+ posted_at: string | null;
207
+ late: boolean;
208
+ missing: boolean;
209
+ needs_grading: boolean;
210
+ has_feedback: boolean;
211
+ redo_request: boolean;
212
+ }
213
+ /** Canvas API pagination info parsed from Link header */
214
+ export interface PaginationLinks {
215
+ current?: string;
216
+ next?: string;
217
+ prev?: string;
218
+ first?: string;
219
+ last?: string;
220
+ }
221
+ /** Generic API error response */
222
+ export interface ApiError {
223
+ status: string;
224
+ message: string;
225
+ errors?: Array<{
226
+ message: string;
227
+ }>;
228
+ }
229
+ /** Options for listing courses */
230
+ export interface ListCoursesOptions {
231
+ enrollment_type?: EnrollmentType;
232
+ enrollment_state?: "active" | "invited" | "completed";
233
+ include?: Array<"total_students" | "enrollments" | "term" | "course_image">;
234
+ state?: Array<"unpublished" | "available" | "completed" | "deleted">;
235
+ }
236
+ /** Options for listing assignments */
237
+ export interface ListAssignmentsOptions {
238
+ course_id: number;
239
+ bucket?: "past" | "overdue" | "undated" | "ungraded" | "unsubmitted" | "upcoming" | "future";
240
+ order_by?: "position" | "name" | "due_at";
241
+ include?: Array<"submission" | "assignment_visibility" | "all_dates" | "overrides">;
242
+ search_term?: string;
243
+ }
244
+ /** Options for listing submissions */
245
+ export interface ListSubmissionsOptions {
246
+ course_id: number;
247
+ assignment_ids?: number[];
248
+ student_ids?: number[] | "all";
249
+ grouped?: boolean;
250
+ include?: Array<"submission_history" | "submission_comments" | "rubric_assessment" | "assignment" | "user">;
251
+ workflow_state?: "submitted" | "unsubmitted" | "graded" | "pending_review";
252
+ }
253
+ /** Options for missing submissions */
254
+ export interface MissingSubmissionsOptions {
255
+ user_id?: string | number;
256
+ observed_user_id?: string | number;
257
+ course_ids?: number[];
258
+ include?: Array<"planner_overrides" | "course">;
259
+ filter?: Array<"submittable" | "current_grading_period">;
260
+ }
261
+ /** CLI output format type */
262
+ export type OutputFormat = "json" | "table";
263
+ /** Course with grade summary (for display) */
264
+ export interface CourseWithGrade {
265
+ id: number;
266
+ name: string;
267
+ course_code: string;
268
+ current_grade: string | null;
269
+ current_score: number | null;
270
+ final_grade: string | null;
271
+ final_score: number | null;
272
+ }
273
+ /** Assignment with submission status (for display) */
274
+ export interface AssignmentWithStatus {
275
+ id: number;
276
+ course_id: number;
277
+ course_name?: string;
278
+ name: string;
279
+ due_at: string | null;
280
+ points_possible: number | null;
281
+ submitted: boolean;
282
+ grade: string | null;
283
+ score: number | null;
284
+ missing: boolean;
285
+ late: boolean;
286
+ html_url: string;
287
+ }
288
+ //# sourceMappingURL=canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/src/types/canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Canvas LMS API Type Definitions
3
+ * Based on: https://canvas.instructure.com/doc/api/
4
+ */
5
+ export {};
@@ -0,0 +1,19 @@
1
+ export interface Config {
2
+ apiToken: string;
3
+ baseUrl: string;
4
+ studentId: string;
5
+ }
6
+ /**
7
+ * Load configuration from environment variables
8
+ * Tries to load from .env file first, then falls back to process env
9
+ */
10
+ export declare function loadConfig(): Promise<Config>;
11
+ /**
12
+ * Get config synchronously (must call loadConfig first)
13
+ */
14
+ export declare function getConfig(): Config;
15
+ /**
16
+ * Clear cached config (useful for testing)
17
+ */
18
+ export declare function clearConfigCache(): void;
19
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/src/utils/config.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAwClD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Configuration loader for Canvas CLI
3
+ * Loads settings from environment variables
4
+ *
5
+ * Note: When built for npm with dnt, Deno APIs are shimmed to Node.js equivalents.
6
+ * The dotenv loading for Node.js is handled by the bin wrapper.
7
+ */
8
+ import * as dntShim from "../../_dnt.shims.js";
9
+ // dotenv is loaded via cli.js wrapper
10
+ let cachedConfig = null;
11
+ /**
12
+ * Load configuration from environment variables
13
+ * Tries to load from .env file first, then falls back to process env
14
+ */
15
+ export async function loadConfig() {
16
+ if (cachedConfig) {
17
+ return cachedConfig;
18
+ }
19
+ // dotenv is loaded via cli.js wrapper (dotenv/config)
20
+ const apiToken = dntShim.Deno.env.get("CANVAS_API_TOKEN");
21
+ const baseUrl = dntShim.Deno.env.get("CANVAS_BASE_URL");
22
+ const studentId = dntShim.Deno.env.get("CANVAS_STUDENT_ID") || "self";
23
+ if (!apiToken) {
24
+ throw new Error("CANVAS_API_TOKEN is required. Set it in .env or as an environment variable.\n" +
25
+ "Generate a token at: Canvas > Account > Settings > Approved Integrations > New Access Token");
26
+ }
27
+ if (!baseUrl) {
28
+ throw new Error("CANVAS_BASE_URL is required. Set it in .env or as an environment variable.\n" +
29
+ "Example: https://yourschool.instructure.com");
30
+ }
31
+ // Remove trailing slash if present
32
+ const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
33
+ cachedConfig = {
34
+ apiToken,
35
+ baseUrl: normalizedBaseUrl,
36
+ studentId,
37
+ };
38
+ return cachedConfig;
39
+ }
40
+ /**
41
+ * Get config synchronously (must call loadConfig first)
42
+ */
43
+ export function getConfig() {
44
+ if (!cachedConfig) {
45
+ throw new Error("Config not loaded. Call loadConfig() first.");
46
+ }
47
+ return cachedConfig;
48
+ }
49
+ /**
50
+ * Clear cached config (useful for testing)
51
+ */
52
+ export function clearConfigCache() {
53
+ cachedConfig = null;
54
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Initialization utility for CLI commands
3
+ */
4
+ /**
5
+ * Initialize the Canvas API client
6
+ * Safe to call multiple times - will only init once
7
+ */
8
+ export declare function ensureClient(): Promise<void>;
9
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/src/utils/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Initialization utility for CLI commands
3
+ */
4
+ import { loadConfig } from "./config.js";
5
+ import { initClient } from "../api/client.js";
6
+ let initialized = false;
7
+ /**
8
+ * Initialize the Canvas API client
9
+ * Safe to call multiple times - will only init once
10
+ */
11
+ export async function ensureClient() {
12
+ if (initialized)
13
+ return;
14
+ const config = await loadConfig();
15
+ initClient({
16
+ baseUrl: config.baseUrl,
17
+ apiToken: config.apiToken,
18
+ });
19
+ initialized = true;
20
+ }
package/manifest.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "manifest_version": "0.3",
3
+ "name": "canvas-lms-mcp",
4
+ "display_name": "Canvas LMS",
5
+ "version": "0.1.0",
6
+ "description": "Connect Claude to your Canvas LMS account to query grades, assignments, missing work, and more.",
7
+ "long_description": "An MCP server that connects AI assistants like Claude to your Canvas LMS account. Perfect for parents monitoring their child's academic progress, students tracking their own work, or anyone who wants to interact with Canvas data through natural language.\n\nAsk Claude things like:\n- What assignments are due this week?\n- Show me missing assignments across all classes\n- What's my grade in Biology?\n- Are there any late assignments I should know about?",
8
+ "author": {
9
+ "name": "mtgibbs",
10
+ "url": "https://github.com/mtgibbs"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/mtgibbs/canvas-lms-mcp"
15
+ },
16
+ "license": "MIT",
17
+ "privacy_policies": [
18
+ "https://github.com/mtgibbs/canvas-lms-mcp#privacy--security"
19
+ ],
20
+ "server": {
21
+ "type": "node",
22
+ "entry_point": "esm/cli.js",
23
+ "mcp_config": {
24
+ "command": "node",
25
+ "args": [
26
+ "${__dirname}/esm/cli.js"
27
+ ],
28
+ "env": {
29
+ "CANVAS_API_TOKEN": "${user_config.canvas_api_token}",
30
+ "CANVAS_BASE_URL": "${user_config.canvas_base_url}",
31
+ "CANVAS_STUDENT_ID": "${user_config.canvas_student_id}"
32
+ }
33
+ }
34
+ },
35
+ "user_config": {
36
+ "canvas_api_token": {
37
+ "type": "string",
38
+ "title": "Canvas API Token",
39
+ "description": "Your Canvas API access token. Generate one at Canvas > Account > Settings > Approved Integrations > New Access Token",
40
+ "sensitive": true,
41
+ "required": true
42
+ },
43
+ "canvas_base_url": {
44
+ "type": "string",
45
+ "title": "Canvas Base URL",
46
+ "description": "Your school's Canvas URL (e.g., https://yourschool.instructure.com)",
47
+ "required": true
48
+ },
49
+ "canvas_student_id": {
50
+ "type": "string",
51
+ "title": "Student ID (Optional)",
52
+ "description": "Required for parent/observer accounts. Leave empty if you're a student viewing your own data.",
53
+ "required": false,
54
+ "default": ""
55
+ }
56
+ },
57
+ "tools": [
58
+ {
59
+ "name": "get_courses",
60
+ "description": "List all courses with current grades"
61
+ },
62
+ {
63
+ "name": "get_missing_assignments",
64
+ "description": "Get assignments flagged as missing by Canvas"
65
+ },
66
+ {
67
+ "name": "get_unsubmitted_past_due",
68
+ "description": "Get past-due assignments not yet submitted"
69
+ },
70
+ {
71
+ "name": "get_upcoming_assignments",
72
+ "description": "Get assignments due soon for a specific course"
73
+ },
74
+ {
75
+ "name": "get_due_this_week",
76
+ "description": "Get all assignments due across all courses"
77
+ },
78
+ {
79
+ "name": "list_assignments",
80
+ "description": "Search and filter assignments by status"
81
+ },
82
+ {
83
+ "name": "get_stats",
84
+ "description": "Get late/missing statistics by course"
85
+ },
86
+ {
87
+ "name": "get_todo",
88
+ "description": "Get planner items and to-do list"
89
+ }
90
+ ]
91
+ }
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@mtgibbs/canvas-lms-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Canvas LMS MCP (Model Context Protocol) server for AI assistants. Query student grades, assignments, and academic data through Claude or other MCP-compatible AI tools.",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "canvas-lms",
9
+ "canvas",
10
+ "lms",
11
+ "instructure",
12
+ "education",
13
+ "grades",
14
+ "assignments",
15
+ "claude",
16
+ "ai"
17
+ ],
18
+ "homepage": "https://github.com/mtgibbs/canvas-lms-mcp#readme",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/mtgibbs/canvas-lms-mcp.git"
22
+ },
23
+ "license": "MIT",
24
+ "bugs": {
25
+ "url": "https://github.com/mtgibbs/canvas-lms-mcp/issues"
26
+ },
27
+ "module": "./esm/agent.js",
28
+ "exports": {
29
+ ".": {
30
+ "import": "./esm/agent.js"
31
+ }
32
+ },
33
+ "bin": {
34
+ "canvas-mcp": "./esm/cli.js"
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "@deno/shim-deno": "~0.18.0",
41
+ "dotenv": "^16.3.1",
42
+ "@modelcontextprotocol/sdk": "^1.0.1",
43
+ "zod": "^3.23.8"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^20.9.0"
47
+ },
48
+ "_generatedBy": "dnt@dev"
49
+ }