gogcli-mcp 2.4.0 → 2.5.0

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.4.0"
10
+ "version": "2.5.0"
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.4.0",
18
+ "version": "2.5.0",
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.4.0",
4
+ "version": "2.5.0",
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
@@ -31994,14 +31994,16 @@ function registerGmailTools(server2) {
31994
31994
  bcc: external_exports.string().optional().describe("BCC recipients, comma-separated"),
31995
31995
  replyToMessageId: external_exports.string().optional().describe("Message ID to reply to"),
31996
31996
  threadId: external_exports.string().optional().describe("Thread ID to reply within"),
31997
+ attach: external_exports.array(external_exports.string()).optional().describe("Local file paths to attach (repeatable). Each file is read on the gog server (not this client), base64-encoded with a MIME type inferred from its extension, and added as a multipart attachment. Keep the total under Gmail's ~35 MB inline-upload limit."),
31997
31998
  account: accountParam
31998
31999
  }
31999
- }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, account }) => {
32000
+ }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, attach, account }) => {
32000
32001
  const args = ["gmail", "send", `--to=${to}`, `--subject=${subject}`, `--body=${body}`];
32001
32002
  if (cc) args.push(`--cc=${cc}`);
32002
32003
  if (bcc) args.push(`--bcc=${bcc}`);
32003
32004
  if (replyToMessageId) args.push(`--reply-to-message-id=${replyToMessageId}`);
32004
32005
  if (threadId) args.push(`--thread-id=${threadId}`);
32006
+ if (attach) for (const path of attach) args.push(`--attach=${path}`);
32005
32007
  return runOrDiagnose(args, { account });
32006
32008
  });
32007
32009
  registerRunTool(server2, { service: "gmail", examples: '"archive", "mark-read", "labels"' });
@@ -32324,7 +32326,7 @@ function registerTasksTools(server2) {
32324
32326
  }
32325
32327
 
32326
32328
  // src/server.ts
32327
- var VERSION = true ? "2.4.0" : "0.0.0";
32329
+ var VERSION = true ? "2.5.0" : "0.0.0";
32328
32330
  function createServer(options) {
32329
32331
  return new McpServer({
32330
32332
  name: options?.name ?? "gogcli",
package/dist/lib.js CHANGED
@@ -30859,7 +30859,7 @@ var EMPTY_COMPLETION_RESULT = {
30859
30859
  import { spawn } from "node:child_process";
30860
30860
  import { delimiter } from "node:path";
30861
30861
  var TIMEOUT_MS = 3e4;
30862
- var MIN_GOG_VERSION = "0.20.0";
30862
+ var MIN_GOG_VERSION = "0.22.0";
30863
30863
  function envOrUndefined(key) {
30864
30864
  const value = process.env[key];
30865
30865
  if (!value || value.startsWith("${")) return void 0;
@@ -31907,14 +31907,16 @@ function registerGmailTools(server) {
31907
31907
  bcc: external_exports.string().optional().describe("BCC recipients, comma-separated"),
31908
31908
  replyToMessageId: external_exports.string().optional().describe("Message ID to reply to"),
31909
31909
  threadId: external_exports.string().optional().describe("Thread ID to reply within"),
31910
+ attach: external_exports.array(external_exports.string()).optional().describe("Local file paths to attach (repeatable). Each file is read on the gog server (not this client), base64-encoded with a MIME type inferred from its extension, and added as a multipart attachment. Keep the total under Gmail's ~35 MB inline-upload limit."),
31910
31911
  account: accountParam
31911
31912
  }
31912
- }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, account }) => {
31913
+ }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, attach, account }) => {
31913
31914
  const args = ["gmail", "send", `--to=${to}`, `--subject=${subject}`, `--body=${body}`];
31914
31915
  if (cc) args.push(`--cc=${cc}`);
31915
31916
  if (bcc) args.push(`--bcc=${bcc}`);
31916
31917
  if (replyToMessageId) args.push(`--reply-to-message-id=${replyToMessageId}`);
31917
31918
  if (threadId) args.push(`--thread-id=${threadId}`);
31919
+ if (attach) for (const path of attach) args.push(`--attach=${path}`);
31918
31920
  return runOrDiagnose(args, { account });
31919
31921
  });
31920
31922
  registerRunTool(server, { service: "gmail", examples: '"archive", "mark-read", "labels"' });
@@ -32237,7 +32239,7 @@ function registerTasksTools(server) {
32237
32239
  }
32238
32240
 
32239
32241
  // src/server.ts
32240
- var VERSION = true ? "2.4.0" : "0.0.0";
32242
+ var VERSION = true ? "2.5.0" : "0.0.0";
32241
32243
  function createServer(options) {
32242
32244
  return new McpServer({
32243
32245
  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.4.0",
6
+ "version": "2.5.0",
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.4.0",
3
+ "version": "2.5.0",
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>",
@@ -45,10 +45,10 @@
45
45
  "zod": "^4.4.3"
46
46
  },
47
47
  "devDependencies": {
48
- "@types/node": "^25.9.1",
49
- "@vitest/coverage-v8": "^4.1.7",
48
+ "@types/node": "^25.9.2",
49
+ "@vitest/coverage-v8": "^4.1.8",
50
50
  "esbuild": "^0.28.0",
51
51
  "typescript": "^6.0.2",
52
- "vitest": "^4.1.6"
52
+ "vitest": "^4.1.8"
53
53
  }
54
54
  }
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "source": "github",
8
8
  "subfolder": "packages/gogcli-mcp"
9
9
  },
10
- "version": "2.4.0",
10
+ "version": "2.5.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp",
15
- "version": "2.4.0",
15
+ "version": "2.5.0",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
package/src/runner.ts CHANGED
@@ -23,7 +23,7 @@ const TIMEOUT_MS = 30_000;
23
23
  // so the requirement change is surfaced in the release notes (see
24
24
  // .github/release.yml). This is the single source of truth for the required
25
25
  // version; keep the README/CLAUDE.md mention in sync.
26
- export const MIN_GOG_VERSION = '0.20.0';
26
+ export const MIN_GOG_VERSION = '0.22.0';
27
27
 
28
28
  // Treat unresolved .mcpb placeholders ("${user_config.gog_path}") and empty
29
29
  // strings the same as an unset env var. When an optional .mcpb user_config
@@ -44,14 +44,16 @@ export function registerGmailTools(server: McpServer): void {
44
44
  bcc: z.string().optional().describe('BCC recipients, comma-separated'),
45
45
  replyToMessageId: z.string().optional().describe('Message ID to reply to'),
46
46
  threadId: z.string().optional().describe('Thread ID to reply within'),
47
+ attach: z.array(z.string()).optional().describe('Local file paths to attach (repeatable). Each file is read on the gog server (not this client), base64-encoded with a MIME type inferred from its extension, and added as a multipart attachment. Keep the total under Gmail\'s ~35 MB inline-upload limit.'),
47
48
  account: accountParam,
48
49
  },
49
- }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, account }) => {
50
+ }, async ({ to, subject, body, cc, bcc, replyToMessageId, threadId, attach, account }) => {
50
51
  const args = ['gmail', 'send', `--to=${to}`, `--subject=${subject}`, `--body=${body}`];
51
52
  if (cc) args.push(`--cc=${cc}`);
52
53
  if (bcc) args.push(`--bcc=${bcc}`);
53
54
  if (replyToMessageId) args.push(`--reply-to-message-id=${replyToMessageId}`);
54
55
  if (threadId) args.push(`--thread-id=${threadId}`);
56
+ if (attach) for (const path of attach) args.push(`--attach=${path}`);
55
57
  return runOrDiagnose(args, { account });
56
58
  });
57
59
 
@@ -96,6 +96,25 @@ describe('gog_gmail_send', () => {
96
96
  );
97
97
  });
98
98
 
99
+ it('appends one --attach flag per file path', async () => {
100
+ vi.mocked(runner.run).mockResolvedValue('{}');
101
+ const handlers = setupHandlers();
102
+ await handlers.get('gog_gmail_send')!({
103
+ to: 'bob@example.com',
104
+ subject: 'Evidence',
105
+ body: 'See attached',
106
+ attach: ['/tmp/shot.png', '/tmp/notes.pdf'],
107
+ });
108
+ expect(runner.run).toHaveBeenCalledWith(
109
+ [
110
+ 'gmail', 'send',
111
+ '--to=bob@example.com', '--subject=Evidence', '--body=See attached',
112
+ '--attach=/tmp/shot.png', '--attach=/tmp/notes.pdf',
113
+ ],
114
+ { account: undefined },
115
+ );
116
+ });
117
+
99
118
  it('returns error text on failure', async () => {
100
119
  vi.mocked(runner.run).mockRejectedValue(new Error('Send failed'));
101
120
  const handlers = setupHandlers();