gogcli-mcp-docs 2.4.1 → 2.5.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.
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "metadata": {
9
9
  "description": "Extended Google Docs for Claude via gogcli — auth + full Docs and comments support",
10
- "version": "2.4.1"
10
+ "version": "2.5.0"
11
11
  },
12
12
  "plugins": [
13
13
  {
@@ -15,7 +15,7 @@
15
15
  "displayName": "gogcli (Docs)",
16
16
  "source": "./",
17
17
  "description": "Extended Google Docs for Claude via gogcli — auth + full Docs and comments support",
18
- "version": "2.4.1",
18
+ "version": "2.5.0",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp-docs",
3
3
  "displayName": "gogcli (Docs)",
4
- "version": "2.4.1",
4
+ "version": "2.5.0",
5
5
  "description": "Extended Google Docs for Claude via gogcli — auth + full Docs and comments support",
6
6
  "author": {
7
7
  "name": "Chris Hall",
package/dist/index.js CHANGED
@@ -31105,6 +31105,11 @@ var paginationParams = {
31105
31105
  page: external_exports.string().optional().describe("Page token"),
31106
31106
  all: external_exports.boolean().optional().describe("Fetch all pages")
31107
31107
  };
31108
+ function pushPaginationFlags(args, p) {
31109
+ if (p.max !== void 0) args.push(`--max=${p.max}`);
31110
+ if (p.page) args.push(`--page=${p.page}`);
31111
+ if (p.all) args.push("--all");
31112
+ }
31108
31113
  function registerRunTool(server2, options) {
31109
31114
  const { service, examples, omitAccount = false, note } = options;
31110
31115
  const baseDescription = `Run any gog ${service} subcommand not covered by the other tools. Run \`gog ${service} --help\` for the full list of subcommands, or \`gog ${service} <subcommand> --help\` for flags on a specific subcommand.`;
@@ -31313,7 +31318,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
31313
31318
  );
31314
31319
 
31315
31320
  // ../gogcli-mcp/src/server.ts
31316
- var VERSION = true ? "2.4.1" : "0.0.0";
31321
+ var VERSION = true ? "2.5.0" : "0.0.0";
31317
31322
  function createServer(options) {
31318
31323
  return new McpServer({
31319
31324
  name: options?.name ?? "gogcli",
@@ -31418,6 +31423,7 @@ function registerExtraDocsTools(server2) {
31418
31423
  noUnderline: external_exports.boolean().optional().describe("Clear underline"),
31419
31424
  strikethrough: external_exports.boolean().optional().describe("Set strikethrough"),
31420
31425
  noStrikethrough: external_exports.boolean().optional().describe("Clear strikethrough"),
31426
+ code: external_exports.boolean().optional().describe("Apply code style (Courier New monospace + grey background)"),
31421
31427
  alignment: external_exports.enum(["left", "center", "right", "justify", "start", "end", "justified"]).optional().describe("Paragraph alignment"),
31422
31428
  lineSpacing: external_exports.number().optional().describe("Line spacing percentage (e.g. 100 for single, 150 for 1.5x, 200 for double)"),
31423
31429
  headingLevel: external_exports.number().int().optional().describe("Set paragraph named style to HEADING_1..HEADING_6 (shortcut for namedStyle=HEADING_N)"),
@@ -31443,6 +31449,7 @@ function registerExtraDocsTools(server2) {
31443
31449
  if (a.noUnderline) argv.push("--no-underline");
31444
31450
  if (a.strikethrough) argv.push("--strikethrough");
31445
31451
  if (a.noStrikethrough) argv.push("--no-strikethrough");
31452
+ if (a.code) argv.push("--code");
31446
31453
  if (a.alignment) argv.push(`--alignment=${a.alignment}`);
31447
31454
  if (a.lineSpacing !== void 0) argv.push(`--line-spacing=${a.lineSpacing}`);
31448
31455
  if (a.headingLevel !== void 0) argv.push(`--heading-level=${a.headingLevel}`);
@@ -31566,11 +31573,15 @@ function registerExtraDocsTools(server2) {
31566
31573
  inputSchema: {
31567
31574
  docId: external_exports.string().describe("Doc ID (from the URL)"),
31568
31575
  includeResolved: external_exports.boolean().optional().describe("Include resolved comments (default: false, open only)"),
31576
+ since: external_exports.string().optional().describe("Only return comments modified at or after this RFC3339 timestamp (e.g. 2026-06-01T00:00:00Z)"),
31577
+ ...paginationParams,
31569
31578
  account: accountParam
31570
31579
  }
31571
- }, async ({ docId, includeResolved, account }) => {
31580
+ }, async ({ docId, includeResolved, since, max, page, all, account }) => {
31572
31581
  const args = ["docs", "comments", "list", docId];
31573
31582
  if (includeResolved) args.push("--include-resolved");
31583
+ if (since) args.push(`--since=${since}`);
31584
+ pushPaginationFlags(args, { max, page, all });
31574
31585
  return runOrDiagnose(args, { account });
31575
31586
  });
31576
31587
  server2.registerTool("gog_docs_comments_get", {
@@ -31644,6 +31655,27 @@ function registerExtraDocsTools(server2) {
31644
31655
  }, async ({ docId, commentId, account }) => {
31645
31656
  return runOrDiagnose(["docs", "comments", "reopen", docId, commentId], { account });
31646
31657
  });
31658
+ server2.registerTool("gog_docs_table_column_width", {
31659
+ description: "Set a fixed width (in points) for a table column, or reset columns to Docs-managed even distribution. Target the table by 1-based index in document order (negative counts from the end) and the column by 1-based number. Pass evenlyDistributed without col to reset every column in the table.",
31660
+ annotations: { destructiveHint: true },
31661
+ inputSchema: {
31662
+ docId: external_exports.string().describe("Doc ID (from the URL)"),
31663
+ col: external_exports.number().int().optional().describe("1-based column number. Omit with evenlyDistributed to reset all columns."),
31664
+ width: external_exports.number().optional().describe("Fixed column width in points (minimum 5pt). Mutually exclusive with evenlyDistributed."),
31665
+ evenlyDistributed: external_exports.boolean().optional().describe("Reset the selected column (or all columns when col is omitted) to Docs-managed equal width."),
31666
+ tableIndex: external_exports.number().int().optional().describe("1-based table index in document order; negative counts from the end (default: 1)"),
31667
+ tab: external_exports.string().optional().describe("Target tab title or ID"),
31668
+ account: accountParam
31669
+ }
31670
+ }, async ({ docId, col, width, evenlyDistributed, tableIndex, tab, account }) => {
31671
+ const args = ["docs", "table-column-width", docId];
31672
+ if (col !== void 0) args.push(`--col=${col}`);
31673
+ if (width !== void 0) args.push(`--width=${width}`);
31674
+ if (evenlyDistributed) args.push("--evenly-distributed");
31675
+ if (tableIndex !== void 0) args.push(`--table-index=${tableIndex}`);
31676
+ if (tab) args.push(`--tab=${tab}`);
31677
+ return runOrDiagnose(args, { account });
31678
+ });
31647
31679
  server2.registerTool("gog_docs_insert_page_break", {
31648
31680
  description: "Insert a Google Docs page break via InsertPageBreakRequest \u2014 the only path for multi-page deliverables (markdown has no page-break construct). Specify `index` for a precise character position, or `atEnd` for end-of-doc.",
31649
31681
  annotations: { destructiveHint: true },
package/manifest.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "manifest_version": "0.3",
4
4
  "name": "gogcli-mcp-docs",
5
5
  "display_name": "gogcli (Docs)",
6
- "version": "2.4.1",
6
+ "version": "2.5.0",
7
7
  "description": "Extended Google Docs for Claude via gogcli — auth + full Docs and comments support",
8
8
  "author": {
9
9
  "name": "Chris Hall",
@@ -195,6 +195,10 @@
195
195
  "name": "gog_docs_comments_reopen",
196
196
  "description": "Reopen a previously resolved comment."
197
197
  },
198
+ {
199
+ "name": "gog_docs_table_column_width",
200
+ "description": "Set a fixed table column width in points, or reset columns to Docs-managed even distribution."
201
+ },
198
202
  {
199
203
  "name": "gog_docs_insert_page_break",
200
204
  "description": "Insert a Google Docs page break at a given index or at end-of-doc — the only path for multi-page deliverables."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-docs",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp-docs",
5
5
  "description": "Extended Google Docs MCP server via gogcli — all base tools plus full Docs support",
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-docs"
9
9
  },
10
- "version": "2.4.1",
10
+ "version": "2.5.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-docs",
15
- "version": "2.4.1",
15
+ "version": "2.5.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { z } from 'zod';
3
- import { accountParam, runOrDiagnose } from '../../../gogcli-mcp/src/lib.js';
3
+ import { accountParam, runOrDiagnose, paginationParams, pushPaginationFlags } from '../../../gogcli-mcp/src/lib.js';
4
4
 
5
5
  export function registerExtraDocsTools(server: McpServer): void {
6
6
  server.registerTool('gog_docs_copy', {
@@ -103,6 +103,7 @@ export function registerExtraDocsTools(server: McpServer): void {
103
103
  noUnderline: z.boolean().optional().describe('Clear underline'),
104
104
  strikethrough: z.boolean().optional().describe('Set strikethrough'),
105
105
  noStrikethrough: z.boolean().optional().describe('Clear strikethrough'),
106
+ code: z.boolean().optional().describe('Apply code style (Courier New monospace + grey background)'),
106
107
  alignment: z.enum(['left', 'center', 'right', 'justify', 'start', 'end', 'justified']).optional().describe('Paragraph alignment'),
107
108
  lineSpacing: z.number().optional().describe('Line spacing percentage (e.g. 100 for single, 150 for 1.5x, 200 for double)'),
108
109
  headingLevel: z.number().int().optional().describe('Set paragraph named style to HEADING_1..HEADING_6 (shortcut for namedStyle=HEADING_N)'),
@@ -124,6 +125,7 @@ export function registerExtraDocsTools(server: McpServer): void {
124
125
  italic?: boolean; noItalic?: boolean;
125
126
  underline?: boolean; noUnderline?: boolean;
126
127
  strikethrough?: boolean; noStrikethrough?: boolean;
128
+ code?: boolean;
127
129
  alignment?: string;
128
130
  lineSpacing?: number;
129
131
  headingLevel?: number;
@@ -147,6 +149,7 @@ export function registerExtraDocsTools(server: McpServer): void {
147
149
  if (a.noUnderline) argv.push('--no-underline');
148
150
  if (a.strikethrough) argv.push('--strikethrough');
149
151
  if (a.noStrikethrough) argv.push('--no-strikethrough');
152
+ if (a.code) argv.push('--code');
150
153
  if (a.alignment) argv.push(`--alignment=${a.alignment}`);
151
154
  if (a.lineSpacing !== undefined) argv.push(`--line-spacing=${a.lineSpacing}`);
152
155
  if (a.headingLevel !== undefined) argv.push(`--heading-level=${a.headingLevel}`);
@@ -279,11 +282,15 @@ export function registerExtraDocsTools(server: McpServer): void {
279
282
  inputSchema: {
280
283
  docId: z.string().describe('Doc ID (from the URL)'),
281
284
  includeResolved: z.boolean().optional().describe('Include resolved comments (default: false, open only)'),
285
+ since: z.string().optional().describe('Only return comments modified at or after this RFC3339 timestamp (e.g. 2026-06-01T00:00:00Z)'),
286
+ ...paginationParams,
282
287
  account: accountParam,
283
288
  },
284
- }, async ({ docId, includeResolved, account }) => {
289
+ }, async ({ docId, includeResolved, since, max, page, all, account }) => {
285
290
  const args = ['docs', 'comments', 'list', docId];
286
291
  if (includeResolved) args.push('--include-resolved');
292
+ if (since) args.push(`--since=${since}`);
293
+ pushPaginationFlags(args, { max, page, all });
287
294
  return runOrDiagnose(args, { account });
288
295
  });
289
296
 
@@ -365,6 +372,28 @@ export function registerExtraDocsTools(server: McpServer): void {
365
372
  return runOrDiagnose(['docs', 'comments', 'reopen', docId, commentId], { account });
366
373
  });
367
374
 
375
+ server.registerTool('gog_docs_table_column_width', {
376
+ description: 'Set a fixed width (in points) for a table column, or reset columns to Docs-managed even distribution. Target the table by 1-based index in document order (negative counts from the end) and the column by 1-based number. Pass evenlyDistributed without col to reset every column in the table.',
377
+ annotations: { destructiveHint: true },
378
+ inputSchema: {
379
+ docId: z.string().describe('Doc ID (from the URL)'),
380
+ col: z.number().int().optional().describe('1-based column number. Omit with evenlyDistributed to reset all columns.'),
381
+ width: z.number().optional().describe('Fixed column width in points (minimum 5pt). Mutually exclusive with evenlyDistributed.'),
382
+ evenlyDistributed: z.boolean().optional().describe('Reset the selected column (or all columns when col is omitted) to Docs-managed equal width.'),
383
+ tableIndex: z.number().int().optional().describe('1-based table index in document order; negative counts from the end (default: 1)'),
384
+ tab: z.string().optional().describe('Target tab title or ID'),
385
+ account: accountParam,
386
+ },
387
+ }, async ({ docId, col, width, evenlyDistributed, tableIndex, tab, account }) => {
388
+ const args = ['docs', 'table-column-width', docId];
389
+ if (col !== undefined) args.push(`--col=${col}`);
390
+ if (width !== undefined) args.push(`--width=${width}`);
391
+ if (evenlyDistributed) args.push('--evenly-distributed');
392
+ if (tableIndex !== undefined) args.push(`--table-index=${tableIndex}`);
393
+ if (tab) args.push(`--tab=${tab}`);
394
+ return runOrDiagnose(args, { account });
395
+ });
396
+
368
397
  server.registerTool('gog_docs_insert_page_break', {
369
398
  description: 'Insert a Google Docs page break via InsertPageBreakRequest — the only path for multi-page deliverables (markdown has no page-break construct). Specify `index` for a precise character position, or `atEnd` for end-of-doc.',
370
399
  annotations: { destructiveHint: true },
@@ -446,6 +446,53 @@ describe('gog_docs_comments_list', () => {
446
446
  { account: 'other@gmail.com' },
447
447
  );
448
448
  });
449
+
450
+ // gog 0.22.0 adds --since; pagination flags were already supported by gog.
451
+ it('includes --since and pagination flags when set', async () => {
452
+ vi.mocked(lib.runOrDiagnose).mockResolvedValue(toText('{}'));
453
+ const handlers = setupHandlers();
454
+ await handlers.get('gog_docs_comments_list')!({
455
+ docId: 'abc', includeResolved: true, since: '2026-06-01T00:00:00Z', max: 10, page: 'tok', all: true,
456
+ });
457
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
458
+ ['docs', 'comments', 'list', 'abc', '--include-resolved', '--since=2026-06-01T00:00:00Z', '--max=10', '--page=tok', '--all'],
459
+ { account: undefined },
460
+ );
461
+ });
462
+ });
463
+
464
+ describe('gog_docs_table_column_width', () => {
465
+ it('sets a fixed column width', async () => {
466
+ vi.mocked(lib.runOrDiagnose).mockResolvedValue(toText('{}'));
467
+ const handlers = setupHandlers();
468
+ await handlers.get('gog_docs_table_column_width')!({
469
+ docId: 'd1', col: 2, width: 120, tableIndex: 1, tab: 'Body',
470
+ });
471
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
472
+ ['docs', 'table-column-width', 'd1', '--col=2', '--width=120', '--table-index=1', '--tab=Body'],
473
+ { account: undefined },
474
+ );
475
+ });
476
+
477
+ it('resets all columns to even distribution', async () => {
478
+ vi.mocked(lib.runOrDiagnose).mockResolvedValue(toText('{}'));
479
+ const handlers = setupHandlers();
480
+ await handlers.get('gog_docs_table_column_width')!({ docId: 'd1', evenlyDistributed: true });
481
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
482
+ ['docs', 'table-column-width', 'd1', '--evenly-distributed'],
483
+ { account: undefined },
484
+ );
485
+ });
486
+
487
+ it('forwards account override', async () => {
488
+ vi.mocked(lib.runOrDiagnose).mockResolvedValue(toText('{}'));
489
+ const handlers = setupHandlers();
490
+ await handlers.get('gog_docs_table_column_width')!({ docId: 'd1', col: 1, width: 80, account: 'other@gmail.com' });
491
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
492
+ ['docs', 'table-column-width', 'd1', '--col=1', '--width=80'],
493
+ { account: 'other@gmail.com' },
494
+ );
495
+ });
449
496
  });
450
497
 
451
498
  describe('gog_docs_comments_get', () => {
@@ -718,6 +765,17 @@ describe('gog_docs_format', () => {
718
765
  { account: undefined },
719
766
  );
720
767
  });
768
+
769
+ // gog 0.22.0
770
+ it('passes --code when code is true', async () => {
771
+ vi.mocked(lib.runOrDiagnose).mockResolvedValue(toText('{}'));
772
+ const handlers = setupHandlers();
773
+ await handlers.get('gog_docs_format')!({ docId: 'd1', match: 'snippet', code: true });
774
+ expect(lib.runOrDiagnose).toHaveBeenCalledWith(
775
+ ['docs', 'format', 'd1', '--match=snippet', '--code'],
776
+ { account: undefined },
777
+ );
778
+ });
721
779
  });
722
780
 
723
781
  // --- gog 0.18.0 new tools ---