@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.
Files changed (78) hide show
  1. package/README.md +32 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/index.js +13 -13
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/lib/create-store.js.map +1 -1
  7. package/dist/cjs/lib/query-builder.js.map +1 -1
  8. package/dist/cjs/mcp/index.js +6 -6
  9. package/dist/cjs/mcp/index.js.map +1 -1
  10. package/dist/cjs/mcp/prompts/index.js +4 -4
  11. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  12. package/dist/cjs/mcp/prompts/organize-files.js.map +1 -1
  13. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  14. package/dist/cjs/mcp/resources/file.js.map +1 -1
  15. package/dist/cjs/mcp/resources/index.js +2 -2
  16. package/dist/cjs/mcp/resources/index.js.map +1 -1
  17. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -1
  18. package/dist/cjs/mcp/tools/file-move.js.map +1 -1
  19. package/dist/cjs/mcp/tools/files-search.js +10 -10
  20. package/dist/cjs/mcp/tools/files-search.js.map +1 -1
  21. package/dist/cjs/mcp/tools/folder-contents.js +7 -7
  22. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -1
  23. package/dist/cjs/mcp/tools/folder-create.js.map +1 -1
  24. package/dist/cjs/mcp/tools/folder-path.js.map +1 -1
  25. package/dist/cjs/mcp/tools/folder-search.js +10 -10
  26. package/dist/cjs/mcp/tools/folder-search.js.map +1 -1
  27. package/dist/cjs/mcp/tools/index.js +14 -14
  28. package/dist/cjs/mcp/tools/index.js.map +1 -1
  29. package/dist/cjs/schemas/drive-query-schema.js.map +1 -1
  30. package/dist/cjs/schemas/drive-validation.js.map +1 -1
  31. package/dist/cjs/schemas/index.js.map +1 -1
  32. package/dist/cjs/setup/config.js +11 -1
  33. package/dist/cjs/setup/config.js.map +1 -1
  34. package/dist/cjs/setup/http.js +6 -2
  35. package/dist/cjs/setup/http.js.map +1 -1
  36. package/dist/cjs/setup/index.js +9 -9
  37. package/dist/cjs/setup/index.js.map +1 -1
  38. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  39. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  40. package/dist/cjs/setup/oauth-google.js +15 -12
  41. package/dist/cjs/setup/oauth-google.js.map +1 -1
  42. package/dist/cjs/setup/runtime.js +9 -9
  43. package/dist/cjs/setup/runtime.js.map +1 -1
  44. package/dist/cjs/setup/stdio.js +2 -2
  45. package/dist/cjs/setup/stdio.js.map +1 -1
  46. package/dist/esm/constants.js.map +1 -1
  47. package/dist/esm/index.js.map +1 -1
  48. package/dist/esm/lib/create-store.js.map +1 -1
  49. package/dist/esm/lib/query-builder.js.map +1 -1
  50. package/dist/esm/mcp/index.js.map +1 -1
  51. package/dist/esm/mcp/prompts/index.js.map +1 -1
  52. package/dist/esm/mcp/prompts/organize-files.js.map +1 -1
  53. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  54. package/dist/esm/mcp/resources/file.js.map +1 -1
  55. package/dist/esm/mcp/resources/index.js.map +1 -1
  56. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -1
  57. package/dist/esm/mcp/tools/file-move.js.map +1 -1
  58. package/dist/esm/mcp/tools/files-search.js.map +1 -1
  59. package/dist/esm/mcp/tools/folder-contents.js.map +1 -1
  60. package/dist/esm/mcp/tools/folder-create.js.map +1 -1
  61. package/dist/esm/mcp/tools/folder-path.js.map +1 -1
  62. package/dist/esm/mcp/tools/folder-search.js.map +1 -1
  63. package/dist/esm/mcp/tools/index.js.map +1 -1
  64. package/dist/esm/schemas/drive-query-schema.js.map +1 -1
  65. package/dist/esm/schemas/drive-validation.js.map +1 -1
  66. package/dist/esm/schemas/index.js.map +1 -1
  67. package/dist/esm/setup/config.js +12 -2
  68. package/dist/esm/setup/config.js.map +1 -1
  69. package/dist/esm/setup/http.js +4 -0
  70. package/dist/esm/setup/http.js.map +1 -1
  71. package/dist/esm/setup/index.js.map +1 -1
  72. package/dist/esm/setup/oauth-google.d.ts +3 -2
  73. package/dist/esm/setup/oauth-google.js +8 -11
  74. package/dist/esm/setup/oauth-google.js.map +1 -1
  75. package/dist/esm/setup/runtime.js.map +1 -1
  76. package/dist/esm/setup/stdio.js.map +1 -1
  77. package/dist/esm/types.js.map +1 -1
  78. 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
- "GOOGLE_CLIENT_SECRET": "your-client-secret"
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.log(err); process.exit(-1); });");
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/ai/mcp-z/servers/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"}
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 _index;
19
+ return _indexts;
20
20
  },
21
21
  get schemas () {
22
- return _index1;
22
+ return _indexts1;
23
23
  },
24
24
  get setup () {
25
- return _index2;
25
+ return _indexts2;
26
26
  },
27
27
  get startServer () {
28
28
  return startServer;
29
29
  }
30
30
  });
31
- var _config = require("./setup/config.js");
32
- var _http = require("./setup/http.js");
33
- var _stdio = require("./setup/stdio.js");
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 _index = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
36
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
37
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
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, _stdio.createStdioServer)(config)
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, _http.createHTTPServer)(config)
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, _config.handleVersionHelp)(process.argv);
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, _config.createConfig)();
297
+ config = (0, _configts.createConfig)();
298
298
  return [
299
299
  4,
300
300
  startServer(config)
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-drive/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.js';\nimport { createHTTPServer } from './setup/http.js';\nimport { createStdioServer } from './setup/stdio.js';\nimport type { ServerConfig } from './types.js';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.js';\nexport * as schemas from './schemas/index.js';\nexport * as setup from './setup/index.js';\nexport * from './types.js';\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;;;sBAX0B;oBACf;qBACC;2BAGL;6DACR;8DACI;8DACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,wBAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,sBAAgB,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,yBAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,oBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
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/ai/mcp-z/servers/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
+ {"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":";;;;+BA2CgBA;;;eAAAA;;;;;;;AAAT,SAASA,aAAaC,KAAiB;IAI5C,iEAAiE;IACjE,IAAI,OAAOA,UAAU,UAAU;QAC7B,OAAO;YAAEC,GAAGD;YAAOE,SAAS,CAAC;QAAE;IACjC;IACA,IAAMC,eAAyB,EAAE;IACjC,IAAMC,mBAA6B,EAAE;IACrC,IAAMC,mBAA6B,EAAE;IACrC,IAAMC,mBAA6B,EAAE;IACrC,IAAMC,gBAA0B,EAAE;IAElC,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJ,SAASC,EAAEC,CAAU;QACnB,OAAO,AAAC,IAAmB,OAAhBC,OAAOD,cAAAA,eAAAA,IAAK,KAAI;IAC7B;IAEA,SAASE,MAAMF,CAAW;QACxB,IAAMG,MAAMF,OAAOD,cAAAA,eAAAA,IAAK;QACxB,8CAA8C;QAC9C,OAAO,AAAC,IAA4B,OAAzBG,IAAIC,OAAO,CAAC,MAAM,QAAO;IACtC;IAEA,SAASC,GAAGC,KAAa,EAAEC,GAAa;QACtC,IAAMC,SAASP,OAAOM,gBAAAA,iBAAAA,MAAO;QAC7B,IAAME,IAAIP,MAAMM;QAEhB,IAAIF,UAAU,QAAQ;YACpBf,aAAamB,IAAI,CAACF;YAClB,OAAO,AAAC,iBAAkB,OAAFC;QAC1B;QACA,IAAIH,UAAU,YAAY;YACxBd,iBAAiBkB,IAAI,CAACF;YACtB,OAAO,AAAC,cAAe,OAAFC;QACvB;QACA,IAAIH,UAAU,YAAY;YACxBb,iBAAiBiB,IAAI,CAACF;YACtB,OAAO,AAAC,qBAAsB,OAAFC;QAC9B;QACA,IAAIH,UAAU,YAAY;YACxBZ,iBAAiBgB,IAAI,CAACF;YACtB,OAAO,AAAC,GAAI,OAAFC,GAAE;QACd;QACA,IAAIH,UAAU,SAAS;YACrBX,cAAce,IAAI,CAACF;YACnB,OAAO,AAAC,GAAI,OAAFC,GAAE;QACd;QAEA,OAAO;IACT;IAEA,SAASE,MAAMC,EAAgB,EAAEC,GAAa;QAC5C,IAAMC,WAAWD,IAAIE,MAAM,CAAC,SAACf;mBAAMA,KAAKA,EAAEgB,IAAI,OAAO;;QACrD,IAAIF,SAASG,MAAM,KAAK,GAAG,OAAO;QAClC,IAAIH,SAASG,MAAM,KAAK,GAAG;YACzB,IAAMC,QAAQJ,QAAQ,CAAC,EAAE;YACzB,OAAOI,kBAAAA,mBAAAA,QAAS;QAClB;QACA,OAAOnB,EAAEe,SAASK,IAAI,CAAC,AAAC,IAAM,OAAHP,IAAG;IAChC;IAEA,SAASQ,UAAUd,KAAa,EAAEM,EAAiB;QACjD,IAAIA,GAAGS,IAAI,EAAE;YACX,IAAMC,WAAWV,GAAGS,IAAI,CAACN,MAAM,CAAC,SAACN;uBAAcR,OAAOQ,cAAAA,eAAAA,IAAK,IAAIO,IAAI,OAAO;;YAC1E,IAAMO,UAAUD,SAASE,GAAG,CAAC,SAACf;uBAAcJ,GAAGC,OAAOL,OAAOQ,cAAAA,eAAAA,IAAK;eAAMM,MAAM,CAAC,SAACU;uBAAmBA,OAAOT,IAAI,OAAO;;YACrH,OAAOO,QAAQN,MAAM,GAAG,IAAIN,MAAM,MAAMY,WAAW;QACrD;QACA,IAAIX,GAAGc,IAAI,EAAE;YACX,IAAMJ,YAAWV,GAAGc,IAAI,CAACX,MAAM,CAAC,SAACN;uBAAcR,OAAOQ,cAAAA,eAAAA,IAAK,IAAIO,IAAI,OAAO;;YAC1E,IAAMO,WAAUD,UAASE,GAAG,CAAC,SAACf;uBAAcJ,GAAGC,OAAOL,OAAOQ,cAAAA,eAAAA,IAAK;eAAMM,MAAM,CAAC,SAACU;uBAAmBA,OAAOT,IAAI,OAAO;;YACrH,OAAOO,SAAQN,MAAM,GAAG,IAAIN,MAAM,OAAOY,YAAW;QACtD;QACA,IAAIX,GAAGe,KAAK,EAAE;YACZ,IAAML,YAAWV,GAAGe,KAAK,CAACZ,MAAM,CAAC,SAACN;uBAAcR,OAAOQ,cAAAA,eAAAA,IAAK,IAAIO,IAAI,OAAO;;YAC3E,IAAMO,WAAUD,UAASE,GAAG,CAAC,SAACf;uBAAcJ,GAAGC,OAAOL,OAAOQ,cAAAA,eAAAA,IAAK;eAAMM,MAAM,CAAC,SAACU;uBAAmBA,OAAOT,IAAI,OAAO;;YACrH,OAAOO,SAAQN,MAAM,GAAG,IAAI,AAAC,OAA8B,OAAxBlB,EAAEY,MAAM,MAAMY,cAAc;QACjE;QACA,MAAM,IAAIK,MAAM,AAAC,0BAA4C,OAAnBC,KAAKC,SAAS,CAAClB;IAC3D;IAEA,SAASmB,SAASC,CAAkC;YAIEC;QAHpD,IAAMA,QAAkB,EAAE;QAC1B,IAAID,EAAEE,IAAI,EAAED,MAAMvB,IAAI,CAAC,AAAC,oBAA0B,OAAPsB,EAAEE,IAAI,EAAC;QAClD,IAAIF,EAAEG,GAAG,EAAEF,MAAMvB,IAAI,CAAC,AAAC,mBAAwB,OAANsB,EAAEG,GAAG,EAAC;QAC/C,OAAOF,MAAMhB,MAAM,GAAG,IAAIlB,EAAEkC,MAAMd,IAAI,CAAC,aAAac,UAAAA,KAAK,CAAC,EAAE,cAARA,qBAAAA,UAAY;IAClE;IAEA,SAASG;QACP,OAAO;YAAC;YAAQ;YAAY;YAAY;YAAY;SAAQ;IAC9D;IAEA,SAASC,KAAKC,CAAmB;QAC/B,IAAIA,EAAEC,IAAI,EAAE,OAAOxC,EAAEuC,EAAEC,IAAI,CAACf,GAAG,CAACa,MAAMlB,IAAI,CAAC;QAC3C,IAAImB,EAAEE,GAAG,EAAE,OAAOzC,EAAEuC,EAAEE,GAAG,CAAChB,GAAG,CAACa,MAAMlB,IAAI,CAAC;QACzC,IAAImB,EAAEG,IAAI,EAAE,OAAO,AAAC,OAAmB,OAAbJ,KAAKC,EAAEG,IAAI;QAErC,IAAMC,cAAwB,EAAE;QAEhC,IAAI,OAAOJ,EAAEK,OAAO,KAAK,WAAW;YAClC/C,cAAc0C,EAAEK,OAAO;YACvBD,YAAYhC,IAAI,CAAC,AAAC,aAAsB,OAAV4B,EAAEK,OAAO;QACzC;QACA,IAAI,OAAOL,EAAEM,YAAY,KAAK,WAAW;YACvC/C,mBAAmByC,EAAEM,YAAY;YACjCF,YAAYhC,IAAI,CAAC,AAAC,kBAAgC,OAAf4B,EAAEM,YAAY;QACnD;QACA,IAAI,OAAON,EAAEO,OAAO,KAAK,WAAW;YAClC/C,cAAcwC,EAAEO,OAAO;YACvBH,YAAYhC,IAAI,CAAC,AAAC,aAAsB,OAAV4B,EAAEO,OAAO;QACzC;QACA,IAAIP,EAAEQ,YAAY,EAAE;YAClBJ,YAAYhC,IAAI,CAACqB,SAASO,EAAEQ,YAAY;QAC1C;YAEK,kCAAA,2BAAA;;YAAL,QAAK,YAAWV,gCAAX,SAAA,6BAAA,QAAA,yBAAA,iCAAwB;gBAAxB,IAAMW,IAAN;gBACH,IAAI,CAAA,OAAOT,kCAAP,SAAOA,EAAAA,MAAM,YAAYA,MAAM,QAAQS,KAAKT,GAAG;oBACjD,IAAM1B,KAAK,AAAC0B,CAA4C,CAACS,EAAE;oBAC3D,IAAMC,eAA8B,OAAOpC,OAAO,WAAW;wBAAES,MAAM;4BAACT;yBAAG;oBAAC,IAAKA,eAAAA,gBAAAA,KAAM,CAAC;oBACtF,IAAMa,SAASL,UAAU2B,GAAGC;oBAC5B,IAAIvB,OAAOT,IAAI,OAAO,IAAI;wBACxB0B,YAAYhC,IAAI,CAACe;oBACnB;gBACF;YACF;;YATK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;QAWL,uBAAuB;QACvB,IAAIiB,YAAYzB,MAAM,KAAK,KAAK,CAAA,OAAOqB,kCAAP,SAAOA,EAAAA,MAAM,YAAYA,MAAM,QAAQW,OAAOC,IAAI,CAACZ,GAAGrB,MAAM,KAAK,GAAG;YAClG,OAAO;QACT;QAEA,wCAAwC;QACxC,IAAIyB,YAAYzB,MAAM,GAAG,GAAG;YAC1B,OAAON,MAAM,OAAO+B;QACtB;QACA,IAAIA,YAAYzB,MAAM,KAAK,GAAG;gBACrByB;YAAP,QAAOA,gBAAAA,WAAW,CAAC,EAAE,cAAdA,2BAAAA,gBAAkB;QAC3B;QAEA,MAAM,IAAId,MAAM,AAAC,iBAAkC,OAAlBC,KAAKC,SAAS,CAACQ;IAClD;IAEA,SAASa,QAAQb,CAAmB;QAClC,IAAI,CAACA,GAAG,OAAO;QAEf,uBAAuB;QACvB,IAAI,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,YAAYA,MAAM,QAAQW,OAAOC,IAAI,CAACZ,GAAGrB,MAAM,KAAK,GAAG,OAAO;QAE/E,IAAIqB,EAAEC,IAAI,EAAE,OAAOD,EAAEC,IAAI,CAACf,GAAG,CAACa,MAAMlB,IAAI,CAAC;QACzC,IAAImB,EAAEE,GAAG,EAAE,OAAOF,EAAEE,GAAG,CAAChB,GAAG,CAACa,MAAMlB,IAAI,CAAC;QACvC,IAAImB,EAAEG,IAAI,EAAE,OAAO,AAAC,OAAmB,OAAbJ,KAAKC,EAAEG,IAAI;QAErC,IAAMhB,SAASY,KAAKC;QACpB,OAAOb,OAAOT,IAAI,OAAO,KAAK,KAAKS;IACrC;IAEA,IAAMpC,IAAI8D,QAAQ/D;IAClB,IAAMgE,eAAe/D,EAAEe,OAAO,CAAC,+CAA+C,IAAIY,IAAI;IAEtF,IAAM1B,UAAyB,CAAC;IAChC,IAAIC,aAAa0B,MAAM,EAAE3B,QAAQC,YAAY,GAAGA;IAChD,IAAIC,iBAAiByB,MAAM,EAAE3B,QAAQE,gBAAgB,GAAGA;IACxD,IAAIC,iBAAiBwB,MAAM,EAAE3B,QAAQG,gBAAgB,GAAGA;IACxD,IAAIC,iBAAiBuB,MAAM,EAAE3B,QAAQI,gBAAgB,GAAGA;IACxD,IAAIC,cAAcsB,MAAM,EAAE3B,QAAQK,aAAa,GAAGA;IAClD,qEAAqE;IACrE,IAAI,OAAOC,gBAAgB,WAAWN,QAAQqD,OAAO,GAAG/C;IACxD,IAAI,OAAOC,qBAAqB,WAAWP,QAAQsD,YAAY,GAAG/C;IAClE,IAAI,OAAOC,gBAAgB,WAAWR,QAAQuD,OAAO,GAAG/C;IAExD,OAAO;QAAET,CAAC,EAAE+D,yBAAAA,0BAAAA,eAAgB;QAAI9D,SAAAA;IAAQ;AAC1C"}
@@ -10,18 +10,18 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  get promptFactories () {
13
- return _index;
13
+ return _indexts;
14
14
  },
15
15
  get resourceFactories () {
16
- return _index1;
16
+ return _indexts1;
17
17
  },
18
18
  get toolFactories () {
19
- return _index2;
19
+ return _indexts2;
20
20
  }
21
21
  });
22
- var _index = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
23
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
24
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
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/ai/mcp-z/servers/mcp-drive/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;6DAFqB;8DACE;8DACJ"}
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 _organizefiles.default;
13
+ return _organizefilests.default;
14
14
  },
15
15
  get querySyntax () {
16
- return _querysyntax.default;
16
+ return _querysyntaxts.default;
17
17
  }
18
18
  });
19
- var _organizefiles = /*#__PURE__*/ _interop_require_default(require("./organize-files.js"));
20
- var _querysyntax = /*#__PURE__*/ _interop_require_default(require("./query-syntax.js"));
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/ai/mcp-z/servers/mcp-drive/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as organizeFiles } from './organize-files.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["organizeFiles","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,sBAAa;;QACbC;eAAAA,oBAAW;;;oEADU;kEACF"}
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/ai/mcp-z/servers/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
+ {"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/ai/mcp-z/servers/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
+ {"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/ai/mcp-z/servers/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"}
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 _file.default;
8
+ return _filets.default;
9
9
  }
10
10
  });
11
- var _file = /*#__PURE__*/ _interop_require_default(require("./file.js"));
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/ai/mcp-z/servers/mcp-drive/src/mcp/resources/index.ts"],"sourcesContent":["export { default as file } from './file.js';\n"],"names":["file"],"mappings":";;;;+BAAoBA;;;eAAAA,aAAI;;;2DAAQ"}
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/ai/mcp-z/servers/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
+ {"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 _querybuilder = require("../../lib/query-builder.js");
17
- var _index = require("../../schemas/index.js");
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: _index.DriveQuerySchema.describe('Drive query object with structured search fields. See DriveQuerySchema for detailed query syntax and examples.'),
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: _index.DRIVE_FILE_FIELDS,
214
- fieldDescriptions: _index.DRIVE_FILE_FIELD_DESCRIPTIONS,
215
- commonPatterns: _index.DRIVE_FILE_COMMON_PATTERNS,
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(_index.DriveFileSchema).describe('Matching Drive files'),
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, _index.DRIVE_FILE_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, _querybuilder.toDriveQuery)(query).q;
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, _index.DRIVE_FILE_FIELDS)), {
475
+ }, (0, _server.toColumnarFormat)(filteredItems, requestedFields, _indexts.DRIVE_FILE_FIELDS)), {
476
476
  count: filteredItems.length
477
477
  }), nextPageToken && {
478
478
  nextPageToken: nextPageToken