@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,138 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
|
+
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
declare const inputSchema: z.ZodObject<{
|
|
5
|
+
shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
6
|
+
objects: "objects";
|
|
7
|
+
arrays: "arrays";
|
|
8
|
+
}>>>;
|
|
9
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
10
|
+
text: "text";
|
|
11
|
+
html: "html";
|
|
12
|
+
}>>>;
|
|
13
|
+
excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
14
|
+
pageSize: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
15
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
16
|
+
query: z.ZodOptional<z.ZodType<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown>>>;
|
|
17
|
+
fields: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>;
|
|
19
|
+
declare const outputSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
20
|
+
type: z.ZodLiteral<"success">;
|
|
21
|
+
shape: z.ZodLiteral<"objects">;
|
|
22
|
+
items: z.ZodArray<z.ZodObject<{
|
|
23
|
+
id: z.ZodOptional<z.ZodString>;
|
|
24
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
25
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
26
|
+
from: z.ZodOptional<z.ZodString>;
|
|
27
|
+
fromName: z.ZodOptional<z.ZodString>;
|
|
28
|
+
to: z.ZodOptional<z.ZodString>;
|
|
29
|
+
cc: z.ZodOptional<z.ZodString>;
|
|
30
|
+
bcc: z.ZodOptional<z.ZodString>;
|
|
31
|
+
date: z.ZodOptional<z.ZodString>;
|
|
32
|
+
receivedDateTime: z.ZodOptional<z.ZodString>;
|
|
33
|
+
snippet: z.ZodOptional<z.ZodString>;
|
|
34
|
+
isRead: z.ZodOptional<z.ZodBoolean>;
|
|
35
|
+
isImportant: z.ZodOptional<z.ZodBoolean>;
|
|
36
|
+
hasAttachments: z.ZodOptional<z.ZodBoolean>;
|
|
37
|
+
attachmentCount: z.ZodOptional<z.ZodNumber>;
|
|
38
|
+
labelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
39
|
+
folderName: z.ZodOptional<z.ZodString>;
|
|
40
|
+
body: z.ZodOptional<z.ZodString>;
|
|
41
|
+
bodyContentType: z.ZodOptional<z.ZodEnum<{
|
|
42
|
+
text: "text";
|
|
43
|
+
html: "html";
|
|
44
|
+
}>>;
|
|
45
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
46
|
+
id: z.ZodString;
|
|
47
|
+
filename: z.ZodString;
|
|
48
|
+
mimeType: z.ZodString;
|
|
49
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
50
|
+
}, z.core.$strip>>>;
|
|
51
|
+
}, z.core.$strip>>;
|
|
52
|
+
nextPageToken: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
54
|
+
type: z.ZodLiteral<"success">;
|
|
55
|
+
shape: z.ZodLiteral<"arrays">;
|
|
56
|
+
columns: z.ZodArray<z.ZodString>;
|
|
57
|
+
rows: z.ZodArray<z.ZodArray<z.ZodUnknown>>;
|
|
58
|
+
nextPageToken: z.ZodOptional<z.ZodString>;
|
|
59
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
60
|
+
type: z.ZodLiteral<"auth_required">;
|
|
61
|
+
provider: z.ZodString;
|
|
62
|
+
message: z.ZodString;
|
|
63
|
+
url: z.ZodOptional<z.ZodString>;
|
|
64
|
+
}, z.core.$strip>]>;
|
|
65
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
66
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
67
|
+
declare function handler({ query, pageSize, pageToken, fields, shape, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
68
|
+
export default function createTool(): {
|
|
69
|
+
name: string;
|
|
70
|
+
config: {
|
|
71
|
+
readonly description: "Search Outlook messages using structured query objects with flexible field selection.";
|
|
72
|
+
readonly inputSchema: z.ZodObject<{
|
|
73
|
+
shape: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
74
|
+
objects: "objects";
|
|
75
|
+
arrays: "arrays";
|
|
76
|
+
}>>>;
|
|
77
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
78
|
+
text: "text";
|
|
79
|
+
html: "html";
|
|
80
|
+
}>>>;
|
|
81
|
+
excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
82
|
+
pageSize: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
|
|
83
|
+
pageToken: z.ZodOptional<z.ZodString>;
|
|
84
|
+
query: z.ZodOptional<z.ZodType<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../schemas/outlook-query-schema.js").OutlookQuery, unknown>>>;
|
|
85
|
+
fields: z.ZodOptional<z.ZodString>;
|
|
86
|
+
}, z.core.$strip>;
|
|
87
|
+
readonly outputSchema: z.ZodObject<{
|
|
88
|
+
result: z.ZodUnion<readonly [z.ZodObject<{
|
|
89
|
+
type: z.ZodLiteral<"success">;
|
|
90
|
+
shape: z.ZodLiteral<"objects">;
|
|
91
|
+
items: z.ZodArray<z.ZodObject<{
|
|
92
|
+
id: z.ZodOptional<z.ZodString>;
|
|
93
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
94
|
+
subject: z.ZodOptional<z.ZodString>;
|
|
95
|
+
from: z.ZodOptional<z.ZodString>;
|
|
96
|
+
fromName: z.ZodOptional<z.ZodString>;
|
|
97
|
+
to: z.ZodOptional<z.ZodString>;
|
|
98
|
+
cc: z.ZodOptional<z.ZodString>;
|
|
99
|
+
bcc: z.ZodOptional<z.ZodString>;
|
|
100
|
+
date: z.ZodOptional<z.ZodString>;
|
|
101
|
+
receivedDateTime: z.ZodOptional<z.ZodString>;
|
|
102
|
+
snippet: z.ZodOptional<z.ZodString>;
|
|
103
|
+
isRead: z.ZodOptional<z.ZodBoolean>;
|
|
104
|
+
isImportant: z.ZodOptional<z.ZodBoolean>;
|
|
105
|
+
hasAttachments: z.ZodOptional<z.ZodBoolean>;
|
|
106
|
+
attachmentCount: z.ZodOptional<z.ZodNumber>;
|
|
107
|
+
labelIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
108
|
+
folderName: z.ZodOptional<z.ZodString>;
|
|
109
|
+
body: z.ZodOptional<z.ZodString>;
|
|
110
|
+
bodyContentType: z.ZodOptional<z.ZodEnum<{
|
|
111
|
+
text: "text";
|
|
112
|
+
html: "html";
|
|
113
|
+
}>>;
|
|
114
|
+
attachments: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
115
|
+
id: z.ZodString;
|
|
116
|
+
filename: z.ZodString;
|
|
117
|
+
mimeType: z.ZodString;
|
|
118
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
119
|
+
}, z.core.$strip>>>;
|
|
120
|
+
}, z.core.$strip>>;
|
|
121
|
+
nextPageToken: z.ZodOptional<z.ZodString>;
|
|
122
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
123
|
+
type: z.ZodLiteral<"success">;
|
|
124
|
+
shape: z.ZodLiteral<"arrays">;
|
|
125
|
+
columns: z.ZodArray<z.ZodString>;
|
|
126
|
+
rows: z.ZodArray<z.ZodArray<z.ZodUnknown>>;
|
|
127
|
+
nextPageToken: z.ZodOptional<z.ZodString>;
|
|
128
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
129
|
+
type: z.ZodLiteral<"auth_required">;
|
|
130
|
+
provider: z.ZodString;
|
|
131
|
+
message: z.ZodString;
|
|
132
|
+
url: z.ZodOptional<z.ZodString>;
|
|
133
|
+
}, z.core.$strip>]>;
|
|
134
|
+
}, z.core.$strip>;
|
|
135
|
+
};
|
|
136
|
+
handler: typeof handler;
|
|
137
|
+
};
|
|
138
|
+
export {};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';
|
|
2
|
+
import { schemas } from '@mcp-z/oauth-microsoft';
|
|
3
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
4
|
+
import { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, toColumnarFormat } from '@mcp-z/server';
|
|
5
|
+
import { Client } from '@microsoft/microsoft-graph-client';
|
|
6
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.js';
|
|
9
|
+
import { OutlookQuerySchema } from '../../schemas/outlook-query-schema.js';
|
|
10
|
+
const inputSchema = z.object({
|
|
11
|
+
query: OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),
|
|
12
|
+
fields: createFieldsSchema({
|
|
13
|
+
availableFields: EMAIL_FIELDS,
|
|
14
|
+
fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,
|
|
15
|
+
commonPatterns: EMAIL_COMMON_PATTERNS,
|
|
16
|
+
resourceName: 'email message'
|
|
17
|
+
}),
|
|
18
|
+
...createPaginationSchema({
|
|
19
|
+
defaultPageSize: 50,
|
|
20
|
+
maxPageSize: 500,
|
|
21
|
+
provider: 'outlook'
|
|
22
|
+
}).shape,
|
|
23
|
+
shape: createShapeSchema(),
|
|
24
|
+
contentType: EmailContentTypeSchema,
|
|
25
|
+
excludeThreadHistory: ExcludeThreadHistorySchema
|
|
26
|
+
});
|
|
27
|
+
// Success branch schemas for different shapes
|
|
28
|
+
const successObjectsBranchSchema = z.object({
|
|
29
|
+
type: z.literal('success'),
|
|
30
|
+
shape: z.literal('objects'),
|
|
31
|
+
items: z.array(EmailDetailSchema).describe('Matching email messages'),
|
|
32
|
+
nextPageToken: z.string().optional().describe('Token for fetching next page of results')
|
|
33
|
+
});
|
|
34
|
+
const successArraysBranchSchema = z.object({
|
|
35
|
+
type: z.literal('success'),
|
|
36
|
+
shape: z.literal('arrays'),
|
|
37
|
+
columns: z.array(z.string()).describe('Column names in canonical order'),
|
|
38
|
+
rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),
|
|
39
|
+
nextPageToken: z.string().optional().describe('Token for fetching next page of results')
|
|
40
|
+
});
|
|
41
|
+
// Output schema with auth_required support
|
|
42
|
+
// Using z.union instead of discriminatedUnion since we have two success branches with different shapes
|
|
43
|
+
const outputSchema = z.union([
|
|
44
|
+
successObjectsBranchSchema,
|
|
45
|
+
successArraysBranchSchema,
|
|
46
|
+
AuthRequiredBranchSchema
|
|
47
|
+
]);
|
|
48
|
+
const config = {
|
|
49
|
+
description: 'Search Outlook messages using structured query objects with flexible field selection.',
|
|
50
|
+
inputSchema: inputSchema,
|
|
51
|
+
outputSchema: z.object({
|
|
52
|
+
result: outputSchema
|
|
53
|
+
})
|
|
54
|
+
};
|
|
55
|
+
async function handler({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }, extra) {
|
|
56
|
+
const logger = extra.logger;
|
|
57
|
+
const requestedFields = parseFields(fields, EMAIL_FIELDS);
|
|
58
|
+
const includeBody = requestedFields === 'all' || requestedFields.has('body');
|
|
59
|
+
logger.info('outlook.search called with', {
|
|
60
|
+
query,
|
|
61
|
+
pageSize,
|
|
62
|
+
pageToken: pageToken ? '[provided]' : undefined,
|
|
63
|
+
fields: fields || 'all',
|
|
64
|
+
includeBody
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
const graph = Client.initWithMiddleware({
|
|
68
|
+
authProvider: extra.authContext.auth
|
|
69
|
+
});
|
|
70
|
+
const started = Date.now();
|
|
71
|
+
const exec = await executeOutlookQuery(graph, query, {
|
|
72
|
+
logger,
|
|
73
|
+
pageSize,
|
|
74
|
+
...pageToken ? {
|
|
75
|
+
pageToken
|
|
76
|
+
} : {},
|
|
77
|
+
includeBody,
|
|
78
|
+
limit: pageSize
|
|
79
|
+
}, (m)=>{
|
|
80
|
+
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
|
|
81
|
+
var _message_from_emailAddress, _message_from, _message_from_emailAddress1, _message_from1, _message_body;
|
|
82
|
+
const message = m;
|
|
83
|
+
const to = Array.isArray(message === null || message === void 0 ? void 0 : message.toRecipients) ? message.toRecipients.map((r)=>{
|
|
84
|
+
var _r_emailAddress;
|
|
85
|
+
return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
|
|
86
|
+
}).filter(Boolean).join(', ') : undefined;
|
|
87
|
+
const cc = Array.isArray(message === null || message === void 0 ? void 0 : message.ccRecipients) ? message.ccRecipients.map((r)=>{
|
|
88
|
+
var _r_emailAddress;
|
|
89
|
+
return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
|
|
90
|
+
}).filter(Boolean).join(', ') : undefined;
|
|
91
|
+
const bcc = Array.isArray(message === null || message === void 0 ? void 0 : message.bccRecipients) ? message.bccRecipients.map((r)=>{
|
|
92
|
+
var _r_emailAddress;
|
|
93
|
+
return r === null || r === void 0 ? void 0 : (_r_emailAddress = r.emailAddress) === null || _r_emailAddress === void 0 ? void 0 : _r_emailAddress.address;
|
|
94
|
+
}).filter(Boolean).join(', ') : undefined;
|
|
95
|
+
const fromAddr = (_ref = message === null || message === void 0 ? void 0 : (_message_from = message.from) === null || _message_from === void 0 ? void 0 : (_message_from_emailAddress = _message_from.emailAddress) === null || _message_from_emailAddress === void 0 ? void 0 : _message_from_emailAddress.address) !== null && _ref !== void 0 ? _ref : null;
|
|
96
|
+
const fromName = (_ref1 = message === null || message === void 0 ? void 0 : (_message_from1 = message.from) === null || _message_from1 === void 0 ? void 0 : (_message_from_emailAddress1 = _message_from1.emailAddress) === null || _message_from_emailAddress1 === void 0 ? void 0 : _message_from_emailAddress1.name) !== null && _ref1 !== void 0 ? _ref1 : null;
|
|
97
|
+
// Process body based on contentType and excludeThreadHistory options
|
|
98
|
+
let bodyContent;
|
|
99
|
+
if (includeBody && (message === null || message === void 0 ? void 0 : (_message_body = message.body) === null || _message_body === void 0 ? void 0 : _message_body.content)) {
|
|
100
|
+
var _message_body_contentType;
|
|
101
|
+
const isHtml = ((_message_body_contentType = message.body.contentType) === null || _message_body_contentType === void 0 ? void 0 : _message_body_contentType.toLowerCase()) === 'html';
|
|
102
|
+
bodyContent = message.body.content;
|
|
103
|
+
if (isHtml && excludeThreadHistory) {
|
|
104
|
+
bodyContent = extractCurrentMessageFromHtml(bodyContent);
|
|
105
|
+
}
|
|
106
|
+
if (isHtml && contentType === 'text') {
|
|
107
|
+
bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const mapped = {
|
|
111
|
+
id: (_ref2 = message === null || message === void 0 ? void 0 : message.id) !== null && _ref2 !== void 0 ? _ref2 : undefined,
|
|
112
|
+
subject: (_ref3 = message === null || message === void 0 ? void 0 : message.subject) !== null && _ref3 !== void 0 ? _ref3 : undefined,
|
|
113
|
+
from: fromAddr !== null && fromAddr !== void 0 ? fromAddr : undefined,
|
|
114
|
+
fromName: fromName !== null && fromName !== void 0 ? fromName : undefined,
|
|
115
|
+
to,
|
|
116
|
+
cc,
|
|
117
|
+
bcc,
|
|
118
|
+
date: (_ref4 = message === null || message === void 0 ? void 0 : message.receivedDateTime) !== null && _ref4 !== void 0 ? _ref4 : undefined,
|
|
119
|
+
snippet: (_ref5 = message === null || message === void 0 ? void 0 : message.bodyPreview) !== null && _ref5 !== void 0 ? _ref5 : undefined,
|
|
120
|
+
...bodyContent && {
|
|
121
|
+
body: bodyContent,
|
|
122
|
+
bodyContentType: contentType
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
return mapped;
|
|
126
|
+
});
|
|
127
|
+
const durationMs = Date.now() - started;
|
|
128
|
+
const filteredItems = exec.items.map((item)=>filterFields(item, requestedFields));
|
|
129
|
+
logger.info('outlook.message.search returning', {
|
|
130
|
+
query,
|
|
131
|
+
pageSize,
|
|
132
|
+
itemsLength: filteredItems.length,
|
|
133
|
+
fields: fields || 'all'
|
|
134
|
+
});
|
|
135
|
+
logger.info('outlook.message.search metrics', {
|
|
136
|
+
durationMs,
|
|
137
|
+
metadata: exec.metadata
|
|
138
|
+
});
|
|
139
|
+
// Type-safe metadata access
|
|
140
|
+
const metadataObj = exec.metadata;
|
|
141
|
+
// Build result based on shape
|
|
142
|
+
const result = shape === 'arrays' ? {
|
|
143
|
+
type: 'success',
|
|
144
|
+
shape: 'arrays',
|
|
145
|
+
...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),
|
|
146
|
+
...(metadataObj === null || metadataObj === void 0 ? void 0 : metadataObj.nextPageToken) && {
|
|
147
|
+
nextPageToken: metadataObj.nextPageToken
|
|
148
|
+
}
|
|
149
|
+
} : {
|
|
150
|
+
type: 'success',
|
|
151
|
+
shape: 'objects',
|
|
152
|
+
items: filteredItems,
|
|
153
|
+
...(metadataObj === null || metadataObj === void 0 ? void 0 : metadataObj.nextPageToken) && {
|
|
154
|
+
nextPageToken: metadataObj.nextPageToken
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
return {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: 'text',
|
|
161
|
+
text: JSON.stringify(result)
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
structuredContent: {
|
|
165
|
+
result
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
} catch (error) {
|
|
169
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
170
|
+
logger.error('outlook.message.search error', {
|
|
171
|
+
error: message
|
|
172
|
+
});
|
|
173
|
+
throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {
|
|
174
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export default function createTool() {
|
|
179
|
+
return {
|
|
180
|
+
name: 'message-search',
|
|
181
|
+
config,
|
|
182
|
+
handler
|
|
183
|
+
};
|
|
184
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/message-search.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema, extractCurrentMessageFromHtml, extractCurrentMessageFromHtmlToText } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, createPaginationSchema, createShapeSchema, filterFields, parseFields, type ToolModule, toColumnarFormat } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { executeQuery as executeOutlookQuery } from '../../email/querying/execute-query.js';\nimport { OutlookQuerySchema } from '../../schemas/outlook-query-schema.js';\n\nconst inputSchema = z.object({\n query: OutlookQuerySchema.optional().describe('Structured query object for filtering messages. Use query-syntax prompt for reference.'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n ...createPaginationSchema({\n defaultPageSize: 50,\n maxPageSize: 500,\n provider: 'outlook',\n }).shape,\n shape: createShapeSchema(),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schemas for different shapes\nconst successObjectsBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('objects'),\n items: z.array(EmailDetailSchema).describe('Matching email messages'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\nconst successArraysBranchSchema = z.object({\n type: z.literal('success'),\n shape: z.literal('arrays'),\n columns: z.array(z.string()).describe('Column names in canonical order'),\n rows: z.array(z.array(z.unknown())).describe('Row data matching column order'),\n nextPageToken: z.string().optional().describe('Token for fetching next page of results'),\n});\n\n// Output schema with auth_required support\n// Using z.union instead of discriminatedUnion since we have two success branches with different shapes\nconst outputSchema = z.union([successObjectsBranchSchema, successArraysBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Search Outlook messages using structured query objects with flexible field selection.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ query, pageSize = 50, pageToken, fields, shape = 'arrays', contentType, excludeThreadHistory }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n const includeBody = requestedFields === 'all' || requestedFields.has('body');\n\n logger.info('outlook.search called with', {\n query,\n pageSize,\n pageToken: pageToken ? '[provided]' : undefined,\n fields: fields || 'all',\n includeBody,\n });\n\n try {\n const graph = Client.initWithMiddleware({\n authProvider: extra.authContext.auth,\n });\n const started = Date.now();\n const exec = await executeOutlookQuery(\n graph,\n query,\n {\n logger,\n pageSize,\n ...(pageToken ? { pageToken } : {}),\n includeBody,\n limit: pageSize,\n },\n (m: unknown) => {\n const message = m as MicrosoftGraph.Message;\n const to = Array.isArray(message?.toRecipients)\n ? message.toRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const cc = Array.isArray(message?.ccRecipients)\n ? message.ccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const bcc = Array.isArray(message?.bccRecipients)\n ? message.bccRecipients\n .map((r: MicrosoftGraph.Recipient) => r?.emailAddress?.address)\n .filter(Boolean)\n .join(', ')\n : undefined;\n const fromAddr = message?.from?.emailAddress?.address ?? null;\n const fromName = message?.from?.emailAddress?.name ?? null;\n // Process body based on contentType and excludeThreadHistory options\n let bodyContent: string | undefined;\n if (includeBody && message?.body?.content) {\n const isHtml = message.body.contentType?.toLowerCase() === 'html';\n bodyContent = message.body.content;\n\n if (isHtml && excludeThreadHistory) {\n bodyContent = extractCurrentMessageFromHtml(bodyContent);\n }\n\n if (isHtml && contentType === 'text') {\n bodyContent = excludeThreadHistory ? extractCurrentMessageFromHtmlToText(bodyContent) : extractCurrentMessageFromHtmlToText(message.body.content);\n }\n }\n\n const mapped: Partial<EmailDetail> = {\n id: message?.id ?? undefined,\n subject: message?.subject ?? undefined,\n from: fromAddr ?? undefined,\n fromName: fromName ?? undefined,\n to,\n cc,\n bcc,\n date: message?.receivedDateTime ?? undefined,\n snippet: message?.bodyPreview ?? undefined,\n ...(bodyContent && { body: bodyContent, bodyContentType: contentType }),\n };\n return mapped;\n }\n );\n const durationMs = Date.now() - started;\n\n const filteredItems = exec.items.map((item) => filterFields(item, requestedFields));\n\n logger.info('outlook.message.search returning', {\n query,\n pageSize,\n itemsLength: filteredItems.length,\n fields: fields || 'all',\n });\n logger.info('outlook.message.search metrics', {\n durationMs,\n metadata: exec.metadata,\n });\n\n // Type-safe metadata access\n const metadataObj = exec.metadata as { nextPageToken?: string } | undefined;\n\n // Build result based on shape\n const result: Output =\n shape === 'arrays'\n ? {\n type: 'success' as const,\n shape: 'arrays' as const,\n ...toColumnarFormat(filteredItems, requestedFields, EMAIL_FIELDS),\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n }\n : {\n type: 'success' as const,\n shape: 'objects' as const,\n items: filteredItems,\n ...(metadataObj?.nextPageToken && { nextPageToken: metadataObj.nextPageToken }),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.message.search error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error searching messages: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-search',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["EMAIL_COMMON_PATTERNS","EMAIL_FIELD_DESCRIPTIONS","EMAIL_FIELDS","EmailContentTypeSchema","EmailDetailSchema","ExcludeThreadHistorySchema","extractCurrentMessageFromHtml","extractCurrentMessageFromHtmlToText","schemas","AuthRequiredBranchSchema","createFieldsSchema","createPaginationSchema","createShapeSchema","filterFields","parseFields","toColumnarFormat","Client","ErrorCode","McpError","z","executeQuery","executeOutlookQuery","OutlookQuerySchema","inputSchema","object","query","optional","describe","fields","availableFields","fieldDescriptions","commonPatterns","resourceName","defaultPageSize","maxPageSize","provider","shape","contentType","excludeThreadHistory","successObjectsBranchSchema","type","literal","items","array","nextPageToken","string","successArraysBranchSchema","columns","rows","unknown","outputSchema","union","config","description","result","handler","pageSize","pageToken","extra","logger","requestedFields","includeBody","has","info","undefined","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","exec","limit","m","message","to","Array","isArray","toRecipients","map","r","emailAddress","address","filter","Boolean","join","cc","ccRecipients","bcc","bccRecipients","fromAddr","from","fromName","name","bodyContent","body","content","isHtml","toLowerCase","mapped","id","subject","date","receivedDateTime","snippet","bodyPreview","bodyContentType","durationMs","filteredItems","item","itemsLength","length","metadata","metadataObj","text","JSON","stringify","structuredContent","error","Error","String","InternalError","stack","createTool"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
|
+
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
declare const inputSchema: z.ZodObject<{
|
|
5
|
+
to: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
6
|
+
cc: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
7
|
+
bcc: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
8
|
+
subject: z.ZodDefault<z.ZodString>;
|
|
9
|
+
body: z.ZodString;
|
|
10
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
text: "text";
|
|
12
|
+
html: "html";
|
|
13
|
+
}>>>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
16
|
+
id: z.ZodString;
|
|
17
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
18
|
+
sentAt: z.ZodString;
|
|
19
|
+
recipientCount: z.ZodNumber;
|
|
20
|
+
webLink: z.ZodOptional<z.ZodString>;
|
|
21
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
22
|
+
type: z.ZodLiteral<"success">;
|
|
23
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
24
|
+
type: z.ZodLiteral<"auth_required">;
|
|
25
|
+
provider: z.ZodString;
|
|
26
|
+
message: z.ZodString;
|
|
27
|
+
url: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, z.core.$strip>], "type">;
|
|
29
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
30
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
31
|
+
declare function handler({ to, cc, bcc, subject, body, contentType }: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
32
|
+
export default function createTool(): {
|
|
33
|
+
name: string;
|
|
34
|
+
config: {
|
|
35
|
+
readonly description: "Send an email message through Outlook";
|
|
36
|
+
readonly inputSchema: z.ZodObject<{
|
|
37
|
+
to: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
38
|
+
cc: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
39
|
+
bcc: z.ZodString | z.ZodOptional<z.ZodString>;
|
|
40
|
+
subject: z.ZodDefault<z.ZodString>;
|
|
41
|
+
body: z.ZodString;
|
|
42
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
43
|
+
text: "text";
|
|
44
|
+
html: "html";
|
|
45
|
+
}>>>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
readonly outputSchema: z.ZodObject<{
|
|
48
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
49
|
+
id: z.ZodString;
|
|
50
|
+
threadId: z.ZodOptional<z.ZodString>;
|
|
51
|
+
sentAt: z.ZodString;
|
|
52
|
+
recipientCount: z.ZodNumber;
|
|
53
|
+
webLink: z.ZodOptional<z.ZodString>;
|
|
54
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
55
|
+
type: z.ZodLiteral<"success">;
|
|
56
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
57
|
+
type: z.ZodLiteral<"auth_required">;
|
|
58
|
+
provider: z.ZodString;
|
|
59
|
+
message: z.ZodString;
|
|
60
|
+
url: z.ZodOptional<z.ZodString>;
|
|
61
|
+
}, z.core.$strip>], "type">;
|
|
62
|
+
}, z.core.$strip>;
|
|
63
|
+
};
|
|
64
|
+
handler: typeof handler;
|
|
65
|
+
};
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { ComposeContentTypeSchema, createEmailRecipientsSchema, createMessageResultSchema } from '@mcp-z/email';
|
|
2
|
+
import { schemas } from '@mcp-z/oauth-microsoft';
|
|
3
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
4
|
+
import { Client } from '@microsoft/microsoft-graph-client';
|
|
5
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { buildOutlookMessage } from '../../email/composition/outlook-message-builder.js';
|
|
8
|
+
const MessageResultSchema = createMessageResultSchema('outlook');
|
|
9
|
+
const inputSchema = z.object({
|
|
10
|
+
to: createEmailRecipientsSchema('to', true),
|
|
11
|
+
cc: createEmailRecipientsSchema('cc', false),
|
|
12
|
+
bcc: createEmailRecipientsSchema('bcc', false),
|
|
13
|
+
subject: z.string().describe('Email subject line').default(''),
|
|
14
|
+
body: z.string().trim().min(1).describe('Email body content (plain text or HTML)'),
|
|
15
|
+
contentType: ComposeContentTypeSchema
|
|
16
|
+
});
|
|
17
|
+
// Success branch schema
|
|
18
|
+
const successBranchSchema = MessageResultSchema.extend({
|
|
19
|
+
type: z.literal('success')
|
|
20
|
+
});
|
|
21
|
+
// Output schema with auth_required support
|
|
22
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
23
|
+
successBranchSchema,
|
|
24
|
+
AuthRequiredBranchSchema
|
|
25
|
+
]);
|
|
26
|
+
const config = {
|
|
27
|
+
description: 'Send an email message through Outlook',
|
|
28
|
+
inputSchema: inputSchema,
|
|
29
|
+
outputSchema: z.object({
|
|
30
|
+
result: outputSchema
|
|
31
|
+
})
|
|
32
|
+
};
|
|
33
|
+
async function handler({ to, cc, bcc, subject, body, contentType }, extra) {
|
|
34
|
+
const logger = extra.logger;
|
|
35
|
+
try {
|
|
36
|
+
var _ref, _ref1, _ref2;
|
|
37
|
+
var _message_toRecipients, _message_ccRecipients, _message_bccRecipients;
|
|
38
|
+
const graph = Client.initWithMiddleware({
|
|
39
|
+
authProvider: extra.authContext.auth
|
|
40
|
+
});
|
|
41
|
+
// Use composition module to build the message
|
|
42
|
+
const toArray = to === null || to === void 0 ? void 0 : to.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
|
|
43
|
+
const ccArray = cc === null || cc === void 0 ? void 0 : cc.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
|
|
44
|
+
const bccArray = bcc === null || bcc === void 0 ? void 0 : bcc.split(',').map((addr)=>addr.trim()).filter((addr)=>addr);
|
|
45
|
+
const message = buildOutlookMessage({
|
|
46
|
+
to: toArray,
|
|
47
|
+
cc: ccArray && ccArray.length > 0 ? ccArray : undefined,
|
|
48
|
+
bcc: bccArray && bccArray.length > 0 ? bccArray : undefined,
|
|
49
|
+
subject: subject !== null && subject !== void 0 ? subject : '',
|
|
50
|
+
body,
|
|
51
|
+
contentType: contentType === 'html' ? 'HTML' : 'Text'
|
|
52
|
+
});
|
|
53
|
+
// Use draft-send pattern to get message ID
|
|
54
|
+
// 1. Create draft message
|
|
55
|
+
const draft = await graph.api('/me/messages').post(message);
|
|
56
|
+
const messageId = draft.id;
|
|
57
|
+
if (!messageId) {
|
|
58
|
+
logger.error('outlook.message.send draft creation failed - no ID returned');
|
|
59
|
+
throw new McpError(ErrorCode.InternalError, 'Failed to create draft message');
|
|
60
|
+
}
|
|
61
|
+
// 2. Send the draft
|
|
62
|
+
await graph.api(`/me/messages/${messageId}/send`).post({});
|
|
63
|
+
logger.info('Outlook: sent mail successfully', {
|
|
64
|
+
messageId
|
|
65
|
+
});
|
|
66
|
+
const toCount = (_ref = (_message_toRecipients = message.toRecipients) === null || _message_toRecipients === void 0 ? void 0 : _message_toRecipients.length) !== null && _ref !== void 0 ? _ref : 0;
|
|
67
|
+
const ccCount = (_ref1 = (_message_ccRecipients = message.ccRecipients) === null || _message_ccRecipients === void 0 ? void 0 : _message_ccRecipients.length) !== null && _ref1 !== void 0 ? _ref1 : 0;
|
|
68
|
+
const bccCount = (_ref2 = (_message_bccRecipients = message.bccRecipients) === null || _message_bccRecipients === void 0 ? void 0 : _message_bccRecipients.length) !== null && _ref2 !== void 0 ? _ref2 : 0;
|
|
69
|
+
logger.info('outlook.message.send success', {
|
|
70
|
+
toCount,
|
|
71
|
+
ccCount,
|
|
72
|
+
bccCount,
|
|
73
|
+
subject: subject !== null && subject !== void 0 ? subject : '',
|
|
74
|
+
messageId
|
|
75
|
+
});
|
|
76
|
+
const totalRecipients = toCount + ccCount + bccCount;
|
|
77
|
+
const result = {
|
|
78
|
+
type: 'success',
|
|
79
|
+
id: messageId,
|
|
80
|
+
sentAt: new Date().toISOString(),
|
|
81
|
+
recipientCount: totalRecipients,
|
|
82
|
+
webLink: 'https://outlook.live.com/mail/0/sentitems'
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: 'text',
|
|
88
|
+
text: JSON.stringify(result)
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
structuredContent: {
|
|
92
|
+
result
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
97
|
+
logger.error('outlook.message.send error', {
|
|
98
|
+
error: message
|
|
99
|
+
});
|
|
100
|
+
throw new McpError(ErrorCode.InternalError, `Error sending message: ${message}`, {
|
|
101
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export default function createTool() {
|
|
106
|
+
return {
|
|
107
|
+
name: 'message-send',
|
|
108
|
+
config,
|
|
109
|
+
handler
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-outlook/src/mcp/tools/message-send.ts"],"sourcesContent":["import { ComposeContentTypeSchema, createEmailRecipientsSchema, createMessageResultSchema } 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 { Client } from '@microsoft/microsoft-graph-client';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { buildOutlookMessage } from '../../email/composition/outlook-message-builder.js';\n\nconst MessageResultSchema = createMessageResultSchema('outlook');\n\nconst inputSchema = z.object({\n to: createEmailRecipientsSchema('to', true),\n cc: createEmailRecipientsSchema('cc', false),\n bcc: createEmailRecipientsSchema('bcc', false),\n subject: z.string().describe('Email subject line').default(''),\n body: z.string().trim().min(1).describe('Email body content (plain text or HTML)'),\n contentType: ComposeContentTypeSchema,\n});\n\n// Success branch schema\nconst successBranchSchema = MessageResultSchema.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: 'Send an email message through 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({ to, cc, bcc, subject, body, contentType }: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n\n // Use composition module to build the message\n const toArray = to\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n const ccArray = cc\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n const bccArray = bcc\n ?.split(',')\n .map((addr) => addr.trim())\n .filter((addr) => addr);\n\n const message = buildOutlookMessage({\n to: toArray,\n cc: ccArray && ccArray.length > 0 ? ccArray : undefined,\n bcc: bccArray && bccArray.length > 0 ? bccArray : undefined,\n subject: subject ?? '',\n body,\n contentType: contentType === 'html' ? 'HTML' : 'Text',\n });\n\n // Use draft-send pattern to get message ID\n // 1. Create draft message\n const draft = await graph.api('/me/messages').post(message);\n const messageId = draft.id;\n\n if (!messageId) {\n logger.error('outlook.message.send draft creation failed - no ID returned');\n throw new McpError(ErrorCode.InternalError, 'Failed to create draft message');\n }\n\n // 2. Send the draft\n await graph.api(`/me/messages/${messageId}/send`).post({});\n logger.info('Outlook: sent mail successfully', { messageId });\n\n const toCount = message.toRecipients?.length ?? 0;\n const ccCount = message.ccRecipients?.length ?? 0;\n const bccCount = message.bccRecipients?.length ?? 0;\n\n logger.info('outlook.message.send success', { toCount, ccCount, bccCount, subject: subject ?? '', messageId });\n\n const totalRecipients = toCount + ccCount + bccCount;\n const result: Output = {\n type: 'success' as const,\n id: messageId,\n sentAt: new Date().toISOString(),\n recipientCount: totalRecipients,\n webLink: 'https://outlook.live.com/mail/0/sentitems',\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.send error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error sending message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-send',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["ComposeContentTypeSchema","createEmailRecipientsSchema","createMessageResultSchema","schemas","AuthRequiredBranchSchema","Client","ErrorCode","McpError","z","buildOutlookMessage","MessageResultSchema","inputSchema","object","to","cc","bcc","subject","string","describe","default","body","trim","min","contentType","successBranchSchema","extend","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","message","graph","initWithMiddleware","authProvider","authContext","auth","toArray","split","map","addr","filter","ccArray","bccArray","length","undefined","draft","api","post","messageId","id","error","InternalError","info","toCount","toRecipients","ccCount","ccRecipients","bccCount","bccRecipients","totalRecipients","sentAt","Date","toISOString","recipientCount","webLink","content","text","JSON","stringify","structuredContent","Error","String","stack","createTool","name"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Outlook message CSV export tool - streams results to file without loading all data into context */
|
|
2
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
3
|
+
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { StorageExtra } from '../../types.js';
|
|
6
|
+
declare const inputSchema: z.ZodObject<{
|
|
7
|
+
query: z.ZodOptional<z.ZodType<import("../../types.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").OutlookQuery, unknown>>>;
|
|
8
|
+
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
filename: z.ZodDefault<z.ZodString>;
|
|
10
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
text: "text";
|
|
12
|
+
html: "html";
|
|
13
|
+
}>>>;
|
|
14
|
+
excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
17
|
+
uri: z.ZodString;
|
|
18
|
+
filename: z.ZodString;
|
|
19
|
+
rowCount: z.ZodNumber;
|
|
20
|
+
truncated: z.ZodBoolean;
|
|
21
|
+
type: z.ZodLiteral<"success">;
|
|
22
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
23
|
+
type: z.ZodLiteral<"auth_required">;
|
|
24
|
+
provider: z.ZodString;
|
|
25
|
+
message: z.ZodString;
|
|
26
|
+
url: z.ZodOptional<z.ZodString>;
|
|
27
|
+
}, z.core.$strip>], "type">;
|
|
28
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
29
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
30
|
+
/**
|
|
31
|
+
* Handler for outlook-messages-export-csv tool
|
|
32
|
+
*
|
|
33
|
+
* CRITICAL: Streaming implementation per user requirements
|
|
34
|
+
* - Generate UUID upfront
|
|
35
|
+
* - Write CSV header immediately
|
|
36
|
+
* - Append rows as batches arrive
|
|
37
|
+
* - Delete partial file on error
|
|
38
|
+
* - NO RETRIES (fail fast on error)
|
|
39
|
+
*/
|
|
40
|
+
declare function handler({ query, maxItems, filename, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra & StorageExtra): Promise<CallToolResult>;
|
|
41
|
+
export default function createTool(): {
|
|
42
|
+
name: string;
|
|
43
|
+
config: {
|
|
44
|
+
readonly description: "Export Outlook messages to CSV with streaming pagination. Returns file URI. Use query-syntax prompt for query reference.";
|
|
45
|
+
readonly inputSchema: z.ZodObject<{
|
|
46
|
+
query: z.ZodOptional<z.ZodType<import("../../types.js").OutlookQuery, unknown, z.core.$ZodTypeInternals<import("../../types.js").OutlookQuery, unknown>>>;
|
|
47
|
+
maxItems: z.ZodDefault<z.ZodNumber>;
|
|
48
|
+
filename: z.ZodDefault<z.ZodString>;
|
|
49
|
+
contentType: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
50
|
+
text: "text";
|
|
51
|
+
html: "html";
|
|
52
|
+
}>>>;
|
|
53
|
+
excludeThreadHistory: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
readonly outputSchema: z.ZodObject<{
|
|
56
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
57
|
+
uri: z.ZodString;
|
|
58
|
+
filename: z.ZodString;
|
|
59
|
+
rowCount: z.ZodNumber;
|
|
60
|
+
truncated: z.ZodBoolean;
|
|
61
|
+
type: z.ZodLiteral<"success">;
|
|
62
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
63
|
+
type: z.ZodLiteral<"auth_required">;
|
|
64
|
+
provider: z.ZodString;
|
|
65
|
+
message: z.ZodString;
|
|
66
|
+
url: z.ZodOptional<z.ZodString>;
|
|
67
|
+
}, z.core.$strip>], "type">;
|
|
68
|
+
}, z.core.$strip>;
|
|
69
|
+
};
|
|
70
|
+
handler: typeof handler;
|
|
71
|
+
};
|
|
72
|
+
export {};
|