@mcp-z/mcp-drive 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +163 -0
  3. package/bin/server.js +5 -0
  4. package/dist/cjs/constants.d.cts +7 -0
  5. package/dist/cjs/constants.d.ts +7 -0
  6. package/dist/cjs/constants.js +18 -0
  7. package/dist/cjs/constants.js.map +1 -0
  8. package/dist/cjs/index.d.cts +8 -0
  9. package/dist/cjs/index.d.ts +8 -0
  10. package/dist/cjs/index.js +314 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/lib/create-store.d.cts +2 -0
  13. package/dist/cjs/lib/create-store.d.ts +2 -0
  14. package/dist/cjs/lib/create-store.js +166 -0
  15. package/dist/cjs/lib/create-store.js.map +1 -0
  16. package/dist/cjs/lib/query-builder.d.cts +45 -0
  17. package/dist/cjs/lib/query-builder.d.ts +45 -0
  18. package/dist/cjs/lib/query-builder.js +219 -0
  19. package/dist/cjs/lib/query-builder.js.map +1 -0
  20. package/dist/cjs/mcp/index.d.cts +3 -0
  21. package/dist/cjs/mcp/index.d.ts +3 -0
  22. package/dist/cjs/mcp/index.js +66 -0
  23. package/dist/cjs/mcp/index.js.map +1 -0
  24. package/dist/cjs/mcp/prompts/index.d.cts +2 -0
  25. package/dist/cjs/mcp/prompts/index.d.ts +2 -0
  26. package/dist/cjs/mcp/prompts/index.js +26 -0
  27. package/dist/cjs/mcp/prompts/index.js.map +1 -0
  28. package/dist/cjs/mcp/prompts/organize-files.d.cts +16 -0
  29. package/dist/cjs/mcp/prompts/organize-files.d.ts +16 -0
  30. package/dist/cjs/mcp/prompts/organize-files.js +169 -0
  31. package/dist/cjs/mcp/prompts/organize-files.js.map +1 -0
  32. package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
  33. package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
  34. package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
  35. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
  36. package/dist/cjs/mcp/resources/file.d.cts +9 -0
  37. package/dist/cjs/mcp/resources/file.d.ts +9 -0
  38. package/dist/cjs/mcp/resources/file.js +247 -0
  39. package/dist/cjs/mcp/resources/file.js.map +1 -0
  40. package/dist/cjs/mcp/resources/index.d.cts +1 -0
  41. package/dist/cjs/mcp/resources/index.d.ts +1 -0
  42. package/dist/cjs/mcp/resources/index.js +17 -0
  43. package/dist/cjs/mcp/resources/index.js.map +1 -0
  44. package/dist/cjs/mcp/tools/file-move-to-trash.d.cts +59 -0
  45. package/dist/cjs/mcp/tools/file-move-to-trash.d.ts +59 -0
  46. package/dist/cjs/mcp/tools/file-move-to-trash.js +334 -0
  47. package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -0
  48. package/dist/cjs/mcp/tools/file-move.d.cts +73 -0
  49. package/dist/cjs/mcp/tools/file-move.d.ts +73 -0
  50. package/dist/cjs/mcp/tools/file-move.js +613 -0
  51. package/dist/cjs/mcp/tools/file-move.js.map +1 -0
  52. package/dist/cjs/mcp/tools/files-search.d.cts +135 -0
  53. package/dist/cjs/mcp/tools/files-search.d.ts +135 -0
  54. package/dist/cjs/mcp/tools/files-search.js +558 -0
  55. package/dist/cjs/mcp/tools/files-search.js.map +1 -0
  56. package/dist/cjs/mcp/tools/folder-contents.d.cts +139 -0
  57. package/dist/cjs/mcp/tools/folder-contents.d.ts +139 -0
  58. package/dist/cjs/mcp/tools/folder-contents.js +513 -0
  59. package/dist/cjs/mcp/tools/folder-contents.js.map +1 -0
  60. package/dist/cjs/mcp/tools/folder-create.d.cts +59 -0
  61. package/dist/cjs/mcp/tools/folder-create.d.ts +59 -0
  62. package/dist/cjs/mcp/tools/folder-create.js +368 -0
  63. package/dist/cjs/mcp/tools/folder-create.js.map +1 -0
  64. package/dist/cjs/mcp/tools/folder-path.d.cts +49 -0
  65. package/dist/cjs/mcp/tools/folder-path.d.ts +49 -0
  66. package/dist/cjs/mcp/tools/folder-path.js +367 -0
  67. package/dist/cjs/mcp/tools/folder-path.js.map +1 -0
  68. package/dist/cjs/mcp/tools/folder-search.d.cts +139 -0
  69. package/dist/cjs/mcp/tools/folder-search.d.ts +139 -0
  70. package/dist/cjs/mcp/tools/folder-search.js +760 -0
  71. package/dist/cjs/mcp/tools/folder-search.js.map +1 -0
  72. package/dist/cjs/mcp/tools/index.d.cts +7 -0
  73. package/dist/cjs/mcp/tools/index.d.ts +7 -0
  74. package/dist/cjs/mcp/tools/index.js +46 -0
  75. package/dist/cjs/mcp/tools/index.js.map +1 -0
  76. package/dist/cjs/package.json +1 -0
  77. package/dist/cjs/schemas/drive-query-schema.d.cts +40 -0
  78. package/dist/cjs/schemas/drive-query-schema.d.ts +40 -0
  79. package/dist/cjs/schemas/drive-query-schema.js +90 -0
  80. package/dist/cjs/schemas/drive-query-schema.js.map +1 -0
  81. package/dist/cjs/schemas/drive-validation.d.cts +48 -0
  82. package/dist/cjs/schemas/drive-validation.d.ts +48 -0
  83. package/dist/cjs/schemas/drive-validation.js +96 -0
  84. package/dist/cjs/schemas/drive-validation.js.map +1 -0
  85. package/dist/cjs/schemas/index.d.cts +2 -0
  86. package/dist/cjs/schemas/index.d.ts +2 -0
  87. package/dist/cjs/schemas/index.js +20 -0
  88. package/dist/cjs/schemas/index.js.map +1 -0
  89. package/dist/cjs/setup/config.d.cts +44 -0
  90. package/dist/cjs/setup/config.d.ts +44 -0
  91. package/dist/cjs/setup/config.js +201 -0
  92. package/dist/cjs/setup/config.js.map +1 -0
  93. package/dist/cjs/setup/http.d.cts +8 -0
  94. package/dist/cjs/setup/http.d.ts +8 -0
  95. package/dist/cjs/setup/http.js +260 -0
  96. package/dist/cjs/setup/http.js.map +1 -0
  97. package/dist/cjs/setup/index.d.cts +5 -0
  98. package/dist/cjs/setup/index.d.ts +5 -0
  99. package/dist/cjs/setup/index.js +46 -0
  100. package/dist/cjs/setup/index.js.map +1 -0
  101. package/dist/cjs/setup/oauth-google.d.cts +64 -0
  102. package/dist/cjs/setup/oauth-google.d.ts +64 -0
  103. package/dist/cjs/setup/oauth-google.js +347 -0
  104. package/dist/cjs/setup/oauth-google.js.map +1 -0
  105. package/dist/cjs/setup/runtime.d.cts +10 -0
  106. package/dist/cjs/setup/runtime.d.ts +10 -0
  107. package/dist/cjs/setup/runtime.js +353 -0
  108. package/dist/cjs/setup/runtime.js.map +1 -0
  109. package/dist/cjs/setup/stdio.d.cts +7 -0
  110. package/dist/cjs/setup/stdio.d.ts +7 -0
  111. package/dist/cjs/setup/stdio.js +239 -0
  112. package/dist/cjs/setup/stdio.js.map +1 -0
  113. package/dist/cjs/types.d.cts +45 -0
  114. package/dist/cjs/types.d.ts +45 -0
  115. package/dist/cjs/types.js +5 -0
  116. package/dist/cjs/types.js.map +1 -0
  117. package/dist/esm/constants.d.ts +7 -0
  118. package/dist/esm/constants.js +7 -0
  119. package/dist/esm/constants.js.map +1 -0
  120. package/dist/esm/index.d.ts +8 -0
  121. package/dist/esm/index.js +34 -0
  122. package/dist/esm/index.js.map +1 -0
  123. package/dist/esm/lib/create-store.d.ts +2 -0
  124. package/dist/esm/lib/create-store.js +6 -0
  125. package/dist/esm/lib/create-store.js.map +1 -0
  126. package/dist/esm/lib/query-builder.d.ts +45 -0
  127. package/dist/esm/lib/query-builder.js +184 -0
  128. package/dist/esm/lib/query-builder.js.map +1 -0
  129. package/dist/esm/mcp/index.d.ts +3 -0
  130. package/dist/esm/mcp/index.js +6 -0
  131. package/dist/esm/mcp/index.js.map +1 -0
  132. package/dist/esm/mcp/prompts/index.d.ts +2 -0
  133. package/dist/esm/mcp/prompts/index.js +2 -0
  134. package/dist/esm/mcp/prompts/index.js.map +1 -0
  135. package/dist/esm/mcp/prompts/organize-files.d.ts +16 -0
  136. package/dist/esm/mcp/prompts/organize-files.js +21 -0
  137. package/dist/esm/mcp/prompts/organize-files.js.map +1 -0
  138. package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
  139. package/dist/esm/mcp/prompts/query-syntax.js +82 -0
  140. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
  141. package/dist/esm/mcp/resources/file.d.ts +9 -0
  142. package/dist/esm/mcp/resources/file.js +77 -0
  143. package/dist/esm/mcp/resources/file.js.map +1 -0
  144. package/dist/esm/mcp/resources/index.d.ts +1 -0
  145. package/dist/esm/mcp/resources/index.js +1 -0
  146. package/dist/esm/mcp/resources/index.js.map +1 -0
  147. package/dist/esm/mcp/tools/file-move-to-trash.d.ts +59 -0
  148. package/dist/esm/mcp/tools/file-move-to-trash.js +118 -0
  149. package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -0
  150. package/dist/esm/mcp/tools/file-move.d.ts +73 -0
  151. package/dist/esm/mcp/tools/file-move.js +274 -0
  152. package/dist/esm/mcp/tools/file-move.js.map +1 -0
  153. package/dist/esm/mcp/tools/files-search.d.ts +135 -0
  154. package/dist/esm/mcp/tools/files-search.js +254 -0
  155. package/dist/esm/mcp/tools/files-search.js.map +1 -0
  156. package/dist/esm/mcp/tools/folder-contents.d.ts +139 -0
  157. package/dist/esm/mcp/tools/folder-contents.js +214 -0
  158. package/dist/esm/mcp/tools/folder-contents.js.map +1 -0
  159. package/dist/esm/mcp/tools/folder-create.d.ts +59 -0
  160. package/dist/esm/mcp/tools/folder-create.js +140 -0
  161. package/dist/esm/mcp/tools/folder-create.js.map +1 -0
  162. package/dist/esm/mcp/tools/folder-path.d.ts +49 -0
  163. package/dist/esm/mcp/tools/folder-path.js +147 -0
  164. package/dist/esm/mcp/tools/folder-path.js.map +1 -0
  165. package/dist/esm/mcp/tools/folder-search.d.ts +139 -0
  166. package/dist/esm/mcp/tools/folder-search.js +343 -0
  167. package/dist/esm/mcp/tools/folder-search.js.map +1 -0
  168. package/dist/esm/mcp/tools/index.d.ts +7 -0
  169. package/dist/esm/mcp/tools/index.js +7 -0
  170. package/dist/esm/mcp/tools/index.js.map +1 -0
  171. package/dist/esm/package.json +1 -0
  172. package/dist/esm/schemas/drive-query-schema.d.ts +40 -0
  173. package/dist/esm/schemas/drive-query-schema.js +84 -0
  174. package/dist/esm/schemas/drive-query-schema.js.map +1 -0
  175. package/dist/esm/schemas/drive-validation.d.ts +48 -0
  176. package/dist/esm/schemas/drive-validation.js +73 -0
  177. package/dist/esm/schemas/drive-validation.js.map +1 -0
  178. package/dist/esm/schemas/index.d.ts +2 -0
  179. package/dist/esm/schemas/index.js +2 -0
  180. package/dist/esm/schemas/index.js.map +1 -0
  181. package/dist/esm/setup/config.d.ts +44 -0
  182. package/dist/esm/setup/config.js +151 -0
  183. package/dist/esm/setup/config.js.map +1 -0
  184. package/dist/esm/setup/http.d.ts +8 -0
  185. package/dist/esm/setup/http.js +54 -0
  186. package/dist/esm/setup/http.js.map +1 -0
  187. package/dist/esm/setup/index.d.ts +5 -0
  188. package/dist/esm/setup/index.js +5 -0
  189. package/dist/esm/setup/index.js.map +1 -0
  190. package/dist/esm/setup/oauth-google.d.ts +64 -0
  191. package/dist/esm/setup/oauth-google.js +168 -0
  192. package/dist/esm/setup/oauth-google.js.map +1 -0
  193. package/dist/esm/setup/runtime.d.ts +10 -0
  194. package/dist/esm/setup/runtime.js +84 -0
  195. package/dist/esm/setup/runtime.js.map +1 -0
  196. package/dist/esm/setup/stdio.d.ts +7 -0
  197. package/dist/esm/setup/stdio.js +38 -0
  198. package/dist/esm/setup/stdio.js.map +1 -0
  199. package/dist/esm/types.d.ts +45 -0
  200. package/dist/esm/types.js +1 -0
  201. package/dist/esm/types.js.map +1 -0
  202. package/package.json +108 -0
@@ -0,0 +1,760 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createTool;
9
+ }
10
+ });
11
+ var _oauthgoogle = require("@mcp-z/oauth-google");
12
+ var _server = require("@mcp-z/server");
13
+ var _types = require("@modelcontextprotocol/sdk/types.js");
14
+ var _googleapis = require("googleapis");
15
+ var _zod = require("zod");
16
+ var _querybuilder = require("../../lib/query-builder.js");
17
+ var _index = require("../../schemas/index.js");
18
+ function _array_like_to_array(arr, len) {
19
+ if (len == null || len > arr.length) len = arr.length;
20
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
21
+ return arr2;
22
+ }
23
+ function _array_without_holes(arr) {
24
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
25
+ }
26
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
27
+ try {
28
+ var info = gen[key](arg);
29
+ var value = info.value;
30
+ } catch (error) {
31
+ reject(error);
32
+ return;
33
+ }
34
+ if (info.done) {
35
+ resolve(value);
36
+ } else {
37
+ Promise.resolve(value).then(_next, _throw);
38
+ }
39
+ }
40
+ function _async_to_generator(fn) {
41
+ return function() {
42
+ var self = this, args = arguments;
43
+ return new Promise(function(resolve, reject) {
44
+ var gen = fn.apply(self, args);
45
+ function _next(value) {
46
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
47
+ }
48
+ function _throw(err) {
49
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
50
+ }
51
+ _next(undefined);
52
+ });
53
+ };
54
+ }
55
+ function _define_property(obj, key, value) {
56
+ if (key in obj) {
57
+ Object.defineProperty(obj, key, {
58
+ value: value,
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true
62
+ });
63
+ } else {
64
+ obj[key] = value;
65
+ }
66
+ return obj;
67
+ }
68
+ function _instanceof(left, right) {
69
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
70
+ return !!right[Symbol.hasInstance](left);
71
+ } else {
72
+ return left instanceof right;
73
+ }
74
+ }
75
+ function _iterable_to_array(iter) {
76
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
77
+ }
78
+ function _non_iterable_spread() {
79
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
80
+ }
81
+ function _object_spread(target) {
82
+ for(var i = 1; i < arguments.length; i++){
83
+ var source = arguments[i] != null ? arguments[i] : {};
84
+ var ownKeys = Object.keys(source);
85
+ if (typeof Object.getOwnPropertySymbols === "function") {
86
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
87
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
88
+ }));
89
+ }
90
+ ownKeys.forEach(function(key) {
91
+ _define_property(target, key, source[key]);
92
+ });
93
+ }
94
+ return target;
95
+ }
96
+ function ownKeys(object, enumerableOnly) {
97
+ var keys = Object.keys(object);
98
+ if (Object.getOwnPropertySymbols) {
99
+ var symbols = Object.getOwnPropertySymbols(object);
100
+ if (enumerableOnly) {
101
+ symbols = symbols.filter(function(sym) {
102
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
103
+ });
104
+ }
105
+ keys.push.apply(keys, symbols);
106
+ }
107
+ return keys;
108
+ }
109
+ function _object_spread_props(target, source) {
110
+ source = source != null ? source : {};
111
+ if (Object.getOwnPropertyDescriptors) {
112
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
113
+ } else {
114
+ ownKeys(Object(source)).forEach(function(key) {
115
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
116
+ });
117
+ }
118
+ return target;
119
+ }
120
+ function _to_consumable_array(arr) {
121
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
122
+ }
123
+ function _type_of(obj) {
124
+ "@swc/helpers - typeof";
125
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
126
+ }
127
+ function _unsupported_iterable_to_array(o, minLen) {
128
+ if (!o) return;
129
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
130
+ var n = Object.prototype.toString.call(o).slice(8, -1);
131
+ if (n === "Object" && o.constructor) n = o.constructor.name;
132
+ if (n === "Map" || n === "Set") return Array.from(n);
133
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
134
+ }
135
+ function _ts_generator(thisArg, body) {
136
+ var f, y, t, _ = {
137
+ label: 0,
138
+ sent: function() {
139
+ if (t[0] & 1) throw t[1];
140
+ return t[1];
141
+ },
142
+ trys: [],
143
+ ops: []
144
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
145
+ return d(g, "next", {
146
+ value: verb(0)
147
+ }), d(g, "throw", {
148
+ value: verb(1)
149
+ }), d(g, "return", {
150
+ value: verb(2)
151
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
152
+ value: function() {
153
+ return this;
154
+ }
155
+ }), g;
156
+ function verb(n) {
157
+ return function(v) {
158
+ return step([
159
+ n,
160
+ v
161
+ ]);
162
+ };
163
+ }
164
+ function step(op) {
165
+ if (f) throw new TypeError("Generator is already executing.");
166
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
167
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
168
+ if (y = 0, t) op = [
169
+ op[0] & 2,
170
+ t.value
171
+ ];
172
+ switch(op[0]){
173
+ case 0:
174
+ case 1:
175
+ t = op;
176
+ break;
177
+ case 4:
178
+ _.label++;
179
+ return {
180
+ value: op[1],
181
+ done: false
182
+ };
183
+ case 5:
184
+ _.label++;
185
+ y = op[1];
186
+ op = [
187
+ 0
188
+ ];
189
+ continue;
190
+ case 7:
191
+ op = _.ops.pop();
192
+ _.trys.pop();
193
+ continue;
194
+ default:
195
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
196
+ _ = 0;
197
+ continue;
198
+ }
199
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
200
+ _.label = op[1];
201
+ break;
202
+ }
203
+ if (op[0] === 6 && _.label < t[1]) {
204
+ _.label = t[1];
205
+ t = op;
206
+ break;
207
+ }
208
+ if (t && _.label < t[2]) {
209
+ _.label = t[2];
210
+ _.ops.push(op);
211
+ break;
212
+ }
213
+ if (t[2]) _.ops.pop();
214
+ _.trys.pop();
215
+ continue;
216
+ }
217
+ op = body.call(thisArg, _);
218
+ } catch (e) {
219
+ op = [
220
+ 6,
221
+ e
222
+ ];
223
+ y = 0;
224
+ } finally{
225
+ f = t = 0;
226
+ }
227
+ if (op[0] & 5) throw op[1];
228
+ return {
229
+ value: op[0] ? op[1] : void 0,
230
+ done: true
231
+ };
232
+ }
233
+ }
234
+ var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
235
+ var inputSchema = _zod.z.object(_object_spread_props(_object_spread({
236
+ query: _index.DriveQuerySchema.optional().describe('Drive query object with structured search fields. See DriveQuerySchema for detailed query syntax and examples.'),
237
+ fields: (0, _server.createFieldsSchema)({
238
+ availableFields: _to_consumable_array(_index.DRIVE_FILE_FIELDS).concat([
239
+ 'path'
240
+ ]),
241
+ fieldDescriptions: _object_spread_props(_object_spread({}, _index.DRIVE_FILE_FIELD_DESCRIPTIONS), {
242
+ path: 'Full folder path like /Work/Projects (requires resolvePaths=true)'
243
+ }),
244
+ commonPatterns: _index.DRIVE_FILE_COMMON_PATTERNS,
245
+ resourceName: 'Drive folder'
246
+ }),
247
+ resolvePaths: _zod.z.boolean().optional().describe('Resolve full folder paths like /Work/Projects/2024 (requires additional API calls per result)')
248
+ }, (0, _server.createPaginationSchema)({
249
+ defaultPageSize: 50,
250
+ maxPageSize: 1000,
251
+ provider: 'drive'
252
+ }).shape), {
253
+ shape: (0, _server.createShapeSchema)()
254
+ }));
255
+ // Success branch schemas for different shapes
256
+ var successObjectsBranchSchema = _zod.z.object({
257
+ type: _zod.z.literal('success'),
258
+ shape: _zod.z.literal('objects'),
259
+ items: _zod.z.array(_index.DriveFileSchema.extend({
260
+ path: _zod.z.string().optional().describe('Full folder path (if resolvePaths=true)')
261
+ })).describe('Matching Drive folders'),
262
+ count: _zod.z.number().describe('Number of folders in this page'),
263
+ nextPageToken: _zod.z.string().optional().describe('Token for fetching next page of results')
264
+ });
265
+ var successArraysBranchSchema = _zod.z.object({
266
+ type: _zod.z.literal('success'),
267
+ shape: _zod.z.literal('arrays'),
268
+ columns: _zod.z.array(_zod.z.string()).describe('Column names in canonical order'),
269
+ rows: _zod.z.array(_zod.z.array(_zod.z.unknown())).describe('Row data matching column order'),
270
+ count: _zod.z.number().describe('Number of folders in this page'),
271
+ nextPageToken: _zod.z.string().optional().describe('Token for fetching next page of results')
272
+ });
273
+ // Output schema with auth_required support
274
+ // Using z.union instead of discriminatedUnion since we have two success branches with different shapes
275
+ var outputSchema = _zod.z.union([
276
+ successObjectsBranchSchema,
277
+ successArraysBranchSchema,
278
+ AuthRequiredBranchSchema
279
+ ]);
280
+ var config = {
281
+ title: 'Search Folders',
282
+ description: 'Search Google Drive folders with flexible field selection and optional path resolution.',
283
+ inputSchema: inputSchema,
284
+ outputSchema: _zod.z.object({
285
+ result: outputSchema
286
+ })
287
+ };
288
+ /**
289
+ * Resolves the full path for a folder by walking up the parent chain
290
+ * Caches folder names to reduce redundant API calls
291
+ */ function resolveFolderPath(drive, folderId, folderCache, logger) {
292
+ return _async_to_generator(function() {
293
+ var pathParts, currentId, visited, cachedName, response, parents, _e, response1, folderName, parents1, e;
294
+ return _ts_generator(this, function(_state) {
295
+ switch(_state.label){
296
+ case 0:
297
+ if (folderId === 'root') return [
298
+ 2,
299
+ '/'
300
+ ];
301
+ pathParts = [];
302
+ currentId = folderId;
303
+ visited = new Set();
304
+ _state.label = 1;
305
+ case 1:
306
+ if (!(currentId && currentId !== 'root')) return [
307
+ 3,
308
+ 10
309
+ ];
310
+ // Prevent infinite loops
311
+ if (visited.has(currentId)) {
312
+ logger.info('Circular folder reference detected', {
313
+ folderId: currentId
314
+ });
315
+ return [
316
+ 3,
317
+ 10
318
+ ];
319
+ }
320
+ visited.add(currentId);
321
+ if (!folderCache.has(currentId)) return [
322
+ 3,
323
+ 6
324
+ ];
325
+ cachedName = folderCache.get(currentId);
326
+ if (cachedName) {
327
+ pathParts.unshift(cachedName);
328
+ }
329
+ _state.label = 2;
330
+ case 2:
331
+ _state.trys.push([
332
+ 2,
333
+ 4,
334
+ ,
335
+ 5
336
+ ]);
337
+ return [
338
+ 4,
339
+ drive.files.get({
340
+ fileId: currentId,
341
+ fields: 'parents'
342
+ })
343
+ ];
344
+ case 3:
345
+ response = _state.sent();
346
+ parents = response.data.parents;
347
+ currentId = (parents && parents.length > 0 ? parents[0] : '') || '';
348
+ return [
349
+ 3,
350
+ 5
351
+ ];
352
+ case 4:
353
+ _e = _state.sent();
354
+ logger.info('Failed to get parent for cached folder', {
355
+ folderId: currentId
356
+ });
357
+ return [
358
+ 3,
359
+ 10
360
+ ];
361
+ case 5:
362
+ return [
363
+ 3,
364
+ 9
365
+ ];
366
+ case 6:
367
+ _state.trys.push([
368
+ 6,
369
+ 8,
370
+ ,
371
+ 9
372
+ ]);
373
+ return [
374
+ 4,
375
+ drive.files.get({
376
+ fileId: currentId,
377
+ fields: 'name,parents'
378
+ })
379
+ ];
380
+ case 7:
381
+ response1 = _state.sent();
382
+ folderName = response1.data.name;
383
+ parents1 = response1.data.parents;
384
+ if (folderName) {
385
+ folderCache.set(currentId, folderName);
386
+ pathParts.unshift(folderName);
387
+ }
388
+ currentId = (parents1 && parents1.length > 0 ? parents1[0] : '') || '';
389
+ return [
390
+ 3,
391
+ 9
392
+ ];
393
+ case 8:
394
+ e = _state.sent();
395
+ logger.info('Failed to resolve folder path', {
396
+ folderId: currentId,
397
+ error: e
398
+ });
399
+ return [
400
+ 3,
401
+ 10
402
+ ];
403
+ case 9:
404
+ return [
405
+ 3,
406
+ 1
407
+ ];
408
+ case 10:
409
+ return [
410
+ 2,
411
+ "/".concat(pathParts.join('/'))
412
+ ];
413
+ }
414
+ });
415
+ })();
416
+ }
417
+ function handler(_0, _1) {
418
+ return _async_to_generator(function(param, extra) {
419
+ var query, _param_resolvePaths, resolvePaths, _param_pageSize, pageSize, pageToken, fields, _param_shape, shape, logger, requestedFields, validPageSize, drive, folderMimeType, qStr, q, listOptions, response, res, folders, parentIds, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, f, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, parentId, parentNameMap, parentFetches, folderCache, items, filteredItems, nextPageToken, result, error, message, isDriveValidationError, result1;
420
+ return _ts_generator(this, function(_state) {
421
+ switch(_state.label){
422
+ case 0:
423
+ query = param.query, _param_resolvePaths = param.resolvePaths, resolvePaths = _param_resolvePaths === void 0 ? false : _param_resolvePaths, _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;
424
+ logger = extra.logger;
425
+ requestedFields = (0, _server.parseFields)(fields, _to_consumable_array(_index.DRIVE_FILE_FIELDS).concat([
426
+ 'path'
427
+ ]));
428
+ // Validate and clamp pageSize to Google Drive API limits (1-1000)
429
+ validPageSize = Math.max(1, Math.min(1000, Math.floor(pageSize || 50)));
430
+ logger.info('drive.folder.search called', {
431
+ query: query,
432
+ resolvePaths: resolvePaths,
433
+ pageSize: validPageSize,
434
+ pageToken: pageToken ? '[provided]' : undefined,
435
+ fields: fields || 'all'
436
+ });
437
+ _state.label = 1;
438
+ case 1:
439
+ _state.trys.push([
440
+ 1,
441
+ 6,
442
+ ,
443
+ 7
444
+ ]);
445
+ drive = _googleapis.google.drive({
446
+ version: 'v3',
447
+ auth: extra.authContext.auth
448
+ });
449
+ folderMimeType = 'application/vnd.google-apps.folder';
450
+ if (typeof query === 'string') {
451
+ // String query - treat as raw Drive query
452
+ qStr = "(".concat(query, ") and mimeType='").concat(folderMimeType, "' and trashed = false");
453
+ } else if (query && (typeof query === "undefined" ? "undefined" : _type_of(query)) === 'object' && 'rawDriveQuery' in query && query.rawDriveQuery) {
454
+ // Object with rawDriveQuery field - use it directly
455
+ qStr = "(".concat(query.rawDriveQuery, ") and mimeType='").concat(folderMimeType, "' and trashed = false");
456
+ } else if (query) {
457
+ // Structured query object - convert to Drive query string
458
+ q = (0, _querybuilder.toDriveQuery)(query).q;
459
+ qStr = q ? "(".concat(q, ") and mimeType='").concat(folderMimeType, "' and trashed = false") : "mimeType='".concat(folderMimeType, "' and trashed = false");
460
+ } else {
461
+ // No query - return all folders
462
+ qStr = "mimeType='".concat(folderMimeType, "' and trashed = false");
463
+ }
464
+ listOptions = {
465
+ q: qStr,
466
+ pageSize: validPageSize,
467
+ fields: 'files(id,name,mimeType,webViewLink,modifiedTime,parents,shared,starred,owners),nextPageToken',
468
+ orderBy: 'modifiedTime desc'
469
+ };
470
+ if (pageToken && pageToken.trim().length > 0) {
471
+ listOptions.pageToken = pageToken;
472
+ }
473
+ return [
474
+ 4,
475
+ drive.files.list(listOptions)
476
+ ];
477
+ case 2:
478
+ response = _state.sent();
479
+ res = response.data;
480
+ folders = Array.isArray(res === null || res === void 0 ? void 0 : res.files) ? res.files : [];
481
+ parentIds = new Set();
482
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
483
+ try {
484
+ for(_iterator = folders[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
485
+ f = _step.value;
486
+ if ((f === null || f === void 0 ? void 0 : f.parents) && f.parents.length > 0) {
487
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
488
+ try {
489
+ for(_iterator1 = f.parents[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
490
+ parentId = _step1.value;
491
+ if (parentId && parentId !== 'root') {
492
+ parentIds.add(parentId);
493
+ }
494
+ }
495
+ } catch (err) {
496
+ _didIteratorError1 = true;
497
+ _iteratorError1 = err;
498
+ } finally{
499
+ try {
500
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
501
+ _iterator1.return();
502
+ }
503
+ } finally{
504
+ if (_didIteratorError1) {
505
+ throw _iteratorError1;
506
+ }
507
+ }
508
+ }
509
+ }
510
+ }
511
+ } catch (err) {
512
+ _didIteratorError = true;
513
+ _iteratorError = err;
514
+ } finally{
515
+ try {
516
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
517
+ _iterator.return();
518
+ }
519
+ } finally{
520
+ if (_didIteratorError) {
521
+ throw _iteratorError;
522
+ }
523
+ }
524
+ }
525
+ parentNameMap = new Map();
526
+ if (!(parentIds.size > 0)) return [
527
+ 3,
528
+ 4
529
+ ];
530
+ logger.info('Fetching parent names', {
531
+ count: parentIds.size
532
+ });
533
+ parentFetches = Array.from(parentIds).map(function(parentId) {
534
+ return _async_to_generator(function() {
535
+ var parentRes, parentName, e;
536
+ return _ts_generator(this, function(_state) {
537
+ switch(_state.label){
538
+ case 0:
539
+ _state.trys.push([
540
+ 0,
541
+ 2,
542
+ ,
543
+ 3
544
+ ]);
545
+ return [
546
+ 4,
547
+ drive.files.get({
548
+ fileId: parentId,
549
+ fields: 'id,name'
550
+ })
551
+ ];
552
+ case 1:
553
+ parentRes = _state.sent();
554
+ parentName = parentRes.data.name || parentId;
555
+ parentNameMap.set(parentId, parentName);
556
+ return [
557
+ 3,
558
+ 3
559
+ ];
560
+ case 2:
561
+ e = _state.sent();
562
+ logger.info('Failed to fetch parent name', {
563
+ parentId: parentId,
564
+ error: e
565
+ });
566
+ parentNameMap.set(parentId, parentId); // Fallback to ID
567
+ return [
568
+ 3,
569
+ 3
570
+ ];
571
+ case 3:
572
+ return [
573
+ 2
574
+ ];
575
+ }
576
+ });
577
+ })();
578
+ });
579
+ return [
580
+ 4,
581
+ Promise.all(parentFetches)
582
+ ];
583
+ case 3:
584
+ _state.sent();
585
+ _state.label = 4;
586
+ case 4:
587
+ // Cache for folder names to reduce API calls during path resolution
588
+ folderCache = new Map();
589
+ return [
590
+ 4,
591
+ Promise.all(folders.map(function(f) {
592
+ return _async_to_generator(function() {
593
+ var id, name, result;
594
+ return _ts_generator(this, function(_state) {
595
+ switch(_state.label){
596
+ case 0:
597
+ id = (f === null || f === void 0 ? void 0 : f.id) ? String(f.id) : 'unknown';
598
+ name = (f === null || f === void 0 ? void 0 : f.name) || id;
599
+ result = {
600
+ id: id,
601
+ name: name
602
+ };
603
+ // Only include properties that have actual values
604
+ if (f === null || f === void 0 ? void 0 : f.mimeType) result.mimeType = f.mimeType;
605
+ if (f === null || f === void 0 ? void 0 : f.webViewLink) result.webViewLink = f.webViewLink;
606
+ if (f === null || f === void 0 ? void 0 : f.modifiedTime) result.modifiedTime = f.modifiedTime;
607
+ // Build parent objects with names
608
+ if ((f === null || f === void 0 ? void 0 : f.parents) && f.parents.length > 0) {
609
+ result.parents = f.parents.map(function(parentId) {
610
+ if (parentId === 'root') {
611
+ return {
612
+ id: 'root',
613
+ name: 'My Drive'
614
+ };
615
+ }
616
+ var parentName = parentNameMap.get(parentId) || parentId;
617
+ return {
618
+ id: parentId,
619
+ name: parentName
620
+ };
621
+ });
622
+ }
623
+ if ((f === null || f === void 0 ? void 0 : f.shared) !== undefined) result.shared = f.shared;
624
+ if ((f === null || f === void 0 ? void 0 : f.starred) !== undefined) result.starred = f.starred;
625
+ if ((f === null || f === void 0 ? void 0 : f.owners) && f.owners.length > 0) {
626
+ result.owners = f.owners.map(function(o) {
627
+ var owner = {};
628
+ if (o === null || o === void 0 ? void 0 : o.displayName) owner.displayName = o.displayName;
629
+ if (o === null || o === void 0 ? void 0 : o.emailAddress) owner.emailAddress = o.emailAddress;
630
+ if (o === null || o === void 0 ? void 0 : o.kind) owner.kind = o.kind;
631
+ if ((o === null || o === void 0 ? void 0 : o.me) !== undefined) owner.me = o.me;
632
+ if (o === null || o === void 0 ? void 0 : o.permissionId) owner.permissionId = o.permissionId;
633
+ if (o === null || o === void 0 ? void 0 : o.photoLink) owner.photoLink = o.photoLink;
634
+ return owner;
635
+ });
636
+ }
637
+ if (!(resolvePaths && id !== 'unknown')) return [
638
+ 3,
639
+ 2
640
+ ];
641
+ return [
642
+ 4,
643
+ resolveFolderPath(drive, id, folderCache, logger)
644
+ ];
645
+ case 1:
646
+ result.path = _state.sent();
647
+ _state.label = 2;
648
+ case 2:
649
+ return [
650
+ 2,
651
+ result
652
+ ];
653
+ }
654
+ });
655
+ })();
656
+ }))
657
+ ];
658
+ case 5:
659
+ items = _state.sent();
660
+ filteredItems = items.map(function(item) {
661
+ return (0, _server.filterFields)(item, requestedFields);
662
+ });
663
+ logger.info('drive.folder.search returning', {
664
+ query: query,
665
+ pageSize: pageSize,
666
+ resultCount: filteredItems.length,
667
+ resolvePaths: resolvePaths,
668
+ fields: fields || 'all'
669
+ });
670
+ nextPageToken = res.nextPageToken && res.nextPageToken.trim().length > 0 ? res.nextPageToken : undefined;
671
+ // Build result based on shape
672
+ result = shape === 'arrays' ? _object_spread(_object_spread_props(_object_spread({
673
+ type: 'success',
674
+ shape: 'arrays'
675
+ }, (0, _server.toColumnarFormat)(filteredItems, requestedFields, _to_consumable_array(_index.DRIVE_FILE_FIELDS).concat([
676
+ 'path'
677
+ ]))), {
678
+ count: filteredItems.length
679
+ }), nextPageToken && {
680
+ nextPageToken: nextPageToken
681
+ }) : _object_spread({
682
+ type: 'success',
683
+ shape: 'objects',
684
+ items: filteredItems,
685
+ count: filteredItems.length
686
+ }, nextPageToken && {
687
+ nextPageToken: nextPageToken
688
+ });
689
+ return [
690
+ 2,
691
+ {
692
+ content: [
693
+ {
694
+ type: 'text',
695
+ text: JSON.stringify(result)
696
+ }
697
+ ],
698
+ structuredContent: {
699
+ result: result
700
+ }
701
+ }
702
+ ];
703
+ case 6:
704
+ error = _state.sent();
705
+ message = _instanceof(error, Error) ? error.message : String(error);
706
+ logger.error('drive.folder.search error', {
707
+ error: message
708
+ });
709
+ // Check if this is a Drive API validation error (invalid query, invalid pageToken, etc.)
710
+ // These should return empty results rather than throw
711
+ isDriveValidationError = message.includes('Invalid Value') || message.includes('Invalid value') || message.includes('File not found') || message.includes('Bad Request');
712
+ if (isDriveValidationError) {
713
+ // Return empty result set for validation errors
714
+ result1 = shape === 'arrays' ? {
715
+ type: 'success',
716
+ shape: 'arrays',
717
+ columns: [],
718
+ rows: [],
719
+ count: 0
720
+ } : {
721
+ type: 'success',
722
+ shape: 'objects',
723
+ items: [],
724
+ count: 0
725
+ };
726
+ return [
727
+ 2,
728
+ {
729
+ content: [
730
+ {
731
+ type: 'text',
732
+ text: JSON.stringify(result1)
733
+ }
734
+ ],
735
+ structuredContent: {
736
+ result: result1
737
+ }
738
+ }
739
+ ];
740
+ }
741
+ // Throw McpError for other errors
742
+ throw new _types.McpError(_types.ErrorCode.InternalError, "Error searching folders: ".concat(message), {
743
+ stack: _instanceof(error, Error) ? error.stack : undefined
744
+ });
745
+ case 7:
746
+ return [
747
+ 2
748
+ ];
749
+ }
750
+ });
751
+ }).apply(this, arguments);
752
+ }
753
+ function createTool() {
754
+ return {
755
+ name: 'folder-search',
756
+ config: config,
757
+ handler: handler
758
+ };
759
+ }
760
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }