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.
@@ -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.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.9",
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",
3
3
  "displayName": "gogcli",
4
- "version": "2.0.9",
4
+ "version": "2.0.11",
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/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/steipete/gogcli). Includes 52 tools across 8 services: Sheets, Docs, Gmail, Calendar, Drive, Tasks, Contacts, and Auth.
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/steipete/gogcli) installed and authenticated
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/steipete/gogcli) — provides Claude with access to Google Sheets, Docs, Gmail, Calendar, Drive, Tasks, Contacts, and Auth.
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/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
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
  }
@@ -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.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/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)."
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: "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.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.9",
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp",
3
- "version": "2.0.9",
3
+ "version": "2.0.11",
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.11",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp",
15
- "version": "2.0.9",
15
+ "version": "2.0.11",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -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/steipete/gogcli) — provides Claude with access to Google Sheets (and a scaffold for Gmail, Calendar, Drive, and more).
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/steipete/gogcli) installed and authenticated (`gog --help` works in your shell)
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/steipete/gogcli) ' +
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
  ));
@@ -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();