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.
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/dist/approvals/service.d.ts +9 -0
- package/dist/approvals/service.js +27 -0
- package/dist/approvals/service.js.map +1 -0
- package/dist/auth/bundled-oauth-client.d.ts +11 -0
- package/dist/auth/bundled-oauth-client.js +12 -0
- package/dist/auth/bundled-oauth-client.js.map +1 -0
- package/dist/auth/google-auth.d.ts +12 -0
- package/dist/auth/google-auth.js +145 -0
- package/dist/auth/google-auth.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -0
- package/dist/google/classroom.d.ts +39 -0
- package/dist/google/classroom.js +77 -0
- package/dist/google/classroom.js.map +1 -0
- package/dist/google/docs.d.ts +9 -0
- package/dist/google/docs.js +30 -0
- package/dist/google/docs.js.map +1 -0
- package/dist/google/drive.d.ts +4 -0
- package/dist/google/drive.js +61 -0
- package/dist/google/drive.js.map +1 -0
- package/dist/google/forms.d.ts +14 -0
- package/dist/google/forms.js +57 -0
- package/dist/google/forms.js.map +1 -0
- package/dist/google/sheets.d.ts +9 -0
- package/dist/google/sheets.js +33 -0
- package/dist/google/sheets.js.map +1 -0
- package/dist/google/slides.d.ts +9 -0
- package/dist/google/slides.js +63 -0
- package/dist/google/slides.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.js +211 -0
- package/dist/server.js.map +1 -0
- 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,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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAc,EAAE,QAAiB,EAAE,QAAiB;IACpF,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACpC,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEzE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACtC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACxB,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,mBAAmB;QAC5B,MAAM,EAAE,0DAA0D;KACnE,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,QAAiB;IAChE,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QACxC,WAAW,EAAE;YACX,IAAI;YACJ,QAAQ,EAAE,oCAAoC;YAC9C,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;SAC3C;QACD,MAAM,EAAE,6BAA6B;KACtC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,cAAuB;IACpE,IAAI,CAAC,cAAc;QAAE,OAAO;IAC5B,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;QACvB,MAAM;QACN,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;QAC9C,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,IAA4C,EAAE,IAAuC,EAAE,YAAqB,EAAE,MAAe;IAC3K,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;QAC9C,MAAM;QACN,qBAAqB,EAAE,OAAO,CAAC,YAAY,CAAC;QAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;QACjD,MAAM,EAAE,kCAAkC;KAC3C,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -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,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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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;
|