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.
@@ -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.9"
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.9",
18
+ "version": "2.0.10",
19
19
  "author": {
20
20
  "name": "Chris Hall"
21
21
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
3
  "displayName": "gogcli",
4
- "version": "2.0.9",
4
+ "version": "2.0.10",
5
5
  "description": "Google Sheets (and more) for Claude via gogcli — read, write, and manage spreadsheets",
6
6
  "author": {
7
7
  "name": "Chris Hall",
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: "Write values to a Google Sheets range, overwriting existing content.",
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(external_exports.string())).describe("2D array of values: outer array is rows, inner is columns"),
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: "Append rows to a Google Sheet after the last row with data in the given range.",
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(external_exports.string())).describe("2D array of rows to append"),
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.9" : "0.0.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: "Write values to a Google Sheets range, overwriting existing content.",
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(external_exports.string())).describe("2D array of values: outer array is rows, inner is columns"),
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: "Append rows to a Google Sheet after the last row with data in the given range.",
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(external_exports.string())).describe("2D array of rows to append"),
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.9" : "0.0.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.9",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "mcpName": "io.github.chrischall/gogcli-mcp",
5
5
  "description": "MCP server wrapping gogcli for Google service access",
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"
9
9
  },
10
- "version": "2.0.9",
10
+ "version": "2.0.10",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp",
15
- "version": "2.0.9",
15
+ "version": "2.0.10",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -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(z.string())).describe('2D array of values: outer array is rows, inner is columns'),
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(z.string())).describe('2D array of rows to append'),
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();