gogcli-mcp-drive 4.0.0 → 4.0.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.
@@ -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": "4.0.0"
10
+ "version": "4.0.1"
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": "4.0.0",
18
+ "version": "4.0.1",
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": "4.0.0",
4
+ "version": "4.0.1",
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
@@ -33917,6 +33917,207 @@ var pageSchema = {
33917
33917
 
33918
33918
  // ../gogcli-mcp/src/runner.ts
33919
33919
  import { delimiter, join } from "node:path";
33920
+
33921
+ // ../gogcli-mcp/src/timestamps.ts
33922
+ var DEFAULT_DISPLAY_TZ = "America/New_York";
33923
+ function isValidTimeZone(tz) {
33924
+ try {
33925
+ new Intl.DateTimeFormat("en-US", { timeZone: tz });
33926
+ return true;
33927
+ } catch {
33928
+ return false;
33929
+ }
33930
+ }
33931
+ function displayTimeZone() {
33932
+ const configured = readEnvVar("DISPLAY_TZ");
33933
+ if (configured && isValidTimeZone(configured)) return configured;
33934
+ return DEFAULT_DISPLAY_TZ;
33935
+ }
33936
+ function naiveSourceTimeZone() {
33937
+ const configured = readEnvVar("GOG_TIMEZONE");
33938
+ if (configured && isValidTimeZone(configured)) return configured;
33939
+ return displayTimeZone();
33940
+ }
33941
+ function offsetAt(instant, tz) {
33942
+ const w = wallPartsIn(instant, tz);
33943
+ const asUTC = Date.UTC(w.year, w.month - 1, w.day, w.hour, w.minute, w.second, instant.getUTCMilliseconds());
33944
+ const minutes = Math.round((asUTC - instant.getTime()) / 6e4);
33945
+ const sign = minutes < 0 ? "-" : "+";
33946
+ const abs = Math.abs(minutes);
33947
+ return `${sign}${pad(Math.floor(abs / 60))}:${pad(abs % 60)}`;
33948
+ }
33949
+ function wallPartsIn(instant, tz) {
33950
+ const parts = new Intl.DateTimeFormat("en-US", {
33951
+ timeZone: tz,
33952
+ year: "numeric",
33953
+ month: "2-digit",
33954
+ day: "2-digit",
33955
+ hour: "2-digit",
33956
+ minute: "2-digit",
33957
+ second: "2-digit",
33958
+ // h23 pins midnight to hour 00; without it some ICU builds render hour 24.
33959
+ hourCycle: "h23"
33960
+ }).formatToParts(instant);
33961
+ const out = {};
33962
+ for (const p of parts) {
33963
+ if (p.type !== "literal") out[p.type] = Number(p.value);
33964
+ }
33965
+ return out;
33966
+ }
33967
+ function wallTimeToInstant(y, mo, d, h, mi, s, ms, tz) {
33968
+ let guess = Date.UTC(y, mo - 1, d, h, mi, s, ms);
33969
+ for (let i = 0; i < 2; i += 1) {
33970
+ const seen = wallPartsIn(new Date(guess), tz);
33971
+ const seenUTC = Date.UTC(seen.year, seen.month - 1, seen.day, seen.hour, seen.minute, seen.second, ms);
33972
+ const drift = Date.UTC(y, mo - 1, d, h, mi, s, ms) - seenUTC;
33973
+ if (drift === 0) break;
33974
+ guess += drift;
33975
+ }
33976
+ return new Date(guess);
33977
+ }
33978
+ function pad(n, width = 2) {
33979
+ return String(n).padStart(width, "0");
33980
+ }
33981
+ function isoWithOffset(instant, tz, offset) {
33982
+ const w = wallPartsIn(instant, tz);
33983
+ const msPart = instant.getUTCMilliseconds();
33984
+ const frac = msPart ? `.${pad(msPart, 3)}` : "";
33985
+ return `${pad(w.year, 4)}-${pad(w.month)}-${pad(w.day)}T${pad(w.hour)}:${pad(w.minute)}:${pad(w.second)}${frac}${offset}`;
33986
+ }
33987
+ function formatInstant(instant, tz = displayTimeZone()) {
33988
+ const offset = offsetAt(instant, tz);
33989
+ const display = new Intl.DateTimeFormat("en-US", {
33990
+ timeZone: tz,
33991
+ weekday: "short",
33992
+ month: "short",
33993
+ day: "numeric",
33994
+ year: "numeric",
33995
+ hour: "numeric",
33996
+ minute: "2-digit",
33997
+ timeZoneName: "short"
33998
+ }).format(instant);
33999
+ return { iso: isoWithOffset(instant, tz, offset), display };
34000
+ }
34001
+ var TIMESTAMP_KEYS = /* @__PURE__ */ new Set([
34002
+ "date",
34003
+ // gog gmail message/thread listings ("2026-07-28 03:36")
34004
+ "dateTime",
34005
+ // Calendar event start/end
34006
+ "internalDate",
34007
+ // Gmail, epoch milliseconds (authoritative)
34008
+ // gog >= 0.35.0 Gmail message AND thread listings. Already offset-bearing
34009
+ // (RFC3339 from internalDate), so it needs no offset repair — it is
34010
+ // allowlisted purely to gain a Display sibling, and to be re-rendered in
34011
+ // DISPLAY_TZ like every other instant. Separately sourced from the sibling
34012
+ // `date`, which is a naive re-format of the sender's Date header; the two may
34013
+ // legitimately disagree. See docs/timestamps.md.
34014
+ "internalDateIso",
34015
+ "modifiedTime",
34016
+ // Drive
34017
+ "createdTime",
34018
+ // Drive
34019
+ "createTime",
34020
+ "updateTime",
34021
+ "updated",
34022
+ "originalStartTime",
34023
+ "expirationTime",
34024
+ "lastModified",
34025
+ "sentAt",
34026
+ "viewedAt",
34027
+ "modifiedAt",
34028
+ "fetchedBodyAt",
34029
+ "asOf"
34030
+ ]);
34031
+ var ZONE_NAME_KEYS = /* @__PURE__ */ new Set(["timeZone", "timezone"]);
34032
+ var RFC3339_WITH_OFFSET = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,9}))?(Z|[+-]\d{2}:?\d{2})$/;
34033
+ var NAIVE_DATE_TIME = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,9}))?$/;
34034
+ var EPOCH_MILLIS = /^\d{13}$/;
34035
+ var DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
34036
+ function isRealCalendarDate(p) {
34037
+ const utc = new Date(Date.UTC(p.year, p.month - 1, p.day, p.hour, p.minute, p.second));
34038
+ return utc.getUTCFullYear() === p.year && utc.getUTCMonth() === p.month - 1 && utc.getUTCDate() === p.day && utc.getUTCHours() === p.hour && utc.getUTCMinutes() === p.minute && utc.getUTCSeconds() === p.second;
34039
+ }
34040
+ function parseTimestampValue(key, value, assumeNaiveIn) {
34041
+ if (typeof value !== "string") return null;
34042
+ const raw = value.trim();
34043
+ if (raw === "" || DATE_ONLY.test(raw)) return null;
34044
+ if (key === "internalDate" && EPOCH_MILLIS.test(raw)) {
34045
+ return new Date(Number(raw));
34046
+ }
34047
+ if (RFC3339_WITH_OFFSET.test(raw)) {
34048
+ const parsed = new Date(raw.replace(" ", "T"));
34049
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
34050
+ }
34051
+ const naive = NAIVE_DATE_TIME.exec(raw);
34052
+ if (naive) {
34053
+ const [, y, mo, d, h, mi, s, frac] = naive;
34054
+ const ms = frac ? Number(frac.padEnd(3, "0").slice(0, 3)) : 0;
34055
+ const parts = {
34056
+ year: Number(y),
34057
+ month: Number(mo),
34058
+ day: Number(d),
34059
+ hour: Number(h),
34060
+ minute: Number(mi),
34061
+ second: Number(s ?? "0")
34062
+ };
34063
+ if (!isRealCalendarDate(parts)) return null;
34064
+ return wallTimeToInstant(
34065
+ parts.year,
34066
+ parts.month,
34067
+ parts.day,
34068
+ parts.hour,
34069
+ parts.minute,
34070
+ parts.second,
34071
+ ms,
34072
+ assumeNaiveIn
34073
+ );
34074
+ }
34075
+ return null;
34076
+ }
34077
+ function walk2(node2, tz, naiveTz) {
34078
+ let changed = false;
34079
+ if (Array.isArray(node2)) {
34080
+ for (const item of node2) {
34081
+ if (walk2(item, tz, naiveTz)) changed = true;
34082
+ }
34083
+ return changed;
34084
+ }
34085
+ if (node2 === null || typeof node2 !== "object") return false;
34086
+ const obj = node2;
34087
+ for (const key of Object.keys(obj)) {
34088
+ const value = obj[key];
34089
+ if (value !== null && typeof value === "object") {
34090
+ if (walk2(value, tz, naiveTz)) changed = true;
34091
+ continue;
34092
+ }
34093
+ if (ZONE_NAME_KEYS.has(key) || !TIMESTAMP_KEYS.has(key)) continue;
34094
+ const instant = parseTimestampValue(key, value, naiveTz);
34095
+ if (!instant) continue;
34096
+ const { iso, display } = formatInstant(instant, tz);
34097
+ obj[key] = iso;
34098
+ obj[`${key}Display`] = display;
34099
+ changed = true;
34100
+ }
34101
+ return changed;
34102
+ }
34103
+ function detectIndent(text) {
34104
+ const match = /\n(\s+)\S/.exec(text);
34105
+ return match ? match[1].replace(/\t/g, " ").length : 0;
34106
+ }
34107
+ function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSourceTimeZone()) {
34108
+ const trimmed = text.trim();
34109
+ if (trimmed === "" || !/^[[{]/.test(trimmed)) return text;
34110
+ let parsed;
34111
+ try {
34112
+ parsed = JSON.parse(trimmed);
34113
+ } catch {
34114
+ return text;
34115
+ }
34116
+ if (!walk2(parsed, tz, naiveTz)) return text;
34117
+ return JSON.stringify(parsed, null, detectIndent(text));
34118
+ }
34119
+
34120
+ // ../gogcli-mcp/src/runner.ts
33920
34121
  function isGogFileArg(arg) {
33921
34122
  return typeof arg !== "string";
33922
34123
  }
@@ -34037,7 +34238,7 @@ async function spawnGog(fullArgs, opts) {
34037
34238
  const spawn = spawner ?? (await import("node:child_process")).spawn;
34038
34239
  const effectiveTimeout = timeout ?? TIMEOUT_MS;
34039
34240
  return new Promise((resolve, reject) => {
34040
- const childEnv = { ...sanitizedEnv(), PATH: augmentedPath() };
34241
+ const childEnv = { ...sanitizedEnv(), GOG_TIMEZONE: naiveSourceTimeZone(), PATH: augmentedPath() };
34041
34242
  const child = spawn(readEnvVar("GOG_PATH") ?? "gog", fullArgs, { env: childEnv });
34042
34243
  const stdoutChunks = [];
34043
34244
  const stderrChunks = [];
@@ -34119,205 +34320,6 @@ async function runBinary(args, options = {}) {
34119
34320
  return spawnExecutor(fullArgs, { timeout, interactive: false, spawner, binary: true });
34120
34321
  }
34121
34322
 
34122
- // ../gogcli-mcp/src/timestamps.ts
34123
- var DEFAULT_DISPLAY_TZ = "America/New_York";
34124
- function isValidTimeZone(tz) {
34125
- try {
34126
- new Intl.DateTimeFormat("en-US", { timeZone: tz });
34127
- return true;
34128
- } catch {
34129
- return false;
34130
- }
34131
- }
34132
- function displayTimeZone() {
34133
- const configured = readEnvVar("DISPLAY_TZ");
34134
- if (configured && isValidTimeZone(configured)) return configured;
34135
- return DEFAULT_DISPLAY_TZ;
34136
- }
34137
- function naiveSourceTimeZone() {
34138
- const configured = readEnvVar("GOG_TIMEZONE");
34139
- if (configured && isValidTimeZone(configured)) return configured;
34140
- return displayTimeZone();
34141
- }
34142
- function offsetAt(instant, tz) {
34143
- const w = wallPartsIn(instant, tz);
34144
- const asUTC = Date.UTC(w.year, w.month - 1, w.day, w.hour, w.minute, w.second, instant.getUTCMilliseconds());
34145
- const minutes = Math.round((asUTC - instant.getTime()) / 6e4);
34146
- const sign = minutes < 0 ? "-" : "+";
34147
- const abs = Math.abs(minutes);
34148
- return `${sign}${pad(Math.floor(abs / 60))}:${pad(abs % 60)}`;
34149
- }
34150
- function wallPartsIn(instant, tz) {
34151
- const parts = new Intl.DateTimeFormat("en-US", {
34152
- timeZone: tz,
34153
- year: "numeric",
34154
- month: "2-digit",
34155
- day: "2-digit",
34156
- hour: "2-digit",
34157
- minute: "2-digit",
34158
- second: "2-digit",
34159
- // h23 pins midnight to hour 00; without it some ICU builds render hour 24.
34160
- hourCycle: "h23"
34161
- }).formatToParts(instant);
34162
- const out = {};
34163
- for (const p of parts) {
34164
- if (p.type !== "literal") out[p.type] = Number(p.value);
34165
- }
34166
- return out;
34167
- }
34168
- function wallTimeToInstant(y, mo, d, h, mi, s, ms, tz) {
34169
- let guess = Date.UTC(y, mo - 1, d, h, mi, s, ms);
34170
- for (let i = 0; i < 2; i += 1) {
34171
- const seen = wallPartsIn(new Date(guess), tz);
34172
- const seenUTC = Date.UTC(seen.year, seen.month - 1, seen.day, seen.hour, seen.minute, seen.second, ms);
34173
- const drift = Date.UTC(y, mo - 1, d, h, mi, s, ms) - seenUTC;
34174
- if (drift === 0) break;
34175
- guess += drift;
34176
- }
34177
- return new Date(guess);
34178
- }
34179
- function pad(n, width = 2) {
34180
- return String(n).padStart(width, "0");
34181
- }
34182
- function isoWithOffset(instant, tz, offset) {
34183
- const w = wallPartsIn(instant, tz);
34184
- const msPart = instant.getUTCMilliseconds();
34185
- const frac = msPart ? `.${pad(msPart, 3)}` : "";
34186
- return `${pad(w.year, 4)}-${pad(w.month)}-${pad(w.day)}T${pad(w.hour)}:${pad(w.minute)}:${pad(w.second)}${frac}${offset}`;
34187
- }
34188
- function formatInstant(instant, tz = displayTimeZone()) {
34189
- const offset = offsetAt(instant, tz);
34190
- const display = new Intl.DateTimeFormat("en-US", {
34191
- timeZone: tz,
34192
- weekday: "short",
34193
- month: "short",
34194
- day: "numeric",
34195
- year: "numeric",
34196
- hour: "numeric",
34197
- minute: "2-digit",
34198
- timeZoneName: "short"
34199
- }).format(instant);
34200
- return { iso: isoWithOffset(instant, tz, offset), display };
34201
- }
34202
- var TIMESTAMP_KEYS = /* @__PURE__ */ new Set([
34203
- "date",
34204
- // gog gmail message/thread listings ("2026-07-28 03:36")
34205
- "dateTime",
34206
- // Calendar event start/end
34207
- "internalDate",
34208
- // Gmail, epoch milliseconds (authoritative)
34209
- // gog >= 0.35.0 Gmail message AND thread listings. Already offset-bearing
34210
- // (RFC3339 from internalDate), so it needs no offset repair — it is
34211
- // allowlisted purely to gain a Display sibling, and to be re-rendered in
34212
- // DISPLAY_TZ like every other instant. Separately sourced from the sibling
34213
- // `date`, which is a naive re-format of the sender's Date header; the two may
34214
- // legitimately disagree. See docs/timestamps.md.
34215
- "internalDateIso",
34216
- "modifiedTime",
34217
- // Drive
34218
- "createdTime",
34219
- // Drive
34220
- "createTime",
34221
- "updateTime",
34222
- "updated",
34223
- "originalStartTime",
34224
- "expirationTime",
34225
- "lastModified",
34226
- "sentAt",
34227
- "viewedAt",
34228
- "modifiedAt",
34229
- "fetchedBodyAt",
34230
- "asOf"
34231
- ]);
34232
- var ZONE_NAME_KEYS = /* @__PURE__ */ new Set(["timeZone", "timezone"]);
34233
- var RFC3339_WITH_OFFSET = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,9}))?(Z|[+-]\d{2}:?\d{2})$/;
34234
- var NAIVE_DATE_TIME = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,9}))?$/;
34235
- var EPOCH_MILLIS = /^\d{13}$/;
34236
- var DATE_ONLY = /^\d{4}-\d{2}-\d{2}$/;
34237
- function isRealCalendarDate(p) {
34238
- const utc = new Date(Date.UTC(p.year, p.month - 1, p.day, p.hour, p.minute, p.second));
34239
- return utc.getUTCFullYear() === p.year && utc.getUTCMonth() === p.month - 1 && utc.getUTCDate() === p.day && utc.getUTCHours() === p.hour && utc.getUTCMinutes() === p.minute && utc.getUTCSeconds() === p.second;
34240
- }
34241
- function parseTimestampValue(key, value, assumeNaiveIn) {
34242
- if (typeof value !== "string") return null;
34243
- const raw = value.trim();
34244
- if (raw === "" || DATE_ONLY.test(raw)) return null;
34245
- if (key === "internalDate" && EPOCH_MILLIS.test(raw)) {
34246
- return new Date(Number(raw));
34247
- }
34248
- if (RFC3339_WITH_OFFSET.test(raw)) {
34249
- const parsed = new Date(raw.replace(" ", "T"));
34250
- return Number.isNaN(parsed.getTime()) ? null : parsed;
34251
- }
34252
- const naive = NAIVE_DATE_TIME.exec(raw);
34253
- if (naive) {
34254
- const [, y, mo, d, h, mi, s, frac] = naive;
34255
- const ms = frac ? Number(frac.padEnd(3, "0").slice(0, 3)) : 0;
34256
- const parts = {
34257
- year: Number(y),
34258
- month: Number(mo),
34259
- day: Number(d),
34260
- hour: Number(h),
34261
- minute: Number(mi),
34262
- second: Number(s ?? "0")
34263
- };
34264
- if (!isRealCalendarDate(parts)) return null;
34265
- return wallTimeToInstant(
34266
- parts.year,
34267
- parts.month,
34268
- parts.day,
34269
- parts.hour,
34270
- parts.minute,
34271
- parts.second,
34272
- ms,
34273
- assumeNaiveIn
34274
- );
34275
- }
34276
- return null;
34277
- }
34278
- function walk2(node2, tz, naiveTz) {
34279
- let changed = false;
34280
- if (Array.isArray(node2)) {
34281
- for (const item of node2) {
34282
- if (walk2(item, tz, naiveTz)) changed = true;
34283
- }
34284
- return changed;
34285
- }
34286
- if (node2 === null || typeof node2 !== "object") return false;
34287
- const obj = node2;
34288
- for (const key of Object.keys(obj)) {
34289
- const value = obj[key];
34290
- if (value !== null && typeof value === "object") {
34291
- if (walk2(value, tz, naiveTz)) changed = true;
34292
- continue;
34293
- }
34294
- if (ZONE_NAME_KEYS.has(key) || !TIMESTAMP_KEYS.has(key)) continue;
34295
- const instant = parseTimestampValue(key, value, naiveTz);
34296
- if (!instant) continue;
34297
- const { iso, display } = formatInstant(instant, tz);
34298
- obj[key] = iso;
34299
- obj[`${key}Display`] = display;
34300
- changed = true;
34301
- }
34302
- return changed;
34303
- }
34304
- function detectIndent(text) {
34305
- const match = /\n(\s+)\S/.exec(text);
34306
- return match ? match[1].replace(/\t/g, " ").length : 0;
34307
- }
34308
- function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSourceTimeZone()) {
34309
- const trimmed = text.trim();
34310
- if (trimmed === "" || !/^[[{]/.test(trimmed)) return text;
34311
- let parsed;
34312
- try {
34313
- parsed = JSON.parse(trimmed);
34314
- } catch {
34315
- return text;
34316
- }
34317
- if (!walk2(parsed, tz, naiveTz)) return text;
34318
- return JSON.stringify(parsed, null, detectIndent(text));
34319
- }
34320
-
34321
34323
  // ../gogcli-mcp/src/pagination.ts
34322
34324
  function detectIndent2(text) {
34323
34325
  const match = /\n(\s+)\S/.exec(text);
@@ -34994,7 +34996,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
34994
34996
  );
34995
34997
 
34996
34998
  // ../gogcli-mcp/src/server.ts
34997
- var VERSION = true ? "4.0.0" : "0.0.0";
34999
+ var VERSION = true ? "4.0.1" : "0.0.0";
34998
35000
 
34999
35001
  // ../gogcli-mcp/src/bootstrap-auth.ts
35000
35002
  import { join as join2 } from "node:path";
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": "4.0.0",
6
+ "version": "4.0.1",
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/mint.yaml CHANGED
@@ -73,10 +73,10 @@ env:
73
73
  - name: GOG_TIMEZONE
74
74
  required: false
75
75
  help: >-
76
- The IANA zone gog itself formats its naive timestamps in. The wrapper
77
- reads it (naiveSourceTimeZone) to re-attach the correct offset, so it
78
- should match gog's own configuration. Falls back to DISPLAY_TZ, then to
79
- America/New_York.
76
+ The IANA zone gog formats its naive timestamps in. The wrapper passes
77
+ it to every spawned gog and reads it back (naiveSourceTimeZone) to
78
+ re-attach the offset, so the two always agree. Unset or invalid, both
79
+ use DISPLAY_TZ, then America/New_York — never the host's local zone.
80
80
  - name: DISPLAY_TZ
81
81
  required: false
82
82
  help: >-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gogcli-mcp-drive",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
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": "4.0.0",
10
+ "version": "4.0.1",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "gogcli-mcp-drive",
15
- "version": "4.0.0",
15
+ "version": "4.0.1",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },