@mcp-z/mcp-outlook 2.2.1 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/cjs/constants.js.map +1 -1
  2. package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -1
  3. package/dist/cjs/email/messages/messages.js.map +1 -1
  4. package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
  5. package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
  6. package/dist/cjs/email/parsing/message-mapping.js.map +1 -1
  7. package/dist/cjs/email/querying/client-filter.js.map +1 -1
  8. package/dist/cjs/email/querying/execute-query.js.map +1 -1
  9. package/dist/cjs/email/querying/pagination-token.js.map +1 -1
  10. package/dist/cjs/email/querying/query-builder.js.map +1 -1
  11. package/dist/cjs/email/querying/search-execution.js.map +1 -1
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/lib/create-store.js.map +1 -1
  14. package/dist/cjs/lib/messages-to-row.js.map +1 -1
  15. package/dist/cjs/lib/outlook/index.js.map +1 -1
  16. package/dist/cjs/lib/outlook/types.js.map +1 -1
  17. package/dist/cjs/mcp/index.js.map +1 -1
  18. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
  19. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  20. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  21. package/dist/cjs/mcp/resources/email.js.map +1 -1
  22. package/dist/cjs/mcp/resources/index.js.map +1 -1
  23. package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
  24. package/dist/cjs/mcp/tools/index.js.map +1 -1
  25. package/dist/cjs/mcp/tools/label-add.js.map +1 -1
  26. package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
  27. package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
  28. package/dist/cjs/mcp/tools/message-get.js.map +1 -1
  29. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
  30. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
  31. package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
  32. package/dist/cjs/mcp/tools/message-search.js.map +1 -1
  33. package/dist/cjs/mcp/tools/message-send.js.map +1 -1
  34. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
  35. package/dist/cjs/schemas/index.js.map +1 -1
  36. package/dist/cjs/schemas/outlook-query-schema.js.map +1 -1
  37. package/dist/cjs/schemas/outlook-validation.js.map +1 -1
  38. package/dist/cjs/setup/config.js +5 -4
  39. package/dist/cjs/setup/config.js.map +1 -1
  40. package/dist/cjs/setup/http.js.map +1 -1
  41. package/dist/cjs/setup/index.js.map +1 -1
  42. package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
  43. package/dist/cjs/setup/runtime.js +3 -2
  44. package/dist/cjs/setup/runtime.js.map +1 -1
  45. package/dist/cjs/setup/stdio.js.map +1 -1
  46. package/dist/cjs/setup/version-help.js.map +1 -1
  47. package/dist/esm/constants.js.map +1 -1
  48. package/dist/esm/email/composition/outlook-message-builder.js.map +1 -1
  49. package/dist/esm/email/messages/messages.js.map +1 -1
  50. package/dist/esm/email/parsing/header-parsing.js.map +1 -1
  51. package/dist/esm/email/parsing/message-extraction.js.map +1 -1
  52. package/dist/esm/email/parsing/message-mapping.js.map +1 -1
  53. package/dist/esm/email/querying/client-filter.js.map +1 -1
  54. package/dist/esm/email/querying/execute-query.js.map +1 -1
  55. package/dist/esm/email/querying/pagination-token.js.map +1 -1
  56. package/dist/esm/email/querying/query-builder.js.map +1 -1
  57. package/dist/esm/email/querying/search-execution.js.map +1 -1
  58. package/dist/esm/index.js.map +1 -1
  59. package/dist/esm/lib/create-store.js.map +1 -1
  60. package/dist/esm/lib/messages-to-row.js.map +1 -1
  61. package/dist/esm/lib/outlook/index.js.map +1 -1
  62. package/dist/esm/lib/outlook/types.js.map +1 -1
  63. package/dist/esm/mcp/index.js.map +1 -1
  64. package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
  65. package/dist/esm/mcp/prompts/index.js.map +1 -1
  66. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  67. package/dist/esm/mcp/resources/email.js.map +1 -1
  68. package/dist/esm/mcp/resources/index.js.map +1 -1
  69. package/dist/esm/mcp/tools/categories-list.js.map +1 -1
  70. package/dist/esm/mcp/tools/index.js.map +1 -1
  71. package/dist/esm/mcp/tools/label-add.js.map +1 -1
  72. package/dist/esm/mcp/tools/label-delete.js.map +1 -1
  73. package/dist/esm/mcp/tools/labels-list.js.map +1 -1
  74. package/dist/esm/mcp/tools/message-get.js.map +1 -1
  75. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
  76. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
  77. package/dist/esm/mcp/tools/message-respond.js.map +1 -1
  78. package/dist/esm/mcp/tools/message-search.js.map +1 -1
  79. package/dist/esm/mcp/tools/message-send.js.map +1 -1
  80. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
  81. package/dist/esm/schemas/index.js.map +1 -1
  82. package/dist/esm/schemas/outlook-query-schema.js.map +1 -1
  83. package/dist/esm/schemas/outlook-validation.js.map +1 -1
  84. package/dist/esm/setup/config.js +4 -3
  85. package/dist/esm/setup/config.js.map +1 -1
  86. package/dist/esm/setup/http.js.map +1 -1
  87. package/dist/esm/setup/index.js.map +1 -1
  88. package/dist/esm/setup/oauth-microsoft.js.map +1 -1
  89. package/dist/esm/setup/runtime.js +3 -2
  90. package/dist/esm/setup/runtime.js.map +1 -1
  91. package/dist/esm/setup/stdio.js.map +1 -1
  92. package/dist/esm/setup/version-help.js.map +1 -1
  93. package/dist/esm/types.js.map +1 -1
  94. package/package.json +6 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/email/querying/query-builder.ts"],"sourcesContent":["import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\n\ntype FieldOperator = {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n};\n\ntype DateOperator = {\n $gte?: string;\n $lt?: string;\n};\n\ntype FieldQuery = {\n from?: FieldOperator | string;\n to?: FieldOperator | string;\n cc?: FieldOperator | string;\n bcc?: FieldOperator | string;\n subject?: FieldOperator | string;\n text?: FieldOperator | string;\n body?: FieldOperator | string;\n categories?: FieldOperator | string;\n label?: FieldOperator | string;\n};\n\n/**\n * Outlook category mappings - case insensitive input to exact system categories\n * Note: These are user-defined categories in Outlook, not system categories like Gmail\n */\nexport const OUTLOOK_CATEGORIES = {\n personal: 'Personal',\n work: 'Work',\n family: 'Family',\n travel: 'Travel',\n important: 'Important',\n urgent: 'Urgent',\n} as const;\n\n/**\n * Validate and map category name to Outlook system category\n * Throws error for invalid categories (fail fast principle)\n */\nexport function mapOutlookCategory(category: string): string {\n // Input validation - fail fast on invalid input\n if (!category || typeof category !== 'string') {\n throw new Error(`Invalid category: expected non-empty string, got ${typeof category}`);\n }\n\n const trimmed = category.trim();\n if (trimmed === '') {\n throw new Error('Invalid category: empty string after trimming');\n }\n\n // Fail fast on unknown categories\n const normalizedCategory = trimmed.toLowerCase();\n const systemCategory = OUTLOOK_CATEGORIES[normalizedCategory as keyof typeof OUTLOOK_CATEGORIES];\n\n if (!systemCategory) {\n throw new Error(`Invalid Outlook category: \"${category}\". Valid categories: ${Object.keys(OUTLOOK_CATEGORIES).join(', ')}`);\n }\n\n return systemCategory;\n}\n\nexport interface ODataFilterResult {\n search: string | null;\n filter: string | null;\n requireBodyClientFilter: boolean;\n hasFullText: boolean;\n}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n if (query.kqlQuery) {\n return {\n search: query.kqlQuery,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: true,\n };\n }\n\n if (hasFullTextIntent(query)) {\n const searchCollect = collectSearchTerms(query);\n const search = searchCollect.terms.length ? searchCollect.terms.join(' OR ') : null;\n return {\n search,\n filter: null,\n requireBodyClientFilter: searchCollect.usesBody || searchCollect.usesText,\n hasFullText: true,\n };\n }\n\n const filterStr = buildQueryFilter(query);\n const cleanedFilter = filterStr && typeof filterStr === 'string' && filterStr.trim().length ? filterStr.trim() : null;\n return {\n search: null,\n filter: cleanedFilter,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n}\n\nfunction collectSearchTerms(query: QueryNode): { terms: string[]; usesText: boolean; usesBody: boolean; usesExact: boolean } {\n const state = {\n terms: [] as string[],\n usesText: false,\n usesBody: false,\n usesExact: false,\n };\n\n walkNode(query);\n return state;\n\n function walkNode(node: QueryNode | undefined) {\n if (!node || typeof node !== 'object') return;\n\n if (node.$and) {\n node.$and.forEach((child) => walkNode(child));\n return;\n }\n if (node.$or) {\n node.$or.forEach((child) => walkNode(child));\n return;\n }\n if (node.$not) {\n walkNode(node.$not);\n return;\n }\n\n if ('exactPhrase' in node && node.exactPhrase) {\n state.usesExact = true;\n pushExactPhrase(node.exactPhrase);\n }\n\n pushOperatorTerms(node.subject);\n\n if ('text' in node && node.text) {\n state.usesText = true;\n pushOperatorTerms(node.text);\n }\n if ('body' in node && node.body) {\n state.usesBody = true;\n pushOperatorTerms(node.body);\n }\n\n // Other fields (hasAttachment, importance, date) are handled via OData filters (emit())\n // and should not create search terms with colon prefixes that break Graph $search.\n }\n\n function pushExactPhrase(value: string) {\n const phrase = String(value);\n if (!phrase.trim()) return;\n pushAnyTerms([`\"${phrase}\"`]);\n }\n\n function pushOperatorTerms(value: FieldOperator | string | undefined) {\n if (!value) return;\n if (typeof value === 'string') {\n const clause = buildClause(null, value);\n if (clause) state.terms.push(clause);\n return;\n }\n\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n pushAnyTerms(value.$any);\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n pushAllTerms(value.$all);\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n const clauses = value.$none.map((term) => buildClause(null, String(term ?? ''))).filter(Boolean);\n if (clauses.length === 1) {\n state.terms.push(`NOT ${clauses[0]}`);\n } else if (clauses.length > 1) {\n state.terms.push(`NOT (${clauses.join(' OR ')})`);\n }\n }\n }\n\n function pushAnyTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n state.terms.push(clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`);\n }\n\n function pushAllTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n // Graph $search silently ignores \"(A AND B)\" expressions, so narrow with the\n // first term only; the client-side $all predicate enforces the rest.\n state.terms.push(clauses[0]);\n }\n\n function escapeKQL(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/:/g, '\\\\:')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\{/g, '\\\\{')\n .replace(/\\}/g, '\\\\}')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\?/g, '\\\\?')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/_/g, '\\\\_');\n }\n\n function buildClause(_prefix: string | null, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n const escaped = escapeKQL(trimmed);\n const shouldQuote = /[^a-zA-Z\\s]/.test(trimmed) || /\\s/.test(trimmed);\n return shouldQuote ? `\"${escaped}\"` : escaped;\n }\n}\n\nfunction hasFullTextIntent(node: QueryNode | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n\n if (node.kqlQuery) return true;\n if (node.exactPhrase) return true;\n if ('subject' in node && node.subject) return true;\n if ('text' in node && node.text) return true;\n if ('body' in node && node.body) return true;\n\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasFullTextIntent(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasFullTextIntent(child));\n }\n if ('$not' in node && node.$not) {\n return hasFullTextIntent(node.$not);\n }\n\n return false;\n}\n\nexport function buildQueryFilter(query: QueryNode): string {\n function L(s: string) {\n return s;\n }\n\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n const left = `r/emailAddress/address eq ${V}`;\n const right = `r/emailAddress/name eq ${V}`;\n return `${coll}/any(r: ${left} or ${right})`;\n }\n\n function fv(field: string, raw: string | number | boolean | null | undefined): string {\n if (raw == null) return '';\n const rawStr = String(raw);\n\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n return '';\n }\n\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n\n const V = `'${rawStr.toLowerCase().replace(/'/g, \"''\")}'`;\n switch (field) {\n case 'from': {\n if (rawStr.includes('@')) {\n const addrEq = `${L('from/emailAddress/address')} eq ${V}`;\n const nameEq = `${L('from/emailAddress/name')} eq ${V}`;\n return p(`${addrEq} or ${nameEq}`);\n }\n return '';\n }\n case 'to':\n return recip('toRecipients', V);\n case 'cc':\n return recip('ccRecipients', V);\n case 'bcc':\n return recip('bccRecipients', V);\n case 'subject':\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n const systemCategory = mapOutlookCategory(rawStr);\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label':\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n default:\n return '';\n }\n }\n\n function chain(op: 'and' | 'or', arr: Array<string | undefined>) {\n if (!arr || arr.length === 0) {\n throw new Error(`chain: empty array for ${op} operation`);\n }\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return String(first);\n }\n const joined = arr.join(` ${op} `);\n return p(joined);\n }\n\n function fieldExpr(field: string, op: FieldOperator | string): string {\n if (typeof op === 'string') {\n return fv(field, op);\n }\n\n if (Array.isArray(op.$any)) {\n const results = op.$any.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('or', validResults);\n }\n if (Array.isArray(op.$all)) {\n const results = op.$all.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('and', validResults);\n }\n if (Array.isArray(op.$none)) {\n const results = op.$none.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return `not ${p(chain('or', validResults))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: DateOperator): string {\n const parts: string[] = [];\n if (d.$gte) parts.push(`receivedDateTime ge ${d.$gte}T00:00:00Z`);\n if (d.$lt) parts.push(`receivedDateTime lt ${d.$lt}T00:00:00Z`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function emit(n: QueryNode): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && n.$and) {\n const andParts = n.$and.map(emit).filter((part: string): part is string => Boolean(part));\n if (andParts.length === 0) return '';\n if (andParts.length === 1) {\n const firstPart = andParts[0];\n return firstPart ?? '';\n }\n return p(andParts.join(' and '));\n }\n if ('$or' in n && n.$or) {\n const orParts = n.$or.map(emit).filter((part: string): part is string => Boolean(part));\n if (orParts.length === 0) return '';\n if (orParts.length === 1) {\n const firstPart = orParts[0];\n return firstPart ?? '';\n }\n return p(orParts.join(' or '));\n }\n if ('$not' in n && n.$not) {\n const notExpr = emit(n.$not);\n return notExpr ? `not (${notExpr})` : '';\n }\n if ('hasAttachment' in n && n.hasAttachment) return 'hasAttachments eq true';\n if ('date' in n && n.date) return dateExpr(n.date);\n\n const keys = Object.keys(n);\n if (keys.length === 1) {\n const k0 = String(keys[0] ?? '');\n if (k0 && ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'].includes(k0)) {\n const fieldValue = (n as FieldQuery)[k0 as keyof FieldQuery];\n if (fieldValue) return fieldExpr(k0, fieldValue);\n }\n }\n return '';\n }\n\n return emit(query);\n}\nexport function toOutlookFilter(parsed: QueryNode, _options?: { includeBodyContent?: boolean; useCaseInsensitiveWrap?: boolean }) {\n const graphResult = toGraphFilter(parsed);\n const filters = extractOutlookFilters(parsed);\n return {\n filter: graphResult.filter,\n search: graphResult.search,\n requireBodyClientFilter: graphResult.requireBodyClientFilter,\n filters,\n };\n}\n\ninterface ExtractedFilters {\n subjectIncludes: string[];\n bodyIncludes: string[];\n textIncludes: string[];\n fromIncludes: string[];\n toIncludes: string[];\n ccIncludes: string[];\n bccIncludes: string[];\n categoriesIncludes: string[];\n labelIncludes: string[];\n hasAttachment?: boolean;\n since?: string;\n before?: string;\n}\n\nexport function extractOutlookFilters(parsed: QueryNode): ExtractedFilters {\n const filters: ExtractedFilters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n fromIncludes: [],\n toIncludes: [],\n ccIncludes: [],\n bccIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('hasAttachment' in node && node.hasAttachment !== undefined) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node && node.date) {\n if (node.date.$gte) filters.since = node.date.$gte;\n if (node.date.$lt) filters.before = node.date.$lt;\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n filters.subjectIncludes.push(node.subject);\n } else {\n if (node.subject.$any) filters.subjectIncludes.push(...node.subject.$any);\n if (node.subject.$all) filters.subjectIncludes.push(...node.subject.$all);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n filters.bodyIncludes.push(node.body);\n } else {\n if (node.body.$any) filters.bodyIncludes.push(...node.body.$any);\n if (node.body.$all) filters.bodyIncludes.push(...node.body.$all);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n filters.textIncludes.push(node.text);\n filters.bodyIncludes.push(node.text);\n } else {\n if (node.text.$any) {\n filters.textIncludes.push(...node.text.$any);\n filters.bodyIncludes.push(...node.text.$any);\n }\n if (node.text.$all) {\n filters.textIncludes.push(...node.text.$all);\n filters.bodyIncludes.push(...node.text.$all);\n }\n }\n }\n if ('from' in node && node.from) {\n if (typeof node.from === 'string') {\n filters.fromIncludes.push(node.from);\n } else {\n if (node.from.$any) filters.fromIncludes.push(...node.from.$any);\n if (node.from.$all) filters.fromIncludes.push(...node.from.$all);\n }\n }\n if ('to' in node && node.to) {\n if (typeof node.to === 'string') {\n filters.toIncludes.push(node.to);\n } else {\n if (node.to.$any) filters.toIncludes.push(...node.to.$any);\n if (node.to.$all) filters.toIncludes.push(...node.to.$all);\n }\n }\n if ('cc' in node && node.cc) {\n if (typeof node.cc === 'string') {\n filters.ccIncludes.push(node.cc);\n } else {\n if (node.cc.$any) filters.ccIncludes.push(...node.cc.$any);\n if (node.cc.$all) filters.ccIncludes.push(...node.cc.$all);\n }\n }\n if ('bcc' in node && node.bcc) {\n if (typeof node.bcc === 'string') {\n filters.bccIncludes.push(node.bcc);\n } else {\n if (node.bcc.$any) filters.bccIncludes.push(...node.bcc.$any);\n if (node.bcc.$all) filters.bccIncludes.push(...node.bcc.$all);\n }\n }\n if ('categories' in node && node.categories) {\n if (typeof node.categories === 'string') {\n if (mapOutlookCategory(node.categories) !== null) {\n filters.categoriesIncludes.push(node.categories);\n }\n } else {\n // Filter out invalid categories to prevent memory leaks and maintain clean state\n if (node.categories.$any) {\n const validCategories = node.categories.$any.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$all) {\n const validCategories = node.categories.$all.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$none) {\n const validCategories = node.categories.$none.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n }\n }\n if ('label' in node && node.label) {\n if (typeof node.label === 'string') {\n filters.labelIncludes.push(node.label);\n } else {\n if (node.label.$any) filters.labelIncludes.push(...node.label.$any);\n if (node.label.$all) filters.labelIncludes.push(...node.label.$all);\n if (node.label.$none) filters.labelIncludes.push(...node.label.$none);\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["OUTLOOK_CATEGORIES","personal","work","family","travel","important","urgent","mapOutlookCategory","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","toGraphFilter","query","kqlQuery","search","filter","requireBodyClientFilter","hasFullText","hasFullTextIntent","searchCollect","collectSearchTerms","terms","length","usesBody","usesText","filterStr","buildQueryFilter","cleanedFilter","state","usesExact","walkNode","node","$and","forEach","child","$or","$not","exactPhrase","pushExactPhrase","pushOperatorTerms","subject","text","body","value","phrase","String","pushAnyTerms","clause","buildClause","push","Array","isArray","$any","$all","pushAllTerms","$none","clauses","map","term","Boolean","values","val","escapeKQL","replace","_prefix","escaped","shouldQuote","test","some","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","includes","addrEq","nameEq","chain","op","arr","first","joined","fieldExpr","results","v","validResults","JSON","stringify","dateExpr","d","parts","$gte","$lt","emit","n","andParts","part","firstPart","orParts","notExpr","hasAttachment","date","k0","fieldValue","toOutlookFilter","parsed","_options","graphResult","filters","extractOutlookFilters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","walk","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/query-builder.ts"],"sourcesContent":["import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\n\ntype FieldOperator = {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n};\n\ntype DateOperator = {\n $gte?: string;\n $lt?: string;\n};\n\ntype FieldQuery = {\n from?: FieldOperator | string;\n to?: FieldOperator | string;\n cc?: FieldOperator | string;\n bcc?: FieldOperator | string;\n subject?: FieldOperator | string;\n text?: FieldOperator | string;\n body?: FieldOperator | string;\n categories?: FieldOperator | string;\n label?: FieldOperator | string;\n};\n\n/**\n * Outlook category mappings - case insensitive input to exact system categories\n * Note: These are user-defined categories in Outlook, not system categories like Gmail\n */\nexport const OUTLOOK_CATEGORIES = {\n personal: 'Personal',\n work: 'Work',\n family: 'Family',\n travel: 'Travel',\n important: 'Important',\n urgent: 'Urgent',\n} as const;\n\n/**\n * Validate and map category name to Outlook system category\n * Throws error for invalid categories (fail fast principle)\n */\nexport function mapOutlookCategory(category: string): string {\n // Input validation - fail fast on invalid input\n if (!category || typeof category !== 'string') {\n throw new Error(`Invalid category: expected non-empty string, got ${typeof category}`);\n }\n\n const trimmed = category.trim();\n if (trimmed === '') {\n throw new Error('Invalid category: empty string after trimming');\n }\n\n // Fail fast on unknown categories\n const normalizedCategory = trimmed.toLowerCase();\n const systemCategory = OUTLOOK_CATEGORIES[normalizedCategory as keyof typeof OUTLOOK_CATEGORIES];\n\n if (!systemCategory) {\n throw new Error(`Invalid Outlook category: \"${category}\". Valid categories: ${Object.keys(OUTLOOK_CATEGORIES).join(', ')}`);\n }\n\n return systemCategory;\n}\n\nexport interface ODataFilterResult {\n search: string | null;\n filter: string | null;\n requireBodyClientFilter: boolean;\n hasFullText: boolean;\n}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n if (query.kqlQuery) {\n return {\n search: query.kqlQuery,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: true,\n };\n }\n\n if (hasFullTextIntent(query)) {\n const searchCollect = collectSearchTerms(query);\n const search = searchCollect.terms.length ? searchCollect.terms.join(' OR ') : null;\n return {\n search,\n filter: null,\n requireBodyClientFilter: searchCollect.usesBody || searchCollect.usesText,\n hasFullText: true,\n };\n }\n\n const filterStr = buildQueryFilter(query);\n const cleanedFilter = filterStr && typeof filterStr === 'string' && filterStr.trim().length ? filterStr.trim() : null;\n return {\n search: null,\n filter: cleanedFilter,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n}\n\nfunction collectSearchTerms(query: QueryNode): { terms: string[]; usesText: boolean; usesBody: boolean; usesExact: boolean } {\n const state = {\n terms: [] as string[],\n usesText: false,\n usesBody: false,\n usesExact: false,\n };\n\n walkNode(query);\n return state;\n\n function walkNode(node: QueryNode | undefined) {\n if (!node || typeof node !== 'object') return;\n\n if (node.$and) {\n node.$and.forEach((child) => walkNode(child));\n return;\n }\n if (node.$or) {\n node.$or.forEach((child) => walkNode(child));\n return;\n }\n if (node.$not) {\n walkNode(node.$not);\n return;\n }\n\n if ('exactPhrase' in node && node.exactPhrase) {\n state.usesExact = true;\n pushExactPhrase(node.exactPhrase);\n }\n\n pushOperatorTerms(node.subject);\n\n if ('text' in node && node.text) {\n state.usesText = true;\n pushOperatorTerms(node.text);\n }\n if ('body' in node && node.body) {\n state.usesBody = true;\n pushOperatorTerms(node.body);\n }\n\n // Other fields (hasAttachment, importance, date) are handled via OData filters (emit())\n // and should not create search terms with colon prefixes that break Graph $search.\n }\n\n function pushExactPhrase(value: string) {\n const phrase = String(value);\n if (!phrase.trim()) return;\n pushAnyTerms([`\"${phrase}\"`]);\n }\n\n function pushOperatorTerms(value: FieldOperator | string | undefined) {\n if (!value) return;\n if (typeof value === 'string') {\n const clause = buildClause(null, value);\n if (clause) state.terms.push(clause);\n return;\n }\n\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n pushAnyTerms(value.$any);\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n pushAllTerms(value.$all);\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n const clauses = value.$none.map((term) => buildClause(null, String(term ?? ''))).filter(Boolean);\n if (clauses.length === 1) {\n state.terms.push(`NOT ${clauses[0]}`);\n } else if (clauses.length > 1) {\n state.terms.push(`NOT (${clauses.join(' OR ')})`);\n }\n }\n }\n\n function pushAnyTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n state.terms.push(clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`);\n }\n\n function pushAllTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n // Graph $search silently ignores \"(A AND B)\" expressions, so narrow with the\n // first term only; the client-side $all predicate enforces the rest.\n state.terms.push(clauses[0]);\n }\n\n function escapeKQL(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/:/g, '\\\\:')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\{/g, '\\\\{')\n .replace(/\\}/g, '\\\\}')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\?/g, '\\\\?')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/_/g, '\\\\_');\n }\n\n function buildClause(_prefix: string | null, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n const escaped = escapeKQL(trimmed);\n const shouldQuote = /[^a-zA-Z\\s]/.test(trimmed) || /\\s/.test(trimmed);\n return shouldQuote ? `\"${escaped}\"` : escaped;\n }\n}\n\nfunction hasFullTextIntent(node: QueryNode | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n\n if (node.kqlQuery) return true;\n if (node.exactPhrase) return true;\n if ('subject' in node && node.subject) return true;\n if ('text' in node && node.text) return true;\n if ('body' in node && node.body) return true;\n\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasFullTextIntent(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasFullTextIntent(child));\n }\n if ('$not' in node && node.$not) {\n return hasFullTextIntent(node.$not);\n }\n\n return false;\n}\n\nexport function buildQueryFilter(query: QueryNode): string {\n function L(s: string) {\n return s;\n }\n\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n const left = `r/emailAddress/address eq ${V}`;\n const right = `r/emailAddress/name eq ${V}`;\n return `${coll}/any(r: ${left} or ${right})`;\n }\n\n function fv(field: string, raw: string | number | boolean | null | undefined): string {\n if (raw == null) return '';\n const rawStr = String(raw);\n\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n return '';\n }\n\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n\n const V = `'${rawStr.toLowerCase().replace(/'/g, \"''\")}'`;\n switch (field) {\n case 'from': {\n if (rawStr.includes('@')) {\n const addrEq = `${L('from/emailAddress/address')} eq ${V}`;\n const nameEq = `${L('from/emailAddress/name')} eq ${V}`;\n return p(`${addrEq} or ${nameEq}`);\n }\n return '';\n }\n case 'to':\n return recip('toRecipients', V);\n case 'cc':\n return recip('ccRecipients', V);\n case 'bcc':\n return recip('bccRecipients', V);\n case 'subject':\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n const systemCategory = mapOutlookCategory(rawStr);\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label':\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n default:\n return '';\n }\n }\n\n function chain(op: 'and' | 'or', arr: Array<string | undefined>) {\n if (!arr || arr.length === 0) {\n throw new Error(`chain: empty array for ${op} operation`);\n }\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return String(first);\n }\n const joined = arr.join(` ${op} `);\n return p(joined);\n }\n\n function fieldExpr(field: string, op: FieldOperator | string): string {\n if (typeof op === 'string') {\n return fv(field, op);\n }\n\n if (Array.isArray(op.$any)) {\n const results = op.$any.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('or', validResults);\n }\n if (Array.isArray(op.$all)) {\n const results = op.$all.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('and', validResults);\n }\n if (Array.isArray(op.$none)) {\n const results = op.$none.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return `not ${p(chain('or', validResults))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: DateOperator): string {\n const parts: string[] = [];\n if (d.$gte) parts.push(`receivedDateTime ge ${d.$gte}T00:00:00Z`);\n if (d.$lt) parts.push(`receivedDateTime lt ${d.$lt}T00:00:00Z`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function emit(n: QueryNode): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && n.$and) {\n const andParts = n.$and.map(emit).filter((part: string): part is string => Boolean(part));\n if (andParts.length === 0) return '';\n if (andParts.length === 1) {\n const firstPart = andParts[0];\n return firstPart ?? '';\n }\n return p(andParts.join(' and '));\n }\n if ('$or' in n && n.$or) {\n const orParts = n.$or.map(emit).filter((part: string): part is string => Boolean(part));\n if (orParts.length === 0) return '';\n if (orParts.length === 1) {\n const firstPart = orParts[0];\n return firstPart ?? '';\n }\n return p(orParts.join(' or '));\n }\n if ('$not' in n && n.$not) {\n const notExpr = emit(n.$not);\n return notExpr ? `not (${notExpr})` : '';\n }\n if ('hasAttachment' in n && n.hasAttachment) return 'hasAttachments eq true';\n if ('date' in n && n.date) return dateExpr(n.date);\n\n const keys = Object.keys(n);\n if (keys.length === 1) {\n const k0 = String(keys[0] ?? '');\n if (k0 && ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'].includes(k0)) {\n const fieldValue = (n as FieldQuery)[k0 as keyof FieldQuery];\n if (fieldValue) return fieldExpr(k0, fieldValue);\n }\n }\n return '';\n }\n\n return emit(query);\n}\nexport function toOutlookFilter(parsed: QueryNode, _options?: { includeBodyContent?: boolean; useCaseInsensitiveWrap?: boolean }) {\n const graphResult = toGraphFilter(parsed);\n const filters = extractOutlookFilters(parsed);\n return {\n filter: graphResult.filter,\n search: graphResult.search,\n requireBodyClientFilter: graphResult.requireBodyClientFilter,\n filters,\n };\n}\n\ninterface ExtractedFilters {\n subjectIncludes: string[];\n bodyIncludes: string[];\n textIncludes: string[];\n fromIncludes: string[];\n toIncludes: string[];\n ccIncludes: string[];\n bccIncludes: string[];\n categoriesIncludes: string[];\n labelIncludes: string[];\n hasAttachment?: boolean;\n since?: string;\n before?: string;\n}\n\nexport function extractOutlookFilters(parsed: QueryNode): ExtractedFilters {\n const filters: ExtractedFilters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n fromIncludes: [],\n toIncludes: [],\n ccIncludes: [],\n bccIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('hasAttachment' in node && node.hasAttachment !== undefined) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node && node.date) {\n if (node.date.$gte) filters.since = node.date.$gte;\n if (node.date.$lt) filters.before = node.date.$lt;\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n filters.subjectIncludes.push(node.subject);\n } else {\n if (node.subject.$any) filters.subjectIncludes.push(...node.subject.$any);\n if (node.subject.$all) filters.subjectIncludes.push(...node.subject.$all);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n filters.bodyIncludes.push(node.body);\n } else {\n if (node.body.$any) filters.bodyIncludes.push(...node.body.$any);\n if (node.body.$all) filters.bodyIncludes.push(...node.body.$all);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n filters.textIncludes.push(node.text);\n filters.bodyIncludes.push(node.text);\n } else {\n if (node.text.$any) {\n filters.textIncludes.push(...node.text.$any);\n filters.bodyIncludes.push(...node.text.$any);\n }\n if (node.text.$all) {\n filters.textIncludes.push(...node.text.$all);\n filters.bodyIncludes.push(...node.text.$all);\n }\n }\n }\n if ('from' in node && node.from) {\n if (typeof node.from === 'string') {\n filters.fromIncludes.push(node.from);\n } else {\n if (node.from.$any) filters.fromIncludes.push(...node.from.$any);\n if (node.from.$all) filters.fromIncludes.push(...node.from.$all);\n }\n }\n if ('to' in node && node.to) {\n if (typeof node.to === 'string') {\n filters.toIncludes.push(node.to);\n } else {\n if (node.to.$any) filters.toIncludes.push(...node.to.$any);\n if (node.to.$all) filters.toIncludes.push(...node.to.$all);\n }\n }\n if ('cc' in node && node.cc) {\n if (typeof node.cc === 'string') {\n filters.ccIncludes.push(node.cc);\n } else {\n if (node.cc.$any) filters.ccIncludes.push(...node.cc.$any);\n if (node.cc.$all) filters.ccIncludes.push(...node.cc.$all);\n }\n }\n if ('bcc' in node && node.bcc) {\n if (typeof node.bcc === 'string') {\n filters.bccIncludes.push(node.bcc);\n } else {\n if (node.bcc.$any) filters.bccIncludes.push(...node.bcc.$any);\n if (node.bcc.$all) filters.bccIncludes.push(...node.bcc.$all);\n }\n }\n if ('categories' in node && node.categories) {\n if (typeof node.categories === 'string') {\n if (mapOutlookCategory(node.categories) !== null) {\n filters.categoriesIncludes.push(node.categories);\n }\n } else {\n // Filter out invalid categories to prevent memory leaks and maintain clean state\n if (node.categories.$any) {\n const validCategories = node.categories.$any.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$all) {\n const validCategories = node.categories.$all.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$none) {\n const validCategories = node.categories.$none.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n }\n }\n if ('label' in node && node.label) {\n if (typeof node.label === 'string') {\n filters.labelIncludes.push(node.label);\n } else {\n if (node.label.$any) filters.labelIncludes.push(...node.label.$any);\n if (node.label.$all) filters.labelIncludes.push(...node.label.$all);\n if (node.label.$none) filters.labelIncludes.push(...node.label.$none);\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["OUTLOOK_CATEGORIES","personal","work","family","travel","important","urgent","mapOutlookCategory","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","toGraphFilter","query","kqlQuery","search","filter","requireBodyClientFilter","hasFullText","hasFullTextIntent","searchCollect","collectSearchTerms","terms","length","usesBody","usesText","filterStr","buildQueryFilter","cleanedFilter","state","usesExact","walkNode","node","$and","forEach","child","$or","$not","exactPhrase","pushExactPhrase","pushOperatorTerms","subject","text","body","value","phrase","String","pushAnyTerms","clause","buildClause","push","Array","isArray","$any","$all","pushAllTerms","$none","clauses","map","term","Boolean","values","val","escapeKQL","replace","_prefix","escaped","shouldQuote","test","some","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","includes","addrEq","nameEq","chain","op","arr","first","joined","fieldExpr","results","v","validResults","JSON","stringify","dateExpr","d","parts","$gte","$lt","emit","n","andParts","part","firstPart","orParts","notExpr","hasAttachment","date","k0","fieldValue","toOutlookFilter","parsed","_options","graphResult","filters","extractOutlookFilters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","walk","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/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 (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":["buildClientPredicate","decodeNextPageToken","encodeNextPageToken","FIRST_PAGE_SKIP_TOKEN","buildQueryFilter","toGraphFilter","searchMessages","graph","opts","graphPlan","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","search","filter","requireBodyClientFilter","hasFullText","pageState","useClientFiltering","Boolean","predicate","requireBody","effectiveIncludeBody","info","hasSearch","hasFilter","undefined","forcedBody","result","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","searchResult","collectClientFilteredPages","startSkipToken","startOffset","offset","mode","capHit","collected","midPageToken","length","fallbackFilter","trim","fallbackResult","params","request","api","top","Math","min","selectFields","select","join","response","get","value","nextLinkUrl","URL","searchParams","nextLink","hasNextPage","currentSkipToken","lastNextSkipToken","pagesFetched","scannedItems","mainLoop","pageTokenUsed","graphPage","pageItems","startIndex","sliced","slice","idx","message","push","nextOffset"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/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 (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":["buildClientPredicate","decodeNextPageToken","encodeNextPageToken","FIRST_PAGE_SKIP_TOKEN","buildQueryFilter","toGraphFilter","searchMessages","graph","opts","graphPlan","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","search","filter","requireBodyClientFilter","hasFullText","pageState","useClientFiltering","Boolean","predicate","requireBody","effectiveIncludeBody","info","hasSearch","hasFilter","undefined","forcedBody","result","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","searchResult","collectClientFilteredPages","startSkipToken","startOffset","offset","mode","capHit","collected","midPageToken","length","fallbackFilter","trim","fallbackResult","params","request","api","top","Math","min","selectFields","select","join","response","get","value","nextLinkUrl","URL","searchParams","nextLink","hasNextPage","currentSkipToken","lastNextSkipToken","pagesFetched","scannedItems","mainLoop","pageTokenUsed","graphPage","pageItems","startIndex","sliced","slice","idx","message","push","nextOffset"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { handleVersionHelp } from './setup/version-help.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export input schemas for documentation visibility\nexport type { Input as CategoriesListInput } from './mcp/tools/categories-list.ts';\nexport { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.ts';\nexport type { Input as LabelsListInput } from './mcp/tools/labels-list.ts';\nexport { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n // createHTTPServer/createStdioServer pull in @mcp-z/server and every mcp/tools/*.ts\n // (@microsoft/microsoft-graph-client included); deferred so a --version/--help run never reaches them.\n const { createHTTPServer } = await import('./setup/http.ts');\n const { createStdioServer } = await import('./setup/stdio.ts');\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags. config.ts's own heavy imports (@mcp-z/oauth-microsoft,\n // @mcp-z/server) are deferred internally, so this static-looking call stays cheap until here.\n const { createConfig } = await import('./setup/config.ts');\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["handleVersionHelp","MS_SCOPE","mcp","inputSchema","categoriesListInputSchema","labelsListInputSchema","schemas","setup","startServer","config","createHTTPServer","createStdioServer","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","createConfig","URL","url","pathname"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,0BAA0B;AAG5D,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AAGtC,SAASC,eAAeC,yBAAyB,QAAQ,iCAAiC;AAE1F,SAASD,eAAeE,qBAAqB,QAAQ,6BAA6B;AAClF,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAE1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,oFAAoF;IACpF,uGAAuG;IACvG,MAAM,EAAEC,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC1C,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC3C,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGJ,OAAOK,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMJ,kBAAkBF,UAAU,MAAMC,iBAAiBD;IAEvHO,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAEV,OAAOK,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBtB,kBAAkBgB,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,qGAAqG;IACrG,8FAA8F;IAC9F,MAAM,EAAEU,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;IACtC,MAAMnB,SAASmB;IACf,MAAMpB,YAAYC;AACpB;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDV;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { handleVersionHelp } from './setup/version-help.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export input schemas for documentation visibility\nexport type { Input as CategoriesListInput } from './mcp/tools/categories-list.ts';\nexport { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.ts';\nexport type { Input as LabelsListInput } from './mcp/tools/labels-list.ts';\nexport { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n // createHTTPServer/createStdioServer pull in @mcp-z/server and every mcp/tools/*.ts\n // (@microsoft/microsoft-graph-client included); deferred so a --version/--help run never reaches them.\n const { createHTTPServer } = await import('./setup/http.ts');\n const { createStdioServer } = await import('./setup/stdio.ts');\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags. config.ts's own heavy imports (@mcp-z/oauth-microsoft,\n // @mcp-z/server) are deferred internally, so this static-looking call stays cheap until here.\n const { createConfig } = await import('./setup/config.ts');\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["handleVersionHelp","MS_SCOPE","mcp","inputSchema","categoriesListInputSchema","labelsListInputSchema","schemas","setup","startServer","config","createHTTPServer","createStdioServer","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","createConfig","URL","url","pathname"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,0BAA0B;AAG5D,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AAGtC,SAASC,eAAeC,yBAAyB,QAAQ,iCAAiC;AAE1F,SAASD,eAAeE,qBAAqB,QAAQ,6BAA6B;AAClF,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAE1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,oFAAoF;IACpF,uGAAuG;IACvG,MAAM,EAAEC,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC1C,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;IAC3C,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGJ,OAAOK,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMJ,kBAAkBF,UAAU,MAAMC,iBAAiBD;IAEvHO,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAEV,OAAOK,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBtB,kBAAkBgB,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,qGAAqG;IACrG,8FAA8F;IAC9F,MAAM,EAAEU,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;IACtC,MAAMnB,SAASmB;IACf,MAAMpB,YAAYC;AACpB;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDV;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\n// keyv-file is a direct dependency so the default file:// URIs resolve; keyv-registry\n// loads adapters with require() rather than depending on any of them itself.\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["keyvRegistry","createStore","uri","store","Error"],"mappings":"AACA,OAAOA,kBAAkB,gBAAgB;AAEzC,sFAAsF;AACtF,6EAA6E;AAE7E,eAAe,eAAeC,YAAeC,GAAW;IACtD,MAAMC,QAAQ,MAAMH,aAAgBE;IACpC,IAAI,CAACC,OAAO,MAAM,IAAIC,MAAM,CAAC,gCAAgC,EAAEF,KAAK;IACpE,OAAOC;AACT"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\n// keyv-file is a direct dependency so the default file:// URIs resolve; keyv-registry\n// loads adapters with require() rather than depending on any of them itself.\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["keyvRegistry","createStore","uri","store","Error"],"mappings":"AACA,OAAOA,kBAAkB,gBAAgB;AAEzC,sFAAsF;AACtF,6EAA6E;AAE7E,eAAe,eAAeC,YAAeC,GAAW;IACtD,MAAMC,QAAQ,MAAMH,aAAgBE;IACpC,IAAI,CAACC,OAAO,MAAM,IAAIC,MAAM,CAAC,gCAAgC,EAAEF,KAAK;IACpE,OAAOC;AACT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\ninterface OutlookRecipient {\n emailAddress?: {\n name?: string;\n address?: string;\n };\n name?: string;\n address?: string;\n}\n\ninterface OutlookMessageBody {\n contentType?: 'text' | 'html';\n content?: string;\n}\n\ninterface OutlookMessage {\n id?: string;\n conversationId?: string;\n toRecipients?: OutlookRecipient[];\n from?: OutlookRecipient;\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n subject?: string;\n bodyPreview?: string;\n body?: OutlookMessageBody;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\n// Type guard for OutlookMessage\nfunction isOutlookMessage(obj: unknown): obj is OutlookMessage {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const msg = obj as Record<string, unknown>;\n\n if (msg.id !== undefined && typeof msg.id !== 'string') return false;\n if (msg.conversationId !== undefined && typeof msg.conversationId !== 'string') return false;\n if (msg.receivedDateTime !== undefined && typeof msg.receivedDateTime !== 'string') return false;\n if (msg.subject !== undefined && typeof msg.subject !== 'string') return false;\n if (msg.bodyPreview !== undefined && typeof msg.bodyPreview !== 'string') return false;\n\n // Check recipient arrays if they exist\n if (msg.toRecipients !== undefined && !Array.isArray(msg.toRecipients)) return false;\n if (msg.ccRecipients !== undefined && !Array.isArray(msg.ccRecipients)) return false;\n if (msg.bccRecipients !== undefined && !Array.isArray(msg.bccRecipients)) return false;\n\n // Check from field if it exists\n if (msg.from !== undefined && (typeof msg.from !== 'object' || msg.from === null)) return false;\n\n // Check body field if it exists\n if (msg.body !== undefined) {\n if (typeof msg.body !== 'object' || msg.body === null) return false;\n const body = msg.body as Record<string, unknown>;\n if (body.contentType !== undefined && !['text', 'html'].includes(String(body.contentType))) return false;\n if (body.content !== undefined && typeof body.content !== 'string') return false;\n }\n\n return true;\n}\n\nfunction formatRecipientList(list: OutlookRecipient[] = [], mode: 'raw' | 'name' | 'email' = 'email'): string {\n if (!Array.isArray(list) || list.length === 0) return '';\n const addresses = list\n .map((r) => ({\n name: r?.emailAddress?.name ?? r?.name ?? '',\n email: r?.emailAddress?.address ?? r?.address ?? '',\n }))\n .filter((x) => x.email);\n return formatAddresses(addresses, mode);\n}\n\n// Result type for the row transformation\ntype MessageRow = [\n string, // id\n string, // provider\n string, // threadId\n string, // to\n string, // from\n string, // cc\n string, // bcc\n string, // date\n string, // subject\n string, // labels\n string, // snippet\n string, // bodyFull\n];\n\nexport function toRowFromOutlook(msg: unknown, opts: FormatOptions = { body: false, addressFormat: 'email' }): MessageRow {\n // Validate input using type guard\n if (!isOutlookMessage(msg)) {\n // Return empty row for invalid input\n return ['', 'outlook', '', '', '', '', '', '', '', '', '', ''];\n }\n\n const id = msg.id ?? '';\n const provider = 'outlook';\n const threadId = msg.conversationId ?? '';\n const fmt = opts.addressFormat || 'email';\n const to = formatRecipientList(msg.toRecipients || [], fmt);\n\n const from = (() => {\n const f = msg.from;\n if (!f) return '';\n const name = f.emailAddress?.name ?? f.name ?? '';\n const addr = f.emailAddress?.address ?? f.address ?? '';\n return formatRecipientList([{ name, address: addr }], fmt);\n })();\n\n const cc = formatRecipientList(msg.ccRecipients || [], fmt);\n const bcc = formatRecipientList(msg.bccRecipients || [], fmt);\n const date = normalizeDateToISO(msg.receivedDateTime) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.bodyPreview ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n const contentType = msg.body.contentType || 'text';\n const content = msg.body.content ?? '';\n bodyFull = contentType === 'text' ? extractCurrentMessageFromText(content) : extractCurrentMessageFromHtmlToText(content);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["extractCurrentMessageFromHtmlToText","extractCurrentMessageFromText","formatAddresses","normalizeDateToISO","isOutlookMessage","obj","msg","id","undefined","conversationId","receivedDateTime","subject","bodyPreview","toRecipients","Array","isArray","ccRecipients","bccRecipients","from","body","contentType","includes","String","content","formatRecipientList","list","mode","length","addresses","map","r","name","emailAddress","email","address","filter","x","toRowFromOutlook","opts","addressFormat","provider","threadId","fmt","to","f","addr","cc","bcc","date","labels","snippet","bodyFull","filterClientSide","filters","snippetOrPreview","fullBody","lower","a","t","toLowerCase","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","c","bc","anyIncludes","val","tokens","some","token","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\ninterface OutlookRecipient {\n emailAddress?: {\n name?: string;\n address?: string;\n };\n name?: string;\n address?: string;\n}\n\ninterface OutlookMessageBody {\n contentType?: 'text' | 'html';\n content?: string;\n}\n\ninterface OutlookMessage {\n id?: string;\n conversationId?: string;\n toRecipients?: OutlookRecipient[];\n from?: OutlookRecipient;\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n subject?: string;\n bodyPreview?: string;\n body?: OutlookMessageBody;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\n// Type guard for OutlookMessage\nfunction isOutlookMessage(obj: unknown): obj is OutlookMessage {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const msg = obj as Record<string, unknown>;\n\n if (msg.id !== undefined && typeof msg.id !== 'string') return false;\n if (msg.conversationId !== undefined && typeof msg.conversationId !== 'string') return false;\n if (msg.receivedDateTime !== undefined && typeof msg.receivedDateTime !== 'string') return false;\n if (msg.subject !== undefined && typeof msg.subject !== 'string') return false;\n if (msg.bodyPreview !== undefined && typeof msg.bodyPreview !== 'string') return false;\n\n // Check recipient arrays if they exist\n if (msg.toRecipients !== undefined && !Array.isArray(msg.toRecipients)) return false;\n if (msg.ccRecipients !== undefined && !Array.isArray(msg.ccRecipients)) return false;\n if (msg.bccRecipients !== undefined && !Array.isArray(msg.bccRecipients)) return false;\n\n // Check from field if it exists\n if (msg.from !== undefined && (typeof msg.from !== 'object' || msg.from === null)) return false;\n\n // Check body field if it exists\n if (msg.body !== undefined) {\n if (typeof msg.body !== 'object' || msg.body === null) return false;\n const body = msg.body as Record<string, unknown>;\n if (body.contentType !== undefined && !['text', 'html'].includes(String(body.contentType))) return false;\n if (body.content !== undefined && typeof body.content !== 'string') return false;\n }\n\n return true;\n}\n\nfunction formatRecipientList(list: OutlookRecipient[] = [], mode: 'raw' | 'name' | 'email' = 'email'): string {\n if (!Array.isArray(list) || list.length === 0) return '';\n const addresses = list\n .map((r) => ({\n name: r?.emailAddress?.name ?? r?.name ?? '',\n email: r?.emailAddress?.address ?? r?.address ?? '',\n }))\n .filter((x) => x.email);\n return formatAddresses(addresses, mode);\n}\n\n// Result type for the row transformation\ntype MessageRow = [\n string, // id\n string, // provider\n string, // threadId\n string, // to\n string, // from\n string, // cc\n string, // bcc\n string, // date\n string, // subject\n string, // labels\n string, // snippet\n string, // bodyFull\n];\n\nexport function toRowFromOutlook(msg: unknown, opts: FormatOptions = { body: false, addressFormat: 'email' }): MessageRow {\n // Validate input using type guard\n if (!isOutlookMessage(msg)) {\n // Return empty row for invalid input\n return ['', 'outlook', '', '', '', '', '', '', '', '', '', ''];\n }\n\n const id = msg.id ?? '';\n const provider = 'outlook';\n const threadId = msg.conversationId ?? '';\n const fmt = opts.addressFormat || 'email';\n const to = formatRecipientList(msg.toRecipients || [], fmt);\n\n const from = (() => {\n const f = msg.from;\n if (!f) return '';\n const name = f.emailAddress?.name ?? f.name ?? '';\n const addr = f.emailAddress?.address ?? f.address ?? '';\n return formatRecipientList([{ name, address: addr }], fmt);\n })();\n\n const cc = formatRecipientList(msg.ccRecipients || [], fmt);\n const bcc = formatRecipientList(msg.bccRecipients || [], fmt);\n const date = normalizeDateToISO(msg.receivedDateTime) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.bodyPreview ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n const contentType = msg.body.contentType || 'text';\n const content = msg.body.content ?? '';\n bodyFull = contentType === 'text' ? extractCurrentMessageFromText(content) : extractCurrentMessageFromHtmlToText(content);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["extractCurrentMessageFromHtmlToText","extractCurrentMessageFromText","formatAddresses","normalizeDateToISO","isOutlookMessage","obj","msg","id","undefined","conversationId","receivedDateTime","subject","bodyPreview","toRecipients","Array","isArray","ccRecipients","bccRecipients","from","body","contentType","includes","String","content","formatRecipientList","list","mode","length","addresses","map","r","name","emailAddress","email","address","filter","x","toRowFromOutlook","opts","addressFormat","provider","threadId","fmt","to","f","addr","cc","bcc","date","labels","snippet","bodyFull","filterClientSide","filters","snippetOrPreview","fullBody","lower","a","t","toLowerCase","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","c","bc","anyIncludes","val","tokens","some","token","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/lib/outlook/index.ts"],"sourcesContent":["export { buildContentForItems, toRowFromOutlook } from '../../email/messages/messages.ts';\nexport { extractEmailsFromRecipients, extractFrom, formatAddressList } from '../../email/parsing/header-parsing.ts';\nexport { fetchOutlookMessage } from '../../email/parsing/message-extraction.ts';\nexport { mapOutlookMessage, type NormalizedAddress, type NormalizedMessage } from '../../email/parsing/message-mapping.ts';\nexport { type ExecuteQueryOptions, executeQuery } from '../../email/querying/execute-query.ts';\nexport { extractOutlookFilters, toGraphFilter, toOutlookFilter } from '../../email/querying/query-builder.ts';\nexport { type OutlookSearchOptions, searchMessages } from '../../email/querying/search-execution.ts';\n"],"names":["buildContentForItems","toRowFromOutlook","extractEmailsFromRecipients","extractFrom","formatAddressList","fetchOutlookMessage","mapOutlookMessage","executeQuery","extractOutlookFilters","toGraphFilter","toOutlookFilter","searchMessages"],"mappings":"AAAA,SAASA,oBAAoB,EAAEC,gBAAgB,QAAQ,mCAAmC;AAC1F,SAASC,2BAA2B,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,wCAAwC;AACpH,SAASC,mBAAmB,QAAQ,4CAA4C;AAChF,SAASC,iBAAiB,QAAwD,yCAAyC;AAC3H,SAAmCC,YAAY,QAAQ,wCAAwC;AAC/F,SAASC,qBAAqB,EAAEC,aAAa,EAAEC,eAAe,QAAQ,wCAAwC;AAC9G,SAAoCC,cAAc,QAAQ,2CAA2C"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/lib/outlook/index.ts"],"sourcesContent":["export { buildContentForItems, toRowFromOutlook } from '../../email/messages/messages.ts';\nexport { extractEmailsFromRecipients, extractFrom, formatAddressList } from '../../email/parsing/header-parsing.ts';\nexport { fetchOutlookMessage } from '../../email/parsing/message-extraction.ts';\nexport { mapOutlookMessage, type NormalizedAddress, type NormalizedMessage } from '../../email/parsing/message-mapping.ts';\nexport { type ExecuteQueryOptions, executeQuery } from '../../email/querying/execute-query.ts';\nexport { extractOutlookFilters, toGraphFilter, toOutlookFilter } from '../../email/querying/query-builder.ts';\nexport { type OutlookSearchOptions, searchMessages } from '../../email/querying/search-execution.ts';\n"],"names":["buildContentForItems","toRowFromOutlook","extractEmailsFromRecipients","extractFrom","formatAddressList","fetchOutlookMessage","mapOutlookMessage","executeQuery","extractOutlookFilters","toGraphFilter","toOutlookFilter","searchMessages"],"mappings":"AAAA,SAASA,oBAAoB,EAAEC,gBAAgB,QAAQ,mCAAmC;AAC1F,SAASC,2BAA2B,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,wCAAwC;AACpH,SAASC,mBAAmB,QAAQ,4CAA4C;AAChF,SAASC,iBAAiB,QAAwD,yCAAyC;AAC3H,SAAmCC,YAAY,QAAQ,wCAAwC;AAC/F,SAASC,qBAAqB,EAAEC,aAAa,EAAEC,eAAe,QAAQ,wCAAwC;AAC9G,SAAoCC,cAAc,QAAQ,2CAA2C"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/lib/outlook/types.ts"],"sourcesContent":["// Strict type for Outlook message structure used in mapping and row conversion\nexport interface OutlookRecipient {\n emailAddress?: {\n address?: string;\n name?: string;\n };\n}\n\nexport interface OutlookMessage {\n id?: string;\n conversationId?: string;\n subject?: string;\n from?: OutlookRecipient;\n toRecipients?: OutlookRecipient[];\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n categories?: string[];\n bodyPreview?: string;\n body?: {\n content?: string;\n contentType?: string;\n };\n}\n"],"names":[],"mappings":"AAAA,+EAA+E;AAQ/E,WAeC"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/lib/outlook/types.ts"],"sourcesContent":["// Strict type for Outlook message structure used in mapping and row conversion\nexport interface OutlookRecipient {\n emailAddress?: {\n address?: string;\n name?: string;\n };\n}\n\nexport interface OutlookMessage {\n id?: string;\n conversationId?: string;\n subject?: string;\n from?: OutlookRecipient;\n toRecipients?: OutlookRecipient[];\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n categories?: string[];\n bodyPreview?: string;\n body?: {\n content?: string;\n contentType?: string;\n };\n}\n"],"names":[],"mappings":"AAAA,+EAA+E;AAQ/E,WAeC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":"AAAA,kCAAiC,qBAAqB;AAAtD,SAAO,oBAAKA,eAAe,GAA2B;AACtD,oCAAmC,uBAAuB;AAA1D,SAAO,sBAAKC,iBAAiB,GAA6B;AAC1D,gCAA+B,mBAAmB;AAAlD,SAAO,kBAAKC,aAAa,GAAyB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":"AAAA,kCAAiC,qBAAqB;AAAtD,SAAO,oBAAKA,eAAe,GAA2B;AACtD,oCAAmC,uBAAuB;AAA1D,SAAO,sBAAKC,iBAAiB,GAA6B;AAC1D,gCAA+B,mBAAmB;AAAlD,SAAO,kBAAKC,aAAa,GAAyB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule, ServerContext } from '@mcp-z/server';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: ServerContext) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["z","createPrompt","argsSchema","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":"AACA,SAASA,CAAC,QAAQ,MAAM;AAExB,eAAe,SAASC;IACtB,MAAMC,aAAaF,EAAEG,MAAM,CAAC;QAC1BC,SAASJ,EAAEK,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMR,EAAEK,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,MAAMG,SAAS;QACbC,aAAa;QACbT,YAAYA,WAAWU,KAAK;IAC9B;IAEA,MAAMC,UAAU,OAAOC,MAAgCC;QACrD,MAAM,EAAEX,OAAO,EAAEI,IAAI,EAAE,GAAGN,WAAWc,KAAK,CAACF;QAC3C,OAAO;YACLG,UAAU;gBACR;oBAAEC,MAAM;oBAAmBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM;oBAAqC;gBAAE;gBAC1G;oBAAEH,MAAM;oBAAiBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM,CAAC,QAAQ,EAAEb,QAAQ,eAAe,WAAW,EAAEJ,SAAS;oBAAC;gBAAE;aAC7H;QACH;IACF;IAEA,OAAO;QACLkB,MAAM;QACNZ;QACAG;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule, ServerContext } from '@mcp-z/server';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: ServerContext) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["z","createPrompt","argsSchema","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":"AACA,SAASA,CAAC,QAAQ,MAAM;AAExB,eAAe,SAASC;IACtB,MAAMC,aAAaF,EAAEG,MAAM,CAAC;QAC1BC,SAASJ,EAAEK,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMR,EAAEK,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,MAAMG,SAAS;QACbC,aAAa;QACbT,YAAYA,WAAWU,KAAK;IAC9B;IAEA,MAAMC,UAAU,OAAOC,MAAgCC;QACrD,MAAM,EAAEX,OAAO,EAAEI,IAAI,EAAE,GAAGN,WAAWc,KAAK,CAACF;QAC3C,OAAO;YACLG,UAAU;gBACR;oBAAEC,MAAM;oBAAmBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM;oBAAqC;gBAAE;gBAC1G;oBAAEH,MAAM;oBAAiBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM,CAAC,QAAQ,EAAEb,QAAQ,eAAe,WAAW,EAAEJ,SAAS;oBAAC;gBAAE;aAC7H;QACH;IACF;IAEA,OAAO;QACLkB,MAAM;QACNZ;QACAG;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.ts';\nexport { default as querySyntax } from './query-syntax.ts';\n"],"names":["default","draftEmail","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,UAAU,QAAQ,mBAAmB;AACzD,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.ts';\nexport { default as querySyntax } from './query-syntax.ts';\n"],"names":["default","draftEmail","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,UAAU,QAAQ,mBAAmB;AACzD,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule, ServerContext } from '@mcp-z/server';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Outlook query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: ServerContext) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Outlook Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`exactPhrase\\`: Strict exact phrase matching (KQL); wrap the phrase in quotes to keep the words together.\n\n## Search Semantics\n- Including fields such as subject, text, body, exactPhrase, or kqlQuery runs a Microsoft Graph $search. The structured filters (from, to, cc, bcc, categories, label, hasAttachment, etc.) are then applied client-side after the matching messages arrive, so those rules run once the search hits are returned.\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Outlook-Specific\n- \\`categories\\`: work, personal, family, travel, important, urgent\n- \\`label\\`: User categories (case-sensitive, use outlook-categories-list to discover)\n- \\`importance\\`: high, normal, low\n- \\`kqlQuery\\`: Escape hatch for advanced KQL syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// High importance with attachment\n{ \"importance\": \"high\", \"hasAttachment\": true }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: work OR important category, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"work\", \"important\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAEA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAuDb,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule, ServerContext } from '@mcp-z/server';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Outlook query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: ServerContext) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Outlook Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`exactPhrase\\`: Strict exact phrase matching (KQL); wrap the phrase in quotes to keep the words together.\n\n## Search Semantics\n- Including fields such as subject, text, body, exactPhrase, or kqlQuery runs a Microsoft Graph $search. The structured filters (from, to, cc, bcc, categories, label, hasAttachment, etc.) are then applied client-side after the matching messages arrive, so those rules run once the search hits are returned.\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Outlook-Specific\n- \\`categories\\`: work, personal, family, travel, important, urgent\n- \\`label\\`: User categories (case-sensitive, use outlook-categories-list to discover)\n- \\`importance\\`: high, normal, low\n- \\`kqlQuery\\`: Escape hatch for advanced KQL syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// High importance with attachment\n{ \"importance\": \"high\", \"hasAttachment\": true }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: work OR important category, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"work\", \"important\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAEA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAuDb,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/resources/email.ts"],"sourcesContent":["import { normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport type { ReadResourceResult, ResourceConfig, ResourceModule, ServerContext } from '@mcp-z/server';\nimport { ResourceTemplate } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\n\nexport default function createResource() {\n const template = new ResourceTemplate('outlook://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Outlook message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: ServerContext): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'outlook-email resource fetch');\n\n const graph = Client.initWithMiddleware({ authProvider: authContext.auth });\n const message = (await graph.api(`/me/messages/${encodeURIComponent(variables.id)}`).get()) as MicrosoftGraph.Message;\n\n // Build message data\n const toAddresses = message.toRecipients?.map((r) => r.emailAddress?.address).filter(Boolean);\n const toStr = toAddresses && toAddresses.length > 0 ? toAddresses.join(', ') : '';\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: message.id ?? variables.id,\n subject: message.subject ?? '',\n from: message.from?.emailAddress?.address ?? '',\n to: toStr,\n date: toIsoUtc(message.receivedDateTime) || message.receivedDateTime || '',\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'outlook-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["normalizeDateToISO","toIsoUtc","ResourceTemplate","Client","createResource","template","list","undefined","config","description","mimeType","handler","uri","variables","extra","message","logger","authContext","info","graph","initWithMiddleware","authProvider","auth","api","encodeURIComponent","id","get","toAddresses","toRecipients","map","r","emailAddress","address","filter","Boolean","toStr","length","join","metadata","subject","from","to","date","receivedDateTime","contents","href","text","JSON","stringify","e","error","String","name"],"mappings":"AAAA,SAASA,sBAAsBC,QAAQ,QAAQ,eAAe;AAG9D,SAASC,gBAAgB,QAAQ,gBAAgB;AACjD,SAASC,MAAM,QAAQ,oCAAoC;AAG3D,eAAe,SAASC;IACtB,MAAMC,WAAW,IAAIH,iBAAiB,2BAA2B;QAC/DI,MAAMC;IACR;IACA,MAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,MAAMC,UAAU,OAAOC,KAAUC,WAA2BC;QAC1D,IAAI;gBAcIC,aACKA;gBANSA,uBAOZA,4BAAAA;YAfR,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAE,GAAGH;YAEhCE,OAAOE,IAAI,CAACL,WAAW;YAEvB,MAAMM,QAAQhB,OAAOiB,kBAAkB,CAAC;gBAAEC,cAAcJ,YAAYK,IAAI;YAAC;YACzE,MAAMP,UAAW,MAAMI,MAAMI,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmBX,UAAUY,EAAE,GAAG,EAAEC,GAAG;YAExF,qBAAqB;YACrB,MAAMC,eAAcZ,wBAAAA,QAAQa,YAAY,cAApBb,4CAAAA,sBAAsBc,GAAG,CAAC,CAACC;oBAAMA;wBAAAA,kBAAAA,EAAEC,YAAY,cAAdD,sCAAAA,gBAAgBE,OAAO;eAAEC,MAAM,CAACC;YACrF,MAAMC,QAAQR,eAAeA,YAAYS,MAAM,GAAG,IAAIT,YAAYU,IAAI,CAAC,QAAQ;YAE/E,qDAAqD;YACrD,MAAMC,WAAW;gBACfb,EAAE,GAAEV,cAAAA,QAAQU,EAAE,cAAVV,yBAAAA,cAAcF,UAAUY,EAAE;gBAC9Bc,OAAO,GAAExB,mBAAAA,QAAQwB,OAAO,cAAfxB,8BAAAA,mBAAmB;gBAC5ByB,IAAI,WAAEzB,gBAAAA,QAAQyB,IAAI,cAAZzB,qCAAAA,6BAAAA,cAAcgB,YAAY,cAA1BhB,iDAAAA,2BAA4BiB,OAAO,uCAAI;gBAC7CS,IAAIN;gBACJO,MAAMzC,SAASc,QAAQ4B,gBAAgB,KAAK5B,QAAQ4B,gBAAgB,IAAI;YAC1E;YAEA,OAAO;gBACLC,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAACV;oBACvB;iBACD;YACH;QACF,EAAE,OAAOW,GAAG;;YACV,MAAM,EAAEjC,MAAM,EAAE,GAAGF;YACnBE,OAAOkC,KAAK,CAACD,GAA8B;YAC3C,MAAMC,QAAQD;YACd,OAAO;gBACLL,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAAC;4BAAEE,OAAOC,gBAAOD,kBAAAA,4BAAAA,MAAOnC,OAAO,yCAAIkC;wBAAG;oBAC5D;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLG,MAAM;QACN/C;QACAG;QACAG;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/resources/email.ts"],"sourcesContent":["import { normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport type { ReadResourceResult, ResourceConfig, ResourceModule, ServerContext } from '@mcp-z/server';\nimport { ResourceTemplate } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\n\nexport default function createResource() {\n const template = new ResourceTemplate('outlook://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Outlook message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: ServerContext): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'outlook-email resource fetch');\n\n const graph = Client.initWithMiddleware({ authProvider: authContext.auth });\n const message = (await graph.api(`/me/messages/${encodeURIComponent(variables.id)}`).get()) as MicrosoftGraph.Message;\n\n // Build message data\n const toAddresses = message.toRecipients?.map((r) => r.emailAddress?.address).filter(Boolean);\n const toStr = toAddresses && toAddresses.length > 0 ? toAddresses.join(', ') : '';\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: message.id ?? variables.id,\n subject: message.subject ?? '',\n from: message.from?.emailAddress?.address ?? '',\n to: toStr,\n date: toIsoUtc(message.receivedDateTime) || message.receivedDateTime || '',\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'outlook-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["normalizeDateToISO","toIsoUtc","ResourceTemplate","Client","createResource","template","list","undefined","config","description","mimeType","handler","uri","variables","extra","message","logger","authContext","info","graph","initWithMiddleware","authProvider","auth","api","encodeURIComponent","id","get","toAddresses","toRecipients","map","r","emailAddress","address","filter","Boolean","toStr","length","join","metadata","subject","from","to","date","receivedDateTime","contents","href","text","JSON","stringify","e","error","String","name"],"mappings":"AAAA,SAASA,sBAAsBC,QAAQ,QAAQ,eAAe;AAG9D,SAASC,gBAAgB,QAAQ,gBAAgB;AACjD,SAASC,MAAM,QAAQ,oCAAoC;AAG3D,eAAe,SAASC;IACtB,MAAMC,WAAW,IAAIH,iBAAiB,2BAA2B;QAC/DI,MAAMC;IACR;IACA,MAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,MAAMC,UAAU,OAAOC,KAAUC,WAA2BC;QAC1D,IAAI;gBAcIC,aACKA;gBANSA,uBAOZA,4BAAAA;YAfR,MAAM,EAAEC,MAAM,EAAEC,WAAW,EAAE,GAAGH;YAEhCE,OAAOE,IAAI,CAACL,WAAW;YAEvB,MAAMM,QAAQhB,OAAOiB,kBAAkB,CAAC;gBAAEC,cAAcJ,YAAYK,IAAI;YAAC;YACzE,MAAMP,UAAW,MAAMI,MAAMI,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmBX,UAAUY,EAAE,GAAG,EAAEC,GAAG;YAExF,qBAAqB;YACrB,MAAMC,eAAcZ,wBAAAA,QAAQa,YAAY,cAApBb,4CAAAA,sBAAsBc,GAAG,CAAC,CAACC;oBAAMA;wBAAAA,kBAAAA,EAAEC,YAAY,cAAdD,sCAAAA,gBAAgBE,OAAO;eAAEC,MAAM,CAACC;YACrF,MAAMC,QAAQR,eAAeA,YAAYS,MAAM,GAAG,IAAIT,YAAYU,IAAI,CAAC,QAAQ;YAE/E,qDAAqD;YACrD,MAAMC,WAAW;gBACfb,EAAE,GAAEV,cAAAA,QAAQU,EAAE,cAAVV,yBAAAA,cAAcF,UAAUY,EAAE;gBAC9Bc,OAAO,GAAExB,mBAAAA,QAAQwB,OAAO,cAAfxB,8BAAAA,mBAAmB;gBAC5ByB,IAAI,WAAEzB,gBAAAA,QAAQyB,IAAI,cAAZzB,qCAAAA,6BAAAA,cAAcgB,YAAY,cAA1BhB,iDAAAA,2BAA4BiB,OAAO,uCAAI;gBAC7CS,IAAIN;gBACJO,MAAMzC,SAASc,QAAQ4B,gBAAgB,KAAK5B,QAAQ4B,gBAAgB,IAAI;YAC1E;YAEA,OAAO;gBACLC,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAACV;oBACvB;iBACD;YACH;QACF,EAAE,OAAOW,GAAG;;YACV,MAAM,EAAEjC,MAAM,EAAE,GAAGF;YACnBE,OAAOkC,KAAK,CAACD,GAA8B;YAC3C,MAAMC,QAAQD;YACd,OAAO;gBACLL,UAAU;oBACR;wBACEhC,KAAKA,IAAIiC,IAAI;wBACbnC,UAAU;wBACVoC,MAAMC,KAAKC,SAAS,CAAC;4BAAEE,OAAOC,gBAAOD,kBAAAA,4BAAAA,MAAOnC,OAAO,yCAAIkC;wBAAG;oBAC5D;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLG,MAAM;QACN/C;QACAG;QACAG;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/resources/index.ts"],"sourcesContent":["export { default as email } from './email.ts';\n"],"names":["default","email"],"mappings":"AAAA,SAASA,WAAWC,KAAK,QAAQ,aAAa"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/resources/index.ts"],"sourcesContent":["export { default as email } from './email.ts';\n"],"names":["default","email"],"mappings":"AAAA,SAASA,WAAWC,KAAK,QAAQ,aAAa"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { type CallToolResult, ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\n/**\n * Input schema for the categories-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories with colors and names.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the categories-list tool\n *\n * Represents the input parameters for listing Outlook categories.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.categories.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.categories.list returning', { categoriesCount: categories.length });\n logger.info('outlook.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\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.categories.list error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ProtocolError","ProtocolErrorCode","Client","z","OutlookCategorySchema","inputSchema","object","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","response","api","get","categories","Array","isArray","value","durationMs","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAA8BE,aAAa,EAAEC,iBAAiB,QAAQ,gBAAgB;AACtF,SAASC,MAAM,QAAQ,oCAAoC;AAE3D,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D;;;;CAIC,GACD,OAAO,MAAMC,cAAcF,EAAEG,MAAM,CAAC,CAAC,GAAG;AAExC,wBAAwB;AACxB,MAAMC,sBAAsBJ,EAAEG,MAAM,CAAC;IACnCE,MAAML,EAAEM,OAAO,CAAC;IAChBC,OAAOP,EAAEQ,KAAK,CAACP;AACjB;AAEA,2CAA2C;AAC3C,MAAMQ,eAAeT,EAAEU,kBAAkB,CAAC,QAAQ;IAACN;IAAqBR;CAAyB;AAEjG,MAAMe,SAAS;IACbC,aAAa;IACbV,aAAaA;IACbO,cAAcT,EAAEG,MAAM,CAAC;QACrBU,QAAQJ;IACV;AACF;AAUA,eAAeK,QAAQC,CAAQ,EAAEC,KAAoB;IACnD,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,QAAQpB,OAAOqB,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMC,UAAUC,KAAKC,GAAG;QAExB,oDAAoD;QACpD,MAAMC,WAAW,MAAMR,MAAMS,GAAG,CAAC,gCAAgCC,GAAG;QACpE,MAAMC,aAAaC,MAAMC,OAAO,CAACL,SAASM,KAAK,IAAIN,SAASM,KAAK,GAAG,EAAE;QAEtE,MAAMC,aAAaT,KAAKC,GAAG,KAAKF;QAChCP,OAAOC,IAAI,CAAC,qCAAqC;YAAEiB,iBAAiBL,WAAWM,MAAM;QAAC;QACtFnB,OAAOC,IAAI,CAAC,mCAAmC;YAAEgB;QAAW;QAE5D,MAAMrB,SAAiB;YACrBR,MAAM;YACNE,OAAOuB,WAAWO,GAAG,CAAC,CAACC,WAA8C,CAAA;oBACnEC,IAAID,SAASC,EAAE,IAAIC;oBACnBC,aAAaH,SAASG,WAAW,IAAID;oBACrCE,OAAOJ,SAASI,KAAK,IAAIF;gBAC3B,CAAA;QACF;QAEA,OAAO;YACLG,SAAS;gBACP;oBACEtC,MAAM;oBACNuC,MAAMC,KAAKC,SAAS,CAACjC;gBACvB;aACD;YACDkC,mBAAmB;gBAAElC;YAAO;QAC9B;IACF,EAAE,OAAOmC,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChE/B,OAAO+B,KAAK,CAAC,iCAAiC;YAAEA,OAAOC;QAAQ;QAE/D,MAAM,IAAIpD,cAAcC,kBAAkBsD,aAAa,EAAE,CAAC,0BAA0B,EAAEH,SAAS,EAAE;YAC/FI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGb;QAChD;IACF;AACF;AAEA,eAAe,SAASc;IACtB,OAAO;QACLC,MAAM;QACN5C;QACAG;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { type CallToolResult, ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\n/**\n * Input schema for the categories-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories with colors and names.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the categories-list tool\n *\n * Represents the input parameters for listing Outlook categories.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.categories.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.categories.list returning', { categoriesCount: categories.length });\n logger.info('outlook.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\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.categories.list error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ProtocolError","ProtocolErrorCode","Client","z","OutlookCategorySchema","inputSchema","object","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","response","api","get","categories","Array","isArray","value","durationMs","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAA8BE,aAAa,EAAEC,iBAAiB,QAAQ,gBAAgB;AACtF,SAASC,MAAM,QAAQ,oCAAoC;AAE3D,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D;;;;CAIC,GACD,OAAO,MAAMC,cAAcF,EAAEG,MAAM,CAAC,CAAC,GAAG;AAExC,wBAAwB;AACxB,MAAMC,sBAAsBJ,EAAEG,MAAM,CAAC;IACnCE,MAAML,EAAEM,OAAO,CAAC;IAChBC,OAAOP,EAAEQ,KAAK,CAACP;AACjB;AAEA,2CAA2C;AAC3C,MAAMQ,eAAeT,EAAEU,kBAAkB,CAAC,QAAQ;IAACN;IAAqBR;CAAyB;AAEjG,MAAMe,SAAS;IACbC,aAAa;IACbV,aAAaA;IACbO,cAAcT,EAAEG,MAAM,CAAC;QACrBU,QAAQJ;IACV;AACF;AAUA,eAAeK,QAAQC,CAAQ,EAAEC,KAAoB;IACnD,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,QAAQpB,OAAOqB,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMC,UAAUC,KAAKC,GAAG;QAExB,oDAAoD;QACpD,MAAMC,WAAW,MAAMR,MAAMS,GAAG,CAAC,gCAAgCC,GAAG;QACpE,MAAMC,aAAaC,MAAMC,OAAO,CAACL,SAASM,KAAK,IAAIN,SAASM,KAAK,GAAG,EAAE;QAEtE,MAAMC,aAAaT,KAAKC,GAAG,KAAKF;QAChCP,OAAOC,IAAI,CAAC,qCAAqC;YAAEiB,iBAAiBL,WAAWM,MAAM;QAAC;QACtFnB,OAAOC,IAAI,CAAC,mCAAmC;YAAEgB;QAAW;QAE5D,MAAMrB,SAAiB;YACrBR,MAAM;YACNE,OAAOuB,WAAWO,GAAG,CAAC,CAACC,WAA8C,CAAA;oBACnEC,IAAID,SAASC,EAAE,IAAIC;oBACnBC,aAAaH,SAASG,WAAW,IAAID;oBACrCE,OAAOJ,SAASI,KAAK,IAAIF;gBAC3B,CAAA;QACF;QAEA,OAAO;YACLG,SAAS;gBACP;oBACEtC,MAAM;oBACNuC,MAAMC,KAAKC,SAAS,CAACjC;gBACvB;aACD;YACDkC,mBAAmB;gBAAElC;YAAO;QAC9B;IACF,EAAE,OAAOmC,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChE/B,OAAO+B,KAAK,CAAC,iCAAiC;YAAEA,OAAOC;QAAQ;QAE/D,MAAM,IAAIpD,cAAcC,kBAAkBsD,aAAa,EAAE,CAAC,0BAA0B,EAAEH,SAAS,EAAE;YAC/FI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGb;QAChD;IACF;AACF;AAEA,eAAe,SAASc;IACtB,OAAO;QACLC,MAAM;QACN5C;QACAG;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/tools/index.ts"],"sourcesContent":["export { default as categoriesList } from './categories-list.ts';\nexport { default as labelAdd } from './label-add.ts';\nexport { default as labelDelete } from './label-delete.ts';\nexport { default as labelsList } from './labels-list.ts';\nexport { default as messageGet } from './message-get.ts';\nexport { default as messageMarkRead } from './message-mark-read.ts';\nexport { default as messageMoveToTrash } from './message-move-to-trash.ts';\nexport { default as messageRespond } from './message-respond.ts';\nexport { default as messageSearch } from './message-search.ts';\nexport { default as messageSend } from './message-send.ts';\nexport { default as messagesExportCsv } from './messages-export-csv.ts';\n"],"names":["default","categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":"AAAA,SAASA,WAAWC,cAAc,QAAQ,uBAAuB;AACjE,SAASD,WAAWE,QAAQ,QAAQ,iBAAiB;AACrD,SAASF,WAAWG,WAAW,QAAQ,oBAAoB;AAC3D,SAASH,WAAWI,UAAU,QAAQ,mBAAmB;AACzD,SAASJ,WAAWK,UAAU,QAAQ,mBAAmB;AACzD,SAASL,WAAWM,eAAe,QAAQ,yBAAyB;AACpE,SAASN,WAAWO,kBAAkB,QAAQ,6BAA6B;AAC3E,SAASP,WAAWQ,cAAc,QAAQ,uBAAuB;AACjE,SAASR,WAAWS,aAAa,QAAQ,sBAAsB;AAC/D,SAAST,WAAWU,WAAW,QAAQ,oBAAoB;AAC3D,SAASV,WAAWW,iBAAiB,QAAQ,2BAA2B"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/index.ts"],"sourcesContent":["export { default as categoriesList } from './categories-list.ts';\nexport { default as labelAdd } from './label-add.ts';\nexport { default as labelDelete } from './label-delete.ts';\nexport { default as labelsList } from './labels-list.ts';\nexport { default as messageGet } from './message-get.ts';\nexport { default as messageMarkRead } from './message-mark-read.ts';\nexport { default as messageMoveToTrash } from './message-move-to-trash.ts';\nexport { default as messageRespond } from './message-respond.ts';\nexport { default as messageSearch } from './message-search.ts';\nexport { default as messageSend } from './message-send.ts';\nexport { default as messagesExportCsv } from './messages-export-csv.ts';\n"],"names":["default","categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":"AAAA,SAASA,WAAWC,cAAc,QAAQ,uBAAuB;AACjE,SAASD,WAAWE,QAAQ,QAAQ,iBAAiB;AACrD,SAASF,WAAWG,WAAW,QAAQ,oBAAoB;AAC3D,SAASH,WAAWI,UAAU,QAAQ,mBAAmB;AACzD,SAASJ,WAAWK,UAAU,QAAQ,mBAAmB;AACzD,SAASL,WAAWM,eAAe,QAAQ,yBAAyB;AACpE,SAASN,WAAWO,kBAAkB,QAAQ,6BAA6B;AAC3E,SAASP,WAAWQ,cAAc,QAAQ,uBAAuB;AACjE,SAASR,WAAWS,aAAa,QAAQ,sBAAsB;AAC/D,SAAST,WAAWU,WAAW,QAAQ,oBAAoB;AAC3D,SAASV,WAAWW,iBAAiB,QAAQ,2BAA2B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/tools/label-add.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { type CallToolResult, ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport { z } from 'zod';\n\nconst LabelResultSchema = z.object({\n id: z.string().describe('Message ID the categories were added to'),\n labels: z.array(z.string()).optional().describe('Categories that were applied'),\n});\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to add categories to'),\n labels: z.array(z.coerce.string().trim()).min(1).describe('Category names to add (use outlook-categories-list to discover available categories)'),\n});\n\n// Success branch schema\nconst successBranchSchema = LabelResultSchema.extend({\n type: z.literal('success'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add a label/category or move message to a folder in Outlook',\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({ id, labels }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.label.add called', { id, labels });\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n await graph\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .header('Content-Type', 'application/json')\n .patch({ categories: labels });\n\n const result: Output = {\n type: 'success' as const,\n id,\n labels,\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.label.add error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error adding label: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-add',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ProtocolError","ProtocolErrorCode","Client","z","LabelResultSchema","object","id","string","describe","labels","array","optional","inputSchema","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","header","patch","categories","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAA8BE,aAAa,EAAEC,iBAAiB,QAAQ,gBAAgB;AACtF,SAASC,MAAM,QAAQ,oCAAoC;AAC3D,SAASC,CAAC,QAAQ,MAAM;AAExB,MAAMC,oBAAoBD,EAAEE,MAAM,CAAC;IACjCC,IAAIH,EAAEI,MAAM,GAAGC,QAAQ,CAAC;IACxBC,QAAQN,EAAEO,KAAK,CAACP,EAAEI,MAAM,IAAII,QAAQ,GAAGH,QAAQ,CAAC;AAClD;AAEA,MAAMI,cAAcT,EAAEE,MAAM,CAAC;IAC3BC,IAAIH,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,GAAGC,GAAG,CAAC,GAAGP,QAAQ,CAAC;IAC7CC,QAAQN,EAAEO,KAAK,CAACP,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,IAAIC,GAAG,CAAC,GAAGP,QAAQ,CAAC;AAC5D;AAEA,wBAAwB;AACxB,MAAMQ,sBAAsBZ,kBAAkBa,MAAM,CAAC;IACnDC,MAAMf,EAAEgB,OAAO,CAAC;AAClB;AAEA,2CAA2C;AAC3C,MAAMC,eAAejB,EAAEkB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBjB;CAAyB;AAEjG,MAAMuB,SAAS;IACbC,aAAa;IACbX,aAAaA;IACbQ,cAAcjB,EAAEE,MAAM,CAAC;QACrBmB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEnB,EAAE,EAAEG,MAAM,EAAS,EAAEiB,KAAoB;IAChE,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC,4BAA4B;QAAEtB;QAAIG;IAAO;IAErD,IAAI;QACF,MAAMoB,QAAQ3B,OAAO4B,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMJ,MACHK,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmB7B,KAAK,EAC5C8B,MAAM,CAAC,gBAAgB,oBACvBC,KAAK,CAAC;YAAEC,YAAY7B;QAAO;QAE9B,MAAMe,SAAiB;YACrBN,MAAM;YACNZ;YACAG;QACF;QAEA,OAAO;YACL8B,SAAS;gBACP;oBACErB,MAAM;oBACNsB,MAAMC,KAAKC,SAAS,CAAClB;gBACvB;aACD;YACDmB,mBAAmB;gBAAEnB;YAAO;QAC9B;IACF,EAAE,OAAOoB,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChEjB,OAAOiB,KAAK,CAAC,2BAA2B;YAAEA,OAAOC;QAAQ;QAEzD,MAAM,IAAI7C,cAAcC,kBAAkB+C,aAAa,EAAE,CAAC,oBAAoB,EAAEH,SAAS,EAAE;YACzFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACN9B;QACAG;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/label-add.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { type CallToolResult, ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport { z } from 'zod';\n\nconst LabelResultSchema = z.object({\n id: z.string().describe('Message ID the categories were added to'),\n labels: z.array(z.string()).optional().describe('Categories that were applied'),\n});\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to add categories to'),\n labels: z.array(z.coerce.string().trim()).min(1).describe('Category names to add (use outlook-categories-list to discover available categories)'),\n});\n\n// Success branch schema\nconst successBranchSchema = LabelResultSchema.extend({\n type: z.literal('success'),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add a label/category or move message to a folder in Outlook',\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({ id, labels }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.label.add called', { id, labels });\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n await graph\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .header('Content-Type', 'application/json')\n .patch({ categories: labels });\n\n const result: Output = {\n type: 'success' as const,\n id,\n labels,\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.label.add error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error adding label: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-add',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ProtocolError","ProtocolErrorCode","Client","z","LabelResultSchema","object","id","string","describe","labels","array","optional","inputSchema","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","header","patch","categories","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAA8BE,aAAa,EAAEC,iBAAiB,QAAQ,gBAAgB;AACtF,SAASC,MAAM,QAAQ,oCAAoC;AAC3D,SAASC,CAAC,QAAQ,MAAM;AAExB,MAAMC,oBAAoBD,EAAEE,MAAM,CAAC;IACjCC,IAAIH,EAAEI,MAAM,GAAGC,QAAQ,CAAC;IACxBC,QAAQN,EAAEO,KAAK,CAACP,EAAEI,MAAM,IAAII,QAAQ,GAAGH,QAAQ,CAAC;AAClD;AAEA,MAAMI,cAAcT,EAAEE,MAAM,CAAC;IAC3BC,IAAIH,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,GAAGC,GAAG,CAAC,GAAGP,QAAQ,CAAC;IAC7CC,QAAQN,EAAEO,KAAK,CAACP,EAAEU,MAAM,CAACN,MAAM,GAAGO,IAAI,IAAIC,GAAG,CAAC,GAAGP,QAAQ,CAAC;AAC5D;AAEA,wBAAwB;AACxB,MAAMQ,sBAAsBZ,kBAAkBa,MAAM,CAAC;IACnDC,MAAMf,EAAEgB,OAAO,CAAC;AAClB;AAEA,2CAA2C;AAC3C,MAAMC,eAAejB,EAAEkB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBjB;CAAyB;AAEjG,MAAMuB,SAAS;IACbC,aAAa;IACbX,aAAaA;IACbQ,cAAcjB,EAAEE,MAAM,CAAC;QACrBmB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEnB,EAAE,EAAEG,MAAM,EAAS,EAAEiB,KAAoB;IAChE,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC,4BAA4B;QAAEtB;QAAIG;IAAO;IAErD,IAAI;QACF,MAAMoB,QAAQ3B,OAAO4B,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMJ,MACHK,GAAG,CAAC,CAAC,aAAa,EAAEC,mBAAmB7B,KAAK,EAC5C8B,MAAM,CAAC,gBAAgB,oBACvBC,KAAK,CAAC;YAAEC,YAAY7B;QAAO;QAE9B,MAAMe,SAAiB;YACrBN,MAAM;YACNZ;YACAG;QACF;QAEA,OAAO;YACL8B,SAAS;gBACP;oBACErB,MAAM;oBACNsB,MAAMC,KAAKC,SAAS,CAAClB;gBACvB;aACD;YACDmB,mBAAmB;gBAAEnB;YAAO;QAC9B;IACF,EAAE,OAAOoB,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChEjB,OAAOiB,KAAK,CAAC,2BAA2B;YAAEA,OAAOC;QAAQ;QAEzD,MAAM,IAAI7C,cAAcC,kBAAkB+C,aAAa,EAAE,CAAC,oBAAoB,EAAEH,SAAS,EAAE;YACzFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACN9B;QACAG;IACF;AACF"}