gogcli-mcp-docs 2.0.10 → 2.0.11

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.0.10"
10
+ "version": "2.0.11"
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.0.10",
18
+ "version": "2.0.11",
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.0.10",
4
+ "version": "2.0.11",
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/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 Docs [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/steipete/gogcli). Includes auth tools plus 14 additional dedicated Docs tools for editing, exporting, comments, and more.
6
+ Extended Google Docs [MCP](https://modelcontextprotocol.io) server via [gogcli](https://github.com/openclaw/gogcli). Includes auth tools plus 18 additional dedicated Docs tools for editing, exporting, comments, 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
@@ -44,19 +44,23 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
44
44
  claude mcp add gogcli-docs -- gogcli-mcp-docs
45
45
  ```
46
46
 
47
- ## Extra Docs Tools (14)
47
+ ## Extra Docs Tools (18)
48
48
 
49
49
  Plus 5 auth tools and 7 base Docs tools (info, cat, create, write, find-replace, structure, run).
50
50
 
51
51
  | Tool | Description |
52
52
  |------|-------------|
53
+ | `gog_docs_append` | Append text or markdown to the end of a doc |
53
54
  | `gog_docs_copy` | Copy a document |
54
55
  | `gog_docs_delete` | Delete content by character index range |
55
56
  | `gog_docs_edit` | Find and replace with case-sensitivity control |
56
57
  | `gog_docs_export` | Export as PDF, TXT, HTML, DOCX, RTF, ODT, or EPUB |
58
+ | `gog_docs_format` | Apply character / paragraph formatting (bold, color, alignment, …) |
57
59
  | `gog_docs_insert` | Insert text at a specific position |
58
60
  | `gog_docs_list_tabs` | List all document tabs |
61
+ | `gog_docs_read` | Read doc as plain text or raw JSON |
59
62
  | `gog_docs_sed` | Stream-edit with sed-like regex expressions |
63
+ | `gog_docs_trash` | Move a doc to Drive trash |
60
64
  | `gog_docs_update` | Update document content at a specific position |
61
65
  | `gog_docs_comments_list` | List comments (open or resolved) |
62
66
  | `gog_docs_comments_get` | Get a comment with its replies |
@@ -65,6 +69,16 @@ Plus 5 auth tools and 7 base Docs tools (info, cat, create, write, find-replace,
65
69
  | `gog_docs_comments_resolve` | Resolve a comment |
66
70
  | `gog_docs_comments_delete` | Delete a comment |
67
71
 
72
+ ## Known limitations: `gog_docs_append` with `markdown: true`
73
+
74
+ These bugs live in gogcli's upstream markdown → Docs converter; the wrapper just passes `--markdown` through. Tracked upstream:
75
+
76
+ | Symptom | Workaround | Upstream |
77
+ |---------|-----------|----------|
78
+ | 3+ tables in one call reorders the trailing punctuation of the paragraph before the 3rd table | Split into multiple calls with ≤2 tables each | [openclaw/gogcli#607](https://github.com/openclaw/gogcli/issues/607) |
79
+ | Inline `**bold**` / `*italic*` / `` `code` `` inside table cells renders as literal characters | Insert plain cell text, then apply formatting via `gog_docs_format` | [openclaw/gogcli#608](https://github.com/openclaw/gogcli/issues/608) |
80
+ | Tables with an empty header row leak the last data row as literal pipe text | Always supply a non-empty header row | [openclaw/gogcli#609](https://github.com/openclaw/gogcli/issues/609) |
81
+
68
82
  ## License
69
83
 
70
84
  MIT
package/SKILL.md CHANGED
@@ -5,13 +5,13 @@ description: Use when the user asks to read, write, edit, export, or comment on
5
5
 
6
6
  # gogcli-mcp-docs
7
7
 
8
- Extended Google Docs MCP server via [gogcli](https://github.com/steipete/gogcli) — 26 tools: auth + 7 base Docs + 14 extra dedicated Docs tools.
8
+ Extended Google Docs MCP server via [gogcli](https://github.com/openclaw/gogcli) — 30 tools: auth + 7 base Docs + 18 extra dedicated Docs 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
@@ -34,13 +34,17 @@ Extended Google Docs MCP server via [gogcli](https://github.com/steipete/gogcli)
34
34
 
35
35
  | Tool | What it does |
36
36
  |------|-------------|
37
+ | `gog_docs_append` | Append text or markdown to the end of a doc |
37
38
  | `gog_docs_copy` | Copy a document |
38
39
  | `gog_docs_delete` | Delete content by character index range |
39
40
  | `gog_docs_edit` | Find and replace with case-sensitivity |
40
41
  | `gog_docs_export` | Export as PDF, TXT, HTML, DOCX, RTF, ODT, or EPUB |
42
+ | `gog_docs_format` | Apply character / paragraph formatting |
41
43
  | `gog_docs_insert` | Insert text at a specific position |
42
44
  | `gog_docs_list_tabs` | List all document tabs |
45
+ | `gog_docs_read` | Read doc as plain text or raw JSON |
43
46
  | `gog_docs_sed` | Stream-edit with sed-like regex |
47
+ | `gog_docs_trash` | Move a doc to Drive trash |
44
48
  | `gog_docs_update` | Update content at a specific position |
45
49
  | `gog_docs_comments_list` | List comments (open or resolved) |
46
50
  | `gog_docs_comments_get` | Get a comment with replies |
@@ -50,3 +54,11 @@ Extended Google Docs MCP server via [gogcli](https://github.com/steipete/gogcli)
50
54
  | `gog_docs_comments_delete` | Delete a comment |
51
55
 
52
56
  Plus 5 auth tools and 7 base Docs tools.
57
+
58
+ ### `gog_docs_append` with `markdown: true` — known limitations
59
+
60
+ Three bugs in gogcli's upstream markdown→Docs converter to be aware of:
61
+
62
+ - **3+ tables in one call** reorders the trailing punctuation of the paragraph before the 3rd table — split into multiple calls with ≤2 tables each ([openclaw/gogcli#607](https://github.com/openclaw/gogcli/issues/607)).
63
+ - **Inline `**bold**` / `*italic*` / `` `code` `` inside table cells** renders as literal characters — insert plain cell text, then apply formatting via `gog_docs_format` ([openclaw/gogcli#608](https://github.com/openclaw/gogcli/issues/608)).
64
+ - **Empty-header tables** leak the last data row as literal pipe text — always supply a non-empty header row ([openclaw/gogcli#609](https://github.com/openclaw/gogcli/issues/609)).
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
  }
@@ -31292,7 +31292,7 @@ function registerDocsTools(server2) {
31292
31292
  var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
31293
31293
 
31294
31294
  // ../gogcli-mcp/src/server.ts
31295
- var VERSION = true ? "2.0.10" : "0.0.0";
31295
+ var VERSION = true ? "2.0.11" : "0.0.0";
31296
31296
  function createServer(options) {
31297
31297
  return new McpServer({
31298
31298
  name: options?.name ?? "gogcli",
@@ -31459,13 +31459,13 @@ function registerExtraDocsTools(server2) {
31459
31459
  return runOrDiagnose(args, { account });
31460
31460
  });
31461
31461
  server2.registerTool("gog_docs_append", {
31462
- description: "Append text to the end of a Google Doc. This is the right tool for iterative document construction \u2014 multiple sequential calls produce content in the order they were called. Use gog_docs_insert only when you need to insert at a specific character position.",
31462
+ description: "Append text to the end of a Google Doc. This is the right tool for iterative document construction \u2014 multiple sequential calls produce content in the order they were called. Use gog_docs_insert only when you need to insert at a specific character position. Known markdown=true limitations (tracked upstream): (a) 3+ tables in one call reorders the trailing punctuation of the paragraph before the 3rd table \u2014 split into multiple calls with \u22642 tables each (openclaw/gogcli#607); (b) inline **bold** / *italic* / `code` inside table cells renders as literal characters \u2014 pre-format cell text separately or apply formatting after the append via gog_docs_format (openclaw/gogcli#608); (c) tables with an empty header row leak the last data row as literal pipe text \u2014 always supply a non-empty header (openclaw/gogcli#609).",
31463
31463
  annotations: { destructiveHint: true },
31464
31464
  inputSchema: {
31465
31465
  docId: external_exports.string().describe("Doc ID (from the URL)"),
31466
31466
  text: external_exports.string().optional().describe("Text content to append"),
31467
31467
  file: external_exports.string().optional().describe('Path to a text file to append (use "-" for stdin)'),
31468
- markdown: external_exports.boolean().optional().describe("Convert markdown to Google Docs formatting (headings, bold, lists, etc.)"),
31468
+ markdown: external_exports.boolean().optional().describe("Convert markdown to Google Docs formatting (headings, bold, lists, etc.). See the tool description for known upstream limitations around tables."),
31469
31469
  tab: external_exports.string().optional().describe("Target tab title or ID (for multi-tab docs)"),
31470
31470
  account: accountParam
31471
31471
  }
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.0.10",
6
+ "version": "2.0.11",
7
7
  "description": "Extended Google Docs for Claude via gogcli — auth + full Docs and comments support",
8
8
  "author": {
9
9
  "name": "Chris Hall",
@@ -161,7 +161,7 @@
161
161
  },
162
162
  {
163
163
  "name": "gog_docs_append",
164
- "description": "Append text to the end of a Google Doc (the right tool for iterative construction; sequential calls produce in-order content)"
164
+ "description": "Append text to the end of a Google Doc (the right tool for iterative construction). markdown=true known limitations (upstream): 3+ tables/call reorders trailing punctuation (split calls); inline bold/italic/code in cells renders literally (format after); empty-header tables leak literal pipes (use non-empty header)."
165
165
  },
166
166
  {
167
167
  "name": "gog_docs_read",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-docs",
3
- "version": "2.0.10",
3
+ "version": "2.0.11",
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.0.10",
10
+ "version": "2.0.11",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-docs",
15
- "version": "2.0.10",
15
+ "version": "2.0.11",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -185,13 +185,13 @@ export function registerExtraDocsTools(server: McpServer): void {
185
185
  });
186
186
 
187
187
  server.registerTool('gog_docs_append', {
188
- description: 'Append text to the end of a Google Doc. This is the right tool for iterative document construction — multiple sequential calls produce content in the order they were called. Use gog_docs_insert only when you need to insert at a specific character position.',
188
+ description: 'Append text to the end of a Google Doc. This is the right tool for iterative document construction — multiple sequential calls produce content in the order they were called. Use gog_docs_insert only when you need to insert at a specific character position. Known markdown=true limitations (tracked upstream): (a) 3+ tables in one call reorders the trailing punctuation of the paragraph before the 3rd table — split into multiple calls with ≤2 tables each (openclaw/gogcli#607); (b) inline **bold** / *italic* / `code` inside table cells renders as literal characters — pre-format cell text separately or apply formatting after the append via gog_docs_format (openclaw/gogcli#608); (c) tables with an empty header row leak the last data row as literal pipe text — always supply a non-empty header (openclaw/gogcli#609).',
189
189
  annotations: { destructiveHint: true },
190
190
  inputSchema: {
191
191
  docId: z.string().describe('Doc ID (from the URL)'),
192
192
  text: z.string().optional().describe('Text content to append'),
193
193
  file: z.string().optional().describe('Path to a text file to append (use "-" for stdin)'),
194
- markdown: z.boolean().optional().describe('Convert markdown to Google Docs formatting (headings, bold, lists, etc.)'),
194
+ markdown: z.boolean().optional().describe('Convert markdown to Google Docs formatting (headings, bold, lists, etc.). See the tool description for known upstream limitations around tables.'),
195
195
  tab: z.string().optional().describe('Target tab title or ID (for multi-tab docs)'),
196
196
  account: accountParam,
197
197
  },
@@ -550,6 +550,28 @@ describe('gog_docs_append', () => {
550
550
  { account: undefined },
551
551
  );
552
552
  });
553
+
554
+ // Regression: the tool description must warn about the 3 known upstream
555
+ // markdown converter bugs (openclaw/gogcli#607, #608, #609). If upstream
556
+ // fixes any of these and the warning is removed, this test fails as a
557
+ // prompt to revisit + reopen the README/SKILL/TODO sections too.
558
+ it('description warns about all 3 known upstream markdown limitations', async () => {
559
+ // Local mock to capture the registration config (the shared harness only
560
+ // captures the handler callback).
561
+ const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js');
562
+ const server = new McpServer({ name: 'test', version: '0.0.0' });
563
+ const configs = new Map<string, { description?: string }>();
564
+ vi.spyOn(server, 'registerTool').mockImplementation((name, config) => {
565
+ configs.set(name, config as { description?: string });
566
+ return undefined as never;
567
+ });
568
+ const { registerExtraDocsTools } = await import('../../src/tools/docs-extra.js');
569
+ registerExtraDocsTools(server);
570
+ const desc = configs.get('gog_docs_append')?.description ?? '';
571
+ expect(desc).toMatch(/openclaw\/gogcli#607/);
572
+ expect(desc).toMatch(/openclaw\/gogcli#608/);
573
+ expect(desc).toMatch(/openclaw\/gogcli#609/);
574
+ });
553
575
  });
554
576
 
555
577
  describe('gog_docs_read', () => {