@mcp-z/mcp-outlook 1.0.12 → 1.0.13
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/dist/cjs/email/querying/query-builder.d.cts +1 -0
- package/dist/cjs/email/querying/query-builder.d.ts +1 -0
- package/dist/cjs/email/querying/query-builder.js +137 -165
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js +204 -82
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js +3 -0
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/email/querying/query-builder.d.ts +1 -0
- package/dist/esm/email/querying/query-builder.js +120 -136
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js +144 -70
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js +1 -0
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/package.json +1 -1
|
@@ -40,6 +40,10 @@ function _async_to_generator(fn) {
|
|
|
40
40
|
});
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
|
+
function _type_of(obj) {
|
|
44
|
+
"@swc/helpers - typeof";
|
|
45
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
46
|
+
}
|
|
43
47
|
function _ts_generator(thisArg, body) {
|
|
44
48
|
var f, y, t, _ = {
|
|
45
49
|
label: 0,
|
|
@@ -141,7 +145,7 @@ function _ts_generator(thisArg, body) {
|
|
|
141
145
|
}
|
|
142
146
|
function searchMessages(graph, opts) {
|
|
143
147
|
return _async_to_generator(function() {
|
|
144
|
-
var query, _opts_includeBody, includeBody, _opts_pageSize, pageSize, pageToken, _opts_maxPages, maxPages, _opts_maxItemsScanned, maxItemsScanned, logger, graphPlan, pageState, useClientFiltering, predicate, requireBody, effectiveIncludeBody,
|
|
148
|
+
var _graphPlan_search, query, _opts_includeBody, includeBody, _opts_pageSize, pageSize, pageToken, _opts_maxPages, maxPages, _opts_maxItemsScanned, maxItemsScanned, logger, graphPlan, pageState, useClientFiltering, predicate, requireBody, effectiveIncludeBody, _graphPlan_search1, _graphPlan_filter, result, searchResult, fallbackFilter, fallbackResult;
|
|
145
149
|
return _ts_generator(this, function(_state) {
|
|
146
150
|
switch(_state.label){
|
|
147
151
|
case 0:
|
|
@@ -173,7 +177,7 @@ function searchMessages(graph, opts) {
|
|
|
173
177
|
return [
|
|
174
178
|
4,
|
|
175
179
|
fetchGraphPage(graph, {
|
|
176
|
-
search: (
|
|
180
|
+
search: (_graphPlan_search1 = graphPlan.search) !== null && _graphPlan_search1 !== void 0 ? _graphPlan_search1 : undefined,
|
|
177
181
|
filter: (_graphPlan_filter = graphPlan.filter) !== null && _graphPlan_filter !== void 0 ? _graphPlan_filter : undefined,
|
|
178
182
|
skipToken: pageState.skipToken,
|
|
179
183
|
includeBody: effectiveIncludeBody,
|
|
@@ -191,125 +195,139 @@ function searchMessages(graph, opts) {
|
|
|
191
195
|
}
|
|
192
196
|
];
|
|
193
197
|
case 2:
|
|
194
|
-
currentSkipToken = pageState.skipToken;
|
|
195
|
-
offset = pageState.offset;
|
|
196
|
-
maxPagesCap = maxPages !== null && maxPages !== void 0 ? maxPages : null;
|
|
197
|
-
maxItemsCap = maxItemsScanned !== null && maxItemsScanned !== void 0 ? maxItemsScanned : null;
|
|
198
|
-
collected = [];
|
|
199
|
-
capHit = false;
|
|
200
|
-
pagesFetched = 0;
|
|
201
|
-
scannedItems = 0;
|
|
202
|
-
_state.label = 3;
|
|
203
|
-
case 3:
|
|
204
|
-
if (!(collected.length < pageSize)) return [
|
|
205
|
-
3,
|
|
206
|
-
5
|
|
207
|
-
];
|
|
208
|
-
if (maxPagesCap !== null && pagesFetched >= maxPagesCap) {
|
|
209
|
-
capHit = true;
|
|
210
|
-
return [
|
|
211
|
-
3,
|
|
212
|
-
5
|
|
213
|
-
];
|
|
214
|
-
}
|
|
215
|
-
pageTokenUsed = currentSkipToken;
|
|
216
198
|
return [
|
|
217
199
|
4,
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
200
|
+
collectClientFilteredPages({
|
|
201
|
+
graph: graph,
|
|
202
|
+
search: (_graphPlan_search = graphPlan.search) !== null && _graphPlan_search !== void 0 ? _graphPlan_search : undefined,
|
|
203
|
+
filter: undefined,
|
|
204
|
+
startSkipToken: pageState.skipToken,
|
|
205
|
+
startOffset: pageState.offset,
|
|
206
|
+
predicate: predicate,
|
|
221
207
|
includeBody: effectiveIncludeBody,
|
|
222
208
|
pageSize: pageSize,
|
|
223
|
-
logger: logger
|
|
209
|
+
logger: logger,
|
|
210
|
+
maxPages: maxPages !== null && maxPages !== void 0 ? maxPages : null,
|
|
211
|
+
maxItemsScanned: maxItemsScanned !== null && maxItemsScanned !== void 0 ? maxItemsScanned : null,
|
|
212
|
+
mode: 'search'
|
|
224
213
|
})
|
|
225
214
|
];
|
|
226
|
-
case
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
215
|
+
case 3:
|
|
216
|
+
searchResult = _state.sent();
|
|
217
|
+
if (query && 'text' in query && _type_of(query.text) === 'object' && Array.isArray(query.text.$all)) {
|
|
218
|
+
console.log('SEARCH RESULT IDS', searchResult.collected.map(function(msg) {
|
|
219
|
+
return msg.id;
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
if (searchResult.capHit) {
|
|
232
223
|
return [
|
|
233
|
-
|
|
234
|
-
|
|
224
|
+
2,
|
|
225
|
+
{
|
|
226
|
+
messages: searchResult.collected
|
|
227
|
+
}
|
|
235
228
|
];
|
|
236
229
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return [
|
|
246
|
-
3,
|
|
247
|
-
5
|
|
248
|
-
];
|
|
249
|
-
}
|
|
250
|
-
if (predicate && !predicate(message)) {
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
collected.push(message);
|
|
254
|
-
if (collected.length === pageSize) {
|
|
255
|
-
nextOffset = startIndex + idx + 1;
|
|
256
|
-
midPageToken = (0, _paginationtokents.encodeNextPageToken)({
|
|
257
|
-
skipToken: pageTokenUsed,
|
|
258
|
-
offset: nextOffset,
|
|
259
|
-
mode: 'search'
|
|
260
|
-
});
|
|
261
|
-
return [
|
|
262
|
-
3,
|
|
263
|
-
5
|
|
264
|
-
];
|
|
265
|
-
}
|
|
230
|
+
if (searchResult.midPageToken) {
|
|
231
|
+
return [
|
|
232
|
+
2,
|
|
233
|
+
{
|
|
234
|
+
messages: searchResult.collected,
|
|
235
|
+
nextPageToken: searchResult.midPageToken
|
|
236
|
+
}
|
|
237
|
+
];
|
|
266
238
|
}
|
|
267
|
-
|
|
268
|
-
if (!currentSkipToken) {
|
|
239
|
+
if (searchResult.nextSkipToken) {
|
|
269
240
|
return [
|
|
270
|
-
|
|
271
|
-
|
|
241
|
+
2,
|
|
242
|
+
{
|
|
243
|
+
messages: searchResult.collected,
|
|
244
|
+
nextPageToken: (0, _paginationtokents.encodeNextPageToken)({
|
|
245
|
+
skipToken: searchResult.nextSkipToken,
|
|
246
|
+
offset: 0,
|
|
247
|
+
mode: 'search'
|
|
248
|
+
})
|
|
249
|
+
}
|
|
272
250
|
];
|
|
273
251
|
}
|
|
274
|
-
|
|
252
|
+
if (searchResult.collected.length > 0) {
|
|
253
|
+
return [
|
|
254
|
+
2,
|
|
255
|
+
{
|
|
256
|
+
messages: searchResult.collected
|
|
257
|
+
}
|
|
258
|
+
];
|
|
259
|
+
}
|
|
260
|
+
if (!(predicate && query)) return [
|
|
275
261
|
3,
|
|
276
|
-
|
|
262
|
+
5
|
|
277
263
|
];
|
|
278
|
-
|
|
279
|
-
if (
|
|
264
|
+
fallbackFilter = (0, _querybuilderts.buildQueryFilter)(query).trim();
|
|
265
|
+
if (!fallbackFilter) return [
|
|
266
|
+
3,
|
|
267
|
+
5
|
|
268
|
+
];
|
|
269
|
+
return [
|
|
270
|
+
4,
|
|
271
|
+
collectClientFilteredPages({
|
|
272
|
+
graph: graph,
|
|
273
|
+
filter: fallbackFilter,
|
|
274
|
+
includeBody: effectiveIncludeBody,
|
|
275
|
+
pageSize: pageSize,
|
|
276
|
+
predicate: predicate,
|
|
277
|
+
logger: logger,
|
|
278
|
+
maxPages: maxPages !== null && maxPages !== void 0 ? maxPages : null,
|
|
279
|
+
maxItemsScanned: maxItemsScanned !== null && maxItemsScanned !== void 0 ? maxItemsScanned : null,
|
|
280
|
+
startSkipToken: undefined,
|
|
281
|
+
startOffset: 0,
|
|
282
|
+
mode: 'filter'
|
|
283
|
+
})
|
|
284
|
+
];
|
|
285
|
+
case 4:
|
|
286
|
+
fallbackResult = _state.sent();
|
|
287
|
+
if (fallbackResult.capHit) {
|
|
280
288
|
return [
|
|
281
289
|
2,
|
|
282
290
|
{
|
|
283
|
-
messages: collected
|
|
291
|
+
messages: fallbackResult.collected
|
|
284
292
|
}
|
|
285
293
|
];
|
|
286
294
|
}
|
|
287
|
-
if (midPageToken) {
|
|
295
|
+
if (fallbackResult.midPageToken) {
|
|
288
296
|
return [
|
|
289
297
|
2,
|
|
290
298
|
{
|
|
291
|
-
messages: collected,
|
|
292
|
-
nextPageToken: midPageToken
|
|
299
|
+
messages: fallbackResult.collected,
|
|
300
|
+
nextPageToken: fallbackResult.midPageToken
|
|
293
301
|
}
|
|
294
302
|
];
|
|
295
303
|
}
|
|
296
|
-
if (
|
|
304
|
+
if (fallbackResult.nextSkipToken) {
|
|
297
305
|
return [
|
|
298
306
|
2,
|
|
299
307
|
{
|
|
300
|
-
messages: collected,
|
|
308
|
+
messages: fallbackResult.collected,
|
|
301
309
|
nextPageToken: (0, _paginationtokents.encodeNextPageToken)({
|
|
302
|
-
skipToken:
|
|
310
|
+
skipToken: fallbackResult.nextSkipToken,
|
|
303
311
|
offset: 0,
|
|
304
|
-
mode: '
|
|
312
|
+
mode: 'filter'
|
|
305
313
|
})
|
|
306
314
|
}
|
|
307
315
|
];
|
|
308
316
|
}
|
|
317
|
+
if (fallbackResult.collected.length > 0) {
|
|
318
|
+
return [
|
|
319
|
+
2,
|
|
320
|
+
{
|
|
321
|
+
messages: fallbackResult.collected
|
|
322
|
+
}
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
_state.label = 5;
|
|
326
|
+
case 5:
|
|
309
327
|
return [
|
|
310
328
|
2,
|
|
311
329
|
{
|
|
312
|
-
messages: collected
|
|
330
|
+
messages: searchResult.collected
|
|
313
331
|
}
|
|
314
332
|
];
|
|
315
333
|
}
|
|
@@ -395,4 +413,108 @@ function fetchGraphPage(graph, params) {
|
|
|
395
413
|
});
|
|
396
414
|
})();
|
|
397
415
|
}
|
|
416
|
+
function collectClientFilteredPages(params) {
|
|
417
|
+
return _async_to_generator(function() {
|
|
418
|
+
var graph, search, filter, startSkipToken, _params_startOffset, startOffset, predicate, includeBody, pageSize, logger, maxPages, maxItemsScanned, mode, currentSkipToken, offset, collected, midPageToken, lastNextSkipToken, capHit, pagesFetched, scannedItems, pageTokenUsed, graphPage, pageItems, startIndex, sliced, idx, message, nextOffset;
|
|
419
|
+
return _ts_generator(this, function(_state) {
|
|
420
|
+
switch(_state.label){
|
|
421
|
+
case 0:
|
|
422
|
+
graph = params.graph, search = params.search, filter = params.filter, startSkipToken = params.startSkipToken, _params_startOffset = params.startOffset, startOffset = _params_startOffset === void 0 ? 0 : _params_startOffset, predicate = params.predicate, includeBody = params.includeBody, pageSize = params.pageSize, logger = params.logger, maxPages = params.maxPages, maxItemsScanned = params.maxItemsScanned, mode = params.mode;
|
|
423
|
+
currentSkipToken = startSkipToken;
|
|
424
|
+
offset = startOffset;
|
|
425
|
+
collected = [];
|
|
426
|
+
capHit = false;
|
|
427
|
+
pagesFetched = 0;
|
|
428
|
+
scannedItems = 0;
|
|
429
|
+
_state.label = 1;
|
|
430
|
+
case 1:
|
|
431
|
+
if (!(collected.length < pageSize)) return [
|
|
432
|
+
3,
|
|
433
|
+
3
|
|
434
|
+
];
|
|
435
|
+
if (maxPages !== null && pagesFetched >= maxPages) {
|
|
436
|
+
capHit = true;
|
|
437
|
+
return [
|
|
438
|
+
3,
|
|
439
|
+
3
|
|
440
|
+
];
|
|
441
|
+
}
|
|
442
|
+
pageTokenUsed = currentSkipToken;
|
|
443
|
+
return [
|
|
444
|
+
4,
|
|
445
|
+
fetchGraphPage(graph, {
|
|
446
|
+
search: search,
|
|
447
|
+
filter: filter,
|
|
448
|
+
skipToken: currentSkipToken,
|
|
449
|
+
includeBody: includeBody,
|
|
450
|
+
pageSize: pageSize,
|
|
451
|
+
logger: logger
|
|
452
|
+
})
|
|
453
|
+
];
|
|
454
|
+
case 2:
|
|
455
|
+
graphPage = _state.sent();
|
|
456
|
+
pagesFetched += 1;
|
|
457
|
+
lastNextSkipToken = graphPage.nextSkipToken;
|
|
458
|
+
pageItems = graphPage.messages;
|
|
459
|
+
if (!pageItems.length) {
|
|
460
|
+
return [
|
|
461
|
+
3,
|
|
462
|
+
3
|
|
463
|
+
];
|
|
464
|
+
}
|
|
465
|
+
startIndex = offset;
|
|
466
|
+
sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;
|
|
467
|
+
offset = 0;
|
|
468
|
+
for(idx = 0; idx < sliced.length; idx += 1){
|
|
469
|
+
message = sliced[idx];
|
|
470
|
+
scannedItems += 1;
|
|
471
|
+
if (maxItemsScanned !== null && scannedItems > maxItemsScanned) {
|
|
472
|
+
capHit = true;
|
|
473
|
+
return [
|
|
474
|
+
3,
|
|
475
|
+
3
|
|
476
|
+
];
|
|
477
|
+
}
|
|
478
|
+
if (predicate && !predicate(message)) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
collected.push(message);
|
|
482
|
+
if (collected.length === pageSize) {
|
|
483
|
+
nextOffset = startIndex + idx + 1;
|
|
484
|
+
midPageToken = (0, _paginationtokents.encodeNextPageToken)({
|
|
485
|
+
skipToken: pageTokenUsed,
|
|
486
|
+
offset: nextOffset,
|
|
487
|
+
mode: mode
|
|
488
|
+
});
|
|
489
|
+
return [
|
|
490
|
+
3,
|
|
491
|
+
3
|
|
492
|
+
];
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
currentSkipToken = graphPage.nextSkipToken;
|
|
496
|
+
if (!currentSkipToken) {
|
|
497
|
+
return [
|
|
498
|
+
3,
|
|
499
|
+
3
|
|
500
|
+
];
|
|
501
|
+
}
|
|
502
|
+
return [
|
|
503
|
+
3,
|
|
504
|
+
1
|
|
505
|
+
];
|
|
506
|
+
case 3:
|
|
507
|
+
return [
|
|
508
|
+
2,
|
|
509
|
+
{
|
|
510
|
+
collected: collected,
|
|
511
|
+
midPageToken: midPageToken,
|
|
512
|
+
nextSkipToken: lastNextSkipToken,
|
|
513
|
+
capHit: capHit
|
|
514
|
+
}
|
|
515
|
+
];
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
})();
|
|
519
|
+
}
|
|
398
520
|
/* 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; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/email/querying/search-execution.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { Message } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { buildClientPredicate } from './client-filter.ts';\nimport { decodeNextPageToken, encodeNextPageToken, FIRST_PAGE_SKIP_TOKEN } from './pagination-token.ts';\nimport { toGraphFilter } from './query-builder.ts';\n\nexport interface OutlookSearchOptions {\n query?: QueryNode;\n limit?: number;\n includeBody?: boolean;\n maxPages?: number | null;\n maxItemsScanned?: number | null;\n pageSize?: number;\n pageToken?: string | undefined;\n logger: Logger;\n}\n\nexport interface OutlookSearchResult {\n messages: Message[];\n nextPageToken?: string | undefined;\n}\n\nexport async function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult> {\n const { query, includeBody = false, pageSize = 50, pageToken, maxPages = null, maxItemsScanned = null, logger } = opts;\n\n const graphPlan = query\n ? toGraphFilter(query)\n : {\n search: null,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n const pageState = decodeNextPageToken(pageToken);\n const useClientFiltering = Boolean(query && graphPlan.hasFullText);\n const predicate = useClientFiltering && query ? buildClientPredicate(query) : null;\n const requireBody = graphPlan.requireBodyClientFilter;\n const effectiveIncludeBody = includeBody || (requireBody && !includeBody);\n\n logger.info('Executing Outlook search', {\n hasSearch: !!graphPlan.search,\n hasFilter: !!graphPlan.filter,\n useClientFiltering,\n pageSize,\n includeBody: effectiveIncludeBody,\n pageToken: pageToken ? '[provided]' : undefined,\n forcedBody: requireBody && !includeBody,\n });\n\n if (!useClientFiltering) {\n const result = await fetchGraphPage(graph, {\n search: graphPlan.search ?? undefined,\n filter: graphPlan.filter ?? undefined,\n skipToken: pageState.skipToken,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n });\n return {\n messages: result.messages,\n nextPageToken: result.nextSkipToken,\n };\n }\n\n let currentSkipToken = pageState.skipToken;\n let offset = pageState.offset;\n const maxPagesCap = maxPages ?? null;\n const maxItemsCap = maxItemsScanned ?? null;\n const collected: Message[] = [];\n let lastNextSkipToken: string | undefined;\n let midPageToken: string | undefined;\n let capHit = false;\n let pagesFetched = 0;\n let scannedItems = 0;\n\n mainLoop: while (collected.length < pageSize) {\n if (maxPagesCap !== null && pagesFetched >= maxPagesCap) {\n capHit = true;\n break;\n }\n\n const pageTokenUsed = currentSkipToken;\n const graphPage = await fetchGraphPage(graph, {\n search: graphPlan.search ?? undefined,\n skipToken: pageTokenUsed,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n });\n\n pagesFetched += 1;\n lastNextSkipToken = graphPage.nextSkipToken;\n const pageItems = graphPage.messages;\n if (!pageItems.length) {\n break;\n }\n\n const startIndex = offset;\n const sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;\n offset = 0;\n\n for (let idx = 0; idx < sliced.length; idx += 1) {\n const message = sliced[idx];\n scannedItems += 1;\n if (maxItemsCap !== null && scannedItems > maxItemsCap) {\n capHit = true;\n break mainLoop;\n }\n if (predicate && !predicate(message)) {\n continue;\n }\n collected.push(message);\n if (collected.length === pageSize) {\n const nextOffset = startIndex + idx + 1;\n midPageToken = encodeNextPageToken({\n skipToken: pageTokenUsed,\n offset: nextOffset,\n mode: 'search',\n });\n break mainLoop;\n }\n }\n\n currentSkipToken = graphPage.nextSkipToken;\n if (!currentSkipToken) {\n break;\n }\n }\n\n if (capHit) {\n return {\n messages: collected,\n };\n }\n\n if (midPageToken) {\n return {\n messages: collected,\n nextPageToken: midPageToken,\n };\n }\n\n if (lastNextSkipToken) {\n return {\n messages: collected,\n nextPageToken: encodeNextPageToken({ skipToken: lastNextSkipToken, offset: 0, mode: 'search' }),\n };\n }\n\n return {\n messages: collected,\n };\n}\n\ninterface GraphPageParams {\n search?: string;\n filter?: string;\n skipToken?: string;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n}\n\nasync function fetchGraphPage(graph: Client, params: GraphPageParams): Promise<{ messages: Message[]; nextSkipToken?: string }> {\n const { search, filter, skipToken, includeBody, pageSize, logger } = params;\n let request = graph.api('/me/messages');\n\n if (search) {\n request = request.search(search);\n }\n if (filter) {\n request = request.filter(filter);\n }\n\n const top = Math.min(pageSize, 1000);\n request = request.top(top);\n\n const selectFields = includeBody ? ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'body', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'] : ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'];\n request = request.select(selectFields.join(','));\n\n if (skipToken && skipToken !== FIRST_PAGE_SKIP_TOKEN) {\n request = request.skipToken(skipToken);\n }\n\n logger.info('Fetching Outlook Graph page', {\n search: !!search,\n filter: !!filter,\n skipToken: skipToken ? '[provided]' : undefined,\n pageSize: top,\n });\n\n const response = await request.get();\n const messages: Message[] = response.value || [];\n let nextSkipToken: string | undefined;\n if (response['@odata.nextLink']) {\n try {\n const nextLinkUrl = new URL(response['@odata.nextLink']);\n nextSkipToken = nextLinkUrl.searchParams.get('$skiptoken') || undefined;\n } catch {\n logger.info('Failed to parse nextLink skipToken', { nextLink: response['@odata.nextLink'] });\n }\n }\n\n logger.info(`Graph page returned ${messages.length} messages`, {\n hasNextPage: !!nextSkipToken,\n });\n\n return { messages, nextSkipToken };\n}\n"],"names":["searchMessages","graph","opts","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","graphPlan","pageState","useClientFiltering","predicate","requireBody","effectiveIncludeBody","result","currentSkipToken","offset","maxPagesCap","maxItemsCap","collected","lastNextSkipToken","midPageToken","capHit","pagesFetched","scannedItems","pageTokenUsed","graphPage","pageItems","startIndex","sliced","idx","message","nextOffset","toGraphFilter","search","filter","requireBodyClientFilter","hasFullText","decodeNextPageToken","Boolean","buildClientPredicate","info","hasSearch","hasFilter","undefined","forcedBody","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","length","slice","push","encodeNextPageToken","mode","params","request","top","selectFields","response","nextLinkUrl","api","Math","min","select","join","FIRST_PAGE_SKIP_TOKEN","get","value","URL","searchParams","nextLink","hasNextPage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/email/querying/search-execution.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { Message } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { buildClientPredicate } from './client-filter.ts';\nimport { decodeNextPageToken, encodeNextPageToken, FIRST_PAGE_SKIP_TOKEN } from './pagination-token.ts';\nimport { buildQueryFilter, toGraphFilter } from './query-builder.ts';\n\nexport interface OutlookSearchOptions {\n query?: QueryNode;\n limit?: number;\n includeBody?: boolean;\n maxPages?: number | null;\n maxItemsScanned?: number | null;\n pageSize?: number;\n pageToken?: string | undefined;\n logger: Logger;\n}\n\nexport interface OutlookSearchResult {\n messages: Message[];\n nextPageToken?: string | undefined;\n}\n\nexport async function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult> {\n const { query, includeBody = false, pageSize = 50, pageToken, maxPages = null, maxItemsScanned = null, logger } = opts;\n\n const graphPlan = query\n ? toGraphFilter(query)\n : {\n search: null,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n const pageState = decodeNextPageToken(pageToken);\n const useClientFiltering = Boolean(query && graphPlan.hasFullText);\n const predicate = useClientFiltering && query ? buildClientPredicate(query) : null;\n const requireBody = graphPlan.requireBodyClientFilter;\n const effectiveIncludeBody = includeBody || (requireBody && !includeBody);\n\n logger.info('Executing Outlook search', {\n hasSearch: !!graphPlan.search,\n hasFilter: !!graphPlan.filter,\n useClientFiltering,\n pageSize,\n includeBody: effectiveIncludeBody,\n pageToken: pageToken ? '[provided]' : undefined,\n forcedBody: requireBody && !includeBody,\n });\n\n if (!useClientFiltering) {\n const result = await fetchGraphPage(graph, {\n search: graphPlan.search ?? undefined,\n filter: graphPlan.filter ?? undefined,\n skipToken: pageState.skipToken,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n });\n return {\n messages: result.messages,\n nextPageToken: result.nextSkipToken,\n };\n }\n\n const searchResult = await collectClientFilteredPages({\n graph,\n search: graphPlan.search ?? undefined,\n filter: undefined,\n startSkipToken: pageState.skipToken,\n startOffset: pageState.offset,\n predicate,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n mode: 'search',\n });\n\n if (query && 'text' in query && typeof query.text === 'object' && Array.isArray(query.text.$all)) {\n console.log(\n 'SEARCH RESULT IDS',\n searchResult.collected.map((msg) => msg.id)\n );\n }\n\n if (searchResult.capHit) {\n return { messages: searchResult.collected };\n }\n if (searchResult.midPageToken) {\n return { messages: searchResult.collected, nextPageToken: searchResult.midPageToken };\n }\n if (searchResult.nextSkipToken) {\n return {\n messages: searchResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: searchResult.nextSkipToken, offset: 0, mode: 'search' }),\n };\n }\n if (searchResult.collected.length > 0) {\n return { messages: searchResult.collected };\n }\n\n if (predicate && query) {\n const fallbackFilter = buildQueryFilter(query).trim();\n if (fallbackFilter) {\n const fallbackResult = await collectClientFilteredPages({\n graph,\n filter: fallbackFilter,\n includeBody: effectiveIncludeBody,\n pageSize,\n predicate,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n startSkipToken: undefined,\n startOffset: 0,\n mode: 'filter',\n });\n\n if (fallbackResult.capHit) {\n return { messages: fallbackResult.collected };\n }\n if (fallbackResult.midPageToken) {\n return { messages: fallbackResult.collected, nextPageToken: fallbackResult.midPageToken };\n }\n if (fallbackResult.nextSkipToken) {\n return {\n messages: fallbackResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: fallbackResult.nextSkipToken, offset: 0, mode: 'filter' }),\n };\n }\n if (fallbackResult.collected.length > 0) {\n return { messages: fallbackResult.collected };\n }\n }\n }\n\n return { messages: searchResult.collected };\n}\n\ninterface GraphPageParams {\n search?: string;\n filter?: string;\n skipToken?: string;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n}\n\nasync function fetchGraphPage(graph: Client, params: GraphPageParams): Promise<{ messages: Message[]; nextSkipToken?: string }> {\n const { search, filter, skipToken, includeBody, pageSize, logger } = params;\n let request = graph.api('/me/messages');\n\n if (search) {\n request = request.search(search);\n }\n if (filter) {\n request = request.filter(filter);\n }\n\n const top = Math.min(pageSize, 1000);\n request = request.top(top);\n\n const selectFields = includeBody ? ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'body', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'] : ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'];\n request = request.select(selectFields.join(','));\n\n if (skipToken && skipToken !== FIRST_PAGE_SKIP_TOKEN) {\n request = request.skipToken(skipToken);\n }\n\n logger.info('Fetching Outlook Graph page', {\n search: !!search,\n filter: !!filter,\n skipToken: skipToken ? '[provided]' : undefined,\n pageSize: top,\n });\n\n const response = await request.get();\n const messages: Message[] = response.value || [];\n let nextSkipToken: string | undefined;\n if (response['@odata.nextLink']) {\n try {\n const nextLinkUrl = new URL(response['@odata.nextLink']);\n nextSkipToken = nextLinkUrl.searchParams.get('$skiptoken') || undefined;\n } catch {\n logger.info('Failed to parse nextLink skipToken', { nextLink: response['@odata.nextLink'] });\n }\n }\n\n logger.info(`Graph page returned ${messages.length} messages`, {\n hasNextPage: !!nextSkipToken,\n });\n\n return { messages, nextSkipToken };\n}\n\ninterface CollectParams {\n graph: Client;\n search?: string;\n filter?: string;\n startSkipToken?: string;\n startOffset?: number;\n predicate: ((message: Message) => boolean) | null;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n maxPages: number | null;\n maxItemsScanned: number | null;\n mode: 'search' | 'filter';\n}\n\ninterface CollectResult {\n collected: Message[];\n midPageToken?: string;\n nextSkipToken?: string;\n capHit: boolean;\n}\n\nasync function collectClientFilteredPages(params: CollectParams): Promise<CollectResult> {\n const { graph, search, filter, startSkipToken, startOffset = 0, predicate, includeBody, pageSize, logger, maxPages, maxItemsScanned, mode } = params;\n let currentSkipToken = startSkipToken;\n let offset = startOffset;\n const collected: Message[] = [];\n let midPageToken: string | undefined;\n let lastNextSkipToken: string | undefined;\n let capHit = false;\n let pagesFetched = 0;\n let scannedItems = 0;\n\n mainLoop: while (collected.length < pageSize) {\n if (maxPages !== null && pagesFetched >= maxPages) {\n capHit = true;\n break;\n }\n\n const pageTokenUsed = currentSkipToken;\n const graphPage = await fetchGraphPage(graph, {\n search,\n filter,\n skipToken: currentSkipToken,\n includeBody,\n pageSize,\n logger,\n });\n\n pagesFetched += 1;\n lastNextSkipToken = graphPage.nextSkipToken;\n const pageItems = graphPage.messages;\n if (!pageItems.length) {\n break;\n }\n\n const startIndex = offset;\n const sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;\n offset = 0;\n\n for (let idx = 0; idx < sliced.length; idx += 1) {\n const message = sliced[idx];\n scannedItems += 1;\n if (maxItemsScanned !== null && scannedItems > maxItemsScanned) {\n capHit = true;\n break mainLoop;\n }\n if (predicate && !predicate(message)) {\n continue;\n }\n collected.push(message);\n if (collected.length === pageSize) {\n const nextOffset = startIndex + idx + 1;\n midPageToken = encodeNextPageToken({\n skipToken: pageTokenUsed,\n offset: nextOffset,\n mode,\n });\n break mainLoop;\n }\n }\n\n currentSkipToken = graphPage.nextSkipToken;\n if (!currentSkipToken) {\n break;\n }\n }\n\n return {\n collected,\n midPageToken,\n nextSkipToken: lastNextSkipToken,\n capHit,\n };\n}\n"],"names":["searchMessages","graph","opts","graphPlan","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","pageState","useClientFiltering","predicate","requireBody","effectiveIncludeBody","result","searchResult","fallbackFilter","fallbackResult","toGraphFilter","search","filter","requireBodyClientFilter","hasFullText","decodeNextPageToken","Boolean","buildClientPredicate","info","hasSearch","hasFilter","undefined","forcedBody","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","collectClientFilteredPages","startSkipToken","startOffset","offset","mode","text","Array","isArray","$all","console","log","collected","map","msg","id","capHit","midPageToken","encodeNextPageToken","length","buildQueryFilter","trim","params","request","top","selectFields","response","nextLinkUrl","api","Math","min","select","join","FIRST_PAGE_SKIP_TOKEN","get","value","URL","searchParams","nextLink","hasNextPage","currentSkipToken","lastNextSkipToken","pagesFetched","scannedItems","pageTokenUsed","graphPage","pageItems","startIndex","sliced","idx","message","nextOffset","slice","push"],"mappings":"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"}
|
|
@@ -345,6 +345,9 @@ function handler(_0, _1) {
|
|
|
345
345
|
filteredItems = exec.items.map(function(item) {
|
|
346
346
|
return (0, _server.filterFields)(item, requestedFields);
|
|
347
347
|
});
|
|
348
|
+
console.log('HANDLER OUTPUT IDS', filteredItems.map(function(item) {
|
|
349
|
+
return item.id;
|
|
350
|
+
}));
|
|
348
351
|
logger.info('outlook.message.search returning', {
|
|
349
352
|
query: query,
|
|
350
353
|
pageSize: pageSize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/message-search.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { needsBody } from '../../email/querying/client-filter.ts';\nimport { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.ts';\nimport { OutlookQueryParameterSchema, parseOutlookQueryParameter } from '../../schemas/outlook-query-schema.ts';\n\nconst inputSchema = z.object({\n query: OutlookQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and kqlQuery for KQL syntax.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 500,\n provider: 'outlook',\n }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Outlook messages using structured query objects with flexible field selection.',\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({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const parsedQuery = parseOutlookQueryParameter(query);\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const needsBodyContent = needsBody(parsedQuery);\n const includeBody = requestedFields === 'all' || requestedFields.has('body') || needsBodyContent;\n\n logger.info('outlook.search called with', {\n query: parsedQuery,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n includeBody,\n });\n\n const graph = Client.initWithMiddleware({\n authProvider: extra.authContext.auth,\n });\n const started = Date.now();\n const exec = await executeOutlookQuery(\n graph,\n parsedQuery,\n {\n logger,\n pageSize,\n ...(pageToken ? { pageToken } : {}),\n includeBody,\n limit: pageSize,\n },\n (m: unknown) => {\n const message = m as MicrosoftGraph.Message;\n const to = Array.isArray(message?.toRecipients)\n ? message.toRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const cc = Array.isArray(message?.ccRecipients)\n ? message.ccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const bcc = Array.isArray(message?.bccRecipients)\n ? message.bccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const fromAddr = message?.from?.emailAddress?.address ?? null;\n const fromName = message?.from?.emailAddress?.name ?? null;\n // Process body based on contentType and excludeThreadHistory options\n let bodyContent: string | undefined;\n if (includeBody && message?.body?.content) {\n const isHtml = message.body.contentType?.toLowerCase() === 'html';\n bodyContent = message.body.content;\n\n if (isHtml && excludeThreadHistory) {\n bodyContent = extractCurrentMessageFromHtml(bodyContent);\n }\n\n if (isHtml && contentType === 'text') {\n bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);\n }\n }\n\n const mapped: Partial<EmailDetail> = {\n id: message?.id ?? undefined,\n subject: message?.subject ?? undefined,\n from: fromAddr ?? undefined,\n fromName: fromName ?? undefined,\n to,\n cc,\n bcc,\n date: message?.receivedDateTime ?? undefined,\n snippet: message?.bodyPreview ?? undefined,\n ...(bodyContent && { body: bodyContent, bodyContentType: contentType }),\n };\n return mapped;\n }\n );\n const durationMs = Date.now() - started;\n\n const filteredItems = exec.items.map((item) => filterFields(item, requestedFields));\n\n logger.info('outlook.message.search returning', {\n query,\n pageSize,\n itemsLength: filteredItems.length,\n fields: fields || 'all',\n });\n logger.info('outlook.message.search metrics', {\n durationMs,\n metadata: exec.metadata,\n });\n\n // Type-safe metadata access\n const metadataObj = exec.metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\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('outlook.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","OutlookQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","createPaginationSchema","defaultPageSize","maxPageSize","provider","shape","createShapeSchema","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successObjectsBranchSchema","type","literal","items","array","EmailDetailSchema","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","extra","pageSize","pageToken","logger","parsedQuery","requestedFields","needsBodyContent","includeBody","graph","started","exec","durationMs","filteredItems","metadataObj","error","message","parseOutlookQueryParameter","parseFields","needsBody","has","info","undefined","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","executeOutlookQuery","limit","m","to","Array","isArray","toRecipients","map","r","emailAddress","address","filter","Boolean","join","cc","ccRecipients","bcc","bccRecipients","fromAddr","from","fromName","name","bodyContent","body","content","isHtml","toLowerCase","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","mapped","id","subject","date","receivedDateTime","snippet","bodyPreview","bodyContentType","item","filterFields","itemsLength","length","metadata","toColumnarFormat","text","JSON","stringify","structuredContent","Error","String","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/message-search.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { needsBody } from '../../email/querying/client-filter.ts';\nimport { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.ts';\nimport { OutlookQueryParameterSchema, parseOutlookQueryParameter } from '../../schemas/outlook-query-schema.ts';\n\nconst inputSchema = z.object({\n query: OutlookQueryParameterSchema.optional().describe('Structured query object or JSON string for filtering messages. Use query-syntax prompt for reference and kqlQuery for KQL syntax.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 500,\n provider: 'outlook',\n }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Outlook messages using structured query objects with flexible field selection.',\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({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const parsedQuery = parseOutlookQueryParameter(query);\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const needsBodyContent = needsBody(parsedQuery);\n const includeBody = requestedFields === 'all' || requestedFields.has('body') || needsBodyContent;\n\n logger.info('outlook.search called with', {\n query: parsedQuery,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n includeBody,\n });\n\n const graph = Client.initWithMiddleware({\n authProvider: extra.authContext.auth,\n });\n const started = Date.now();\n const exec = await executeOutlookQuery(\n graph,\n parsedQuery,\n {\n logger,\n pageSize,\n ...(pageToken ? { pageToken } : {}),\n includeBody,\n limit: pageSize,\n },\n (m: unknown) => {\n const message = m as MicrosoftGraph.Message;\n const to = Array.isArray(message?.toRecipients)\n ? message.toRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const cc = Array.isArray(message?.ccRecipients)\n ? message.ccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const bcc = Array.isArray(message?.bccRecipients)\n ? message.bccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const fromAddr = message?.from?.emailAddress?.address ?? null;\n const fromName = message?.from?.emailAddress?.name ?? null;\n // Process body based on contentType and excludeThreadHistory options\n let bodyContent: string | undefined;\n if (includeBody && message?.body?.content) {\n const isHtml = message.body.contentType?.toLowerCase() === 'html';\n bodyContent = message.body.content;\n\n if (isHtml && excludeThreadHistory) {\n bodyContent = extractCurrentMessageFromHtml(bodyContent);\n }\n\n if (isHtml && contentType === 'text') {\n bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);\n }\n }\n\n const mapped: Partial<EmailDetail> = {\n id: message?.id ?? undefined,\n subject: message?.subject ?? undefined,\n from: fromAddr ?? undefined,\n fromName: fromName ?? undefined,\n to,\n cc,\n bcc,\n date: message?.receivedDateTime ?? undefined,\n snippet: message?.bodyPreview ?? undefined,\n ...(bodyContent && { body: bodyContent, bodyContentType: contentType }),\n };\n return mapped;\n }\n );\n const durationMs = Date.now() - started;\n\n const filteredItems = exec.items.map((item) => filterFields(item, requestedFields));\n console.log(\n 'HANDLER OUTPUT IDS',\n filteredItems.map((item) => item.id)\n );\n\n logger.info('outlook.message.search returning', {\n query,\n pageSize,\n itemsLength: filteredItems.length,\n fields: fields || 'all',\n });\n logger.info('outlook.message.search metrics', {\n durationMs,\n metadata: exec.metadata,\n });\n\n // Type-safe metadata access\n const metadataObj = exec.metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\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('outlook.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","query","OutlookQueryParameterSchema","optional","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","createPaginationSchema","defaultPageSize","maxPageSize","provider","shape","createShapeSchema","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successObjectsBranchSchema","type","literal","items","array","EmailDetailSchema","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","extra","pageSize","pageToken","logger","parsedQuery","requestedFields","needsBodyContent","includeBody","graph","started","exec","durationMs","filteredItems","metadataObj","error","message","parseOutlookQueryParameter","parseFields","needsBody","has","info","undefined","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","executeOutlookQuery","limit","m","to","Array","isArray","toRecipients","map","r","emailAddress","address","filter","Boolean","join","cc","ccRecipients","bcc","bccRecipients","fromAddr","from","fromName","name","bodyContent","body","content","isHtml","toLowerCase","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","mapped","id","subject","date","receivedDateTime","snippet","bodyPreview","bodyContentType","item","filterFields","console","log","itemsLength","length","metadata","toColumnarFormat","text","JSON","stringify","structuredContent","Error","String","McpError","ErrorCode","InternalError","stack"],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ export interface ODataFilterResult {
|
|
|
23
23
|
hasFullText: boolean;
|
|
24
24
|
}
|
|
25
25
|
export declare function toGraphFilter(query: QueryNode): ODataFilterResult;
|
|
26
|
+
export declare function buildQueryFilter(query: QueryNode): string;
|
|
26
27
|
export declare function toOutlookFilter(parsed: QueryNode, _options?: {
|
|
27
28
|
includeBodyContent?: boolean;
|
|
28
29
|
useCaseInsensitiveWrap?: boolean;
|