gogcli-mcp-classroom 2.0.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/manifest.json ADDED
@@ -0,0 +1,268 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/anthropics/dxt/main/dist/mcpb-manifest.schema.json",
3
+ "manifest_version": "0.3",
4
+ "name": "gogcli-mcp-classroom",
5
+ "display_name": "gogcli (Classroom)",
6
+ "version": "2.0.0",
7
+ "description": "Extended Google Classroom for Claude via gogcli — auth + full Classroom support (courses, rosters, coursework, submissions, announcements, topics, invitations)",
8
+ "author": {
9
+ "name": "Chris Hall",
10
+ "email": "chris.c.hall@gmail.com",
11
+ "url": "https://github.com/chrischall"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/chrischall/gogcli-mcp"
16
+ },
17
+ "homepage": "https://github.com/chrischall/gogcli-mcp",
18
+ "support": "https://github.com/chrischall/gogcli-mcp/issues",
19
+ "license": "MIT",
20
+ "keywords": [
21
+ "google",
22
+ "classroom",
23
+ "education",
24
+ "gogcli",
25
+ "gog",
26
+ "courses",
27
+ "assignments",
28
+ "grading",
29
+ "students",
30
+ "teachers"
31
+ ],
32
+ "server": {
33
+ "type": "node",
34
+ "entry_point": "dist/index.js",
35
+ "mcp_config": {
36
+ "command": "node",
37
+ "args": [
38
+ "${__dirname}/dist/index.js"
39
+ ],
40
+ "env": {
41
+ "GOG_ACCOUNT": "${user_config.gog_account}",
42
+ "GOG_PATH": "${user_config.gog_path}"
43
+ }
44
+ }
45
+ },
46
+ "user_config": {
47
+ "gog_account": {
48
+ "type": "string",
49
+ "title": "Google Account",
50
+ "description": "Default Google account email (optional — uses gogcli's configured default if omitted)",
51
+ "required": false
52
+ },
53
+ "gog_path": {
54
+ "type": "string",
55
+ "title": "gog Executable Path",
56
+ "description": "Path to the gog executable (optional — defaults to 'gog' on your PATH)",
57
+ "required": false
58
+ }
59
+ },
60
+ "tools": [
61
+ {
62
+ "name": "gog_auth_add",
63
+ "description": "Authorize a Google account via browser-based OAuth"
64
+ },
65
+ {
66
+ "name": "gog_auth_list",
67
+ "description": "List all Google accounts stored in gogcli"
68
+ },
69
+ {
70
+ "name": "gog_auth_status",
71
+ "description": "Show gogcli auth configuration (keyring, credential files)"
72
+ },
73
+ {
74
+ "name": "gog_auth_services",
75
+ "description": "List Google services and OAuth scopes supported by gogcli"
76
+ },
77
+ {
78
+ "name": "gog_auth_run",
79
+ "description": "Run any gog auth subcommand (escape hatch)"
80
+ },
81
+ {
82
+ "name": "gog_classroom_courses_list",
83
+ "description": "List Google Classroom courses"
84
+ },
85
+ {
86
+ "name": "gog_classroom_courses_get",
87
+ "description": "Get a single course by ID"
88
+ },
89
+ {
90
+ "name": "gog_classroom_courses_create",
91
+ "description": "Create a new course"
92
+ },
93
+ {
94
+ "name": "gog_classroom_courses_update",
95
+ "description": "Update an existing course"
96
+ },
97
+ {
98
+ "name": "gog_classroom_courses_delete",
99
+ "description": "Delete a course"
100
+ },
101
+ {
102
+ "name": "gog_classroom_courses_archive",
103
+ "description": "Archive a course"
104
+ },
105
+ {
106
+ "name": "gog_classroom_courses_unarchive",
107
+ "description": "Unarchive a course"
108
+ },
109
+ {
110
+ "name": "gog_classroom_students_list",
111
+ "description": "List students in a course"
112
+ },
113
+ {
114
+ "name": "gog_classroom_students_get",
115
+ "description": "Get a specific student"
116
+ },
117
+ {
118
+ "name": "gog_classroom_students_add",
119
+ "description": "Add a student to a course"
120
+ },
121
+ {
122
+ "name": "gog_classroom_students_remove",
123
+ "description": "Remove a student from a course"
124
+ },
125
+ {
126
+ "name": "gog_classroom_teachers_list",
127
+ "description": "List teachers in a course"
128
+ },
129
+ {
130
+ "name": "gog_classroom_teachers_get",
131
+ "description": "Get a specific teacher"
132
+ },
133
+ {
134
+ "name": "gog_classroom_teachers_add",
135
+ "description": "Add a teacher to a course"
136
+ },
137
+ {
138
+ "name": "gog_classroom_teachers_remove",
139
+ "description": "Remove a teacher from a course"
140
+ },
141
+ {
142
+ "name": "gog_classroom_roster",
143
+ "description": "List the full course roster (students and/or teachers)"
144
+ },
145
+ {
146
+ "name": "gog_classroom_coursework_list",
147
+ "description": "List coursework (assignments) for a course"
148
+ },
149
+ {
150
+ "name": "gog_classroom_coursework_get",
151
+ "description": "Get a single coursework item"
152
+ },
153
+ {
154
+ "name": "gog_classroom_coursework_create",
155
+ "description": "Create coursework (assignment/question)"
156
+ },
157
+ {
158
+ "name": "gog_classroom_coursework_update",
159
+ "description": "Update existing coursework"
160
+ },
161
+ {
162
+ "name": "gog_classroom_coursework_delete",
163
+ "description": "Delete coursework"
164
+ },
165
+ {
166
+ "name": "gog_classroom_submissions_list",
167
+ "description": "List student submissions for coursework"
168
+ },
169
+ {
170
+ "name": "gog_classroom_submissions_get",
171
+ "description": "Get a single submission"
172
+ },
173
+ {
174
+ "name": "gog_classroom_submissions_grade",
175
+ "description": "Grade a submission"
176
+ },
177
+ {
178
+ "name": "gog_classroom_submissions_return",
179
+ "description": "Return a graded submission"
180
+ },
181
+ {
182
+ "name": "gog_classroom_submissions_turn_in",
183
+ "description": "Turn in a submission (student action)"
184
+ },
185
+ {
186
+ "name": "gog_classroom_submissions_reclaim",
187
+ "description": "Reclaim a turned-in submission (student action)"
188
+ },
189
+ {
190
+ "name": "gog_classroom_announcements_list",
191
+ "description": "List announcements"
192
+ },
193
+ {
194
+ "name": "gog_classroom_announcements_get",
195
+ "description": "Get an announcement"
196
+ },
197
+ {
198
+ "name": "gog_classroom_announcements_create",
199
+ "description": "Create an announcement"
200
+ },
201
+ {
202
+ "name": "gog_classroom_announcements_update",
203
+ "description": "Update an announcement"
204
+ },
205
+ {
206
+ "name": "gog_classroom_announcements_delete",
207
+ "description": "Delete an announcement"
208
+ },
209
+ {
210
+ "name": "gog_classroom_topics_list",
211
+ "description": "List topics in a course"
212
+ },
213
+ {
214
+ "name": "gog_classroom_topics_get",
215
+ "description": "Get a topic"
216
+ },
217
+ {
218
+ "name": "gog_classroom_topics_create",
219
+ "description": "Create a topic"
220
+ },
221
+ {
222
+ "name": "gog_classroom_topics_update",
223
+ "description": "Rename a topic"
224
+ },
225
+ {
226
+ "name": "gog_classroom_topics_delete",
227
+ "description": "Delete a topic"
228
+ },
229
+ {
230
+ "name": "gog_classroom_invitations_list",
231
+ "description": "List classroom invitations"
232
+ },
233
+ {
234
+ "name": "gog_classroom_invitations_get",
235
+ "description": "Get an invitation"
236
+ },
237
+ {
238
+ "name": "gog_classroom_invitations_create",
239
+ "description": "Create an invitation"
240
+ },
241
+ {
242
+ "name": "gog_classroom_invitations_accept",
243
+ "description": "Accept an invitation"
244
+ },
245
+ {
246
+ "name": "gog_classroom_invitations_delete",
247
+ "description": "Delete (revoke) an invitation"
248
+ },
249
+ {
250
+ "name": "gog_classroom_profile_get",
251
+ "description": "Get a classroom user profile (omit userId for self)"
252
+ },
253
+ {
254
+ "name": "gog_classroom_run",
255
+ "description": "Run any gog classroom subcommand (escape hatch)"
256
+ }
257
+ ],
258
+ "compatibility": {
259
+ "platforms": [
260
+ "darwin",
261
+ "linux",
262
+ "win32"
263
+ ],
264
+ "runtimes": {
265
+ "node": ">=18.0.0"
266
+ }
267
+ }
268
+ }
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "gogcli-mcp-classroom",
3
+ "version": "2.0.0",
4
+ "description": "Extended Google Classroom MCP server via gogcli — auth + full Classroom support",
5
+ "author": "Claude Code (AI) <https://www.anthropic.com/claude>",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/chrischall/gogcli-mcp"
9
+ },
10
+ "type": "module",
11
+ "bin": {
12
+ "gogcli-mcp-classroom": "dist/index.js"
13
+ },
14
+ "exports": {
15
+ ".": "./dist/index.js"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc --noEmit && npm run bundle",
19
+ "bundle": "node ../../scripts/bundle.js src/index.ts dist/index.js",
20
+ "typecheck": "tsc --noEmit",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "test:coverage": "vitest run --coverage"
24
+ },
25
+ "dependencies": {
26
+ "@modelcontextprotocol/sdk": "^1.29.0",
27
+ "zod": "^4.3.6"
28
+ },
29
+ "license": "MIT",
30
+ "keywords": [
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "claude",
34
+ "ai",
35
+ "google",
36
+ "gogcli",
37
+ "google-classroom",
38
+ "classroom",
39
+ "education"
40
+ ]
41
+ }
package/src/index.ts ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { createServer, registerAuthTools, registerClassroomTools } from '../../gogcli-mcp/src/lib.js';
4
+ import { registerExtraClassroomTools } from './tools/classroom-extra.js';
5
+
6
+ const server = createServer({ name: 'gogcli-classroom' });
7
+ registerAuthTools(server);
8
+ registerClassroomTools(server);
9
+ registerExtraClassroomTools(server);
10
+
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
@@ -0,0 +1,5 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+
3
+ export function registerExtraClassroomTools(_server: McpServer): void {
4
+ /* no extras yet */
5
+ }
@@ -0,0 +1,12 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerExtraClassroomTools } from '../../src/tools/classroom-extra.js';
4
+
5
+ describe('registerExtraClassroomTools', () => {
6
+ it('registers no tools (no extras yet)', () => {
7
+ const server = new McpServer({ name: 'test', version: '0.0.0' });
8
+ const spy = vi.spyOn(server, 'registerTool');
9
+ registerExtraClassroomTools(server);
10
+ expect(spy).not.toHaveBeenCalled();
11
+ });
12
+ });
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "../"
6
+ },
7
+ "include": ["src/**/*", "../gogcli-mcp/src/**/*"],
8
+ "exclude": ["node_modules", "dist"]
9
+ }
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ coverage: {
6
+ provider: 'v8',
7
+ include: ['src/**/*.ts'],
8
+ exclude: ['src/index.ts'],
9
+ thresholds: {
10
+ lines: 100,
11
+ functions: 100,
12
+ branches: 100,
13
+ statements: 100,
14
+ },
15
+ },
16
+ },
17
+ });