@mcp-z/mcp-outlook 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +165 -0
- package/bin/server.js +5 -0
- package/dist/cjs/constants.d.cts +10 -0
- package/dist/cjs/constants.d.ts +10 -0
- package/dist/cjs/constants.js +35 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/email/composition/outlook-message-builder.d.cts +36 -0
- package/dist/cjs/email/composition/outlook-message-builder.d.ts +36 -0
- package/dist/cjs/email/composition/outlook-message-builder.js +56 -0
- package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -0
- package/dist/cjs/email/messages/messages.d.cts +7 -0
- package/dist/cjs/email/messages/messages.d.ts +7 -0
- package/dist/cjs/email/messages/messages.js +61 -0
- package/dist/cjs/email/messages/messages.js.map +1 -0
- package/dist/cjs/email/parsing/header-parsing.d.cts +18 -0
- package/dist/cjs/email/parsing/header-parsing.d.ts +18 -0
- package/dist/cjs/email/parsing/header-parsing.js +42 -0
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -0
- package/dist/cjs/email/parsing/message-extraction.d.cts +4 -0
- package/dist/cjs/email/parsing/message-extraction.d.ts +4 -0
- package/dist/cjs/email/parsing/message-extraction.js +192 -0
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -0
- package/dist/cjs/email/parsing/message-mapping.d.cts +21 -0
- package/dist/cjs/email/parsing/message-mapping.d.ts +21 -0
- package/dist/cjs/email/parsing/message-mapping.js +47 -0
- package/dist/cjs/email/parsing/message-mapping.js.map +1 -0
- package/dist/cjs/email/querying/execute-query.d.cts +20 -0
- package/dist/cjs/email/querying/execute-query.d.ts +20 -0
- package/dist/cjs/email/querying/execute-query.js +268 -0
- package/dist/cjs/email/querying/execute-query.js.map +1 -0
- package/dist/cjs/email/querying/query-builder.d.cts +32 -0
- package/dist/cjs/email/querying/query-builder.d.ts +32 -0
- package/dist/cjs/email/querying/query-builder.js +528 -0
- package/dist/cjs/email/querying/query-builder.js.map +1 -0
- package/dist/cjs/email/querying/search-execution.d.cts +24 -0
- package/dist/cjs/email/querying/search-execution.d.ts +24 -0
- package/dist/cjs/email/querying/search-execution.js +261 -0
- package/dist/cjs/email/querying/search-execution.js.map +1 -0
- package/dist/cjs/index.d.cts +8 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +314 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/create-store.d.cts +2 -0
- package/dist/cjs/lib/create-store.d.ts +2 -0
- package/dist/cjs/lib/create-store.js +166 -0
- package/dist/cjs/lib/create-store.js.map +1 -0
- package/dist/cjs/lib/messages-to-row.d.cts +39 -0
- package/dist/cjs/lib/messages-to-row.d.ts +39 -0
- package/dist/cjs/lib/messages-to-row.js +177 -0
- package/dist/cjs/lib/messages-to-row.js.map +1 -0
- package/dist/cjs/lib/outlook/index.d.cts +7 -0
- package/dist/cjs/lib/outlook/index.d.ts +7 -0
- package/dist/cjs/lib/outlook/index.js +56 -0
- package/dist/cjs/lib/outlook/index.js.map +1 -0
- package/dist/cjs/lib/outlook/types.d.cts +22 -0
- package/dist/cjs/lib/outlook/types.d.ts +22 -0
- package/dist/cjs/lib/outlook/types.js +6 -0
- package/dist/cjs/lib/outlook/types.js.map +1 -0
- package/dist/cjs/mcp/index.d.cts +3 -0
- package/dist/cjs/mcp/index.d.ts +3 -0
- package/dist/cjs/mcp/index.js +66 -0
- package/dist/cjs/mcp/index.js.map +1 -0
- package/dist/cjs/mcp/prompts/draft-email.d.cts +30 -0
- package/dist/cjs/mcp/prompts/draft-email.d.ts +30 -0
- package/dist/cjs/mcp/prompts/draft-email.js +184 -0
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -0
- package/dist/cjs/mcp/prompts/index.d.cts +2 -0
- package/dist/cjs/mcp/prompts/index.d.ts +2 -0
- package/dist/cjs/mcp/prompts/index.js +26 -0
- package/dist/cjs/mcp/prompts/index.js.map +1 -0
- package/dist/cjs/mcp/prompts/query-syntax.d.cts +19 -0
- package/dist/cjs/mcp/prompts/query-syntax.d.ts +19 -0
- package/dist/cjs/mcp/prompts/query-syntax.js +169 -0
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -0
- package/dist/cjs/mcp/resources/email.d.cts +11 -0
- package/dist/cjs/mcp/resources/email.d.ts +11 -0
- package/dist/cjs/mcp/resources/email.js +233 -0
- package/dist/cjs/mcp/resources/email.js.map +1 -0
- package/dist/cjs/mcp/resources/index.d.cts +1 -0
- package/dist/cjs/mcp/resources/index.d.ts +1 -0
- package/dist/cjs/mcp/resources/index.js +17 -0
- package/dist/cjs/mcp/resources/index.js.map +1 -0
- package/dist/cjs/mcp/tools/categories-list.d.cts +96 -0
- package/dist/cjs/mcp/tools/categories-list.d.ts +96 -0
- package/dist/cjs/mcp/tools/categories-list.js +252 -0
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -0
- package/dist/cjs/mcp/tools/index.d.cts +11 -0
- package/dist/cjs/mcp/tools/index.d.ts +11 -0
- package/dist/cjs/mcp/tools/index.js +62 -0
- package/dist/cjs/mcp/tools/index.js.map +1 -0
- package/dist/cjs/mcp/tools/label-add.d.cts +44 -0
- package/dist/cjs/mcp/tools/label-add.d.ts +44 -0
- package/dist/cjs/mcp/tools/label-add.js +249 -0
- package/dist/cjs/mcp/tools/label-add.js.map +1 -0
- package/dist/cjs/mcp/tools/label-delete.d.cts +54 -0
- package/dist/cjs/mcp/tools/label-delete.d.ts +54 -0
- package/dist/cjs/mcp/tools/label-delete.js +497 -0
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -0
- package/dist/cjs/mcp/tools/labels-list.d.cts +96 -0
- package/dist/cjs/mcp/tools/labels-list.d.ts +96 -0
- package/dist/cjs/mcp/tools/labels-list.js +252 -0
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -0
- package/dist/cjs/mcp/tools/message-get.d.cts +110 -0
- package/dist/cjs/mcp/tools/message-get.d.ts +110 -0
- package/dist/cjs/mcp/tools/message-get.js +289 -0
- package/dist/cjs/mcp/tools/message-get.js.map +1 -0
- package/dist/cjs/mcp/tools/message-mark-read.d.cts +42 -0
- package/dist/cjs/mcp/tools/message-mark-read.d.ts +42 -0
- package/dist/cjs/mcp/tools/message-mark-read.js +254 -0
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.d.cts +54 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +54 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.js +460 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -0
- package/dist/cjs/mcp/tools/message-respond.d.cts +52 -0
- package/dist/cjs/mcp/tools/message-respond.d.ts +52 -0
- package/dist/cjs/mcp/tools/message-respond.js +263 -0
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -0
- package/dist/cjs/mcp/tools/message-search.d.cts +138 -0
- package/dist/cjs/mcp/tools/message-search.d.ts +138 -0
- package/dist/cjs/mcp/tools/message-search.js +408 -0
- package/dist/cjs/mcp/tools/message-search.js.map +1 -0
- package/dist/cjs/mcp/tools/message-send.d.cts +66 -0
- package/dist/cjs/mcp/tools/message-send.d.ts +66 -0
- package/dist/cjs/mcp/tools/message-send.js +298 -0
- package/dist/cjs/mcp/tools/message-send.js.map +1 -0
- package/dist/cjs/mcp/tools/messages-export-csv.d.cts +72 -0
- package/dist/cjs/mcp/tools/messages-export-csv.d.ts +72 -0
- package/dist/cjs/mcp/tools/messages-export-csv.js +540 -0
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schemas/index.d.cts +2 -0
- package/dist/cjs/schemas/index.d.ts +2 -0
- package/dist/cjs/schemas/index.js +20 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/schemas/outlook-query-schema.d.cts +53 -0
- package/dist/cjs/schemas/outlook-query-schema.d.ts +53 -0
- package/dist/cjs/schemas/outlook-query-schema.js +115 -0
- package/dist/cjs/schemas/outlook-query-schema.js.map +1 -0
- package/dist/cjs/schemas/outlook-validation.d.cts +428 -0
- package/dist/cjs/schemas/outlook-validation.d.ts +428 -0
- package/dist/cjs/schemas/outlook-validation.js +420 -0
- package/dist/cjs/schemas/outlook-validation.js.map +1 -0
- package/dist/cjs/setup/config.d.cts +50 -0
- package/dist/cjs/setup/config.d.ts +50 -0
- package/dist/cjs/setup/config.js +217 -0
- package/dist/cjs/setup/config.js.map +1 -0
- package/dist/cjs/setup/http.d.cts +8 -0
- package/dist/cjs/setup/http.d.ts +8 -0
- package/dist/cjs/setup/http.js +267 -0
- package/dist/cjs/setup/http.js.map +1 -0
- package/dist/cjs/setup/index.d.cts +5 -0
- package/dist/cjs/setup/index.d.ts +5 -0
- package/dist/cjs/setup/index.js +46 -0
- package/dist/cjs/setup/index.js.map +1 -0
- package/dist/cjs/setup/oauth-microsoft.d.cts +43 -0
- package/dist/cjs/setup/oauth-microsoft.d.ts +43 -0
- package/dist/cjs/setup/oauth-microsoft.js +366 -0
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -0
- package/dist/cjs/setup/runtime.d.cts +11 -0
- package/dist/cjs/setup/runtime.d.ts +11 -0
- package/dist/cjs/setup/runtime.js +489 -0
- package/dist/cjs/setup/runtime.js.map +1 -0
- package/dist/cjs/setup/stdio.d.cts +7 -0
- package/dist/cjs/setup/stdio.d.ts +7 -0
- package/dist/cjs/setup/stdio.js +239 -0
- package/dist/cjs/setup/stdio.js.map +1 -0
- package/dist/cjs/types.d.cts +54 -0
- package/dist/cjs/types.d.ts +54 -0
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/constants.d.ts +10 -0
- package/dist/esm/constants.js +13 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/email/composition/outlook-message-builder.d.ts +36 -0
- package/dist/esm/email/composition/outlook-message-builder.js +46 -0
- package/dist/esm/email/composition/outlook-message-builder.js.map +1 -0
- package/dist/esm/email/messages/messages.d.ts +7 -0
- package/dist/esm/email/messages/messages.js +42 -0
- package/dist/esm/email/messages/messages.js.map +1 -0
- package/dist/esm/email/parsing/header-parsing.d.ts +18 -0
- package/dist/esm/email/parsing/header-parsing.js +18 -0
- package/dist/esm/email/parsing/header-parsing.js.map +1 -0
- package/dist/esm/email/parsing/message-extraction.d.ts +4 -0
- package/dist/esm/email/parsing/message-extraction.js +26 -0
- package/dist/esm/email/parsing/message-extraction.js.map +1 -0
- package/dist/esm/email/parsing/message-mapping.d.ts +21 -0
- package/dist/esm/email/parsing/message-mapping.js +35 -0
- package/dist/esm/email/parsing/message-mapping.js.map +1 -0
- package/dist/esm/email/querying/execute-query.d.ts +20 -0
- package/dist/esm/email/querying/execute-query.js +48 -0
- package/dist/esm/email/querying/execute-query.js.map +1 -0
- package/dist/esm/email/querying/query-builder.d.ts +32 -0
- package/dist/esm/email/querying/query-builder.js +424 -0
- package/dist/esm/email/querying/query-builder.js.map +1 -0
- package/dist/esm/email/querying/search-execution.d.ts +24 -0
- package/dist/esm/email/querying/search-execution.js +96 -0
- package/dist/esm/email/querying/search-execution.js.map +1 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/create-store.d.ts +2 -0
- package/dist/esm/lib/create-store.js +6 -0
- package/dist/esm/lib/create-store.js.map +1 -0
- package/dist/esm/lib/messages-to-row.d.ts +39 -0
- package/dist/esm/lib/messages-to-row.js +141 -0
- package/dist/esm/lib/messages-to-row.js.map +1 -0
- package/dist/esm/lib/outlook/index.d.ts +7 -0
- package/dist/esm/lib/outlook/index.js +7 -0
- package/dist/esm/lib/outlook/index.js.map +1 -0
- package/dist/esm/lib/outlook/types.d.ts +22 -0
- package/dist/esm/lib/outlook/types.js +2 -0
- package/dist/esm/lib/outlook/types.js.map +1 -0
- package/dist/esm/mcp/index.d.ts +3 -0
- package/dist/esm/mcp/index.js +6 -0
- package/dist/esm/mcp/index.js.map +1 -0
- package/dist/esm/mcp/prompts/draft-email.d.ts +30 -0
- package/dist/esm/mcp/prompts/draft-email.js +37 -0
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -0
- package/dist/esm/mcp/prompts/index.d.ts +2 -0
- package/dist/esm/mcp/prompts/index.js +2 -0
- package/dist/esm/mcp/prompts/index.js.map +1 -0
- package/dist/esm/mcp/prompts/query-syntax.d.ts +19 -0
- package/dist/esm/mcp/prompts/query-syntax.js +75 -0
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -0
- package/dist/esm/mcp/resources/email.d.ts +11 -0
- package/dist/esm/mcp/resources/email.js +69 -0
- package/dist/esm/mcp/resources/email.js.map +1 -0
- package/dist/esm/mcp/resources/index.d.ts +1 -0
- package/dist/esm/mcp/resources/index.js +1 -0
- package/dist/esm/mcp/resources/index.js.map +1 -0
- package/dist/esm/mcp/tools/categories-list.d.ts +96 -0
- package/dist/esm/mcp/tools/categories-list.js +78 -0
- package/dist/esm/mcp/tools/categories-list.js.map +1 -0
- package/dist/esm/mcp/tools/index.d.ts +11 -0
- package/dist/esm/mcp/tools/index.js +11 -0
- package/dist/esm/mcp/tools/index.js.map +1 -0
- package/dist/esm/mcp/tools/label-add.d.ts +44 -0
- package/dist/esm/mcp/tools/label-add.js +75 -0
- package/dist/esm/mcp/tools/label-add.js.map +1 -0
- package/dist/esm/mcp/tools/label-delete.d.ts +54 -0
- package/dist/esm/mcp/tools/label-delete.js +166 -0
- package/dist/esm/mcp/tools/label-delete.js.map +1 -0
- package/dist/esm/mcp/tools/labels-list.d.ts +96 -0
- package/dist/esm/mcp/tools/labels-list.js +78 -0
- package/dist/esm/mcp/tools/labels-list.js.map +1 -0
- package/dist/esm/mcp/tools/message-get.d.ts +110 -0
- package/dist/esm/mcp/tools/message-get.js +117 -0
- package/dist/esm/mcp/tools/message-get.js.map +1 -0
- package/dist/esm/mcp/tools/message-mark-read.d.ts +42 -0
- package/dist/esm/mcp/tools/message-mark-read.js +80 -0
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -0
- package/dist/esm/mcp/tools/message-move-to-trash.d.ts +54 -0
- package/dist/esm/mcp/tools/message-move-to-trash.js +177 -0
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -0
- package/dist/esm/mcp/tools/message-respond.d.ts +52 -0
- package/dist/esm/mcp/tools/message-respond.js +89 -0
- package/dist/esm/mcp/tools/message-respond.js.map +1 -0
- package/dist/esm/mcp/tools/message-search.d.ts +138 -0
- package/dist/esm/mcp/tools/message-search.js +184 -0
- package/dist/esm/mcp/tools/message-search.js.map +1 -0
- package/dist/esm/mcp/tools/message-send.d.ts +66 -0
- package/dist/esm/mcp/tools/message-send.js +111 -0
- package/dist/esm/mcp/tools/message-send.js.map +1 -0
- package/dist/esm/mcp/tools/messages-export-csv.d.ts +72 -0
- package/dist/esm/mcp/tools/messages-export-csv.js +273 -0
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schemas/index.d.ts +2 -0
- package/dist/esm/schemas/index.js +2 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/schemas/outlook-query-schema.d.ts +53 -0
- package/dist/esm/schemas/outlook-query-schema.js +63 -0
- package/dist/esm/schemas/outlook-query-schema.js.map +1 -0
- package/dist/esm/schemas/outlook-validation.d.ts +428 -0
- package/dist/esm/schemas/outlook-validation.js +388 -0
- package/dist/esm/schemas/outlook-validation.js.map +1 -0
- package/dist/esm/setup/config.d.ts +50 -0
- package/dist/esm/setup/config.js +180 -0
- package/dist/esm/setup/config.js.map +1 -0
- package/dist/esm/setup/http.d.ts +8 -0
- package/dist/esm/setup/http.js +61 -0
- package/dist/esm/setup/http.js.map +1 -0
- package/dist/esm/setup/index.d.ts +5 -0
- package/dist/esm/setup/index.js +5 -0
- package/dist/esm/setup/index.js.map +1 -0
- package/dist/esm/setup/oauth-microsoft.d.ts +43 -0
- package/dist/esm/setup/oauth-microsoft.js +169 -0
- package/dist/esm/setup/oauth-microsoft.js.map +1 -0
- package/dist/esm/setup/runtime.d.ts +11 -0
- package/dist/esm/setup/runtime.js +115 -0
- package/dist/esm/setup/runtime.js.map +1 -0
- package/dist/esm/setup/stdio.d.ts +7 -0
- package/dist/esm/setup/stdio.js +38 -0
- package/dist/esm/setup/stdio.js.map +1 -0
- package/dist/esm/types.d.ts +54 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/email/querying/query-builder.ts"],"sourcesContent":["import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.js';\n\ntype FieldOperator = {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n};\n\ntype DateOperator = {\n $gte?: string;\n $lt?: string;\n};\n\ntype FieldQuery = {\n from?: FieldOperator | string;\n to?: FieldOperator | string;\n cc?: FieldOperator | string;\n bcc?: FieldOperator | string;\n subject?: FieldOperator | string;\n text?: FieldOperator | string;\n body?: FieldOperator | string;\n categories?: FieldOperator | string;\n label?: FieldOperator | string;\n};\n\n/**\n * Outlook category mappings - case insensitive input to exact system categories\n * Note: These are user-defined categories in Outlook, not system categories like Gmail\n */\nconst OUTLOOK_CATEGORIES = {\n personal: 'Personal',\n work: 'Work',\n family: 'Family',\n travel: 'Travel',\n important: 'Important',\n urgent: 'Urgent',\n} as const;\n\n/**\n * Validate and map category name to Outlook system category\n * Throws error for invalid categories (fail fast principle)\n */\nfunction mapOutlookCategory(category: string): string {\n // Input validation - fail fast on invalid input\n if (!category || typeof category !== 'string') {\n throw new Error(`Invalid category: expected non-empty string, got ${typeof category}`);\n }\n\n const trimmed = category.trim();\n if (trimmed === '') {\n throw new Error('Invalid category: empty string after trimming');\n }\n\n // Fail fast on unknown categories\n const normalizedCategory = trimmed.toLowerCase();\n const systemCategory = OUTLOOK_CATEGORIES[normalizedCategory as keyof typeof OUTLOOK_CATEGORIES];\n\n if (!systemCategory) {\n throw new Error(`Invalid Outlook category: \"${category}\". Valid categories: ${Object.keys(OUTLOOK_CATEGORIES).join(', ')}`);\n }\n\n return systemCategory;\n}\n\nexport interface ODataFilterResult {\n search: string | null;\n filter: string | null;\n requireBodyClientFilter: boolean;\n}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n let requireBodyClientFilter = false;\n\n function L(s: string) {\n // Microsoft Graph does NOT support toLower() function in OData filters\n // Case-insensitive matching must be done client-side or via $search\n return s;\n }\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n // Graph may reject functions on nested properties; use equality on nested address/name fields.\n const left = `r/emailAddress/address eq ${V}`;\n const right = `r/emailAddress/name eq ${V}`;\n return `${coll}/any(r: ${left} or ${right})`;\n }\n\n function fv(field: string, raw: string | number | boolean | null | undefined): string {\n if (raw == null) return '';\n const rawStr = String(raw);\n\n // For text and body fields, skip OData filtering entirely (uses KQL search instead)\n // Do this BEFORE validation so we don't throw on valid text/body queries\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n requireBodyClientFilter = true;\n return '';\n }\n\n // For all other fields, validate non-empty AFTER checking for null\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n\n const V = `'${rawStr.toLowerCase().replace(/'/g, \"''\")}'`;\n switch (field) {\n case 'from': {\n // For email addresses emit equality checks on nested address/name;\n // for name-only tokens, skip server-side filter (handled client-side or via $search).\n if (rawStr.includes('@')) {\n const addrEq = `${L('from/emailAddress/address')} eq ${V}`;\n const nameEq = `${L('from/emailAddress/name')} eq ${V}`;\n return p(`${addrEq} or ${nameEq}`);\n }\n // Don't emit a server-side filter for name-only 'from' tokens.\n return '';\n }\n case 'to':\n return recip('toRecipients', V);\n case 'cc':\n return recip('ccRecipients', V);\n case 'bcc':\n return recip('bccRecipients', V);\n case 'subject':\n // Microsoft Graph does NOT support contains() function in OData filters\n // Use startswith as a partial alternative or rely on $search\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n // mapOutlookCategory will throw on invalid input (fail fast)\n const systemCategory = mapOutlookCategory(rawStr);\n // Use the categories OData property with exact case-sensitive match\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label': {\n // Direct passthrough to categories for Outlook (case-sensitive)\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n }\n default:\n // Microsoft Graph does NOT support contains() function\n // For unknown fields, skip server-side filtering\n return '';\n }\n }\n\n function chain(op: 'and' | 'or', arr: Array<string | undefined>) {\n if (!arr || arr.length === 0) {\n throw new Error(`chain: empty array for ${op} operation`);\n }\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return String(first);\n }\n const joined = arr.join(` ${op} `);\n return p(joined);\n }\n function fieldExpr(field: string, op: FieldOperator | string): string {\n if (typeof op === 'string') {\n return fv(field, op);\n }\n\n if (Array.isArray(op.$any)) {\n const results = op.$any.map((v) => fv(field, String(v ?? '')));\n // Filter out empty strings (from fields like text/body that don't generate OData filters)\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('or', validResults);\n }\n if (Array.isArray(op.$all)) {\n const results = op.$all.map((v) => fv(field, String(v ?? '')));\n // Filter out empty strings (from fields like text/body that don't generate OData filters)\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('and', validResults);\n }\n if (Array.isArray(op.$none)) {\n const results = op.$none.map((v) => fv(field, String(v ?? '')));\n // Filter out empty strings (from fields like text/body that don't generate OData filters)\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return `not ${p(chain('or', validResults))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: DateOperator): string {\n const parts: string[] = [];\n if (d.$gte) parts.push(`receivedDateTime ge ${d.$gte}T00:00:00Z`);\n if (d.$lt) parts.push(`receivedDateTime lt ${d.$lt}T00:00:00Z`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function emit(n: QueryNode): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && n.$and) {\n const andParts = n.$and.map(emit).filter((part: string): part is string => Boolean(part));\n if (andParts.length === 0) return '';\n if (andParts.length === 1) {\n const firstPart = andParts[0];\n return firstPart ?? '';\n }\n return p(andParts.join(' and '));\n }\n if ('$or' in n && n.$or) {\n const orParts = n.$or.map(emit).filter((part: string): part is string => Boolean(part));\n if (orParts.length === 0) return '';\n if (orParts.length === 1) {\n const firstPart = orParts[0];\n return firstPart ?? '';\n }\n return p(orParts.join(' or '));\n }\n if ('$not' in n && n.$not) {\n const notExpr = emit(n.$not);\n return notExpr ? `not (${notExpr})` : '';\n }\n if ('hasAttachment' in n && n.hasAttachment) return 'hasAttachments eq true';\n if ('date' in n && n.date) return dateExpr(n.date);\n\n const keys = Object.keys(n);\n if (keys.length === 1) {\n const k0 = String(keys[0] ?? '');\n if (k0 && ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'].includes(k0)) {\n const fieldValue = (n as FieldQuery)[k0 as keyof FieldQuery];\n if (fieldValue) return fieldExpr(k0, fieldValue);\n }\n }\n return '';\n }\n\n const filterStr = emit(query);\n\n const terms: string[] = [];\n function pushTerms(arr?: string[]) {\n if (Array.isArray(arr)) for (const t of arr) if ((t ?? '').toString().trim()) terms.push(String(t).trim());\n }\n\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('exactPhrase' in node && node.exactPhrase) {\n // KQL uses double quotes for exact phrase matching\n pushTerms([`\"${String(node.exactPhrase).replace(/\"/g, '\\\\\"')}\"`]);\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n pushTerms([node.subject]);\n } else {\n pushTerms(node.subject.$any);\n pushTerms(node.subject.$all);\n pushTerms(node.subject.$none);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n pushTerms([node.body]);\n } else {\n pushTerms(node.body.$any);\n pushTerms(node.body.$all);\n pushTerms(node.body.$none);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n pushTerms([node.text]);\n } else {\n pushTerms(node.text.$any);\n pushTerms(node.text.$all);\n pushTerms(node.text.$none);\n }\n }\n }\n walk(query);\n\n /**\n * Escape KQL (Keyword Query Language) special characters in search terms.\n * KQL special characters that need escaping: \\ : ( ) { } [ ] \" * ? < > - _\n * According to Microsoft Graph KQL syntax, these must be escaped with backslash.\n */\n function escapeKQL(term: string): string {\n if (!term) return term;\n // Escape backslash first, then other special characters\n return term\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/:/g, '\\\\:')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\{/g, '\\\\{')\n .replace(/\\}/g, '\\\\}')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\?/g, '\\\\?')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/-/g, '\\\\-')\n .replace(/_/g, '\\\\_');\n }\n\n const mapped = terms.map((t) => {\n const escaped = escapeKQL(String(t));\n return escaped;\n });\n const search = mapped.length ? mapped.join(' OR ') : null;\n\n return { search, filter: filterStr && typeof filterStr === 'string' && filterStr.length ? filterStr : null, requireBodyClientFilter };\n}\n\nexport function toOutlookFilter(parsed: QueryNode, _options?: { includeBodyContent?: boolean; useCaseInsensitiveWrap?: boolean }) {\n const graphResult = toGraphFilter(parsed);\n const filters = extractOutlookFilters(parsed);\n return {\n filter: graphResult.filter,\n search: graphResult.search,\n requireBodyClientFilter: graphResult.requireBodyClientFilter,\n filters,\n };\n}\n\ninterface ExtractedFilters {\n subjectIncludes: string[];\n bodyIncludes: string[];\n textIncludes: string[];\n fromIncludes: string[];\n toIncludes: string[];\n ccIncludes: string[];\n bccIncludes: string[];\n categoriesIncludes: string[];\n labelIncludes: string[];\n hasAttachment?: boolean;\n since?: string;\n before?: string;\n}\n\nexport function extractOutlookFilters(parsed: QueryNode): ExtractedFilters {\n const filters: ExtractedFilters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n fromIncludes: [],\n toIncludes: [],\n ccIncludes: [],\n bccIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('hasAttachment' in node && node.hasAttachment !== undefined) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node && node.date) {\n if (node.date.$gte) filters.since = node.date.$gte;\n if (node.date.$lt) filters.before = node.date.$lt;\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n filters.subjectIncludes.push(node.subject);\n } else {\n if (node.subject.$any) filters.subjectIncludes.push(...node.subject.$any);\n if (node.subject.$all) filters.subjectIncludes.push(...node.subject.$all);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n filters.bodyIncludes.push(node.body);\n } else {\n if (node.body.$any) filters.bodyIncludes.push(...node.body.$any);\n if (node.body.$all) filters.bodyIncludes.push(...node.body.$all);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n filters.textIncludes.push(node.text);\n filters.bodyIncludes.push(node.text);\n } else {\n if (node.text.$any) {\n filters.textIncludes.push(...node.text.$any);\n filters.bodyIncludes.push(...node.text.$any);\n }\n if (node.text.$all) {\n filters.textIncludes.push(...node.text.$all);\n filters.bodyIncludes.push(...node.text.$all);\n }\n }\n }\n if ('from' in node && node.from) {\n if (typeof node.from === 'string') {\n filters.fromIncludes.push(node.from);\n } else {\n if (node.from.$any) filters.fromIncludes.push(...node.from.$any);\n if (node.from.$all) filters.fromIncludes.push(...node.from.$all);\n }\n }\n if ('to' in node && node.to) {\n if (typeof node.to === 'string') {\n filters.toIncludes.push(node.to);\n } else {\n if (node.to.$any) filters.toIncludes.push(...node.to.$any);\n if (node.to.$all) filters.toIncludes.push(...node.to.$all);\n }\n }\n if ('cc' in node && node.cc) {\n if (typeof node.cc === 'string') {\n filters.ccIncludes.push(node.cc);\n } else {\n if (node.cc.$any) filters.ccIncludes.push(...node.cc.$any);\n if (node.cc.$all) filters.ccIncludes.push(...node.cc.$all);\n }\n }\n if ('bcc' in node && node.bcc) {\n if (typeof node.bcc === 'string') {\n filters.bccIncludes.push(node.bcc);\n } else {\n if (node.bcc.$any) filters.bccIncludes.push(...node.bcc.$any);\n if (node.bcc.$all) filters.bccIncludes.push(...node.bcc.$all);\n }\n }\n if ('categories' in node && node.categories) {\n if (typeof node.categories === 'string') {\n if (mapOutlookCategory(node.categories) !== null) {\n filters.categoriesIncludes.push(node.categories);\n }\n } else {\n // Filter out invalid categories to prevent memory leaks and maintain clean state\n if (node.categories.$any) {\n const validCategories = node.categories.$any.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$all) {\n const validCategories = node.categories.$all.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$none) {\n const validCategories = node.categories.$none.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n }\n }\n if ('label' in node && node.label) {\n if (typeof node.label === 'string') {\n filters.labelIncludes.push(node.label);\n } else {\n if (node.label.$any) filters.labelIncludes.push(...node.label.$any);\n if (node.label.$all) filters.labelIncludes.push(...node.label.$all);\n if (node.label.$none) filters.labelIncludes.push(...node.label.$none);\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["OUTLOOK_CATEGORIES","personal","work","family","travel","important","urgent","mapOutlookCategory","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","toGraphFilter","query","requireBodyClientFilter","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","String","replace","includes","addrEq","nameEq","length","chain","op","arr","first","joined","fieldExpr","Array","isArray","$any","results","map","v","validResults","filter","$all","$none","JSON","stringify","dateExpr","d","parts","$gte","push","$lt","emit","n","$and","andParts","part","Boolean","firstPart","$or","orParts","$not","notExpr","hasAttachment","date","k0","fieldValue","filterStr","terms","pushTerms","t","toString","walk","node","forEach","exactPhrase","subject","body","text","escapeKQL","term","mapped","escaped","search","toOutlookFilter","parsed","_options","graphResult","filters","extractOutlookFilters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Client } from '@microsoft/microsoft-graph-client';
|
|
2
|
+
import type { Message } from '@microsoft/microsoft-graph-types';
|
|
3
|
+
import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.js';
|
|
4
|
+
import type { Logger } from '../../types.js';
|
|
5
|
+
export interface OutlookSearchOptions {
|
|
6
|
+
query?: QueryNode;
|
|
7
|
+
limit?: number;
|
|
8
|
+
includeBody?: boolean;
|
|
9
|
+
maxPages?: number | null;
|
|
10
|
+
pageSize?: number;
|
|
11
|
+
pageToken?: string | undefined;
|
|
12
|
+
logger: Logger;
|
|
13
|
+
}
|
|
14
|
+
export interface OutlookSearchResult {
|
|
15
|
+
messages: Message[];
|
|
16
|
+
nextPageToken?: string | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Execute a direct Microsoft Graph API query.
|
|
20
|
+
* Single attempt with no fallbacks or retries.
|
|
21
|
+
* Errors are returned directly for actionable feedback.
|
|
22
|
+
* Returns raw Graph API Message objects for transformation by caller.
|
|
23
|
+
*/
|
|
24
|
+
export declare function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { toGraphFilter } from './query-builder.js';
|
|
2
|
+
function buildGraphQuery(query) {
|
|
3
|
+
var _r_search, _r_filter;
|
|
4
|
+
if (!query) return {};
|
|
5
|
+
const r = toGraphFilter(query) || {
|
|
6
|
+
search: undefined,
|
|
7
|
+
filter: undefined
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
search: (_r_search = r.search) !== null && _r_search !== void 0 ? _r_search : undefined,
|
|
11
|
+
filter: (_r_filter = r.filter) !== null && _r_filter !== void 0 ? _r_filter : undefined
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Execute a direct Microsoft Graph API query.
|
|
16
|
+
* Single attempt with no fallbacks or retries.
|
|
17
|
+
* Errors are returned directly for actionable feedback.
|
|
18
|
+
* Returns raw Graph API Message objects for transformation by caller.
|
|
19
|
+
*/ export async function searchMessages(graph, opts) {
|
|
20
|
+
const { query, includeBody = false, pageSize = 50, pageToken, logger } = opts;
|
|
21
|
+
const { search, filter } = buildGraphQuery(query);
|
|
22
|
+
let request = graph.api('/me/messages');
|
|
23
|
+
if (search) {
|
|
24
|
+
request = request.search(search);
|
|
25
|
+
}
|
|
26
|
+
if (filter) {
|
|
27
|
+
request = request.filter(filter);
|
|
28
|
+
}
|
|
29
|
+
request = request.top(Math.min(pageSize, 1000)); // Graph API max is 1000
|
|
30
|
+
const selectFields = includeBody ? [
|
|
31
|
+
'id',
|
|
32
|
+
'conversationId',
|
|
33
|
+
'receivedDateTime',
|
|
34
|
+
'subject',
|
|
35
|
+
'bodyPreview',
|
|
36
|
+
'body',
|
|
37
|
+
'from',
|
|
38
|
+
'toRecipients',
|
|
39
|
+
'ccRecipients',
|
|
40
|
+
'bccRecipients'
|
|
41
|
+
] : [
|
|
42
|
+
'id',
|
|
43
|
+
'conversationId',
|
|
44
|
+
'receivedDateTime',
|
|
45
|
+
'subject',
|
|
46
|
+
'bodyPreview',
|
|
47
|
+
'from',
|
|
48
|
+
'toRecipients',
|
|
49
|
+
'ccRecipients',
|
|
50
|
+
'bccRecipients'
|
|
51
|
+
];
|
|
52
|
+
request = request.select(selectFields.join(','));
|
|
53
|
+
if (pageToken && pageToken.trim().length > 0) {
|
|
54
|
+
request = request.skipToken(pageToken);
|
|
55
|
+
}
|
|
56
|
+
logger.info('Executing direct Outlook query', {
|
|
57
|
+
hasSearch: !!search,
|
|
58
|
+
hasFilter: !!filter,
|
|
59
|
+
pageSize,
|
|
60
|
+
hasPageToken: !!pageToken
|
|
61
|
+
});
|
|
62
|
+
try {
|
|
63
|
+
// Execute the request
|
|
64
|
+
const response = await request.get();
|
|
65
|
+
// Extract messages and nextLink
|
|
66
|
+
const messages = response.value || [];
|
|
67
|
+
const nextLink = response['@odata.nextLink'];
|
|
68
|
+
// Extract skipToken from nextLink if present
|
|
69
|
+
let nextPageToken;
|
|
70
|
+
if (nextLink) {
|
|
71
|
+
try {
|
|
72
|
+
const url = new URL(nextLink);
|
|
73
|
+
nextPageToken = url.searchParams.get('$skiptoken') || undefined;
|
|
74
|
+
} catch {
|
|
75
|
+
logger.info('Failed to parse nextLink for skipToken', {
|
|
76
|
+
nextLink
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
logger.info(`Query succeeded with ${messages.length} results`, {
|
|
81
|
+
hasNextPage: !!nextPageToken
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
messages,
|
|
85
|
+
nextPageToken
|
|
86
|
+
};
|
|
87
|
+
} catch (error) {
|
|
88
|
+
// Log and re-throw error directly - no fallback logic
|
|
89
|
+
logger.error('Outlook query failed', {
|
|
90
|
+
error: error instanceof Error ? error.message : String(error),
|
|
91
|
+
hasSearch: !!search,
|
|
92
|
+
hasFilter: !!filter
|
|
93
|
+
});
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/email/querying/search-execution.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { Message } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.js';\nimport type { Logger } from '../../types.js';\nimport { toGraphFilter } from './query-builder.js';\n\nexport interface OutlookSearchOptions {\n query?: QueryNode;\n limit?: number;\n includeBody?: boolean;\n maxPages?: number | null;\n pageSize?: number;\n pageToken?: string | undefined;\n logger: Logger;\n}\n\nexport interface OutlookSearchResult {\n messages: Message[];\n nextPageToken?: string | undefined;\n}\n\nfunction buildGraphQuery(query: QueryNode | undefined): {\n search?: string | undefined;\n filter?: string | undefined;\n} {\n if (!query) return {};\n const r = toGraphFilter(query) || { search: undefined, filter: undefined };\n return { search: r.search ?? undefined, filter: r.filter ?? undefined };\n}\n\n/**\n * Execute a direct Microsoft Graph API query.\n * Single attempt with no fallbacks or retries.\n * Errors are returned directly for actionable feedback.\n * Returns raw Graph API Message objects for transformation by caller.\n */\nexport async function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult> {\n const { query, includeBody = false, pageSize = 50, pageToken, logger } = opts;\n\n const { search, filter } = buildGraphQuery(query);\n\n let request = graph.api('/me/messages');\n\n if (search) {\n request = request.search(search);\n }\n\n if (filter) {\n request = request.filter(filter);\n }\n\n request = request.top(Math.min(pageSize, 1000)); // Graph API max is 1000\n\n const selectFields = includeBody ? ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'body', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'] : ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'];\n request = request.select(selectFields.join(','));\n\n if (pageToken && pageToken.trim().length > 0) {\n request = request.skipToken(pageToken);\n }\n\n logger.info('Executing direct Outlook query', {\n hasSearch: !!search,\n hasFilter: !!filter,\n pageSize,\n hasPageToken: !!pageToken,\n });\n\n try {\n // Execute the request\n const response = await request.get();\n\n // Extract messages and nextLink\n const messages: Message[] = response.value || [];\n const nextLink: string | undefined = response['@odata.nextLink'];\n\n // Extract skipToken from nextLink if present\n let nextPageToken: string | undefined;\n if (nextLink) {\n try {\n const url = new URL(nextLink);\n nextPageToken = url.searchParams.get('$skiptoken') || undefined;\n } catch {\n logger.info('Failed to parse nextLink for skipToken', { nextLink });\n }\n }\n\n logger.info(`Query succeeded with ${messages.length} results`, {\n hasNextPage: !!nextPageToken,\n });\n\n return {\n messages,\n nextPageToken,\n };\n } catch (error) {\n // Log and re-throw error directly - no fallback logic\n logger.error('Outlook query failed', {\n error: error instanceof Error ? error.message : String(error),\n hasSearch: !!search,\n hasFilter: !!filter,\n });\n throw error;\n }\n}\n"],"names":["toGraphFilter","buildGraphQuery","query","r","search","undefined","filter","searchMessages","graph","opts","includeBody","pageSize","pageToken","logger","request","api","top","Math","min","selectFields","select","join","trim","length","skipToken","info","hasSearch","hasFilter","hasPageToken","response","get","messages","value","nextLink","nextPageToken","url","URL","searchParams","hasNextPage","error","Error","message","String"],"mappings":"AAIA,SAASA,aAAa,QAAQ,qBAAqB;AAiBnD,SAASC,gBAAgBC,KAA4B;QAMlCC,WAA+BA;IAFhD,IAAI,CAACD,OAAO,OAAO,CAAC;IACpB,MAAMC,IAAIH,cAAcE,UAAU;QAAEE,QAAQC;QAAWC,QAAQD;IAAU;IACzE,OAAO;QAAED,MAAM,GAAED,YAAAA,EAAEC,MAAM,cAARD,uBAAAA,YAAYE;QAAWC,MAAM,GAAEH,YAAAA,EAAEG,MAAM,cAARH,uBAAAA,YAAYE;IAAU;AACxE;AAEA;;;;;CAKC,GACD,OAAO,eAAeE,eAAeC,KAAa,EAAEC,IAA0B;IAC5E,MAAM,EAAEP,KAAK,EAAEQ,cAAc,KAAK,EAAEC,WAAW,EAAE,EAAEC,SAAS,EAAEC,MAAM,EAAE,GAAGJ;IAEzE,MAAM,EAAEL,MAAM,EAAEE,MAAM,EAAE,GAAGL,gBAAgBC;IAE3C,IAAIY,UAAUN,MAAMO,GAAG,CAAC;IAExB,IAAIX,QAAQ;QACVU,UAAUA,QAAQV,MAAM,CAACA;IAC3B;IAEA,IAAIE,QAAQ;QACVQ,UAAUA,QAAQR,MAAM,CAACA;IAC3B;IAEAQ,UAAUA,QAAQE,GAAG,CAACC,KAAKC,GAAG,CAACP,UAAU,QAAQ,wBAAwB;IAEzE,MAAMQ,eAAeT,cAAc;QAAC;QAAM;QAAkB;QAAoB;QAAW;QAAe;QAAQ;QAAQ;QAAgB;QAAgB;KAAgB,GAAG;QAAC;QAAM;QAAkB;QAAoB;QAAW;QAAe;QAAQ;QAAgB;QAAgB;KAAgB;IAC5SI,UAAUA,QAAQM,MAAM,CAACD,aAAaE,IAAI,CAAC;IAE3C,IAAIT,aAAaA,UAAUU,IAAI,GAAGC,MAAM,GAAG,GAAG;QAC5CT,UAAUA,QAAQU,SAAS,CAACZ;IAC9B;IAEAC,OAAOY,IAAI,CAAC,kCAAkC;QAC5CC,WAAW,CAAC,CAACtB;QACbuB,WAAW,CAAC,CAACrB;QACbK;QACAiB,cAAc,CAAC,CAAChB;IAClB;IAEA,IAAI;QACF,sBAAsB;QACtB,MAAMiB,WAAW,MAAMf,QAAQgB,GAAG;QAElC,gCAAgC;QAChC,MAAMC,WAAsBF,SAASG,KAAK,IAAI,EAAE;QAChD,MAAMC,WAA+BJ,QAAQ,CAAC,kBAAkB;QAEhE,6CAA6C;QAC7C,IAAIK;QACJ,IAAID,UAAU;YACZ,IAAI;gBACF,MAAME,MAAM,IAAIC,IAAIH;gBACpBC,gBAAgBC,IAAIE,YAAY,CAACP,GAAG,CAAC,iBAAiBzB;YACxD,EAAE,OAAM;gBACNQ,OAAOY,IAAI,CAAC,0CAA0C;oBAAEQ;gBAAS;YACnE;QACF;QAEApB,OAAOY,IAAI,CAAC,CAAC,qBAAqB,EAAEM,SAASR,MAAM,CAAC,QAAQ,CAAC,EAAE;YAC7De,aAAa,CAAC,CAACJ;QACjB;QAEA,OAAO;YACLH;YACAG;QACF;IACF,EAAE,OAAOK,OAAO;QACd,sDAAsD;QACtD1B,OAAO0B,KAAK,CAAC,wBAAwB;YACnCA,OAAOA,iBAAiBC,QAAQD,MAAME,OAAO,GAAGC,OAAOH;YACvDb,WAAW,CAAC,CAACtB;YACbuB,WAAW,CAAC,CAACrB;QACf;QACA,MAAMiC;IACR;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ServerConfig } from './types.js';
|
|
2
|
+
export { MS_SCOPE } from './constants.js';
|
|
3
|
+
export * as mcp from './mcp/index.js';
|
|
4
|
+
export * as schemas from './schemas/index.js';
|
|
5
|
+
export * as setup from './setup/index.js';
|
|
6
|
+
export * from './types.js';
|
|
7
|
+
export declare function startServer(config: ServerConfig): Promise<void>;
|
|
8
|
+
export default function main(): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createConfig, handleVersionHelp } from './setup/config.js';
|
|
2
|
+
import { createHTTPServer } from './setup/http.js';
|
|
3
|
+
import { createStdioServer } from './setup/stdio.js';
|
|
4
|
+
export { MS_SCOPE } from './constants.js';
|
|
5
|
+
import * as _mcp from './mcp/index.js';
|
|
6
|
+
export { _mcp as mcp };
|
|
7
|
+
import * as _schemas from './schemas/index.js';
|
|
8
|
+
export { _schemas as schemas };
|
|
9
|
+
import * as _setup from './setup/index.js';
|
|
10
|
+
export { _setup as setup };
|
|
11
|
+
export * from './types.js';
|
|
12
|
+
export async function startServer(config) {
|
|
13
|
+
const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);
|
|
14
|
+
process.on('SIGINT', async ()=>{
|
|
15
|
+
await close();
|
|
16
|
+
process.exit(0);
|
|
17
|
+
});
|
|
18
|
+
logger.info(`Server started with ${config.transport.type} transport`);
|
|
19
|
+
await new Promise(()=>{});
|
|
20
|
+
}
|
|
21
|
+
export default async function main() {
|
|
22
|
+
// Check for help/version flags FIRST, before config parsing
|
|
23
|
+
const versionHelpResult = handleVersionHelp(process.argv);
|
|
24
|
+
if (versionHelpResult.handled) {
|
|
25
|
+
console.log(versionHelpResult.output);
|
|
26
|
+
process.exit(0);
|
|
27
|
+
}
|
|
28
|
+
// Only parse config if no help/version flags
|
|
29
|
+
const config = createConfig();
|
|
30
|
+
await startServer(config);
|
|
31
|
+
}
|
|
32
|
+
if (process.argv[1] === new URL(import.meta.url).pathname) {
|
|
33
|
+
main();
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.js';\nimport { createHTTPServer } from './setup/http.js';\nimport { createStdioServer } from './setup/stdio.js';\nimport type { ServerConfig } from './types.js';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.js';\nexport * as schemas from './schemas/index.js';\nexport * as setup from './setup/index.js';\nexport * from './types.js';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["createConfig","handleVersionHelp","createHTTPServer","createStdioServer","MS_SCOPE","mcp","schemas","setup","startServer","config","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","URL","url","pathname"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,oBAAoB;AACpE,SAASC,gBAAgB,QAAQ,kBAAkB;AACnD,SAASC,iBAAiB,QAAQ,mBAAmB;AAGrD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AACtC,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAC1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGF,OAAOG,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMV,kBAAkBM,UAAU,MAAMP,iBAAiBO;IAEvHK,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAER,OAAOG,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBnB,kBAAkBa,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,6CAA6C;IAC7C,MAAMP,SAAST;IACf,MAAMQ,YAAYC;AACpB;AAEA,IAAIK,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIK,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["keyvRegistry","createStore","uri","store","Error"],"mappings":"AACA,OAAOA,kBAAkB,gBAAgB;AAEzC,eAAe,eAAeC,YAAeC,GAAW;IACtD,MAAMC,QAAQ,MAAMH,aAAgBE;IACpC,IAAI,CAACC,OAAO,MAAM,IAAIC,MAAM,CAAC,gCAAgC,EAAEF,KAAK;IACpE,OAAOC;AACT"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
interface FormatOptions {
|
|
2
|
+
body?: boolean;
|
|
3
|
+
addressFormat?: 'raw' | 'name' | 'email';
|
|
4
|
+
}
|
|
5
|
+
type MessageRow = [
|
|
6
|
+
string,
|
|
7
|
+
string,
|
|
8
|
+
string,
|
|
9
|
+
string,
|
|
10
|
+
string,
|
|
11
|
+
string,
|
|
12
|
+
string,
|
|
13
|
+
string,
|
|
14
|
+
string,
|
|
15
|
+
string,
|
|
16
|
+
string,
|
|
17
|
+
string
|
|
18
|
+
];
|
|
19
|
+
export declare function toRowFromOutlook(msg: unknown, opts?: FormatOptions): MessageRow;
|
|
20
|
+
interface ClientSideFilters {
|
|
21
|
+
subjectIncludes?: string[];
|
|
22
|
+
bodyIncludes?: string[];
|
|
23
|
+
textIncludes?: string[];
|
|
24
|
+
fromIncludes?: string[];
|
|
25
|
+
toIncludes?: string[];
|
|
26
|
+
ccIncludes?: string[];
|
|
27
|
+
bccIncludes?: string[];
|
|
28
|
+
}
|
|
29
|
+
interface FilterContent {
|
|
30
|
+
subject?: string;
|
|
31
|
+
snippetOrPreview?: string;
|
|
32
|
+
fullBody?: string;
|
|
33
|
+
from?: string;
|
|
34
|
+
to?: string;
|
|
35
|
+
cc?: string;
|
|
36
|
+
bcc?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function filterClientSide(filters: ClientSideFilters, { subject, snippetOrPreview, fullBody, from, to, cc, bcc }?: FilterContent): boolean;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';
|
|
2
|
+
// Type guard for OutlookMessage
|
|
3
|
+
function isOutlookMessage(obj) {
|
|
4
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const msg = obj;
|
|
8
|
+
if (msg.id !== undefined && typeof msg.id !== 'string') return false;
|
|
9
|
+
if (msg.conversationId !== undefined && typeof msg.conversationId !== 'string') return false;
|
|
10
|
+
if (msg.receivedDateTime !== undefined && typeof msg.receivedDateTime !== 'string') return false;
|
|
11
|
+
if (msg.subject !== undefined && typeof msg.subject !== 'string') return false;
|
|
12
|
+
if (msg.bodyPreview !== undefined && typeof msg.bodyPreview !== 'string') return false;
|
|
13
|
+
// Check recipient arrays if they exist
|
|
14
|
+
if (msg.toRecipients !== undefined && !Array.isArray(msg.toRecipients)) return false;
|
|
15
|
+
if (msg.ccRecipients !== undefined && !Array.isArray(msg.ccRecipients)) return false;
|
|
16
|
+
if (msg.bccRecipients !== undefined && !Array.isArray(msg.bccRecipients)) return false;
|
|
17
|
+
// Check from field if it exists
|
|
18
|
+
if (msg.from !== undefined && (typeof msg.from !== 'object' || msg.from === null)) return false;
|
|
19
|
+
// Check body field if it exists
|
|
20
|
+
if (msg.body !== undefined) {
|
|
21
|
+
if (typeof msg.body !== 'object' || msg.body === null) return false;
|
|
22
|
+
const body = msg.body;
|
|
23
|
+
if (body.contentType !== undefined && ![
|
|
24
|
+
'text',
|
|
25
|
+
'html'
|
|
26
|
+
].includes(String(body.contentType))) return false;
|
|
27
|
+
if (body.content !== undefined && typeof body.content !== 'string') return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
function formatRecipientList(list = [], mode = 'email') {
|
|
32
|
+
if (!Array.isArray(list) || list.length === 0) return '';
|
|
33
|
+
const addresses = list.map((r)=>{
|
|
34
|
+
var _ref, _ref1, _ref2, _ref3;
|
|
35
|
+
var _r_emailAddress, _r_emailAddress1;
|
|
36
|
+
return {
|
|
37
|
+
name: (_ref = (_ref1 = r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.name) !== null && _ref1 !== void 0 ? _ref1 : r === null || r === void 0 ? void 0 : r.name) !== null && _ref !== void 0 ? _ref : '',
|
|
38
|
+
email: (_ref2 = (_ref3 = r === null || r === void 0 ? void 0 : (_r_emailAddress1 = r.emailAddress) === null || _r_emailAddress1 === void 0 ? void 0 : _r_emailAddress1.address) !== null && _ref3 !== void 0 ? _ref3 : r === null || r === void 0 ? void 0 : r.address) !== null && _ref2 !== void 0 ? _ref2 : ''
|
|
39
|
+
};
|
|
40
|
+
}).filter((x)=>x.email);
|
|
41
|
+
return formatAddresses(addresses, mode);
|
|
42
|
+
}
|
|
43
|
+
export function toRowFromOutlook(msg, opts = {
|
|
44
|
+
body: false,
|
|
45
|
+
addressFormat: 'email'
|
|
46
|
+
}) {
|
|
47
|
+
var _msg_id, _msg_conversationId, _normalizeDateToISO, _msg_subject, _msg_bodyPreview;
|
|
48
|
+
// Validate input using type guard
|
|
49
|
+
if (!isOutlookMessage(msg)) {
|
|
50
|
+
// Return empty row for invalid input
|
|
51
|
+
return [
|
|
52
|
+
'',
|
|
53
|
+
'outlook',
|
|
54
|
+
'',
|
|
55
|
+
'',
|
|
56
|
+
'',
|
|
57
|
+
'',
|
|
58
|
+
'',
|
|
59
|
+
'',
|
|
60
|
+
'',
|
|
61
|
+
'',
|
|
62
|
+
'',
|
|
63
|
+
''
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
const id = (_msg_id = msg.id) !== null && _msg_id !== void 0 ? _msg_id : '';
|
|
67
|
+
const provider = 'outlook';
|
|
68
|
+
const threadId = (_msg_conversationId = msg.conversationId) !== null && _msg_conversationId !== void 0 ? _msg_conversationId : '';
|
|
69
|
+
const fmt = opts.addressFormat || 'email';
|
|
70
|
+
const to = formatRecipientList(msg.toRecipients || [], fmt);
|
|
71
|
+
const from = (()=>{
|
|
72
|
+
var _ref, _ref1, _ref2, _ref3;
|
|
73
|
+
var _f_emailAddress, _f_emailAddress1;
|
|
74
|
+
const f = msg.from;
|
|
75
|
+
if (!f) return '';
|
|
76
|
+
const name = (_ref = (_ref1 = (_f_emailAddress = f.emailAddress) === null || _f_emailAddress === void 0 ? void 0 : _f_emailAddress.name) !== null && _ref1 !== void 0 ? _ref1 : f.name) !== null && _ref !== void 0 ? _ref : '';
|
|
77
|
+
const addr = (_ref2 = (_ref3 = (_f_emailAddress1 = f.emailAddress) === null || _f_emailAddress1 === void 0 ? void 0 : _f_emailAddress1.address) !== null && _ref3 !== void 0 ? _ref3 : f.address) !== null && _ref2 !== void 0 ? _ref2 : '';
|
|
78
|
+
return formatRecipientList([
|
|
79
|
+
{
|
|
80
|
+
name,
|
|
81
|
+
address: addr
|
|
82
|
+
}
|
|
83
|
+
], fmt);
|
|
84
|
+
})();
|
|
85
|
+
const cc = formatRecipientList(msg.ccRecipients || [], fmt);
|
|
86
|
+
const bcc = formatRecipientList(msg.bccRecipients || [], fmt);
|
|
87
|
+
const date = (_normalizeDateToISO = normalizeDateToISO(msg.receivedDateTime)) !== null && _normalizeDateToISO !== void 0 ? _normalizeDateToISO : '';
|
|
88
|
+
const subject = (_msg_subject = msg.subject) !== null && _msg_subject !== void 0 ? _msg_subject : '';
|
|
89
|
+
const labels = '';
|
|
90
|
+
const snippet = (_msg_bodyPreview = msg.bodyPreview) !== null && _msg_bodyPreview !== void 0 ? _msg_bodyPreview : '';
|
|
91
|
+
let bodyFull = '';
|
|
92
|
+
if (opts.body && msg.body) {
|
|
93
|
+
var _msg_body_content;
|
|
94
|
+
const contentType = msg.body.contentType || 'text';
|
|
95
|
+
const content = (_msg_body_content = msg.body.content) !== null && _msg_body_content !== void 0 ? _msg_body_content : '';
|
|
96
|
+
bodyFull = contentType === 'text' ? extractCurrentMessageFromText(content) : extractCurrentMessageFromHtmlToText(content);
|
|
97
|
+
}
|
|
98
|
+
return [
|
|
99
|
+
id,
|
|
100
|
+
provider,
|
|
101
|
+
threadId,
|
|
102
|
+
to,
|
|
103
|
+
from,
|
|
104
|
+
cc,
|
|
105
|
+
bcc,
|
|
106
|
+
date,
|
|
107
|
+
subject,
|
|
108
|
+
labels,
|
|
109
|
+
snippet,
|
|
110
|
+
bodyFull
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
export function filterClientSide(filters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' } = {}) {
|
|
114
|
+
var _ref;
|
|
115
|
+
const lower = (a)=>a.map((t)=>String(t).toLowerCase());
|
|
116
|
+
const subjectTokens = lower(filters.subjectIncludes || []);
|
|
117
|
+
const bodyTokens = lower(filters.bodyIncludes || []);
|
|
118
|
+
const textTokens = lower(filters.textIncludes || []);
|
|
119
|
+
const fromTokens = lower(filters.fromIncludes || []);
|
|
120
|
+
const toCredentials = lower(filters.toIncludes || []);
|
|
121
|
+
const ccTokens = lower(filters.ccIncludes || []);
|
|
122
|
+
const bccTokens = lower(filters.bccIncludes || []);
|
|
123
|
+
const s = String(subject !== null && subject !== void 0 ? subject : '').toLowerCase();
|
|
124
|
+
const b = String((_ref = fullBody || snippetOrPreview) !== null && _ref !== void 0 ? _ref : '').toLowerCase();
|
|
125
|
+
const f = String(from !== null && from !== void 0 ? from : '').toLowerCase();
|
|
126
|
+
const t = String(to !== null && to !== void 0 ? to : '').toLowerCase();
|
|
127
|
+
const c = String(cc !== null && cc !== void 0 ? cc : '').toLowerCase();
|
|
128
|
+
const bc = String(bcc !== null && bcc !== void 0 ? bcc : '').toLowerCase();
|
|
129
|
+
const anyIncludes = (val, tokens)=>{
|
|
130
|
+
var _tokens_;
|
|
131
|
+
return tokens.length === 1 ? val.includes((_tokens_ = tokens[0]) !== null && _tokens_ !== void 0 ? _tokens_ : '') : tokens.some((token)=>val.includes(token));
|
|
132
|
+
};
|
|
133
|
+
const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;
|
|
134
|
+
const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;
|
|
135
|
+
const textOk = textTokens.length ? textTokens.some((token)=>s.includes(token) || b.includes(token)) : true;
|
|
136
|
+
const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;
|
|
137
|
+
const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;
|
|
138
|
+
const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;
|
|
139
|
+
const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;
|
|
140
|
+
return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;
|
|
141
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\ninterface OutlookRecipient {\n emailAddress?: {\n name?: string;\n address?: string;\n };\n name?: string;\n address?: string;\n}\n\ninterface OutlookMessageBody {\n contentType?: 'text' | 'html';\n content?: string;\n}\n\ninterface OutlookMessage {\n id?: string;\n conversationId?: string;\n toRecipients?: OutlookRecipient[];\n from?: OutlookRecipient;\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n subject?: string;\n bodyPreview?: string;\n body?: OutlookMessageBody;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\n// Type guard for OutlookMessage\nfunction isOutlookMessage(obj: unknown): obj is OutlookMessage {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const msg = obj as Record<string, unknown>;\n\n if (msg.id !== undefined && typeof msg.id !== 'string') return false;\n if (msg.conversationId !== undefined && typeof msg.conversationId !== 'string') return false;\n if (msg.receivedDateTime !== undefined && typeof msg.receivedDateTime !== 'string') return false;\n if (msg.subject !== undefined && typeof msg.subject !== 'string') return false;\n if (msg.bodyPreview !== undefined && typeof msg.bodyPreview !== 'string') return false;\n\n // Check recipient arrays if they exist\n if (msg.toRecipients !== undefined && !Array.isArray(msg.toRecipients)) return false;\n if (msg.ccRecipients !== undefined && !Array.isArray(msg.ccRecipients)) return false;\n if (msg.bccRecipients !== undefined && !Array.isArray(msg.bccRecipients)) return false;\n\n // Check from field if it exists\n if (msg.from !== undefined && (typeof msg.from !== 'object' || msg.from === null)) return false;\n\n // Check body field if it exists\n if (msg.body !== undefined) {\n if (typeof msg.body !== 'object' || msg.body === null) return false;\n const body = msg.body as Record<string, unknown>;\n if (body.contentType !== undefined && !['text', 'html'].includes(String(body.contentType))) return false;\n if (body.content !== undefined && typeof body.content !== 'string') return false;\n }\n\n return true;\n}\n\nfunction formatRecipientList(list: OutlookRecipient[] = [], mode: 'raw' | 'name' | 'email' = 'email'): string {\n if (!Array.isArray(list) || list.length === 0) return '';\n const addresses = list\n .map((r) => ({\n name: r?.emailAddress?.name ?? r?.name ?? '',\n email: r?.emailAddress?.address ?? r?.address ?? '',\n }))\n .filter((x) => x.email);\n return formatAddresses(addresses, mode);\n}\n\n// Result type for the row transformation\ntype MessageRow = [\n string, // id\n string, // provider\n string, // threadId\n string, // to\n string, // from\n string, // cc\n string, // bcc\n string, // date\n string, // subject\n string, // labels\n string, // snippet\n string, // bodyFull\n];\n\nexport function toRowFromOutlook(msg: unknown, opts: FormatOptions = { body: false, addressFormat: 'email' }): MessageRow {\n // Validate input using type guard\n if (!isOutlookMessage(msg)) {\n // Return empty row for invalid input\n return ['', 'outlook', '', '', '', '', '', '', '', '', '', ''];\n }\n\n const id = msg.id ?? '';\n const provider = 'outlook';\n const threadId = msg.conversationId ?? '';\n const fmt = opts.addressFormat || 'email';\n const to = formatRecipientList(msg.toRecipients || [], fmt);\n\n const from = (() => {\n const f = msg.from;\n if (!f) return '';\n const name = f.emailAddress?.name ?? f.name ?? '';\n const addr = f.emailAddress?.address ?? f.address ?? '';\n return formatRecipientList([{ name, address: addr }], fmt);\n })();\n\n const cc = formatRecipientList(msg.ccRecipients || [], fmt);\n const bcc = formatRecipientList(msg.bccRecipients || [], fmt);\n const date = normalizeDateToISO(msg.receivedDateTime) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.bodyPreview ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n const contentType = msg.body.contentType || 'text';\n const content = msg.body.content ?? '';\n bodyFull = contentType === 'text' ? extractCurrentMessageFromText(content) : extractCurrentMessageFromHtmlToText(content);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["extractCurrentMessageFromHtmlToText","extractCurrentMessageFromText","formatAddresses","normalizeDateToISO","isOutlookMessage","obj","msg","id","undefined","conversationId","receivedDateTime","subject","bodyPreview","toRecipients","Array","isArray","ccRecipients","bccRecipients","from","body","contentType","includes","String","content","formatRecipientList","list","mode","length","addresses","map","r","name","emailAddress","email","address","filter","x","toRowFromOutlook","opts","addressFormat","provider","threadId","fmt","to","f","addr","cc","bcc","date","labels","snippet","bodyFull","filterClientSide","filters","snippetOrPreview","fullBody","lower","a","t","toLowerCase","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","c","bc","anyIncludes","val","tokens","some","token","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"AAAA,SAASA,mCAAmC,EAAEC,6BAA6B,EAAEC,eAAe,EAAEC,kBAAkB,QAAQ,eAAe;AAkCvI,gCAAgC;AAChC,SAASC,iBAAiBC,GAAY;IACpC,IAAI,OAAOA,QAAQ,YAAYA,QAAQ,MAAM;QAC3C,OAAO;IACT;IAEA,MAAMC,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,OAAOF,IAAIY,IAAI,KAAK,YAAYZ,IAAIY,IAAI,KAAK,IAAG,GAAI,OAAO;IAE1F,gCAAgC;IAChC,IAAIZ,IAAIa,IAAI,KAAKX,WAAW;QAC1B,IAAI,OAAOF,IAAIa,IAAI,KAAK,YAAYb,IAAIa,IAAI,KAAK,MAAM,OAAO;QAC9D,MAAMA,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,oBAAoBC,OAA2B,EAAE,EAAEC,OAAiC,OAAO;IAClG,IAAI,CAACZ,MAAMC,OAAO,CAACU,SAASA,KAAKE,MAAM,KAAK,GAAG,OAAO;IACtD,MAAMC,YAAYH,KACfI,GAAG,CAAC,CAACC;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,CAACC,IAAMA,EAAEH,KAAK;IACxB,OAAO/B,gBAAgB0B,WAAWF;AACpC;AAkBA,OAAO,SAASW,iBAAiB/B,GAAY,EAAEgC,OAAsB;IAAEnB,MAAM;IAAOoB,eAAe;AAAQ,CAAC;QAO/FjC,SAEMA,qBAcJH,qBACGG,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,MAAMC,MAAKD,UAAAA,IAAIC,EAAE,cAAND,qBAAAA,UAAU;IACrB,MAAMkC,WAAW;IACjB,MAAMC,YAAWnC,sBAAAA,IAAIG,cAAc,cAAlBH,iCAAAA,sBAAsB;IACvC,MAAMoC,MAAMJ,KAAKC,aAAa,IAAI;IAClC,MAAMI,KAAKnB,oBAAoBlB,IAAIO,YAAY,IAAI,EAAE,EAAE6B;IAEvD,MAAMxB,OAAO,AAAC,CAAA;YAGC0B,aACAA;YADAA,iBACAA;QAHb,MAAMA,IAAItC,IAAIY,IAAI;QAClB,IAAI,CAAC0B,GAAG,OAAO;QACf,MAAMb,QAAOa,iBAAAA,kBAAAA,EAAEZ,YAAY,cAAdY,sCAAAA,gBAAgBb,IAAI,yCAAIa,EAAEb,IAAI,cAA9Ba,kBAAAA,OAAkC;QAC/C,MAAMC,QAAOD,kBAAAA,mBAAAA,EAAEZ,YAAY,cAAdY,uCAAAA,iBAAgBV,OAAO,yCAAIU,EAAEV,OAAO,cAApCU,mBAAAA,QAAwC;QACrD,OAAOpB,oBAAoB;YAAC;gBAAEO;gBAAMG,SAASW;YAAK;SAAE,EAAEH;IACxD,CAAA;IAEA,MAAMI,KAAKtB,oBAAoBlB,IAAIU,YAAY,IAAI,EAAE,EAAE0B;IACvD,MAAMK,MAAMvB,oBAAoBlB,IAAIW,aAAa,IAAI,EAAE,EAAEyB;IACzD,MAAMM,QAAO7C,sBAAAA,mBAAmBG,IAAII,gBAAgB,eAAvCP,iCAAAA,sBAA4C;IACzD,MAAMQ,WAAUL,eAAAA,IAAIK,OAAO,cAAXL,0BAAAA,eAAe;IAC/B,MAAM2C,SAAS;IACf,MAAMC,WAAU5C,mBAAAA,IAAIM,WAAW,cAAfN,8BAAAA,mBAAmB;IAEnC,IAAI6C,WAAW;IACf,IAAIb,KAAKnB,IAAI,IAAIb,IAAIa,IAAI,EAAE;YAETb;QADhB,MAAMc,cAAcd,IAAIa,IAAI,CAACC,WAAW,IAAI;QAC5C,MAAMG,WAAUjB,oBAAAA,IAAIa,IAAI,CAACI,OAAO,cAAhBjB,+BAAAA,oBAAoB;QACpC6C,WAAW/B,gBAAgB,SAASnB,8BAA8BsB,WAAWvB,oCAAoCuB;IACnH;IAEA,OAAO;QAAChB;QAAIiC;QAAUC;QAAUE;QAAIzB;QAAM4B;QAAIC;QAAKC;QAAMrC;QAASsC;QAAQC;QAASC;KAAS;AAC9F;AAsBA,OAAO,SAASC,iBAAiBC,OAA0B,EAAE,EAAE1C,UAAU,EAAE,EAAE2C,mBAAmB,EAAE,EAAEC,WAAW,EAAE,EAAErC,OAAO,EAAE,EAAEyB,KAAK,EAAE,EAAEG,KAAK,EAAE,EAAEC,MAAM,EAAE,EAAiB,GAAG,CAAC,CAAC;QAW1JQ;IAVlB,MAAMC,QAAQ,CAACC,IAAgBA,EAAE5B,GAAG,CAAC,CAAC6B,IAAMpC,OAAOoC,GAAGC,WAAW;IACjE,MAAMC,gBAAgBJ,MAAMH,QAAQQ,eAAe,IAAI,EAAE;IACzD,MAAMC,aAAaN,MAAMH,QAAQU,YAAY,IAAI,EAAE;IACnD,MAAMC,aAAaR,MAAMH,QAAQY,YAAY,IAAI,EAAE;IACnD,MAAMC,aAAaV,MAAMH,QAAQc,YAAY,IAAI,EAAE;IACnD,MAAMC,gBAAgBZ,MAAMH,QAAQgB,UAAU,IAAI,EAAE;IACpD,MAAMC,WAAWd,MAAMH,QAAQkB,UAAU,IAAI,EAAE;IAC/C,MAAMC,YAAYhB,MAAMH,QAAQoB,WAAW,IAAI,EAAE;IAEjD,MAAMC,IAAIpD,OAAOX,oBAAAA,qBAAAA,UAAW,IAAIgD,WAAW;IAC3C,MAAMgB,IAAIrD,QAAQiC,OAAAA,YAAYD,8BAAZC,kBAAAA,OAAiC,IAAII,WAAW;IAClE,MAAMf,IAAItB,OAAOJ,iBAAAA,kBAAAA,OAAQ,IAAIyC,WAAW;IACxC,MAAMD,IAAIpC,OAAOqB,eAAAA,gBAAAA,KAAM,IAAIgB,WAAW;IACtC,MAAMiB,IAAItD,OAAOwB,eAAAA,gBAAAA,KAAM,IAAIa,WAAW;IACtC,MAAMkB,KAAKvD,OAAOyB,gBAAAA,iBAAAA,MAAO,IAAIY,WAAW;IAExC,MAAMmB,cAAc,CAACC,KAAaC;YAAyDA;eAAnCA,OAAOrD,MAAM,KAAK,IAAIoD,IAAI1D,QAAQ,EAAC2D,WAAAA,MAAM,CAAC,EAAE,cAATA,sBAAAA,WAAa,MAAMA,OAAOC,IAAI,CAAC,CAACC,QAAUH,IAAI1D,QAAQ,CAAC6D;;IAClJ,MAAMC,YAAYvB,cAAcjC,MAAM,GAAGmD,YAAYJ,GAAGd,iBAAiB;IACzE,MAAMwB,SAAStB,WAAWnC,MAAM,GAAGmD,YAAYH,GAAGb,cAAc;IAChE,MAAMuB,SAASrB,WAAWrC,MAAM,GAAGqC,WAAWiB,IAAI,CAAC,CAACC,QAAUR,EAAErD,QAAQ,CAAC6D,UAAUP,EAAEtD,QAAQ,CAAC6D,UAAU;IACxG,MAAMI,SAASpB,WAAWvC,MAAM,GAAGmD,YAAYlC,GAAGsB,cAAc;IAChE,MAAMqB,OAAOnB,cAAczC,MAAM,GAAGmD,YAAYpB,GAAGU,iBAAiB;IACpE,MAAMoB,OAAOlB,SAAS3C,MAAM,GAAGmD,YAAYF,GAAGN,YAAY;IAC1D,MAAMmB,QAAQjB,UAAU7C,MAAM,GAAGmD,YAAYD,IAAIL,aAAa;IAE9D,OAAOW,aAAaC,UAAUC,UAAUC,UAAUC,QAAQC,QAAQC;AACpE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { buildContentForItems, toRowFromOutlook } from '../../email/messages/messages.js';
|
|
2
|
+
export { extractEmailsFromRecipients, extractFrom, formatAddressList } from '../../email/parsing/header-parsing.js';
|
|
3
|
+
export { fetchOutlookMessage } from '../../email/parsing/message-extraction.js';
|
|
4
|
+
export { mapOutlookMessage, type NormalizedAddress, type NormalizedMessage } from '../../email/parsing/message-mapping.js';
|
|
5
|
+
export { type ExecuteQueryOptions, executeQuery } from '../../email/querying/execute-query.js';
|
|
6
|
+
export { extractOutlookFilters, toGraphFilter, toOutlookFilter } from '../../email/querying/query-builder.js';
|
|
7
|
+
export { type OutlookSearchOptions, searchMessages } from '../../email/querying/search-execution.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { buildContentForItems, toRowFromOutlook } from '../../email/messages/messages.js';
|
|
2
|
+
export { extractEmailsFromRecipients, extractFrom, formatAddressList } from '../../email/parsing/header-parsing.js';
|
|
3
|
+
export { fetchOutlookMessage } from '../../email/parsing/message-extraction.js';
|
|
4
|
+
export { mapOutlookMessage } from '../../email/parsing/message-mapping.js';
|
|
5
|
+
export { executeQuery } from '../../email/querying/execute-query.js';
|
|
6
|
+
export { extractOutlookFilters, toGraphFilter, toOutlookFilter } from '../../email/querying/query-builder.js';
|
|
7
|
+
export { searchMessages } from '../../email/querying/search-execution.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/lib/outlook/index.ts"],"sourcesContent":["export { buildContentForItems, toRowFromOutlook } from '../../email/messages/messages.js';\nexport { extractEmailsFromRecipients, extractFrom, formatAddressList } from '../../email/parsing/header-parsing.js';\nexport { fetchOutlookMessage } from '../../email/parsing/message-extraction.js';\nexport { mapOutlookMessage, type NormalizedAddress, type NormalizedMessage } from '../../email/parsing/message-mapping.js';\nexport { type ExecuteQueryOptions, executeQuery } from '../../email/querying/execute-query.js';\nexport { extractOutlookFilters, toGraphFilter, toOutlookFilter } from '../../email/querying/query-builder.js';\nexport { type OutlookSearchOptions, searchMessages } from '../../email/querying/search-execution.js';\n"],"names":["buildContentForItems","toRowFromOutlook","extractEmailsFromRecipients","extractFrom","formatAddressList","fetchOutlookMessage","mapOutlookMessage","executeQuery","extractOutlookFilters","toGraphFilter","toOutlookFilter","searchMessages"],"mappings":"AAAA,SAASA,oBAAoB,EAAEC,gBAAgB,QAAQ,mCAAmC;AAC1F,SAASC,2BAA2B,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,wCAAwC;AACpH,SAASC,mBAAmB,QAAQ,4CAA4C;AAChF,SAASC,iBAAiB,QAAwD,yCAAyC;AAC3H,SAAmCC,YAAY,QAAQ,wCAAwC;AAC/F,SAASC,qBAAqB,EAAEC,aAAa,EAAEC,eAAe,QAAQ,wCAAwC;AAC9G,SAAoCC,cAAc,QAAQ,2CAA2C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface OutlookRecipient {
|
|
2
|
+
emailAddress?: {
|
|
3
|
+
address?: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export interface OutlookMessage {
|
|
8
|
+
id?: string;
|
|
9
|
+
conversationId?: string;
|
|
10
|
+
subject?: string;
|
|
11
|
+
from?: OutlookRecipient;
|
|
12
|
+
toRecipients?: OutlookRecipient[];
|
|
13
|
+
ccRecipients?: OutlookRecipient[];
|
|
14
|
+
bccRecipients?: OutlookRecipient[];
|
|
15
|
+
receivedDateTime?: string;
|
|
16
|
+
categories?: string[];
|
|
17
|
+
bodyPreview?: string;
|
|
18
|
+
body?: {
|
|
19
|
+
content?: string;
|
|
20
|
+
contentType?: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/lib/outlook/types.ts"],"sourcesContent":["// Strict type for Outlook message structure used in mapping and row conversion\nexport interface OutlookRecipient {\n emailAddress?: {\n address?: string;\n name?: string;\n };\n}\n\nexport interface OutlookMessage {\n id?: string;\n conversationId?: string;\n subject?: string;\n from?: OutlookRecipient;\n toRecipients?: OutlookRecipient[];\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n receivedDateTime?: string;\n categories?: string[];\n bodyPreview?: string;\n body?: {\n content?: string;\n contentType?: string;\n };\n}\n"],"names":[],"mappings":"AAAA,+EAA+E;AAQ/E,WAeC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as _promptFactories from './prompts/index.js';
|
|
2
|
+
export { _promptFactories as promptFactories };
|
|
3
|
+
import * as _resourceFactories from './resources/index.js';
|
|
4
|
+
export { _resourceFactories as resourceFactories };
|
|
5
|
+
import * as _toolFactories from './tools/index.js';
|
|
6
|
+
export { _toolFactories as toolFactories };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":"AAAA,kCAAiC,qBAAqB;AAAtD,SAAO,oBAAKA,eAAe,GAA2B;AACtD,oCAAmC,uBAAuB;AAA1D,SAAO,sBAAKC,iBAAiB,GAA6B;AAC1D,gCAA+B,mBAAmB;AAAlD,SAAO,kBAAKC,aAAa,GAAyB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
+
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export default function createPrompt(): {
|
|
5
|
+
name: string;
|
|
6
|
+
config: {
|
|
7
|
+
description: string;
|
|
8
|
+
argsSchema: {
|
|
9
|
+
context: z.ZodString;
|
|
10
|
+
tone: z.ZodOptional<z.ZodString>;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
handler: (args: {
|
|
14
|
+
[x: string]: unknown;
|
|
15
|
+
}, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
|
|
16
|
+
messages: ({
|
|
17
|
+
role: "system";
|
|
18
|
+
content: {
|
|
19
|
+
type: "text";
|
|
20
|
+
text: string;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
role: "user";
|
|
24
|
+
content: {
|
|
25
|
+
type: "text";
|
|
26
|
+
text: string;
|
|
27
|
+
};
|
|
28
|
+
})[];
|
|
29
|
+
}>;
|
|
30
|
+
};
|