edu-workspace-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 (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/dist/approvals/service.d.ts +9 -0
  4. package/dist/approvals/service.js +27 -0
  5. package/dist/approvals/service.js.map +1 -0
  6. package/dist/auth/bundled-oauth-client.d.ts +11 -0
  7. package/dist/auth/bundled-oauth-client.js +12 -0
  8. package/dist/auth/bundled-oauth-client.js.map +1 -0
  9. package/dist/auth/google-auth.d.ts +12 -0
  10. package/dist/auth/google-auth.js +145 -0
  11. package/dist/auth/google-auth.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +63 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +7 -0
  16. package/dist/config.js +18 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/google/classroom.d.ts +39 -0
  19. package/dist/google/classroom.js +77 -0
  20. package/dist/google/classroom.js.map +1 -0
  21. package/dist/google/docs.d.ts +9 -0
  22. package/dist/google/docs.js +30 -0
  23. package/dist/google/docs.js.map +1 -0
  24. package/dist/google/drive.d.ts +4 -0
  25. package/dist/google/drive.js +61 -0
  26. package/dist/google/drive.js.map +1 -0
  27. package/dist/google/forms.d.ts +14 -0
  28. package/dist/google/forms.js +57 -0
  29. package/dist/google/forms.js.map +1 -0
  30. package/dist/google/sheets.d.ts +9 -0
  31. package/dist/google/sheets.js +33 -0
  32. package/dist/google/sheets.js.map +1 -0
  33. package/dist/google/slides.d.ts +9 -0
  34. package/dist/google/slides.js +63 -0
  35. package/dist/google/slides.js.map +1 -0
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.js +6 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/server.d.ts +22 -0
  40. package/dist/server.js +211 -0
  41. package/dist/server.js.map +1 -0
  42. package/package.json +39 -0
@@ -0,0 +1,77 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ export async function listCourses(query) {
4
+ const auth = await getAuthorizedClient();
5
+ const classroom = google.classroom({ version: "v1", auth });
6
+ const response = await classroom.courses.list({
7
+ courseStates: ["ACTIVE"],
8
+ teacherId: "me",
9
+ pageSize: 100
10
+ });
11
+ const normalized = (response.data.courses ?? []).map((course) => ({
12
+ id: course.id ?? "",
13
+ name: course.name ?? "이름 없는 수업",
14
+ section: course.section ?? undefined,
15
+ state: course.courseState ?? undefined,
16
+ alternateLink: course.alternateLink ?? undefined
17
+ }));
18
+ const needle = query?.trim().toLocaleLowerCase("ko-KR");
19
+ return needle
20
+ ? normalized.filter((course) => `${course.name} ${course.section ?? ""}`.toLocaleLowerCase("ko-KR").includes(needle))
21
+ : normalized;
22
+ }
23
+ function dueFields(dueAt) {
24
+ if (!dueAt)
25
+ return {};
26
+ const due = new Date(dueAt);
27
+ if (Number.isNaN(due.getTime()))
28
+ throw new Error("dueAt은 시간대가 포함된 ISO 8601 날짜여야 합니다.");
29
+ return {
30
+ dueDate: { year: due.getUTCFullYear(), month: due.getUTCMonth() + 1, day: due.getUTCDate() },
31
+ dueTime: { hours: due.getUTCHours(), minutes: due.getUTCMinutes(), seconds: due.getUTCSeconds() }
32
+ };
33
+ }
34
+ export async function createAssignmentDraft(input) {
35
+ const auth = await getAuthorizedClient();
36
+ const classroom = google.classroom({ version: "v1", auth });
37
+ const response = await classroom.courses.courseWork.create({
38
+ courseId: input.courseId,
39
+ requestBody: {
40
+ title: input.title,
41
+ description: input.description,
42
+ state: "DRAFT",
43
+ workType: "ASSIGNMENT",
44
+ maxPoints: input.maxPoints,
45
+ materials: input.materials?.map((material) => ({ link: material })),
46
+ ...dueFields(input.dueAt)
47
+ }
48
+ });
49
+ return {
50
+ courseId: input.courseId,
51
+ courseWorkId: response.data.id,
52
+ title: response.data.title,
53
+ state: response.data.state,
54
+ alternateLink: response.data.alternateLink,
55
+ dueDate: response.data.dueDate,
56
+ dueTime: response.data.dueTime,
57
+ materials: input.materials ?? []
58
+ };
59
+ }
60
+ export async function publishAssignment(courseId, courseWorkId) {
61
+ const auth = await getAuthorizedClient();
62
+ const classroom = google.classroom({ version: "v1", auth });
63
+ const response = await classroom.courses.courseWork.patch({
64
+ courseId,
65
+ id: courseWorkId,
66
+ updateMask: "state",
67
+ requestBody: { state: "PUBLISHED" }
68
+ });
69
+ return {
70
+ courseId,
71
+ courseWorkId,
72
+ state: response.data.state,
73
+ title: response.data.title,
74
+ alternateLink: response.data.alternateLink
75
+ };
76
+ }
77
+ //# sourceMappingURL=classroom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classroom.js","sourceRoot":"","sources":["../../src/google/classroom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type DocumentBlock = {
2
+ heading?: string;
3
+ text: string;
4
+ };
5
+ export declare function createDocument(title: string, blocks: DocumentBlock[], parentFolderId?: string): Promise<{
6
+ documentId: string;
7
+ title: string;
8
+ url: string;
9
+ }>;
@@ -0,0 +1,30 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ import { moveFile } from "./drive.js";
4
+ export async function createDocument(title, blocks, parentFolderId) {
5
+ const auth = await getAuthorizedClient();
6
+ const docs = google.docs({ version: "v1", auth });
7
+ const document = await docs.documents.create({ requestBody: { title } });
8
+ const documentId = document.data.documentId;
9
+ if (!documentId) {
10
+ throw new Error("Google Docs 문서 ID를 받지 못했습니다.");
11
+ }
12
+ const text = blocks
13
+ .map((block) => `${block.heading ? `${block.heading}\n` : ""}${block.text}\n\n`)
14
+ .join("");
15
+ if (text) {
16
+ await docs.documents.batchUpdate({
17
+ documentId,
18
+ requestBody: {
19
+ requests: [{ insertText: { location: { index: 1 }, text } }]
20
+ }
21
+ });
22
+ }
23
+ await moveFile(documentId, parentFolderId);
24
+ return {
25
+ documentId,
26
+ title,
27
+ url: `https://docs.google.com/document/d/${documentId}/edit`
28
+ };
29
+ }
30
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/google/docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,MAAuB,EAAE,cAAuB;IAClG,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;IAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,MAAM,CAAC;SAC/E,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC/B,UAAU;YACV,WAAW,EAAE;gBACX,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;aAC7D;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE3C,OAAO;QACL,UAAU;QACV,KAAK;QACL,GAAG,EAAE,sCAAsC,UAAU,OAAO;KAC7D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function searchFiles(query?: string, mimeType?: string, parentId?: string): Promise<import("googleapis").drive_v3.Schema$File[]>;
2
+ export declare function createFolder(name: string, parentId?: string): Promise<import("googleapis").drive_v3.Schema$File>;
3
+ export declare function moveFile(fileId: string, parentFolderId?: string): Promise<void>;
4
+ export declare function shareFile(fileId: string, type: "user" | "group" | "domain" | "anyone", role: "reader" | "commenter" | "writer", emailAddress?: string, domain?: string): Promise<import("googleapis").drive_v3.Schema$Permission>;
@@ -0,0 +1,61 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ function escapeDriveQuery(value) {
4
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
5
+ }
6
+ export async function searchFiles(query, mimeType, parentId) {
7
+ const auth = await getAuthorizedClient();
8
+ const drive = google.drive({ version: "v3", auth });
9
+ const filters = ["trashed = false"];
10
+ if (query)
11
+ filters.push(`name contains '${escapeDriveQuery(query)}'`);
12
+ if (mimeType)
13
+ filters.push(`mimeType = '${escapeDriveQuery(mimeType)}'`);
14
+ if (parentId)
15
+ filters.push(`'${escapeDriveQuery(parentId)}' in parents`);
16
+ const response = await drive.files.list({
17
+ q: filters.join(" and "),
18
+ pageSize: 100,
19
+ orderBy: "modifiedTime desc",
20
+ fields: "files(id,name,mimeType,webViewLink,parents,modifiedTime)"
21
+ });
22
+ return response.data.files ?? [];
23
+ }
24
+ export async function createFolder(name, parentId) {
25
+ const auth = await getAuthorizedClient();
26
+ const drive = google.drive({ version: "v3", auth });
27
+ const response = await drive.files.create({
28
+ requestBody: {
29
+ name,
30
+ mimeType: "application/vnd.google-apps.folder",
31
+ parents: parentId ? [parentId] : undefined
32
+ },
33
+ fields: "id,name,webViewLink,parents"
34
+ });
35
+ return response.data;
36
+ }
37
+ export async function moveFile(fileId, parentFolderId) {
38
+ if (!parentFolderId)
39
+ return;
40
+ const auth = await getAuthorizedClient();
41
+ const drive = google.drive({ version: "v3", auth });
42
+ const current = await drive.files.get({ fileId, fields: "parents" });
43
+ await drive.files.update({
44
+ fileId,
45
+ addParents: parentFolderId,
46
+ removeParents: current.data.parents?.join(","),
47
+ fields: "id,parents"
48
+ });
49
+ }
50
+ export async function shareFile(fileId, type, role, emailAddress, domain) {
51
+ const auth = await getAuthorizedClient();
52
+ const drive = google.drive({ version: "v3", auth });
53
+ const response = await drive.permissions.create({
54
+ fileId,
55
+ sendNotificationEmail: Boolean(emailAddress),
56
+ requestBody: { type, role, emailAddress, domain },
57
+ fields: "id,type,role,emailAddress,domain"
58
+ });
59
+ return response.data;
60
+ }
61
+ //# sourceMappingURL=drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/google/drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type QuizQuestion = {
2
+ title: string;
3
+ type: "MULTIPLE_CHOICE" | "SHORT_ANSWER" | "PARAGRAPH";
4
+ choices?: string[];
5
+ correctAnswer?: string;
6
+ points?: number;
7
+ required?: boolean;
8
+ };
9
+ export declare function createQuiz(title: string, description: string | undefined, questions: QuizQuestion[], parentFolderId?: string): Promise<{
10
+ formId: string;
11
+ title: string;
12
+ responderUrl: string | null | undefined;
13
+ editUrl: string;
14
+ }>;
@@ -0,0 +1,57 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ import { moveFile } from "./drive.js";
4
+ export async function createQuiz(title, description, questions, parentFolderId) {
5
+ const auth = await getAuthorizedClient();
6
+ const api = google.forms({ version: "v1", auth });
7
+ const created = await api.forms.create({ requestBody: { info: { title } } });
8
+ const formId = created.data.formId;
9
+ if (!formId)
10
+ throw new Error("Google Forms 문서 ID를 받지 못했습니다.");
11
+ const requests = [
12
+ {
13
+ updateSettings: {
14
+ settings: { quizSettings: { isQuiz: true } },
15
+ updateMask: "quizSettings.isQuiz"
16
+ }
17
+ }
18
+ ];
19
+ if (description) {
20
+ requests.push({ updateFormInfo: { info: { description }, updateMask: "description" } });
21
+ }
22
+ questions.forEach((question, index) => {
23
+ const questionBody = { required: question.required ?? true };
24
+ if (question.type === "MULTIPLE_CHOICE") {
25
+ questionBody.choiceQuestion = {
26
+ type: "RADIO",
27
+ options: (question.choices ?? []).map((value) => ({ value })),
28
+ shuffle: false
29
+ };
30
+ }
31
+ else {
32
+ questionBody.textQuestion = { paragraph: question.type === "PARAGRAPH" };
33
+ }
34
+ if (question.correctAnswer) {
35
+ questionBody.grading = {
36
+ pointValue: question.points ?? 1,
37
+ correctAnswers: { answers: [{ value: question.correctAnswer }] }
38
+ };
39
+ }
40
+ requests.push({
41
+ createItem: {
42
+ item: { title: question.title, questionItem: { question: questionBody } },
43
+ location: { index }
44
+ }
45
+ });
46
+ });
47
+ await api.forms.batchUpdate({ formId, requestBody: { requests } });
48
+ await moveFile(formId, parentFolderId);
49
+ const form = await api.forms.get({ formId });
50
+ return {
51
+ formId,
52
+ title,
53
+ responderUrl: form.data.responderUri,
54
+ editUrl: `https://docs.google.com/forms/d/${formId}/edit`
55
+ };
56
+ }
57
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/google/forms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type SheetDefinition = {
2
+ title: string;
3
+ rows?: Array<Array<string | number | boolean | null>>;
4
+ };
5
+ export declare function createWorkbook(title: string, sheets: SheetDefinition[], parentFolderId?: string): Promise<{
6
+ spreadsheetId: string;
7
+ title: string;
8
+ url: string;
9
+ }>;
@@ -0,0 +1,33 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ import { moveFile } from "./drive.js";
4
+ export async function createWorkbook(title, sheets, parentFolderId) {
5
+ const auth = await getAuthorizedClient();
6
+ const api = google.sheets({ version: "v4", auth });
7
+ const definitions = sheets.length ? sheets : [{ title: "Sheet1", rows: [] }];
8
+ const response = await api.spreadsheets.create({
9
+ requestBody: {
10
+ properties: { title },
11
+ sheets: definitions.map((sheet) => ({ properties: { title: sheet.title } }))
12
+ }
13
+ });
14
+ const spreadsheetId = response.data.spreadsheetId;
15
+ if (!spreadsheetId)
16
+ throw new Error("Google Sheets 문서 ID를 받지 못했습니다.");
17
+ const data = definitions
18
+ .filter((sheet) => sheet.rows?.length)
19
+ .map((sheet) => ({ range: `'${sheet.title.replace(/'/g, "''")}'!A1`, values: sheet.rows }));
20
+ if (data.length) {
21
+ await api.spreadsheets.values.batchUpdate({
22
+ spreadsheetId,
23
+ requestBody: { valueInputOption: "USER_ENTERED", data }
24
+ });
25
+ }
26
+ await moveFile(spreadsheetId, parentFolderId);
27
+ return {
28
+ spreadsheetId,
29
+ title,
30
+ url: `https://docs.google.com/spreadsheets/d/${spreadsheetId}/edit`
31
+ };
32
+ }
33
+ //# sourceMappingURL=sheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../src/google/sheets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,MAAyB,EAAE,cAAuB;IACpG,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;QAC7C,WAAW,EAAE;YACX,UAAU,EAAE,EAAE,KAAK,EAAE;YACrB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SAC7E;KACF,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;IAClD,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEtE,MAAM,IAAI,GAAG,WAAW;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;SACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9F,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC;YACxC,aAAa;YACb,WAAW,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,IAAI,EAAE;SACxD,CAAC,CAAC;IACL,CAAC;IACD,MAAM,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC9C,OAAO;QACL,aAAa;QACb,KAAK;QACL,GAAG,EAAE,0CAA0C,aAAa,OAAO;KACpE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type SlideDefinition = {
2
+ title: string;
3
+ body?: string;
4
+ };
5
+ export declare function createPresentation(title: string, slides: SlideDefinition[], parentFolderId?: string): Promise<{
6
+ presentationId: string;
7
+ title: string;
8
+ url: string;
9
+ }>;
@@ -0,0 +1,63 @@
1
+ import { google } from "googleapis";
2
+ import { getAuthorizedClient } from "../auth/google-auth.js";
3
+ import { moveFile } from "./drive.js";
4
+ export async function createPresentation(title, slides, parentFolderId) {
5
+ const auth = await getAuthorizedClient();
6
+ const api = google.slides({ version: "v1", auth });
7
+ const created = await api.presentations.create({ requestBody: { title } });
8
+ const presentationId = created.data.presentationId;
9
+ if (!presentationId)
10
+ throw new Error("Google Slides 문서 ID를 받지 못했습니다.");
11
+ const requests = [];
12
+ slides.forEach((slide, index) => {
13
+ const pageId = `slide_${index + 1}`;
14
+ const titleId = `title_${index + 1}`;
15
+ const bodyId = `body_${index + 1}`;
16
+ requests.push({ createSlide: { objectId: pageId, slideLayoutReference: { predefinedLayout: "BLANK" } } }, {
17
+ createShape: {
18
+ objectId: titleId,
19
+ shapeType: "TEXT_BOX",
20
+ elementProperties: {
21
+ pageObjectId: pageId,
22
+ size: { width: { magnitude: 640, unit: "PT" }, height: { magnitude: 60, unit: "PT" } },
23
+ transform: { scaleX: 1, scaleY: 1, translateX: 40, translateY: 30, unit: "PT" }
24
+ }
25
+ }
26
+ }, { insertText: { objectId: titleId, text: slide.title } }, {
27
+ updateTextStyle: {
28
+ objectId: titleId,
29
+ style: { fontSize: { magnitude: 28, unit: "PT" }, bold: true },
30
+ textRange: { type: "ALL" },
31
+ fields: "fontSize,bold"
32
+ }
33
+ });
34
+ if (slide.body) {
35
+ requests.push({
36
+ createShape: {
37
+ objectId: bodyId,
38
+ shapeType: "TEXT_BOX",
39
+ elementProperties: {
40
+ pageObjectId: pageId,
41
+ size: { width: { magnitude: 640, unit: "PT" }, height: { magnitude: 360, unit: "PT" } },
42
+ transform: { scaleX: 1, scaleY: 1, translateX: 40, translateY: 110, unit: "PT" }
43
+ }
44
+ }
45
+ }, { insertText: { objectId: bodyId, text: slide.body } }, {
46
+ updateTextStyle: {
47
+ objectId: bodyId,
48
+ style: { fontSize: { magnitude: 18, unit: "PT" } },
49
+ textRange: { type: "ALL" },
50
+ fields: "fontSize"
51
+ }
52
+ });
53
+ }
54
+ });
55
+ const initialSlideId = created.data.slides?.[0]?.objectId;
56
+ if (initialSlideId && slides.length)
57
+ requests.push({ deleteObject: { objectId: initialSlideId } });
58
+ if (requests.length)
59
+ await api.presentations.batchUpdate({ presentationId, requestBody: { requests } });
60
+ await moveFile(presentationId, parentFolderId);
61
+ return { presentationId, title, url: `https://docs.google.com/presentation/d/${presentationId}/edit` };
62
+ }
63
+ //# sourceMappingURL=slides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides.js","sourceRoot":"","sources":["../../src/google/slides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createServer } from "./server.js";
3
+ const server = createServer();
4
+ const transport = new StdioServerTransport();
5
+ await server.connect(transport);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { getAuthStatus } from "./auth/google-auth.js";
3
+ import { createAssignmentDraft, listCourses, publishAssignment } from "./google/classroom.js";
4
+ import { createDocument } from "./google/docs.js";
5
+ import { createFolder, searchFiles, shareFile } from "./google/drive.js";
6
+ import { createQuiz } from "./google/forms.js";
7
+ import { createWorkbook } from "./google/sheets.js";
8
+ import { createPresentation } from "./google/slides.js";
9
+ export type WorkspaceServices = {
10
+ getAuthStatus: typeof getAuthStatus;
11
+ listCourses: typeof listCourses;
12
+ searchFiles: typeof searchFiles;
13
+ createFolder: typeof createFolder;
14
+ createDocument: typeof createDocument;
15
+ createWorkbook: typeof createWorkbook;
16
+ createPresentation: typeof createPresentation;
17
+ createQuiz: typeof createQuiz;
18
+ createAssignmentDraft: typeof createAssignmentDraft;
19
+ publishAssignment: typeof publishAssignment;
20
+ shareFile: typeof shareFile;
21
+ };
22
+ export declare function createServer(overrides?: Partial<WorkspaceServices>): McpServer;