gogcli-mcp 2.0.9 → 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.
- 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 +7 -6
- package/dist/lib.js +7 -6
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/gogcli/SKILL.md +2 -2
- package/src/runner.ts +1 -1
- package/src/tools/sheets.ts +9 -4
- package/tests/tools/sheets.test.ts +15 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
|
|
10
|
-
"version": "2.0.
|
|
10
|
+
"version": "2.0.11"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"displayName": "gogcli",
|
|
16
16
|
"source": "./",
|
|
17
17
|
"description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
|
|
18
|
-
"version": "2.0.
|
|
18
|
+
"version": "2.0.11",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
package/README.md
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
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
|
-
Base [Model Context Protocol](https://modelcontextprotocol.io) server that gives Claude access to Google Workspace via [gogcli](https://github.com/
|
|
6
|
+
Base [Model Context Protocol](https://modelcontextprotocol.io) server that gives Claude access to Google Workspace via [gogcli](https://github.com/openclaw/gogcli). Includes 52 tools across 8 services: Sheets, Docs, Gmail, Calendar, Drive, Tasks, Contacts, and Auth.
|
|
7
7
|
|
|
8
8
|
For extended Sheets or Docs support, see [gogcli-mcp-sheets](https://www.npmjs.com/package/gogcli-mcp-sheets) and [gogcli-mcp-docs](https://www.npmjs.com/package/gogcli-mcp-docs).
|
|
9
9
|
|
|
10
10
|
## Requirements
|
|
11
11
|
|
|
12
|
-
- [gogcli](https://github.com/
|
|
12
|
+
- [gogcli](https://github.com/openclaw/gogcli) installed and authenticated
|
|
13
13
|
- Node.js 18+
|
|
14
14
|
|
|
15
15
|
```bash
|
package/SKILL.md
CHANGED
|
@@ -5,13 +5,13 @@ description: Use when the user asks to interact with Google Workspace services.
|
|
|
5
5
|
|
|
6
6
|
# gogcli-mcp
|
|
7
7
|
|
|
8
|
-
MCP server wrapping [gogcli](https://github.com/
|
|
8
|
+
MCP server wrapping [gogcli](https://github.com/openclaw/gogcli) — provides Claude with access to Google Sheets, Docs, Gmail, Calendar, Drive, Tasks, Contacts, and Auth.
|
|
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
|
}
|
|
@@ -31983,6 +31983,7 @@ function registerGmailTools(server2) {
|
|
|
31983
31983
|
}
|
|
31984
31984
|
|
|
31985
31985
|
// src/tools/sheets.ts
|
|
31986
|
+
var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
|
|
31986
31987
|
function registerSheetsTools(server2) {
|
|
31987
31988
|
server2.registerTool("gog_sheets_get", {
|
|
31988
31989
|
description: 'Read values from a Google Sheets range. Returns a JSON object with a "values" array of rows.',
|
|
@@ -31996,12 +31997,12 @@ function registerSheetsTools(server2) {
|
|
|
31996
31997
|
return runOrDiagnose(["sheets", "get", spreadsheetId, range], { account });
|
|
31997
31998
|
});
|
|
31998
31999
|
server2.registerTool("gog_sheets_update", {
|
|
31999
|
-
description:
|
|
32000
|
+
description: 'Write values to a Google Sheets range, overwriting existing content. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas (e.g. "=SUM(A1:A10)").',
|
|
32000
32001
|
annotations: { destructiveHint: true },
|
|
32001
32002
|
inputSchema: {
|
|
32002
32003
|
spreadsheetId: external_exports.string().describe("Spreadsheet ID (from the URL)"),
|
|
32003
32004
|
range: external_exports.string().describe("Top-left cell or range in A1 notation, e.g. Sheet1!A1"),
|
|
32004
|
-
values: external_exports.array(external_exports.array(
|
|
32005
|
+
values: external_exports.array(external_exports.array(cellValueParam)).describe('2D array of values (rows of columns). Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
32005
32006
|
account: accountParam
|
|
32006
32007
|
}
|
|
32007
32008
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -32011,12 +32012,12 @@ function registerSheetsTools(server2) {
|
|
|
32011
32012
|
);
|
|
32012
32013
|
});
|
|
32013
32014
|
server2.registerTool("gog_sheets_append", {
|
|
32014
|
-
description:
|
|
32015
|
+
description: 'Append rows to a Google Sheet after the last row with data in the given range. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas.',
|
|
32015
32016
|
annotations: { destructiveHint: true },
|
|
32016
32017
|
inputSchema: {
|
|
32017
32018
|
spreadsheetId: external_exports.string().describe("Spreadsheet ID (from the URL)"),
|
|
32018
32019
|
range: external_exports.string().describe("Range indicating which sheet/columns to append to, e.g. Sheet1!A:C"),
|
|
32019
|
-
values: external_exports.array(external_exports.array(
|
|
32020
|
+
values: external_exports.array(external_exports.array(cellValueParam)).describe('2D array of rows to append. Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
32020
32021
|
account: accountParam
|
|
32021
32022
|
}
|
|
32022
32023
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -32223,7 +32224,7 @@ function registerTasksTools(server2) {
|
|
|
32223
32224
|
}
|
|
32224
32225
|
|
|
32225
32226
|
// src/server.ts
|
|
32226
|
-
var VERSION = true ? "2.0.
|
|
32227
|
+
var VERSION = true ? "2.0.11" : "0.0.0";
|
|
32227
32228
|
function createServer(options) {
|
|
32228
32229
|
return new McpServer({
|
|
32229
32230
|
name: options?.name ?? "gogcli",
|
package/dist/lib.js
CHANGED
|
@@ -30970,7 +30970,7 @@ async function run(args, options = {}) {
|
|
|
30970
30970
|
settled = true;
|
|
30971
30971
|
if (err.code === "ENOENT") {
|
|
30972
30972
|
reject(new Error(
|
|
30973
|
-
"gog executable not found. Install gogcli (https://github.com/
|
|
30973
|
+
"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)."
|
|
30974
30974
|
));
|
|
30975
30975
|
return;
|
|
30976
30976
|
}
|
|
@@ -31895,6 +31895,7 @@ function registerGmailTools(server) {
|
|
|
31895
31895
|
}
|
|
31896
31896
|
|
|
31897
31897
|
// src/tools/sheets.ts
|
|
31898
|
+
var cellValueParam = external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean(), external_exports.null()]);
|
|
31898
31899
|
function registerSheetsTools(server) {
|
|
31899
31900
|
server.registerTool("gog_sheets_get", {
|
|
31900
31901
|
description: 'Read values from a Google Sheets range. Returns a JSON object with a "values" array of rows.',
|
|
@@ -31908,12 +31909,12 @@ function registerSheetsTools(server) {
|
|
|
31908
31909
|
return runOrDiagnose(["sheets", "get", spreadsheetId, range], { account });
|
|
31909
31910
|
});
|
|
31910
31911
|
server.registerTool("gog_sheets_update", {
|
|
31911
|
-
description:
|
|
31912
|
+
description: 'Write values to a Google Sheets range, overwriting existing content. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas (e.g. "=SUM(A1:A10)").',
|
|
31912
31913
|
annotations: { destructiveHint: true },
|
|
31913
31914
|
inputSchema: {
|
|
31914
31915
|
spreadsheetId: external_exports.string().describe("Spreadsheet ID (from the URL)"),
|
|
31915
31916
|
range: external_exports.string().describe("Top-left cell or range in A1 notation, e.g. Sheet1!A1"),
|
|
31916
|
-
values: external_exports.array(external_exports.array(
|
|
31917
|
+
values: external_exports.array(external_exports.array(cellValueParam)).describe('2D array of values (rows of columns). Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
31917
31918
|
account: accountParam
|
|
31918
31919
|
}
|
|
31919
31920
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -31923,12 +31924,12 @@ function registerSheetsTools(server) {
|
|
|
31923
31924
|
);
|
|
31924
31925
|
});
|
|
31925
31926
|
server.registerTool("gog_sheets_append", {
|
|
31926
|
-
description:
|
|
31927
|
+
description: 'Append rows to a Google Sheet after the last row with data in the given range. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas.',
|
|
31927
31928
|
annotations: { destructiveHint: true },
|
|
31928
31929
|
inputSchema: {
|
|
31929
31930
|
spreadsheetId: external_exports.string().describe("Spreadsheet ID (from the URL)"),
|
|
31930
31931
|
range: external_exports.string().describe("Range indicating which sheet/columns to append to, e.g. Sheet1!A:C"),
|
|
31931
|
-
values: external_exports.array(external_exports.array(
|
|
31932
|
+
values: external_exports.array(external_exports.array(cellValueParam)).describe('2D array of rows to append. Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
31932
31933
|
account: accountParam
|
|
31933
31934
|
}
|
|
31934
31935
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -32135,7 +32136,7 @@ function registerTasksTools(server) {
|
|
|
32135
32136
|
}
|
|
32136
32137
|
|
|
32137
32138
|
// src/server.ts
|
|
32138
|
-
var VERSION = true ? "2.0.
|
|
32139
|
+
var VERSION = true ? "2.0.11" : "0.0.0";
|
|
32139
32140
|
function createServer(options) {
|
|
32140
32141
|
return new McpServer({
|
|
32141
32142
|
name: options?.name ?? "gogcli",
|
package/manifest.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"manifest_version": "0.3",
|
|
4
4
|
"name": "gogcli-mcp",
|
|
5
5
|
"display_name": "gogcli",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.11",
|
|
7
7
|
"description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Chris Hall",
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"source": "github",
|
|
8
8
|
"subfolder": "packages/gogcli-mcp"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.0.
|
|
10
|
+
"version": "2.0.11",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp",
|
|
15
|
-
"version": "2.0.
|
|
15
|
+
"version": "2.0.11",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/skills/gogcli/SKILL.md
CHANGED
|
@@ -5,13 +5,13 @@ description: Use when the user asks to read, write, or manage Google Sheets. Als
|
|
|
5
5
|
|
|
6
6
|
# gogcli-mcp
|
|
7
7
|
|
|
8
|
-
MCP server wrapping [gogcli](https://github.com/
|
|
8
|
+
MCP server wrapping [gogcli](https://github.com/openclaw/gogcli) — provides Claude with access to Google Sheets (and a scaffold for Gmail, Calendar, Drive, and more).
|
|
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 (`gog --help` works in your shell)
|
|
15
15
|
- Node.js 18 or later
|
|
16
16
|
|
|
17
17
|
## Setup
|
package/src/runner.ts
CHANGED
|
@@ -151,7 +151,7 @@ export async function run(args: string[], options: RunOptions = {}): Promise<str
|
|
|
151
151
|
settled = true;
|
|
152
152
|
if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
153
153
|
reject(new Error(
|
|
154
|
-
'gog executable not found. Install gogcli (https://github.com/
|
|
154
|
+
'gog executable not found. Install gogcli (https://github.com/openclaw/gogcli) ' +
|
|
155
155
|
'or set GOG_PATH in your MCP client config to the absolute binary path ' +
|
|
156
156
|
'(run `which gog` in a terminal to find it).',
|
|
157
157
|
));
|
package/src/tools/sheets.ts
CHANGED
|
@@ -2,6 +2,11 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { accountParam, runOrDiagnose, registerRunTool } from './utils.js';
|
|
4
4
|
|
|
5
|
+
// Cell value type: matches what gog sheets --values-json accepts (passed
|
|
6
|
+
// straight to the Sheets API as userEnteredValue). Strings starting with
|
|
7
|
+
// "=" are treated as formulas by gog's default --input=USER_ENTERED.
|
|
8
|
+
const cellValueParam = z.union([z.string(), z.number(), z.boolean(), z.null()]);
|
|
9
|
+
|
|
5
10
|
export function registerSheetsTools(server: McpServer): void {
|
|
6
11
|
server.registerTool('gog_sheets_get', {
|
|
7
12
|
description: 'Read values from a Google Sheets range. Returns a JSON object with a "values" array of rows.',
|
|
@@ -16,12 +21,12 @@ export function registerSheetsTools(server: McpServer): void {
|
|
|
16
21
|
});
|
|
17
22
|
|
|
18
23
|
server.registerTool('gog_sheets_update', {
|
|
19
|
-
description: 'Write values to a Google Sheets range, overwriting existing content.',
|
|
24
|
+
description: 'Write values to a Google Sheets range, overwriting existing content. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas (e.g. "=SUM(A1:A10)").',
|
|
20
25
|
annotations: { destructiveHint: true },
|
|
21
26
|
inputSchema: {
|
|
22
27
|
spreadsheetId: z.string().describe('Spreadsheet ID (from the URL)'),
|
|
23
28
|
range: z.string().describe('Top-left cell or range in A1 notation, e.g. Sheet1!A1'),
|
|
24
|
-
values: z.array(z.array(
|
|
29
|
+
values: z.array(z.array(cellValueParam)).describe('2D array of values (rows of columns). Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
25
30
|
account: accountParam,
|
|
26
31
|
},
|
|
27
32
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -32,12 +37,12 @@ export function registerSheetsTools(server: McpServer): void {
|
|
|
32
37
|
});
|
|
33
38
|
|
|
34
39
|
server.registerTool('gog_sheets_append', {
|
|
35
|
-
description: 'Append rows to a Google Sheet after the last row with data in the given range.',
|
|
40
|
+
description: 'Append rows to a Google Sheet after the last row with data in the given range. Values may be strings, numbers, booleans, or null. Strings starting with "=" are interpreted as formulas.',
|
|
36
41
|
annotations: { destructiveHint: true },
|
|
37
42
|
inputSchema: {
|
|
38
43
|
spreadsheetId: z.string().describe('Spreadsheet ID (from the URL)'),
|
|
39
44
|
range: z.string().describe('Range indicating which sheet/columns to append to, e.g. Sheet1!A:C'),
|
|
40
|
-
values: z.array(z.array(
|
|
45
|
+
values: z.array(z.array(cellValueParam)).describe('2D array of rows to append. Cells may be string/number/boolean/null; strings starting with "=" are formulas.'),
|
|
41
46
|
account: accountParam,
|
|
42
47
|
},
|
|
43
48
|
}, async ({ spreadsheetId, range, values, account }) => {
|
|
@@ -63,6 +63,21 @@ describe('gog_sheets_update', () => {
|
|
|
63
63
|
);
|
|
64
64
|
});
|
|
65
65
|
|
|
66
|
+
it('preserves non-string cell types (numbers, booleans, nulls, formulas) in --values-json', async () => {
|
|
67
|
+
vi.mocked(runner.run).mockResolvedValue('{}');
|
|
68
|
+
const handlers = setupHandlers();
|
|
69
|
+
const values = [['Sheet', 'A', 'B', 'C'], ['Row', 1, 2.5, '=A2+B2'], ['Bool', true, false, null]];
|
|
70
|
+
await handlers.get('gog_sheets_update')!({ spreadsheetId: 'sid', range: 'A1:D3', values });
|
|
71
|
+
const call = vi.mocked(runner.run).mock.calls[0]!;
|
|
72
|
+
expect(call[0][4]).toBe(`--values-json=${JSON.stringify(values)}`);
|
|
73
|
+
// Spot-check the serialized JSON keeps non-string primitives intact (no stringification)
|
|
74
|
+
expect(call[0][4]).toContain('"=A2+B2"');
|
|
75
|
+
expect(call[0][4]).toContain(',1,');
|
|
76
|
+
expect(call[0][4]).toContain('2.5');
|
|
77
|
+
expect(call[0][4]).toContain('true');
|
|
78
|
+
expect(call[0][4]).toContain('null');
|
|
79
|
+
});
|
|
80
|
+
|
|
66
81
|
it('returns error text on failure', async () => {
|
|
67
82
|
vi.mocked(runner.run).mockRejectedValue(new Error('Update failed'));
|
|
68
83
|
const handlers = setupHandlers();
|