@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.
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/cjs/email/messages/messages.js.map +1 -1
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
- package/dist/cjs/email/parsing/message-mapping.js.map +1 -1
- package/dist/cjs/email/querying/client-filter.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination-token.js.map +1 -1
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js.map +1 -1
- package/dist/cjs/lib/outlook/index.js.map +1 -1
- package/dist/cjs/lib/outlook/types.js.map +1 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/schemas/outlook-query-schema.js.map +1 -1
- package/dist/cjs/schemas/outlook-validation.js.map +1 -1
- package/dist/cjs/setup/config.js +5 -4
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
- package/dist/cjs/setup/runtime.js +3 -2
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/cjs/setup/version-help.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/esm/email/messages/messages.js.map +1 -1
- package/dist/esm/email/parsing/header-parsing.js.map +1 -1
- package/dist/esm/email/parsing/message-extraction.js.map +1 -1
- package/dist/esm/email/parsing/message-mapping.js.map +1 -1
- package/dist/esm/email/querying/client-filter.js.map +1 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination-token.js.map +1 -1
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/messages-to-row.js.map +1 -1
- package/dist/esm/lib/outlook/index.js.map +1 -1
- package/dist/esm/lib/outlook/types.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/schemas/outlook-query-schema.js.map +1 -1
- package/dist/esm/schemas/outlook-validation.js.map +1 -1
- package/dist/esm/setup/config.js +4 -3
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-microsoft.js.map +1 -1
- package/dist/esm/setup/runtime.js +3 -2
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/setup/version-help.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -3
|
@@ -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":["filterClientSide","toRowFromOutlook","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","formatAddresses","opts","addressFormat","normalizeDateToISO","provider","threadId","fmt","to","f","addr","cc","bcc","date","labels","snippet","bodyFull","extractCurrentMessageFromText","extractCurrentMessageFromHtmlToText","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":["filterClientSide","toRowFromOutlook","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","formatAddresses","opts","addressFormat","normalizeDateToISO","provider","threadId","fmt","to","f","addr","cc","bcc","date","labels","snippet","bodyFull","extractCurrentMessageFromText","extractCurrentMessageFromHtmlToText","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":";;;;;;;;;;;QAwJgBA;eAAAA;;QA1DAC;eAAAA;;;qBA9FwG;;;;;AAkCxH,gCAAgC;AAChC,SAASC,iBAAiBC,GAAY;IACpC,IAAI,CAAA,OAAOA,oCAAP,SAAOA,IAAE,MAAM,YAAYA,QAAQ,MAAM;QAC3C,OAAO;IACT;IAEA,IAAMC,MAAMD;IAEZ,IAAIC,IAAIC,EAAE,KAAKC,aAAa,OAAOF,IAAIC,EAAE,KAAK,UAAU,OAAO;IAC/D,IAAID,IAAIG,cAAc,KAAKD,aAAa,OAAOF,IAAIG,cAAc,KAAK,UAAU,OAAO;IACvF,IAAIH,IAAII,gBAAgB,KAAKF,aAAa,OAAOF,IAAII,gBAAgB,KAAK,UAAU,OAAO;IAC3F,IAAIJ,IAAIK,OAAO,KAAKH,aAAa,OAAOF,IAAIK,OAAO,KAAK,UAAU,OAAO;IACzE,IAAIL,IAAIM,WAAW,KAAKJ,aAAa,OAAOF,IAAIM,WAAW,KAAK,UAAU,OAAO;IAEjF,uCAAuC;IACvC,IAAIN,IAAIO,YAAY,KAAKL,aAAa,CAACM,MAAMC,OAAO,CAACT,IAAIO,YAAY,GAAG,OAAO;IAC/E,IAAIP,IAAIU,YAAY,KAAKR,aAAa,CAACM,MAAMC,OAAO,CAACT,IAAIU,YAAY,GAAG,OAAO;IAC/E,IAAIV,IAAIW,aAAa,KAAKT,aAAa,CAACM,MAAMC,OAAO,CAACT,IAAIW,aAAa,GAAG,OAAO;IAEjF,gCAAgC;IAChC,IAAIX,IAAIY,IAAI,KAAKV,aAAc,CAAA,SAAOF,IAAIY,IAAI,MAAK,YAAYZ,IAAIY,IAAI,KAAK,IAAG,GAAI,OAAO;IAE1F,gCAAgC;IAChC,IAAIZ,IAAIa,IAAI,KAAKX,WAAW;QAC1B,IAAI,SAAOF,IAAIa,IAAI,MAAK,YAAYb,IAAIa,IAAI,KAAK,MAAM,OAAO;QAC9D,IAAMA,OAAOb,IAAIa,IAAI;QACrB,IAAIA,KAAKC,WAAW,KAAKZ,aAAa,CAAC;YAAC;YAAQ;SAAO,CAACa,QAAQ,CAACC,OAAOH,KAAKC,WAAW,IAAI,OAAO;QACnG,IAAID,KAAKI,OAAO,KAAKf,aAAa,OAAOW,KAAKI,OAAO,KAAK,UAAU,OAAO;IAC7E;IAEA,OAAO;AACT;AAEA,SAASC;QAAoBC,OAAAA,iEAA2B,EAAE,EAAEC,OAAAA,iEAAiC;IAC3F,IAAI,CAACZ,MAAMC,OAAO,CAACU,SAASA,KAAKE,MAAM,KAAK,GAAG,OAAO;IACtD,IAAMC,YAAYH,KACfI,GAAG,CAAC,SAACC;YACEA,aACCA;YADDA,iBACCA;eAFI;YACXC,IAAI,GAAED,gBAAAA,cAAAA,yBAAAA,kBAAAA,EAAGE,YAAY,cAAfF,sCAAAA,gBAAiBC,IAAI,yCAAID,cAAAA,wBAAAA,EAAGC,IAAI,cAAhCD,kBAAAA,OAAoC;YAC1CG,KAAK,GAAEH,iBAAAA,cAAAA,yBAAAA,mBAAAA,EAAGE,YAAY,cAAfF,uCAAAA,iBAAiBI,OAAO,yCAAIJ,cAAAA,wBAAAA,EAAGI,OAAO,cAAtCJ,mBAAAA,QAA0C;QACnD;OACCK,MAAM,CAAC,SAACC;eAAMA,EAAEH,KAAK;;IACxB,OAAOI,IAAAA,sBAAe,EAACT,WAAWF;AACpC;AAkBO,SAASvB,iBAAiBG,GAAY;QAAEgC,OAAAA,iEAAsB;QAAEnB,MAAM;QAAOoB,eAAe;IAAQ;QAO9FjC,SAEMA,qBAcJkC,qBACGlC,cAEAA;IAzBhB,kCAAkC;IAClC,IAAI,CAACF,iBAAiBE,MAAM;QAC1B,qCAAqC;QACrC,OAAO;YAAC;YAAI;YAAW;YAAI;YAAI;YAAI;YAAI;YAAI;YAAI;YAAI;YAAI;YAAI;SAAG;IAChE;IAEA,IAAMC,MAAKD,UAAAA,IAAIC,EAAE,cAAND,qBAAAA,UAAU;IACrB,IAAMmC,WAAW;IACjB,IAAMC,YAAWpC,sBAAAA,IAAIG,cAAc,cAAlBH,iCAAAA,sBAAsB;IACvC,IAAMqC,MAAML,KAAKC,aAAa,IAAI;IAClC,IAAMK,KAAKpB,oBAAoBlB,IAAIO,YAAY,IAAI,EAAE,EAAE8B;IAEvD,IAAMzB,OAAO,AAAC;YAGC2B,aACAA;YADAA,iBACAA;QAHb,IAAMA,IAAIvC,IAAIY,IAAI;QAClB,IAAI,CAAC2B,GAAG,OAAO;QACf,IAAMd,QAAOc,iBAAAA,kBAAAA,EAAEb,YAAY,cAAda,sCAAAA,gBAAgBd,IAAI,yCAAIc,EAAEd,IAAI,cAA9Bc,kBAAAA,OAAkC;QAC/C,IAAMC,QAAOD,kBAAAA,mBAAAA,EAAEb,YAAY,cAAda,uCAAAA,iBAAgBX,OAAO,yCAAIW,EAAEX,OAAO,cAApCW,mBAAAA,QAAwC;QACrD,OAAOrB,oBAAoB;YAAC;gBAAEO,MAAAA;gBAAMG,SAASY;YAAK;SAAE,EAAEH;IACxD;IAEA,IAAMI,KAAKvB,oBAAoBlB,IAAIU,YAAY,IAAI,EAAE,EAAE2B;IACvD,IAAMK,MAAMxB,oBAAoBlB,IAAIW,aAAa,IAAI,EAAE,EAAE0B;IACzD,IAAMM,QAAOT,sBAAAA,IAAAA,yBAAkB,EAAClC,IAAII,gBAAgB,eAAvC8B,iCAAAA,sBAA4C;IACzD,IAAM7B,WAAUL,eAAAA,IAAIK,OAAO,cAAXL,0BAAAA,eAAe;IAC/B,IAAM4C,SAAS;IACf,IAAMC,WAAU7C,mBAAAA,IAAIM,WAAW,cAAfN,8BAAAA,mBAAmB;IAEnC,IAAI8C,WAAW;IACf,IAAId,KAAKnB,IAAI,IAAIb,IAAIa,IAAI,EAAE;YAETb;QADhB,IAAMc,cAAcd,IAAIa,IAAI,CAACC,WAAW,IAAI;QAC5C,IAAMG,WAAUjB,oBAAAA,IAAIa,IAAI,CAACI,OAAO,cAAhBjB,+BAAAA,oBAAoB;QACpC8C,WAAWhC,gBAAgB,SAASiC,IAAAA,oCAA6B,EAAC9B,WAAW+B,IAAAA,0CAAmC,EAAC/B;IACnH;IAEA,OAAO;QAAChB;QAAIkC;QAAUC;QAAUE;QAAI1B;QAAM6B;QAAIC;QAAKC;QAAMtC;QAASuC;QAAQC;QAASC;KAAS;AAC9F;AAsBO,SAASlD,iBAAiBqD,OAA0B;QAAE,OAAA,iEAA+G,CAAC,kBAAhH,KAAE5C,SAAAA,oCAAU,2CAAZ,KAAgB6C,kBAAAA,sDAAmB,4CAAnC,KAAuCC,UAAAA,sCAAW,gCAAlD,KAAsDvC,MAAAA,8BAAO,0BAA7D,KAAiE0B,IAAAA,0BAAK,wBAAtE,KAA0EG,IAAAA,0BAAK,yBAA/E,KAAmFC,KAAAA,4BAAM;QAWlIS;IAVlB,IAAMC,QAAQ,eAACC;eAAgBA,EAAE9B,GAAG,CAAC,SAAC+B;mBAAMtC,OAAOsC,GAAGC,WAAW;;;IACjE,IAAMC,gBAAgBJ,MAAMH,QAAQQ,eAAe,IAAI,EAAE;IACzD,IAAMC,aAAaN,MAAMH,QAAQU,YAAY,IAAI,EAAE;IACnD,IAAMC,aAAaR,MAAMH,QAAQY,YAAY,IAAI,EAAE;IACnD,IAAMC,aAAaV,MAAMH,QAAQc,YAAY,IAAI,EAAE;IACnD,IAAMC,gBAAgBZ,MAAMH,QAAQgB,UAAU,IAAI,EAAE;IACpD,IAAMC,WAAWd,MAAMH,QAAQkB,UAAU,IAAI,EAAE;IAC/C,IAAMC,YAAYhB,MAAMH,QAAQoB,WAAW,IAAI,EAAE;IAEjD,IAAMC,IAAItD,OAAOX,oBAAAA,qBAAAA,UAAW,IAAIkD,WAAW;IAC3C,IAAMgB,IAAIvD,QAAQmC,QAAAA,YAAYD,8BAAZC,mBAAAA,QAAiC,IAAII,WAAW;IAClE,IAAMhB,IAAIvB,OAAOJ,iBAAAA,kBAAAA,OAAQ,IAAI2C,WAAW;IACxC,IAAMD,IAAItC,OAAOsB,eAAAA,gBAAAA,KAAM,IAAIiB,WAAW;IACtC,IAAMiB,IAAIxD,OAAOyB,eAAAA,gBAAAA,KAAM,IAAIc,WAAW;IACtC,IAAMkB,KAAKzD,OAAO0B,gBAAAA,iBAAAA,MAAO,IAAIa,WAAW;IAExC,IAAMmB,cAAc,qBAACC,KAAaC;YAAyDA;eAAnCA,OAAOvD,MAAM,KAAK,IAAIsD,IAAI5D,QAAQ,EAAC6D,WAAAA,MAAM,CAAC,EAAE,cAATA,sBAAAA,WAAa,MAAMA,OAAOC,IAAI,CAAC,SAACC;mBAAUH,IAAI5D,QAAQ,CAAC+D;;;IAClJ,IAAMC,YAAYvB,cAAcnC,MAAM,GAAGqD,YAAYJ,GAAGd,iBAAiB;IACzE,IAAMwB,SAAStB,WAAWrC,MAAM,GAAGqD,YAAYH,GAAGb,cAAc;IAChE,IAAMuB,SAASrB,WAAWvC,MAAM,GAAGuC,WAAWiB,IAAI,CAAC,SAACC;eAAUR,EAAEvD,QAAQ,CAAC+D,UAAUP,EAAExD,QAAQ,CAAC+D;SAAU;IACxG,IAAMI,SAASpB,WAAWzC,MAAM,GAAGqD,YAAYnC,GAAGuB,cAAc;IAChE,IAAMqB,OAAOnB,cAAc3C,MAAM,GAAGqD,YAAYpB,GAAGU,iBAAiB;IACpE,IAAMoB,OAAOlB,SAAS7C,MAAM,GAAGqD,YAAYF,GAAGN,YAAY;IAC1D,IAAMmB,QAAQjB,UAAU/C,MAAM,GAAGqD,YAAYD,IAAIL,aAAa;IAE9D,OAAOW,aAAaC,UAAUC,UAAUC,UAAUC,QAAQC,QAAQC;AACpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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","executeQuery","extractEmailsFromRecipients","extractFrom","extractOutlookFilters","fetchOutlookMessage","formatAddressList","mapOutlookMessage","searchMessages","toGraphFilter","toOutlookFilter","toRowFromOutlook"],"mappings":";;;;;;;;;;;QAASA;eAAAA,gCAAoB;;QAIMC;eAAAA,4BAAY;;QAHtCC;eAAAA,4CAA2B;;QAAEC;eAAAA,4BAAW;;QAIxCC;eAAAA,qCAAqB;;QAHrBC;eAAAA,wCAAmB;;QADuBC;eAAAA,kCAAiB;;QAE3DC;eAAAA,mCAAiB;;QAGUC;eAAAA,iCAAc;;QADlBC;eAAAA,6BAAa;;QAAEC;eAAAA,+BAAe;;QAL/BC;eAAAA,4BAAgB;;;0BAAQ;+BACqB;mCACxC;gCAC8C;8BAC3B;8BACe;iCACZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;+DAFqB;gEACE;gEACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["createPrompt","argsSchema","z","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":";;;;+BAGA;;;eAAwBA;;;mBAFN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,SAASA;IACtB,IAAMC,aAAaC,MAAC,CAACC,MAAM,CAAC;QAC1BC,SAASF,MAAC,CAACG,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMN,MAAC,CAACG,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,IAAMG,SAAS;QACbC,aAAa;QACbV,YAAYA,WAAWW,KAAK;IAC9B;IAEA,IAAMC,UAAU,iBAAOC,MAAgCC;;gBAC3Bd,mBAAlBG,SAASI;;gBAASP,oBAAAA,WAAWe,KAAK,CAACF,OAAnCV,UAAkBH,kBAAlBG,SAASI,OAASP,kBAATO;gBACjB;;oBAAO;wBACLS,QAAQ;4BACN;gCAAEC,MAAM;gCAAmBC,SAAS;oCAAEC,MAAM;oCAAiBC,MAAM;gCAAqC;4BAAE;4BAC1G;gCAAEH,MAAM;gCAAiBC,SAAS;oCAAEC,MAAM;oCAAiBC,MAAM,AAAC,WAA8CjB,OAApCI,QAAQ,gBAAe,eAAqB,OAARJ;gCAAU;4BAAE;;oBAEhI;;;QACF;;IAEA,OAAO;QACLkB,MAAM;QACNZ,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["draftEmail","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,qBAAU;;QACVC;eAAAA,sBAAW;;;mEADO;oEACC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":";;;;+BAEA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;IACf;IAEA,IAAMC,UAAU,iBAAOC,OAAiCC;;;gBACtD;;oBAAO;wBACLC,QAAQ;4BACN;gCACEC,MAAM;gCACNC,SAAS;oCACPC,MAAM;oCACNC,MAAM;gCAwDR;4BACF;;oBAEJ;;;QACF;;IAEA,OAAO;QACLC,MAAM;QACNV,QAAAA;QACAE,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","message","logger","authContext","graph","toAddresses","toStr","metadata","e","error","info","Client","initWithMiddleware","authProvider","auth","api","encodeURIComponent","id","get","toRecipients","map","r","emailAddress","address","filter","Boolean","length","join","subject","from","to","date","toIsoUtc","receivedDateTime","contents","href","text","JSON","stringify","String","name"],"mappings":";;;;+BAOA;;;eAAwBA;;;qBAPuB;sBAGd;oCACV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGR,SAASA;IACtB,IAAMC,WAAW,IAAIC,wBAAgB,CAAC,2BAA2B;QAC/DC,MAAMC;IACR;IACA,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,iBAAOC,KAAUC,WAA2BC;;gBAelDC,aACKA,wBANSA,uBAOZA,4BAAAA,eAfAC,QAAQC,aAIVC,OACAH,SAGAI,aACAC,OAGAC,UAiBCC,UACCN,SAEFO;;;;;;;;;;wBAhCEP,SAAwBF,MAAxBE,QAAQC,cAAgBH,MAAhBG;wBAEhBD,OAAOQ,IAAI,CAACX,WAAW;wBAEjBK,QAAQO,4BAAM,CAACC,kBAAkB,CAAC;4BAAEC,cAAcV,YAAYW,IAAI;wBAAC;wBACxD;;4BAAMV,MAAMW,GAAG,CAAC,AAAC,gBAAgD,OAAjCC,mBAAmBjB,UAAUkB,EAAE,IAAKC,GAAG;;;wBAAlFjB,UAAW;wBAEjB,qBAAqB;wBACfI,eAAcJ,wBAAAA,QAAQkB,YAAY,cAApBlB,4CAAAA,sBAAsBmB,GAAG,CAAC,SAACC;gCAAMA;oCAAAA,kBAAAA,EAAEC,YAAY,cAAdD,sCAAAA,gBAAgBE,OAAO;2BAAEC,MAAM,CAACC;wBAC/EnB,QAAQD,eAAeA,YAAYqB,MAAM,GAAG,IAAIrB,YAAYsB,IAAI,CAAC,QAAQ;wBAE/E,qDAAqD;wBAC/CpB,WAAW;4BACfU,EAAE,GAAEhB,cAAAA,QAAQgB,EAAE,cAAVhB,yBAAAA,cAAcF,UAAUkB,EAAE;4BAC9BW,OAAO,GAAE3B,mBAAAA,QAAQ2B,OAAO,cAAf3B,8BAAAA,mBAAmB;4BAC5B4B,IAAI,WAAE5B,gBAAAA,QAAQ4B,IAAI,cAAZ5B,qCAAAA,6BAAAA,cAAcqB,YAAY,cAA1BrB,iDAAAA,2BAA4BsB,OAAO,uCAAI;4BAC7CO,IAAIxB;4BACJyB,MAAMC,IAAAA,yBAAQ,EAAC/B,QAAQgC,gBAAgB,KAAKhC,QAAQgC,gBAAgB,IAAI;wBAC1E;wBAEA;;4BAAO;gCACLC,QAAQ;oCACN;wCACEpC,KAAKA,IAAIqC,IAAI;wCACbvC,UAAU;wCACVwC,MAAMC,KAAKC,SAAS,CAAC/B;oCACvB;;4BAEJ;;;wBACOC;wBACCN,UAAWF,MAAXE;wBACRA,QAAOO,KAAK,CAACD,GAA8B;wBACrCC,QAAQD;wBACd;;4BAAO;gCACL0B,QAAQ;oCACN;wCACEpC,KAAKA,IAAIqC,IAAI;wCACbvC,UAAU;wCACVwC,MAAMC,KAAKC,SAAS,CAAC;4CAAE7B,OAAO8B,gBAAO9B,kBAAAA,4BAAAA,MAAOR,OAAO,yCAAIO;wCAAG;oCAC5D;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACLgC,MAAM;QACNlD,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["email"],"mappings":";;;;+BAAoBA;;;eAAAA,gBAAK;;;8DAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","z","object","successBranchSchema","type","literal","items","array","OutlookCategorySchema","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","graph","started","response","categories","durationMs","error","message","info","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","api","get","Array","isArray","value","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","name"],"mappings":";;;;;;;;;;;QAwFA;eAAwBA;;QAvEXC;eAAAA;;;8BAhBW;sBAK8C;oCAC/C;mBAEL;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAPtC,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAcD,IAAMD,cAAcG,MAAC,CAACC,MAAM,CAAC,CAAC;AAErC,wBAAwB;AACxB,IAAMC,sBAAsBF,MAAC,CAACC,MAAM,CAAC;IACnCE,MAAMH,MAAC,CAACI,OAAO,CAAC;IAChBC,OAAOL,MAAC,CAACM,KAAK,CAACC,8BAAqB;AACtC;AAEA,2CAA2C;AAC3C,IAAMC,eAAeR,MAAC,CAACS,kBAAkB,CAAC,QAAQ;IAACP;IAAqBJ;CAAyB;AAEjG,IAAMY,SAAS;IACbC,aAAa;IACbd,aAAaA;IACbW,cAAcR,MAAC,CAACC,MAAM,CAAC;QACrBW,QAAQJ;IACV;AACF;AAUA,SAAeK,QAAQC,CAAQ,EAAEC,KAAoB;;YAC7CC,QAIEC,OACAC,SAGAC,UACAC,YAEAC,YAIAT,QAkBCU,OACDC;;;;oBAlCFP,SAASD,MAAMC,MAAM;oBAC3BA,OAAOQ,IAAI,CAAC;;;;;;;;;oBAGJP,QAAQQ,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcZ,MAAMa,WAAW,CAACC,IAAI;oBAAC;oBACzEX,UAAUY,KAAKC,GAAG;oBAGP;;wBAAMd,MAAMe,GAAG,CAAC,gCAAgCC,GAAG;;;oBAA9Dd,WAAW;oBACXC,aAAac,MAAMC,OAAO,CAAChB,SAASiB,KAAK,IAAIjB,SAASiB,KAAK;oBAE3Df,aAAaS,KAAKC,GAAG,KAAKb;oBAChCF,OAAOQ,IAAI,CAAC,qCAAqC;wBAAEa,iBAAiBjB,WAAWkB,MAAM;oBAAC;oBACtFtB,OAAOQ,IAAI,CAAC,mCAAmC;wBAAEH,YAAAA;oBAAW;oBAEtDT,SAAiB;wBACrBT,MAAM;wBACNE,OAAOe,WAAWmB,GAAG,CAAC,SAACC;mCAA8C;gCACnEC,IAAID,SAASC,EAAE,IAAIC;gCACnBC,aAAaH,SAASG,WAAW,IAAID;gCACrCE,OAAOJ,SAASI,KAAK,IAAIF;4BAC3B;;oBACF;oBAEA;;wBAAO;4BACLG,OAAO;gCACL;oCACE1C,MAAM;oCACN2C,MAAMC,KAAKC,SAAS,CAACpC;gCACvB;;4BAEFqC,mBAAmB;gCAAErC,QAAAA;4BAAO;wBAC9B;;;oBACOU;oBACDC,UAAUD,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMC,OAAO,GAAG4B,OAAO7B;oBAChEN,OAAOM,KAAK,CAAC,iCAAiC;wBAAEA,OAAOC;oBAAQ;oBAE/D,MAAM,IAAI6B,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE,AAAC,6BAAoC,OAAR/B,UAAW;wBAC/FgC,OAAOjC,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMiC,KAAK,GAAGb;oBAChD;;;;;;;IAEJ;;AAEe,SAAS9C;IACtB,OAAO;QACL4D,MAAM;QACN9C,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,yBAAc;;QACdC;eAAAA,mBAAQ;;QACRC;eAAAA,sBAAW;;QACXC;eAAAA,qBAAU;;QACVC;eAAAA,qBAAU;;QACVC;eAAAA,0BAAe;;QACfC;eAAAA,6BAAkB;;QAClBC;eAAAA,yBAAc;;QACdC;eAAAA,wBAAa;;QACbC;eAAAA,sBAAW;;QACXC;eAAAA,4BAAiB;;;uEAVK;iEACN;oEACG;mEACD;mEACA;wEACK;2EACG;uEACJ;sEACD;oEACF;0EACM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
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":["createTool","AuthRequiredBranchSchema","schemas","LabelResultSchema","z","object","id","string","describe","labels","array","optional","inputSchema","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","graph","error","message","info","Client","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","header","patch","categories","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined","name"],"mappings":";;;;+BA2EA;;;eAAwBA;;;8BA1EA;sBAK8C;oCAC/C;mBACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALlB,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAOR,IAAME,oBAAoBC,MAAC,CAACC,MAAM,CAAC;IACjCC,IAAIF,MAAC,CAACG,MAAM,GAAGC,QAAQ,CAAC;IACxBC,QAAQL,MAAC,CAACM,KAAK,CAACN,MAAC,CAACG,MAAM,IAAII,QAAQ,GAAGH,QAAQ,CAAC;AAClD;AAEA,IAAMI,cAAcR,MAAC,CAACC,MAAM,CAAC;IAC3BC,IAAIF,MAAC,CAACS,MAAM,CAACN,MAAM,GAAGO,IAAI,GAAGC,GAAG,CAAC,GAAGP,QAAQ,CAAC;IAC7CC,QAAQL,MAAC,CAACM,KAAK,CAACN,MAAC,CAACS,MAAM,CAACN,MAAM,GAAGO,IAAI,IAAIC,GAAG,CAAC,GAAGP,QAAQ,CAAC;AAC5D;AAEA,wBAAwB;AACxB,IAAMQ,sBAAsBb,kBAAkBc,MAAM,CAAC;IACnDC,MAAMd,MAAC,CAACe,OAAO,CAAC;AAClB;AAEA,2CAA2C;AAC3C,IAAMC,eAAehB,MAAC,CAACiB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBf;CAAyB;AAEjG,IAAMqB,SAAS;IACbC,aAAa;IACbX,aAAaA;IACbQ,cAAchB,MAAC,CAACC,MAAM,CAAC;QACrBmB,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAqB,EAAEC,KAAoB;YAAzCpB,IAAIG,QACrBkB,QAIEC,OAMAJ,QAeCK,OACDC;;;;oBA3BexB,KAAF,MAAEA,IAAIG,SAAN,MAAMA;oBACrBkB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOI,IAAI,CAAC,4BAA4B;wBAAEzB,IAAAA;wBAAIG,QAAAA;oBAAO;;;;;;;;;oBAG7CmB,QAAQI,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcR,MAAMS,WAAW,CAACC,IAAI;oBAAC;oBAC/E;;wBAAMR,MACHS,GAAG,CAAC,AAAC,gBAAsC,OAAvBC,mBAAmBhC,MACvCiC,MAAM,CAAC,gBAAgB,oBACvBC,KAAK,CAAC;4BAAEC,YAAYhC;wBAAO;;;oBAH9B;oBAKMe,SAAiB;wBACrBN,MAAM;wBACNZ,IAAAA;wBACAG,QAAAA;oBACF;oBAEA;;wBAAO;4BACLiC,OAAO;gCACL;oCACExB,MAAM;oCACNyB,MAAMC,KAAKC,SAAS,CAACrB;gCACvB;;4BAEFsB,mBAAmB;gCAAEtB,QAAAA;4BAAO;wBAC9B;;;oBACOK;oBACDC,UAAUD,AAAK,YAALA,OAAiBkB,SAAQlB,MAAMC,OAAO,GAAGkB,OAAOnB;oBAChEF,OAAOE,KAAK,CAAC,2BAA2B;wBAAEA,OAAOC;oBAAQ;oBAEzD,MAAM,IAAImB,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE,AAAC,uBAA8B,OAARrB,UAAW;wBACzFsB,OAAOvB,AAAK,YAALA,OAAiBkB,SAAQlB,MAAMuB,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASrD;IACtB,OAAO;QACLsD,MAAM;QACNhC,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/tools/label-delete.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';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst BatchResultSchema = z.object({\n totalRequested: z.number().describe('Total number of categories requested to delete'),\n successCount: z.number().describe('Number of categories successfully deleted'),\n failureCount: z.number().describe('Number of categories that failed to delete'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Category ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each category'),\n});\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).max(MAX_BATCH_SIZE).describe('Outlook category IDs to delete'),\n});\n\n// Success branch schema\nconst successBranchSchema = BatchResultSchema.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: 'Delete Outlook categories permanently (irreversible). Categories organize messages by color and name.',\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({ ids }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook-label-delete called', { count: ids.length });\n\n // Validate IDs for Outlook-specific constraints\n // Note: Schema already validates non-empty, trimmed strings with min/max length\n // This check enforces business rule: Outlook category IDs cannot contain path separators or angle brackets\n const invalidIds: string[] = [];\n for (const id of ids) {\n if (id.includes('/') || id.includes('\\\\') || id.includes('<') || id.includes('>')) {\n invalidIds.push(id);\n }\n }\n\n if (invalidIds.length > 0) {\n logger.info('outlook-label-delete found invalid ids', { invalidIds, count: invalidIds.length });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs (contain invalid characters): ${invalidIds.join(', ')}`);\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n // Process deletions in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < ids.length; i += CHUNK_SIZE) {\n const chunk = ids.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(ids.length / CHUNK_SIZE) });\n\n // Delete categories sequentially to avoid API lock conflicts\n const chunkResults: Array<{ status: string; value?: unknown; reason?: unknown }> = [];\n for (const id of chunk) {\n try {\n await graph.api(`/me/outlook/masterCategories/${encodeURIComponent(id)}`).delete();\n chunkResults.push({ status: 'fulfilled', value: { id, success: true } });\n } catch (error) {\n chunkResults.push({ status: 'rejected', reason: error });\n }\n }\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: ids.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n logger.info('outlook-label-delete completed', {\n totalRequested: ids.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(ids.length / CHUNK_SIZE),\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-delete error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error deleting categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-delete',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BatchResultSchema","z","object","totalRequested","number","describe","successCount","failureCount","results","array","id","string","success","boolean","error","optional","inputSchema","ids","coerce","trim","min","max","MAX_BATCH_SIZE","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","invalidIds","graph","allResults","i","message","info","count","length","includes","push","ProtocolError","ProtocolErrorCode","InvalidParams","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","api","encodeURIComponent","delete","status","value","reason","map","Error","errorMessage","String","Client","initWithMiddleware","authProvider","authContext","auth","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/label-delete.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';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst BatchResultSchema = z.object({\n totalRequested: z.number().describe('Total number of categories requested to delete'),\n successCount: z.number().describe('Number of categories successfully deleted'),\n failureCount: z.number().describe('Number of categories that failed to delete'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Category ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each category'),\n});\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).max(MAX_BATCH_SIZE).describe('Outlook category IDs to delete'),\n});\n\n// Success branch schema\nconst successBranchSchema = BatchResultSchema.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: 'Delete Outlook categories permanently (irreversible). Categories organize messages by color and name.',\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({ ids }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook-label-delete called', { count: ids.length });\n\n // Validate IDs for Outlook-specific constraints\n // Note: Schema already validates non-empty, trimmed strings with min/max length\n // This check enforces business rule: Outlook category IDs cannot contain path separators or angle brackets\n const invalidIds: string[] = [];\n for (const id of ids) {\n if (id.includes('/') || id.includes('\\\\') || id.includes('<') || id.includes('>')) {\n invalidIds.push(id);\n }\n }\n\n if (invalidIds.length > 0) {\n logger.info('outlook-label-delete found invalid ids', { invalidIds, count: invalidIds.length });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs (contain invalid characters): ${invalidIds.join(', ')}`);\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n // Process deletions in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < ids.length; i += CHUNK_SIZE) {\n const chunk = ids.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(ids.length / CHUNK_SIZE) });\n\n // Delete categories sequentially to avoid API lock conflicts\n const chunkResults: Array<{ status: string; value?: unknown; reason?: unknown }> = [];\n for (const id of chunk) {\n try {\n await graph.api(`/me/outlook/masterCategories/${encodeURIComponent(id)}`).delete();\n chunkResults.push({ status: 'fulfilled', value: { id, success: true } });\n } catch (error) {\n chunkResults.push({ status: 'rejected', reason: error });\n }\n }\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: ids.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n logger.info('outlook-label-delete completed', {\n totalRequested: ids.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(ids.length / CHUNK_SIZE),\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-delete error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error deleting categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-delete',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BatchResultSchema","z","object","totalRequested","number","describe","successCount","failureCount","results","array","id","string","success","boolean","error","optional","inputSchema","ids","coerce","trim","min","max","MAX_BATCH_SIZE","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","invalidIds","graph","allResults","i","message","info","count","length","includes","push","ProtocolError","ProtocolErrorCode","InvalidParams","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","api","encodeURIComponent","delete","status","value","reason","map","Error","errorMessage","String","Client","initWithMiddleware","authProvider","authContext","auth","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/labels-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\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\nconst { AuthRequiredBranchSchema } = schemas;\n\n/**\n * Input schema for the labels-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 for label: query syntax. Case-sensitive.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the labels-list tool\n *\n * Represents the input parameters for listing Outlook labels.\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.labels.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 (same as categories tool)\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.labels.list returning', { labelsCount: categories.length });\n logger.info('outlook.labels.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.labels.list error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error listing labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'labels-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","z","object","successBranchSchema","type","literal","items","array","OutlookCategorySchema","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","graph","started","response","categories","durationMs","error","message","info","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","api","get","Array","isArray","value","labelsCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","name"],"mappings":";;;;;;;;;;;QAuFA;eAAwBA;;QAvEXC;eAAAA;;;8BAfW;sBAE8C;oCAC/C;mBAEL;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtC,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAOD,IAAMD,cAAcG,MAAC,CAACC,MAAM,CAAC,CAAC;AAErC,wBAAwB;AACxB,IAAMC,sBAAsBF,MAAC,CAACC,MAAM,CAAC;IACnCE,MAAMH,MAAC,CAACI,OAAO,CAAC;IAChBC,OAAOL,MAAC,CAACM,KAAK,CAACC,8BAAqB;AACtC;AAEA,2CAA2C;AAC3C,IAAMC,eAAeR,MAAC,CAACS,kBAAkB,CAAC,QAAQ;IAACP;IAAqBJ;CAAyB;AAEjG,IAAMY,SAAS;IACbC,aAAa;IACbd,aAAaA;IACbW,cAAcR,MAAC,CAACC,MAAM,CAAC;QACrBW,QAAQJ;IACV;AACF;AAUA,SAAeK,QAAQC,CAAQ,EAAEC,KAAoB;;YAC7CC,QAIEC,OACAC,SAGAC,UACAC,YAEAC,YAIAT,QAkBCU,OACDC;;;;oBAlCFP,SAASD,MAAMC,MAAM;oBAC3BA,OAAOQ,IAAI,CAAC;;;;;;;;;oBAGJP,QAAQQ,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcZ,MAAMa,WAAW,CAACC,IAAI;oBAAC;oBACzEX,UAAUY,KAAKC,GAAG;oBAGP;;wBAAMd,MAAMe,GAAG,CAAC,gCAAgCC,GAAG;;;oBAA9Dd,WAAW;oBACXC,aAAac,MAAMC,OAAO,CAAChB,SAASiB,KAAK,IAAIjB,SAASiB,KAAK;oBAE3Df,aAAaS,KAAKC,GAAG,KAAKb;oBAChCF,OAAOQ,IAAI,CAAC,iCAAiC;wBAAEa,aAAajB,WAAWkB,MAAM;oBAAC;oBAC9EtB,OAAOQ,IAAI,CAAC,+BAA+B;wBAAEH,YAAAA;oBAAW;oBAElDT,SAAiB;wBACrBT,MAAM;wBACNE,OAAOe,WAAWmB,GAAG,CAAC,SAACC;mCAA8C;gCACnEC,IAAID,SAASC,EAAE,IAAIC;gCACnBC,aAAaH,SAASG,WAAW,IAAID;gCACrCE,OAAOJ,SAASI,KAAK,IAAIF;4BAC3B;;oBACF;oBAEA;;wBAAO;4BACLG,OAAO;gCACL;oCACE1C,MAAM;oCACN2C,MAAMC,KAAKC,SAAS,CAACpC;gCACvB;;4BAEFqC,mBAAmB;gCAAErC,QAAAA;4BAAO;wBAC9B;;;oBACOU;oBACDC,UAAUD,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMC,OAAO,GAAG4B,OAAO7B;oBAChEN,OAAOM,KAAK,CAAC,6BAA6B;wBAAEA,OAAOC;oBAAQ;oBAE3D,MAAM,IAAI6B,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE,AAAC,yBAAgC,OAAR/B,UAAW;wBAC3FgC,OAAOjC,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMiC,KAAK,GAAGb;oBAChD;;;;;;;IAEJ;;AAEe,SAAS9C;IACtB,OAAO;QACL4D,MAAM;QACN9C,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/message-get.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText, normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { type CallToolResult, createFieldsSchema, filterFields, ProtocolError, ProtocolErrorCode, parseFields, type ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { z } from 'zod';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to retrieve'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema - uses item: wrapper for consistency with standard vocabulary\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: EmailDetailSchema,\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get an Outlook message by ID with flexible field selection',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, fields, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n\n logger.info('outlook.message.get called', { id, fields: fields || 'all' });\n\n if (!id) {\n logger.info('outlook.message.get missing id');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const message = (await graph.api(`/me/messages/${encodeURIComponent(id)}`).get()) as MicrosoftGraph.Message;\n\n // Process body based on contentType and excludeThreadHistory options\n let bodyContent = message.body?.content ?? '';\n const isHtml = message.body?.contentType?.toLowerCase() === 'html';\n\n if (isHtml && excludeThreadHistory) {\n // Remove thread history from HTML\n bodyContent = extractCurrentMessageFromHtml(bodyContent);\n }\n\n if (isHtml && contentType === 'text') {\n // Convert HTML to plain text (thread extraction happens inside if excludeThreadHistory was true)\n bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body?.content ?? '');\n }\n\n // Build full message data\n const payload = {\n id: message.id,\n subject: message.subject,\n from: message.from?.emailAddress?.address,\n date: toIsoUtc(message.receivedDateTime) || message.receivedDateTime,\n snippet: message.bodyPreview,\n body: bodyContent,\n bodyContentType: contentType,\n };\n\n // Filter based on requested fields\n const filteredPayload = filterFields(payload, requestedFields);\n\n logger.info('outlook.message.get success', { id: payload.id, subject: payload.subject, from: payload.from, date: payload.date, fields: fields || 'all' });\n\n const result: Output = {\n type: 'success' as const,\n item: filteredPayload as z.infer<typeof EmailDetailSchema>,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.message.get error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","item","EmailDetailSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","requestedFields","message","graph","bodyContent","isHtml","payload","filteredPayload","error","parseFields","info","ProtocolError","ProtocolErrorCode","InvalidParams","Client","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","get","body","content","toLowerCase","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","subject","from","emailAddress","address","date","toIsoUtc","receivedDateTime","snippet","bodyPreview","bodyContentType","filterFields","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/message-mark-read.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 SuccessSchema = z.object({\n success: z.boolean().describe('Whether the operation completed successfully'),\n id: z.string().optional().describe('Message ID that was marked as read'),\n});\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to mark as read'),\n});\n\n// Success branch schema\nconst successBranchSchema = SuccessSchema.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: 'Mark an Outlook message as read',\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 }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook-message-mark-read called', { id });\n\n if (!id) {\n logger.info('outlook-message-mark-read missing id');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n await graph.api(`/me/messages/${encodeURIComponent(id)}`).update({ isRead: true });\n\n logger.info('outlook-message-mark-read success', { id });\n\n const result: Output = {\n type: 'success' as const,\n success: true,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook-message-mark-read error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error marking message as read: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-mark-read',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","SuccessSchema","z","object","success","boolean","describe","id","string","optional","inputSchema","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","graph","error","message","info","ProtocolError","ProtocolErrorCode","InvalidParams","Client","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","update","isRead","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+BA8EA;;;eAAwBA;;;8BA7EA;sBAK8C;oCAC/C;mBACL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALlB,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAOR,IAAME,gBAAgBC,MAAC,CAACC,MAAM,CAAC;IAC7BC,SAASF,MAAC,CAACG,OAAO,GAAGC,QAAQ,CAAC;IAC9BC,IAAIL,MAAC,CAACM,MAAM,GAAGC,QAAQ,GAAGH,QAAQ,CAAC;AACrC;AAEA,IAAMI,cAAcR,MAAC,CAACC,MAAM,CAAC;IAC3BI,IAAIL,MAAC,CAACS,MAAM,CAACH,MAAM,GAAGI,IAAI,GAAGC,GAAG,CAAC,GAAGP,QAAQ,CAAC;AAC/C;AAEA,wBAAwB;AACxB,IAAMQ,sBAAsBb,cAAcc,MAAM,CAAC;IAC/CC,MAAMd,MAAC,CAACe,OAAO,CAAC;AAClB;AAEA,2CAA2C;AAC3C,IAAMC,eAAehB,MAAC,CAACiB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBf;CAAyB;AAEjG,IAAMqB,SAAS;IACbC,aAAa;IACbX,aAAaA;IACbQ,cAAchB,MAAC,CAACC,MAAM,CAAC;QACrBmB,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAa,EAAEC,KAAoB;YAAjCjB,IACjBkB,QASEC,OAKAJ,QAeCK,OACDC;;;;oBA/BerB,KAAF,MAAEA;oBACjBkB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOI,IAAI,CAAC,oCAAoC;wBAAEtB,IAAAA;oBAAG;oBAErD,IAAI,CAACA,IAAI;wBACPkB,OAAOI,IAAI,CAAC;wBACZ,MAAM,IAAIC,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE;oBAC3D;;;;;;;;;oBAGQN,QAAQO,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcX,MAAMY,WAAW,CAACC,IAAI;oBAAC;oBAC/E;;wBAAMX,MAAMY,GAAG,CAAC,AAAC,gBAAsC,OAAvBC,mBAAmBhC,MAAOiC,MAAM,CAAC;4BAAEC,QAAQ;wBAAK;;;oBAAhF;oBAEAhB,OAAOI,IAAI,CAAC,qCAAqC;wBAAEtB,IAAAA;oBAAG;oBAEhDe,SAAiB;wBACrBN,MAAM;wBACNZ,SAAS;wBACTG,IAAAA;oBACF;oBAEA;;wBAAO;4BACLmC,OAAO;gCACL;oCACE1B,MAAM;oCACN2B,MAAMC,KAAKC,SAAS,CAACvB;gCACvB;;4BAEFwB,mBAAmB;gCAAExB,QAAAA;4BAAO;wBAC9B;;;oBACOK;oBACDC,UAAUD,AAAK,YAALA,OAAiBoB,SAAQpB,MAAMC,OAAO,GAAGoB,OAAOrB;oBAChEF,OAAOE,KAAK,CAAC,mCAAmC;wBAAEA,OAAOC;oBAAQ;oBAEjE,MAAM,IAAIE,qBAAa,CAACC,yBAAiB,CAACkB,aAAa,EAAE,AAAC,kCAAyC,OAARrB,UAAW;wBACpGsB,OAAOvB,AAAK,YAALA,OAAiBoB,SAAQpB,MAAMuB,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASrD;IACtB,OAAO;QACLsD,MAAM;QACNhC,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/mcp/tools/message-move-to-trash.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';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst BatchResultSchema = z.object({\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Outlook message IDs to move to trash'),\n});\n\n// Success branch schema\nconst successBranchSchema = BatchResultSchema.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: 'Move Outlook messages to trash (recoverable).',\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({ ids }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n logger.info('outlook-message-move-to-trash missing ids');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n logger.info('outlook-message-move-to-trash batch size exceeded', { requested: ids.length, max: MAX_BATCH_SIZE });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Outlook message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n logger.info('outlook-message-move-to-trash found invalid ids', { invalidIds, count: invalidIds.length });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n logger.info('outlook-message-move-to-trash no valid ids after validation');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await graph.api(`/me/messages/${encodeURIComponent(id)}`).delete();\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n logger.info('outlook-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook-message-move-to-trash error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BatchResultSchema","z","object","totalRequested","number","describe","successCount","failureCount","results","array","id","string","success","boolean","error","optional","inputSchema","ids","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","graph","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","requested","max","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","api","encodeURIComponent","delete","Error","status","errorMessage","reason","String","Client","initWithMiddleware","authProvider","authContext","auth","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/message-move-to-trash.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';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst BatchResultSchema = z.object({\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Outlook message IDs to move to trash'),\n});\n\n// Success branch schema\nconst successBranchSchema = BatchResultSchema.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: 'Move Outlook messages to trash (recoverable).',\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({ ids }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n logger.info('outlook-message-move-to-trash missing ids');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n logger.info('outlook-message-move-to-trash batch size exceeded', { requested: ids.length, max: MAX_BATCH_SIZE });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Outlook message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n logger.info('outlook-message-move-to-trash found invalid ids', { invalidIds, count: invalidIds.length });\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n logger.info('outlook-message-move-to-trash no valid ids after validation');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await graph.api(`/me/messages/${encodeURIComponent(id)}`).delete();\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\n };\n\n logger.info('outlook-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook-message-move-to-trash error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","BatchResultSchema","z","object","totalRequested","number","describe","successCount","failureCount","results","array","id","string","success","boolean","error","optional","inputSchema","ids","coerce","trim","min","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","graph","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","requested","max","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","api","encodeURIComponent","delete","Error","status","errorMessage","reason","String","Client","initWithMiddleware","authProvider","authContext","auth","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/mcp/tools/message-respond.ts"],"sourcesContent":["import { ComposeContentTypeSchema } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport 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 SuccessSchema = z.object({\n success: z.boolean().describe('Whether the reply was sent successfully'),\n id: z.string().optional().describe('Original message ID that was replied to'),\n});\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Outlook message ID to reply to'),\n body: z.coerce.string().trim().min(1).describe('Reply body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\n// Success branch schema\nconst successBranchSchema = SuccessSchema.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: 'Reply to an Outlook message',\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, body, contentType }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.respond called', { id, hasBody: !!body });\n\n if (!id || !body) {\n logger.info('outlook.respond missing id or body');\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id or body');\n }\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n await graph.api(`/me/messages/${encodeURIComponent(id)}/reply`).post({ message: { body: { contentType: contentType === 'html' ? 'HTML' : 'Text', content: body } } });\n\n logger.info('outlook.respond success', { id });\n\n const result: Output = {\n type: 'success' as const,\n success: true,\n id,\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.respond error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error replying to message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-respond',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","SuccessSchema","z","object","success","boolean","describe","id","string","optional","inputSchema","coerce","trim","min","body","contentType","ComposeContentTypeSchema","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","graph","error","message","info","hasBody","ProtocolError","ProtocolErrorCode","InvalidParams","Client","initWithMiddleware","authProvider","authContext","auth","api","encodeURIComponent","post","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":"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"}
|