brightspace-mcp-server 1.2.6 → 1.5.1

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 (134) hide show
  1. package/README.md +44 -13
  2. package/build/api/cache.d.ts +1 -1
  3. package/build/api/cache.js +1 -1
  4. package/build/api/client.d.ts +1 -1
  5. package/build/api/client.d.ts.map +1 -1
  6. package/build/api/client.js +25 -3
  7. package/build/api/client.js.map +1 -1
  8. package/build/api/errors.d.ts +2 -2
  9. package/build/api/errors.js +2 -2
  10. package/build/api/index.d.ts +1 -1
  11. package/build/api/index.js +1 -1
  12. package/build/api/rate-limiter.d.ts +2 -2
  13. package/build/api/rate-limiter.js +2 -2
  14. package/build/api/types.d.ts +1 -1
  15. package/build/api/types.js +1 -1
  16. package/build/api/version-discovery.d.ts +2 -2
  17. package/build/api/version-discovery.js +2 -2
  18. package/build/auth/auth-runner.d.ts +2 -2
  19. package/build/auth/auth-runner.d.ts.map +1 -1
  20. package/build/auth/auth-runner.js +61 -12
  21. package/build/auth/auth-runner.js.map +1 -1
  22. package/build/auth/browser-auth.d.ts +35 -1
  23. package/build/auth/browser-auth.d.ts.map +1 -1
  24. package/build/auth/browser-auth.js +219 -28
  25. package/build/auth/browser-auth.js.map +1 -1
  26. package/build/auth/index.d.ts +5 -2
  27. package/build/auth/index.d.ts.map +1 -1
  28. package/build/auth/index.js +4 -2
  29. package/build/auth/index.js.map +1 -1
  30. package/build/auth/purdue-sso.d.ts +30 -1
  31. package/build/auth/purdue-sso.d.ts.map +1 -1
  32. package/build/auth/purdue-sso.js +144 -17
  33. package/build/auth/purdue-sso.js.map +1 -1
  34. package/build/auth/session-store.d.ts +1 -1
  35. package/build/auth/session-store.js +1 -1
  36. package/build/auth/sso-flow.d.ts +24 -0
  37. package/build/auth/sso-flow.d.ts.map +1 -0
  38. package/build/auth/sso-flow.js +21 -0
  39. package/build/auth/sso-flow.js.map +1 -0
  40. package/build/auth/suny-sso.d.ts +49 -0
  41. package/build/auth/suny-sso.d.ts.map +1 -0
  42. package/build/auth/suny-sso.js +146 -0
  43. package/build/auth/suny-sso.js.map +1 -0
  44. package/build/auth/token-manager.d.ts +29 -2
  45. package/build/auth/token-manager.d.ts.map +1 -1
  46. package/build/auth/token-manager.js +83 -4
  47. package/build/auth/token-manager.js.map +1 -1
  48. package/build/auth/token-mint.d.ts +32 -0
  49. package/build/auth/token-mint.d.ts.map +1 -0
  50. package/build/auth/token-mint.js +71 -0
  51. package/build/auth/token-mint.js.map +1 -0
  52. package/build/auth-cli.d.ts +1 -1
  53. package/build/auth-cli.js +9 -4
  54. package/build/auth-cli.js.map +1 -1
  55. package/build/index.d.ts +1 -1
  56. package/build/index.js +6 -2
  57. package/build/index.js.map +1 -1
  58. package/build/setup.d.ts +2 -2
  59. package/build/setup.js +31 -5
  60. package/build/setup.js.map +1 -1
  61. package/build/tools/download-file.d.ts +6 -2
  62. package/build/tools/download-file.d.ts.map +1 -1
  63. package/build/tools/download-file.js +27 -7
  64. package/build/tools/download-file.js.map +1 -1
  65. package/build/tools/get-announcements.d.ts +65 -2
  66. package/build/tools/get-announcements.d.ts.map +1 -1
  67. package/build/tools/get-announcements.js +69 -25
  68. package/build/tools/get-announcements.js.map +1 -1
  69. package/build/tools/get-assignments.d.ts +8 -2
  70. package/build/tools/get-assignments.d.ts.map +1 -1
  71. package/build/tools/get-assignments.js +76 -17
  72. package/build/tools/get-assignments.js.map +1 -1
  73. package/build/tools/get-classlist-emails.d.ts +2 -2
  74. package/build/tools/get-classlist-emails.js +2 -2
  75. package/build/tools/get-course-content.d.ts +2 -2
  76. package/build/tools/get-course-content.js +2 -2
  77. package/build/tools/get-discussions.d.ts +1 -1
  78. package/build/tools/get-discussions.js +1 -1
  79. package/build/tools/get-my-courses.d.ts +2 -2
  80. package/build/tools/get-my-courses.d.ts.map +1 -1
  81. package/build/tools/get-my-courses.js +10 -4
  82. package/build/tools/get-my-courses.js.map +1 -1
  83. package/build/tools/get-my-grades.d.ts +1 -1
  84. package/build/tools/get-my-grades.js +1 -1
  85. package/build/tools/get-roster.d.ts +2 -2
  86. package/build/tools/get-roster.js +2 -2
  87. package/build/tools/get-syllabus.d.ts +1 -1
  88. package/build/tools/get-syllabus.js +1 -1
  89. package/build/tools/get-upcoming-due-dates.d.ts +2 -2
  90. package/build/tools/get-upcoming-due-dates.d.ts.map +1 -1
  91. package/build/tools/get-upcoming-due-dates.js +121 -45
  92. package/build/tools/get-upcoming-due-dates.js.map +1 -1
  93. package/build/tools/index.d.ts +2 -2
  94. package/build/tools/index.js +2 -2
  95. package/build/tools/schemas.d.ts +3 -3
  96. package/build/tools/schemas.d.ts.map +1 -1
  97. package/build/tools/schemas.js +11 -5
  98. package/build/tools/schemas.js.map +1 -1
  99. package/build/tools/tool-helpers.d.ts +1 -1
  100. package/build/tools/tool-helpers.js +1 -1
  101. package/build/types/index.d.ts +12 -2
  102. package/build/types/index.d.ts.map +1 -1
  103. package/build/types/index.js +2 -2
  104. package/build/update.d.ts +1 -1
  105. package/build/update.js +1 -1
  106. package/build/utils/config-store.d.ts +3 -2
  107. package/build/utils/config-store.d.ts.map +1 -1
  108. package/build/utils/config-store.js +2 -2
  109. package/build/utils/config-store.js.map +1 -1
  110. package/build/utils/config.d.ts +2 -2
  111. package/build/utils/config.d.ts.map +1 -1
  112. package/build/utils/config.js +3 -2
  113. package/build/utils/config.js.map +1 -1
  114. package/build/utils/course-filter.d.ts +2 -2
  115. package/build/utils/course-filter.js +2 -2
  116. package/build/utils/deep-links.d.ts +15 -0
  117. package/build/utils/deep-links.d.ts.map +1 -0
  118. package/build/utils/deep-links.js +31 -0
  119. package/build/utils/deep-links.js.map +1 -0
  120. package/build/utils/download-helpers.d.ts +2 -2
  121. package/build/utils/download-helpers.js +2 -2
  122. package/build/utils/errors.d.ts +2 -2
  123. package/build/utils/errors.js +2 -2
  124. package/build/utils/file-validator.d.ts +2 -2
  125. package/build/utils/file-validator.d.ts.map +1 -1
  126. package/build/utils/file-validator.js +21 -11
  127. package/build/utils/file-validator.js.map +1 -1
  128. package/build/utils/html-converter.d.ts +2 -2
  129. package/build/utils/html-converter.js +2 -2
  130. package/build/utils/logger.d.ts +2 -2
  131. package/build/utils/logger.js +2 -2
  132. package/build/utils/pdf-extractor.d.ts +2 -2
  133. package/build/utils/pdf-extractor.js +2 -2
  134. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { D2LApiClient } from "../api/index.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { DEFAULT_CACHE_TTLS } from "../api/index.js";
7
7
  import { GetMyGradesSchema, } from "./schemas.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { D2LApiClient } from "../api/index.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { DEFAULT_CACHE_TTLS } from "../api/index.js";
7
7
  import { GetRosterSchema, } from "./schemas.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { D2LApiClient } from "../api/index.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { ApiError, DEFAULT_CACHE_TTLS } from "../api/index.js";
7
7
  import { GetSyllabusSchema } from "./schemas.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  import { D2LApiClient } from "../api/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"get-upcoming-due-dates.d.ts","sourceRoot":"","sources":["../../src/tools/get-upcoming-due-dates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAsB,MAAM,iBAAiB,CAAC;AAOnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA2BnD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,SAAS,GAChB,IAAI,CAuFN"}
1
+ {"version":3,"file":"get-upcoming-due-dates.d.ts","sourceRoot":"","sources":["../../src/tools/get-upcoming-due-dates.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAsB,MAAM,iBAAiB,CAAC;AAQnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AA6KnD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,SAAS,GAChB,IAAI,CAsDN"}
@@ -1,20 +1,118 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { DEFAULT_CACHE_TTLS } from "../api/index.js";
7
7
  import { GetUpcomingDueDatesSchema, } from "./schemas.js";
8
8
  import { toolResponse, sanitizeError } from "./tool-helpers.js";
9
9
  import { log } from "../utils/logger.js";
10
10
  import { applyCourseFilter } from "../utils/course-filter.js";
11
+ import { assignmentUrl, quizUrl } from "../utils/deep-links.js";
12
+ /** D2L list endpoints return either a paged { Objects: [...] } or a flat array. */
13
+ function unwrapList(raw) {
14
+ return Array.isArray(raw) ? raw : (raw?.Objects ?? []);
15
+ }
16
+ /**
17
+ * Resolve which courses to query, and their names.
18
+ *
19
+ * A tool-level courseId bypasses the configured course filter, but enrollments
20
+ * are still fetched so the course can be named.
21
+ */
22
+ async function resolveCourses(apiClient, config, courseId) {
23
+ let items = [];
24
+ try {
25
+ const response = await apiClient.get(apiClient.lp("/enrollments/myenrollments/?orgUnitTypeId=3&isActive=true"), { ttl: DEFAULT_CACHE_TTLS.enrollments });
26
+ items = response.Items ?? [];
27
+ }
28
+ catch (error) {
29
+ // Without enrollments there is no course list to walk, so only the explicit
30
+ // single-course case can continue (with an unnamed course).
31
+ if (!courseId)
32
+ throw error;
33
+ log("DEBUG", "get_upcoming_due_dates: could not fetch enrollments for course name", error);
34
+ }
35
+ if (courseId) {
36
+ const match = items.find((item) => item.OrgUnit.Id === courseId);
37
+ return [{ id: courseId, name: match?.OrgUnit.Name ?? null }];
38
+ }
39
+ const filtered = applyCourseFilter(items.map((item) => ({
40
+ id: item.OrgUnit.Id,
41
+ name: item.OrgUnit.Name,
42
+ code: item.OrgUnit.Code,
43
+ isActive: item.Access.IsActive,
44
+ })), config.courseFilter);
45
+ return filtered.map((course) => ({ id: course.id, name: course.name }));
46
+ }
47
+ /**
48
+ * Collect every dated assignment and quiz for one course.
49
+ *
50
+ * Two API calls per course, no submissions or attempts: the due date lives on
51
+ * the item itself, which is what makes this cheap enough to run across all
52
+ * enrolled courses.
53
+ */
54
+ async function fetchCourseDueItems(apiClient, baseUrl, course) {
55
+ const [dropboxResult, quizResult] = await Promise.allSettled([
56
+ apiClient.get(apiClient.le(course.id, "/dropbox/folders/"), { ttl: DEFAULT_CACHE_TTLS.assignments }),
57
+ apiClient.get(apiClient.le(course.id, "/quizzes/"), { ttl: DEFAULT_CACHE_TTLS.assignments }),
58
+ ]);
59
+ const items = [];
60
+ if (dropboxResult.status === "fulfilled") {
61
+ for (const folder of unwrapList(dropboxResult.value)) {
62
+ if (folder.IsHidden === true)
63
+ continue;
64
+ if (!folder.DueDate)
65
+ continue;
66
+ items.push({
67
+ type: "assignment",
68
+ id: folder.Id,
69
+ title: folder.Name,
70
+ courseId: course.id,
71
+ courseName: course.name,
72
+ dueDate: folder.DueDate,
73
+ startDate: null,
74
+ endDate: null,
75
+ url: assignmentUrl(baseUrl, course.id, folder.Id),
76
+ });
77
+ }
78
+ }
79
+ else {
80
+ // 403 for past courses and similar: log and keep the other courses.
81
+ log("DEBUG", `get_upcoming_due_dates: failed to fetch dropbox folders for course ${course.id}`, dropboxResult.reason);
82
+ }
83
+ if (quizResult.status === "fulfilled") {
84
+ for (const quiz of unwrapList(quizResult.value)) {
85
+ if (quiz.IsActive === false)
86
+ continue;
87
+ // Many instructors set only an End Date, which is the effective deadline.
88
+ const dueDate = quiz.DueDate ?? quiz.EndDate;
89
+ if (!dueDate)
90
+ continue;
91
+ items.push({
92
+ type: "quiz",
93
+ id: quiz.QuizId,
94
+ title: quiz.Name,
95
+ courseId: course.id,
96
+ courseName: course.name,
97
+ dueDate,
98
+ startDate: quiz.StartDate ?? null,
99
+ endDate: quiz.EndDate ?? null,
100
+ url: quizUrl(baseUrl, course.id, quiz.QuizId),
101
+ });
102
+ }
103
+ }
104
+ else {
105
+ log("DEBUG", `get_upcoming_due_dates: failed to fetch quizzes for course ${course.id}`, quizResult.reason);
106
+ }
107
+ return items;
108
+ }
11
109
  /**
12
110
  * Register get_upcoming_due_dates tool
13
111
  */
14
112
  export function registerGetUpcomingDueDates(server, apiClient, config) {
15
113
  server.registerTool("get_upcoming_due_dates", {
16
114
  title: "Get Upcoming Due Dates",
17
- description: "Fetch upcoming due dates across all your courses. Shows assignments, quizzes, and other items due within the specified time window. Use this when the user asks about deadlines, what's due, upcoming work, or what they need to do this week.",
115
+ description: "Fetch upcoming due dates across all your courses, derived from the due dates on assignments (dropbox folders) and quizzes themselves. Use this when the user asks about deadlines, what's due, upcoming work, or what they need to do this week.",
18
116
  inputSchema: GetUpcomingDueDatesSchema,
19
117
  }, async (args) => {
20
118
  try {
@@ -22,49 +120,27 @@ export function registerGetUpcomingDueDates(server, apiClient, config) {
22
120
  // Parse and validate input
23
121
  const { daysAhead, courseId } = GetUpcomingDueDatesSchema.parse(args);
24
122
  // Build time window
25
- const now = new Date();
26
- const endDate = new Date(now.getTime() + daysAhead * 24 * 60 * 60 * 1000);
27
- const startDateTime = now.toISOString();
28
- const endDateTime = endDate.toISOString();
29
- // D2L calendar API requires orgUnitIdsCSV — fetch enrolled course IDs if not provided
30
- let orgUnitIds;
31
- if (courseId) {
32
- orgUnitIds = String(courseId);
33
- }
34
- else {
35
- const enrollments = await apiClient.get(apiClient.lp(`/enrollments/myenrollments/?orgUnitTypeId=3&isActive=true`), { ttl: DEFAULT_CACHE_TTLS.enrollments });
36
- // Apply course filter
37
- const filteredEnrollments = applyCourseFilter(enrollments.Items.map(item => ({
38
- id: item.OrgUnit.Id,
39
- name: item.OrgUnit.Name,
40
- code: item.OrgUnit.Code,
41
- isActive: item.Access.IsActive,
42
- })), config.courseFilter);
43
- orgUnitIds = filteredEnrollments.map((e) => e.id).join(",");
44
- }
45
- log("DEBUG", `get_upcoming_due_dates: querying orgUnitIds=${orgUnitIds}, window=${startDateTime} to ${endDateTime}`);
46
- // Build path
47
- const path = apiClient.leGlobal(`/calendar/events/myEvents/?startDateTime=${encodeURIComponent(startDateTime)}&endDateTime=${encodeURIComponent(endDateTime)}&orgUnitIdsCSV=${orgUnitIds}`);
48
- // Fetch events — D2L returns ObjectListPage wrapper with "Objects" array (NOT "Items")
49
- const response = await apiClient.get(path, {
50
- ttl: DEFAULT_CACHE_TTLS.assignments,
123
+ const now = Date.now();
124
+ const windowEnd = now + daysAhead * 24 * 60 * 60 * 1000;
125
+ const courses = await resolveCourses(apiClient, config, courseId);
126
+ log("DEBUG", `get_upcoming_due_dates: querying ${courses.length} course(s), window=${daysAhead} days`);
127
+ // Fetch every course in parallel; the API client rate limits itself
128
+ const results = await Promise.allSettled(courses.map((course) => fetchCourseDueItems(apiClient, config.baseUrl, course)));
129
+ const items = results.flatMap((result) => {
130
+ if (result.status === "fulfilled")
131
+ return result.value;
132
+ log("DEBUG", "get_upcoming_due_dates: skipping course after fetch failure", result.reason);
133
+ return [];
51
134
  });
52
- const events = response.Objects ?? [];
53
- log("DEBUG", `get_upcoming_due_dates: raw response keys=${Object.keys(response).join(",")}, event count=${events.length}`);
54
- // Map to clean objects and sort by end date (soonest due first)
55
- const mappedEvents = events
56
- .map((event) => ({
57
- id: event.CalendarEventId,
58
- title: event.Title,
59
- courseName: event.OrgUnitName,
60
- courseId: event.OrgUnitId,
61
- startDate: event.StartDateTime,
62
- endDate: event.EndDateTime,
63
- isAllDay: event.IsAllDayEvent,
64
- }))
65
- .sort((a, b) => new Date(a.endDate).getTime() - new Date(b.endDate).getTime());
66
- log("INFO", `get_upcoming_due_dates: Retrieved ${mappedEvents.length} events`);
67
- return toolResponse(mappedEvents);
135
+ // Keep what falls inside the window, soonest first
136
+ const upcoming = items
137
+ .filter((item) => {
138
+ const due = new Date(item.dueDate).getTime();
139
+ return Number.isFinite(due) && due >= now && due <= windowEnd;
140
+ })
141
+ .sort((a, b) => new Date(a.dueDate).getTime() - new Date(b.dueDate).getTime());
142
+ log("INFO", `get_upcoming_due_dates: Retrieved ${upcoming.length} items across ${courses.length} courses`);
143
+ return toolResponse(upcoming);
68
144
  }
69
145
  catch (error) {
70
146
  return sanitizeError(error);
@@ -1 +1 @@
1
- {"version":3,"file":"get-upcoming-due-dates.js","sourceRoot":"","sources":["../../src/tools/get-upcoming-due-dates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-upcoming-due-dates.js","sourceRoot":"","sources":["../../src/tools/get-upcoming-due-dates.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  export { registerGetMyCourses } from "./get-my-courses.js";
7
7
  export { registerGetUpcomingDueDates } from "./get-upcoming-due-dates.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  // Tool registration functions - barrel export
7
7
  export { registerGetMyCourses } from "./get-my-courses.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { z } from "zod";
7
7
  /**
@@ -10,7 +10,7 @@ import { z } from "zod";
10
10
  * Also used in tool handlers for runtime parsing via .parse(args).
11
11
  */
12
12
  export declare const GetMyCoursesSchema: z.ZodObject<{
13
- activeOnly: z.ZodDefault<z.ZodBoolean>;
13
+ activeOnly: z.ZodOptional<z.ZodBoolean>;
14
14
  }, z.core.$strip>;
15
15
  export declare const GetUpcomingDueDatesSchema: z.ZodObject<{
16
16
  daysAhead: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAG/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBASjC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;iBAGnC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;iBAa7B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;iBAK5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAO/B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;iBAO1B,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB;;iBAU7B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAG/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;iBASjC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;iBAGnC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;iBAa7B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;iBAK5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAO/B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;iBAO1B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { z } from "zod";
7
7
  /**
@@ -10,7 +10,13 @@ import { z } from "zod";
10
10
  * Also used in tool handlers for runtime parsing via .parse(args).
11
11
  */
12
12
  export const GetMyCoursesSchema = z.object({
13
- activeOnly: z.boolean().default(true).describe("Only return currently active courses"),
13
+ // Intentionally has no default: omitting it falls back to the configured
14
+ // D2L_ACTIVE_ONLY / config.json policy (true unless the user changed it).
15
+ // A default here would silently override that configuration on every call.
16
+ activeOnly: z
17
+ .boolean()
18
+ .optional()
19
+ .describe("Only return currently active courses. Defaults to the server's configured activeOnly setting (true unless overridden)."),
14
20
  });
15
21
  export const GetUpcomingDueDatesSchema = z.object({
16
22
  daysAhead: z.coerce.number().int().min(1).max(90).default(7).describe("Number of days ahead to look for due dates"),
@@ -52,7 +58,7 @@ export const DownloadFileSchema = z.object({
52
58
  .describe("Specific file ID within a dropbox submission."),
53
59
  downloadPath: z.string().min(1)
54
60
  .describe("Absolute path to the directory where the file should be saved."),
55
- customFilename: z.string().optional()
61
+ customFilename: z.string().max(255).optional()
56
62
  .describe("Custom filename for the downloaded file (include extension). If not provided, uses the original filename from Brightspace."),
57
63
  });
58
64
  export const GetSyllabusSchema = z.object({
@@ -74,7 +80,7 @@ export const GetRosterSchema = z.object({
74
80
  .describe("Course ID to get roster for."),
75
81
  includeStudents: z.boolean().default(false)
76
82
  .describe("Include students in results. Default is instructors and TAs only."),
77
- searchTerm: z.string().optional()
83
+ searchTerm: z.string().max(200).optional()
78
84
  .describe("Optional search term to filter by name."),
79
85
  });
80
86
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
3
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import { ZodError } from "zod";
7
7
  import { ApiError, RateLimitError, NetworkError } from "../api/index.js";
@@ -1,13 +1,21 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  export interface TokenData {
7
7
  accessToken: string;
8
8
  capturedAt: number;
9
9
  expiresAt: number;
10
10
  source: "browser" | "cache";
11
+ /**
12
+ * "d2lSessionVal=...; d2lSecureSessionVal=...", harvested at login.
13
+ * Present only when both cookies were found. With csrfToken it lets the
14
+ * token manager mint a fresh JWT instead of relaunching the browser.
15
+ */
16
+ cookieHeader?: string;
17
+ /** D2L XSRF token; the mint answers 403 without it. */
18
+ csrfToken?: string;
11
19
  }
12
20
  export interface EncryptedData {
13
21
  iv: string;
@@ -27,6 +35,8 @@ export interface AppConfig {
27
35
  headless: boolean;
28
36
  username?: string;
29
37
  password?: string;
38
+ /** Campus within a shared multi-campus Brightspace instance. */
39
+ campus?: string;
30
40
  courseFilter: CourseFilterConfig;
31
41
  }
32
42
  export interface AuthResult {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAGD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAGD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAG3D,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAGD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAGD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAG3D,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  export {};
7
7
  //# sourceMappingURL=index.js.map
package/build/update.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Brightspace MCP Server
4
4
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
5
- * Licensed under AGPL-3.0 — see LICENSE file for details.
5
+ * Licensed under MIT — see LICENSE file for details.
6
6
  *
7
7
  * https://github.com/rohanmuppa/brightspace-mcp-server
8
8
  */
package/build/update.js CHANGED
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Brightspace MCP Server
4
4
  * Copyright (c) 2026 Rohan Muppa. All rights reserved.
5
- * Licensed under AGPL-3.0 — see LICENSE file for details.
5
+ * Licensed under MIT — see LICENSE file for details.
6
6
  *
7
7
  * https://github.com/rohanmuppa/brightspace-mcp-server
8
8
  */
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  /** JSON schema for ~/.brightspace-mcp/config.json */
7
7
  export interface ConfigStoreData {
8
8
  baseUrl?: string;
9
9
  username?: string;
10
10
  password?: string;
11
+ campus?: string;
11
12
  sessionDir?: string;
12
13
  tokenTtl?: number;
13
14
  headless?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/utils/config-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAKD,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,eAAe,IAAI,eAAe,CAGjD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAQ7D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/utils/config-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAKD,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED,wBAAgB,eAAe,IAAI,eAAe,CAGjD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAQ7D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import * as fs from "node:fs";
7
7
  import * as path from "node:path";
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/utils/config-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAe9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACpE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/utils/config-store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAgB9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACpE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import type { AppConfig } from "../types/index.js";
7
7
  export declare function loadConfig(): AppConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,wBAAgB,UAAU,IAAI,SAAS,CAwDtC;AASD,YAAY,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,wBAAgB,UAAU,IAAI,SAAS,CAyDtC;AASD,YAAY,EAAE,SAAS,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import * as path from "node:path";
7
7
  import * as os from "node:os";
@@ -49,6 +49,7 @@ export function loadConfig() {
49
49
  headless,
50
50
  username: process.env.D2L_USERNAME || store?.username,
51
51
  password: process.env.D2L_PASSWORD || store?.password,
52
+ campus: process.env.D2L_CAMPUS || store?.campus,
52
53
  courseFilter: {
53
54
  includeCourseIds,
54
55
  excludeCourseIds,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Purdue Brightspace MCP Server
3
- * Copyright (c) 2025 Rohan Muppa. All rights reserved.
4
- * Licensed under AGPL-3.0 — see LICENSE file for details.
3
+ * Copyright (c) 2026 Rohan Muppa. All rights reserved.
4
+ * Licensed under MIT — see LICENSE file for details.
5
5
  */
6
6
  import type { CourseFilterConfig } from "../types/index.js";
7
7
  interface FilterableCourse {