@mcp-z/mcp-gmail 2.0.0 → 2.1.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/dist/cjs/lib/google-auth.d.cts +9 -0
- package/dist/cjs/lib/google-auth.d.ts +9 -0
- package/dist/cjs/lib/google-auth.js +16 -0
- package/dist/cjs/lib/google-auth.js.map +1 -0
- package/dist/cjs/mcp/resources/email.js +2 -1
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.js +2 -1
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js +2 -1
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js +2 -1
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js +2 -1
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js +2 -1
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js +2 -1
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js +2 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js +2 -1
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js +2 -1
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js +2 -1
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js +2 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/lib/google-auth.d.ts +9 -0
- package/dist/esm/lib/google-auth.js +11 -0
- package/dist/esm/lib/google-auth.js.map +1 -0
- package/dist/esm/mcp/resources/email.js +2 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.js +2 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js +2 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.js +2 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.js +2 -1
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.js +2 -1
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js +2 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js +2 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js +2 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js +2 -1
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.js +2 -1
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.js +2 -1
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type GoogleAuthProvider } from '@mcp-z/oauth-google';
|
|
2
|
+
/**
|
|
3
|
+
* A Google API client bound to this request's token provider.
|
|
4
|
+
*
|
|
5
|
+
* `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client
|
|
6
|
+
* is built here, from this package's own `googleapis`. That keeps one copy of
|
|
7
|
+
* `google-auth-library` in the tree by construction rather than by matching pins.
|
|
8
|
+
*/
|
|
9
|
+
export declare function googleAuth(auth: GoogleAuthProvider): import("google-auth-library").OAuth2Client;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type GoogleAuthProvider } from '@mcp-z/oauth-google';
|
|
2
|
+
/**
|
|
3
|
+
* A Google API client bound to this request's token provider.
|
|
4
|
+
*
|
|
5
|
+
* `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client
|
|
6
|
+
* is built here, from this package's own `googleapis`. That keeps one copy of
|
|
7
|
+
* `google-auth-library` in the tree by construction rather than by matching pins.
|
|
8
|
+
*/
|
|
9
|
+
export declare function googleAuth(auth: GoogleAuthProvider): import("google-auth-library").OAuth2Client;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "googleAuth", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return googleAuth;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _oauthgoogle = require("@mcp-z/oauth-google");
|
|
12
|
+
var _googleapis = require("googleapis");
|
|
13
|
+
function googleAuth(auth) {
|
|
14
|
+
return (0, _oauthgoogle.attachTokenProvider)(new _googleapis.google.auth.OAuth2(), auth);
|
|
15
|
+
}
|
|
16
|
+
/* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/lib/google-auth.ts"],"sourcesContent":["import { attachTokenProvider, type GoogleAuthProvider } from '@mcp-z/oauth-google';\nimport { google } from 'googleapis';\n\n/**\n * A Google API client bound to this request's token provider.\n *\n * `@mcp-z/oauth-google` mints tokens and depends on no Google SDK, so the client\n * is built here, from this package's own `googleapis`. That keeps one copy of\n * `google-auth-library` in the tree by construction rather than by matching pins.\n */\nexport function googleAuth(auth: GoogleAuthProvider) {\n return attachTokenProvider(new google.auth.OAuth2(), auth);\n}\n"],"names":["googleAuth","auth","attachTokenProvider","google","OAuth2"],"mappings":";;;;+BAUgBA;;;eAAAA;;;2BAV6C;0BACtC;AAShB,SAASA,WAAWC,IAAwB;IACjD,OAAOC,IAAAA,gCAAmB,EAAC,IAAIC,kBAAM,CAACF,IAAI,CAACG,MAAM,IAAIH;AACvD"}
|
|
@@ -12,6 +12,7 @@ var _server = require("@mcp-z/server");
|
|
|
12
12
|
var _googleapis = require("googleapis");
|
|
13
13
|
var _messageextractionts = require("../../email/parsing/message-extraction.js");
|
|
14
14
|
var _dateconversionts = require("../../lib/date-conversion.js");
|
|
15
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
15
16
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
16
17
|
try {
|
|
17
18
|
var info = gen[key](arg);
|
|
@@ -161,7 +162,7 @@ function createResource() {
|
|
|
161
162
|
logger.info(variables, 'gmail-email resource fetch');
|
|
162
163
|
gmail = _googleapis.google.gmail({
|
|
163
164
|
version: 'v1',
|
|
164
|
-
auth: authContext.auth
|
|
165
|
+
auth: (0, _googleauthts.googleAuth)(authContext.auth)
|
|
165
166
|
});
|
|
166
167
|
return [
|
|
167
168
|
4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/resources/email.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ReadResourceResult, ResourceConfig, ResourceModule, ServerContext } from '@mcp-z/server';\nimport { ResourceTemplate } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\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: ServerContext): 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":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","fullData","headersMap","logger","authContext","gmail","response","headers","headersArray","fromInfo","toStr","metadata","e","error","info","google","version","auth","users","messages","get","userId","id","format","metadataHeaders","data","Error","payload","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","subject","Subject","from","address","to","date","toIsoUtc","Date","contents","href","text","JSON","stringify","message"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/resources/email.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ReadResourceResult, ResourceConfig, ResourceModule, ServerContext } from '@mcp-z/server';\nimport { ResourceTemplate } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\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: ServerContext): 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: googleAuth(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":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","fullData","headersMap","logger","authContext","gmail","response","headers","headersArray","fromInfo","toStr","metadata","e","error","info","google","version","auth","googleAuth","users","messages","get","userId","id","format","metadataHeaders","data","Error","payload","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","subject","Subject","from","address","to","date","toIsoUtc","Date","contents","href","text","JSON","stringify","message"],"mappings":";;;;+BAQA;;;eAAwBA;;;sBANS;0BACK;mCACK;gCAClB;4BACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEZ,SAASA;IACtB,IAAMC,WAAW,IAAIC,wBAAgB,CAAC,yBAAyB;QAC7DC,MAAMC;IACR;IACA,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,iBAAOC,KAAUC,WAA2BC;;gBAkClDC,cACKC,qBAfKD,mBAlBRE,QAAQC,aAIVC,OACAC,UAOAL,UAMAM,SACAC,cACAN,YAOAO,UACAC,OAGAC,UAiBCC,SACCT,SAEFU;;;;;;;;;;wBAnDEV,SAAwBH,MAAxBG,QAAQC,cAAgBJ,MAAhBI;wBAEhBD,OAAOW,IAAI,CAACf,WAAW;wBAEjBM,QAAQU,kBAAM,CAACV,KAAK,CAAC;4BAAEW,SAAS;4BAAMC,MAAMC,IAAAA,wBAAU,EAACd,YAAYa,IAAI;wBAAE;wBAC9D;;4BAAMZ,MAAMc,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC;gCAC9CC,QAAQ;gCACRC,IAAIxB,UAAUwB,EAAE;gCAChBC,QAAQ;gCACRC,eAAe;oCAAG;oCAAQ;oCAAM;oCAAW;;4BAC7C;;;wBALMnB,WAAW;wBAOXL,WAAWK,SAASoB,IAAI;wBAC9B,IAAI,CAACzB,UAAU;4BACb,MAAM,IAAI0B,MAAM;wBAClB;wBAEA,kBAAkB;wBACZpB,UAAUN,qBAAAA,gCAAAA,oBAAAA,SAAU2B,OAAO,cAAjB3B,wCAAAA,kBAAmBM,OAAO;wBACpCC,eAAeqB,MAAMC,OAAO,CAACvB,WAAWA;wBACxCL,aAAqC6B,OAAOC,WAAW,CAC3DxB,aAAayB,GAAG,CAAC,SAACC;gCAEDC,cAA2BA;4BAD1C,IAAMA,SAASD;4BACf,OAAO;gCAACE,QAAOD,eAAAA,OAAOE,IAAI,cAAXF,0BAAAA,eAAe;gCAAKC,QAAOD,gBAAAA,OAAOG,KAAK,cAAZH,2BAAAA,gBAAgB;6BAAI;wBAChE;wBAGI1B,WAAW8B,IAAAA,gCAAW,EAACrC,WAAWsC,IAAI;wBACtC9B,QAAQ+B,IAAAA,kCAAa,EAACvC,WAAWwC,EAAE,EAAEC,IAAI,CAAC;wBAEhD,qDAAqD;wBAC/ChC,WAAW;4BACfY,EAAE,GAAEtB,eAAAA,SAASsB,EAAE,cAAXtB,0BAAAA,eAAeF,UAAUwB,EAAE;4BAC/BqB,OAAO,GAAE1C,sBAAAA,WAAW2C,OAAO,cAAlB3C,iCAAAA,sBAAsB;4BAC/B4C,MAAMrC,CAAAA,qBAAAA,+BAAAA,SAAUsC,OAAO,KAAI7C,WAAWsC,IAAI;4BAC1CQ,IAAItC;4BACJuC,MAAMC,IAAAA,0BAAQ,EAAChD,WAAWiD,IAAI,KAAKjD,WAAWiD,IAAI;wBACpD;wBAEA;;4BAAO;gCACLC,QAAQ;oCACN;wCACEtD,KAAKA,IAAIuD,IAAI;wCACbzD,UAAU;wCACV0D,MAAMC,KAAKC,SAAS,CAAC7C;oCACvB;;4BAEJ;;;wBACOC;wBACCT,UAAWH,MAAXG;wBACRA,QAAOU,KAAK,CAACD,GAA8B;wBACrCC,QAAQD;wBACd;;4BAAO;gCACLwC,QAAQ;oCACN;wCACEtD,KAAKA,IAAIuD,IAAI;wCACbzD,UAAU;wCACV0D,MAAMC,KAAKC,SAAS,CAAC;4CAAE3C,OAAOuB,eAAOvB,kBAAAA,4BAAAA,MAAO4C,OAAO,uCAAI7C;wCAAG;oCAC5D;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACLyB,MAAM;QACN/C,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -20,6 +20,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
|
|
|
20
20
|
var _server = require("@mcp-z/server");
|
|
21
21
|
var _googleapis = require("googleapis");
|
|
22
22
|
var _zod = require("zod");
|
|
23
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
23
24
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
24
25
|
try {
|
|
25
26
|
var info = gen[key](arg);
|
|
@@ -194,7 +195,7 @@ function handler(_, extra) {
|
|
|
194
195
|
]);
|
|
195
196
|
gmail = _googleapis.google.gmail({
|
|
196
197
|
version: 'v1',
|
|
197
|
-
auth: extra.authContext.auth
|
|
198
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
198
199
|
});
|
|
199
200
|
started = Date.now();
|
|
200
201
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\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\n/**\n * Input schema for the categories-list tool (currently empty as this tool takes no parameters).\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(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\n/**\n * Input parameters for the categories-list tool.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: 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 ProtocolError(ProtocolErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","CategorySchema","z","object","id","string","describe","name","description","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","result","handler","_","extra","logger","gmail","started","response","labels","categories","durationMs","error","message","info","google","version","auth","authContext","Date","now","users","list","userId","data","filter","label","startsWith","map","replace","sort","a","b","localeCompare","categoryCount","length","totalLabels","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\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\n/**\n * Input schema for the categories-list tool (currently empty as this tool takes no parameters).\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(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\n/**\n * Input parameters for the categories-list tool.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: 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: googleAuth(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 ProtocolError(ProtocolErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","CategorySchema","z","object","id","string","describe","name","description","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","result","handler","_","extra","logger","gmail","started","response","labels","categories","durationMs","error","message","info","google","version","auth","googleAuth","authContext","Date","now","users","list","userId","data","filter","label","startsWith","map","replace","sort","a","b","localeCompare","categoryCount","length","totalLabels","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined"],"mappings":";;;;;;;;;;;QAmIA;eAAwBA;;QA9GXC;eAAAA;;;2BApBW;sBAKyB;0BAC1B;mBACL;4BACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAN3B,IAAM,AAAEC,2BAA6BC,oBAAO,CAApCD;AAQR,uCAAuC;AACvC,IAAME,iBAAiBC,MAAC,CAACC,MAAM,CAAC;IAC9BC,IAAIF,MAAC,CAACG,MAAM,GAAGC,QAAQ,CAAC;IACxBC,MAAML,MAAC,CAACG,MAAM,GAAGC,QAAQ,CAAC;IAC1BE,aAAaN,MAAC,CAACG,MAAM,GAAGC,QAAQ,CAAC;AACnC;AAKO,IAAMR,cAAcI,MAAC,CAACC,MAAM,CAAC,CAAC;AAErC,wBAAwB;AACxB,IAAMM,sBAAsBP,MAAC,CAACC,MAAM,CAAC;IACnCO,MAAMR,MAAC,CAACS,OAAO,CAAC;IAChBC,OAAOV,MAAC,CAACW,KAAK,CAACZ;AACjB;AAEA,2CAA2C;AAC3C,IAAMa,eAAeZ,MAAC,CAACa,kBAAkB,CAAC,QAAQ;IAACN;IAAqBV;CAAyB;AAEjG,IAAMiB,SAAS;IACbR,aAAa;IACbV,aAAaA;IACbgB,cAAcZ,MAAC,CAACC,MAAM,CAAC;QACrBc,QAAQH;IACV;AACF;AAQA,SAAeI,QAAQC,CAAQ,EAAEC,KAAoB;;YAC7CC,QAIEC,OACAC,SAGAC,UACAC,QAGAC,YA2CAC,YAKAV,QAcCW,OACDC;;;;oBA3EFR,SAASD,MAAMC,MAAM;oBAC3BA,OAAOS,IAAI,CAAC;;;;;;;;;oBAGJR,QAAQS,kBAAM,CAACT,KAAK,CAAC;wBAAEU,SAAS;wBAAMC,MAAMC,IAAAA,wBAAU,EAACd,MAAMe,WAAW,CAACF,IAAI;oBAAE;oBAC/EV,UAAUa,KAAKC,GAAG;oBAGP;;wBAAMf,MAAMgB,KAAK,CAACb,MAAM,CAACc,IAAI,CAAC;4BAAEC,QAAQ;wBAAK;;;oBAAxDhB,WAAW;oBACXC,SAASD,SAASiB,IAAI,CAAChB,MAAM;oBAEnC,4DAA4D;oBACtDC,aAAaD,OAChBiB,MAAM,CAAC,SAACC;4BAAUA;gCAAAA,YAAAA,MAAMvC,EAAE,cAARuC,gCAAAA,UAAUC,UAAU,CAAC;uBACvCC,GAAG,CAAC,SAACF;wBACJ,IAAMvC,KAAKuC,MAAMvC,EAAE;wBACnB,IAAIG,OAAOoC,MAAMpC,IAAI,IAAIH;wBACzB,IAAII,cAAc;wBAElB,mEAAmE;wBACnE,OAAQJ;4BACN,KAAK;gCACHG,OAAO;gCACPC,cAAc;gCACd;4BACF,KAAK;gCACHD,OAAO;gCACPC,cAAc;gCACd;4BACF,KAAK;gCACHD,OAAO;gCACPC,cAAc;gCACd;4BACF,KAAK;gCACHD,OAAO;gCACPC,cAAc;gCACd;4BACF,KAAK;gCACHD,OAAO;gCACPC,cAAc;gCACd;4BACF;gCACE,8DAA8D;gCAC9DD,OAAOoC,MAAMpC,IAAI,IAAIH,GAAG0C,OAAO,CAAC,aAAa;gCAC7CtC,cAAc,AAAC,mBAAuB,OAALD;wBACrC;wBAEA,OAAO;4BACLH,IAAAA;4BACAG,MAAAA;4BACAC,aAAAA;wBACF;oBACF,GACCuC,IAAI,CAAC,SAACC,GAAGC;+BAAMD,EAAEzC,IAAI,CAAC2C,aAAa,CAACD,EAAE1C,IAAI;wBAAI,8BAA8B;oBAEzEoB,aAAaS,KAAKC,GAAG,KAAKd;oBAEhCF,OAAOS,IAAI,CAAC,iCAAiC;wBAAEqB,eAAezB,WAAW0B,MAAM;wBAAEC,aAAa5B,OAAO2B,MAAM;oBAAC;oBAC5G/B,OAAOS,IAAI,CAAC,iCAAiC;wBAAEH,YAAAA;oBAAW;oBAEpDV,SAAiB;wBACrBP,MAAM;wBACNE,OAAOc;oBACT;oBAEA;;wBAAO;4BACL4B,OAAO;gCACL;oCACE5C,MAAM;oCACN6C,MAAMC,KAAKC,SAAS,CAACxC;gCACvB;;4BAEFyC,mBAAmB;gCAAEzC,QAAAA;4BAAO;wBAC9B;;;oBACOW;oBACDC,UAAUD,AAAK,YAALA,OAAiB+B,SAAQ/B,MAAMC,OAAO,GAAG+B,OAAOhC;oBAChEP,OAAOO,KAAK,CAAC,+BAA+B;wBAAEA,OAAOC;oBAAQ;oBAE7D,MAAM,IAAIgC,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE,AAAC,6BAAoC,OAARlC,UAAW;wBAC/FmC,OAAOpC,AAAK,YAALA,OAAiB+B,SAAQ/B,MAAMoC,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASpE;IACtB,OAAO;QACLU,MAAM;QACNS,QAAAA;QACAE,SAAAA;IACF;AACF"}
|
|
@@ -13,6 +13,7 @@ var _server = require("@mcp-z/server");
|
|
|
13
13
|
var _googleapis = require("googleapis");
|
|
14
14
|
var _zod = require("zod");
|
|
15
15
|
var _gmaillabelsts = require("../../labels/gmail-labels.js");
|
|
16
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
16
17
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
17
18
|
try {
|
|
18
19
|
var info = gen[key](arg);
|
|
@@ -198,7 +199,7 @@ function handler(_0, _1) {
|
|
|
198
199
|
]);
|
|
199
200
|
gmail = _googleapis.google.gmail({
|
|
200
201
|
version: 'v1',
|
|
201
|
-
auth: extra.authContext.auth
|
|
202
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
202
203
|
});
|
|
203
204
|
return [
|
|
204
205
|
4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { ensureLabelId } from '../../labels/gmail-labels.ts';\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 ProtocolError(ProtocolErrorCode.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 ProtocolError(ProtocolErrorCode.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":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","label","successBranchSchema","type","literal","item","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","labelId","error","message","info","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","authContext","ensureLabelId","users","messages","modify","userId","requestBody","addLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { ensureLabelId } from '../../labels/gmail-labels.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\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 ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id or label');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(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 ProtocolError(ProtocolErrorCode.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":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","label","successBranchSchema","type","literal","item","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","labelId","error","message","info","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","googleAuth","authContext","ensureLabelId","users","messages","modify","userId","requestBody","addLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ var _server = require("@mcp-z/server");
|
|
|
13
13
|
var _googleapis = require("googleapis");
|
|
14
14
|
var _zod = require("zod");
|
|
15
15
|
var _constantsts = require("../../constants.js");
|
|
16
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
16
17
|
function _array_like_to_array(arr, len) {
|
|
17
18
|
if (len == null || len > arr.length) len = arr.length;
|
|
18
19
|
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
@@ -380,7 +381,7 @@ function handler(_0, _1) {
|
|
|
380
381
|
};
|
|
381
382
|
gmail = _googleapis.google.gmail({
|
|
382
383
|
version: 'v1',
|
|
383
|
-
auth: extra.authContext.auth
|
|
384
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
384
385
|
});
|
|
385
386
|
return [
|
|
386
387
|
4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/label-delete.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail label IDs to delete'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of labels requested to delete'),\n successCount: z.number().describe('Number of labels successfully deleted'),\n failureCount: z.number().describe('Number of labels that failed to delete'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Label ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each label'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-label-delete called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail label ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n // Get all labels first to check for system labels\n const labelsResponse = await gmail.users.labels.list({ userId: 'me' });\n const allLabels = labelsResponse.data.labels || [];\n const labelMap = new Map(allLabels.map((label) => [label.id || '', label]));\n\n // Process deletions in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n const label = labelMap.get(id);\n\n // Check if label exists\n if (!label) {\n throw new Error(`Label not found: ${id}`);\n }\n\n // Check if it's a system label\n if (label.type === 'system') {\n throw new Error(`Cannot delete system label: ${label.name} (${id})`);\n }\n\n // Delete the label\n await gmail.users.labels.delete({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-label-delete completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\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-delete error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error deleting labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-delete',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","labelsResponse","allLabels","labelMap","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","label","get","Error","name","users","labels","delete","userId","status","errorMessage","reason","String","google","version","auth","authContext","list","data","Map","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/label-delete.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail label IDs to delete'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of labels requested to delete'),\n successCount: z.number().describe('Number of labels successfully deleted'),\n failureCount: z.number().describe('Number of labels that failed to delete'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Label ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each label'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Delete Gmail labels permanently (irreversible). System labels (INBOX, SENT, etc.) cannot be deleted.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-label-delete called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail label ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n // Get all labels first to check for system labels\n const labelsResponse = await gmail.users.labels.list({ userId: 'me' });\n const allLabels = labelsResponse.data.labels || [];\n const labelMap = new Map(allLabels.map((label) => [label.id || '', label]));\n\n // Process deletions in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n const label = labelMap.get(id);\n\n // Check if label exists\n if (!label) {\n throw new Error(`Label not found: ${id}`);\n }\n\n // Check if it's a system label\n if (label.type === 'system') {\n throw new Error(`Cannot delete system label: ${label.name} (${id})`);\n }\n\n // Delete the label\n await gmail.users.labels.delete({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-label-delete completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\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-delete error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error deleting labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'label-delete',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","labelsResponse","allLabels","labelMap","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","label","get","Error","name","users","labels","delete","userId","status","errorMessage","reason","String","google","version","auth","googleAuth","authContext","list","data","Map","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined"],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
|
|
|
20
20
|
var _server = require("@mcp-z/server");
|
|
21
21
|
var _googleapis = require("googleapis");
|
|
22
22
|
var _zod = require("zod");
|
|
23
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
23
24
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
24
25
|
try {
|
|
25
26
|
var info = gen[key](arg);
|
|
@@ -200,7 +201,7 @@ function handler(_, extra) {
|
|
|
200
201
|
]);
|
|
201
202
|
gmail = _googleapis.google.gmail({
|
|
202
203
|
version: 'v1',
|
|
203
|
-
auth: extra.authContext.auth
|
|
204
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
204
205
|
});
|
|
205
206
|
started = Date.now();
|
|
206
207
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/labels-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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\n// Schema for individual label items\nconst LabelSchema = z.object({\n id: z.string().describe('Gmail label ID'),\n name: z.string().describe('Label name for use in queries (case-sensitive)'),\n type: z.enum(['user', 'system']).describe('Whether this is a user-created or system label'),\n visibility: z.enum(['labelShow', 'labelHide', 'labelShowIfUnread']).describe('Label visibility in Gmail UI'),\n});\n\n/**\n * Input schema for the labels-list tool (currently empty as this tool takes no parameters).\n */\nexport const inputSchema = z.object({});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(LabelSchema),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Gmail labels for label: query syntax. Case-sensitive.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input parameters for the labels-list tool.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.labels.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 out CATEGORY_* labels (handled by categories tool) and map to our schema\n const availableLabels = labels\n .filter((label) => {\n // Exclude CATEGORY_* labels as they're handled by the categories tool\n return !label.id?.startsWith('CATEGORY_');\n })\n .map((label) => {\n const id = label.id as string;\n const name = label.name || id;\n\n // Determine label type\n const type: 'user' | 'system' = label.type === 'user' ? 'user' : 'system';\n\n // Map label visibility\n let visibility: 'labelShow' | 'labelHide' | 'labelShowIfUnread' = 'labelShow';\n if (label.labelListVisibility === 'labelHide') {\n visibility = 'labelHide';\n } else if (label.labelListVisibility === 'labelShowIfUnread') {\n visibility = 'labelShowIfUnread';\n }\n\n return {\n id,\n name,\n type,\n visibility,\n };\n })\n .sort((a, b) => {\n // Sort user labels first, then system labels, both alphabetically\n if (a.type !== b.type) {\n return a.type === 'user' ? -1 : 1;\n }\n // Use simple ASCII comparison for consistent, case-sensitive sorting\n return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\n });\n\n const durationMs = Date.now() - started;\n\n logger.info('gmail.labels.list results', {\n labelCount: availableLabels.length,\n userLabels: availableLabels.filter((l) => l.type === 'user').length,\n systemLabels: availableLabels.filter((l) => l.type === 'system').length,\n totalLabels: labels.length,\n });\n logger.info('gmail.labels.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: availableLabels,\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.labels.list error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error listing labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'labels-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","LabelSchema","z","object","id","string","describe","name","type","enum","visibility","successBranchSchema","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","gmail","started","response","labels","availableLabels","durationMs","error","message","info","google","version","auth","authContext","Date","now","users","list","userId","data","filter","label","startsWith","map","labelListVisibility","sort","a","b","labelCount","length","userLabels","l","systemLabels","totalLabels","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/labels-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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\n// Schema for individual label items\nconst LabelSchema = z.object({\n id: z.string().describe('Gmail label ID'),\n name: z.string().describe('Label name for use in queries (case-sensitive)'),\n type: z.enum(['user', 'system']).describe('Whether this is a user-created or system label'),\n visibility: z.enum(['labelShow', 'labelHide', 'labelShowIfUnread']).describe('Label visibility in Gmail UI'),\n});\n\n/**\n * Input schema for the labels-list tool (currently empty as this tool takes no parameters).\n */\nexport const inputSchema = z.object({});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(LabelSchema),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Gmail labels for label: query syntax. Case-sensitive.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input parameters for the labels-list tool.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail.labels.list called');\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(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 out CATEGORY_* labels (handled by categories tool) and map to our schema\n const availableLabels = labels\n .filter((label) => {\n // Exclude CATEGORY_* labels as they're handled by the categories tool\n return !label.id?.startsWith('CATEGORY_');\n })\n .map((label) => {\n const id = label.id as string;\n const name = label.name || id;\n\n // Determine label type\n const type: 'user' | 'system' = label.type === 'user' ? 'user' : 'system';\n\n // Map label visibility\n let visibility: 'labelShow' | 'labelHide' | 'labelShowIfUnread' = 'labelShow';\n if (label.labelListVisibility === 'labelHide') {\n visibility = 'labelHide';\n } else if (label.labelListVisibility === 'labelShowIfUnread') {\n visibility = 'labelShowIfUnread';\n }\n\n return {\n id,\n name,\n type,\n visibility,\n };\n })\n .sort((a, b) => {\n // Sort user labels first, then system labels, both alphabetically\n if (a.type !== b.type) {\n return a.type === 'user' ? -1 : 1;\n }\n // Use simple ASCII comparison for consistent, case-sensitive sorting\n return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;\n });\n\n const durationMs = Date.now() - started;\n\n logger.info('gmail.labels.list results', {\n labelCount: availableLabels.length,\n userLabels: availableLabels.filter((l) => l.type === 'user').length,\n systemLabels: availableLabels.filter((l) => l.type === 'system').length,\n totalLabels: labels.length,\n });\n logger.info('gmail.labels.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: availableLabels,\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.labels.list error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error listing labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'labels-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","LabelSchema","z","object","id","string","describe","name","type","enum","visibility","successBranchSchema","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","gmail","started","response","labels","availableLabels","durationMs","error","message","info","google","version","auth","googleAuth","authContext","Date","now","users","list","userId","data","filter","label","startsWith","map","labelListVisibility","sort","a","b","labelCount","length","userLabels","l","systemLabels","totalLabels","content","text","JSON","stringify","structuredContent","Error","String","ProtocolError","ProtocolErrorCode","InternalError","stack","undefined"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ var _googleapis = require("googleapis");
|
|
|
15
15
|
var _zod = require("zod");
|
|
16
16
|
var _messageextractionts = require("../../email/parsing/message-extraction.js");
|
|
17
17
|
var _dateconversionts = require("../../lib/date-conversion.js");
|
|
18
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
18
19
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
19
20
|
try {
|
|
20
21
|
var info = gen[key](arg);
|
|
@@ -201,7 +202,7 @@ function handler(_0, _1) {
|
|
|
201
202
|
}
|
|
202
203
|
gmail = _googleapis.google.gmail({
|
|
203
204
|
version: 'v1',
|
|
204
|
-
auth: extra.authContext.auth
|
|
205
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
205
206
|
});
|
|
206
207
|
return [
|
|
207
208
|
4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-get.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, filterFields, ProtocolError, ProtocolErrorCode, parseFields, type ToolModule } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { extractBodyFromPayload, extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to retrieve'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: EmailDetailSchema,\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get a Gmail message by ID with flexible field selection',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, fields, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n\n logger.info('gmail.message.get called', { id: Boolean(id), fields: fields || 'all' });\n\n try {\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'full',\n metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject', 'Date'],\n });\n const fullData = response.data;\n if (!fullData) {\n throw new ProtocolError(ProtocolErrorCode.InvalidRequest, 'Message not found');\n }\n\n // Build full message data with type guards\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 const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n const ccStr = extractEmails(headersMap.Cc).join(', ');\n const bccStr = extractEmails(headersMap.Bcc).join(', ');\n const messagePayload = fullData?.payload;\n const bodyContent = messagePayload ? extractBodyFromPayload(messagePayload, { contentType, excludeThreadHistory }) : '';\n const payload: Partial<EmailDetail> = {\n id: fullData.id ?? undefined,\n threadId: fullData.threadId ?? undefined,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n from: fromInfo?.address || headersMap.From,\n fromName: fromInfo?.name,\n to: toStr,\n cc: ccStr,\n bcc: bccStr,\n subject: headersMap.Subject ?? '',\n snippet: fullData.snippet ?? undefined,\n body: bodyContent,\n bodyContentType: contentType,\n };\n\n // Filter based on requested fields\n const filteredPayload = filterFields(payload, requestedFields);\n\n logger.info('gmail.message.get result', { id: fullData.id, subject: payload.subject, from: payload.from, fields: fields || 'all' });\n\n const result: Output = {\n type: 'success' as const,\n item: filteredPayload,\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.message.get error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","item","EmailDetailSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","requestedFields","fullData","headersMap","gmail","response","headers","headersArray","fromInfo","toStr","ccStr","bccStr","messagePayload","bodyContent","payload","filteredPayload","error","message","parseFields","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","authContext","users","messages","get","userId","format","metadataHeaders","data","InvalidRequest","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","Cc","Bcc","extractBodyFromPayload","undefined","threadId","date","toIsoUtc","Date","from","address","fromName","to","cc","bcc","subject","Subject","snippet","body","bodyContentType","filterFields","content","text","JSON","stringify","structuredContent","Error","InternalError","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-get.ts"],"sourcesContent":["import { EMAIL_COMMON_PATTERNS, EMAIL_FIELD_DESCRIPTIONS, EMAIL_FIELDS, EmailContentTypeSchema, type EmailDetail, EmailDetailSchema, ExcludeThreadHistorySchema } from '@mcp-z/email';\nimport type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport { schemas } from '@mcp-z/oauth-google';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport { createFieldsSchema, filterFields, ProtocolError, ProtocolErrorCode, parseFields, type ToolModule } from '@mcp-z/server';\nimport { type gmail_v1, google } from 'googleapis';\nimport { z } from 'zod';\nimport { extractBodyFromPayload, extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to retrieve'),\n fields: createFieldsSchema({\n availableFields: EMAIL_FIELDS,\n fieldDescriptions: EMAIL_FIELD_DESCRIPTIONS,\n commonPatterns: EMAIL_COMMON_PATTERNS,\n resourceName: 'email message',\n }),\n contentType: EmailContentTypeSchema,\n excludeThreadHistory: ExcludeThreadHistorySchema,\n});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n item: EmailDetailSchema,\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Get a Gmail message by ID with flexible field selection',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id, fields, contentType, excludeThreadHistory }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n\n const requestedFields = parseFields(fields, EMAIL_FIELDS);\n\n logger.info('gmail.message.get called', { id: Boolean(id), fields: fields || 'all' });\n\n try {\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: id,\n format: 'full',\n metadataHeaders: ['From', 'To', 'Cc', 'Bcc', 'Subject', 'Date'],\n });\n const fullData = response.data;\n if (!fullData) {\n throw new ProtocolError(ProtocolErrorCode.InvalidRequest, 'Message not found');\n }\n\n // Build full message data with type guards\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 const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n const ccStr = extractEmails(headersMap.Cc).join(', ');\n const bccStr = extractEmails(headersMap.Bcc).join(', ');\n const messagePayload = fullData?.payload;\n const bodyContent = messagePayload ? extractBodyFromPayload(messagePayload, { contentType, excludeThreadHistory }) : '';\n const payload: Partial<EmailDetail> = {\n id: fullData.id ?? undefined,\n threadId: fullData.threadId ?? undefined,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n from: fromInfo?.address || headersMap.From,\n fromName: fromInfo?.name,\n to: toStr,\n cc: ccStr,\n bcc: bccStr,\n subject: headersMap.Subject ?? '',\n snippet: fullData.snippet ?? undefined,\n body: bodyContent,\n bodyContentType: contentType,\n };\n\n // Filter based on requested fields\n const filteredPayload = filterFields(payload, requestedFields);\n\n logger.info('gmail.message.get result', { id: fullData.id, subject: payload.subject, from: payload.from, fields: fields || 'all' });\n\n const result: Output = {\n type: 'success' as const,\n item: filteredPayload,\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.message.get error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error getting message: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-get',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","fields","createFieldsSchema","availableFields","EMAIL_FIELDS","fieldDescriptions","EMAIL_FIELD_DESCRIPTIONS","commonPatterns","EMAIL_COMMON_PATTERNS","resourceName","contentType","EmailContentTypeSchema","excludeThreadHistory","ExcludeThreadHistorySchema","successBranchSchema","type","literal","item","EmailDetailSchema","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","requestedFields","fullData","headersMap","gmail","response","headers","headersArray","fromInfo","toStr","ccStr","bccStr","messagePayload","bodyContent","payload","filteredPayload","error","message","parseFields","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","googleAuth","authContext","users","messages","get","userId","format","metadataHeaders","data","InvalidRequest","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","Cc","Bcc","extractBodyFromPayload","undefined","threadId","date","toIsoUtc","Date","from","address","fromName","to","cc","bcc","subject","Subject","snippet","body","bodyContentType","filterFields","content","text","JSON","stringify","structuredContent","Error","InternalError","stack"],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ var _oauthgoogle = require("@mcp-z/oauth-google");
|
|
|
12
12
|
var _server = require("@mcp-z/server");
|
|
13
13
|
var _googleapis = require("googleapis");
|
|
14
14
|
var _zod = require("zod");
|
|
15
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
15
16
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
16
17
|
try {
|
|
17
18
|
var info = gen[key](arg);
|
|
@@ -186,7 +187,7 @@ function handler(_0, _1) {
|
|
|
186
187
|
]);
|
|
187
188
|
gmail = _googleapis.google.gmail({
|
|
188
189
|
version: 'v1',
|
|
189
|
-
auth: extra.authContext.auth
|
|
190
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
190
191
|
});
|
|
191
192
|
return [
|
|
192
193
|
4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-mark-read.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to mark as read'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Message ID that was marked as read'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Mark a Gmail message as read',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-mark-read called', { id: Boolean(id) });\n\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n removeLabelIds: ['UNREAD'],\n },\n });\n\n logger.info('gmail-message-mark-read success', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-mark-read error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error marking message as read: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-mark-read',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","error","message","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","authContext","users","messages","modify","userId","requestBody","removeLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-mark-read.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n id: z.coerce.string().trim().min(1).describe('Gmail message ID to mark as read'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n id: z.string().describe('Message ID that was marked as read'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Mark a Gmail message as read',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ id }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-mark-read called', { id: Boolean(id) });\n\n if (!id) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing id');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n await gmail.users.messages.modify({\n userId: 'me',\n id: id,\n requestBody: {\n removeLabelIds: ['UNREAD'],\n },\n });\n\n logger.info('gmail-message-mark-read success', { id });\n\n const result: Output = {\n type: 'success' as const,\n id,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('gmail-message-mark-read error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error marking message as read: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-mark-read',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","id","coerce","string","trim","min","describe","successBranchSchema","type","literal","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","gmail","error","message","info","Boolean","ProtocolError","ProtocolErrorCode","InvalidParams","google","version","auth","googleAuth","authContext","users","messages","modify","userId","requestBody","removeLabelIds","content","text","JSON","stringify","structuredContent","Error","String","InternalError","stack","undefined","name"],"mappings":";;;;+BA6EA;;;eAAwBA;;;2BA5EA;sBAKyB;0BAC1B;mBACL;4BACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAN3B,IAAM,AAAEC,2BAA6BC,oBAAO,CAApCD;AAQR,IAAME,cAAcC,MAAC,CAACC,MAAM,CAAC;IAC3BC,IAAIF,MAAC,CAACG,MAAM,CAACC,MAAM,GAAGC,IAAI,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;AAC/C;AAEA,IAAMC,sBAAsBR,MAAC,CAACC,MAAM,CAAC;IACnCQ,MAAMT,MAAC,CAACU,OAAO,CAAC;IAChBR,IAAIF,MAAC,CAACI,MAAM,GAAGG,QAAQ,CAAC;AAC1B;AAEA,IAAMI,eAAeX,MAAC,CAACY,kBAAkB,CAAC,QAAQ;IAACJ;IAAqBX;CAAyB;AAEjG,IAAMgB,SAAS;IACbC,aAAa;IACbf,aAAaA;IACbY,cAAcX,MAAC,CAACC,MAAM,CAAC;QACrBc,QAAQJ;IACV;AACF;AAKA,SAAeK;wCAAQ,KAAa,EAAEC,KAAoB;YAAjCf,IACjBgB,QAQEC,OAWAJ,QAcCK,OACDC;;;;oBAnCenB,KAAF,MAAEA;oBACjBgB,SAASD,MAAMC,MAAM;oBAC3BA,OAAOI,IAAI,CAAC,kCAAkC;wBAAEpB,IAAIqB,QAAQrB;oBAAI;oBAEhE,IAAI,CAACA,IAAI;wBACP,MAAM,IAAIsB,qBAAa,CAACC,yBAAiB,CAACC,aAAa,EAAE;oBAC3D;;;;;;;;;oBAGQP,QAAQQ,kBAAM,CAACR,KAAK,CAAC;wBAAES,SAAS;wBAAMC,MAAMC,IAAAA,wBAAU,EAACb,MAAMc,WAAW,CAACF,IAAI;oBAAE;oBACrF;;wBAAMV,MAAMa,KAAK,CAACC,QAAQ,CAACC,MAAM,CAAC;4BAChCC,QAAQ;4BACRjC,IAAIA;4BACJkC,aAAa;gCACXC,cAAc;oCAAG;;4BACnB;wBACF;;;oBANA;oBAQAnB,OAAOI,IAAI,CAAC,mCAAmC;wBAAEpB,IAAAA;oBAAG;oBAE9Ca,SAAiB;wBACrBN,MAAM;wBACNP,IAAAA;oBACF;oBAEA;;wBAAO;4BACLoC,OAAO;gCACL;oCACE7B,MAAM;oCACN8B,MAAMC,KAAKC,SAAS,CAAC1B;gCACvB;;4BAEF2B,mBAAmB;gCAAE3B,QAAAA;4BAAO;wBAC9B;;;oBACOK;oBACDC,UAAUD,AAAK,YAALA,OAAiBuB,SAAQvB,MAAMC,OAAO,GAAGuB,OAAOxB;oBAChEF,OAAOE,KAAK,CAAC,iCAAiC;wBAAEA,OAAOC;oBAAQ;oBAE/D,MAAM,IAAIG,qBAAa,CAACC,yBAAiB,CAACoB,aAAa,EAAE,AAAC,kCAAyC,OAARxB,UAAW;wBACpGyB,OAAO1B,AAAK,YAALA,OAAiBuB,SAAQvB,MAAM0B,KAAK,GAAGC;oBAChD;;;;;;;IAEJ;;AAEe,SAASnD;IACtB,OAAO;QACLoD,MAAM;QACNnC,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -13,6 +13,7 @@ var _server = require("@mcp-z/server");
|
|
|
13
13
|
var _googleapis = require("googleapis");
|
|
14
14
|
var _zod = require("zod");
|
|
15
15
|
var _constantsts = require("../../constants.js");
|
|
16
|
+
var _googleauthts = require("../../lib/google-auth.js");
|
|
16
17
|
function _array_like_to_array(arr, len) {
|
|
17
18
|
if (len == null || len > arr.length) len = arr.length;
|
|
18
19
|
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
@@ -369,7 +370,7 @@ function handler(_0, _1) {
|
|
|
369
370
|
};
|
|
370
371
|
gmail = _googleapis.google.gmail({
|
|
371
372
|
version: 'v1',
|
|
372
|
-
auth: extra.authContext.auth
|
|
373
|
+
auth: (0, _googleauthts.googleAuth)(extra.authContext.auth)
|
|
373
374
|
});
|
|
374
375
|
// Process operations in chunks to prevent memory exhaustion
|
|
375
376
|
allResults = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-move-to-trash.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail message IDs to move to trash'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Move Gmail messages to trash (recoverable).',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: extra.authContext.auth });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await gmail.users.messages.trash({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\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-message-move-to-trash error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","users","messages","trash","userId","Error","status","errorMessage","reason","String","google","version","auth","authContext","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/mcp/tools/message-move-to-trash.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 { ProtocolError, ProtocolErrorCode } from '@mcp-z/server';\nimport { google } from 'googleapis';\nimport { z } from 'zod';\nimport { CHUNK_SIZE, MAX_BATCH_SIZE } from '../../constants.ts';\nimport { googleAuth } from '../../lib/google-auth.ts';\n\nconst inputSchema = z.object({\n ids: z.array(z.coerce.string().trim().min(1)).min(1).describe('Gmail message IDs to move to trash'),\n});\n\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n totalRequested: z.number().describe('Total number of messages requested to trash'),\n successCount: z.number().describe('Number of messages successfully moved to trash'),\n failureCount: z.number().describe('Number of messages that failed to move'),\n results: z\n .array(\n z.object({\n id: z.string().describe('Message ID'),\n success: z.boolean().describe('Whether the operation succeeded'),\n error: z.string().optional().describe('Error message if operation failed'),\n })\n )\n .describe('Individual results for each message'),\n});\n\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'Move Gmail messages to trash (recoverable).',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler({ ids }: Input, extra: EnrichedExtra) {\n const logger = extra.logger;\n logger.info('gmail-message-move-to-trash called', { count: ids.length });\n\n if (!ids || ids.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Missing ids');\n }\n\n // Validate batch size to prevent memory exhaustion\n if (ids.length > MAX_BATCH_SIZE) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Batch size ${ids.length} exceeds maximum allowed size of ${MAX_BATCH_SIZE}`);\n }\n\n // Validate and sanitize IDs\n const validatedIds: string[] = [];\n const invalidIds: string[] = [];\n\n for (const id of ids) {\n const trimmedId = id.trim();\n if (!trimmedId) {\n invalidIds.push(id);\n continue;\n }\n // Basic Gmail message ID validation - should not contain certain characters\n if (trimmedId.includes('/') || trimmedId.includes('\\\\') || trimmedId.includes('<') || trimmedId.includes('>')) {\n invalidIds.push(id);\n continue;\n }\n validatedIds.push(trimmedId);\n }\n\n if (invalidIds.length > 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Found ${invalidIds.length} invalid IDs: ${invalidIds.join(', ')}`);\n }\n\n if (validatedIds.length === 0) {\n throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'No valid IDs found after validation');\n }\n\n try {\n const gmail = google.gmail({ version: 'v1', auth: googleAuth(extra.authContext.auth) });\n // Process operations in chunks to prevent memory exhaustion\n const allResults: Array<{ id: string; success: boolean; error?: string }> = [];\n\n for (let i = 0; i < validatedIds.length; i += CHUNK_SIZE) {\n const chunk = validatedIds.slice(i, i + CHUNK_SIZE);\n logger.info('Processing chunk', { chunkIndex: i / CHUNK_SIZE + 1, chunkSize: chunk.length, totalChunks: Math.ceil(validatedIds.length / CHUNK_SIZE) });\n\n const chunkResults = await Promise.allSettled(\n chunk.map(async (id) => {\n await gmail.users.messages.trash({\n userId: 'me',\n id: id,\n });\n return { id, success: true };\n })\n );\n\n // Process chunk results\n const processedChunkResults = chunkResults.map((result, chunkIndex) => {\n const id = chunk[chunkIndex];\n if (!id) {\n throw new Error(`Chunk index ${chunkIndex} is out of bounds for chunk of size ${chunk.length}`);\n }\n if (result.status === 'fulfilled') {\n return { id, success: true };\n }\n\n // Extract error message more robustly\n let errorMessage = 'Unknown error';\n if (result.reason) {\n if (typeof result.reason === 'string') {\n errorMessage = result.reason;\n } else if (result.reason instanceof Error) {\n errorMessage = result.reason.message;\n } else if (result.reason && typeof result.reason === 'object' && 'message' in result.reason) {\n errorMessage = String(result.reason.message);\n } else if (result.reason && typeof result.reason === 'object' && 'error' in result.reason) {\n errorMessage = String(result.reason.error);\n } else {\n errorMessage = String(result.reason);\n }\n }\n\n return { id, success: false, error: errorMessage };\n });\n\n allResults.push(...processedChunkResults);\n }\n\n const successCount = allResults.filter((r) => r.success).length;\n const failureCount = allResults.filter((r) => !r.success).length;\n\n logger.info('gmail-message-move-to-trash completed', {\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n chunksProcessed: Math.ceil(validatedIds.length / CHUNK_SIZE),\n });\n\n const result: Output = {\n type: 'success' as const,\n totalRequested: validatedIds.length,\n successCount,\n failureCount,\n results: allResults,\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-message-move-to-trash error', { error: message });\n\n throw new ProtocolError(ProtocolErrorCode.InternalError, `Error moving messages to trash: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'message-move-to-trash',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","AuthRequiredBranchSchema","schemas","inputSchema","z","object","ids","array","coerce","string","trim","min","describe","successBranchSchema","type","literal","totalRequested","number","successCount","failureCount","results","id","success","boolean","error","optional","outputSchema","discriminatedUnion","config","description","result","handler","extra","logger","validatedIds","invalidIds","trimmedId","gmail","allResults","i","message","info","count","length","ProtocolError","ProtocolErrorCode","InvalidParams","MAX_BATCH_SIZE","push","includes","join","chunk","chunkResults","processedChunkResults","slice","CHUNK_SIZE","chunkIndex","chunkSize","totalChunks","Math","ceil","Promise","allSettled","map","users","messages","trash","userId","Error","status","errorMessage","reason","String","google","version","auth","googleAuth","authContext","filter","r","chunksProcessed","content","text","JSON","stringify","structuredContent","InternalError","stack","undefined","name"],"mappings":"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"}
|