gogcli-mcp-drive 2.23.0 → 2.23.2
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 +72 -23
- package/manifest.json +2 -2
- package/package.json +1 -1
- package/server.json +2 -2
- package/src/tools/drive-extra.ts +35 -17
- package/tests/tools/drive-extra.test.ts +16 -0
|
@@ -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.23.
|
|
10
|
+
"version": "2.23.2"
|
|
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.23.
|
|
18
|
+
"version": "2.23.2",
|
|
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.23.
|
|
4
|
+
"version": "2.23.2",
|
|
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
|
@@ -31552,6 +31552,26 @@ function normalizeTimestamps(text, tz = displayTimeZone(), naiveTz = naiveSource
|
|
|
31552
31552
|
return JSON.stringify(parsed, null, detectIndent(text));
|
|
31553
31553
|
}
|
|
31554
31554
|
|
|
31555
|
+
// ../gogcli-mcp/src/pagination.ts
|
|
31556
|
+
function detectIndent2(text) {
|
|
31557
|
+
const match = /\n(\s+)\S/.exec(text);
|
|
31558
|
+
return match ? match[1].replace(/\t/g, " ").length : 0;
|
|
31559
|
+
}
|
|
31560
|
+
function stripConsumedPageToken(text) {
|
|
31561
|
+
const trimmed = text.trim();
|
|
31562
|
+
if (trimmed === "" || !trimmed.startsWith("{")) return text;
|
|
31563
|
+
let parsed;
|
|
31564
|
+
try {
|
|
31565
|
+
parsed = JSON.parse(trimmed);
|
|
31566
|
+
} catch {
|
|
31567
|
+
return text;
|
|
31568
|
+
}
|
|
31569
|
+
const obj = parsed;
|
|
31570
|
+
if (obj.nextPageToken !== "") return text;
|
|
31571
|
+
delete obj.nextPageToken;
|
|
31572
|
+
return JSON.stringify(obj, null, detectIndent2(text));
|
|
31573
|
+
}
|
|
31574
|
+
|
|
31555
31575
|
// ../gogcli-mcp/src/tools/utils.ts
|
|
31556
31576
|
var accountParam = external_exports.string().optional().describe(
|
|
31557
31577
|
"Google account email to use, e.g. you@gmail.com \u2014 must be the full address, not a bare username. Overrides the GOG_ACCOUNT env var. Omit to use the single configured account."
|
|
@@ -31580,14 +31600,25 @@ var ids = {
|
|
|
31580
31600
|
// People API uses fully-qualified resource names ("people/c123") not bare IDs.
|
|
31581
31601
|
person: external_exports.string().describe("Person resource name (people/...) or email")
|
|
31582
31602
|
};
|
|
31603
|
+
var pageTokenParam = external_exports.string().optional().describe(
|
|
31604
|
+
"Cursor for the NEXT page. Pass back the nextPageToken from a previous response verbatim, keeping the query and max identical: call once, then call again with pageToken=<that value>. A response with NO nextPageToken is the last page."
|
|
31605
|
+
);
|
|
31606
|
+
var pageAliasParam = external_exports.string().optional().describe(
|
|
31607
|
+
"Deprecated alias for pageToken, accepted so existing callers keep working. Use pageToken \u2014 it matches the nextPageToken field in the response."
|
|
31608
|
+
);
|
|
31609
|
+
function resolvePageToken(p) {
|
|
31610
|
+
return p.pageToken ?? p.page;
|
|
31611
|
+
}
|
|
31583
31612
|
var paginationParams = {
|
|
31584
31613
|
max: external_exports.number().int().optional().describe("Max results"),
|
|
31585
|
-
|
|
31614
|
+
pageToken: pageTokenParam,
|
|
31615
|
+
page: pageAliasParam,
|
|
31586
31616
|
all: external_exports.boolean().optional().describe("Fetch all pages")
|
|
31587
31617
|
};
|
|
31588
31618
|
function pushPaginationFlags(args, p) {
|
|
31589
31619
|
if (p.max !== void 0) args.push(`--max=${p.max}`);
|
|
31590
|
-
|
|
31620
|
+
const token = resolvePageToken(p);
|
|
31621
|
+
if (token) args.push(`--page=${token}`);
|
|
31591
31622
|
if (p.all) args.push("--all");
|
|
31592
31623
|
}
|
|
31593
31624
|
function registerRunTool(server, options) {
|
|
@@ -31662,7 +31693,7 @@ ${accounts || "(none)"}${hint}`);
|
|
|
31662
31693
|
async function runOrDiagnose(args, options) {
|
|
31663
31694
|
try {
|
|
31664
31695
|
const raw = await run(args, options);
|
|
31665
|
-
return rawTextResult(options.lossless ? raw : normalizeTimestamps(raw));
|
|
31696
|
+
return rawTextResult(options.lossless ? raw : stripConsumedPageToken(normalizeTimestamps(raw)));
|
|
31666
31697
|
} catch (err) {
|
|
31667
31698
|
return diagnose(err);
|
|
31668
31699
|
}
|
|
@@ -31847,16 +31878,18 @@ function registerDriveTools(server) {
|
|
|
31847
31878
|
inputSchema: {
|
|
31848
31879
|
folderId: external_exports.string().optional().describe("Folder ID to list (default: root)"),
|
|
31849
31880
|
max: external_exports.number().optional().describe("Max results (default: 20)"),
|
|
31850
|
-
|
|
31881
|
+
pageToken: pageTokenParam,
|
|
31882
|
+
page: pageAliasParam,
|
|
31851
31883
|
query: external_exports.string().optional().describe(`Drive query filter (e.g. "name contains 'budget'")`),
|
|
31852
31884
|
allDrives: external_exports.boolean().optional().describe("Include shared drives (default: true). Set false for My Drive only."),
|
|
31853
31885
|
account: accountParam
|
|
31854
31886
|
}
|
|
31855
|
-
}, async ({ folderId, max, page, query, allDrives, account }) => {
|
|
31887
|
+
}, async ({ folderId, max, pageToken, page, query, allDrives, account }) => {
|
|
31856
31888
|
const args = ["drive", "ls"];
|
|
31857
31889
|
if (folderId) args.push(`--parent=${folderId}`);
|
|
31858
31890
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
31859
|
-
|
|
31891
|
+
const token = resolvePageToken({ pageToken, page });
|
|
31892
|
+
if (token) args.push(`--page=${token}`);
|
|
31860
31893
|
if (query) args.push(`--query=${query}`);
|
|
31861
31894
|
if (allDrives === false) args.push("--no-all-drives");
|
|
31862
31895
|
return runOrDiagnose(args, { account });
|
|
@@ -32056,7 +32089,7 @@ var failIfNotEmptyParam = external_exports.boolean().optional().describe(
|
|
|
32056
32089
|
);
|
|
32057
32090
|
|
|
32058
32091
|
// ../gogcli-mcp/src/server.ts
|
|
32059
|
-
var VERSION = true ? "2.23.
|
|
32092
|
+
var VERSION = true ? "2.23.2" : "0.0.0";
|
|
32060
32093
|
|
|
32061
32094
|
// ../gogcli-mcp/src/auth-log.ts
|
|
32062
32095
|
var FAILURES = /* @__PURE__ */ new Set([
|
|
@@ -32638,13 +32671,15 @@ function registerExtraDriveTools(server) {
|
|
|
32638
32671
|
inputSchema: {
|
|
32639
32672
|
fileId: external_exports.string().describe("File ID"),
|
|
32640
32673
|
max: external_exports.number().optional().describe("Max results (default: 100)"),
|
|
32641
|
-
|
|
32674
|
+
pageToken: pageTokenParam,
|
|
32675
|
+
page: pageAliasParam,
|
|
32642
32676
|
account: accountParam
|
|
32643
32677
|
}
|
|
32644
|
-
}, async ({ fileId, max, page, account }) => {
|
|
32678
|
+
}, async ({ fileId, max, pageToken, page, account }) => {
|
|
32645
32679
|
const args = ["drive", "permissions", fileId];
|
|
32646
32680
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
32647
|
-
|
|
32681
|
+
const token = resolvePageToken({ pageToken, page });
|
|
32682
|
+
if (token) args.push(`--page=${token}`);
|
|
32648
32683
|
return runOrDiagnose(args, { account });
|
|
32649
32684
|
});
|
|
32650
32685
|
server.registerTool("gog_drive_unshare", {
|
|
@@ -32663,15 +32698,17 @@ function registerExtraDriveTools(server) {
|
|
|
32663
32698
|
annotations: { readOnlyHint: true },
|
|
32664
32699
|
inputSchema: {
|
|
32665
32700
|
max: external_exports.number().optional().describe("Max results (default: 100, max allowed: 100)"),
|
|
32666
|
-
|
|
32701
|
+
pageToken: pageTokenParam,
|
|
32702
|
+
page: pageAliasParam,
|
|
32667
32703
|
all: external_exports.boolean().optional().describe("Fetch all pages"),
|
|
32668
32704
|
query: external_exports.string().optional().describe("Search query for filtering shared drives"),
|
|
32669
32705
|
account: accountParam
|
|
32670
32706
|
}
|
|
32671
|
-
}, async ({ max, page, all, query, account }) => {
|
|
32707
|
+
}, async ({ max, pageToken, page, all, query, account }) => {
|
|
32672
32708
|
const args = ["drive", "drives"];
|
|
32673
32709
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
32674
|
-
|
|
32710
|
+
const token = resolvePageToken({ pageToken, page });
|
|
32711
|
+
if (token) args.push(`--page=${token}`);
|
|
32675
32712
|
if (all) args.push("--all");
|
|
32676
32713
|
if (query) args.push(`--query=${query}`);
|
|
32677
32714
|
return runOrDiagnose(args, { account });
|
|
@@ -32831,16 +32868,18 @@ function registerExtraDriveTools(server) {
|
|
|
32831
32868
|
inputSchema: {
|
|
32832
32869
|
token: external_exports.string().describe("Start page token or next page token"),
|
|
32833
32870
|
max: external_exports.number().optional().describe("Max results (default: 100)"),
|
|
32834
|
-
|
|
32871
|
+
pageToken: pageTokenParam,
|
|
32872
|
+
page: pageAliasParam,
|
|
32835
32873
|
all: external_exports.boolean().optional().describe("Fetch all pages"),
|
|
32836
32874
|
includeRemoved: external_exports.boolean().optional().describe("Include removed changes"),
|
|
32837
32875
|
drive: external_exports.string().optional().describe("Shared drive ID for a shared-drive change log"),
|
|
32838
32876
|
account: accountParam
|
|
32839
32877
|
}
|
|
32840
|
-
}, async ({ token, max, page, all, includeRemoved, drive, account }) => {
|
|
32878
|
+
}, async ({ token, max, pageToken, page, all, includeRemoved, drive, account }) => {
|
|
32841
32879
|
const args = ["drive", "changes", "list", `--token=${token}`];
|
|
32842
32880
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
32843
|
-
|
|
32881
|
+
const cursor = resolvePageToken({ pageToken, page });
|
|
32882
|
+
if (cursor) args.push(`--page=${cursor}`);
|
|
32844
32883
|
if (all) args.push("--all");
|
|
32845
32884
|
if (includeRemoved) args.push("--include-removed");
|
|
32846
32885
|
if (drive) args.push(`--drive=${drive}`);
|
|
@@ -32892,10 +32931,16 @@ function registerExtraDriveTools(server) {
|
|
|
32892
32931
|
minimumRole: external_exports.string().optional().describe("Minimum role filter (e.g. READER, APPLIER, ORGANIZER)"),
|
|
32893
32932
|
publishedOnly: external_exports.boolean().optional().describe("Only list published labels"),
|
|
32894
32933
|
adminAccess: external_exports.boolean().optional().describe("Use admin access for Workspace admin accounts"),
|
|
32934
|
+
max: external_exports.number().int().optional().describe("Max results"),
|
|
32935
|
+
pageToken: pageTokenParam,
|
|
32936
|
+
page: pageAliasParam,
|
|
32895
32937
|
account: accountParam
|
|
32896
32938
|
}
|
|
32897
|
-
}, async ({ language, view, minimumRole, publishedOnly, adminAccess, account }) => {
|
|
32939
|
+
}, async ({ language, view, minimumRole, publishedOnly, adminAccess, max, pageToken, page, account }) => {
|
|
32898
32940
|
const args = ["drive", "labels", "list"];
|
|
32941
|
+
if (max !== void 0) args.push(`--max=${max}`);
|
|
32942
|
+
const token = resolvePageToken({ pageToken, page });
|
|
32943
|
+
if (token) args.push(`--page=${token}`);
|
|
32899
32944
|
if (language) args.push(`--language=${language}`);
|
|
32900
32945
|
if (view) args.push(`--view=${view}`);
|
|
32901
32946
|
if (minimumRole) args.push(`--minimum-role=${minimumRole}`);
|
|
@@ -32926,13 +32971,15 @@ function registerExtraDriveTools(server) {
|
|
|
32926
32971
|
inputSchema: {
|
|
32927
32972
|
fileId: external_exports.string().describe("File ID"),
|
|
32928
32973
|
max: external_exports.number().optional().describe("Max results (default: 100)"),
|
|
32929
|
-
|
|
32974
|
+
pageToken: pageTokenParam,
|
|
32975
|
+
page: pageAliasParam,
|
|
32930
32976
|
account: accountParam
|
|
32931
32977
|
}
|
|
32932
|
-
}, async ({ fileId, max, page, account }) => {
|
|
32978
|
+
}, async ({ fileId, max, pageToken, page, account }) => {
|
|
32933
32979
|
const args = ["drive", "labels", "file", "list", fileId];
|
|
32934
32980
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
32935
|
-
|
|
32981
|
+
const token = resolvePageToken({ pageToken, page });
|
|
32982
|
+
if (token) args.push(`--page=${token}`);
|
|
32936
32983
|
return runOrDiagnose(args, { account });
|
|
32937
32984
|
});
|
|
32938
32985
|
server.registerTool("gog_drive_labels_file_apply", {
|
|
@@ -32982,12 +33029,13 @@ function registerExtraDriveTools(server) {
|
|
|
32982
33029
|
to: external_exports.string().optional().describe("Upper activity time bound (RFC3339)"),
|
|
32983
33030
|
filter: external_exports.string().optional().describe("Raw Drive Activity filter expression appended with AND"),
|
|
32984
33031
|
max: external_exports.number().optional().describe("Page size (default: 10)"),
|
|
32985
|
-
|
|
33032
|
+
pageToken: pageTokenParam,
|
|
33033
|
+
page: pageAliasParam,
|
|
32986
33034
|
all: external_exports.boolean().optional().describe("Fetch all pages"),
|
|
32987
33035
|
consolidate: external_exports.boolean().optional().describe("Use Drive Activity legacy consolidation strategy"),
|
|
32988
33036
|
account: accountParam
|
|
32989
33037
|
}
|
|
32990
|
-
}, async ({ file: file2, folder, actions, from, to, filter, max, page, all, consolidate, account }) => {
|
|
33038
|
+
}, async ({ file: file2, folder, actions, from, to, filter, max, pageToken, page, all, consolidate, account }) => {
|
|
32991
33039
|
const args = ["drive", "activity", "query"];
|
|
32992
33040
|
if (file2) args.push(`--file=${file2}`);
|
|
32993
33041
|
if (folder) args.push(`--folder=${folder}`);
|
|
@@ -32996,7 +33044,8 @@ function registerExtraDriveTools(server) {
|
|
|
32996
33044
|
if (to) args.push(`--to=${to}`);
|
|
32997
33045
|
if (filter) args.push(`--filter=${filter}`);
|
|
32998
33046
|
if (max !== void 0) args.push(`--max=${max}`);
|
|
32999
|
-
|
|
33047
|
+
const token = resolvePageToken({ pageToken, page });
|
|
33048
|
+
if (token) args.push(`--page=${token}`);
|
|
33000
33049
|
if (all) args.push("--all");
|
|
33001
33050
|
if (consolidate) args.push("--consolidate");
|
|
33002
33051
|
return runOrDiagnose(args, { account });
|
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.23.
|
|
6
|
+
"version": "2.23.2",
|
|
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",
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
229
|
"name": "gog_drive_labels_list",
|
|
230
|
-
"description": "List Drive label schemas"
|
|
230
|
+
"description": "List Drive label schemas available to the account; paginated"
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
"name": "gog_drive_labels_get",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gogcli-mcp-drive",
|
|
3
|
-
"version": "2.23.
|
|
3
|
+
"version": "2.23.2",
|
|
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.23.
|
|
10
|
+
"version": "2.23.2",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "gogcli-mcp-drive",
|
|
15
|
-
"version": "2.23.
|
|
15
|
+
"version": "2.23.2",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
package/src/tools/drive-extra.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { accountParam, runOrDiagnose, paginationParams, pushPaginationFlags } from '../../../gogcli-mcp/src/lib.js';
|
|
3
|
+
import { accountParam, runOrDiagnose, paginationParams, pushPaginationFlags, pageTokenParam, pageAliasParam, resolvePageToken} from '../../../gogcli-mcp/src/lib.js';
|
|
4
4
|
|
|
5
5
|
export function registerExtraDriveTools(server: McpServer): void {
|
|
6
6
|
server.registerTool('gog_drive_download', {
|
|
@@ -111,13 +111,15 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
111
111
|
inputSchema: {
|
|
112
112
|
fileId: z.string().describe('File ID'),
|
|
113
113
|
max: z.number().optional().describe('Max results (default: 100)'),
|
|
114
|
-
|
|
114
|
+
pageToken: pageTokenParam,
|
|
115
|
+
page: pageAliasParam,
|
|
115
116
|
account: accountParam,
|
|
116
117
|
},
|
|
117
|
-
}, async ({ fileId, max, page, account }) => {
|
|
118
|
+
}, async ({ fileId, max, pageToken, page, account }) => {
|
|
118
119
|
const args = ['drive', 'permissions', fileId];
|
|
119
120
|
if (max !== undefined) args.push(`--max=${max}`);
|
|
120
|
-
|
|
121
|
+
const token = resolvePageToken({ pageToken, page });
|
|
122
|
+
if (token) args.push(`--page=${token}`);
|
|
121
123
|
return runOrDiagnose(args, { account });
|
|
122
124
|
});
|
|
123
125
|
|
|
@@ -138,15 +140,17 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
138
140
|
annotations: { readOnlyHint: true },
|
|
139
141
|
inputSchema: {
|
|
140
142
|
max: z.number().optional().describe('Max results (default: 100, max allowed: 100)'),
|
|
141
|
-
|
|
143
|
+
pageToken: pageTokenParam,
|
|
144
|
+
page: pageAliasParam,
|
|
142
145
|
all: z.boolean().optional().describe('Fetch all pages'),
|
|
143
146
|
query: z.string().optional().describe('Search query for filtering shared drives'),
|
|
144
147
|
account: accountParam,
|
|
145
148
|
},
|
|
146
|
-
}, async ({ max, page, all, query, account }) => {
|
|
149
|
+
}, async ({ max, pageToken, page, all, query, account }) => {
|
|
147
150
|
const args = ['drive', 'drives'];
|
|
148
151
|
if (max !== undefined) args.push(`--max=${max}`);
|
|
149
|
-
|
|
152
|
+
const token = resolvePageToken({ pageToken, page });
|
|
153
|
+
if (token) args.push(`--page=${token}`);
|
|
150
154
|
if (all) args.push('--all');
|
|
151
155
|
if (query) args.push(`--query=${query}`);
|
|
152
156
|
return runOrDiagnose(args, { account });
|
|
@@ -320,16 +324,20 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
320
324
|
inputSchema: {
|
|
321
325
|
token: z.string().describe('Start page token or next page token'),
|
|
322
326
|
max: z.number().optional().describe('Max results (default: 100)'),
|
|
323
|
-
|
|
327
|
+
pageToken: pageTokenParam,
|
|
328
|
+
page: pageAliasParam,
|
|
324
329
|
all: z.boolean().optional().describe('Fetch all pages'),
|
|
325
330
|
includeRemoved: z.boolean().optional().describe('Include removed changes'),
|
|
326
331
|
drive: z.string().optional().describe('Shared drive ID for a shared-drive change log'),
|
|
327
332
|
account: accountParam,
|
|
328
333
|
},
|
|
329
|
-
}, async ({ token, max, page, all, includeRemoved, drive, account }) => {
|
|
334
|
+
}, async ({ token, max, pageToken, page, all, includeRemoved, drive, account }) => {
|
|
330
335
|
const args = ['drive', 'changes', 'list', `--token=${token}`];
|
|
331
336
|
if (max !== undefined) args.push(`--max=${max}`);
|
|
332
|
-
|
|
337
|
+
// NOT `token` — this tool already binds that name to the start-page token
|
|
338
|
+
// it takes as a required arg, which is a different value entirely.
|
|
339
|
+
const cursor = resolvePageToken({ pageToken, page });
|
|
340
|
+
if (cursor) args.push(`--page=${cursor}`);
|
|
333
341
|
if (all) args.push('--all');
|
|
334
342
|
if (includeRemoved) args.push('--include-removed');
|
|
335
343
|
if (drive) args.push(`--drive=${drive}`);
|
|
@@ -385,10 +393,16 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
385
393
|
minimumRole: z.string().optional().describe('Minimum role filter (e.g. READER, APPLIER, ORGANIZER)'),
|
|
386
394
|
publishedOnly: z.boolean().optional().describe('Only list published labels'),
|
|
387
395
|
adminAccess: z.boolean().optional().describe('Use admin access for Workspace admin accounts'),
|
|
396
|
+
max: z.number().int().optional().describe('Max results'),
|
|
397
|
+
pageToken: pageTokenParam,
|
|
398
|
+
page: pageAliasParam,
|
|
388
399
|
account: accountParam,
|
|
389
400
|
},
|
|
390
|
-
}, async ({ language, view, minimumRole, publishedOnly, adminAccess, account }) => {
|
|
401
|
+
}, async ({ language, view, minimumRole, publishedOnly, adminAccess, max, pageToken, page, account }) => {
|
|
391
402
|
const args = ['drive', 'labels', 'list'];
|
|
403
|
+
if (max !== undefined) args.push(`--max=${max}`);
|
|
404
|
+
const token = resolvePageToken({ pageToken, page });
|
|
405
|
+
if (token) args.push(`--page=${token}`);
|
|
392
406
|
if (language) args.push(`--language=${language}`);
|
|
393
407
|
if (view) args.push(`--view=${view}`);
|
|
394
408
|
if (minimumRole) args.push(`--minimum-role=${minimumRole}`);
|
|
@@ -421,13 +435,15 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
421
435
|
inputSchema: {
|
|
422
436
|
fileId: z.string().describe('File ID'),
|
|
423
437
|
max: z.number().optional().describe('Max results (default: 100)'),
|
|
424
|
-
|
|
438
|
+
pageToken: pageTokenParam,
|
|
439
|
+
page: pageAliasParam,
|
|
425
440
|
account: accountParam,
|
|
426
441
|
},
|
|
427
|
-
}, async ({ fileId, max, page, account }) => {
|
|
442
|
+
}, async ({ fileId, max, pageToken, page, account }) => {
|
|
428
443
|
const args = ['drive', 'labels', 'file', 'list', fileId];
|
|
429
444
|
if (max !== undefined) args.push(`--max=${max}`);
|
|
430
|
-
|
|
445
|
+
const token = resolvePageToken({ pageToken, page });
|
|
446
|
+
if (token) args.push(`--page=${token}`);
|
|
431
447
|
return runOrDiagnose(args, { account });
|
|
432
448
|
});
|
|
433
449
|
|
|
@@ -480,12 +496,13 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
480
496
|
to: z.string().optional().describe('Upper activity time bound (RFC3339)'),
|
|
481
497
|
filter: z.string().optional().describe('Raw Drive Activity filter expression appended with AND'),
|
|
482
498
|
max: z.number().optional().describe('Page size (default: 10)'),
|
|
483
|
-
|
|
499
|
+
pageToken: pageTokenParam,
|
|
500
|
+
page: pageAliasParam,
|
|
484
501
|
all: z.boolean().optional().describe('Fetch all pages'),
|
|
485
502
|
consolidate: z.boolean().optional().describe('Use Drive Activity legacy consolidation strategy'),
|
|
486
503
|
account: accountParam,
|
|
487
504
|
},
|
|
488
|
-
}, async ({ file, folder, actions, from, to, filter, max, page, all, consolidate, account }) => {
|
|
505
|
+
}, async ({ file, folder, actions, from, to, filter, max, pageToken, page, all, consolidate, account }) => {
|
|
489
506
|
const args = ['drive', 'activity', 'query'];
|
|
490
507
|
if (file) args.push(`--file=${file}`);
|
|
491
508
|
if (folder) args.push(`--folder=${folder}`);
|
|
@@ -494,7 +511,8 @@ export function registerExtraDriveTools(server: McpServer): void {
|
|
|
494
511
|
if (to) args.push(`--to=${to}`);
|
|
495
512
|
if (filter) args.push(`--filter=${filter}`);
|
|
496
513
|
if (max !== undefined) args.push(`--max=${max}`);
|
|
497
|
-
|
|
514
|
+
const token = resolvePageToken({ pageToken, page });
|
|
515
|
+
if (token) args.push(`--page=${token}`);
|
|
498
516
|
if (all) args.push('--all');
|
|
499
517
|
if (consolidate) args.push('--consolidate');
|
|
500
518
|
return runOrDiagnose(args, { account });
|
|
@@ -459,6 +459,22 @@ describe('gog_drive_labels_list', () => {
|
|
|
459
459
|
await harness.callTool('gog_drive_labels_list', { publishedOnly: false, adminAccess: false });
|
|
460
460
|
expect(lib.runOrDiagnose).toHaveBeenCalledWith(['drive', 'labels', 'list'], { account: undefined });
|
|
461
461
|
});
|
|
462
|
+
|
|
463
|
+
// gog drive labels list is paginated upstream; the tool exposed neither max
|
|
464
|
+
// nor a cursor, so later pages were unreachable.
|
|
465
|
+
it('passes --max and --page through', async () => {
|
|
466
|
+
await harness.callTool('gog_drive_labels_list', { max: 50, pageToken: 'CURSOR' });
|
|
467
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
468
|
+
['drive', 'labels', 'list', '--max=50', '--page=CURSOR'], { account: undefined },
|
|
469
|
+
);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it('accepts the deprecated page alias', async () => {
|
|
473
|
+
await harness.callTool('gog_drive_labels_list', { page: 'CURSOR' });
|
|
474
|
+
expect(lib.runOrDiagnose).toHaveBeenCalledWith(
|
|
475
|
+
['drive', 'labels', 'list', '--page=CURSOR'], { account: undefined },
|
|
476
|
+
);
|
|
477
|
+
});
|
|
462
478
|
});
|
|
463
479
|
|
|
464
480
|
describe('gog_drive_labels_get', () => {
|