gogcli-mcp 2.4.1 → 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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/dist/index.js +4 -2
- package/dist/lib.js +5 -3
- package/manifest.json +1 -1
- package/package.json +4 -4
- package/server.json +2 -2
- package/src/runner.ts +1 -1
- package/src/tools/gmail.ts +3 -1
- package/tests/tools/gmail.test.ts +19 -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.
|
|
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.
|
|
18
|
+
"version": "2.5.0",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
49
|
-
"@vitest/coverage-v8": "^4.1.
|
|
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.
|
|
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.
|
|
10
|
+
"version": "2.5.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp",
|
|
15
|
-
"version": "2.
|
|
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.
|
|
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
|
package/src/tools/gmail.ts
CHANGED
|
@@ -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();
|