@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.
@@ -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, _graphPlan_search, _graphPlan_filter, result, currentSkipToken, offset, maxPagesCap, maxItemsCap, collected, lastNextSkipToken, midPageToken, capHit, pagesFetched, scannedItems, _graphPlan_search1, pageTokenUsed, graphPage, pageItems, startIndex, sliced, idx, message, nextOffset;
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: (_graphPlan_search = graphPlan.search) !== null && _graphPlan_search !== void 0 ? _graphPlan_search : undefined,
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
- fetchGraphPage(graph, {
219
- search: (_graphPlan_search1 = graphPlan.search) !== null && _graphPlan_search1 !== void 0 ? _graphPlan_search1 : undefined,
220
- skipToken: pageTokenUsed,
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 4:
227
- graphPage = _state.sent();
228
- pagesFetched += 1;
229
- lastNextSkipToken = graphPage.nextSkipToken;
230
- pageItems = graphPage.messages;
231
- if (!pageItems.length) {
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
- 3,
234
- 5
224
+ 2,
225
+ {
226
+ messages: searchResult.collected
227
+ }
235
228
  ];
236
229
  }
237
- startIndex = offset;
238
- sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;
239
- offset = 0;
240
- for(idx = 0; idx < sliced.length; idx += 1){
241
- message = sliced[idx];
242
- scannedItems += 1;
243
- if (maxItemsCap !== null && scannedItems > maxItemsCap) {
244
- capHit = true;
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
- currentSkipToken = graphPage.nextSkipToken;
268
- if (!currentSkipToken) {
239
+ if (searchResult.nextSkipToken) {
269
240
  return [
270
- 3,
271
- 5
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
- return [
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
- 3
262
+ 5
277
263
  ];
278
- case 5:
279
- if (capHit) {
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 (lastNextSkipToken) {
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: lastNextSkipToken,
310
+ skipToken: fallbackResult.nextSkipToken,
303
311
  offset: 0,
304
- mode: 'search'
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;