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.
@@ -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"
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.10",
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.10",
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/steipete/gogcli). Includes auth tools plus 13 additional dedicated Drive tools for upload/download, permissions, comments, shared drives, and more.
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/steipete/gogcli) installed and authenticated
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/steipete/gogcli) — 27 tools: auth + 9 base Drive + 13 extra dedicated Drive tools.
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/steipete/gogcli) installed and authenticated
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/steipete/gogcli) or set GOG_PATH in your MCP client config to the absolute binary path (run `which gog` in a terminal to find it)."
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.10" : "0.0.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: "Reply to an existing comment on a Drive file.",
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
- return runOrDiagnose(["drive", "comments", "reply", fileId, commentId, content], { account });
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.10",
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.10",
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",
10
+ "version": "2.0.12",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-drive",
15
- "version": "2.0.10",
15
+ "version": "2.0.12",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -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
- return runOrDiagnose(['drive', 'comments', 'reply', fileId, commentId, content], { account });
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
  });