gogcli-mcp-drive 2.0.10 → 2.0.12
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +2 -2
- package/SKILL.md +2 -2
- package/dist/index.js +30 -5
- package/manifest.json +10 -2
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/tools/drive-extra.ts +30 -3
- package/tests/tools/drive-extra.test.ts +51 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
10
|
-
"version": "2.0.
|
|
10
|
+
"version": "2.0.12"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"displayName": "gogcli (Drive)",
|
|
16
16
|
"source": "./",
|
|
17
17
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
18
|
-
"version": "2.0.
|
|
18
|
+
"version": "2.0.12",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-drive",
|
|
3
3
|
"displayName": "gogcli (Drive)",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.12",
|
|
5
5
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Chris Hall",
|
package/README.md
CHANGED
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
> [!WARNING]
|
|
4
4
|
> **AI-developed project.** This codebase was built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). Review all code and tool permissions before use.
|
|
5
5
|
|
|
6
|
-
Extended Google Drive [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/
|
|
6
|
+
Extended Google Drive [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 13 additional dedicated Drive tools for upload/download, permissions, comments, shared drives, and more.
|
|
7
7
|
|
|
8
8
|
## Requirements
|
|
9
9
|
|
|
10
|
-
- [gogcli](https://github.com/
|
|
10
|
+
- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated
|
|
11
11
|
- Node.js 18+
|
|
12
12
|
|
|
13
13
|
```bash
|
package/SKILL.md
CHANGED
|
@@ -5,13 +5,13 @@ description: Use when the user asks to browse, upload, download, share, or manag
|
|
|
5
5
|
|
|
6
6
|
# gogcli-mcp-drive
|
|
7
7
|
|
|
8
|
-
Extended Google Drive MCP server via [gogcli](https://github.com/
|
|
8
|
+
Extended Google Drive MCP server via [gogcli](https://github.com/openclaw/gogcli) — 27 tools: auth + 9 base Drive + 13 extra dedicated Drive tools.
|
|
9
9
|
|
|
10
10
|
- **Source:** [github.com/chrischall/gogcli-mcp](https://github.com/chrischall/gogcli-mcp)
|
|
11
11
|
|
|
12
12
|
## Requirements
|
|
13
13
|
|
|
14
|
-
- [gogcli](https://github.com/
|
|
14
|
+
- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated
|
|
15
15
|
- Node.js 18 or later
|
|
16
16
|
|
|
17
17
|
## Setup
|
package/dist/index.js
CHANGED
|
@@ -31063,7 +31063,7 @@ async function run(args, options = {}) {
|
|
|
31063
31063
|
settled = true;
|
|
31064
31064
|
if (err.code === "ENOENT") {
|
|
31065
31065
|
reject(new Error(
|
|
31066
|
-
"gog executable not found. Install gogcli (https://github.com/
|
|
31066
|
+
"gog executable not found. Install gogcli (https://github.com/openclaw/gogcli) or set GOG_PATH in your MCP client config to the absolute binary path (run `which gog` in a terminal to find it)."
|
|
31067
31067
|
));
|
|
31068
31068
|
return;
|
|
31069
31069
|
}
|
|
@@ -31330,7 +31330,7 @@ function registerDriveTools(server2) {
|
|
|
31330
31330
|
var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
|
|
31331
31331
|
|
|
31332
31332
|
// ../gogcli-mcp/src/server.ts
|
|
31333
|
-
var VERSION = true ? "2.0.
|
|
31333
|
+
var VERSION = true ? "2.0.12" : "0.0.0";
|
|
31334
31334
|
function createServer(options) {
|
|
31335
31335
|
return new McpServer({
|
|
31336
31336
|
name: options?.name ?? "gogcli",
|
|
@@ -31502,15 +31502,40 @@ function registerExtraDriveTools(server2) {
|
|
|
31502
31502
|
return runOrDiagnose(["drive", "comments", "delete", fileId, commentId], { account });
|
|
31503
31503
|
});
|
|
31504
31504
|
server2.registerTool("gog_drive_comments_reply", {
|
|
31505
|
-
description:
|
|
31505
|
+
description: 'Reply to an existing comment on a Drive file. Pass `action: "resolve"` or `"reopen"` to atomically flip the parent comment\'s resolved state via the Drive API\'s Reply.action field \u2014 avoids the older workaround of deleting the comment (which destroys review-thread context).',
|
|
31506
31506
|
inputSchema: {
|
|
31507
31507
|
fileId: external_exports.string().describe("File ID"),
|
|
31508
31508
|
commentId: external_exports.string().describe("Comment ID to reply to"),
|
|
31509
31509
|
content: external_exports.string().describe("Reply text"),
|
|
31510
|
+
action: external_exports.enum(["resolve", "reopen"]).optional().describe("Optional action on the parent comment alongside the reply"),
|
|
31510
31511
|
account: accountParam
|
|
31511
31512
|
}
|
|
31512
|
-
}, async ({ fileId, commentId, content, account }) => {
|
|
31513
|
-
|
|
31513
|
+
}, async ({ fileId, commentId, content, action, account }) => {
|
|
31514
|
+
const args = ["drive", "comments", "reply", fileId, commentId, content];
|
|
31515
|
+
if (action) args.push(`--action=${action}`);
|
|
31516
|
+
return runOrDiagnose(args, { account });
|
|
31517
|
+
});
|
|
31518
|
+
server2.registerTool("gog_drive_comments_resolve", {
|
|
31519
|
+
description: 'Resolve a comment on a Drive file (mark as done) without posting a reply. To resolve while replying, use gog_drive_comments_reply with action: "resolve".',
|
|
31520
|
+
annotations: { destructiveHint: true },
|
|
31521
|
+
inputSchema: {
|
|
31522
|
+
fileId: external_exports.string().describe("File ID"),
|
|
31523
|
+
commentId: external_exports.string().describe("Comment ID to resolve"),
|
|
31524
|
+
account: accountParam
|
|
31525
|
+
}
|
|
31526
|
+
}, async ({ fileId, commentId, account }) => {
|
|
31527
|
+
return runOrDiagnose(["drive", "comments", "resolve", fileId, commentId], { account });
|
|
31528
|
+
});
|
|
31529
|
+
server2.registerTool("gog_drive_comments_reopen", {
|
|
31530
|
+
description: 'Reopen a previously resolved comment on a Drive file. To reopen while replying, use gog_drive_comments_reply with action: "reopen".',
|
|
31531
|
+
annotations: { destructiveHint: true },
|
|
31532
|
+
inputSchema: {
|
|
31533
|
+
fileId: external_exports.string().describe("File ID"),
|
|
31534
|
+
commentId: external_exports.string().describe("Comment ID to reopen"),
|
|
31535
|
+
account: accountParam
|
|
31536
|
+
}
|
|
31537
|
+
}, async ({ fileId, commentId, account }) => {
|
|
31538
|
+
return runOrDiagnose(["drive", "comments", "reopen", fileId, commentId], { account });
|
|
31514
31539
|
});
|
|
31515
31540
|
}
|
|
31516
31541
|
|
package/manifest.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"manifest_version": "0.3",
|
|
4
4
|
"name": "gogcli-mcp-drive",
|
|
5
5
|
"display_name": "gogcli (Drive)",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.12",
|
|
7
7
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Chris Hall",
|
|
@@ -163,7 +163,15 @@
|
|
|
163
163
|
},
|
|
164
164
|
{
|
|
165
165
|
"name": "gog_drive_comments_reply",
|
|
166
|
-
"description": "Reply to an existing comment"
|
|
166
|
+
"description": "Reply to an existing comment (optionally resolve/reopen the parent atomically via action)"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "gog_drive_comments_resolve",
|
|
170
|
+
"description": "Resolve a comment on a Drive file (mark as done)"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "gog_drive_comments_reopen",
|
|
174
|
+
"description": "Reopen a previously resolved comment"
|
|
167
175
|
}
|
|
168
176
|
],
|
|
169
177
|
"compatibility": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-drive",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.12",
|
|
4
4
|
"mcpName": "io.github.chrischall/gogcli-mcp-drive",
|
|
5
5
|
"description": "Extended Google Drive MCP server via gogcli — auth + full Drive support (upload/download/permissions/comments/shared drives)",
|
|
6
6
|
"author": "Claude Code (AI) <https://www.anthropic.com/claude>",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"source": "github",
|
|
8
8
|
"subfolder": "packages/gogcli-mcp-drive"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.0.
|
|
10
|
+
"version": "2.0.12",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp-drive",
|
|
15
|
-
"version": "2.0.
|
|
15
|
+
"version": "2.0.12",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/src/tools/drive-extra.ts
CHANGED
|
@@ -177,14 +177,41 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
177
177
|
});
|
|
178
178
|
|
|
179
179
|
server.registerTool('gog_drive_comments_reply', {
|
|
180
|
-
description: 'Reply to an existing comment on a Drive file.',
|
|
180
|
+
description: 'Reply to an existing comment on a Drive file. Pass `action: "resolve"` or `"reopen"` to atomically flip the parent comment\'s resolved state via the Drive API\'s Reply.action field — avoids the older workaround of deleting the comment (which destroys review-thread context).',
|
|
181
181
|
inputSchema: {
|
|
182
182
|
fileId: z.string().describe('File ID'),
|
|
183
183
|
commentId: z.string().describe('Comment ID to reply to'),
|
|
184
184
|
content: z.string().describe('Reply text'),
|
|
185
|
+
action: z.enum(['resolve', 'reopen']).optional().describe('Optional action on the parent comment alongside the reply'),
|
|
185
186
|
account: accountParam,
|
|
186
187
|
},
|
|
187
|
-
}, async ({ fileId, commentId, content, account }) => {
|
|
188
|
-
|
|
188
|
+
}, async ({ fileId, commentId, content, action, account }) => {
|
|
189
|
+
const args = ['drive', 'comments', 'reply', fileId, commentId, content];
|
|
190
|
+
if (action) args.push(`--action=${action}`);
|
|
191
|
+
return runOrDiagnose(args, { account });
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
server.registerTool('gog_drive_comments_resolve', {
|
|
195
|
+
description: 'Resolve a comment on a Drive file (mark as done) without posting a reply. To resolve while replying, use gog_drive_comments_reply with action: "resolve".',
|
|
196
|
+
annotations: { destructiveHint: true },
|
|
197
|
+
inputSchema: {
|
|
198
|
+
fileId: z.string().describe('File ID'),
|
|
199
|
+
commentId: z.string().describe('Comment ID to resolve'),
|
|
200
|
+
account: accountParam,
|
|
201
|
+
},
|
|
202
|
+
}, async ({ fileId, commentId, account }) => {
|
|
203
|
+
return runOrDiagnose(['drive', 'comments', 'resolve', fileId, commentId], { account });
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
server.registerTool('gog_drive_comments_reopen', {
|
|
207
|
+
description: 'Reopen a previously resolved comment on a Drive file. To reopen while replying, use gog_drive_comments_reply with action: "reopen".',
|
|
208
|
+
annotations: { destructiveHint: true },
|
|
209
|
+
inputSchema: {
|
|
210
|
+
fileId: z.string().describe('File ID'),
|
|
211
|
+
commentId: z.string().describe('Comment ID to reopen'),
|
|
212
|
+
account: accountParam,
|
|
213
|
+
},
|
|
214
|
+
}, async ({ fileId, commentId, account }) => {
|
|
215
|
+
return runOrDiagnose(['drive', 'comments', 'reopen', fileId, commentId], { account });
|
|
189
216
|
});
|
|
190
217
|
}
|
|
@@ -202,4 +202,55 @@ describe('gog_drive_comments_reply', () => {
|
|
|
202
202
|
{ account: undefined },
|
|
203
203
|
);
|
|
204
204
|
});
|
|
205
|
+
|
|
206
|
+
// gog 0.18.0: --action atomically flips resolved state on the parent comment.
|
|
207
|
+
it('passes --action=resolve when action provided', async () => {
|
|
208
|
+
await handlers.get('gog_drive_comments_reply')!({
|
|
209
|
+
fileId: 'f1', commentId: 'c1', content: 'lgtm, resolving', action: 'resolve',
|
|
210
|
+
});
|
|
211
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
212
|
+
['drive', 'comments', 'reply', 'f1', 'c1', 'lgtm, resolving', '--action=resolve'],
|
|
213
|
+
{ account: undefined },
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('passes --action=reopen when action provided', async () => {
|
|
218
|
+
await handlers.get('gog_drive_comments_reply')!({
|
|
219
|
+
fileId: 'f1', commentId: 'c1', content: 'actually wait', action: 'reopen',
|
|
220
|
+
});
|
|
221
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
222
|
+
['drive', 'comments', 'reply', 'f1', 'c1', 'actually wait', '--action=reopen'],
|
|
223
|
+
{ account: undefined },
|
|
224
|
+
);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// --- gog 0.18.0 ---
|
|
229
|
+
|
|
230
|
+
describe('gog_drive_comments_resolve', () => {
|
|
231
|
+
it('calls runOrDiagnose with fileId and commentId', async () => {
|
|
232
|
+
await handlers.get('gog_drive_comments_resolve')!({ fileId: 'f1', commentId: 'c1' });
|
|
233
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
234
|
+
['drive', 'comments', 'resolve', 'f1', 'c1'],
|
|
235
|
+
{ account: undefined },
|
|
236
|
+
);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('forwards account', async () => {
|
|
240
|
+
await handlers.get('gog_drive_comments_resolve')!({ fileId: 'f1', commentId: 'c1', account: 'a@b.com' });
|
|
241
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
242
|
+
['drive', 'comments', 'resolve', 'f1', 'c1'],
|
|
243
|
+
{ account: 'a@b.com' },
|
|
244
|
+
);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
describe('gog_drive_comments_reopen', () => {
|
|
249
|
+
it('calls runOrDiagnose with fileId and commentId', async () => {
|
|
250
|
+
await handlers.get('gog_drive_comments_reopen')!({ fileId: 'f1', commentId: 'c1' });
|
|
251
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
252
|
+
['drive', 'comments', 'reopen', 'f1', 'c1'],
|
|
253
|
+
{ account: undefined },
|
|
254
|
+
);
|
|
255
|
+
});
|
|
205
256
|
});
|