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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/index.js +34 -2
- package/manifest.json +5 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/tools/docs-extra.ts +31 -2
- package/tests/tools/docs-extra.test.ts +58 -0
|
@@ -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.
|
|
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.
|
|
18
|
+
"version": "2.5.0",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
10
|
+
"version": "2.5.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp-docs",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.5.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/src/tools/docs-extra.ts
CHANGED
|
@@ -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 ---
|