@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.
- package/LICENSE +21 -0
- package/README.md +163 -0
- package/bin/server.js +5 -0
- package/dist/cjs/constants.d.cts +7 -0
- package/dist/cjs/constants.d.ts +7 -0
- package/dist/cjs/constants.js +18 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/index.d.cts +8 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +314 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/create-store.d.cts +2 -0
- package/dist/cjs/lib/create-store.d.ts +2 -0
- package/dist/cjs/lib/create-store.js +166 -0
- package/dist/cjs/lib/create-store.js.map +1 -0
- package/dist/cjs/lib/query-builder.d.cts +45 -0
- package/dist/cjs/lib/query-builder.d.ts +45 -0
- package/dist/cjs/lib/query-builder.js +219 -0
- package/dist/cjs/lib/query-builder.js.map +1 -0
- package/dist/cjs/mcp/index.d.cts +3 -0
- package/dist/cjs/mcp/index.d.ts +3 -0
- package/dist/cjs/mcp/index.js +66 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts/index.d.cts +2 -0
- package/dist/cjs/mcp/prompts/index.d.ts +2 -0
- package/dist/cjs/mcp/prompts/index.js +26 -0
- package/dist/cjs/mcp/prompts/index.js.map +1 -0
- package/dist/cjs/mcp/prompts/organize-files.d.cts +16 -0
- package/dist/cjs/mcp/prompts/organize-files.d.ts +16 -0
- package/dist/cjs/mcp/prompts/organize-files.js +169 -0
- package/dist/cjs/mcp/prompts/organize-files.js.map +1 -0
- package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
- package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
- package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
- package/dist/cjs/mcp/resources/file.d.cts +9 -0
- package/dist/cjs/mcp/resources/file.d.ts +9 -0
- package/dist/cjs/mcp/resources/file.js +247 -0
- package/dist/cjs/mcp/resources/file.js.map +1 -0
- package/dist/cjs/mcp/resources/index.d.cts +1 -0
- package/dist/cjs/mcp/resources/index.d.ts +1 -0
- package/dist/cjs/mcp/resources/index.js +17 -0
- package/dist/cjs/mcp/resources/index.js.map +1 -0
- package/dist/cjs/mcp/tools/file-move-to-trash.d.cts +59 -0
- package/dist/cjs/mcp/tools/file-move-to-trash.d.ts +59 -0
- package/dist/cjs/mcp/tools/file-move-to-trash.js +334 -0
- package/dist/cjs/mcp/tools/file-move-to-trash.js.map +1 -0
- package/dist/cjs/mcp/tools/file-move.d.cts +73 -0
- package/dist/cjs/mcp/tools/file-move.d.ts +73 -0
- package/dist/cjs/mcp/tools/file-move.js +613 -0
- package/dist/cjs/mcp/tools/file-move.js.map +1 -0
- package/dist/cjs/mcp/tools/files-search.d.cts +135 -0
- package/dist/cjs/mcp/tools/files-search.d.ts +135 -0
- package/dist/cjs/mcp/tools/files-search.js +558 -0
- package/dist/cjs/mcp/tools/files-search.js.map +1 -0
- package/dist/cjs/mcp/tools/folder-contents.d.cts +139 -0
- package/dist/cjs/mcp/tools/folder-contents.d.ts +139 -0
- package/dist/cjs/mcp/tools/folder-contents.js +513 -0
- package/dist/cjs/mcp/tools/folder-contents.js.map +1 -0
- package/dist/cjs/mcp/tools/folder-create.d.cts +59 -0
- package/dist/cjs/mcp/tools/folder-create.d.ts +59 -0
- package/dist/cjs/mcp/tools/folder-create.js +368 -0
- package/dist/cjs/mcp/tools/folder-create.js.map +1 -0
- package/dist/cjs/mcp/tools/folder-path.d.cts +49 -0
- package/dist/cjs/mcp/tools/folder-path.d.ts +49 -0
- package/dist/cjs/mcp/tools/folder-path.js +367 -0
- package/dist/cjs/mcp/tools/folder-path.js.map +1 -0
- package/dist/cjs/mcp/tools/folder-search.d.cts +139 -0
- package/dist/cjs/mcp/tools/folder-search.d.ts +139 -0
- package/dist/cjs/mcp/tools/folder-search.js +760 -0
- package/dist/cjs/mcp/tools/folder-search.js.map +1 -0
- package/dist/cjs/mcp/tools/index.d.cts +7 -0
- package/dist/cjs/mcp/tools/index.d.ts +7 -0
- package/dist/cjs/mcp/tools/index.js +46 -0
- package/dist/cjs/mcp/tools/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schemas/drive-query-schema.d.cts +40 -0
- package/dist/cjs/schemas/drive-query-schema.d.ts +40 -0
- package/dist/cjs/schemas/drive-query-schema.js +90 -0
- package/dist/cjs/schemas/drive-query-schema.js.map +1 -0
- package/dist/cjs/schemas/drive-validation.d.cts +48 -0
- package/dist/cjs/schemas/drive-validation.d.ts +48 -0
- package/dist/cjs/schemas/drive-validation.js +96 -0
- package/dist/cjs/schemas/drive-validation.js.map +1 -0
- package/dist/cjs/schemas/index.d.cts +2 -0
- package/dist/cjs/schemas/index.d.ts +2 -0
- package/dist/cjs/schemas/index.js +20 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/setup/config.d.cts +44 -0
- package/dist/cjs/setup/config.d.ts +44 -0
- package/dist/cjs/setup/config.js +201 -0
- package/dist/cjs/setup/config.js.map +1 -0
- package/dist/cjs/setup/http.d.cts +8 -0
- package/dist/cjs/setup/http.d.ts +8 -0
- package/dist/cjs/setup/http.js +260 -0
- package/dist/cjs/setup/http.js.map +1 -0
- package/dist/cjs/setup/index.d.cts +5 -0
- package/dist/cjs/setup/index.d.ts +5 -0
- package/dist/cjs/setup/index.js +46 -0
- package/dist/cjs/setup/index.js.map +1 -0
- package/dist/cjs/setup/oauth-google.d.cts +64 -0
- package/dist/cjs/setup/oauth-google.d.ts +64 -0
- package/dist/cjs/setup/oauth-google.js +347 -0
- package/dist/cjs/setup/oauth-google.js.map +1 -0
- package/dist/cjs/setup/runtime.d.cts +10 -0
- package/dist/cjs/setup/runtime.d.ts +10 -0
- package/dist/cjs/setup/runtime.js +353 -0
- package/dist/cjs/setup/runtime.js.map +1 -0
- package/dist/cjs/setup/stdio.d.cts +7 -0
- package/dist/cjs/setup/stdio.d.ts +7 -0
- package/dist/cjs/setup/stdio.js +239 -0
- package/dist/cjs/setup/stdio.js.map +1 -0
- package/dist/cjs/types.d.cts +45 -0
- package/dist/cjs/types.d.ts +45 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/constants.d.ts +7 -0
- package/dist/esm/constants.js +7 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/create-store.d.ts +2 -0
- package/dist/esm/lib/create-store.js +6 -0
- package/dist/esm/lib/create-store.js.map +1 -0
- package/dist/esm/lib/query-builder.d.ts +45 -0
- package/dist/esm/lib/query-builder.js +184 -0
- package/dist/esm/lib/query-builder.js.map +1 -0
- package/dist/esm/mcp/index.d.ts +3 -0
- package/dist/esm/mcp/index.js +6 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts/index.d.ts +2 -0
- package/dist/esm/mcp/prompts/index.js +2 -0
- package/dist/esm/mcp/prompts/index.js.map +1 -0
- package/dist/esm/mcp/prompts/organize-files.d.ts +16 -0
- package/dist/esm/mcp/prompts/organize-files.js +21 -0
- package/dist/esm/mcp/prompts/organize-files.js.map +1 -0
- package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
- package/dist/esm/mcp/prompts/query-syntax.js +82 -0
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
- package/dist/esm/mcp/resources/file.d.ts +9 -0
- package/dist/esm/mcp/resources/file.js +77 -0
- package/dist/esm/mcp/resources/file.js.map +1 -0
- package/dist/esm/mcp/resources/index.d.ts +1 -0
- package/dist/esm/mcp/resources/index.js +1 -0
- package/dist/esm/mcp/resources/index.js.map +1 -0
- package/dist/esm/mcp/tools/file-move-to-trash.d.ts +59 -0
- package/dist/esm/mcp/tools/file-move-to-trash.js +118 -0
- package/dist/esm/mcp/tools/file-move-to-trash.js.map +1 -0
- package/dist/esm/mcp/tools/file-move.d.ts +73 -0
- package/dist/esm/mcp/tools/file-move.js +274 -0
- package/dist/esm/mcp/tools/file-move.js.map +1 -0
- package/dist/esm/mcp/tools/files-search.d.ts +135 -0
- package/dist/esm/mcp/tools/files-search.js +254 -0
- package/dist/esm/mcp/tools/files-search.js.map +1 -0
- package/dist/esm/mcp/tools/folder-contents.d.ts +139 -0
- package/dist/esm/mcp/tools/folder-contents.js +214 -0
- package/dist/esm/mcp/tools/folder-contents.js.map +1 -0
- package/dist/esm/mcp/tools/folder-create.d.ts +59 -0
- package/dist/esm/mcp/tools/folder-create.js +140 -0
- package/dist/esm/mcp/tools/folder-create.js.map +1 -0
- package/dist/esm/mcp/tools/folder-path.d.ts +49 -0
- package/dist/esm/mcp/tools/folder-path.js +147 -0
- package/dist/esm/mcp/tools/folder-path.js.map +1 -0
- package/dist/esm/mcp/tools/folder-search.d.ts +139 -0
- package/dist/esm/mcp/tools/folder-search.js +343 -0
- package/dist/esm/mcp/tools/folder-search.js.map +1 -0
- package/dist/esm/mcp/tools/index.d.ts +7 -0
- package/dist/esm/mcp/tools/index.js +7 -0
- package/dist/esm/mcp/tools/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schemas/drive-query-schema.d.ts +40 -0
- package/dist/esm/schemas/drive-query-schema.js +84 -0
- package/dist/esm/schemas/drive-query-schema.js.map +1 -0
- package/dist/esm/schemas/drive-validation.d.ts +48 -0
- package/dist/esm/schemas/drive-validation.js +73 -0
- package/dist/esm/schemas/drive-validation.js.map +1 -0
- package/dist/esm/schemas/index.d.ts +2 -0
- package/dist/esm/schemas/index.js +2 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/setup/config.d.ts +44 -0
- package/dist/esm/setup/config.js +151 -0
- package/dist/esm/setup/config.js.map +1 -0
- package/dist/esm/setup/http.d.ts +8 -0
- package/dist/esm/setup/http.js +54 -0
- package/dist/esm/setup/http.js.map +1 -0
- package/dist/esm/setup/index.d.ts +5 -0
- package/dist/esm/setup/index.js +5 -0
- package/dist/esm/setup/index.js.map +1 -0
- package/dist/esm/setup/oauth-google.d.ts +64 -0
- package/dist/esm/setup/oauth-google.js +168 -0
- package/dist/esm/setup/oauth-google.js.map +1 -0
- package/dist/esm/setup/runtime.d.ts +10 -0
- package/dist/esm/setup/runtime.js +84 -0
- package/dist/esm/setup/runtime.js.map +1 -0
- package/dist/esm/setup/stdio.d.ts +7 -0
- package/dist/esm/setup/stdio.js +38 -0
- package/dist/esm/setup/stdio.js.map +1 -0
- package/dist/esm/types.d.ts +45 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,613 @@
|
|
|
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 _types = require("@modelcontextprotocol/sdk/types.js");
|
|
13
|
+
var _googleapis = require("googleapis");
|
|
14
|
+
var _zod = require("zod");
|
|
15
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
16
|
+
try {
|
|
17
|
+
var info = gen[key](arg);
|
|
18
|
+
var value = info.value;
|
|
19
|
+
} catch (error) {
|
|
20
|
+
reject(error);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (info.done) {
|
|
24
|
+
resolve(value);
|
|
25
|
+
} else {
|
|
26
|
+
Promise.resolve(value).then(_next, _throw);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function _async_to_generator(fn) {
|
|
30
|
+
return function() {
|
|
31
|
+
var self = this, args = arguments;
|
|
32
|
+
return new Promise(function(resolve, reject) {
|
|
33
|
+
var gen = fn.apply(self, args);
|
|
34
|
+
function _next(value) {
|
|
35
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
36
|
+
}
|
|
37
|
+
function _throw(err) {
|
|
38
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
39
|
+
}
|
|
40
|
+
_next(undefined);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function _define_property(obj, key, value) {
|
|
45
|
+
if (key in obj) {
|
|
46
|
+
Object.defineProperty(obj, key, {
|
|
47
|
+
value: value,
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
obj[key] = value;
|
|
54
|
+
}
|
|
55
|
+
return obj;
|
|
56
|
+
}
|
|
57
|
+
function _instanceof(left, right) {
|
|
58
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
59
|
+
return !!right[Symbol.hasInstance](left);
|
|
60
|
+
} else {
|
|
61
|
+
return left instanceof right;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function _object_spread(target) {
|
|
65
|
+
for(var i = 1; i < arguments.length; i++){
|
|
66
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
67
|
+
var ownKeys = Object.keys(source);
|
|
68
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
69
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
70
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
ownKeys.forEach(function(key) {
|
|
74
|
+
_define_property(target, key, source[key]);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return target;
|
|
78
|
+
}
|
|
79
|
+
function ownKeys(object, enumerableOnly) {
|
|
80
|
+
var keys = Object.keys(object);
|
|
81
|
+
if (Object.getOwnPropertySymbols) {
|
|
82
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
83
|
+
if (enumerableOnly) {
|
|
84
|
+
symbols = symbols.filter(function(sym) {
|
|
85
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
keys.push.apply(keys, symbols);
|
|
89
|
+
}
|
|
90
|
+
return keys;
|
|
91
|
+
}
|
|
92
|
+
function _object_spread_props(target, source) {
|
|
93
|
+
source = source != null ? source : {};
|
|
94
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
95
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
96
|
+
} else {
|
|
97
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
98
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return target;
|
|
102
|
+
}
|
|
103
|
+
function _type_of(obj) {
|
|
104
|
+
"@swc/helpers - typeof";
|
|
105
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
106
|
+
}
|
|
107
|
+
function _ts_generator(thisArg, body) {
|
|
108
|
+
var f, y, t, _ = {
|
|
109
|
+
label: 0,
|
|
110
|
+
sent: function() {
|
|
111
|
+
if (t[0] & 1) throw t[1];
|
|
112
|
+
return t[1];
|
|
113
|
+
},
|
|
114
|
+
trys: [],
|
|
115
|
+
ops: []
|
|
116
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
117
|
+
return d(g, "next", {
|
|
118
|
+
value: verb(0)
|
|
119
|
+
}), d(g, "throw", {
|
|
120
|
+
value: verb(1)
|
|
121
|
+
}), d(g, "return", {
|
|
122
|
+
value: verb(2)
|
|
123
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
124
|
+
value: function() {
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
}), g;
|
|
128
|
+
function verb(n) {
|
|
129
|
+
return function(v) {
|
|
130
|
+
return step([
|
|
131
|
+
n,
|
|
132
|
+
v
|
|
133
|
+
]);
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function step(op) {
|
|
137
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
138
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
139
|
+
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;
|
|
140
|
+
if (y = 0, t) op = [
|
|
141
|
+
op[0] & 2,
|
|
142
|
+
t.value
|
|
143
|
+
];
|
|
144
|
+
switch(op[0]){
|
|
145
|
+
case 0:
|
|
146
|
+
case 1:
|
|
147
|
+
t = op;
|
|
148
|
+
break;
|
|
149
|
+
case 4:
|
|
150
|
+
_.label++;
|
|
151
|
+
return {
|
|
152
|
+
value: op[1],
|
|
153
|
+
done: false
|
|
154
|
+
};
|
|
155
|
+
case 5:
|
|
156
|
+
_.label++;
|
|
157
|
+
y = op[1];
|
|
158
|
+
op = [
|
|
159
|
+
0
|
|
160
|
+
];
|
|
161
|
+
continue;
|
|
162
|
+
case 7:
|
|
163
|
+
op = _.ops.pop();
|
|
164
|
+
_.trys.pop();
|
|
165
|
+
continue;
|
|
166
|
+
default:
|
|
167
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
168
|
+
_ = 0;
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
172
|
+
_.label = op[1];
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
176
|
+
_.label = t[1];
|
|
177
|
+
t = op;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
if (t && _.label < t[2]) {
|
|
181
|
+
_.label = t[2];
|
|
182
|
+
_.ops.push(op);
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
if (t[2]) _.ops.pop();
|
|
186
|
+
_.trys.pop();
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
op = body.call(thisArg, _);
|
|
190
|
+
} catch (e) {
|
|
191
|
+
op = [
|
|
192
|
+
6,
|
|
193
|
+
e
|
|
194
|
+
];
|
|
195
|
+
y = 0;
|
|
196
|
+
} finally{
|
|
197
|
+
f = t = 0;
|
|
198
|
+
}
|
|
199
|
+
if (op[0] & 5) throw op[1];
|
|
200
|
+
return {
|
|
201
|
+
value: op[0] ? op[1] : void 0,
|
|
202
|
+
done: true
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
var AuthRequiredBranchSchema = _oauthgoogle.schemas.AuthRequiredBranchSchema;
|
|
207
|
+
function isDriveApiError(error) {
|
|
208
|
+
return (typeof error === "undefined" ? "undefined" : _type_of(error)) === 'object' && error !== null && ('message' in error || 'code' in error);
|
|
209
|
+
}
|
|
210
|
+
var inputSchema = _zod.z.object({
|
|
211
|
+
fileIds: _zod.z.union([
|
|
212
|
+
_zod.z.string().min(1),
|
|
213
|
+
_zod.z.array(_zod.z.string().min(1)).min(1).max(100)
|
|
214
|
+
]).describe('File or folder ID(s) to move. Single ID or array (max 100 for batch)'),
|
|
215
|
+
destinationFolderId: _zod.z.string().min(1).describe('Destination folder ID (use "root" for My Drive root)'),
|
|
216
|
+
returnOldParents: _zod.z.boolean().optional().describe('Include old parent IDs in response for manual undo (recommended: true)')
|
|
217
|
+
});
|
|
218
|
+
// Success branch schema
|
|
219
|
+
var successBranchSchema = _zod.z.object({
|
|
220
|
+
type: _zod.z.literal('success'),
|
|
221
|
+
moved: _zod.z.array(_zod.z.object({
|
|
222
|
+
fileId: _zod.z.string().describe('ID of the moved file'),
|
|
223
|
+
fileName: _zod.z.string().describe('Name of the moved file'),
|
|
224
|
+
oldParents: _zod.z.array(_zod.z.string()).describe('Previous parent folder IDs (for undo)'),
|
|
225
|
+
newParent: _zod.z.string().describe('New parent folder ID'),
|
|
226
|
+
webViewLink: _zod.z.string().optional().describe('URL to view the file')
|
|
227
|
+
})).describe('Successfully moved files'),
|
|
228
|
+
failed: _zod.z.array(_zod.z.object({
|
|
229
|
+
fileId: _zod.z.string().describe('ID of the file that failed to move'),
|
|
230
|
+
error: _zod.z.string().describe('Error message explaining the failure'),
|
|
231
|
+
code: _zod.z.string().optional().describe('API error code if available')
|
|
232
|
+
})).optional().describe('Files that failed to move'),
|
|
233
|
+
totalRequested: _zod.z.number().describe('Total number of files requested to move'),
|
|
234
|
+
totalMoved: _zod.z.number().describe('Number of files successfully moved'),
|
|
235
|
+
totalFailed: _zod.z.number().describe('Number of files that failed to move')
|
|
236
|
+
});
|
|
237
|
+
// Output schema with auth_required support
|
|
238
|
+
var outputSchema = _zod.z.discriminatedUnion('type', [
|
|
239
|
+
successBranchSchema,
|
|
240
|
+
AuthRequiredBranchSchema
|
|
241
|
+
]);
|
|
242
|
+
var config = {
|
|
243
|
+
title: 'Move Files',
|
|
244
|
+
description: 'Move files/folders to destination folder. Returns oldParents for undo. Use "root" for My Drive root.',
|
|
245
|
+
inputSchema: inputSchema,
|
|
246
|
+
outputSchema: _zod.z.object({
|
|
247
|
+
result: outputSchema
|
|
248
|
+
})
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Move a single file to a new parent folder
|
|
252
|
+
*/ function moveSingleFile(drive, fileId, destinationFolderId, returnOldParents, logger) {
|
|
253
|
+
return _async_to_generator(function() {
|
|
254
|
+
var fileMetadata, oldParents, fileName, webViewLink, result, e, errorMessage, errorCode;
|
|
255
|
+
return _ts_generator(this, function(_state) {
|
|
256
|
+
switch(_state.label){
|
|
257
|
+
case 0:
|
|
258
|
+
_state.trys.push([
|
|
259
|
+
0,
|
|
260
|
+
3,
|
|
261
|
+
,
|
|
262
|
+
4
|
|
263
|
+
]);
|
|
264
|
+
return [
|
|
265
|
+
4,
|
|
266
|
+
drive.files.get({
|
|
267
|
+
fileId: fileId,
|
|
268
|
+
fields: 'id,name,parents,webViewLink'
|
|
269
|
+
})
|
|
270
|
+
];
|
|
271
|
+
case 1:
|
|
272
|
+
fileMetadata = _state.sent();
|
|
273
|
+
oldParents = fileMetadata.data.parents || [];
|
|
274
|
+
fileName = fileMetadata.data.name || fileId;
|
|
275
|
+
webViewLink = fileMetadata.data.webViewLink;
|
|
276
|
+
// Move file using addParents and removeParents
|
|
277
|
+
return [
|
|
278
|
+
4,
|
|
279
|
+
drive.files.update({
|
|
280
|
+
fileId: fileId,
|
|
281
|
+
addParents: destinationFolderId,
|
|
282
|
+
removeParents: oldParents.join(','),
|
|
283
|
+
fields: 'id,name,parents,webViewLink'
|
|
284
|
+
})
|
|
285
|
+
];
|
|
286
|
+
case 2:
|
|
287
|
+
_state.sent();
|
|
288
|
+
result = _object_spread({
|
|
289
|
+
fileId: fileId,
|
|
290
|
+
fileName: fileName,
|
|
291
|
+
oldParents: returnOldParents ? oldParents : [],
|
|
292
|
+
newParent: destinationFolderId
|
|
293
|
+
}, webViewLink && {
|
|
294
|
+
webViewLink: webViewLink
|
|
295
|
+
});
|
|
296
|
+
return [
|
|
297
|
+
2,
|
|
298
|
+
{
|
|
299
|
+
success: true,
|
|
300
|
+
result: result
|
|
301
|
+
}
|
|
302
|
+
];
|
|
303
|
+
case 3:
|
|
304
|
+
e = _state.sent();
|
|
305
|
+
errorMessage = isDriveApiError(e) && e.message ? e.message : 'Unknown error';
|
|
306
|
+
errorCode = isDriveApiError(e) && e.code ? String(e.code) : undefined;
|
|
307
|
+
logger.info('Failed to move file', {
|
|
308
|
+
fileId: fileId,
|
|
309
|
+
error: errorMessage
|
|
310
|
+
});
|
|
311
|
+
return [
|
|
312
|
+
2,
|
|
313
|
+
{
|
|
314
|
+
success: false,
|
|
315
|
+
error: _object_spread({
|
|
316
|
+
fileId: fileId,
|
|
317
|
+
error: errorMessage
|
|
318
|
+
}, errorCode && {
|
|
319
|
+
code: errorCode
|
|
320
|
+
})
|
|
321
|
+
}
|
|
322
|
+
];
|
|
323
|
+
case 4:
|
|
324
|
+
return [
|
|
325
|
+
2
|
|
326
|
+
];
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
})();
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Move multiple files using batch requests
|
|
333
|
+
*/ function moveBatchFiles(drive, fileIds, destinationFolderId, returnOldParents, _logger) {
|
|
334
|
+
return _async_to_generator(function() {
|
|
335
|
+
var moved, failed, metadataResults, filesToMove, i, result, fileId, _result_reason, _result_reason1, errorCode, moveResults, i1, result1, file, _result_reason2, _result_reason3, errorCode1;
|
|
336
|
+
return _ts_generator(this, function(_state) {
|
|
337
|
+
switch(_state.label){
|
|
338
|
+
case 0:
|
|
339
|
+
moved = [];
|
|
340
|
+
failed = [];
|
|
341
|
+
return [
|
|
342
|
+
4,
|
|
343
|
+
Promise.allSettled(fileIds.map(function(fileId) {
|
|
344
|
+
return _async_to_generator(function() {
|
|
345
|
+
var response, webViewLink, e, message;
|
|
346
|
+
return _ts_generator(this, function(_state) {
|
|
347
|
+
switch(_state.label){
|
|
348
|
+
case 0:
|
|
349
|
+
_state.trys.push([
|
|
350
|
+
0,
|
|
351
|
+
2,
|
|
352
|
+
,
|
|
353
|
+
3
|
|
354
|
+
]);
|
|
355
|
+
return [
|
|
356
|
+
4,
|
|
357
|
+
drive.files.get({
|
|
358
|
+
fileId: fileId,
|
|
359
|
+
fields: 'id,name,parents,webViewLink'
|
|
360
|
+
})
|
|
361
|
+
];
|
|
362
|
+
case 1:
|
|
363
|
+
response = _state.sent();
|
|
364
|
+
webViewLink = response.data.webViewLink;
|
|
365
|
+
return [
|
|
366
|
+
2,
|
|
367
|
+
_object_spread({
|
|
368
|
+
fileId: fileId,
|
|
369
|
+
name: response.data.name || fileId,
|
|
370
|
+
parents: response.data.parents || []
|
|
371
|
+
}, webViewLink && {
|
|
372
|
+
webViewLink: webViewLink
|
|
373
|
+
})
|
|
374
|
+
];
|
|
375
|
+
case 2:
|
|
376
|
+
e = _state.sent();
|
|
377
|
+
message = isDriveApiError(e) && e.message ? e.message : String(e);
|
|
378
|
+
throw new Error("Failed to fetch metadata: ".concat(message));
|
|
379
|
+
case 3:
|
|
380
|
+
return [
|
|
381
|
+
2
|
|
382
|
+
];
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
})();
|
|
386
|
+
}))
|
|
387
|
+
];
|
|
388
|
+
case 1:
|
|
389
|
+
metadataResults = _state.sent();
|
|
390
|
+
// Process metadata results
|
|
391
|
+
filesToMove = [];
|
|
392
|
+
for(i = 0; i < metadataResults.length; i++){
|
|
393
|
+
result = metadataResults[i];
|
|
394
|
+
if (result && result.status === 'fulfilled') {
|
|
395
|
+
filesToMove.push(result.value);
|
|
396
|
+
} else if (result && result.status === 'rejected') {
|
|
397
|
+
fileId = fileIds[i];
|
|
398
|
+
if (fileId) {
|
|
399
|
+
;
|
|
400
|
+
errorCode = ((_result_reason = result.reason) === null || _result_reason === void 0 ? void 0 : _result_reason.code) ? String(result.reason.code) : undefined;
|
|
401
|
+
failed.push(_object_spread({
|
|
402
|
+
fileId: fileId,
|
|
403
|
+
error: ((_result_reason1 = result.reason) === null || _result_reason1 === void 0 ? void 0 : _result_reason1.message) || 'Failed to fetch file metadata'
|
|
404
|
+
}, errorCode && {
|
|
405
|
+
code: errorCode
|
|
406
|
+
}));
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return [
|
|
411
|
+
4,
|
|
412
|
+
Promise.allSettled(filesToMove.map(function(file) {
|
|
413
|
+
return _async_to_generator(function() {
|
|
414
|
+
var e, message;
|
|
415
|
+
return _ts_generator(this, function(_state) {
|
|
416
|
+
switch(_state.label){
|
|
417
|
+
case 0:
|
|
418
|
+
_state.trys.push([
|
|
419
|
+
0,
|
|
420
|
+
2,
|
|
421
|
+
,
|
|
422
|
+
3
|
|
423
|
+
]);
|
|
424
|
+
return [
|
|
425
|
+
4,
|
|
426
|
+
drive.files.update({
|
|
427
|
+
fileId: file.fileId,
|
|
428
|
+
addParents: destinationFolderId,
|
|
429
|
+
removeParents: file.parents.join(','),
|
|
430
|
+
fields: 'id'
|
|
431
|
+
})
|
|
432
|
+
];
|
|
433
|
+
case 1:
|
|
434
|
+
_state.sent();
|
|
435
|
+
return [
|
|
436
|
+
2,
|
|
437
|
+
_object_spread({
|
|
438
|
+
fileId: file.fileId,
|
|
439
|
+
fileName: file.name,
|
|
440
|
+
oldParents: returnOldParents ? file.parents : [],
|
|
441
|
+
newParent: destinationFolderId
|
|
442
|
+
}, file.webViewLink && {
|
|
443
|
+
webViewLink: file.webViewLink
|
|
444
|
+
})
|
|
445
|
+
];
|
|
446
|
+
case 2:
|
|
447
|
+
e = _state.sent();
|
|
448
|
+
message = isDriveApiError(e) && e.message ? e.message : String(e);
|
|
449
|
+
throw new Error("Failed to move: ".concat(message));
|
|
450
|
+
case 3:
|
|
451
|
+
return [
|
|
452
|
+
2
|
|
453
|
+
];
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
})();
|
|
457
|
+
}))
|
|
458
|
+
];
|
|
459
|
+
case 2:
|
|
460
|
+
moveResults = _state.sent();
|
|
461
|
+
// Process move results
|
|
462
|
+
for(i1 = 0; i1 < moveResults.length; i1++){
|
|
463
|
+
result1 = moveResults[i1];
|
|
464
|
+
if (result1 && result1.status === 'fulfilled') {
|
|
465
|
+
moved.push(result1.value);
|
|
466
|
+
} else if (result1 && result1.status === 'rejected') {
|
|
467
|
+
file = filesToMove[i1];
|
|
468
|
+
if (file) {
|
|
469
|
+
;
|
|
470
|
+
errorCode1 = ((_result_reason2 = result1.reason) === null || _result_reason2 === void 0 ? void 0 : _result_reason2.code) ? String(result1.reason.code) : undefined;
|
|
471
|
+
failed.push(_object_spread({
|
|
472
|
+
fileId: file.fileId,
|
|
473
|
+
error: ((_result_reason3 = result1.reason) === null || _result_reason3 === void 0 ? void 0 : _result_reason3.message) || 'Failed to move file'
|
|
474
|
+
}, errorCode1 && {
|
|
475
|
+
code: errorCode1
|
|
476
|
+
}));
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return [
|
|
481
|
+
2,
|
|
482
|
+
{
|
|
483
|
+
moved: moved,
|
|
484
|
+
failed: failed
|
|
485
|
+
}
|
|
486
|
+
];
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
})();
|
|
490
|
+
}
|
|
491
|
+
function handler(_0, _1) {
|
|
492
|
+
return _async_to_generator(function(param, extra) {
|
|
493
|
+
var fileIds, destinationFolderId, _param_returnOldParents, returnOldParents, logger, isBatch, fileIdArray, drive, moved, failed, batchResult, fileId, singleResult, result, error, message;
|
|
494
|
+
return _ts_generator(this, function(_state) {
|
|
495
|
+
switch(_state.label){
|
|
496
|
+
case 0:
|
|
497
|
+
fileIds = param.fileIds, destinationFolderId = param.destinationFolderId, _param_returnOldParents = param.returnOldParents, returnOldParents = _param_returnOldParents === void 0 ? true : _param_returnOldParents;
|
|
498
|
+
logger = extra.logger;
|
|
499
|
+
isBatch = Array.isArray(fileIds);
|
|
500
|
+
fileIdArray = Array.isArray(fileIds) ? fileIds : [
|
|
501
|
+
fileIds
|
|
502
|
+
];
|
|
503
|
+
logger.info('drive.file.move called', {
|
|
504
|
+
fileCount: fileIdArray.length,
|
|
505
|
+
isBatch: isBatch,
|
|
506
|
+
destinationFolderId: destinationFolderId,
|
|
507
|
+
returnOldParents: returnOldParents
|
|
508
|
+
});
|
|
509
|
+
_state.label = 1;
|
|
510
|
+
case 1:
|
|
511
|
+
_state.trys.push([
|
|
512
|
+
1,
|
|
513
|
+
6,
|
|
514
|
+
,
|
|
515
|
+
7
|
|
516
|
+
]);
|
|
517
|
+
drive = _googleapis.google.drive({
|
|
518
|
+
version: 'v3',
|
|
519
|
+
auth: extra.authContext.auth
|
|
520
|
+
});
|
|
521
|
+
moved = [];
|
|
522
|
+
failed = [];
|
|
523
|
+
if (!(isBatch && fileIdArray.length > 1)) return [
|
|
524
|
+
3,
|
|
525
|
+
3
|
|
526
|
+
];
|
|
527
|
+
return [
|
|
528
|
+
4,
|
|
529
|
+
moveBatchFiles(drive, fileIdArray, destinationFolderId, returnOldParents, logger)
|
|
530
|
+
];
|
|
531
|
+
case 2:
|
|
532
|
+
batchResult = _state.sent();
|
|
533
|
+
moved = batchResult.moved;
|
|
534
|
+
failed = batchResult.failed;
|
|
535
|
+
return [
|
|
536
|
+
3,
|
|
537
|
+
5
|
|
538
|
+
];
|
|
539
|
+
case 3:
|
|
540
|
+
// Single file operation
|
|
541
|
+
fileId = fileIdArray[0];
|
|
542
|
+
if (!fileId) return [
|
|
543
|
+
3,
|
|
544
|
+
5
|
|
545
|
+
];
|
|
546
|
+
return [
|
|
547
|
+
4,
|
|
548
|
+
moveSingleFile(drive, fileId, destinationFolderId, returnOldParents, logger)
|
|
549
|
+
];
|
|
550
|
+
case 4:
|
|
551
|
+
singleResult = _state.sent();
|
|
552
|
+
if (singleResult.success && singleResult.result) {
|
|
553
|
+
moved.push(singleResult.result);
|
|
554
|
+
} else if (singleResult.error) {
|
|
555
|
+
failed.push(singleResult.error);
|
|
556
|
+
}
|
|
557
|
+
_state.label = 5;
|
|
558
|
+
case 5:
|
|
559
|
+
logger.info('drive.file.move returning', {
|
|
560
|
+
totalRequested: fileIdArray.length,
|
|
561
|
+
totalMoved: moved.length,
|
|
562
|
+
totalFailed: failed.length
|
|
563
|
+
});
|
|
564
|
+
result = _object_spread_props(_object_spread({
|
|
565
|
+
type: 'success',
|
|
566
|
+
moved: moved
|
|
567
|
+
}, failed.length > 0 && {
|
|
568
|
+
failed: failed
|
|
569
|
+
}), {
|
|
570
|
+
totalRequested: fileIdArray.length,
|
|
571
|
+
totalMoved: moved.length,
|
|
572
|
+
totalFailed: failed.length
|
|
573
|
+
});
|
|
574
|
+
return [
|
|
575
|
+
2,
|
|
576
|
+
{
|
|
577
|
+
content: [
|
|
578
|
+
{
|
|
579
|
+
type: 'text',
|
|
580
|
+
text: JSON.stringify(result)
|
|
581
|
+
}
|
|
582
|
+
],
|
|
583
|
+
structuredContent: {
|
|
584
|
+
result: result
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
];
|
|
588
|
+
case 6:
|
|
589
|
+
error = _state.sent();
|
|
590
|
+
message = _instanceof(error, Error) ? error.message : String(error);
|
|
591
|
+
logger.error('drive.file.move error', {
|
|
592
|
+
error: message
|
|
593
|
+
});
|
|
594
|
+
// Throw McpError
|
|
595
|
+
throw new _types.McpError(_types.ErrorCode.InternalError, "Error moving files: ".concat(message), {
|
|
596
|
+
stack: _instanceof(error, Error) ? error.stack : undefined
|
|
597
|
+
});
|
|
598
|
+
case 7:
|
|
599
|
+
return [
|
|
600
|
+
2
|
|
601
|
+
];
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
}).apply(this, arguments);
|
|
605
|
+
}
|
|
606
|
+
function createTool() {
|
|
607
|
+
return {
|
|
608
|
+
name: 'file-move',
|
|
609
|
+
config: config,
|
|
610
|
+
handler: handler
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
/* 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; }
|
|
@@ -0,0 +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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"}
|