brightspace-mcp-server 3.0.4 → 3.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.
- package/README.md +2 -17
- package/build/tools/get-announcements.d.ts +1 -0
- package/build/tools/get-announcements.d.ts.map +1 -1
- package/build/tools/get-announcements.js +29 -9
- package/build/tools/get-announcements.js.map +1 -1
- package/build/tools/get-course-content.d.ts.map +1 -1
- package/build/tools/get-course-content.js +42 -2
- package/build/tools/get-course-content.js.map +1 -1
- package/build/tools/schemas.d.ts +2 -0
- package/build/tools/schemas.d.ts.map +1 -1
- package/build/tools/schemas.js +4 -0
- package/build/tools/schemas.js.map +1 -1
- package/build/utils/modified-since.d.ts +19 -0
- package/build/utils/modified-since.d.ts.map +1 -0
- package/build/utils/modified-since.js +26 -0
- package/build/utils/modified-since.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -112,26 +112,11 @@ npx -y brightspace-mcp-server@latest auth
|
|
|
112
112
|
| Quizzes | "Which quizzes close this week?" · "Is Quiz 3 timed, and does it have a grace period?" |
|
|
113
113
|
| Assignment files | "What does the lab 4 spec actually ask for?" · "Summarize the rubric attached to the project" |
|
|
114
114
|
| Exams | "Is there a midterm in the gradebook that isn't on my assignments list?" |
|
|
115
|
-
| Announcements | "Did any professor post something important today?" · "What did my CS prof announce this week?" |
|
|
116
|
-
| Course content | "Find the midterm review slides" · "Download every PDF from Module 5" |
|
|
115
|
+
| Announcements | "Did any professor post something important today?" · "What did my CS prof announce this week?" · "Any announcements since last Monday?" |
|
|
116
|
+
| Course content | "Find the midterm review slides" · "Download every PDF from Module 5" · "What's new in this course since I last checked?" |
|
|
117
117
|
| Roster | "Who are the TAs for ECE 264?" · "Get me my instructor's email" |
|
|
118
118
|
| Discussions | "What are people saying in the final project thread?" · "Summarize the latest discussion posts" |
|
|
119
119
|
| Planning | "Build me a study schedule based on my upcoming due dates" · "Which class needs the most attention right now?" — pulls from assignments, quizzes, and graded discussion topics (any topic with a due date) |
|
|
120
120
|
|
|
121
|
-
## Contributing & Forking
|
|
122
|
-
|
|
123
|
-
Want to add your school, build a new tool, or fix something? Fork the repo, make your changes, and open a pull request. If it gets merged, it ships to every user automatically.
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
git clone https://github.com/RohanMuppa/brightspace-mcp-server.git
|
|
127
|
-
cd brightspace-mcp-server
|
|
128
|
-
npm install
|
|
129
|
-
npm run dev # tsc in watch mode
|
|
130
|
-
npm test # vitest, must be green before you open a PR
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Add your school:** Add a preset to `SCHOOL_PRESETS` in `src/setup.ts`. If your school's login flow is different, add a handler in `src/auth/`.
|
|
134
|
-
|
|
135
|
-
**Add a new tool:** Create a file in `src/tools/`, add the schema in `schemas.ts`, export it in `src/tools/index.ts`, and register it in `src/index.ts`. Use any existing tool as a template.
|
|
136
121
|
|
|
137
122
|
Licensed under the MIT License.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-announcements.d.ts","sourceRoot":"","sources":["../../src/tools/get-announcements.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-announcements.d.ts","sourceRoot":"","sources":["../../src/tools/get-announcements.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;AAEnD,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5C,SAAS,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,GAAG,EAAE,CAAC;CACpB;AAiCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1B,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACzB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ;;;;;;;;;;EAYzC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,SAAS,GAChB,IAAI,CAuIN"}
|
|
@@ -8,6 +8,7 @@ import { GetAnnouncementsSchema, } 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 { matchesModifiedSince } from "../utils/modified-since.js";
|
|
11
12
|
/**
|
|
12
13
|
* A date the runtime can actually order, or null. Unreadable and absent are the
|
|
13
14
|
* same answer, so a caller can fall through to the next best.
|
|
@@ -63,6 +64,7 @@ export function mapNewsItem(item) {
|
|
|
63
64
|
startDate: item.StartDate,
|
|
64
65
|
date: effectiveDate(item),
|
|
65
66
|
isPinned: item.IsPinned,
|
|
67
|
+
lastModified: item.LastModifiedDate ?? null,
|
|
66
68
|
};
|
|
67
69
|
}
|
|
68
70
|
/**
|
|
@@ -77,7 +79,8 @@ export function registerGetAnnouncements(server, apiClient, config) {
|
|
|
77
79
|
try {
|
|
78
80
|
log("DEBUG", "get_announcements tool called", { args });
|
|
79
81
|
// Parse and validate input
|
|
80
|
-
const { courseId, count } = GetAnnouncementsSchema.parse(args);
|
|
82
|
+
const { courseId, count, modifiedSince } = GetAnnouncementsSchema.parse(args);
|
|
83
|
+
const cutoff = modifiedSince ? new Date(modifiedSince) : null;
|
|
81
84
|
// Single course case
|
|
82
85
|
if (courseId) {
|
|
83
86
|
const path = apiClient.le(courseId, "/news/");
|
|
@@ -85,13 +88,20 @@ export function registerGetAnnouncements(server, apiClient, config) {
|
|
|
85
88
|
ttl: DEFAULT_CACHE_TTLS.announcements,
|
|
86
89
|
});
|
|
87
90
|
// Drop drafts, then map to clean objects
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
.
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
const published = newsItems.filter(isPublishedNewsItem).map(mapNewsItem);
|
|
92
|
+
const matched = cutoff
|
|
93
|
+
? published.filter((a) => matchesModifiedSince(a.lastModified, cutoff))
|
|
94
|
+
: published;
|
|
95
|
+
const announcements = matched.sort(newestFirst).slice(0, count);
|
|
93
96
|
log("INFO", `get_announcements: Retrieved ${announcements.length} announcements for course ${courseId}`);
|
|
94
|
-
return toolResponse(
|
|
97
|
+
return toolResponse(modifiedSince
|
|
98
|
+
? {
|
|
99
|
+
announcements,
|
|
100
|
+
modifiedSince,
|
|
101
|
+
returned: announcements.length,
|
|
102
|
+
filteredOut: published.length - matched.length,
|
|
103
|
+
}
|
|
104
|
+
: announcements);
|
|
95
105
|
}
|
|
96
106
|
// All courses case
|
|
97
107
|
// First, fetch enrolled courses
|
|
@@ -134,12 +144,22 @@ export function registerGetAnnouncements(server, apiClient, config) {
|
|
|
134
144
|
const allAnnouncements = results
|
|
135
145
|
.filter((r) => r.status === "fulfilled")
|
|
136
146
|
.flatMap((r) => r.value);
|
|
147
|
+
const allMatched = cutoff
|
|
148
|
+
? allAnnouncements.filter((a) => matchesModifiedSince(a.lastModified, cutoff))
|
|
149
|
+
: allAnnouncements;
|
|
137
150
|
// Sort by the scheduled date and slice to count
|
|
138
|
-
const announcements =
|
|
151
|
+
const announcements = allMatched
|
|
139
152
|
.sort(newestFirst)
|
|
140
153
|
.slice(0, count);
|
|
141
154
|
log("INFO", `get_announcements: Retrieved ${announcements.length} announcements (out of ${allAnnouncements.length} total across ${enrollmentResponse.Items.length} courses)`);
|
|
142
|
-
return toolResponse(
|
|
155
|
+
return toolResponse(modifiedSince
|
|
156
|
+
? {
|
|
157
|
+
announcements,
|
|
158
|
+
modifiedSince,
|
|
159
|
+
returned: announcements.length,
|
|
160
|
+
filteredOut: allAnnouncements.length - allMatched.length,
|
|
161
|
+
}
|
|
162
|
+
: announcements);
|
|
143
163
|
}
|
|
144
164
|
catch (error) {
|
|
145
165
|
return sanitizeError(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-announcements.js","sourceRoot":"","sources":["../../src/tools/get-announcements.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"get-announcements.js","sourceRoot":"","sources":["../../src/tools/get-announcements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-course-content.d.ts","sourceRoot":"","sources":["../../src/tools/get-course-content.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-course-content.d.ts","sourceRoot":"","sources":["../../src/tools/get-course-content.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAsB,MAAM,iBAAiB,CAAC;AAkOnE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,YAAY,GACtB,IAAI,CAyFN"}
|
|
@@ -7,6 +7,7 @@ import { DEFAULT_CACHE_TTLS } from "../api/index.js";
|
|
|
7
7
|
import { GetCourseContentSchema } from "./schemas.js";
|
|
8
8
|
import { toolResponse, sanitizeError } from "./tool-helpers.js";
|
|
9
9
|
import { convertHtmlToMarkdown } from "../utils/html-converter.js";
|
|
10
|
+
import { matchesModifiedSince } from "../utils/modified-since.js";
|
|
10
11
|
import { log } from "../utils/logger.js";
|
|
11
12
|
// Topic type mapping
|
|
12
13
|
const TOPIC_TYPE_MAP = {
|
|
@@ -71,6 +72,7 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
|
|
|
71
72
|
dueDate: item.ModuleDueDate ?? null,
|
|
72
73
|
isHidden: item.IsHidden,
|
|
73
74
|
isLocked: item.IsLocked,
|
|
75
|
+
lastModified: item.LastModifiedDate ?? null,
|
|
74
76
|
children: processedChildren,
|
|
75
77
|
});
|
|
76
78
|
}
|
|
@@ -91,6 +93,7 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
|
|
|
91
93
|
isHidden: item.IsHidden,
|
|
92
94
|
isLocked: item.IsLocked,
|
|
93
95
|
dueDate: item.DueDate ?? null,
|
|
96
|
+
lastModified: item.LastModifiedDate ?? null,
|
|
94
97
|
isCompleted: topicProgress?.IsRead ?? false,
|
|
95
98
|
completedDate: topicProgress?.DateCompleted ?? null,
|
|
96
99
|
};
|
|
@@ -113,6 +116,32 @@ async function buildContentTree(apiClient, courseId, modules, progressMap, typeF
|
|
|
113
116
|
}
|
|
114
117
|
return tree;
|
|
115
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Filter a content tree to items modified at or after cutoff.
|
|
121
|
+
*
|
|
122
|
+
* A module is kept when its own timestamp matches OR any descendant matched
|
|
123
|
+
* (even with zero matching children after recursion) — a matched topic with
|
|
124
|
+
* no surrounding module would be a result with no context, which is the
|
|
125
|
+
* failure mode #34 called out.
|
|
126
|
+
*/
|
|
127
|
+
function filterTreeByModifiedSince(tree, cutoff) {
|
|
128
|
+
const result = [];
|
|
129
|
+
for (const item of tree) {
|
|
130
|
+
if (item.type === 'topic') {
|
|
131
|
+
if (matchesModifiedSince(item.lastModified, cutoff)) {
|
|
132
|
+
result.push(item);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (item.type === 'module') {
|
|
136
|
+
const filteredChildren = filterTreeByModifiedSince(item.children ?? [], cutoff);
|
|
137
|
+
const moduleMatches = matchesModifiedSince(item.lastModified, cutoff);
|
|
138
|
+
if (moduleMatches || filteredChildren.length > 0) {
|
|
139
|
+
result.push({ ...item, children: filteredChildren });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
116
145
|
/**
|
|
117
146
|
* Count total topics in tree (for summary stats).
|
|
118
147
|
*/
|
|
@@ -155,7 +184,7 @@ export function registerGetCourseContent(server, apiClient) {
|
|
|
155
184
|
try {
|
|
156
185
|
log("DEBUG", "get_course_content tool called", { args });
|
|
157
186
|
// Parse and validate input
|
|
158
|
-
const { courseId, typeFilter = 'all', moduleTitle, maxDepth } = GetCourseContentSchema.parse(args);
|
|
187
|
+
const { courseId, typeFilter = 'all', moduleTitle, maxDepth, modifiedSince } = GetCourseContentSchema.parse(args);
|
|
159
188
|
// Fetch root modules
|
|
160
189
|
let rootModules = await apiClient.get(apiClient.le(courseId, '/content/root/'), { ttl: DEFAULT_CACHE_TTLS.courseContent });
|
|
161
190
|
// Filter root modules by title if specified
|
|
@@ -180,7 +209,17 @@ export function registerGetCourseContent(server, apiClient) {
|
|
|
180
209
|
progressMap.set(p.ContentObjectId, p);
|
|
181
210
|
}
|
|
182
211
|
// Recursively build content tree
|
|
183
|
-
|
|
212
|
+
let contentTree = await buildContentTree(apiClient, courseId, rootModules, progressMap, typeFilter, maxDepth);
|
|
213
|
+
// Apply modifiedSince filter, if requested, after the tree is built:
|
|
214
|
+
// a module's own timestamp may not change when a child topic does, so
|
|
215
|
+
// filtering has to see the whole tree to know which modules to keep.
|
|
216
|
+
let filteredOut = 0;
|
|
217
|
+
if (modifiedSince) {
|
|
218
|
+
const topicCountBeforeFilter = countTopics(contentTree);
|
|
219
|
+
const cutoff = new Date(modifiedSince);
|
|
220
|
+
contentTree = filterTreeByModifiedSince(contentTree, cutoff);
|
|
221
|
+
filteredOut = topicCountBeforeFilter - countTopics(contentTree);
|
|
222
|
+
}
|
|
184
223
|
const topicCount = countTopics(contentTree);
|
|
185
224
|
const moduleCount = countModules(contentTree);
|
|
186
225
|
log("INFO", `get_course_content: Retrieved ${moduleCount} modules and ${topicCount} topics for course ${courseId} (filter: ${typeFilter})`);
|
|
@@ -190,6 +229,7 @@ export function registerGetCourseContent(server, apiClient) {
|
|
|
190
229
|
contentTree,
|
|
191
230
|
topicCount,
|
|
192
231
|
moduleCount,
|
|
232
|
+
...(modifiedSince ? { modifiedSince, returned: topicCount, filteredOut } : {}),
|
|
193
233
|
});
|
|
194
234
|
}
|
|
195
235
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-course-content.js","sourceRoot":"","sources":["../../src/tools/get-course-content.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"get-course-content.js","sourceRoot":"","sources":["../../src/tools/get-course-content.ts"],"names":[],"mappings":"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"}
|
package/build/tools/schemas.d.ts
CHANGED
|
@@ -22,6 +22,7 @@ export declare const GetMyGradesSchema: z.ZodObject<{
|
|
|
22
22
|
export declare const GetAnnouncementsSchema: z.ZodObject<{
|
|
23
23
|
courseId: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
24
24
|
count: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
25
|
+
modifiedSince: z.ZodOptional<z.ZodString>;
|
|
25
26
|
}, z.core.$strip>;
|
|
26
27
|
export declare const GetAssignmentsSchema: z.ZodObject<{
|
|
27
28
|
courseId: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
@@ -37,6 +38,7 @@ export declare const GetCourseContentSchema: z.ZodObject<{
|
|
|
37
38
|
}>>>;
|
|
38
39
|
moduleTitle: z.ZodOptional<z.ZodString>;
|
|
39
40
|
maxDepth: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
41
|
+
modifiedSince: z.ZodOptional<z.ZodString>;
|
|
40
42
|
}, z.core.$strip>;
|
|
41
43
|
export declare const GetClasslistEmailsSchema: z.ZodObject<{
|
|
42
44
|
courseId: 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;;iBAU7B,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;iBAGpC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,sBAAsB
|
|
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;;;;iBAKjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;iBAG/B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;iBAWjC,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,wBAAwB;;;;;;iBAWnC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;iBAS1B,CAAC"}
|
package/build/tools/schemas.js
CHANGED
|
@@ -28,6 +28,8 @@ export const GetMyGradesSchema = z.object({
|
|
|
28
28
|
export const GetAnnouncementsSchema = z.object({
|
|
29
29
|
courseId: z.coerce.number().int().positive().optional().describe("Course ID to get announcements for. If omitted, returns recent announcements across all courses."),
|
|
30
30
|
count: z.coerce.number().int().min(1).max(50).default(10).describe("Maximum number of announcements to return"),
|
|
31
|
+
modifiedSince: z.string().datetime({ offset: true, message: "modifiedSince must be an ISO 8601 datetime, e.g. 2026-01-15T00:00:00Z" }).optional()
|
|
32
|
+
.describe("Only return announcements last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z). Announcements with no modified timestamp are always included. When set, the response reports how many announcements were filtered out."),
|
|
31
33
|
});
|
|
32
34
|
export const GetAssignmentsSchema = z.object({
|
|
33
35
|
courseId: z.coerce.number().int().positive().optional()
|
|
@@ -42,6 +44,8 @@ export const GetCourseContentSchema = z.object({
|
|
|
42
44
|
.describe("Case-insensitive substring match on module titles. Only returns modules whose title contains this string (e.g. 'Labs', 'Staff', 'Homeworks'). Children of matching modules are included in full."),
|
|
43
45
|
maxDepth: z.coerce.number().int().min(1).max(10).optional()
|
|
44
46
|
.describe("Limit recursive depth of the content tree. Depth 1 returns top-level modules with direct children only. Useful for getting a table of contents without all nested content."),
|
|
47
|
+
modifiedSince: z.string().datetime({ offset: true, message: "modifiedSince must be an ISO 8601 datetime, e.g. 2026-01-15T00:00:00Z" }).optional()
|
|
48
|
+
.describe("Only return topics last modified at or after this ISO 8601 datetime (e.g. 2026-01-15T00:00:00Z), plus any module that contains a matching topic. Topics with no modified timestamp are always included. When set, the response reports how many topics were filtered out."),
|
|
45
49
|
});
|
|
46
50
|
export const GetClasslistEmailsSchema = z.object({
|
|
47
51
|
courseId: z.coerce.number().int().positive()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,yEAAyE;IACzE,0EAA0E;IAC1E,2EAA2E;IAC3E,UAAU,EAAE,CAAC;SACV,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,wHAAwH,CACzH;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACnH,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACnG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mFAAmF,CAAC;CACtJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kGAAkG,CAAC;IACpK,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purdue Brightspace MCP Server
|
|
3
|
+
* Copyright (c) 2026 Rohan Muppa. All rights reserved.
|
|
4
|
+
* Licensed under MIT — see LICENSE file for details.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Whether an item's last-modified timestamp is at or after a cutoff.
|
|
8
|
+
*
|
|
9
|
+
* A null or unparseable timestamp counts as a match, not a miss. D2L sends
|
|
10
|
+
* null for some topics regardless of whether the item is new or old, and
|
|
11
|
+
* excluding them would silently drop content from a filtered listing — the
|
|
12
|
+
* same class of bug as #26, where graded work went missing from a listing
|
|
13
|
+
* with no indication anything was withheld. Comparison happens on epoch
|
|
14
|
+
* millis, which Date normalizes to UTC regardless of the source string's
|
|
15
|
+
* offset, so timezone-qualified and Z-suffixed inputs compare correctly
|
|
16
|
+
* against each other.
|
|
17
|
+
*/
|
|
18
|
+
export declare function matchesModifiedSince(lastModified: string | null | undefined, cutoff: Date): boolean;
|
|
19
|
+
//# sourceMappingURL=modified-since.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modified-since.d.ts","sourceRoot":"","sources":["../../src/utils/modified-since.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACvC,MAAM,EAAE,IAAI,GACX,OAAO,CAKT"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purdue Brightspace MCP Server
|
|
3
|
+
* Copyright (c) 2026 Rohan Muppa. All rights reserved.
|
|
4
|
+
* Licensed under MIT — see LICENSE file for details.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Whether an item's last-modified timestamp is at or after a cutoff.
|
|
8
|
+
*
|
|
9
|
+
* A null or unparseable timestamp counts as a match, not a miss. D2L sends
|
|
10
|
+
* null for some topics regardless of whether the item is new or old, and
|
|
11
|
+
* excluding them would silently drop content from a filtered listing — the
|
|
12
|
+
* same class of bug as #26, where graded work went missing from a listing
|
|
13
|
+
* with no indication anything was withheld. Comparison happens on epoch
|
|
14
|
+
* millis, which Date normalizes to UTC regardless of the source string's
|
|
15
|
+
* offset, so timezone-qualified and Z-suffixed inputs compare correctly
|
|
16
|
+
* against each other.
|
|
17
|
+
*/
|
|
18
|
+
export function matchesModifiedSince(lastModified, cutoff) {
|
|
19
|
+
if (!lastModified)
|
|
20
|
+
return true;
|
|
21
|
+
const time = new Date(lastModified).getTime();
|
|
22
|
+
if (Number.isNaN(time))
|
|
23
|
+
return true;
|
|
24
|
+
return time >= cutoff.getTime();
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=modified-since.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modified-since.js","sourceRoot":"","sources":["../../src/utils/modified-since.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAuC,EACvC,MAAY;IAEZ,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "brightspace-mcp-server",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"mcpName": "io.github.rohanmuppa/brightspace",
|
|
5
5
|
"description": "MCP server for Brightspace (D2L). Check grades, due dates, assignments, announcements, syllabus, rosters and more via Claude, ChatGPT, Cursor, Windsurf, or any MCP client.",
|
|
6
6
|
"type": "module",
|