@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,58 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
4
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
5
|
+
type: z.ZodLiteral<"success">;
|
|
6
|
+
items: z.ZodArray<z.ZodObject<{
|
|
7
|
+
id: z.ZodString;
|
|
8
|
+
name: z.ZodString;
|
|
9
|
+
description: z.ZodString;
|
|
10
|
+
}, z.core.$strip>>;
|
|
11
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
12
|
+
type: z.ZodLiteral<"auth_required">;
|
|
13
|
+
provider: z.ZodString;
|
|
14
|
+
message: z.ZodString;
|
|
15
|
+
url: z.ZodOptional<z.ZodString>;
|
|
16
|
+
}, z.core.$strip>], "type">;
|
|
17
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
18
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
19
|
+
declare function handler(_args: Input, extra: EnrichedExtra): Promise<{
|
|
20
|
+
content: {
|
|
21
|
+
type: "text";
|
|
22
|
+
text: string;
|
|
23
|
+
}[];
|
|
24
|
+
structuredContent: {
|
|
25
|
+
result: {
|
|
26
|
+
type: "success";
|
|
27
|
+
items: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
}[];
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
export default function createTool(): {
|
|
36
|
+
name: string;
|
|
37
|
+
config: {
|
|
38
|
+
readonly description: "List Gmail category labels (CATEGORY_*) with IDs and descriptions.";
|
|
39
|
+
readonly inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
40
|
+
readonly outputSchema: z.ZodObject<{
|
|
41
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
42
|
+
type: z.ZodLiteral<"success">;
|
|
43
|
+
items: z.ZodArray<z.ZodObject<{
|
|
44
|
+
id: z.ZodString;
|
|
45
|
+
name: z.ZodString;
|
|
46
|
+
description: z.ZodString;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
49
|
+
type: z.ZodLiteral<"auth_required">;
|
|
50
|
+
provider: z.ZodString;
|
|
51
|
+
message: z.ZodString;
|
|
52
|
+
url: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, z.core.$strip>], "type">;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
};
|
|
56
|
+
handler: typeof handler;
|
|
57
|
+
};
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { schemas } from '@mcp-z/oauth-google';
|
|
2
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
3
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { google } from 'googleapis';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// Schema for individual category items
|
|
7
|
+
const CategorySchema = z.object({
|
|
8
|
+
id: z.string().describe('Gmail category ID (e.g., CATEGORY_PERSONAL)'),
|
|
9
|
+
name: z.string().describe('Human-readable category name'),
|
|
10
|
+
description: z.string().describe('Description of what emails belong in this category')
|
|
11
|
+
});
|
|
12
|
+
const inputSchema = z.object({});
|
|
13
|
+
// Success branch schema
|
|
14
|
+
const successBranchSchema = z.object({
|
|
15
|
+
type: z.literal('success'),
|
|
16
|
+
items: z.array(CategorySchema)
|
|
17
|
+
});
|
|
18
|
+
// Output schema with auth_required support
|
|
19
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
20
|
+
successBranchSchema,
|
|
21
|
+
AuthRequiredBranchSchema
|
|
22
|
+
]);
|
|
23
|
+
const config = {
|
|
24
|
+
description: 'List Gmail category labels (CATEGORY_*) with IDs and descriptions.',
|
|
25
|
+
inputSchema: inputSchema,
|
|
26
|
+
outputSchema: z.object({
|
|
27
|
+
result: outputSchema
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
async function handler(_args, extra) {
|
|
31
|
+
const logger = extra.logger;
|
|
32
|
+
logger.info('gmail.categories.list called');
|
|
33
|
+
try {
|
|
34
|
+
const gmail = google.gmail({
|
|
35
|
+
version: 'v1',
|
|
36
|
+
auth: extra.authContext.auth
|
|
37
|
+
});
|
|
38
|
+
const started = Date.now();
|
|
39
|
+
// Fetch all labels from Gmail API
|
|
40
|
+
const response = await gmail.users.labels.list({
|
|
41
|
+
userId: 'me'
|
|
42
|
+
});
|
|
43
|
+
const labels = response.data.labels || [];
|
|
44
|
+
// Filter for CATEGORY_* system labels and map to our schema
|
|
45
|
+
const categories = labels.filter((label)=>{
|
|
46
|
+
var _label_id;
|
|
47
|
+
return (_label_id = label.id) === null || _label_id === void 0 ? void 0 : _label_id.startsWith('CATEGORY_');
|
|
48
|
+
}).map((label)=>{
|
|
49
|
+
const id = label.id;
|
|
50
|
+
let name = label.name || id;
|
|
51
|
+
let description = '';
|
|
52
|
+
// Map known category types to user-friendly names and descriptions
|
|
53
|
+
switch(id){
|
|
54
|
+
case 'CATEGORY_PERSONAL':
|
|
55
|
+
name = 'Primary';
|
|
56
|
+
description = 'Important emails from people you know';
|
|
57
|
+
break;
|
|
58
|
+
case 'CATEGORY_SOCIAL':
|
|
59
|
+
name = 'Social';
|
|
60
|
+
description = 'Social networks and social websites';
|
|
61
|
+
break;
|
|
62
|
+
case 'CATEGORY_PROMOTIONS':
|
|
63
|
+
name = 'Promotions';
|
|
64
|
+
description = 'Deals, offers, and marketing emails';
|
|
65
|
+
break;
|
|
66
|
+
case 'CATEGORY_UPDATES':
|
|
67
|
+
name = 'Updates';
|
|
68
|
+
description = 'Confirmations, receipts, bills, and statements';
|
|
69
|
+
break;
|
|
70
|
+
case 'CATEGORY_FORUMS':
|
|
71
|
+
name = 'Forums';
|
|
72
|
+
description = 'Online groups, discussion boards, mailing lists';
|
|
73
|
+
break;
|
|
74
|
+
default:
|
|
75
|
+
// For any unknown CATEGORY_* labels, use the label name as-is
|
|
76
|
+
name = label.name || id.replace('CATEGORY_', '');
|
|
77
|
+
description = `Gmail category: ${name}`;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
name,
|
|
82
|
+
description
|
|
83
|
+
};
|
|
84
|
+
}).sort((a, b)=>a.name.localeCompare(b.name)); // Sort alphabetically by name
|
|
85
|
+
const durationMs = Date.now() - started;
|
|
86
|
+
logger.info('gmail.categories.list results', {
|
|
87
|
+
categoryCount: categories.length,
|
|
88
|
+
totalLabels: labels.length
|
|
89
|
+
});
|
|
90
|
+
logger.info('gmail.categories.list metrics', {
|
|
91
|
+
durationMs
|
|
92
|
+
});
|
|
93
|
+
const result = {
|
|
94
|
+
type: 'success',
|
|
95
|
+
items: categories
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
content: [
|
|
99
|
+
{
|
|
100
|
+
type: 'text',
|
|
101
|
+
text: JSON.stringify(result)
|
|
102
|
+
}
|
|
103
|
+
],
|
|
104
|
+
structuredContent: {
|
|
105
|
+
result
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
} catch (error) {
|
|
109
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
110
|
+
logger.error('gmail.categories.list error', {
|
|
111
|
+
error: message
|
|
112
|
+
});
|
|
113
|
+
throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {
|
|
114
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export default function createTool() {
|
|
119
|
+
return {
|
|
120
|
+
name: 'categories-list',
|
|
121
|
+
config,
|
|
122
|
+
handler
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\n// Schema for individual category items\nconst CategorySchema = z.object({\n id: z.string().describe('Gmail category ID (e.g., CATEGORY_PERSONAL)'),\n name: z.string().describe('Human-readable category name'),\n description: z.string().describe('Description of what emails belong in this category'),\n});\n\nconst inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(CategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Gmail category labels (CATEGORY_*) with IDs and descriptions.',\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(_args: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.categories.list called');\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n const started = Date.now();\n\n // Fetch all labels from Gmail API\n const response = await gmail.users.labels.list({ userId: 'me' });\n const labels = response.data.labels || [];\n\n // Filter for CATEGORY_* system labels and map to our schema\n const categories = labels\n .filter((label) => label.id?.startsWith('CATEGORY_'))\n .map((label) => {\n const id = label.id as string;\n let name = label.name || id;\n let description = '';\n\n // Map known category types to user-friendly names and descriptions\n switch (id) {\n case 'CATEGORY_PERSONAL':\n name = 'Primary';\n description = 'Important emails from people you know';\n break;\n case 'CATEGORY_SOCIAL':\n name = 'Social';\n description = 'Social networks and social websites';\n break;\n case 'CATEGORY_PROMOTIONS':\n name = 'Promotions';\n description = 'Deals, offers, and marketing emails';\n break;\n case 'CATEGORY_UPDATES':\n name = 'Updates';\n description = 'Confirmations, receipts, bills, and statements';\n break;\n case 'CATEGORY_FORUMS':\n name = 'Forums';\n description = 'Online groups, discussion boards, mailing lists';\n break;\n default:\n // For any unknown CATEGORY_* labels, use the label name as-is\n name = label.name || id.replace('CATEGORY_', '');\n description = `Gmail category: ${name}`;\n }\n\n return {\n id,\n name,\n description,\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name)); // Sort alphabetically by name\n\n const durationMs = Date.now() - started;\n\n logger.info('gmail.categories.list results', { categoryCount: categories.length, totalLabels: labels.length });\n logger.info('gmail.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories,\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('gmail.categories.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","CategorySchema","object","id","string","describe","name","description","inputSchema","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","result","handler","_args","extra","logger","info","gmail","version","auth","authContext","started","Date","now","response","users","labels","list","userId","data","categories","filter","label","startsWith","map","replace","sort","a","b","localeCompare","durationMs","categoryCount","length","totalLabels","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { default as categoriesList } from './categories-list.js';
|
|
2
|
+
export { default as labelAdd } from './label-add.js';
|
|
3
|
+
export { default as labelDelete } from './label-delete.js';
|
|
4
|
+
export { default as labelsList } from './labels-list.js';
|
|
5
|
+
export { default as messageGet } from './message-get.js';
|
|
6
|
+
export { default as messageMarkRead } from './message-mark-read.js';
|
|
7
|
+
export { default as messageMoveToTrash } from './message-move-to-trash.js';
|
|
8
|
+
export { default as messageRespond } from './message-respond.js';
|
|
9
|
+
export { default as messageSearch } from './message-search.js';
|
|
10
|
+
export { default as messageSend } from './message-send.js';
|
|
11
|
+
export { default as messagesExportCsv } from './messages-export-csv.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { default as categoriesList } from './categories-list.js';
|
|
2
|
+
export { default as labelAdd } from './label-add.js';
|
|
3
|
+
export { default as labelDelete } from './label-delete.js';
|
|
4
|
+
export { default as labelsList } from './labels-list.js';
|
|
5
|
+
export { default as messageGet } from './message-get.js';
|
|
6
|
+
export { default as messageMarkRead } from './message-mark-read.js';
|
|
7
|
+
export { default as messageMoveToTrash } from './message-move-to-trash.js';
|
|
8
|
+
export { default as messageRespond } from './message-respond.js';
|
|
9
|
+
export { default as messageSearch } from './message-search.js';
|
|
10
|
+
export { default as messageSend } from './message-send.js';
|
|
11
|
+
export { default as messagesExportCsv } from './messages-export-csv.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/index.ts"],"sourcesContent":["export { default as categoriesList } from './categories-list.js';\nexport { default as labelAdd } from './label-add.js';\nexport { default as labelDelete } from './label-delete.js';\nexport { default as labelsList } from './labels-list.js';\nexport { default as messageGet } from './message-get.js';\nexport { default as messageMarkRead } from './message-mark-read.js';\nexport { default as messageMoveToTrash } from './message-move-to-trash.js';\nexport { default as messageRespond } from './message-respond.js';\nexport { default as messageSearch } from './message-search.js';\nexport { default as messageSend } from './message-send.js';\nexport { default as messagesExportCsv } from './messages-export-csv.js';\n"],"names":["default","categoriesList","labelAdd","labelDelete","labelsList","messageGet","messageMarkRead","messageMoveToTrash","messageRespond","messageSearch","messageSend","messagesExportCsv"],"mappings":"AAAA,SAASA,WAAWC,cAAc,QAAQ,uBAAuB;AACjE,SAASD,WAAWE,QAAQ,QAAQ,iBAAiB;AACrD,SAASF,WAAWG,WAAW,QAAQ,oBAAoB;AAC3D,SAASH,WAAWI,UAAU,QAAQ,mBAAmB;AACzD,SAASJ,WAAWK,UAAU,QAAQ,mBAAmB;AACzD,SAASL,WAAWM,eAAe,QAAQ,yBAAyB;AACpE,SAASN,WAAWO,kBAAkB,QAAQ,6BAA6B;AAC3E,SAASP,WAAWQ,cAAc,QAAQ,uBAAuB;AACjE,SAASR,WAAWS,aAAa,QAAQ,sBAAsB;AAC/D,SAAST,WAAWU,WAAW,QAAQ,oBAAoB;AAC3D,SAASV,WAAWW,iBAAiB,QAAQ,2BAA2B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
id: z.ZodCoercedString<unknown>;
|
|
5
|
+
label: z.ZodCoercedString<unknown>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
8
|
+
type: z.ZodLiteral<"success">;
|
|
9
|
+
item: z.ZodObject<{
|
|
10
|
+
id: z.ZodString;
|
|
11
|
+
label: z.ZodString;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
14
|
+
type: z.ZodLiteral<"auth_required">;
|
|
15
|
+
provider: z.ZodString;
|
|
16
|
+
message: z.ZodString;
|
|
17
|
+
url: z.ZodOptional<z.ZodString>;
|
|
18
|
+
}, z.core.$strip>], "type">;
|
|
19
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
20
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
21
|
+
declare function handler({ id, label }: Input, extra: EnrichedExtra): Promise<{
|
|
22
|
+
content: {
|
|
23
|
+
type: "text";
|
|
24
|
+
text: string;
|
|
25
|
+
}[];
|
|
26
|
+
structuredContent: {
|
|
27
|
+
result: {
|
|
28
|
+
type: "success";
|
|
29
|
+
item: {
|
|
30
|
+
id: string;
|
|
31
|
+
label: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
export default function createTool(): {
|
|
37
|
+
name: string;
|
|
38
|
+
config: {
|
|
39
|
+
readonly description: "Add a label to a Gmail message";
|
|
40
|
+
readonly inputSchema: z.ZodObject<{
|
|
41
|
+
id: z.ZodCoercedString<unknown>;
|
|
42
|
+
label: z.ZodCoercedString<unknown>;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
readonly outputSchema: z.ZodObject<{
|
|
45
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
46
|
+
type: z.ZodLiteral<"success">;
|
|
47
|
+
item: z.ZodObject<{
|
|
48
|
+
id: z.ZodString;
|
|
49
|
+
label: z.ZodString;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
52
|
+
type: z.ZodLiteral<"auth_required">;
|
|
53
|
+
provider: z.ZodString;
|
|
54
|
+
message: z.ZodString;
|
|
55
|
+
url: z.ZodOptional<z.ZodString>;
|
|
56
|
+
}, z.core.$strip>], "type">;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
};
|
|
59
|
+
handler: typeof handler;
|
|
60
|
+
};
|
|
61
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { schemas } from '@mcp-z/oauth-google';
|
|
2
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
3
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { google } from 'googleapis';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { ensureLabelId } from '../../labels/gmail-labels.js';
|
|
7
|
+
const inputSchema = z.object({
|
|
8
|
+
id: z.coerce.string().trim().min(1).describe('Gmail message ID to add label to'),
|
|
9
|
+
label: z.coerce.string().trim().min(1).describe('Label name or ID (use gmail-labels-list to discover available labels)')
|
|
10
|
+
});
|
|
11
|
+
// Success branch schema
|
|
12
|
+
const successBranchSchema = z.object({
|
|
13
|
+
type: z.literal('success'),
|
|
14
|
+
item: z.object({
|
|
15
|
+
id: z.string().describe('Message ID the label was added to'),
|
|
16
|
+
label: z.string().describe('Label that was added')
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
// Output schema with auth_required support
|
|
20
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
21
|
+
successBranchSchema,
|
|
22
|
+
AuthRequiredBranchSchema
|
|
23
|
+
]);
|
|
24
|
+
const config = {
|
|
25
|
+
description: 'Add a label to a Gmail message',
|
|
26
|
+
inputSchema: inputSchema,
|
|
27
|
+
outputSchema: z.object({
|
|
28
|
+
result: outputSchema
|
|
29
|
+
})
|
|
30
|
+
};
|
|
31
|
+
async function handler({ id, label }, extra) {
|
|
32
|
+
const logger = extra.logger;
|
|
33
|
+
logger.info('gmail.label.add called', {
|
|
34
|
+
id,
|
|
35
|
+
label
|
|
36
|
+
});
|
|
37
|
+
if (!id || !label) {
|
|
38
|
+
logger.info('gmail.label.add missing parameters', {
|
|
39
|
+
id,
|
|
40
|
+
label
|
|
41
|
+
});
|
|
42
|
+
throw new McpError(ErrorCode.InvalidParams, 'Missing id or label');
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const gmail = google.gmail({
|
|
46
|
+
version: 'v1',
|
|
47
|
+
auth: extra.authContext.auth
|
|
48
|
+
});
|
|
49
|
+
const labelId = await ensureLabelId(gmail, 'me', label);
|
|
50
|
+
await gmail.users.messages.modify({
|
|
51
|
+
userId: 'me',
|
|
52
|
+
id: id,
|
|
53
|
+
requestBody: {
|
|
54
|
+
addLabelIds: [
|
|
55
|
+
labelId
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
logger.info('gmail.label.add success', {
|
|
60
|
+
id,
|
|
61
|
+
label
|
|
62
|
+
});
|
|
63
|
+
logger.info('gmail.label.add result (typed)', {
|
|
64
|
+
id,
|
|
65
|
+
label
|
|
66
|
+
});
|
|
67
|
+
const result = {
|
|
68
|
+
type: 'success',
|
|
69
|
+
item: {
|
|
70
|
+
id,
|
|
71
|
+
label
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: 'text',
|
|
78
|
+
text: JSON.stringify(result)
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
structuredContent: {
|
|
82
|
+
result
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
} catch (error) {
|
|
86
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
87
|
+
logger.error('gmail.label.add error', {
|
|
88
|
+
error: message
|
|
89
|
+
});
|
|
90
|
+
throw new McpError(ErrorCode.InternalError, `Error adding label to message: ${message}`, {
|
|
91
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export default function createTool() {
|
|
96
|
+
return {
|
|
97
|
+
name: 'label-add',
|
|
98
|
+
config,
|
|
99
|
+
handler
|
|
100
|
+
};
|
|
101
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/mcp/tools/label-add.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { ensureLabelId } from '../../labels/gmail-labels.js';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to add label to'),\n label: z.coerce.string().trim().min(1).describe('Label name or ID (use gmail-labels-list to discover available labels)'),\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: z.object({\n id: z.string().describe('Message ID the label was added to'),\n label: z.string().describe('Label that was added'),\n }),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Add a label to a Gmail message',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, label }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.label.add called', { id, label });\n\n if (!id || !label) {\n logger.info('gmail.label.add missing parameters', { id, label });\n throw new McpError(ErrorCode.InvalidParams, 'Missing id or label');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n\n const labelId = await ensureLabelId(gmail, 'me', label);\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n addLabelIds: [labelId],\n },\n });\n\n logger.info('gmail.label.add success', { id, label });\n logger.info('gmail.label.add result (typed)', { id, label });\n\n const result: Output = {\n type: 'success' as const,\n item: { id, label },\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('gmail.label.add error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error adding label to message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-add',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","ErrorCode","McpError","google","z","ensureLabelId","inputSchema","object","id","coerce","string","trim","min","describe","label","successBranchSchema","type","literal","item","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","info","InvalidParams","gmail","version","auth","authContext","labelId","users","messages","modify","userId","requestBody","addLabelIds","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","undefined","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,sBAAsB;AAE9C,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAASE,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AACzE,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,aAAa,QAAQ,+BAA+B;AAE7D,MAAMC,cAAcF,EAAEG,MAAM,CAAC;IAC3BC,IAAIJ,EAAEK,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;IAC7CC,OAAOV,EAAEK,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAClD;AAEA,wBAAwB;AACxB,MAAME,sBAAsBX,EAAEG,MAAM,CAAC;IACnCS,MAAMZ,EAAEa,OAAO,CAAC;IAChBC,MAAMd,EAAEG,MAAM,CAAC;QACbC,IAAIJ,EAAEM,MAAM,GAAGG,QAAQ,CAAC;QACxBC,OAAOV,EAAEM,MAAM,GAAGG,QAAQ,CAAC;IAC7B;AACF;AAEA,2CAA2C;AAC3C,MAAMM,eAAef,EAAEgB,kBAAkB,CAAC,QAAQ;IAACL;IAAqBf;CAAyB;AAEjG,MAAMqB,SAAS;IACbC,aAAa;IACbhB,aAAaA;IACba,cAAcf,EAAEG,MAAM,CAAC;QACrBgB,QAAQJ;IACV;AACF;AAKA,eAAeK,QAAQ,EAAEhB,EAAE,EAAEM,KAAK,EAAS,EAAEW,KAAoB;IAC/D,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC,0BAA0B;QAAEnB;QAAIM;IAAM;IAElD,IAAI,CAACN,MAAM,CAACM,OAAO;QACjBY,OAAOC,IAAI,CAAC,sCAAsC;YAAEnB;YAAIM;QAAM;QAC9D,MAAM,IAAIZ,SAASD,UAAU2B,aAAa,EAAE;IAC9C;IAEA,IAAI;QACF,MAAMC,QAAQ1B,OAAO0B,KAAK,CAAC;YAAEC,SAAS;YAAMC,MAAMN,MAAMO,WAAW,CAACD,IAAI;QAAC;QAEzE,MAAME,UAAU,MAAM5B,cAAcwB,OAAO,MAAMf;QACjD,MAAMe,MAAMK,KAAK,CAACC,QAAQ,CAACC,MAAM,CAAC;YAChCC,QAAQ;YACR7B,IAAIA;YACJ8B,aAAa;gBACXC,aAAa;oBAACN;iBAAQ;YACxB;QACF;QAEAP,OAAOC,IAAI,CAAC,2BAA2B;YAAEnB;YAAIM;QAAM;QACnDY,OAAOC,IAAI,CAAC,kCAAkC;YAAEnB;YAAIM;QAAM;QAE1D,MAAMS,SAAiB;YACrBP,MAAM;YACNE,MAAM;gBAAEV;gBAAIM;YAAM;QACpB;QAEA,OAAO;YACL0B,SAAS;gBACP;oBACExB,MAAM;oBACNyB,MAAMC,KAAKC,SAAS,CAACpB;gBACvB;aACD;YACDqB,mBAAmB;gBAAErB;YAAO;QAC9B;IACF,EAAE,OAAOsB,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChEnB,OAAOmB,KAAK,CAAC,yBAAyB;YAAEA,OAAOC;QAAQ;QAEvD,MAAM,IAAI5C,SAASD,UAAUgD,aAAa,EAAE,CAAC,+BAA+B,EAAEH,SAAS,EAAE;YACvFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGC;QAChD;IACF;AACF;AAEA,eAAe,SAASC;IACtB,OAAO;QACLC,MAAM;QACNhC;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { EnrichedExtra } from '@mcp-z/oauth-google';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
ids: z.ZodArray<z.ZodCoercedString<unknown>>;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
7
|
+
type: z.ZodLiteral<"success">;
|
|
8
|
+
totalRequested: z.ZodNumber;
|
|
9
|
+
successCount: z.ZodNumber;
|
|
10
|
+
failureCount: z.ZodNumber;
|
|
11
|
+
results: z.ZodArray<z.ZodObject<{
|
|
12
|
+
id: z.ZodString;
|
|
13
|
+
success: z.ZodBoolean;
|
|
14
|
+
error: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strip>>;
|
|
16
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
17
|
+
type: z.ZodLiteral<"auth_required">;
|
|
18
|
+
provider: z.ZodString;
|
|
19
|
+
message: z.ZodString;
|
|
20
|
+
url: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strip>], "type">;
|
|
22
|
+
export type Input = z.infer<typeof inputSchema>;
|
|
23
|
+
export type Output = z.infer<typeof outputSchema>;
|
|
24
|
+
declare function handler({ ids }: Input, extra: EnrichedExtra): Promise<{
|
|
25
|
+
content: {
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
structuredContent: {
|
|
30
|
+
result: {
|
|
31
|
+
type: "success";
|
|
32
|
+
totalRequested: number;
|
|
33
|
+
successCount: number;
|
|
34
|
+
failureCount: number;
|
|
35
|
+
results: {
|
|
36
|
+
id: string;
|
|
37
|
+
success: boolean;
|
|
38
|
+
error?: string;
|
|
39
|
+
}[];
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
export default function createTool(): {
|
|
44
|
+
name: string;
|
|
45
|
+
config: {
|
|
46
|
+
readonly description: "Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.";
|
|
47
|
+
readonly inputSchema: z.ZodObject<{
|
|
48
|
+
ids: z.ZodArray<z.ZodCoercedString<unknown>>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
readonly outputSchema: z.ZodObject<{
|
|
51
|
+
result: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
52
|
+
type: z.ZodLiteral<"success">;
|
|
53
|
+
totalRequested: z.ZodNumber;
|
|
54
|
+
successCount: z.ZodNumber;
|
|
55
|
+
failureCount: z.ZodNumber;
|
|
56
|
+
results: z.ZodArray<z.ZodObject<{
|
|
57
|
+
id: z.ZodString;
|
|
58
|
+
success: z.ZodBoolean;
|
|
59
|
+
error: z.ZodOptional<z.ZodString>;
|
|
60
|
+
}, z.core.$strip>>;
|
|
61
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
62
|
+
type: z.ZodLiteral<"auth_required">;
|
|
63
|
+
provider: z.ZodString;
|
|
64
|
+
message: z.ZodString;
|
|
65
|
+
url: z.ZodOptional<z.ZodString>;
|
|
66
|
+
}, z.core.$strip>], "type">;
|
|
67
|
+
}, z.core.$strip>;
|
|
68
|
+
};
|
|
69
|
+
handler: typeof handler;
|
|
70
|
+
};
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { schemas } from '@mcp-z/oauth-google';
|
|
2
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
3
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { google } from 'googleapis';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.js';
|
|
7
|
+
const inputSchema = z.object({
|
|
8
|
+
ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail label IDs to delete')
|
|
9
|
+
});
|
|
10
|
+
const successBranchSchema = z.object({
|
|
11
|
+
type: z.literal('success'),
|
|
12
|
+
totalRequested: z.number().describe('Total number of labels requested to delete'),
|
|
13
|
+
successCount: z.number().describe('Number of labels successfully deleted'),
|
|
14
|
+
failureCount: z.number().describe('Number of labels that failed to delete'),
|
|
15
|
+
results: z.array(z.object({
|
|
16
|
+
id: z.string().describe('Label ID'),
|
|
17
|
+
success: z.boolean().describe('Whether the operation succeeded'),
|
|
18
|
+
error: z.string().optional().describe('Error message if operation failed')
|
|
19
|
+
})).describe('Individual results for each label')
|
|
20
|
+
});
|
|
21
|
+
const outputSchema = z.discriminatedUnion('type', [
|
|
22
|
+
successBranchSchema,
|
|
23
|
+
AuthRequiredBranchSchema
|
|
24
|
+
]);
|
|
25
|
+
const config = {
|
|
26
|
+
description: 'Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.',
|
|
27
|
+
inputSchema: inputSchema,
|
|
28
|
+
outputSchema: z.object({
|
|
29
|
+
result: outputSchema
|
|
30
|
+
})
|
|
31
|
+
};
|
|
32
|
+
async function handler({ ids }, extra) {
|
|
33
|
+
const logger = extra.logger;
|
|
34
|
+
logger.info('gmail-label-delete called', {
|
|
35
|
+
count: ids.length
|
|
36
|
+
});
|
|
37
|
+
if (!ids || ids.length === 0) {
|
|
38
|
+
throw new McpError(ErrorCode.InvalidParams, 'Missing ids');
|
|
39
|
+
}
|
|
40
|
+
// Validate batch size to prevent memory exhaustion
|
|
41
|
+
if (ids.length > MAX_BATCH_SIZE) {
|
|
42
|
+
throw new McpError(ErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);
|
|
43
|
+
}
|
|
44
|
+
// Validate and sanitize IDs
|
|
45
|
+
const validatedIds = [];
|
|
46
|
+
const invalidIds = [];
|
|
47
|
+
for (const id of ids){
|
|
48
|
+
const trimmedId = id.trim();
|
|
49
|
+
if (!trimmedId) {
|
|
50
|
+
invalidIds.push(id);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Basic Gmail label ID validation - should not contain certain characters
|
|
54
|
+
if (trimmedId.includes('/') || trimmedId.includes('\\') || trimmedId.includes('<') || trimmedId.includes('>')) {
|
|
55
|
+
invalidIds.push(id);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
validatedIds.push(trimmedId);
|
|
59
|
+
}
|
|
60
|
+
if (invalidIds.length > 0) {
|
|
61
|
+
throw new McpError(ErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
if (validatedIds.length === 0) {
|
|
64
|
+
throw new McpError(ErrorCode.InvalidParams, 'No valid IDs found after validation');
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const gmail = google.gmail({
|
|
68
|
+
version: 'v1',
|
|
69
|
+
auth: extra.authContext.auth
|
|
70
|
+
});
|
|
71
|
+
// Get all labels first to check for system labels
|
|
72
|
+
const labelsResponse = await gmail.users.labels.list({
|
|
73
|
+
userId: 'me'
|
|
74
|
+
});
|
|
75
|
+
const allLabels = labelsResponse.data.labels || [];
|
|
76
|
+
const labelMap = new Map(allLabels.map((label)=>[
|
|
77
|
+
label.id || '',
|
|
78
|
+
label
|
|
79
|
+
]));
|
|
80
|
+
// Process deletions in chunks to prevent memory exhaustion
|
|
81
|
+
const allResults = [];
|
|
82
|
+
for(let i = 0; i < validatedIds.length; i += CHUNK_SIZE){
|
|
83
|
+
const chunk = validatedIds.slice(i, i + CHUNK_SIZE);
|
|
84
|
+
logger.info('Processing chunk', {
|
|
85
|
+
chunkIndex: i / CHUNK_SIZE + 1,
|
|
86
|
+
chunkSize: chunk.length,
|
|
87
|
+
totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE)
|
|
88
|
+
});
|
|
89
|
+
const chunkResults = await Promise.allSettled(chunk.map(async (id)=>{
|
|
90
|
+
const label = labelMap.get(id);
|
|
91
|
+
// Check if label exists
|
|
92
|
+
if (!label) {
|
|
93
|
+
throw new Error(`Label not found: ${id}`);
|
|
94
|
+
}
|
|
95
|
+
// Check if it's a system label
|
|
96
|
+
if (label.type === 'system') {
|
|
97
|
+
throw new Error(`Cannot delete system label: ${label.name} (${id})`);
|
|
98
|
+
}
|
|
99
|
+
// Delete the label
|
|
100
|
+
await gmail.users.labels.delete({
|
|
101
|
+
userId: 'me',
|
|
102
|
+
id: id
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
id,
|
|
106
|
+
success: true
|
|
107
|
+
};
|
|
108
|
+
}));
|
|
109
|
+
// Process chunk results
|
|
110
|
+
const processedChunkResults = chunkResults.map((result, chunkIndex)=>{
|
|
111
|
+
const id = chunk[chunkIndex];
|
|
112
|
+
if (!id) {
|
|
113
|
+
throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);
|
|
114
|
+
}
|
|
115
|
+
if (result.status === 'fulfilled') {
|
|
116
|
+
return {
|
|
117
|
+
id,
|
|
118
|
+
success: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Extract error message more robustly
|
|
122
|
+
let errorMessage = 'Unknown error';
|
|
123
|
+
if (result.reason) {
|
|
124
|
+
if (typeof result.reason === 'string') {
|
|
125
|
+
errorMessage = result.reason;
|
|
126
|
+
} else if (result.reason instanceof Error) {
|
|
127
|
+
errorMessage = result.reason.message;
|
|
128
|
+
} else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {
|
|
129
|
+
errorMessage = String(result.reason.message);
|
|
130
|
+
} else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {
|
|
131
|
+
errorMessage = String(result.reason.error);
|
|
132
|
+
} else {
|
|
133
|
+
errorMessage = String(result.reason);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
id,
|
|
138
|
+
success: false,
|
|
139
|
+
error: errorMessage
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
allResults.push(...processedChunkResults);
|
|
143
|
+
}
|
|
144
|
+
const successCount = allResults.filter((r)=>r.success).length;
|
|
145
|
+
const failureCount = allResults.filter((r)=>!r.success).length;
|
|
146
|
+
logger.info('gmail-label-delete completed', {
|
|
147
|
+
totalRequested: validatedIds.length,
|
|
148
|
+
successCount,
|
|
149
|
+
failureCount,
|
|
150
|
+
chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE)
|
|
151
|
+
});
|
|
152
|
+
const result = {
|
|
153
|
+
type: 'success',
|
|
154
|
+
totalRequested: validatedIds.length,
|
|
155
|
+
successCount,
|
|
156
|
+
failureCount,
|
|
157
|
+
results: allResults
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: 'text',
|
|
163
|
+
text: JSON.stringify(result)
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
structuredContent: {
|
|
167
|
+
result
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
} catch (error) {
|
|
171
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
172
|
+
logger.error('gmail-label-delete error', {
|
|
173
|
+
error: message
|
|
174
|
+
});
|
|
175
|
+
throw new McpError(ErrorCode.InternalError, `Error deleting labels: ${message}`, {
|
|
176
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export default function createTool() {
|
|
181
|
+
return {
|
|
182
|
+
name: 'label-delete',
|
|
183
|
+
config,
|
|
184
|
+
handler
|
|
185
|
+
};
|
|
186
|
+
}
|