brightspace-mcp-server 3.0.4 → 3.2.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 +3 -17
- package/build/index.js +4 -3
- package/build/index.js.map +1 -1
- 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/get-video-transcript.d.ts +13 -0
- package/build/tools/get-video-transcript.d.ts.map +1 -0
- package/build/tools/get-video-transcript.js +168 -0
- package/build/tools/get-video-transcript.js.map +1 -0
- package/build/tools/index.d.ts +1 -0
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +1 -0
- package/build/tools/index.js.map +1 -1
- package/build/tools/schemas.d.ts +9 -0
- package/build/tools/schemas.d.ts.map +1 -1
- package/build/tools/schemas.js +16 -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/build/utils/transcript/captions.d.ts +40 -0
- package/build/utils/transcript/captions.d.ts.map +1 -0
- package/build/utils/transcript/captions.js +63 -0
- package/build/utils/transcript/captions.js.map +1 -0
- package/build/utils/transcript/errors.d.ts +14 -0
- package/build/utils/transcript/errors.d.ts.map +1 -0
- package/build/utils/transcript/errors.js +20 -0
- package/build/utils/transcript/errors.js.map +1 -0
- package/build/utils/transcript/kaltura.d.ts +8 -0
- package/build/utils/transcript/kaltura.d.ts.map +1 -0
- package/build/utils/transcript/kaltura.js +94 -0
- package/build/utils/transcript/kaltura.js.map +1 -0
- package/build/utils/transcript/platform.d.ts +23 -0
- package/build/utils/transcript/platform.d.ts.map +1 -0
- package/build/utils/transcript/platform.js +98 -0
- package/build/utils/transcript/platform.js.map +1 -0
- package/build/utils/transcript/types.d.ts +22 -0
- package/build/utils/transcript/types.d.ts.map +1 -0
- package/build/utils/transcript/types.js +7 -0
- package/build/utils/transcript/types.js.map +1 -0
- package/build/utils/transcript/youtube.d.ts +8 -0
- package/build/utils/transcript/youtube.d.ts.map +1 -0
- package/build/utils/transcript/youtube.js +57 -0
- package/build/utils/transcript/youtube.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
* YouTube transcript retrieval via its public timedtext endpoint. No
|
|
8
|
+
* authentication is needed — this is the same caption track a signed-out
|
|
9
|
+
* browser can fetch — so unlike Kaltura there is no session to reuse or fail
|
|
10
|
+
* to obtain.
|
|
11
|
+
*/
|
|
12
|
+
import { parseCaptions } from "./captions.js";
|
|
13
|
+
import { NoTranscriptError, TranscriptFetchError } from "./errors.js";
|
|
14
|
+
const TIMEDTEXT_BASE = "https://www.youtube.com/api/timedtext";
|
|
15
|
+
async function listCaptionTracks(videoId, fetchImpl) {
|
|
16
|
+
const res = await fetchImpl(`${TIMEDTEXT_BASE}?type=list&v=${encodeURIComponent(videoId)}`);
|
|
17
|
+
if (!res.ok) {
|
|
18
|
+
throw new TranscriptFetchError(`YouTube caption list request failed (HTTP ${res.status}).`);
|
|
19
|
+
}
|
|
20
|
+
const xml = await res.text();
|
|
21
|
+
return [...xml.matchAll(/<track\b[^>]*\blang_code="([^"]+)"/g)].map((m) => m[1]);
|
|
22
|
+
}
|
|
23
|
+
async function fetchTitle(videoId, fetchImpl) {
|
|
24
|
+
try {
|
|
25
|
+
const watchUrl = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`;
|
|
26
|
+
const res = await fetchImpl(`https://www.youtube.com/oembed?url=${encodeURIComponent(watchUrl)}&format=json`);
|
|
27
|
+
if (!res.ok)
|
|
28
|
+
return null;
|
|
29
|
+
const data = (await res.json());
|
|
30
|
+
return data.title ?? null;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export async function getYouTubeTranscript(videoId, fetchImpl) {
|
|
37
|
+
const tracks = await listCaptionTracks(videoId, fetchImpl);
|
|
38
|
+
if (tracks.length === 0) {
|
|
39
|
+
throw new NoTranscriptError("This YouTube video has no caption tracks available.");
|
|
40
|
+
}
|
|
41
|
+
const lang = tracks.find((t) => t.startsWith("en")) ?? tracks[0];
|
|
42
|
+
const res = await fetchImpl(`${TIMEDTEXT_BASE}?lang=${encodeURIComponent(lang)}&v=${encodeURIComponent(videoId)}&fmt=vtt`);
|
|
43
|
+
if (!res.ok) {
|
|
44
|
+
throw new TranscriptFetchError(`YouTube caption download failed (HTTP ${res.status}).`);
|
|
45
|
+
}
|
|
46
|
+
const vtt = await res.text();
|
|
47
|
+
if (!vtt.trim()) {
|
|
48
|
+
throw new NoTranscriptError("This YouTube video has no caption tracks available.");
|
|
49
|
+
}
|
|
50
|
+
const { format, cues } = parseCaptions(vtt);
|
|
51
|
+
if (cues.length === 0) {
|
|
52
|
+
throw new NoTranscriptError("This YouTube video has a caption track, but it contained no readable cues.");
|
|
53
|
+
}
|
|
54
|
+
const title = await fetchTitle(videoId, fetchImpl);
|
|
55
|
+
return { cues, format, language: lang, title, durationSeconds: null };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=youtube.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../../src/utils/transcript/youtube.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGtE,MAAM,cAAc,GAAG,uCAAuC,CAAC;AAE/D,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,SAAoB;IACpE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,cAAc,gBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAAC,6CAA6C,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,SAAoB;IAC7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,mCAAmC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,sCAAsC,kBAAkB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9G,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,SAAoB;IAC9E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,iBAAiB,CAAC,qDAAqD,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,GAAG,cAAc,SAAS,kBAAkB,CAAC,IAAI,CAAC,MAAM,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAC9F,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAAC,yCAAyC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,IAAI,iBAAiB,CAAC,qDAAqD,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,iBAAiB,CAAC,4EAA4E,CAAC,CAAC;IAC5G,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AACxE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "brightspace-mcp-server",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.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",
|