gogcli-mcp-drive 2.18.4 → 2.19.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 +84 -2
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/index.ts +6 -1
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.19.0"
|
|
11
11
|
},
|
|
12
12
|
"plugins": [
|
|
13
13
|
{
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"displayName": "gogcli (Drive)",
|
|
16
16
|
"source": "./",
|
|
17
17
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
18
|
-
"version": "2.
|
|
18
|
+
"version": "2.19.0",
|
|
19
19
|
"author": {
|
|
20
20
|
"name": "Chris Hall"
|
|
21
21
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-drive",
|
|
3
3
|
"displayName": "gogcli (Drive)",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.19.0",
|
|
5
5
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Chris Hall",
|
package/dist/index.js
CHANGED
|
@@ -3644,7 +3644,12 @@ var require_fast_uri = __commonJS({
|
|
|
3644
3644
|
}
|
|
3645
3645
|
function resolve(baseURI, relativeURI, options) {
|
|
3646
3646
|
const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
|
|
3647
|
-
const
|
|
3647
|
+
const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
|
|
3648
|
+
const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
|
|
3649
|
+
if (baseMalformed || relativeMalformed) {
|
|
3650
|
+
throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
|
|
3651
|
+
}
|
|
3652
|
+
const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
|
|
3648
3653
|
schemelessOptions.skipEscape = true;
|
|
3649
3654
|
return serialize(resolved, schemelessOptions);
|
|
3650
3655
|
}
|
|
@@ -3770,6 +3775,7 @@ var require_fast_uri = __commonJS({
|
|
|
3770
3775
|
}
|
|
3771
3776
|
var URI_PARSE = /^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;
|
|
3772
3777
|
var AUTHORITY_PREFIX = /^(?:[^#/:?]+:)?\/\/([^/?#]*)/;
|
|
3778
|
+
var AUTHORITY_INTRODUCER_REGION = /^(?:[^#/:?]+:)?([/\\\t\n\r]*)/;
|
|
3773
3779
|
function getParseError(parsed, matches) {
|
|
3774
3780
|
if (matches[2] !== void 0 && parsed.path && parsed.path[0] !== "/") {
|
|
3775
3781
|
return 'URI path must start with "/" when authority is present.';
|
|
@@ -3804,6 +3810,20 @@ var require_fast_uri = __commonJS({
|
|
|
3804
3810
|
parsed.error = "URI authority must not contain a literal backslash.";
|
|
3805
3811
|
malformedAuthorityOrPort = true;
|
|
3806
3812
|
}
|
|
3813
|
+
const introducerMatch = uri.match(AUTHORITY_INTRODUCER_REGION);
|
|
3814
|
+
if (introducerMatch !== null) {
|
|
3815
|
+
const region = introducerMatch[1];
|
|
3816
|
+
const normalizedRegion = region.replace(/[\t\n\r]/g, "");
|
|
3817
|
+
if (normalizedRegion.length >= 2) {
|
|
3818
|
+
if (normalizedRegion.slice(0, 2) !== "//") {
|
|
3819
|
+
parsed.error = parsed.error || "URI authority must not contain a literal backslash.";
|
|
3820
|
+
malformedAuthorityOrPort = true;
|
|
3821
|
+
} else if (region.length !== normalizedRegion.length) {
|
|
3822
|
+
parsed.error = parsed.error || "URI authority introducer must not contain whitespace.";
|
|
3823
|
+
malformedAuthorityOrPort = true;
|
|
3824
|
+
}
|
|
3825
|
+
}
|
|
3826
|
+
}
|
|
3807
3827
|
const matches = uri.match(URI_PARSE);
|
|
3808
3828
|
if (matches) {
|
|
3809
3829
|
parsed.scheme = matches[1];
|
|
@@ -31970,7 +31990,68 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
31970
31990
|
);
|
|
31971
31991
|
|
|
31972
31992
|
// ../gogcli-mcp/src/server.ts
|
|
31973
|
-
var VERSION = true ? "2.
|
|
31993
|
+
var VERSION = true ? "2.19.0" : "0.0.0";
|
|
31994
|
+
|
|
31995
|
+
// ../gogcli-mcp/src/connector-runtime.ts
|
|
31996
|
+
var DEFAULT_TIMEOUT_MS = 3e4;
|
|
31997
|
+
var DEADLINE_GRACE_MS = 5e3;
|
|
31998
|
+
var RUNNER_GOG_FAILED = 422;
|
|
31999
|
+
var RUNNER_DRAINING = 503;
|
|
32000
|
+
function makeFlyExecutor(endpoint, key) {
|
|
32001
|
+
return async (args, opts) => {
|
|
32002
|
+
const deadlineMs = (opts?.timeout ?? DEFAULT_TIMEOUT_MS) + DEADLINE_GRACE_MS;
|
|
32003
|
+
let res;
|
|
32004
|
+
try {
|
|
32005
|
+
res = await fetch(endpoint + "/run", {
|
|
32006
|
+
method: "POST",
|
|
32007
|
+
headers: {
|
|
32008
|
+
Authorization: "Bearer " + key,
|
|
32009
|
+
"Content-Type": "application/json"
|
|
32010
|
+
},
|
|
32011
|
+
body: JSON.stringify({ args }),
|
|
32012
|
+
signal: AbortSignal.timeout(deadlineMs)
|
|
32013
|
+
});
|
|
32014
|
+
} catch (err) {
|
|
32015
|
+
const name = err instanceof Error ? err.name : "";
|
|
32016
|
+
if (name === "TimeoutError" || name === "AbortError") {
|
|
32017
|
+
throw new Error(
|
|
32018
|
+
`gog-runner did not respond within ${deadlineMs}ms (${endpoint}) \u2014 the Fly backend may be cold or wedged`
|
|
32019
|
+
);
|
|
32020
|
+
}
|
|
32021
|
+
throw err;
|
|
32022
|
+
}
|
|
32023
|
+
if (!res.ok) {
|
|
32024
|
+
const body = await res.json().catch(() => null);
|
|
32025
|
+
const detail = body && typeof body.error === "string" ? body.stderr && body.stderr.trim() && body.stderr.trim() !== body.error.trim() ? `${body.error}
|
|
32026
|
+
${body.stderr}` : body.error : "";
|
|
32027
|
+
if (res.status === RUNNER_GOG_FAILED) {
|
|
32028
|
+
throw new Error(detail || "gog failed on the runner (no detail supplied)");
|
|
32029
|
+
}
|
|
32030
|
+
if (res.status === RUNNER_DRAINING || body?.retryable === true) {
|
|
32031
|
+
throw new Error(
|
|
32032
|
+
`gog-runner is restarting; retry this call.${detail ? ` ${detail}` : ""}`
|
|
32033
|
+
);
|
|
32034
|
+
}
|
|
32035
|
+
if (detail) {
|
|
32036
|
+
throw new Error(detail);
|
|
32037
|
+
}
|
|
32038
|
+
throw new Error(
|
|
32039
|
+
`gog-runner HTTP ${res.status}: the response did not come from the runner, so the request never reached gog. The backend Machine was most likely starting or shutting down \u2014 this is transient, retry the same call.`
|
|
32040
|
+
);
|
|
32041
|
+
}
|
|
32042
|
+
const { stdout } = await res.json();
|
|
32043
|
+
return stdout;
|
|
32044
|
+
};
|
|
32045
|
+
}
|
|
32046
|
+
|
|
32047
|
+
// ../gogcli-mcp/src/remote-runner.ts
|
|
32048
|
+
function useRemoteGogRunner(env = process.env) {
|
|
32049
|
+
const endpoint = readEnvVar("GOG_RUNNER_URL", { env });
|
|
32050
|
+
const key = readEnvVar("GOG_RUNNER_KEY", { env });
|
|
32051
|
+
if (!endpoint || !key) return false;
|
|
32052
|
+
runExecutor.enterWith({ executor: makeFlyExecutor(endpoint.replace(/\/+$/, ""), key) });
|
|
32053
|
+
return true;
|
|
32054
|
+
}
|
|
31974
32055
|
|
|
31975
32056
|
// src/tools/drive-extra.ts
|
|
31976
32057
|
function registerExtraDriveTools(server) {
|
|
@@ -32474,6 +32555,7 @@ function registerExtraDriveTools(server) {
|
|
|
32474
32555
|
}
|
|
32475
32556
|
|
|
32476
32557
|
// src/index.ts
|
|
32558
|
+
useRemoteGogRunner();
|
|
32477
32559
|
await runMcp({
|
|
32478
32560
|
name: "gogcli-drive",
|
|
32479
32561
|
version: VERSION,
|
package/manifest.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"manifest_version": "0.3",
|
|
4
4
|
"name": "gogcli-mcp-drive",
|
|
5
5
|
"display_name": "gogcli (Drive)",
|
|
6
|
-
"version": "2.
|
|
6
|
+
"version": "2.19.0",
|
|
7
7
|
"description": "Extended Google Drive for Claude via gogcli — auth + full Drive support (upload, download, permissions, comments, shared drives)",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Chris Hall",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-drive",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.19.0",
|
|
4
4
|
"mcpName": "io.github.chrischall/gogcli-mcp-drive",
|
|
5
5
|
"description": "Extended Google Drive MCP server via gogcli — auth + full Drive support (upload/download/permissions/comments/shared drives)",
|
|
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-drive"
|
|
9
9
|
},
|
|
10
|
-
"version": "2.
|
|
10
|
+
"version": "2.19.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp-drive",
|
|
15
|
-
"version": "2.
|
|
15
|
+
"version": "2.19.0",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { runMcp } from '@chrischall/mcp-utils';
|
|
3
|
-
import { VERSION, authToolsFor, registerDriveTools } from '../../gogcli-mcp/src/lib.js';
|
|
3
|
+
import { VERSION, authToolsFor, registerDriveTools, useRemoteGogRunner } from '../../gogcli-mcp/src/lib.js';
|
|
4
4
|
import { registerExtraDriveTools } from './tools/drive-extra.js';
|
|
5
5
|
|
|
6
|
+
|
|
7
|
+
// Execute `gog` on the Fly backend when the host points us at one; without
|
|
8
|
+
// it, nothing changes and we spawn the local binary as before.
|
|
9
|
+
useRemoteGogRunner();
|
|
10
|
+
|
|
6
11
|
await runMcp({
|
|
7
12
|
name: 'gogcli-drive',
|
|
8
13
|
version: VERSION,
|