@mcp-z/mcp-gmail 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 +167 -0
- package/bin/server.js +5 -0
- package/dist/cjs/constants.d.cts +11 -0
- package/dist/cjs/constants.d.ts +11 -0
- package/dist/cjs/constants.js +39 -0
- package/dist/cjs/constants.js.map +1 -0
- package/dist/cjs/email/composition/rfc822-builder.d.cts +11 -0
- package/dist/cjs/email/composition/rfc822-builder.d.ts +11 -0
- package/dist/cjs/email/composition/rfc822-builder.js +24 -0
- package/dist/cjs/email/composition/rfc822-builder.js.map +1 -0
- package/dist/cjs/email/messages/fetch-message.d.cts +24 -0
- package/dist/cjs/email/messages/fetch-message.d.ts +24 -0
- package/dist/cjs/email/messages/fetch-message.js +367 -0
- package/dist/cjs/email/messages/fetch-message.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 +146 -0
- package/dist/cjs/email/messages/messages.js.map +1 -0
- package/dist/cjs/email/parsing/header-parsing.d.cts +1 -0
- package/dist/cjs/email/parsing/header-parsing.d.ts +1 -0
- package/dist/cjs/email/parsing/header-parsing.js +20 -0
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -0
- package/dist/cjs/email/parsing/headers-utils.d.cts +5 -0
- package/dist/cjs/email/parsing/headers-utils.d.ts +5 -0
- package/dist/cjs/email/parsing/headers-utils.js +46 -0
- package/dist/cjs/email/parsing/headers-utils.js.map +1 -0
- package/dist/cjs/email/parsing/html-processing.d.cts +8 -0
- package/dist/cjs/email/parsing/html-processing.d.ts +8 -0
- package/dist/cjs/email/parsing/html-processing.js +72 -0
- package/dist/cjs/email/parsing/html-processing.js.map +1 -0
- package/dist/cjs/email/parsing/message-extraction.d.cts +2 -0
- package/dist/cjs/email/parsing/message-extraction.d.ts +2 -0
- package/dist/cjs/email/parsing/message-extraction.js +25 -0
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -0
- package/dist/cjs/email/querying/execute-query.d.cts +17 -0
- package/dist/cjs/email/querying/execute-query.d.ts +17 -0
- package/dist/cjs/email/querying/execute-query.js +265 -0
- package/dist/cjs/email/querying/execute-query.js.map +1 -0
- package/dist/cjs/email/querying/pagination.d.cts +27 -0
- package/dist/cjs/email/querying/pagination.d.ts +27 -0
- package/dist/cjs/email/querying/pagination.js +533 -0
- package/dist/cjs/email/querying/pagination.js.map +1 -0
- package/dist/cjs/email/querying/query-builder.d.cts +47 -0
- package/dist/cjs/email/querying/query-builder.d.ts +47 -0
- package/dist/cjs/email/querying/query-builder.js +387 -0
- package/dist/cjs/email/querying/query-builder.js.map +1 -0
- package/dist/cjs/email/querying/search-execution.d.cts +29 -0
- package/dist/cjs/email/querying/search-execution.d.ts +29 -0
- package/dist/cjs/email/querying/search-execution.js +190 -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/labels/gmail-labels.d.cts +2 -0
- package/dist/cjs/labels/gmail-labels.d.ts +2 -0
- package/dist/cjs/labels/gmail-labels.js +206 -0
- package/dist/cjs/labels/gmail-labels.js.map +1 -0
- package/dist/cjs/lib/base64-encoding.d.cts +2 -0
- package/dist/cjs/lib/base64-encoding.d.ts +2 -0
- package/dist/cjs/lib/base64-encoding.js +32 -0
- package/dist/cjs/lib/base64-encoding.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/date-conversion.d.cts +1 -0
- package/dist/cjs/lib/date-conversion.d.ts +1 -0
- package/dist/cjs/lib/date-conversion.js +16 -0
- package/dist/cjs/lib/date-conversion.js.map +1 -0
- package/dist/cjs/lib/messages-to-row.d.cts +61 -0
- package/dist/cjs/lib/messages-to-row.d.ts +61 -0
- package/dist/cjs/lib/messages-to-row.js +243 -0
- package/dist/cjs/lib/messages-to-row.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 +256 -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 +58 -0
- package/dist/cjs/mcp/tools/categories-list.d.ts +58 -0
- package/dist/cjs/mcp/tools/categories-list.js +298 -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 +61 -0
- package/dist/cjs/mcp/tools/label-add.d.ts +61 -0
- package/dist/cjs/mcp/tools/label-add.js +280 -0
- package/dist/cjs/mcp/tools/label-add.js.map +1 -0
- package/dist/cjs/mcp/tools/label-delete.d.cts +71 -0
- package/dist/cjs/mcp/tools/label-delete.d.ts +71 -0
- package/dist/cjs/mcp/tools/label-delete.js +476 -0
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -0
- package/dist/cjs/mcp/tools/labels-list.d.cts +75 -0
- package/dist/cjs/mcp/tools/labels-list.d.ts +75 -0
- package/dist/cjs/mcp/tools/labels-list.js +298 -0
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -0
- package/dist/cjs/mcp/tools/message-get.d.cts +146 -0
- package/dist/cjs/mcp/tools/message-get.d.ts +146 -0
- package/dist/cjs/mcp/tools/message-get.js +317 -0
- package/dist/cjs/mcp/tools/message-get.js.map +1 -0
- package/dist/cjs/mcp/tools/message-mark-read.d.cts +50 -0
- package/dist/cjs/mcp/tools/message-mark-read.d.ts +50 -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 +71 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.d.ts +71 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.js +450 -0
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -0
- package/dist/cjs/mcp/tools/message-respond.d.cts +60 -0
- package/dist/cjs/mcp/tools/message-respond.d.ts +60 -0
- package/dist/cjs/mcp/tools/message-respond.js +367 -0
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -0
- package/dist/cjs/mcp/tools/message-search.d.cts +182 -0
- package/dist/cjs/mcp/tools/message-search.d.ts +182 -0
- package/dist/cjs/mcp/tools/message-search.js +405 -0
- package/dist/cjs/mcp/tools/message-search.js.map +1 -0
- package/dist/cjs/mcp/tools/message-send.d.cts +87 -0
- package/dist/cjs/mcp/tools/message-send.d.ts +87 -0
- package/dist/cjs/mcp/tools/message-send.js +288 -0
- package/dist/cjs/mcp/tools/message-send.js.map +1 -0
- package/dist/cjs/mcp/tools/messages-export-csv.d.cts +84 -0
- package/dist/cjs/mcp/tools/messages-export-csv.d.ts +84 -0
- package/dist/cjs/mcp/tools/messages-export-csv.js +530 -0
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schemas/gmail-query-schema.d.cts +36 -0
- package/dist/cjs/schemas/gmail-query-schema.d.ts +36 -0
- package/dist/cjs/schemas/gmail-query-schema.js +117 -0
- package/dist/cjs/schemas/gmail-query-schema.js.map +1 -0
- package/dist/cjs/schemas/index.d.cts +1 -0
- package/dist/cjs/schemas/index.d.ts +1 -0
- package/dist/cjs/schemas/index.js +19 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/setup/config.d.cts +48 -0
- package/dist/cjs/setup/config.d.ts +48 -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-google.d.cts +54 -0
- package/dist/cjs/setup/oauth-google.d.ts +54 -0
- package/dist/cjs/setup/oauth-google.js +332 -0
- package/dist/cjs/setup/oauth-google.js.map +1 -0
- package/dist/cjs/setup/runtime.d.cts +12 -0
- package/dist/cjs/setup/runtime.d.ts +12 -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 +11 -0
- package/dist/esm/constants.js +14 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/email/composition/rfc822-builder.d.ts +11 -0
- package/dist/esm/email/composition/rfc822-builder.js +13 -0
- package/dist/esm/email/composition/rfc822-builder.js.map +1 -0
- package/dist/esm/email/messages/fetch-message.d.ts +24 -0
- package/dist/esm/email/messages/fetch-message.js +123 -0
- package/dist/esm/email/messages/fetch-message.js.map +1 -0
- package/dist/esm/email/messages/messages.d.ts +7 -0
- package/dist/esm/email/messages/messages.js +91 -0
- package/dist/esm/email/messages/messages.js.map +1 -0
- package/dist/esm/email/parsing/header-parsing.d.ts +1 -0
- package/dist/esm/email/parsing/header-parsing.js +1 -0
- package/dist/esm/email/parsing/header-parsing.js.map +1 -0
- package/dist/esm/email/parsing/headers-utils.d.ts +5 -0
- package/dist/esm/email/parsing/headers-utils.js +25 -0
- package/dist/esm/email/parsing/headers-utils.js.map +1 -0
- package/dist/esm/email/parsing/html-processing.d.ts +8 -0
- package/dist/esm/email/parsing/html-processing.js +39 -0
- package/dist/esm/email/parsing/html-processing.js.map +1 -0
- package/dist/esm/email/parsing/message-extraction.d.ts +2 -0
- package/dist/esm/email/parsing/message-extraction.js +3 -0
- package/dist/esm/email/parsing/message-extraction.js.map +1 -0
- package/dist/esm/email/querying/execute-query.d.ts +17 -0
- package/dist/esm/email/querying/execute-query.js +45 -0
- package/dist/esm/email/querying/execute-query.js.map +1 -0
- package/dist/esm/email/querying/pagination.d.ts +27 -0
- package/dist/esm/email/querying/pagination.js +152 -0
- package/dist/esm/email/querying/pagination.js.map +1 -0
- package/dist/esm/email/querying/query-builder.d.ts +47 -0
- package/dist/esm/email/querying/query-builder.js +306 -0
- package/dist/esm/email/querying/query-builder.js.map +1 -0
- package/dist/esm/email/querying/search-execution.d.ts +29 -0
- package/dist/esm/email/querying/search-execution.js +35 -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/labels/gmail-labels.d.ts +2 -0
- package/dist/esm/labels/gmail-labels.js +43 -0
- package/dist/esm/labels/gmail-labels.js.map +1 -0
- package/dist/esm/lib/base64-encoding.d.ts +2 -0
- package/dist/esm/lib/base64-encoding.js +13 -0
- package/dist/esm/lib/base64-encoding.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/date-conversion.d.ts +1 -0
- package/dist/esm/lib/date-conversion.js +5 -0
- package/dist/esm/lib/date-conversion.js.map +1 -0
- package/dist/esm/lib/messages-to-row.d.ts +61 -0
- package/dist/esm/lib/messages-to-row.js +188 -0
- package/dist/esm/lib/messages-to-row.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 +74 -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 +92 -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 +58 -0
- package/dist/esm/mcp/tools/categories-list.js +124 -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 +61 -0
- package/dist/esm/mcp/tools/label-add.js +101 -0
- package/dist/esm/mcp/tools/label-add.js.map +1 -0
- package/dist/esm/mcp/tools/label-delete.d.ts +71 -0
- package/dist/esm/mcp/tools/label-delete.js +186 -0
- package/dist/esm/mcp/tools/label-delete.js.map +1 -0
- package/dist/esm/mcp/tools/labels-list.d.ts +75 -0
- package/dist/esm/mcp/tools/labels-list.js +122 -0
- package/dist/esm/mcp/tools/labels-list.js.map +1 -0
- package/dist/esm/mcp/tools/message-get.d.ts +146 -0
- package/dist/esm/mcp/tools/message-get.js +145 -0
- package/dist/esm/mcp/tools/message-get.js.map +1 -0
- package/dist/esm/mcp/tools/message-mark-read.d.ts +50 -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 +71 -0
- package/dist/esm/mcp/tools/message-move-to-trash.js +167 -0
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -0
- package/dist/esm/mcp/tools/message-respond.d.ts +60 -0
- package/dist/esm/mcp/tools/message-respond.js +152 -0
- package/dist/esm/mcp/tools/message-respond.js.map +1 -0
- package/dist/esm/mcp/tools/message-search.d.ts +182 -0
- package/dist/esm/mcp/tools/message-search.js +180 -0
- package/dist/esm/mcp/tools/message-search.js.map +1 -0
- package/dist/esm/mcp/tools/message-send.d.ts +87 -0
- package/dist/esm/mcp/tools/message-send.js +115 -0
- package/dist/esm/mcp/tools/message-send.js.map +1 -0
- package/dist/esm/mcp/tools/messages-export-csv.d.ts +84 -0
- package/dist/esm/mcp/tools/messages-export-csv.js +261 -0
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schemas/gmail-query-schema.d.ts +36 -0
- package/dist/esm/schemas/gmail-query-schema.js +72 -0
- package/dist/esm/schemas/gmail-query-schema.js.map +1 -0
- package/dist/esm/schemas/index.d.ts +1 -0
- package/dist/esm/schemas/index.js +1 -0
- package/dist/esm/schemas/index.js.map +1 -0
- package/dist/esm/setup/config.d.ts +48 -0
- package/dist/esm/setup/config.js +175 -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-google.d.ts +54 -0
- package/dist/esm/setup/oauth-google.js +142 -0
- package/dist/esm/setup/oauth-google.js.map +1 -0
- package/dist/esm/setup/runtime.d.ts +12 -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 +110 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface GmailMessage {
|
|
2
|
+
id?: string;
|
|
3
|
+
threadId?: string;
|
|
4
|
+
labelIds?: string[];
|
|
5
|
+
snippet?: string;
|
|
6
|
+
payload?: {
|
|
7
|
+
headers?: Array<{
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}>;
|
|
11
|
+
body?: {
|
|
12
|
+
data?: string;
|
|
13
|
+
};
|
|
14
|
+
parts?: Array<{
|
|
15
|
+
mimeType: string;
|
|
16
|
+
body?: {
|
|
17
|
+
data?: string;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
interface GmailEmailSummary {
|
|
23
|
+
id: string;
|
|
24
|
+
provider: 'gmail';
|
|
25
|
+
threadId?: string | undefined;
|
|
26
|
+
date?: string | undefined;
|
|
27
|
+
from?: string | undefined;
|
|
28
|
+
fromName?: string | undefined;
|
|
29
|
+
to?: string | undefined;
|
|
30
|
+
cc?: string | undefined;
|
|
31
|
+
bcc?: string | undefined;
|
|
32
|
+
subject?: string | undefined;
|
|
33
|
+
snippet?: string | undefined;
|
|
34
|
+
body?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
interface FormatOptions {
|
|
37
|
+
body?: boolean;
|
|
38
|
+
addressFormat?: 'raw' | 'name' | 'email';
|
|
39
|
+
}
|
|
40
|
+
export declare function toRowFromGmail(msg?: GmailMessage, opts?: FormatOptions): string[];
|
|
41
|
+
export declare function toRowFromGmailSummary(msg: GmailEmailSummary, opts?: FormatOptions): string[];
|
|
42
|
+
interface ClientSideFilters {
|
|
43
|
+
subjectIncludes?: string[];
|
|
44
|
+
bodyIncludes?: string[];
|
|
45
|
+
textIncludes?: string[];
|
|
46
|
+
fromIncludes?: string[];
|
|
47
|
+
toIncludes?: string[];
|
|
48
|
+
ccIncludes?: string[];
|
|
49
|
+
bccIncludes?: string[];
|
|
50
|
+
}
|
|
51
|
+
interface FilterContent {
|
|
52
|
+
subject?: string;
|
|
53
|
+
snippetOrPreview?: string;
|
|
54
|
+
fullBody?: string;
|
|
55
|
+
from?: string;
|
|
56
|
+
to?: string;
|
|
57
|
+
cc?: string;
|
|
58
|
+
bcc?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function filterClientSide(filters: ClientSideFilters, { subject, snippetOrPreview, fullBody, from, to, cc, bcc }?: FilterContent): boolean;
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';
|
|
2
|
+
function getHeader(headers, name) {
|
|
3
|
+
if (!headers || !Array.isArray(headers)) return '';
|
|
4
|
+
const header = headers.find((h)=>h.name.toLowerCase() === name.toLowerCase());
|
|
5
|
+
return header ? header.value : '';
|
|
6
|
+
}
|
|
7
|
+
function parseEmailHeader(headerValue) {
|
|
8
|
+
if (!headerValue) return [];
|
|
9
|
+
const parts = [];
|
|
10
|
+
let current = '';
|
|
11
|
+
let inQuotes = false;
|
|
12
|
+
for(let i = 0; i < headerValue.length; i++){
|
|
13
|
+
const char = headerValue[i];
|
|
14
|
+
if (char === '"') {
|
|
15
|
+
inQuotes = !inQuotes;
|
|
16
|
+
current += char;
|
|
17
|
+
} else if (char === ',' && !inQuotes) {
|
|
18
|
+
parts.push(current.trim());
|
|
19
|
+
current = '';
|
|
20
|
+
} else {
|
|
21
|
+
current += char;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (current) parts.push(current.trim());
|
|
25
|
+
return parts.map((part)=>{
|
|
26
|
+
const match = part.match(/^(?:"?([^"]*)"? <([^>]+)>|([^,]+))$/);
|
|
27
|
+
if (match) {
|
|
28
|
+
if (match[2]) {
|
|
29
|
+
return {
|
|
30
|
+
name: match[1] || undefined,
|
|
31
|
+
email: match[2]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
email: match[3] || ''
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
email: part.trim()
|
|
40
|
+
};
|
|
41
|
+
}).filter((token)=>!!token.email); // Type guard to ensure email is always present
|
|
42
|
+
}
|
|
43
|
+
function formatRecipientHeader(headerValue, mode = 'email') {
|
|
44
|
+
const addresses = parseEmailHeader(headerValue);
|
|
45
|
+
return formatAddresses(addresses, mode);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sanitizes email body text for Google Sheets export by enforcing cell character limits.
|
|
49
|
+
* Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.
|
|
50
|
+
*/ function sanitizeForSheetsExport(text) {
|
|
51
|
+
// Google Sheets has a 50,000 character limit per cell
|
|
52
|
+
// Leave some buffer for safety
|
|
53
|
+
const GOOGLE_SHEETS_CELL_LIMIT = 49000;
|
|
54
|
+
if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;
|
|
55
|
+
// Truncate and add indication that it was truncated
|
|
56
|
+
const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);
|
|
57
|
+
return `${truncated}\n\n[...content truncated to fit Google Sheets cell limit...]`;
|
|
58
|
+
}
|
|
59
|
+
export function toRowFromGmail(msg = {}, opts = {
|
|
60
|
+
body: false,
|
|
61
|
+
addressFormat: 'email'
|
|
62
|
+
}) {
|
|
63
|
+
var _msg_id, _msg_threadId, _normalizeDateToISO, _msg_snippet;
|
|
64
|
+
var _msg_payload;
|
|
65
|
+
const id = (_msg_id = msg.id) !== null && _msg_id !== void 0 ? _msg_id : '';
|
|
66
|
+
const provider = 'gmail';
|
|
67
|
+
const threadId = (_msg_threadId = msg.threadId) !== null && _msg_threadId !== void 0 ? _msg_threadId : '';
|
|
68
|
+
const fmt = opts.addressFormat || 'email';
|
|
69
|
+
const headers = ((_msg_payload = msg.payload) === null || _msg_payload === void 0 ? void 0 : _msg_payload.headers) || [];
|
|
70
|
+
const toHeader = getHeader(headers, 'To');
|
|
71
|
+
const fromHeader = getHeader(headers, 'From');
|
|
72
|
+
const ccHeader = getHeader(headers, 'Cc');
|
|
73
|
+
const bccHeader = getHeader(headers, 'Bcc');
|
|
74
|
+
const dateHeader = getHeader(headers, 'Date');
|
|
75
|
+
const subjectHeader = getHeader(headers, 'Subject');
|
|
76
|
+
const to = formatRecipientHeader(toHeader, fmt);
|
|
77
|
+
const from = formatRecipientHeader(fromHeader, fmt);
|
|
78
|
+
const cc = formatRecipientHeader(ccHeader, fmt);
|
|
79
|
+
const bcc = formatRecipientHeader(bccHeader, fmt);
|
|
80
|
+
const date = (_normalizeDateToISO = normalizeDateToISO(dateHeader)) !== null && _normalizeDateToISO !== void 0 ? _normalizeDateToISO : '';
|
|
81
|
+
const subject = subjectHeader !== null && subjectHeader !== void 0 ? subjectHeader : '';
|
|
82
|
+
const labels = (msg.labelIds || []).join(', ');
|
|
83
|
+
const snippet = (_msg_snippet = msg.snippet) !== null && _msg_snippet !== void 0 ? _msg_snippet : '';
|
|
84
|
+
let bodyFull = '';
|
|
85
|
+
if (opts.body) {
|
|
86
|
+
if (msg.payload) {
|
|
87
|
+
var _msg_payload_body;
|
|
88
|
+
if ((_msg_payload_body = msg.payload.body) === null || _msg_payload_body === void 0 ? void 0 : _msg_payload_body.data) {
|
|
89
|
+
const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');
|
|
90
|
+
bodyFull = extractCurrentMessageFromText(rawBody);
|
|
91
|
+
} else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {
|
|
92
|
+
for (const part of msg.payload.parts){
|
|
93
|
+
var _part_body;
|
|
94
|
+
if ((_part_body = part.body) === null || _part_body === void 0 ? void 0 : _part_body.data) {
|
|
95
|
+
const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');
|
|
96
|
+
if (part.mimeType === 'text/plain') {
|
|
97
|
+
bodyFull = extractCurrentMessageFromText(rawBody);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
if (part.mimeType === 'text/html') {
|
|
101
|
+
bodyFull = extractCurrentMessageFromHtmlToText(rawBody);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return [
|
|
110
|
+
id,
|
|
111
|
+
provider,
|
|
112
|
+
threadId,
|
|
113
|
+
to,
|
|
114
|
+
from,
|
|
115
|
+
cc,
|
|
116
|
+
bcc,
|
|
117
|
+
date,
|
|
118
|
+
subject,
|
|
119
|
+
labels,
|
|
120
|
+
snippet,
|
|
121
|
+
sanitizeForSheetsExport(bodyFull)
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
export function toRowFromGmailSummary(msg, opts = {
|
|
125
|
+
body: false,
|
|
126
|
+
addressFormat: 'email'
|
|
127
|
+
}) {
|
|
128
|
+
var _msg_id, _msg_threadId, _msg_to, _msg_from, _msg_cc, _msg_bcc, _normalizeDateToISO, _msg_subject, _msg_snippet;
|
|
129
|
+
const id = (_msg_id = msg.id) !== null && _msg_id !== void 0 ? _msg_id : '';
|
|
130
|
+
const provider = msg.provider || 'gmail';
|
|
131
|
+
const threadId = (_msg_threadId = msg.threadId) !== null && _msg_threadId !== void 0 ? _msg_threadId : '';
|
|
132
|
+
const fmt = opts.addressFormat || 'email';
|
|
133
|
+
const to = formatRecipientHeader((_msg_to = msg.to) !== null && _msg_to !== void 0 ? _msg_to : '', fmt);
|
|
134
|
+
const from = formatRecipientHeader((_msg_from = msg.from) !== null && _msg_from !== void 0 ? _msg_from : '', fmt);
|
|
135
|
+
const cc = formatRecipientHeader((_msg_cc = msg.cc) !== null && _msg_cc !== void 0 ? _msg_cc : '', fmt);
|
|
136
|
+
const bcc = formatRecipientHeader((_msg_bcc = msg.bcc) !== null && _msg_bcc !== void 0 ? _msg_bcc : '', fmt);
|
|
137
|
+
const date = (_normalizeDateToISO = normalizeDateToISO(msg.date)) !== null && _normalizeDateToISO !== void 0 ? _normalizeDateToISO : '';
|
|
138
|
+
const subject = (_msg_subject = msg.subject) !== null && _msg_subject !== void 0 ? _msg_subject : '';
|
|
139
|
+
const labels = '';
|
|
140
|
+
const snippet = (_msg_snippet = msg.snippet) !== null && _msg_snippet !== void 0 ? _msg_snippet : '';
|
|
141
|
+
let bodyFull = '';
|
|
142
|
+
if (opts.body && msg.body) {
|
|
143
|
+
bodyFull = extractCurrentMessageFromText(msg.body);
|
|
144
|
+
}
|
|
145
|
+
return [
|
|
146
|
+
id,
|
|
147
|
+
provider,
|
|
148
|
+
threadId,
|
|
149
|
+
to,
|
|
150
|
+
from,
|
|
151
|
+
cc,
|
|
152
|
+
bcc,
|
|
153
|
+
date,
|
|
154
|
+
subject,
|
|
155
|
+
labels,
|
|
156
|
+
snippet,
|
|
157
|
+
sanitizeForSheetsExport(bodyFull)
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
export function filterClientSide(filters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' } = {}) {
|
|
161
|
+
var _ref;
|
|
162
|
+
const lower = (a)=>a.map((t)=>String(t).toLowerCase());
|
|
163
|
+
const subjectTokens = lower(filters.subjectIncludes || []);
|
|
164
|
+
const bodyTokens = lower(filters.bodyIncludes || []);
|
|
165
|
+
const textTokens = lower(filters.textIncludes || []);
|
|
166
|
+
const fromTokens = lower(filters.fromIncludes || []);
|
|
167
|
+
const toCredentials = lower(filters.toIncludes || []);
|
|
168
|
+
const ccTokens = lower(filters.ccIncludes || []);
|
|
169
|
+
const bccTokens = lower(filters.bccIncludes || []);
|
|
170
|
+
const s = String(subject !== null && subject !== void 0 ? subject : '').toLowerCase();
|
|
171
|
+
const b = String((_ref = fullBody || snippetOrPreview) !== null && _ref !== void 0 ? _ref : '').toLowerCase();
|
|
172
|
+
const f = String(from !== null && from !== void 0 ? from : '').toLowerCase();
|
|
173
|
+
const t = String(to !== null && to !== void 0 ? to : '').toLowerCase();
|
|
174
|
+
const c = String(cc !== null && cc !== void 0 ? cc : '').toLowerCase();
|
|
175
|
+
const bc = String(bcc !== null && bcc !== void 0 ? bcc : '').toLowerCase();
|
|
176
|
+
const anyIncludes = (val, tokens)=>{
|
|
177
|
+
var _tokens_;
|
|
178
|
+
return tokens.length === 1 ? val.includes((_tokens_ = tokens[0]) !== null && _tokens_ !== void 0 ? _tokens_ : '') : tokens.some((token)=>val.includes(token));
|
|
179
|
+
};
|
|
180
|
+
const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;
|
|
181
|
+
const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;
|
|
182
|
+
const textOk = textTokens.length ? textTokens.some((token)=>s.includes(token) || b.includes(token)) : true;
|
|
183
|
+
const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;
|
|
184
|
+
const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;
|
|
185
|
+
const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;
|
|
186
|
+
const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;
|
|
187
|
+
return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;
|
|
188
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\nexport interface GmailMessage {\n id?: string;\n threadId?: string;\n labelIds?: string[];\n snippet?: string;\n payload?: {\n headers?: Array<{ name: string; value: string }>;\n body?: {\n data?: string;\n };\n parts?: Array<{\n mimeType: string;\n body?: {\n data?: string;\n };\n }>;\n };\n}\n\ninterface GmailEmailSummary {\n id: string;\n provider: 'gmail';\n threadId?: string | undefined;\n date?: string | undefined;\n from?: string | undefined;\n fromName?: string | undefined;\n to?: string | undefined;\n cc?: string | undefined;\n bcc?: string | undefined;\n subject?: string | undefined;\n snippet?: string | undefined;\n body?: string | undefined;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\nfunction getHeader(headers: Array<{ name: string; value: string }> | undefined, name: string): string {\n if (!headers || !Array.isArray(headers)) return '';\n const header = headers.find((h) => h.name.toLowerCase() === name.toLowerCase());\n return header ? header.value : '';\n}\n\ninterface AddressToken {\n name?: string | undefined;\n email: string;\n}\n\nfunction parseEmailHeader(headerValue: string): AddressToken[] {\n if (!headerValue) return [];\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < headerValue.length; i++) {\n const char = headerValue[i];\n if (char === '\"') {\n inQuotes = !inQuotes;\n current += char;\n } else if (char === ',' && !inQuotes) {\n parts.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current.trim());\n\n return parts\n .map((part): AddressToken => {\n const match = part.match(/^(?:\"?([^\"]*)\"? <([^>]+)>|([^,]+))$/);\n if (match) {\n if (match[2]) {\n return { name: match[1] || undefined, email: match[2] };\n }\n return { email: match[3] || '' };\n }\n return { email: part.trim() };\n })\n .filter((token) => !!token.email); // Type guard to ensure email is always present\n}\n\nfunction formatRecipientHeader(headerValue: string, mode: 'raw' | 'name' | 'email' = 'email'): string {\n const addresses = parseEmailHeader(headerValue);\n return formatAddresses(addresses, mode);\n}\n\n/**\n * Sanitizes email body text for Google Sheets export by enforcing cell character limits.\n * Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.\n */\nfunction sanitizeForSheetsExport(text: string): string {\n // Google Sheets has a 50,000 character limit per cell\n // Leave some buffer for safety\n const GOOGLE_SHEETS_CELL_LIMIT = 49000;\n\n if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;\n\n // Truncate and add indication that it was truncated\n const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);\n return `${truncated}\\n\\n[...content truncated to fit Google Sheets cell limit...]`;\n}\n\nexport function toRowFromGmail(msg: GmailMessage = {}, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const headers = msg.payload?.headers || [];\n const toHeader = getHeader(headers, 'To');\n const fromHeader = getHeader(headers, 'From');\n const ccHeader = getHeader(headers, 'Cc');\n const bccHeader = getHeader(headers, 'Bcc');\n const dateHeader = getHeader(headers, 'Date');\n const subjectHeader = getHeader(headers, 'Subject');\n\n const to = formatRecipientHeader(toHeader, fmt);\n const from = formatRecipientHeader(fromHeader, fmt);\n const cc = formatRecipientHeader(ccHeader, fmt);\n const bcc = formatRecipientHeader(bccHeader, fmt);\n const date = normalizeDateToISO(dateHeader) ?? '';\n const subject = subjectHeader ?? '';\n\n const labels = (msg.labelIds || []).join(', ');\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body) {\n if (msg.payload) {\n if (msg.payload.body?.data) {\n const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');\n bodyFull = extractCurrentMessageFromText(rawBody);\n } else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {\n for (const part of msg.payload.parts) {\n if (part.body?.data) {\n const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');\n if (part.mimeType === 'text/plain') {\n bodyFull = extractCurrentMessageFromText(rawBody);\n break;\n }\n if (part.mimeType === 'text/html') {\n bodyFull = extractCurrentMessageFromHtmlToText(rawBody);\n break;\n }\n }\n }\n }\n }\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\nexport function toRowFromGmailSummary(msg: GmailEmailSummary, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = msg.provider || 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const to = formatRecipientHeader(msg.to ?? '', fmt);\n const from = formatRecipientHeader(msg.from ?? '', fmt);\n const cc = formatRecipientHeader(msg.cc ?? '', fmt);\n const bcc = formatRecipientHeader(msg.bcc ?? '', fmt);\n const date = normalizeDateToISO(msg.date) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n bodyFull = extractCurrentMessageFromText(msg.body);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(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","getHeader","headers","name","Array","isArray","header","find","h","toLowerCase","value","parseEmailHeader","headerValue","parts","current","inQuotes","i","length","char","push","trim","map","part","match","undefined","email","filter","token","formatRecipientHeader","mode","addresses","sanitizeForSheetsExport","text","GOOGLE_SHEETS_CELL_LIMIT","truncated","substring","toRowFromGmail","msg","opts","body","addressFormat","id","provider","threadId","fmt","payload","toHeader","fromHeader","ccHeader","bccHeader","dateHeader","subjectHeader","to","from","cc","bcc","date","subject","labels","labelIds","join","snippet","bodyFull","data","rawBody","Buffer","toString","mimeType","toRowFromGmailSummary","filterClientSide","filters","snippetOrPreview","fullBody","lower","a","t","String","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","f","c","bc","anyIncludes","val","tokens","includes","some","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"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"}
|
|
@@ -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-gmail/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
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export default function createPrompt() {
|
|
3
|
+
const argsSchema = z.object({
|
|
4
|
+
context: z.string().min(1).describe('Email context to draft response for'),
|
|
5
|
+
tone: z.string().optional().describe('Email tone (default: professional)')
|
|
6
|
+
});
|
|
7
|
+
const config = {
|
|
8
|
+
description: 'Draft an email response',
|
|
9
|
+
argsSchema: argsSchema.shape
|
|
10
|
+
};
|
|
11
|
+
const handler = async (args, _extra)=>{
|
|
12
|
+
const { context, tone } = argsSchema.parse(args);
|
|
13
|
+
return {
|
|
14
|
+
messages: [
|
|
15
|
+
{
|
|
16
|
+
role: 'system',
|
|
17
|
+
content: {
|
|
18
|
+
type: 'text',
|
|
19
|
+
text: 'You are an expert email assistant.'
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
role: 'user',
|
|
24
|
+
content: {
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: `Draft a ${tone || 'professional'} email:\n\n${context}`
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
name: 'draft-email',
|
|
34
|
+
config,
|
|
35
|
+
handler
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["z","createPrompt","argsSchema","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":"AAGA,SAASA,CAAC,QAAQ,MAAM;AAExB,eAAe,SAASC;IACtB,MAAMC,aAAaF,EAAEG,MAAM,CAAC;QAC1BC,SAASJ,EAAEK,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMR,EAAEK,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,MAAMG,SAAS;QACbC,aAAa;QACbT,YAAYA,WAAWU,KAAK;IAC9B;IAEA,MAAMC,UAAU,OAAOC,MAAgCC;QACrD,MAAM,EAAEX,OAAO,EAAEI,IAAI,EAAE,GAAGN,WAAWc,KAAK,CAACF;QAC3C,OAAO;YACLG,UAAU;gBACR;oBAAEC,MAAM;oBAAmBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM;oBAAqC;gBAAE;gBAC1G;oBAAEH,MAAM;oBAAiBC,SAAS;wBAAEC,MAAM;wBAAiBC,MAAM,CAAC,QAAQ,EAAEb,QAAQ,eAAe,WAAW,EAAEJ,SAAS;oBAAC;gBAAE;aAC7H;QACH;IACF;IAEA,OAAO;QACLkB,MAAM;QACNZ;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["default","draftEmail","querySyntax"],"mappings":"AAAA,SAASA,WAAWC,UAAU,QAAQ,mBAAmB;AACzD,SAASD,WAAWE,WAAW,QAAQ,oBAAoB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
+
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
export default function createPrompt(): {
|
|
4
|
+
name: string;
|
|
5
|
+
config: {
|
|
6
|
+
description: string;
|
|
7
|
+
};
|
|
8
|
+
handler: (_args: {
|
|
9
|
+
[x: string]: unknown;
|
|
10
|
+
}, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<{
|
|
11
|
+
messages: {
|
|
12
|
+
role: "user";
|
|
13
|
+
content: {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
};
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export default function createPrompt() {
|
|
2
|
+
const config = {
|
|
3
|
+
description: 'Reference guide for Gmail query syntax'
|
|
4
|
+
};
|
|
5
|
+
const handler = async (_args, _extra)=>{
|
|
6
|
+
return {
|
|
7
|
+
messages: [
|
|
8
|
+
{
|
|
9
|
+
role: 'user',
|
|
10
|
+
content: {
|
|
11
|
+
type: 'text',
|
|
12
|
+
text: `# Gmail Query Syntax Reference
|
|
13
|
+
|
|
14
|
+
## Logical Operators
|
|
15
|
+
- \`$and\`: Array of conditions that ALL must match
|
|
16
|
+
- \`$or\`: Array of conditions where ANY must match
|
|
17
|
+
- \`$not\`: Condition that must NOT match
|
|
18
|
+
|
|
19
|
+
## Email Address Fields
|
|
20
|
+
- \`from\`, \`to\`, \`cc\`, \`bcc\`: String or field operators
|
|
21
|
+
|
|
22
|
+
## Content Fields
|
|
23
|
+
- \`subject\`: Search subject line
|
|
24
|
+
- \`body\`: Search message body
|
|
25
|
+
- \`text\`: Search all text content
|
|
26
|
+
- \`fuzzyPhrase\`: Approximate phrase matching (words appear together)
|
|
27
|
+
|
|
28
|
+
## Boolean Flags
|
|
29
|
+
- \`hasAttachment\`: true/false
|
|
30
|
+
- \`isRead\`: true/false
|
|
31
|
+
|
|
32
|
+
## Date Range
|
|
33
|
+
\`\`\`json
|
|
34
|
+
{ "date": { "$gte": "2024-01-01", "$lt": "2024-12-31" } }
|
|
35
|
+
\`\`\`
|
|
36
|
+
|
|
37
|
+
## Gmail-Specific
|
|
38
|
+
- \`categories\`: primary, social, promotions, updates, forums
|
|
39
|
+
- \`label\`: User labels (case-sensitive, use gmail-labels-list to discover)
|
|
40
|
+
- \`rawGmailQuery\`: Escape hatch for advanced Gmail syntax
|
|
41
|
+
|
|
42
|
+
## Field Operators (for multi-value fields)
|
|
43
|
+
- \`$any\`: OR - matches if ANY value matches
|
|
44
|
+
- \`$all\`: AND - matches if ALL values match
|
|
45
|
+
- \`$none\`: NOT - matches if NONE match
|
|
46
|
+
|
|
47
|
+
## Example Queries
|
|
48
|
+
\`\`\`json
|
|
49
|
+
// Unread from specific sender
|
|
50
|
+
{ "from": "boss@company.com", "isRead": false }
|
|
51
|
+
|
|
52
|
+
// Recent with attachment
|
|
53
|
+
{ "hasAttachment": true, "date": { "$gte": "2024-01-01" } }
|
|
54
|
+
|
|
55
|
+
// Multiple senders
|
|
56
|
+
{ "from": { "$any": ["alice@example.com", "bob@example.com"] } }
|
|
57
|
+
|
|
58
|
+
// Complex: promotions OR social, unread
|
|
59
|
+
{ "$and": [
|
|
60
|
+
{ "categories": { "$any": ["promotions", "social"] } },
|
|
61
|
+
{ "isRead": false }
|
|
62
|
+
]}
|
|
63
|
+
\`\`\``
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
name: 'query-syntax',
|
|
71
|
+
config,
|
|
72
|
+
handler
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Gmail query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Gmail Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`fuzzyPhrase\\`: Approximate phrase matching (words appear together)\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Gmail-Specific\n- \\`categories\\`: primary, social, promotions, updates, forums\n- \\`label\\`: User labels (case-sensitive, use gmail-labels-list to discover)\n- \\`rawGmailQuery\\`: Escape hatch for advanced Gmail syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// Recent with attachment\n{ \"hasAttachment\": true, \"date\": { \"$gte\": \"2024-01-01\" } }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: promotions OR social, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"promotions\", \"social\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":"AAIA,eAAe,SAASA;IACtB,MAAMC,SAAS;QACbC,aAAa;IACf;IAEA,MAAMC,UAAU,OAAOC,OAAiCC;QACtD,OAAO;YACLC,UAAU;gBACR;oBACEC,MAAM;oBACNC,SAAS;wBACPC,MAAM;wBACNC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmDb,CAAC;oBACG;gBACF;aACD;QACH;IACF;IAEA,OAAO;QACLC,MAAM;QACNV;QACAE;IACF;AACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
3
|
+
import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
export default function createResource(): {
|
|
5
|
+
name: string;
|
|
6
|
+
template: ResourceTemplate;
|
|
7
|
+
config: import("@modelcontextprotocol/sdk/server/mcp.js").ResourceMetadata;
|
|
8
|
+
handler: (uri: URL, variables: {
|
|
9
|
+
id: string;
|
|
10
|
+
}, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => Promise<ReadResourceResult>;
|
|
11
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { google } from 'googleapis';
|
|
3
|
+
import { extractEmails, extractFrom } from '../../email/parsing/message-extraction.js';
|
|
4
|
+
import { toIsoUtc } from '../../lib/date-conversion.js';
|
|
5
|
+
export default function createResource() {
|
|
6
|
+
const template = new ResourceTemplate('gmail://messages/{id}', {
|
|
7
|
+
list: undefined
|
|
8
|
+
});
|
|
9
|
+
const config = {
|
|
10
|
+
description: 'Gmail message metadata (lightweight: id, subject, from, to, date)',
|
|
11
|
+
mimeType: 'application/json'
|
|
12
|
+
};
|
|
13
|
+
const handler = async (uri, variables, extra)=>{
|
|
14
|
+
try {
|
|
15
|
+
var _fullData_id, _headersMap_Subject;
|
|
16
|
+
var _fullData_payload;
|
|
17
|
+
const { logger, authContext } = extra;
|
|
18
|
+
logger.info(variables, 'gmail-email resource fetch');
|
|
19
|
+
const gmail = google.gmail({
|
|
20
|
+
version: 'v1',
|
|
21
|
+
auth: authContext.auth
|
|
22
|
+
});
|
|
23
|
+
const response = await gmail.users.messages.get({
|
|
24
|
+
userId: 'me',
|
|
25
|
+
id: variables.id,
|
|
26
|
+
format: 'metadata',
|
|
27
|
+
metadataHeaders: [
|
|
28
|
+
'From',
|
|
29
|
+
'To',
|
|
30
|
+
'Subject',
|
|
31
|
+
'Date'
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
const fullData = response.data;
|
|
35
|
+
if (!fullData) {
|
|
36
|
+
throw new Error('Message not found');
|
|
37
|
+
}
|
|
38
|
+
// Extract headers
|
|
39
|
+
const headers = fullData === null || fullData === void 0 ? void 0 : (_fullData_payload = fullData.payload) === null || _fullData_payload === void 0 ? void 0 : _fullData_payload.headers;
|
|
40
|
+
const headersArray = Array.isArray(headers) ? headers : [];
|
|
41
|
+
const headersMap = Object.fromEntries(headersArray.map((h)=>{
|
|
42
|
+
var _header_name, _header_value;
|
|
43
|
+
const header = h;
|
|
44
|
+
return [
|
|
45
|
+
String((_header_name = header.name) !== null && _header_name !== void 0 ? _header_name : ''),
|
|
46
|
+
String((_header_value = header.value) !== null && _header_value !== void 0 ? _header_value : '')
|
|
47
|
+
];
|
|
48
|
+
}));
|
|
49
|
+
const fromInfo = extractFrom(headersMap.From);
|
|
50
|
+
const toStr = extractEmails(headersMap.To).join(', ');
|
|
51
|
+
// Return lightweight metadata only (no body/snippet)
|
|
52
|
+
const metadata = {
|
|
53
|
+
id: (_fullData_id = fullData.id) !== null && _fullData_id !== void 0 ? _fullData_id : variables.id,
|
|
54
|
+
subject: (_headersMap_Subject = headersMap.Subject) !== null && _headersMap_Subject !== void 0 ? _headersMap_Subject : '',
|
|
55
|
+
from: (fromInfo === null || fromInfo === void 0 ? void 0 : fromInfo.address) || headersMap.From,
|
|
56
|
+
to: toStr,
|
|
57
|
+
date: toIsoUtc(headersMap.Date) || headersMap.Date
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
contents: [
|
|
61
|
+
{
|
|
62
|
+
uri: uri.href,
|
|
63
|
+
mimeType: 'application/json',
|
|
64
|
+
text: JSON.stringify(metadata)
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
} catch (e) {
|
|
69
|
+
var _ref;
|
|
70
|
+
const { logger } = extra;
|
|
71
|
+
logger.error(e, 'gmail-email resource fetch failed');
|
|
72
|
+
const error = e;
|
|
73
|
+
return {
|
|
74
|
+
contents: [
|
|
75
|
+
{
|
|
76
|
+
uri: uri.href,
|
|
77
|
+
mimeType: 'application/json',
|
|
78
|
+
text: JSON.stringify({
|
|
79
|
+
error: String((_ref = error === null || error === void 0 ? void 0 : error.message) !== null && _ref !== void 0 ? _ref : e)
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
name: 'email',
|
|
88
|
+
template,
|
|
89
|
+
config,
|
|
90
|
+
handler
|
|
91
|
+
};
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/resources/email.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { type gmail_v1, google } from 'googleapis';\nimport { extractEmails, extractFrom } from '../../email/parsing/message-extraction.js';\nimport { toIsoUtc } from '../../lib/date-conversion.js';\n\nexport default function createResource() {\n const template = new ResourceTemplate('gmail://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Gmail message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'gmail-email resource fetch');\n\n const gmail = google.gmail({ version: 'v1', auth: authContext.auth });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: variables.id,\n format: 'metadata',\n metadataHeaders: ['From', 'To', 'Subject', 'Date'],\n });\n\n const fullData = response.data;\n if (!fullData) {\n throw new Error('Message not found');\n }\n\n // Extract headers\n const headers = fullData?.payload?.headers;\n const headersArray = Array.isArray(headers) ? headers : [];\n const headersMap: Record<string, string> = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as gmail_v1.Schema$MessagePartHeader;\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n\n const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: fullData.id ?? variables.id,\n subject: headersMap.Subject ?? '',\n from: fromInfo?.address || headersMap.From,\n to: toStr,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'gmail-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["ResourceTemplate","google","extractEmails","extractFrom","toIsoUtc","createResource","template","list","undefined","config","description","mimeType","handler","uri","variables","extra","fullData","headersMap","logger","authContext","info","gmail","version","auth","response","users","messages","get","userId","id","format","metadataHeaders","data","Error","headers","payload","headersArray","Array","isArray","Object","fromEntries","map","h","header","String","name","value","fromInfo","From","toStr","To","join","metadata","subject","Subject","from","address","to","date","Date","contents","href","text","JSON","stringify","e","error","message"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,0CAA0C;AAG3E,SAAwBC,MAAM,QAAQ,aAAa;AACnD,SAASC,aAAa,EAAEC,WAAW,QAAQ,4CAA4C;AACvF,SAASC,QAAQ,QAAQ,+BAA+B;AAExD,eAAe,SAASC;IACtB,MAAMC,WAAW,IAAIN,iBAAiB,yBAAyB;QAC7DO,MAAMC;IACR;IACA,MAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,MAAMC,UAAU,OAAOC,KAAUC,WAA2BC;QAC1D,IAAI;gBAiCIC,cACKC;gBAfKD;YAlBhB,MAAM,EAAEE,MAAM,EAAEC,WAAW,EAAE,GAAGJ;YAEhCG,OAAOE,IAAI,CAACN,WAAW;YAEvB,MAAMO,QAAQpB,OAAOoB,KAAK,CAAC;gBAAEC,SAAS;gBAAMC,MAAMJ,YAAYI,IAAI;YAAC;YACnE,MAAMC,WAAW,MAAMH,MAAMI,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC;gBAC9CC,QAAQ;gBACRC,IAAIf,UAAUe,EAAE;gBAChBC,QAAQ;gBACRC,iBAAiB;oBAAC;oBAAQ;oBAAM;oBAAW;iBAAO;YACpD;YAEA,MAAMf,WAAWQ,SAASQ,IAAI;YAC9B,IAAI,CAAChB,UAAU;gBACb,MAAM,IAAIiB,MAAM;YAClB;YAEA,kBAAkB;YAClB,MAAMC,UAAUlB,qBAAAA,gCAAAA,oBAAAA,SAAUmB,OAAO,cAAjBnB,wCAAAA,kBAAmBkB,OAAO;YAC1C,MAAME,eAAeC,MAAMC,OAAO,CAACJ,WAAWA,UAAU,EAAE;YAC1D,MAAMjB,aAAqCsB,OAAOC,WAAW,CAC3DJ,aAAaK,GAAG,CAAC,CAACC;oBAEDC,cAA2BA;gBAD1C,MAAMA,SAASD;gBACf,OAAO;oBAACE,QAAOD,eAAAA,OAAOE,IAAI,cAAXF,0BAAAA,eAAe;oBAAKC,QAAOD,gBAAAA,OAAOG,KAAK,cAAZH,2BAAAA,gBAAgB;iBAAI;YAChE;YAGF,MAAMI,WAAW5C,YAAYc,WAAW+B,IAAI;YAC5C,MAAMC,QAAQ/C,cAAce,WAAWiC,EAAE,EAAEC,IAAI,CAAC;YAEhD,qDAAqD;YACrD,MAAMC,WAAW;gBACfvB,EAAE,GAAEb,eAAAA,SAASa,EAAE,cAAXb,0BAAAA,eAAeF,UAAUe,EAAE;gBAC/BwB,OAAO,GAAEpC,sBAAAA,WAAWqC,OAAO,cAAlBrC,iCAAAA,sBAAsB;gBAC/BsC,MAAMR,CAAAA,qBAAAA,+BAAAA,SAAUS,OAAO,KAAIvC,WAAW+B,IAAI;gBAC1CS,IAAIR;gBACJS,MAAMtD,SAASa,WAAW0C,IAAI,KAAK1C,WAAW0C,IAAI;YACpD;YAEA,OAAO;gBACLC,UAAU;oBACR;wBACE/C,KAAKA,IAAIgD,IAAI;wBACblD,UAAU;wBACVmD,MAAMC,KAAKC,SAAS,CAACZ;oBACvB;iBACD;YACH;QACF,EAAE,OAAOa,GAAG;;YACV,MAAM,EAAE/C,MAAM,EAAE,GAAGH;YACnBG,OAAOgD,KAAK,CAACD,GAA8B;YAC3C,MAAMC,QAAQD;YACd,OAAO;gBACLL,UAAU;oBACR;wBACE/C,KAAKA,IAAIgD,IAAI;wBACblD,UAAU;wBACVmD,MAAMC,KAAKC,SAAS,CAAC;4BAAEE,OAAOtB,eAAOsB,kBAAAA,4BAAAA,MAAOC,OAAO,uCAAIF;wBAAG;oBAC5D;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLpB,MAAM;QACNvC;QACAG;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as email } from './email.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as email } from './email.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/resources/index.ts"],"sourcesContent":["export { default as email } from './email.js';\n"],"names":["default","email"],"mappings":"AAAA,SAASA,WAAWC,KAAK,QAAQ,aAAa"}
|