@mcp-z/mcp-drive 1.0.0 → 1.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.
- package/README.md +32 -3
- package/bin/server.js +1 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/index.js +13 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/query-builder.js.map +1 -1
- package/dist/cjs/mcp/index.js +6 -6
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js +4 -4
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/organize-files.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/file.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js +2 -2
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/file-move.js.map +1 -1
- package/dist/cjs/mcp/tools/files-search.js +10 -10
- package/dist/cjs/mcp/tools/files-search.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-contents.js +7 -7
- package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
- package/dist/cjs/mcp/tools/folder-search.js +10 -10
- package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js +14 -14
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/schemas/drive-query-schema.js.map +1 -1
- package/dist/cjs/schemas/drive-validation.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/setup/config.js +11 -1
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js +6 -2
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js +9 -9
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-google.d.cts +3 -2
- package/dist/cjs/setup/oauth-google.d.ts +3 -2
- package/dist/cjs/setup/oauth-google.js +15 -12
- package/dist/cjs/setup/oauth-google.js.map +1 -1
- package/dist/cjs/setup/runtime.js +9 -9
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js +2 -2
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/query-builder.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/organize-files.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/file.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/file-move.js.map +1 -1
- package/dist/esm/mcp/tools/files-search.js.map +1 -1
- package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
- package/dist/esm/mcp/tools/folder-create.js.map +1 -1
- package/dist/esm/mcp/tools/folder-path.js.map +1 -1
- package/dist/esm/mcp/tools/folder-search.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/schemas/drive-query-schema.js.map +1 -1
- package/dist/esm/schemas/drive-validation.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/setup/config.js +12 -2
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js +4 -0
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-google.d.ts +3 -2
- package/dist/esm/setup/oauth-google.js +8 -11
- package/dist/esm/setup/oauth-google.js.map +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,6 +50,12 @@ MCP supports stdio and HTTP.
|
|
|
50
50
|
3. Enable the Google Drive API.
|
|
51
51
|
4. Create OAuth 2.0 credentials (Desktop app).
|
|
52
52
|
5. Copy the Client ID and Client Secret.
|
|
53
|
+
6. Select your MCP transport (stdio for local and http for remote) and platform
|
|
54
|
+
- For stdio, choose "APIs & Services", + Create client, "Desktop app" type
|
|
55
|
+
- For http, choose "APIs & Services", + Create client, "Web application" type, add your URL (default is http://localhost:3000/oauth/callback based on the --port or PORT)
|
|
56
|
+
- For local hosting, add "http://127.0.0.1" for [Ephemeral redirect URL](https://en.wikipedia.org/wiki/Ephemeral_port)
|
|
57
|
+
7. Enable OAuth2 [scopes](https://console.cloud.google.com/auth/scopes): openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive
|
|
58
|
+
8. Add [test emails](https://console.cloud.google.com/auth/audience)
|
|
53
59
|
|
|
54
60
|
## OAuth modes
|
|
55
61
|
|
|
@@ -64,7 +70,7 @@ GOOGLE_CLIENT_ID=your-client-id
|
|
|
64
70
|
GOOGLE_CLIENT_SECRET=your-client-secret
|
|
65
71
|
```
|
|
66
72
|
|
|
67
|
-
Example:
|
|
73
|
+
Example (stdio) - Create .mcp.json:
|
|
68
74
|
```json
|
|
69
75
|
{
|
|
70
76
|
"mcpServers": {
|
|
@@ -72,14 +78,37 @@ Example:
|
|
|
72
78
|
"command": "npx",
|
|
73
79
|
"args": ["-y", "@mcp-z/mcp-drive"],
|
|
74
80
|
"env": {
|
|
75
|
-
"GOOGLE_CLIENT_ID": "your-client-id"
|
|
76
|
-
|
|
81
|
+
"GOOGLE_CLIENT_ID": "your-client-id"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Example (http) - Create .mcp.json:
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"drive": {
|
|
93
|
+
"type": "http",
|
|
94
|
+
"url": "http://localhost:3000",
|
|
95
|
+
"start": {
|
|
96
|
+
"command": "npx",
|
|
97
|
+
"args": ["-y", "@mcp-z/mcp-drive", "--port=3000"],
|
|
98
|
+
"env": {
|
|
99
|
+
"GOOGLE_CLIENT_ID": "your-client-id"
|
|
100
|
+
}
|
|
77
101
|
}
|
|
78
102
|
}
|
|
79
103
|
}
|
|
80
104
|
}
|
|
81
105
|
```
|
|
82
106
|
|
|
107
|
+
Local (default): omit REDIRECT_URI → ephemeral loopback.
|
|
108
|
+
Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
|
|
109
|
+
|
|
110
|
+
Note: start block is a helper in "npx @mcp-z/cli up" for starting an http server from your .mpc.json. See [@mcp-z/cli](https://github.com/mcp-z/cli) for details.
|
|
111
|
+
|
|
83
112
|
### Service account
|
|
84
113
|
|
|
85
114
|
Environment variables:
|
package/bin/server.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// biome-ignore lint/security/noGlobalEval: dual esm and cjs
|
|
4
|
-
if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-drive')).catch((err) => { console.
|
|
4
|
+
if (typeof require === 'undefined') eval("import('../dist/esm/index.js').then((cli) => cli.default(process.argv.slice(2), 'mcp-drive')).catch((err) => { console.error(err); process.exit(-1); });");
|
|
5
5
|
else require('../dist/cjs/index.js')(process.argv.slice(2), 'mcp-drive');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/constants.ts"],"sourcesContent":["/**\n * Drive MCP Server Constants\n *\n * These scopes are required for Google Drive functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\n// Google OAuth scopes required for Drive operations\nexport const GOOGLE_SCOPE = 'openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive';\n"],"names":["GOOGLE_SCOPE"],"mappings":"AAAA;;;;;CAKC,GAED,oDAAoD;;;;;+BACvCA;;;eAAAA;;;AAAN,IAAMA,eAAe"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -16,25 +16,25 @@ _export(exports, {
|
|
|
16
16
|
return main;
|
|
17
17
|
},
|
|
18
18
|
get mcp () {
|
|
19
|
-
return
|
|
19
|
+
return _indexts;
|
|
20
20
|
},
|
|
21
21
|
get schemas () {
|
|
22
|
-
return
|
|
22
|
+
return _indexts1;
|
|
23
23
|
},
|
|
24
24
|
get setup () {
|
|
25
|
-
return
|
|
25
|
+
return _indexts2;
|
|
26
26
|
},
|
|
27
27
|
get startServer () {
|
|
28
28
|
return startServer;
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
var
|
|
31
|
+
var _configts = require("./setup/config.js");
|
|
32
|
+
var _httpts = require("./setup/http.js");
|
|
33
|
+
var _stdiots = require("./setup/stdio.js");
|
|
34
34
|
var _constantsts = require("./constants.js");
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var
|
|
35
|
+
var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
|
|
36
|
+
var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
|
|
37
|
+
var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
|
|
38
38
|
_export_star(require("./types.js"), exports);
|
|
39
39
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
40
40
|
try {
|
|
@@ -230,7 +230,7 @@ function startServer(config) {
|
|
|
230
230
|
];
|
|
231
231
|
return [
|
|
232
232
|
4,
|
|
233
|
-
(0,
|
|
233
|
+
(0, _stdiots.createStdioServer)(config)
|
|
234
234
|
];
|
|
235
235
|
case 1:
|
|
236
236
|
_tmp = _state.sent();
|
|
@@ -241,7 +241,7 @@ function startServer(config) {
|
|
|
241
241
|
case 2:
|
|
242
242
|
return [
|
|
243
243
|
4,
|
|
244
|
-
(0,
|
|
244
|
+
(0, _httpts.createHTTPServer)(config)
|
|
245
245
|
];
|
|
246
246
|
case 3:
|
|
247
247
|
_tmp = _state.sent();
|
|
@@ -288,13 +288,13 @@ function main() {
|
|
|
288
288
|
switch(_state.label){
|
|
289
289
|
case 0:
|
|
290
290
|
// Check for help/version flags FIRST, before config parsing
|
|
291
|
-
versionHelpResult = (0,
|
|
291
|
+
versionHelpResult = (0, _configts.handleVersionHelp)(process.argv);
|
|
292
292
|
if (versionHelpResult.handled) {
|
|
293
293
|
console.log(versionHelpResult.output);
|
|
294
294
|
process.exit(0);
|
|
295
295
|
}
|
|
296
296
|
// Only parse config if no help/version flags
|
|
297
|
-
config = (0,
|
|
297
|
+
config = (0, _configts.createConfig)();
|
|
298
298
|
return [
|
|
299
299
|
4,
|
|
300
300
|
startServer(config)
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["GOOGLE_SCOPE","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,yBAAY;;QAkBrB;eAA8BC;;QAjBlBC;;;QACAC;;;QACAC;;;QAGUC;eAAAA;;;wBAX0B;sBACf;uBACC;2BAGL;+DACR;gEACI;gEACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,0BAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,wBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAehB;;YAEtBiB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,2BAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,sBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["createStore","uri","store","keyvRegistry","Error"],"mappings":";;;;+BAGA;;;eAA8BA;;;mEAFL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAAeA,YAAeC,GAAW;;YAChDC;;;;oBAAQ;;wBAAMC,IAAAA,qBAAY,EAAIF;;;oBAA9BC,QAAQ;oBACd,IAAI,CAACA,OAAO,MAAM,IAAIE,MAAM,AAAC,mCAAsC,OAAJH;oBAC/D;;wBAAOC;;;;IACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/lib/query-builder.ts"],"sourcesContent":["import type { DriveQuery, DriveQueryObject } from '../schemas/drive-query-schema.js';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Filters object returned by toDriveQuery for debugging/logging\n */\ninterface FiltersObject {\n nameIncludes?: string[];\n mimeTypeIncludes?: string[];\n fullTextIncludes?: string[];\n parentIdIncludes?: string[];\n ownerIncludes?: string[];\n starred?: boolean;\n sharedWithMe?: boolean;\n trashed?: boolean;\n}\n\n/**\n * Convert structured DriveQuery to Google Drive query string\n *\n * Accepts either:\n * - A raw Drive query string (returned as-is)\n * - A structured DriveQueryObject (converted to Drive query syntax)\n *\n * Drive query syntax reference:\n * - name contains 'text' - Search by filename\n * - mimeType = 'type' - Filter by MIME type\n * - fullText contains 'text' - Search content and metadata\n * - 'parent_id' in parents - Search in folder\n * - starred = true/false - Filter by starred status\n * - sharedWithMe = true - Filter by shared status\n * - modifiedTime >= 'date' - Date filtering\n * - 'email' in owners - Filter by owner\n * - trashed = false - Exclude trashed files (always added)\n */\nexport function toDriveQuery(query: DriveQuery): {\n q: string;\n filters: FiltersObject;\n} {\n // Handle string queries - return as raw query with empty filters\n if (typeof query === 'string') {\n return { q: query, filters: {} };\n }\n const nameIncludes: string[] = [];\n const mimeTypeIncludes: string[] = [];\n const fullTextIncludes: string[] = [];\n const parentIdIncludes: string[] = [];\n const ownerIncludes: string[] = [];\n\n let starredFlag: boolean | undefined;\n let sharedWithMeFlag: boolean | undefined;\n let trashedFlag: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n // Escape single quotes for Drive query syntax\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n const v = quote(rawVal);\n\n if (field === 'name') {\n nameIncludes.push(rawVal);\n return `name contains ${v}`;\n }\n if (field === 'mimeType') {\n mimeTypeIncludes.push(rawVal);\n return `mimeType = ${v}`;\n }\n if (field === 'fullText') {\n fullTextIncludes.push(rawVal);\n return `fullText contains ${v}`;\n }\n if (field === 'parentId') {\n parentIdIncludes.push(rawVal);\n return `${v} in parents`;\n }\n if (field === 'owner') {\n ownerIncludes.push(rawVal);\n return `${v} in owners`;\n }\n\n return '';\n }\n\n function chain(op: 'and' | 'or', arr: string[]) {\n const filtered = arr.filter((s) => s && s.trim() !== '');\n if (filtered.length === 0) return '';\n if (filtered.length === 1) {\n const first = filtered[0];\n return first ?? '';\n }\n return p(filtered.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const nonEmpty = op.$any.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('or', results) : '';\n }\n if (op.$all) {\n const nonEmpty = op.$all.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('and', results) : '';\n }\n if (op.$none) {\n const nonEmpty = op.$none.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? `not ${p(chain('or', results))}` : '';\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: { $gte?: string; $lt?: string }) {\n const parts: string[] = [];\n if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);\n if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['name', 'mimeType', 'fullText', 'parentId', 'owner'];\n }\n\n function emit(n: DriveQueryObject): string {\n if (n.$and) return p(n.$and.map(emit).join(' and '));\n if (n.$or) return p(n.$or.map(emit).join(' or '));\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const expressions: string[] = [];\n\n if (typeof n.starred === 'boolean') {\n starredFlag = n.starred;\n expressions.push(`starred = ${n.starred}`);\n }\n if (typeof n.sharedWithMe === 'boolean') {\n sharedWithMeFlag = n.sharedWithMe;\n expressions.push(`sharedWithMe = ${n.sharedWithMe}`);\n }\n if (typeof n.trashed === 'boolean') {\n trashedFlag = n.trashed;\n expressions.push(`trashed = ${n.trashed}`);\n }\n if (n.modifiedTime) {\n expressions.push(dateExpr(n.modifiedTime));\n }\n\n for (const k of fieldKeys()) {\n if (typeof n === 'object' && n !== null && k in n) {\n const op = (n as Record<string, string | FieldOperator>)[k];\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n const result = fieldExpr(k, normalizedOp);\n if (result.trim() !== '') {\n expressions.push(result);\n }\n }\n }\n\n // Handle empty objects\n if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {\n return '';\n }\n\n // Combine multiple expressions with AND\n if (expressions.length > 1) {\n return chain('and', expressions);\n }\n if (expressions.length === 1) {\n return expressions[0] ?? '';\n }\n\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: DriveQueryObject): string {\n if (!n) return '';\n\n // Handle empty objects\n if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';\n\n if (n.$and) return n.$and.map(emit).join(' and ');\n if (n.$or) return n.$or.map(emit).join(' or ');\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const result = emit(n);\n return result.trim() === '' ? '' : result;\n }\n\n const q = emitTop(query);\n const cleanedQuery = q.replace(/\\s+and\\s+$|\\s+or\\s+$|^\\s+and\\s+|^\\s+or\\s+/gi, '').trim();\n\n const filters: FiltersObject = {};\n if (nameIncludes.length) filters.nameIncludes = nameIncludes;\n if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;\n if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;\n if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;\n if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;\n // Use tracked flags from emit() to capture nested boolean conditions\n if (typeof starredFlag === 'boolean') filters.starred = starredFlag;\n if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;\n if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;\n\n return { q: cleanedQuery ?? '', filters };\n}\n"],"names":["toDriveQuery","query","q","filters","nameIncludes","mimeTypeIncludes","fullTextIncludes","parentIdIncludes","ownerIncludes","starredFlag","sharedWithMeFlag","trashedFlag","p","s","String","quote","str","replace","fv","field","raw","rawVal","v","push","chain","op","arr","filtered","filter","trim","length","first","join","fieldExpr","$any","nonEmpty","results","map","result","$all","$none","Error","JSON","stringify","dateExpr","d","parts","$gte","$lt","fieldKeys","emit","n","$and","$or","$not","expressions","starred","sharedWithMe","trashed","modifiedTime","k","normalizedOp","Object","keys","emitTop","cleanedQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/lib/query-builder.ts"],"sourcesContent":["import type { DriveQuery, DriveQueryObject } from '../schemas/drive-query-schema.ts';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Filters object returned by toDriveQuery for debugging/logging\n */\ninterface FiltersObject {\n nameIncludes?: string[];\n mimeTypeIncludes?: string[];\n fullTextIncludes?: string[];\n parentIdIncludes?: string[];\n ownerIncludes?: string[];\n starred?: boolean;\n sharedWithMe?: boolean;\n trashed?: boolean;\n}\n\n/**\n * Convert structured DriveQuery to Google Drive query string\n *\n * Accepts either:\n * - A raw Drive query string (returned as-is)\n * - A structured DriveQueryObject (converted to Drive query syntax)\n *\n * Drive query syntax reference:\n * - name contains 'text' - Search by filename\n * - mimeType = 'type' - Filter by MIME type\n * - fullText contains 'text' - Search content and metadata\n * - 'parent_id' in parents - Search in folder\n * - starred = true/false - Filter by starred status\n * - sharedWithMe = true - Filter by shared status\n * - modifiedTime >= 'date' - Date filtering\n * - 'email' in owners - Filter by owner\n * - trashed = false - Exclude trashed files (always added)\n */\nexport function toDriveQuery(query: DriveQuery): {\n q: string;\n filters: FiltersObject;\n} {\n // Handle string queries - return as raw query with empty filters\n if (typeof query === 'string') {\n return { q: query, filters: {} };\n }\n const nameIncludes: string[] = [];\n const mimeTypeIncludes: string[] = [];\n const fullTextIncludes: string[] = [];\n const parentIdIncludes: string[] = [];\n const ownerIncludes: string[] = [];\n\n let starredFlag: boolean | undefined;\n let sharedWithMeFlag: boolean | undefined;\n let trashedFlag: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n // Escape single quotes for Drive query syntax\n return `'${str.replace(/'/g, \"\\\\'\")}'`;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n const v = quote(rawVal);\n\n if (field === 'name') {\n nameIncludes.push(rawVal);\n return `name contains ${v}`;\n }\n if (field === 'mimeType') {\n mimeTypeIncludes.push(rawVal);\n return `mimeType = ${v}`;\n }\n if (field === 'fullText') {\n fullTextIncludes.push(rawVal);\n return `fullText contains ${v}`;\n }\n if (field === 'parentId') {\n parentIdIncludes.push(rawVal);\n return `${v} in parents`;\n }\n if (field === 'owner') {\n ownerIncludes.push(rawVal);\n return `${v} in owners`;\n }\n\n return '';\n }\n\n function chain(op: 'and' | 'or', arr: string[]) {\n const filtered = arr.filter((s) => s && s.trim() !== '');\n if (filtered.length === 0) return '';\n if (filtered.length === 1) {\n const first = filtered[0];\n return first ?? '';\n }\n return p(filtered.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const nonEmpty = op.$any.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('or', results) : '';\n }\n if (op.$all) {\n const nonEmpty = op.$all.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? chain('and', results) : '';\n }\n if (op.$none) {\n const nonEmpty = op.$none.filter((v: string) => String(v ?? '').trim() !== '');\n const results = nonEmpty.map((v: string) => fv(field, String(v ?? ''))).filter((result: string) => result.trim() !== '');\n return results.length > 0 ? `not ${p(chain('or', results))}` : '';\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: { $gte?: string; $lt?: string }) {\n const parts: string[] = [];\n if (d.$gte) parts.push(`modifiedTime >= '${d.$gte}'`);\n if (d.$lt) parts.push(`modifiedTime < '${d.$lt}'`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['name', 'mimeType', 'fullText', 'parentId', 'owner'];\n }\n\n function emit(n: DriveQueryObject): string {\n if (n.$and) return p(n.$and.map(emit).join(' and '));\n if (n.$or) return p(n.$or.map(emit).join(' or '));\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const expressions: string[] = [];\n\n if (typeof n.starred === 'boolean') {\n starredFlag = n.starred;\n expressions.push(`starred = ${n.starred}`);\n }\n if (typeof n.sharedWithMe === 'boolean') {\n sharedWithMeFlag = n.sharedWithMe;\n expressions.push(`sharedWithMe = ${n.sharedWithMe}`);\n }\n if (typeof n.trashed === 'boolean') {\n trashedFlag = n.trashed;\n expressions.push(`trashed = ${n.trashed}`);\n }\n if (n.modifiedTime) {\n expressions.push(dateExpr(n.modifiedTime));\n }\n\n for (const k of fieldKeys()) {\n if (typeof n === 'object' && n !== null && k in n) {\n const op = (n as Record<string, string | FieldOperator>)[k];\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n const result = fieldExpr(k, normalizedOp);\n if (result.trim() !== '') {\n expressions.push(result);\n }\n }\n }\n\n // Handle empty objects\n if (expressions.length === 0 && typeof n === 'object' && n !== null && Object.keys(n).length === 0) {\n return '';\n }\n\n // Combine multiple expressions with AND\n if (expressions.length > 1) {\n return chain('and', expressions);\n }\n if (expressions.length === 1) {\n return expressions[0] ?? '';\n }\n\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: DriveQueryObject): string {\n if (!n) return '';\n\n // Handle empty objects\n if (typeof n === 'object' && n !== null && Object.keys(n).length === 0) return '';\n\n if (n.$and) return n.$and.map(emit).join(' and ');\n if (n.$or) return n.$or.map(emit).join(' or ');\n if (n.$not) return `not ${emit(n.$not)}`;\n\n const result = emit(n);\n return result.trim() === '' ? '' : result;\n }\n\n const q = emitTop(query);\n const cleanedQuery = q.replace(/\\s+and\\s+$|\\s+or\\s+$|^\\s+and\\s+|^\\s+or\\s+/gi, '').trim();\n\n const filters: FiltersObject = {};\n if (nameIncludes.length) filters.nameIncludes = nameIncludes;\n if (mimeTypeIncludes.length) filters.mimeTypeIncludes = mimeTypeIncludes;\n if (fullTextIncludes.length) filters.fullTextIncludes = fullTextIncludes;\n if (parentIdIncludes.length) filters.parentIdIncludes = parentIdIncludes;\n if (ownerIncludes.length) filters.ownerIncludes = ownerIncludes;\n // Use tracked flags from emit() to capture nested boolean conditions\n if (typeof starredFlag === 'boolean') filters.starred = starredFlag;\n if (typeof sharedWithMeFlag === 'boolean') filters.sharedWithMe = sharedWithMeFlag;\n if (typeof trashedFlag === 'boolean') filters.trashed = trashedFlag;\n\n return { q: cleanedQuery ?? '', filters };\n}\n"],"names":["toDriveQuery","query","q","filters","nameIncludes","mimeTypeIncludes","fullTextIncludes","parentIdIncludes","ownerIncludes","starredFlag","sharedWithMeFlag","trashedFlag","p","s","String","quote","str","replace","fv","field","raw","rawVal","v","push","chain","op","arr","filtered","filter","trim","length","first","join","fieldExpr","$any","nonEmpty","results","map","result","$all","$none","Error","JSON","stringify","dateExpr","d","parts","$gte","$lt","fieldKeys","emit","n","$and","$or","$not","expressions","starred","sharedWithMe","trashed","modifiedTime","k","normalizedOp","Object","keys","emitTop","cleanedQuery"],"mappings":"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"}
|
package/dist/cjs/mcp/index.js
CHANGED
|
@@ -10,18 +10,18 @@ function _export(target, all) {
|
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
12
|
get promptFactories () {
|
|
13
|
-
return
|
|
13
|
+
return _indexts;
|
|
14
14
|
},
|
|
15
15
|
get resourceFactories () {
|
|
16
|
-
return
|
|
16
|
+
return _indexts1;
|
|
17
17
|
},
|
|
18
18
|
get toolFactories () {
|
|
19
|
-
return
|
|
19
|
+
return _indexts2;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
22
|
+
var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
|
|
23
|
+
var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
|
|
24
|
+
var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
|
|
25
25
|
function _getRequireWildcardCache(nodeInterop) {
|
|
26
26
|
if (typeof WeakMap !== "function") return null;
|
|
27
27
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;+DAFqB;gEACE;gEACJ"}
|
|
@@ -10,14 +10,14 @@ function _export(target, all) {
|
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
12
|
get organizeFiles () {
|
|
13
|
-
return
|
|
13
|
+
return _organizefilests.default;
|
|
14
14
|
},
|
|
15
15
|
get querySyntax () {
|
|
16
|
-
return
|
|
16
|
+
return _querysyntaxts.default;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
-
var
|
|
20
|
-
var
|
|
19
|
+
var _organizefilests = /*#__PURE__*/ _interop_require_default(require("./organize-files.js"));
|
|
20
|
+
var _querysyntaxts = /*#__PURE__*/ _interop_require_default(require("./query-syntax.js"));
|
|
21
21
|
function _interop_require_default(obj) {
|
|
22
22
|
return obj && obj.__esModule ? obj : {
|
|
23
23
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as organizeFiles } from './organize-files.ts';\nexport { default as querySyntax } from './query-syntax.ts';\n"],"names":["organizeFiles","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,wBAAa;;QACbC;eAAAA,sBAAW;;;sEADU;oEACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/prompts/organize-files.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\n\nexport default function createPrompt() {\n const config = {\n description: 'Help organize and manage files in Google Drive',\n argsSchema: {} as const,\n };\n\n return {\n name: 'organize-files',\n config,\n handler: async () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: 'You are an expert file organizer assistant. Help me organize my Google Drive files.',\n },\n },\n ],\n }),\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","argsSchema","name","handler","messages","role","content","type","text"],"mappings":";;;;+BAEA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;QACbC,YAAY,CAAC;IACf;IAEA,OAAO;QACLC,MAAM;QACNH,QAAAA;QACAI,SAAS;;;;;wBAAa;4BACpBC,QAAQ;gCACN;oCACEC,MAAM;oCACNC,SAAS;wCACPC,MAAM;wCACNC,MAAM;oCACR;gCACF;;wBAEJ;;;;;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Google Drive query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Google Drive Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## File/Folder Fields\n- \\`name\\`: Search by name (partial match, case-insensitive)\n- \\`mimeType\\`: Filter by MIME type\n- \\`fullText\\`: Search file content and metadata\n- \\`parentId\\`: Search within folder (use \"root\" for My Drive)\n- \\`owner\\`: Filter by owner email\n\n## Boolean Flags\n- \\`starred\\`: true/false\n- \\`sharedWithMe\\`: true/false\n- \\`trashed\\`: true/false (tools auto-filter trashed by default)\n\n## Date Range\n\\`\\`\\`json\n{ \"modifiedTime\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Common MIME Types\n- \\`application/vnd.google-apps.folder\\`: Folders\n- \\`application/vnd.google-apps.document\\`: Google Docs\n- \\`application/vnd.google-apps.spreadsheet\\`: Google Sheets\n- \\`application/vnd.google-apps.presentation\\`: Google Slides\n- \\`application/pdf\\`: PDF files\n- \\`image/jpeg\\`, \\`image/png\\`: Images\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Escape Hatch\n- \\`rawDriveQuery\\`: Raw Google Drive query syntax\n\n## Example Queries\n\\`\\`\\`json\n// PDFs modified this year\n{ \"mimeType\": \"application/pdf\", \"modifiedTime\": { \"$gte\": \"2024-01-01\" } }\n\n// Starred spreadsheets\n{ \"mimeType\": \"application/vnd.google-apps.spreadsheet\", \"starred\": true }\n\n// Files in specific folder\n{ \"parentId\": \"1abc123xyz\" }\n\n// Search by name\n{ \"name\": \"budget\" }\n\n// Complex: shared PDFs or Docs\n{ \"$or\": [\n { \"mimeType\": \"application/pdf\", \"sharedWithMe\": true },\n { \"mimeType\": \"application/vnd.google-apps.document\", \"sharedWithMe\": true }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":";;;;+BAIA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;IACf;IAEA,IAAMC,UAAU,SAAOC,OAAiCC;;;gBACtD;;oBAAO;wBACLC,QAAQ;4BACN;gCACEC,MAAM;gCACNC,SAAS;oCACPC,MAAM;oCACNC,MAAM;gCA4DR;4BACF;;oBAEJ;;;QACF;;IAEA,OAAO;QACLC,MAAM;QACNV,QAAAA;QACAE,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/resources/file.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\n\nexport default function createResource() {\n const template = new ResourceTemplate('drive://files/{fileId}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Drive file resource',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: Record<string, string | string[]>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n // Extract fileId and handle both string and string[] cases\n const fileId = Array.isArray(variables.fileId) ? variables.fileId[0] : variables.fileId;\n\n try {\n // Validate fileId exists and is a string\n if (!fileId || typeof fileId !== 'string') {\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({\n error: 'Missing or invalid fileId in resource URI',\n }),\n },\n ],\n };\n }\n\n // Safe type guard to access middleware-enriched extra\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n const drive = google.drive({ version: 'v3', auth: authContext.auth });\n const resp = await drive.files.get({\n fileId,\n fields: 'id,name,mimeType,size,modifiedTime,owners,webViewLink',\n });\n const data = resp.data;\n logger.debug?.({ fileId, fileName: data?.name }, 'drive-file resource fetch success');\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(data || {}),\n },\n ],\n };\n } catch (error) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.debug?.(error as Record<string, unknown>, 'drive resource fetch failed');\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: (error as Error).message }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'file',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","fileId","logger","authContext","drive","resp","data","error","Array","isArray","contents","href","text","JSON","stringify","google","version","auth","files","get","fields","debug","fileName","name","message"],"mappings":";;;;+BAOA;;;eAAwBA;;;mBALS;0BAGV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAER,SAASA;IACtB,IAAMC,WAAW,IAAIC,qBAAgB,CAAC,0BAA0B;QAC9DC,MAAMC;IACR;IACA,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,SAAOC,KAAUC,WAA8CC;;gBAEvEC,QA0BJC,eAPQA,QAAQC,aACVC,OACAC,MAIAC,MAWCC,OAEPL,gBADQA;;;;wBAtCV,2DAA2D;wBACrDD,SAASO,MAAMC,OAAO,CAACV,UAAUE,MAAM,IAAIF,UAAUE,MAAM,CAAC,EAAE,GAAGF,UAAUE,MAAM;;;;;;;;;wBAGrF,yCAAyC;wBACzC,IAAI,CAACA,UAAU,OAAOA,WAAW,UAAU;4BACzC;;gCAAO;oCACLS,QAAQ;wCACN;4CACEZ,KAAKA,IAAIa,IAAI;4CACbf,UAAU;4CACVgB,MAAMC,KAAKC,SAAS,CAAC;gDACnBP,OAAO;4CACT;wCACF;;gCAEJ;;wBACF;wBAEA,sDAAsD;wBAC9CL,SAAwBF,MAAxBE,QAAQC,cAAgBH,MAAhBG;wBACVC,QAAQW,kBAAM,CAACX,KAAK,CAAC;4BAAEY,SAAS;4BAAMC,MAAMd,YAAYc,IAAI;wBAAC;wBACtD;;4BAAMb,MAAMc,KAAK,CAACC,GAAG,CAAC;gCACjClB,QAAAA;gCACAmB,QAAQ;4BACV;;;wBAHMf,OAAO;wBAIPC,OAAOD,KAAKC,IAAI;yBACtBJ,gBAAAA,OAAOmB,KAAK,cAAZnB,oCAAAA,mBAAAA,QAAe;4BAAED,QAAAA;4BAAQqB,QAAQ,EAAEhB,iBAAAA,2BAAAA,KAAMiB,IAAI;wBAAC,GAAG;wBACjD;;4BAAO;gCACLb,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAACR,QAAQ,CAAC;oCAChC;;4BAEJ;;;wBACOC;wBACCL,UAAWF,MAAXE;yBACRA,iBAAAA,QAAOmB,KAAK,cAAZnB,qCAAAA,oBAAAA,SAAeK,OAAkC;wBACjD;;4BAAO;gCACLG,QAAQ;oCACN;wCACEZ,KAAKA,IAAIa,IAAI;wCACbf,UAAU;wCACVgB,MAAMC,KAAKC,SAAS,CAAC;4CAAEP,OAAO,AAACA,MAAgBiB,OAAO;wCAAC;oCACzD;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACLD,MAAM;QACNjC,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
Object.defineProperty(exports, "file", {
|
|
6
6
|
enumerable: true,
|
|
7
7
|
get: function() {
|
|
8
|
-
return
|
|
8
|
+
return _filets.default;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
var
|
|
11
|
+
var _filets = /*#__PURE__*/ _interop_require_default(require("./file.js"));
|
|
12
12
|
function _interop_require_default(obj) {
|
|
13
13
|
return obj && obj.__esModule ? obj : {
|
|
14
14
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/resources/index.ts"],"sourcesContent":["export { default as file } from './file.ts';\n"],"names":["file"],"mappings":";;;;+BAAoBA;;;eAAAA,eAAI;;;6DAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/tools/file-move-to-trash.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\nconst MAX_BATCH_SIZE = 1000;\n\nconst inputSchema = z.object({\n ids: z.array(z.string().min(1)).min(1).max(MAX_BATCH_SIZE).describe('File IDs to soft delete (move to trash)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n operationSummary: z.string().describe('Human-readable summary of the operation'),\n totalCount: z.number().describe('Total number of files requested to trash'),\n successCount: z.number().describe('Number of files successfully moved to trash'),\n failureCount: z.number().describe('Number of files that failed to move'),\n recoverable: z.boolean().describe('Whether trashed files can be restored'),\n recoverableDays: z.number().describe('Days until permanent deletion'),\n failures: z\n .array(\n z.object({\n id: z.string().describe('ID of the file that failed'),\n error: z.string().describe('Error message explaining the failure'),\n })\n )\n .optional()\n .describe('Details of any files that failed to trash'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Move Files to Trash',\n description: 'Move files to trash (recoverable for 30 days).',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('drive.file.moveToTrash called', { count: ids.length });\n\n try {\n const drive = google.drive({ version: 'v3', auth: extra.authContext.auth });\n\n const results = await Promise.allSettled(\n ids.map(async (id) => {\n await drive.files.update({\n fileId: id,\n requestBody: { trashed: true },\n });\n return id;\n })\n );\n\n // Separate successes and failures\n const failures: Array<{ id: string; error: string }> = [];\n\n results.forEach((result, index) => {\n const id = ids[index];\n if (!id) return;\n\n if (result.status === 'rejected') {\n const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason);\n failures.push({ id, error: errorMessage });\n }\n });\n\n const successCount = ids.length - failures.length;\n const failureCount = failures.length;\n const totalCount = ids.length;\n\n logger.info('drive.file.moveToTrash completed', {\n totalCount,\n successCount,\n failureCount,\n });\n\n const operationSummary = failureCount === 0 ? `Moved ${successCount} file${successCount === 1 ? '' : 's'} to trash (recoverable for 30 days)` : `Moved ${successCount} of ${totalCount} file${totalCount === 1 ? '' : 's'} to trash (${failureCount} failed, recoverable for 30 days)`;\n\n const result: Output = {\n type: 'success' as const,\n operationSummary,\n totalCount,\n successCount,\n failureCount,\n recoverable: true,\n recoverableDays: 30,\n ...(failures.length > 0 && { failures }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.file.moveToTrash error', { error: message });\n\n // Throw McpError\n throw new McpError(ErrorCode.InternalError, `Error moving files to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'file-move-to-trash' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","MAX_BATCH_SIZE","inputSchema","z","object","ids","array","string","min","max","describe","successBranchSchema","type","literal","operationSummary","totalCount","number","successCount","failureCount","recoverable","boolean","recoverableDays","failures","id","error","optional","outputSchema","discriminatedUnion","config","title","description","result","handler","extra","logger","drive","results","message","info","count","length","google","version","auth","authContext","Promise","allSettled","map","files","update","fileId","requestBody","trashed","forEach","index","status","errorMessage","reason","Error","String","push","content","text","JSON","stringify","structuredContent","McpError","ErrorCode","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/mcp/tools/file-move.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport type { drive_v3 } from 'googleapis';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport type { Logger } from '../../types.js';\n\n// Type guard for Google Drive API errors\ninterface DriveApiError {\n message?: string;\n code?: number | string;\n}\n\nfunction isDriveApiError(error: unknown): error is DriveApiError {\n return typeof error === 'object' && error !== null && ('message' in error || 'code' in error);\n}\n\n// Types for results\ninterface MoveResult {\n fileId: string;\n fileName: string;\n oldParents: string[];\n newParent: string;\n webViewLink?: string;\n}\n\ninterface FailedMove {\n fileId: string;\n error: string;\n code?: string;\n}\n\nconst inputSchema = z.object({\n fileIds: z.union([z.string().min(1), z.array(z.string().min(1)).min(1).max(100)]).describe('File or folder ID(s) to move. Single ID or array (max 100 for batch)'),\n destinationFolderId: z.string().min(1).describe('Destination folder ID (use \"root\" for My Drive root)'),\n returnOldParents: z.boolean().optional().describe('Include old parent IDs in response for manual undo (recommended: true)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n moved: z\n .array(\n z.object({\n fileId: z.string().describe('ID of the moved file'),\n fileName: z.string().describe('Name of the moved file'),\n oldParents: z.array(z.string()).describe('Previous parent folder IDs (for undo)'),\n newParent: z.string().describe('New parent folder ID'),\n webViewLink: z.string().optional().describe('URL to view the file'),\n })\n )\n .describe('Successfully moved files'),\n failed: z\n .array(\n z.object({\n fileId: z.string().describe('ID of the file that failed to move'),\n error: z.string().describe('Error message explaining the failure'),\n code: z.string().optional().describe('API error code if available'),\n })\n )\n .optional()\n .describe('Files that failed to move'),\n totalRequested: z.number().describe('Total number of files requested to move'),\n totalMoved: z.number().describe('Number of files successfully moved'),\n totalFailed: z.number().describe('Number of files that failed to move'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Move Files',\n description: 'Move files/folders to destination folder. Returns oldParents for undo. Use \"root\" for My Drive root.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n/**\n * Move a single file to a new parent folder\n */\nasync function moveSingleFile(\n drive: drive_v3.Drive,\n fileId: string,\n destinationFolderId: string,\n returnOldParents: boolean,\n logger: Logger\n): Promise<{\n success: boolean;\n result?: MoveResult;\n error?: FailedMove;\n}> {\n try {\n // Get current file metadata to get old parents\n const fileMetadata = await drive.files.get({\n fileId: fileId,\n fields: 'id,name,parents,webViewLink',\n });\n\n const oldParents = (fileMetadata.data.parents as string[] | undefined) || [];\n const fileName = (fileMetadata.data.name as string | undefined) || fileId;\n const webViewLink = fileMetadata.data.webViewLink as string | undefined;\n\n // Move file using addParents and removeParents\n await drive.files.update({\n fileId: fileId,\n addParents: destinationFolderId,\n removeParents: oldParents.join(','),\n fields: 'id,name,parents,webViewLink',\n });\n\n const result: MoveResult = {\n fileId: fileId,\n fileName: fileName,\n oldParents: returnOldParents ? oldParents : [],\n newParent: destinationFolderId,\n ...(webViewLink && { webViewLink }),\n };\n\n return { success: true, result };\n } catch (e: unknown) {\n const errorMessage = isDriveApiError(e) && e.message ? e.message : 'Unknown error';\n const errorCode = isDriveApiError(e) && e.code ? String(e.code) : undefined;\n logger.info('Failed to move file', { fileId, error: errorMessage });\n return {\n success: false,\n error: {\n fileId: fileId,\n error: errorMessage,\n ...(errorCode && { code: errorCode }),\n },\n };\n }\n}\n\n/**\n * Move multiple files using batch requests\n */\nasync function moveBatchFiles(\n drive: drive_v3.Drive,\n fileIds: string[],\n destinationFolderId: string,\n returnOldParents: boolean,\n _logger: Logger\n): Promise<{\n moved: MoveResult[];\n failed: FailedMove[];\n}> {\n const moved: MoveResult[] = [];\n const failed: FailedMove[] = [];\n\n // First, fetch metadata for all files in batch\n const metadataResults = await Promise.allSettled(\n fileIds.map(async (fileId) => {\n try {\n const response = await drive.files.get({\n fileId: fileId,\n fields: 'id,name,parents,webViewLink',\n });\n const webViewLink = response.data.webViewLink as string | undefined;\n return {\n fileId: fileId,\n name: (response.data.name as string | undefined) || fileId,\n parents: (response.data.parents as string[] | undefined) || [],\n ...(webViewLink && { webViewLink }),\n };\n } catch (e: unknown) {\n const message = isDriveApiError(e) && e.message ? e.message : String(e);\n throw new Error(`Failed to fetch metadata: ${message}`);\n }\n })\n );\n\n // Process metadata results\n const filesToMove: Array<{\n fileId: string;\n name: string;\n parents: string[];\n webViewLink?: string;\n }> = [];\n for (let i = 0; i < metadataResults.length; i++) {\n const result = metadataResults[i];\n if (result && result.status === 'fulfilled') {\n filesToMove.push(result.value);\n } else if (result && result.status === 'rejected') {\n const fileId = fileIds[i];\n if (fileId) {\n const errorCode = result.reason?.code ? String(result.reason.code) : undefined;\n failed.push({\n fileId: fileId,\n error: result.reason?.message || 'Failed to fetch file metadata',\n ...(errorCode && { code: errorCode }),\n });\n }\n }\n }\n\n // Now move files in batch\n const moveResults = await Promise.allSettled(\n filesToMove.map(async (file) => {\n try {\n await drive.files.update({\n fileId: file.fileId,\n addParents: destinationFolderId,\n removeParents: file.parents.join(','),\n fields: 'id',\n });\n return {\n fileId: file.fileId,\n fileName: file.name,\n oldParents: returnOldParents ? file.parents : [],\n newParent: destinationFolderId,\n ...(file.webViewLink && { webViewLink: file.webViewLink }),\n };\n } catch (e: unknown) {\n const message = isDriveApiError(e) && e.message ? e.message : String(e);\n throw new Error(`Failed to move: ${message}`);\n }\n })\n );\n\n // Process move results\n for (let i = 0; i < moveResults.length; i++) {\n const result = moveResults[i];\n if (result && result.status === 'fulfilled') {\n moved.push(result.value);\n } else if (result && result.status === 'rejected') {\n const file = filesToMove[i];\n if (file) {\n const errorCode = result.reason?.code ? String(result.reason.code) : undefined;\n failed.push({\n fileId: file.fileId,\n error: result.reason?.message || 'Failed to move file',\n ...(errorCode && { code: errorCode }),\n });\n }\n }\n }\n\n return { moved, failed };\n}\n\nasync function handler({ fileIds, destinationFolderId, returnOldParents = true }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n const isBatch = Array.isArray(fileIds);\n const fileIdArray = Array.isArray(fileIds) ? fileIds : [fileIds];\n\n logger.info('drive.file.move called', {\n fileCount: fileIdArray.length,\n isBatch,\n destinationFolderId,\n returnOldParents,\n });\n\n try {\n const drive = google.drive({ version: 'v3', auth: extra.authContext.auth });\n\n let moved: MoveResult[] = [];\n let failed: FailedMove[] = [];\n\n if (isBatch && fileIdArray.length > 1) {\n // Use batch API for multiple files\n const batchResult = await moveBatchFiles(drive, fileIdArray, destinationFolderId, returnOldParents, logger);\n moved = batchResult.moved;\n failed = batchResult.failed;\n } else {\n // Single file operation\n const fileId = fileIdArray[0];\n if (fileId) {\n const singleResult = await moveSingleFile(drive, fileId, destinationFolderId, returnOldParents, logger);\n if (singleResult.success && singleResult.result) {\n moved.push(singleResult.result);\n } else if (singleResult.error) {\n failed.push(singleResult.error);\n }\n }\n }\n\n logger.info('drive.file.move returning', {\n totalRequested: fileIdArray.length,\n totalMoved: moved.length,\n totalFailed: failed.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n moved,\n ...(failed.length > 0 && { failed }),\n totalRequested: fileIdArray.length,\n totalMoved: moved.length,\n totalFailed: failed.length,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.file.move error', { error: message });\n\n // Throw McpError\n throw new McpError(ErrorCode.InternalError, `Error moving files: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'file-move' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","isDriveApiError","error","inputSchema","z","object","fileIds","union","string","min","array","max","describe","destinationFolderId","returnOldParents","boolean","optional","successBranchSchema","type","literal","moved","fileId","fileName","oldParents","newParent","webViewLink","failed","code","totalRequested","number","totalMoved","totalFailed","outputSchema","discriminatedUnion","config","title","description","result","moveSingleFile","drive","logger","fileMetadata","e","errorMessage","errorCode","files","get","fields","data","parents","name","update","addParents","removeParents","join","success","message","String","undefined","info","moveBatchFiles","_logger","metadataResults","filesToMove","i","moveResults","file","Promise","allSettled","map","response","Error","length","status","push","value","reason","handler","extra","isBatch","fileIdArray","batchResult","singleResult","Array","isArray","fileCount","google","version","auth","authContext","content","text","JSON","stringify","structuredContent","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-drive/src/mcp/tools/file-move.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport type { drive_v3 } from 'googleapis';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport type { Logger } from '../../types.ts';\n\n// Type guard for Google Drive API errors\ninterface DriveApiError {\n message?: string;\n code?: number | string;\n}\n\nfunction isDriveApiError(error: unknown): error is DriveApiError {\n return typeof error === 'object' && error !== null && ('message' in error || 'code' in error);\n}\n\n// Types for results\ninterface MoveResult {\n fileId: string;\n fileName: string;\n oldParents: string[];\n newParent: string;\n webViewLink?: string;\n}\n\ninterface FailedMove {\n fileId: string;\n error: string;\n code?: string;\n}\n\nconst inputSchema = z.object({\n fileIds: z.union([z.string().min(1), z.array(z.string().min(1)).min(1).max(100)]).describe('File or folder ID(s) to move. Single ID or array (max 100 for batch)'),\n destinationFolderId: z.string().min(1).describe('Destination folder ID (use \"root\" for My Drive root)'),\n returnOldParents: z.boolean().optional().describe('Include old parent IDs in response for manual undo (recommended: true)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n moved: z\n .array(\n z.object({\n fileId: z.string().describe('ID of the moved file'),\n fileName: z.string().describe('Name of the moved file'),\n oldParents: z.array(z.string()).describe('Previous parent folder IDs (for undo)'),\n newParent: z.string().describe('New parent folder ID'),\n webViewLink: z.string().optional().describe('URL to view the file'),\n })\n )\n .describe('Successfully moved files'),\n failed: z\n .array(\n z.object({\n fileId: z.string().describe('ID of the file that failed to move'),\n error: z.string().describe('Error message explaining the failure'),\n code: z.string().optional().describe('API error code if available'),\n })\n )\n .optional()\n .describe('Files that failed to move'),\n totalRequested: z.number().describe('Total number of files requested to move'),\n totalMoved: z.number().describe('Number of files successfully moved'),\n totalFailed: z.number().describe('Number of files that failed to move'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n title: 'Move Files',\n description: 'Move files/folders to destination folder. Returns oldParents for undo. Use \"root\" for My Drive root.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\n/**\n * Move a single file to a new parent folder\n */\nasync function moveSingleFile(\n drive: drive_v3.Drive,\n fileId: string,\n destinationFolderId: string,\n returnOldParents: boolean,\n logger: Logger\n): Promise<{\n success: boolean;\n result?: MoveResult;\n error?: FailedMove;\n}> {\n try {\n // Get current file metadata to get old parents\n const fileMetadata = await drive.files.get({\n fileId: fileId,\n fields: 'id,name,parents,webViewLink',\n });\n\n const oldParents = (fileMetadata.data.parents as string[] | undefined) || [];\n const fileName = (fileMetadata.data.name as string | undefined) || fileId;\n const webViewLink = fileMetadata.data.webViewLink as string | undefined;\n\n // Move file using addParents and removeParents\n await drive.files.update({\n fileId: fileId,\n addParents: destinationFolderId,\n removeParents: oldParents.join(','),\n fields: 'id,name,parents,webViewLink',\n });\n\n const result: MoveResult = {\n fileId: fileId,\n fileName: fileName,\n oldParents: returnOldParents ? oldParents : [],\n newParent: destinationFolderId,\n ...(webViewLink && { webViewLink }),\n };\n\n return { success: true, result };\n } catch (e: unknown) {\n const errorMessage = isDriveApiError(e) && e.message ? e.message : 'Unknown error';\n const errorCode = isDriveApiError(e) && e.code ? String(e.code) : undefined;\n logger.info('Failed to move file', { fileId, error: errorMessage });\n return {\n success: false,\n error: {\n fileId: fileId,\n error: errorMessage,\n ...(errorCode && { code: errorCode }),\n },\n };\n }\n}\n\n/**\n * Move multiple files using batch requests\n */\nasync function moveBatchFiles(\n drive: drive_v3.Drive,\n fileIds: string[],\n destinationFolderId: string,\n returnOldParents: boolean,\n _logger: Logger\n): Promise<{\n moved: MoveResult[];\n failed: FailedMove[];\n}> {\n const moved: MoveResult[] = [];\n const failed: FailedMove[] = [];\n\n // First, fetch metadata for all files in batch\n const metadataResults = await Promise.allSettled(\n fileIds.map(async (fileId) => {\n try {\n const response = await drive.files.get({\n fileId: fileId,\n fields: 'id,name,parents,webViewLink',\n });\n const webViewLink = response.data.webViewLink as string | undefined;\n return {\n fileId: fileId,\n name: (response.data.name as string | undefined) || fileId,\n parents: (response.data.parents as string[] | undefined) || [],\n ...(webViewLink && { webViewLink }),\n };\n } catch (e: unknown) {\n const message = isDriveApiError(e) && e.message ? e.message : String(e);\n throw new Error(`Failed to fetch metadata: ${message}`);\n }\n })\n );\n\n // Process metadata results\n const filesToMove: Array<{\n fileId: string;\n name: string;\n parents: string[];\n webViewLink?: string;\n }> = [];\n for (let i = 0; i < metadataResults.length; i++) {\n const result = metadataResults[i];\n if (result && result.status === 'fulfilled') {\n filesToMove.push(result.value);\n } else if (result && result.status === 'rejected') {\n const fileId = fileIds[i];\n if (fileId) {\n const errorCode = result.reason?.code ? String(result.reason.code) : undefined;\n failed.push({\n fileId: fileId,\n error: result.reason?.message || 'Failed to fetch file metadata',\n ...(errorCode && { code: errorCode }),\n });\n }\n }\n }\n\n // Now move files in batch\n const moveResults = await Promise.allSettled(\n filesToMove.map(async (file) => {\n try {\n await drive.files.update({\n fileId: file.fileId,\n addParents: destinationFolderId,\n removeParents: file.parents.join(','),\n fields: 'id',\n });\n return {\n fileId: file.fileId,\n fileName: file.name,\n oldParents: returnOldParents ? file.parents : [],\n newParent: destinationFolderId,\n ...(file.webViewLink && { webViewLink: file.webViewLink }),\n };\n } catch (e: unknown) {\n const message = isDriveApiError(e) && e.message ? e.message : String(e);\n throw new Error(`Failed to move: ${message}`);\n }\n })\n );\n\n // Process move results\n for (let i = 0; i < moveResults.length; i++) {\n const result = moveResults[i];\n if (result && result.status === 'fulfilled') {\n moved.push(result.value);\n } else if (result && result.status === 'rejected') {\n const file = filesToMove[i];\n if (file) {\n const errorCode = result.reason?.code ? String(result.reason.code) : undefined;\n failed.push({\n fileId: file.fileId,\n error: result.reason?.message || 'Failed to move file',\n ...(errorCode && { code: errorCode }),\n });\n }\n }\n }\n\n return { moved, failed };\n}\n\nasync function handler({ fileIds, destinationFolderId, returnOldParents = true }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n const isBatch = Array.isArray(fileIds);\n const fileIdArray = Array.isArray(fileIds) ? fileIds : [fileIds];\n\n logger.info('drive.file.move called', {\n fileCount: fileIdArray.length,\n isBatch,\n destinationFolderId,\n returnOldParents,\n });\n\n try {\n const drive = google.drive({ version: 'v3', auth: extra.authContext.auth });\n\n let moved: MoveResult[] = [];\n let failed: FailedMove[] = [];\n\n if (isBatch && fileIdArray.length > 1) {\n // Use batch API for multiple files\n const batchResult = await moveBatchFiles(drive, fileIdArray, destinationFolderId, returnOldParents, logger);\n moved = batchResult.moved;\n failed = batchResult.failed;\n } else {\n // Single file operation\n const fileId = fileIdArray[0];\n if (fileId) {\n const singleResult = await moveSingleFile(drive, fileId, destinationFolderId, returnOldParents, logger);\n if (singleResult.success && singleResult.result) {\n moved.push(singleResult.result);\n } else if (singleResult.error) {\n failed.push(singleResult.error);\n }\n }\n }\n\n logger.info('drive.file.move returning', {\n totalRequested: fileIdArray.length,\n totalMoved: moved.length,\n totalFailed: failed.length,\n });\n\n const result: Output = {\n type: 'success' as const,\n moved,\n ...(failed.length > 0 && { failed }),\n totalRequested: fileIdArray.length,\n totalMoved: moved.length,\n totalFailed: failed.length,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('drive.file.move error', { error: message });\n\n // Throw McpError\n throw new McpError(ErrorCode.InternalError, `Error moving files: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'file-move' as const,\n config,\n handler,\n };\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","isDriveApiError","error","inputSchema","z","object","fileIds","union","string","min","array","max","describe","destinationFolderId","returnOldParents","boolean","optional","successBranchSchema","type","literal","moved","fileId","fileName","oldParents","newParent","webViewLink","failed","code","totalRequested","number","totalMoved","totalFailed","outputSchema","discriminatedUnion","config","title","description","result","moveSingleFile","drive","logger","fileMetadata","e","errorMessage","errorCode","files","get","fields","data","parents","name","update","addParents","removeParents","join","success","message","String","undefined","info","moveBatchFiles","_logger","metadataResults","filesToMove","i","moveResults","file","Promise","allSettled","map","response","Error","length","status","push","value","reason","handler","extra","isBatch","fileIdArray","batchResult","singleResult","Array","isArray","fileCount","google","version","auth","authContext","content","text","JSON","stringify","structuredContent","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ var _server = require("@mcp-z/server");
|
|
|
13
13
|
var _types = require("@modelcontextprotocol/sdk/types.js");
|
|
14
14
|
var _googleapis = require("googleapis");
|
|
15
15
|
var _zod = require("zod");
|
|
16
|
-
var
|
|
17
|
-
var
|
|
16
|
+
var _querybuilderts = require("../../lib/query-builder.js");
|
|
17
|
+
var _indexts = require("../../schemas/index.js");
|
|
18
18
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
19
19
|
try {
|
|
20
20
|
var info = gen[key](arg);
|
|
@@ -208,11 +208,11 @@ function _ts_generator(thisArg, body) {
|
|
|
208
208
|
}
|
|
209
209
|
var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
|
|
210
210
|
var inputSchema = _zod.z.object(_object_spread_props(_object_spread({
|
|
211
|
-
query:
|
|
211
|
+
query: _indexts.DriveQuerySchema.describe('Drive query object with structured search fields. See DriveQuerySchema for detailed query syntax and examples.'),
|
|
212
212
|
fields: (0, _server.createFieldsSchema)({
|
|
213
|
-
availableFields:
|
|
214
|
-
fieldDescriptions:
|
|
215
|
-
commonPatterns:
|
|
213
|
+
availableFields: _indexts.DRIVE_FILE_FIELDS,
|
|
214
|
+
fieldDescriptions: _indexts.DRIVE_FILE_FIELD_DESCRIPTIONS,
|
|
215
|
+
commonPatterns: _indexts.DRIVE_FILE_COMMON_PATTERNS,
|
|
216
216
|
resourceName: 'Drive file'
|
|
217
217
|
})
|
|
218
218
|
}, (0, _server.createPaginationSchema)({
|
|
@@ -226,7 +226,7 @@ var inputSchema = _zod.z.object(_object_spread_props(_object_spread({
|
|
|
226
226
|
var successObjectsBranchSchema = _zod.z.object({
|
|
227
227
|
type: _zod.z.literal('success'),
|
|
228
228
|
shape: _zod.z.literal('objects'),
|
|
229
|
-
items: _zod.z.array(
|
|
229
|
+
items: _zod.z.array(_indexts.DriveFileSchema).describe('Matching Drive files'),
|
|
230
230
|
count: _zod.z.number().describe('Number of files in this page'),
|
|
231
231
|
nextPageToken: _zod.z.string().optional().describe('Token for fetching next page of results')
|
|
232
232
|
});
|
|
@@ -261,7 +261,7 @@ function handler(_0, _1) {
|
|
|
261
261
|
case 0:
|
|
262
262
|
query = param.query, _param_pageSize = param.pageSize, pageSize = _param_pageSize === void 0 ? 50 : _param_pageSize, pageToken = param.pageToken, fields = param.fields, _param_shape = param.shape, shape = _param_shape === void 0 ? 'arrays' : _param_shape;
|
|
263
263
|
logger = extra.logger;
|
|
264
|
-
requestedFields = (0, _server.parseFields)(fields,
|
|
264
|
+
requestedFields = (0, _server.parseFields)(fields, _indexts.DRIVE_FILE_FIELDS);
|
|
265
265
|
// Validate and clamp pageSize to Google Drive API limits (1-1000)
|
|
266
266
|
validPageSize = Math.max(1, Math.min(1000, Math.floor(pageSize || 50)));
|
|
267
267
|
logger.info('drive.files-search called', {
|
|
@@ -290,7 +290,7 @@ function handler(_0, _1) {
|
|
|
290
290
|
qStr = "(".concat(query.rawDriveQuery, ") and trashed = false");
|
|
291
291
|
} else {
|
|
292
292
|
// Structured query object - convert to Drive query string
|
|
293
|
-
q = (0,
|
|
293
|
+
q = (0, _querybuilderts.toDriveQuery)(query).q;
|
|
294
294
|
qStr = q ? "(".concat(q, ") and trashed = false") : 'trashed = false';
|
|
295
295
|
}
|
|
296
296
|
listOptions = {
|
|
@@ -472,7 +472,7 @@ function handler(_0, _1) {
|
|
|
472
472
|
result = shape === 'arrays' ? _object_spread(_object_spread_props(_object_spread({
|
|
473
473
|
type: 'success',
|
|
474
474
|
shape: 'arrays'
|
|
475
|
-
}, (0, _server.toColumnarFormat)(filteredItems, requestedFields,
|
|
475
|
+
}, (0, _server.toColumnarFormat)(filteredItems, requestedFields, _indexts.DRIVE_FILE_FIELDS)), {
|
|
476
476
|
count: filteredItems.length
|
|
477
477
|
}), nextPageToken && {
|
|
478
478
|
nextPageToken: nextPageToken
|