gogcli-mcp 2.0.9 → 2.0.10
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 +6 -5
- package/dist/lib.js +6 -5
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- 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.10"
|
|
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.10",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
package/dist/index.js
CHANGED
|
@@ -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.10" : "0.0.0";
|
|
32227
32228
|
function createServer(options) {
|
|
32228
32229
|
return new McpServer({
|
|
32229
32230
|
name: options?.name ?? "gogcli",
|
package/dist/lib.js
CHANGED
|
@@ -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.10" : "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.10",
|
|
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.10",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp",
|
|
15
|
-
"version": "2.0.
|
|
15
|
+
"version": "2.0.10",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
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();
|