gogcli-mcp 2.29.0 → 2.29.1
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 +6451 -2060
- package/dist/lib.js +6282 -1930
- package/manifest.json +1 -1
- package/mint.yaml +1 -1
- package/package.json +3 -3
- package/server.json +2 -2
- package/src/runner.ts +1 -1
- package/src/worker.ts +1 -1
- package/tests/zod-single-copy.test.ts +56 -0
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.29.
|
|
6
|
+
"version": "2.29.1",
|
|
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/mint.yaml
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp",
|
|
3
|
-
"version": "2.29.
|
|
3
|
+
"version": "2.29.1",
|
|
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>",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@chrischall/mcp-utils": "^0.23.0",
|
|
45
45
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
46
|
-
"zod": "^4.4
|
|
46
|
+
"zod": "^4.5.4"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@types/node": "^26.4.
|
|
49
|
+
"@types/node": "^26.4.1",
|
|
50
50
|
"@vitest/coverage-v8": "^4.1.8",
|
|
51
51
|
"esbuild": "^0.28.2",
|
|
52
52
|
"typescript": "^7.0.2",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"source": "github",
|
|
8
8
|
"subfolder": "packages/gogcli-mcp"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.29.
|
|
10
|
+
"version": "2.29.1",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp",
|
|
15
|
-
"version": "2.29.
|
|
15
|
+
"version": "2.29.1",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/src/runner.ts
CHANGED
|
@@ -217,7 +217,7 @@ const TIMEOUT_MS = 30_000;
|
|
|
217
217
|
// so the requirement change is surfaced in the release notes (see
|
|
218
218
|
// .github/release.yml). This is the single source of truth for the required
|
|
219
219
|
// version; keep the README/CLAUDE.md mention in sync.
|
|
220
|
-
export const MIN_GOG_VERSION = '0.39.
|
|
220
|
+
export const MIN_GOG_VERSION = '0.39.1';
|
|
221
221
|
|
|
222
222
|
// Interpret the GOG_READONLY kill-switch. `readEnvVar` already treats blank
|
|
223
223
|
// values, 'undefined'/'null' sentinels, and unresolved .mcpb placeholders
|
package/src/worker.ts
CHANGED
|
@@ -38,7 +38,7 @@ import { gogAuth, CONNECTOR_INSTRUCTIONS, type GogProps } from './connector-auth
|
|
|
38
38
|
// connector with all ~360 tools at once. Add whichever paths you want as separate
|
|
39
39
|
// connectors in claude.ai (each authorizes with the same connector key).
|
|
40
40
|
|
|
41
|
-
const VERSION = '2.29.
|
|
41
|
+
const VERSION = '2.29.1'; // x-release-please-version
|
|
42
42
|
|
|
43
43
|
// Build an McpAgent subclass whose init() registers `registrars` onto its server,
|
|
44
44
|
// each handler wrapped in the ALS scope carrying the per-session Fly executor.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
|
|
6
|
+
// The zod counterpart of sdk-single-copy.test.ts, guarding the invariant that
|
|
7
|
+
// broke dependabot #333: the whole monorepo must resolve ONE copy of zod.
|
|
8
|
+
//
|
|
9
|
+
// Same shape of failure, a different package. `@cloudflare/vitest-pool-workers`
|
|
10
|
+
// (a root devDependency) declares zod as an **exact** pin, so it takes the
|
|
11
|
+
// hoisted root slot that `@chrischall/mcp-utils` and the MCP SDK resolve their
|
|
12
|
+
// zod peer from. The moment our workspaces ask for a newer zod than that pin,
|
|
13
|
+
// each nests its own copy — and because a `ZodType` carries brand-bearing
|
|
14
|
+
// internals, TypeScript compares the two NOMINALLY: every schema our tools hand
|
|
15
|
+
// `registerTool` fails with `TS2322: Type 'ZodString' is not assignable to type
|
|
16
|
+
// 'AnySchema'`, with no API change and nothing to fix in the source. #333 split
|
|
17
|
+
// the tree exactly that way and produced 11,024 type errors from a bump of one
|
|
18
|
+
// patch-level dependency.
|
|
19
|
+
//
|
|
20
|
+
// Read the resolved paths in such an error, not the signature.
|
|
21
|
+
//
|
|
22
|
+
// This asserts resolution identity rather than a version string: the failure is
|
|
23
|
+
// "two copies", not "the wrong version", and pinning a version here would just
|
|
24
|
+
// have to be edited on every future bump.
|
|
25
|
+
describe('zod is installed exactly once', () => {
|
|
26
|
+
const here = createRequire(import.meta.url);
|
|
27
|
+
|
|
28
|
+
// `import.meta.resolve`, not `require.resolve`, to reach the dependency's own
|
|
29
|
+
// entry: these packages are ESM-only, so their `exports` maps carry no
|
|
30
|
+
// `require` condition and CJS resolution of the bare specifier throws.
|
|
31
|
+
const resolveFrom = (specifier: string): string =>
|
|
32
|
+
realpathSync(createRequire(fileURLToPath(import.meta.resolve(specifier))).resolve('zod'));
|
|
33
|
+
|
|
34
|
+
it('resolves to the same file for this package and for @chrischall/mcp-utils', () => {
|
|
35
|
+
// mcp-utils declares zod as a peer, and its `accountParam` / `viewParam` /
|
|
36
|
+
// `paginationParams` helpers build the very schemas our registrars pass to
|
|
37
|
+
// `registerTool`, so its copy is the one they must be typed against.
|
|
38
|
+
expect(resolveFrom('@chrischall/mcp-utils')).toBe(realpathSync(here.resolve('zod')));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('resolves to the same file for the MCP SDK, which types every tool schema', () => {
|
|
42
|
+
// `registerTool` accepts the raw shape and infers the handler's argument
|
|
43
|
+
// types from it; a second copy makes every one of those schemas foreign.
|
|
44
|
+
expect(resolveFrom('@modelcontextprotocol/sdk/server/mcp.js')).toBe(
|
|
45
|
+
realpathSync(here.resolve('zod')),
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('resolves to the same file for @cloudflare/vitest-pool-workers, which exact-pins zod', () => {
|
|
50
|
+
// The exact pin here is what captured the root hoist slot in #333, and it
|
|
51
|
+
// is why the root `overrides` block carries a zod entry.
|
|
52
|
+
expect(resolveFrom('@cloudflare/vitest-pool-workers')).toBe(
|
|
53
|
+
realpathSync(here.resolve('zod')),
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
});
|